/ Hex Artifact Content
Login

Artifact e2bae0a03f73d119910fb35c9550987564065137:


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: 69 36 34 20 69 52 6f 77 2c 20 20 20 20 20 20 20  i64 iRow,       
42f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
4300: 6f 77 69 64 20 74 68 61 74 20 6d 69 67 68 74 20  owid that might 
4310: 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f 0a 20  be changing */. 
4320: 20 69 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c   int isClearTabl
4330: 65 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  e        /* True
4340: 20 69 66 20 61 6c 6c 20 72 6f 77 73 20 61 72 65   if all rows are
4350: 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a   being deleted *
4360: 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  /.){.  BtCursor 
4370: 2a 70 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65  *p;.  if( pBtree
4380: 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75 72  ->hasIncrblobCur
4390: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
43a0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
43b0: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
43c0: 42 74 72 65 65 29 20 29 3b 0a 20 20 70 42 74 72  Btree) );.  pBtr
43d0: 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43  ee->hasIncrblobC
43e0: 75 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 3d  ur = 0;.  for(p=
43f0: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75  pBtree->pBt->pCu
4400: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
4410: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28 70  ext){.    if( (p
4420: 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
4430: 46 5f 49 6e 63 72 62 6c 6f 62 29 21 3d 30 20 29  F_Incrblob)!=0 )
4440: 7b 0a 20 20 20 20 20 20 70 42 74 72 65 65 2d 3e  {.      pBtree->
4450: 68 61 73 49 6e 63 72 62 6c 6f 62 43 75 72 20 3d  hasIncrblobCur =
4460: 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73   1;.      if( is
4470: 43 6c 65 61 72 54 61 62 6c 65 20 7c 7c 20 70 2d  ClearTable || p-
4480: 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77  >info.nKey==iRow
4490: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65   ){.        p->e
44a0: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
44b0: 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 7d 0a  NVALID;.      }.
44c0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c      }.  }.}..#el
44d0: 73 65 0a 20 20 2f 2a 20 53 74 75 62 20 66 75 6e  se.  /* Stub fun
44e0: 63 74 69 6f 6e 20 77 68 65 6e 20 49 4e 43 52 42  ction when INCRB
44f0: 4c 4f 42 20 69 73 20 6f 6d 69 74 74 65 64 20 2a  LOB is omitted *
4500: 2f 0a 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61  /.  #define inva
4510: 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75  lidateIncrblobCu
4520: 72 73 6f 72 73 28 78 2c 79 2c 7a 29 0a 23 65 6e  rsors(x,y,z).#en
4530: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
4540: 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a  IT_INCRBLOB */..
4550: 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70 67  /*.** Set bit pg
4560: 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61 72  no of the BtShar
4570: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
4580: 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20 63  itvec. This is c
4590: 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61  alled .** when a
45a0: 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76 69   page that previ
45b0: 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  ously contained 
45c0: 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20 66  data becomes a f
45d0: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a  ree-list leaf .*
45e0: 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  * page..**.** Th
45f0: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
4600: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65 78  ontent bitvec ex
4610: 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f  ists to work aro
4620: 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a  und an obscure.*
4630: 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79 20  * bug caused by 
4640: 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e 20  the interaction 
4650: 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49 4f  of two useful IO
4660: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73   optimizations s
4670: 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72  urrounding.** fr
4680: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4690: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57  es:.**.**   1) W
46a0: 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73 20  hen all data is 
46b0: 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20 70  deleted from a p
46c0: 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  age and the page
46d0: 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20   becomes.**     
46e0: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
46f0: 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67 65  f page, the page
4700: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
4710: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
4720: 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65 65  **      (as free
4730: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73  -list leaf pages
4740: 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e   contain no mean
4750: 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53 6f  ingful data). So
4760: 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20  metimes.**      
4770: 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20 6e  such a page is n
4780: 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c  ot even journall
4790: 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20 6e  ed (as it will n
47a0: 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a  ot be modified,.
47b0: 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74 68  **      why both
47c0: 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69  er journalling i
47d0: 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  t?)..**.**   2) 
47e0: 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74  When a free-list
47f0: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72 65   leaf page is re
4800: 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e  used, its conten
4810: 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a  t is not read.**
4820: 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 64        from the d
4830: 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74 74  atabase or writt
4840: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
4850: 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f 75  l file (why shou
4860: 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62 65  ld it.**      be
4870: 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  , if it is not a
4880: 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c  t all meaningful
4890: 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65  ?)..**.** By the
48a0: 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20 6f  mselves, these o
48b0: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72  ptimizations wor
48c0: 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76 69  k fine and provi
48d0: 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65  de a handy.** pe
48e0: 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20  rformance boost 
48f0: 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f  to bulk delete o
4900: 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69  r insert operati
4910: 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ons. However, if
4920: 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d 6f  .** a page is mo
4930: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
4940: 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72 65  list and then re
4950: 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  used within the 
4960: 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  same.** transact
4970: 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63  ion, a problem c
4980: 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65 20  omes up. If the 
4990: 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72  page is not jour
49a0: 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69  nalled when.** i
49b0: 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68  t is moved to th
49c0: 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20  e free-list and 
49d0: 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a  it is also not j
49e0: 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69  ournalled when i
49f0: 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74 65  t.** is extracte
4a00: 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  d from the free-
4a10: 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64 2c  list and reused,
4a20: 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e   then the origin
4a30: 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62  al data.** may b
4a40: 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20 65  e lost. In the e
4a50: 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  vent of a rollba
4a60: 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20 62  ck, it may not b
4a70: 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f  e possible.** to
4a80: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
4a90: 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
4aa0: 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74  ginal configurat
4ab0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ion..**.** The s
4ac0: 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20 42  olution is the B
4ad0: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
4ae0: 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65 6e  ent bitvec. When
4af0: 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20 0a  ever a page is .
4b00: 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f  ** moved to beco
4b10: 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  me a free-list l
4b20: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63 6f  eaf page, the co
4b30: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
4b40: 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68 65  is.** set in the
4b50: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
4b60: 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69 73  r a leaf page is
4b70: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
4b80: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a  the free-list,.*
4b90: 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32  * optimization 2
4ba0: 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74 74 65   above is omitte
4bb0: 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73 70  d if the corresp
4bc0: 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61 6c  onding bit is al
4bd0: 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20  ready.** set in 
4be0: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
4bf0: 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e  tent. The conten
4c00: 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65 63  ts of the bitvec
4c10: 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20   are cleared.** 
4c20: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  at the end of ev
4c30: 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ery transaction.
4c40: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
4c50: 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e  treeSetHasConten
4c60: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
4c70: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
4c80: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
4c90: 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  K;.  if( !pBt->p
4ca0: 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  HasContent ){.  
4cb0: 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d    assert( pgno<=
4cc0: 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a 20 20  pBt->nPage );.  
4cd0: 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65    pBt->pHasConte
4ce0: 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  nt = sqlite3Bitv
4cf0: 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e 6e 50  ecCreate(pBt->nP
4d00: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  age);.    if( !p
4d10: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
4d20: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
4d30: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
4d40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
4d50: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
4d60: 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42  & pgno<=sqlite3B
4d70: 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70  itvecSize(pBt->p
4d80: 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20  HasContent) ){. 
4d90: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
4da0: 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48  itvecSet(pBt->pH
4db0: 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29  asContent, pgno)
4dc0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
4dd0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72  c;.}../*.** Quer
4de0: 79 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  y the BtShared.p
4df0: 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f  HasContent vecto
4e00: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  r..**.** This fu
4e10: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
4e20: 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   when a free-lis
4e30: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
4e40: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a  emoved from the.
4e50: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72  ** free-list for
4e60: 20 72 65 75 73 65 2e 20 49 74 20 72 65 74 75 72   reuse. It retur
4e70: 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ns false if it i
4e80: 73 20 73 61 66 65 20 74 6f 20 72 65 74 72 69 65  s safe to retrie
4e90: 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66  ve the.** page f
4ea0: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61  rom the pager la
4eb0: 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
4ec0: 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
4ed0: 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69  et. True otherwi
4ee0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
4ef0: 74 20 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e  t btreeGetHasCon
4f00: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
4f10: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
4f20: 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42    Bitvec *p = pB
4f30: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a  t->pHasContent;.
4f40: 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28    return (p && (
4f50: 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76  pgno>sqlite3Bitv
4f60: 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c  ecSize(p) || sql
4f70: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
4f80: 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a  , pgno)));.}../*
4f90: 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72  .** Clear (destr
4fa0: 6f 79 29 20 74 68 65 20 42 74 53 68 61 72 65 64  oy) the BtShared
4fb0: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
4fc0: 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  vec. This should
4fd0: 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61   be.** invoked a
4fe0: 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
4ff0: 20 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d 74   of each write-t
5000: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
5010: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
5020: 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
5030: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
5040: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
5050: 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73  estroy(pBt->pHas
5060: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d  Content);.  pBt-
5070: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30  >pHasContent = 0
5080: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
5090: 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 70  se all of the ap
50a0: 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66 6f 72  Page[] pages for
50b0: 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74   a cursor..*/.st
50c0: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 52  atic void btreeR
50d0: 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
50e0: 61 67 65 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ages(BtCursor *p
50f0: 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cur){.  int i;. 
5100: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75   for(i=0; i<=pCu
5110: 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  r->iPage; i++){.
5120: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
5130: 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29  pCur->apPage[i])
5140: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61  ;.    pCur->apPa
5150: 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20  ge[i] = 0;.  }. 
5160: 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d   pCur->iPage = -
5170: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  1;.}../*.** The 
5180: 63 75 72 73 6f 72 20 70 61 73 73 65 64 20 61 73  cursor passed as
5190: 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
51a0: 6e 74 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  nt must point to
51b0: 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 0a 2a   a valid entry.*
51c0: 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * when this func
51d0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 28  tion is called (
51e0: 69 2e 65 2e 20 68 61 76 65 20 65 53 74 61 74 65  i.e. have eState
51f0: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 2e  ==CURSOR_VALID).
5200: 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
5210: 6e 20 73 61 76 65 73 20 74 68 65 20 63 75 72 72  n saves the curr
5220: 65 6e 74 20 63 75 72 73 6f 72 20 6b 65 79 20 69  ent cursor key i
5230: 6e 20 76 61 72 69 61 62 6c 65 73 20 70 43 75 72  n variables pCur
5240: 2d 3e 6e 4b 65 79 20 61 6e 64 0a 2a 2a 20 70 43  ->nKey and.** pC
5250: 75 72 2d 3e 70 4b 65 79 2e 20 53 51 4c 49 54 45  ur->pKey. SQLITE
5260: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
5270: 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72  if successful or
5280: 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
5290: 20 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72 77   .** code otherw
52a0: 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ise..**.** If th
52b0: 65 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e  e cursor is open
52c0: 20 6f 6e 20 61 6e 20 69 6e 74 6b 65 79 20 74 61   on an intkey ta
52d0: 62 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 69 6e  ble, then the in
52e0: 74 65 67 65 72 20 6b 65 79 0a 2a 2a 20 28 74 68  teger key.** (th
52f0: 65 20 72 6f 77 69 64 29 20 69 73 20 73 74 6f 72  e rowid) is stor
5300: 65 64 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79  ed in pCur->nKey
5310: 20 61 6e 64 20 70 43 75 72 2d 3e 70 4b 65 79 20   and pCur->pKey 
5320: 69 73 20 6c 65 66 74 20 73 65 74 20 74 6f 0a 2a  is left set to.*
5330: 2a 20 4e 55 4c 4c 2e 20 49 66 20 74 68 65 20 63  * NULL. If the c
5340: 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 20 6f 6e  ursor is open on
5350: 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 74 61   a non-intkey ta
5360: 62 6c 65 2c 20 74 68 65 6e 20 70 43 75 72 2d 3e  ble, then pCur->
5370: 70 4b 65 79 20 69 73 20 0a 2a 2a 20 73 65 74 20  pKey is .** set 
5380: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 6d 61  to point to a ma
5390: 6c 6c 6f 63 65 64 20 62 75 66 66 65 72 20 70 43  lloced buffer pC
53a0: 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 69  ur->nKey bytes i
53b0: 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e  n size containin
53c0: 67 20 0a 2a 2a 20 74 68 65 20 6b 65 79 2e 0a 2a  g .** the key..*
53d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  /.static int sav
53e0: 65 43 75 72 73 6f 72 4b 65 79 28 42 74 43 75 72  eCursorKey(BtCur
53f0: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
5400: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
5410: 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
5420: 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  OR_VALID==pCur->
5430: 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65  eState );.  asse
5440: 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65  rt( 0==pCur->pKe
5450: 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  y );.  assert( c
5460: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
5470: 70 43 75 72 29 20 29 3b 0a 0a 20 20 69 66 28 20  pCur) );..  if( 
5480: 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20  pCur->curIntKey 
5490: 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 74  ){.    /* Only t
54a0: 68 65 20 72 6f 77 69 64 20 69 73 20 72 65 71 75  he rowid is requ
54b0: 69 72 65 64 20 66 6f 72 20 61 20 74 61 62 6c 65  ired for a table
54c0: 20 62 74 72 65 65 20 2a 2f 0a 20 20 20 20 70 43   btree */.    pC
54d0: 75 72 2d 3e 6e 4b 65 79 20 3d 20 73 71 6c 69 74  ur->nKey = sqlit
54e0: 65 33 42 74 72 65 65 49 6e 74 65 67 65 72 4b 65  e3BtreeIntegerKe
54f0: 79 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65  y(pCur);.  }else
5500: 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61 6e 20  {.    /* For an 
5510: 69 6e 64 65 78 20 62 74 72 65 65 2c 20 73 61 76  index btree, sav
5520: 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 6b  e the complete k
5530: 65 79 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ey content */.  
5540: 20 20 76 6f 69 64 20 2a 70 4b 65 79 3b 0a 20 20    void *pKey;.  
5550: 20 20 70 43 75 72 2d 3e 6e 4b 65 79 20 3d 20 73    pCur->nKey = s
5560: 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f  qlite3BtreePaylo
5570: 61 64 53 69 7a 65 28 70 43 75 72 29 3b 0a 20 20  adSize(pCur);.  
5580: 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33    pKey = sqlite3
5590: 4d 61 6c 6c 6f 63 28 20 70 43 75 72 2d 3e 6e 4b  Malloc( pCur->nK
55a0: 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b  ey );.    if( pK
55b0: 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ey ){.      rc =
55c0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
55d0: 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c 20 28 69  load(pCur, 0, (i
55e0: 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 70  nt)pCur->nKey, p
55f0: 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Key);.      if( 
5600: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
5610: 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70  .        pCur->p
5620: 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20  Key = pKey;.    
5630: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
5640: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4b   sqlite3_free(pK
5650: 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ey);.      }.   
5660: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
5670: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
5680: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  BKPT;.    }.  }.
5690: 20 20 61 73 73 65 72 74 28 20 21 70 43 75 72 2d    assert( !pCur-
56a0: 3e 63 75 72 49 6e 74 4b 65 79 20 7c 7c 20 21 70  >curIntKey || !p
56b0: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 72  Cur->pKey );.  r
56c0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
56d0: 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75 72 72  ** Save the curr
56e0: 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ent cursor posit
56f0: 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72 69 61  ion in the varia
5700: 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b  bles BtCursor.nK
5710: 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72  ey .** and BtCur
5720: 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20 63 75  sor.pKey. The cu
5730: 72 73 6f 72 27 73 20 73 74 61 74 65 20 69 73 20  rsor's state is 
5740: 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 52 45  set to CURSOR_RE
5750: 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a  QUIRESEEK..**.**
5760: 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
5770: 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
5780: 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64   cursor is valid
5790: 20 28 68 61 73 20 65 53 74 61 74 65 3d 3d 43 55   (has eState==CU
57a0: 52 53 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a 20 70  RSOR_VALID).** p
57b0: 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20  rior to calling 
57c0: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 0a  this routine.  .
57d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  */.static int sa
57e0: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
57f0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
5800: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
5810: 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41  ssert( CURSOR_VA
5820: 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
5830: 65 20 7c 7c 20 43 55 52 53 4f 52 5f 53 4b 49 50  e || CURSOR_SKIP
5840: 4e 45 58 54 3d 3d 70 43 75 72 2d 3e 65 53 74 61  NEXT==pCur->eSta
5850: 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  te );.  assert( 
5860: 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b  0==pCur->pKey );
5870: 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
5880: 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
5890: 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 43 75 72  ) );..  if( pCur
58a0: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
58b0: 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20  _SKIPNEXT ){.   
58c0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
58d0: 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20  CURSOR_VALID;.  
58e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d  }else{.    pCur-
58f0: 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20  >skipNext = 0;. 
5900: 20 7d 0a 0a 20 20 72 63 20 3d 20 73 61 76 65 43   }..  rc = saveC
5910: 75 72 73 6f 72 4b 65 79 28 70 43 75 72 29 3b 0a  ursorKey(pCur);.
5920: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5930: 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 74 72 65 65  _OK ){.    btree
5940: 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72  ReleaseAllCursor
5950: 50 61 67 65 73 28 70 43 75 72 29 3b 0a 20 20 20  Pages(pCur);.   
5960: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
5970: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
5980: 45 4b 3b 0a 20 20 7d 0a 0a 20 20 70 43 75 72 2d  EK;.  }..  pCur-
5990: 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42  >curFlags &= ~(B
59a0: 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54  TCF_ValidNKey|BT
59b0: 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43  CF_ValidOvfl|BTC
59c0: 46 5f 41 74 4c 61 73 74 29 3b 0a 20 20 72 65 74  F_AtLast);.  ret
59d0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  urn rc;.}../* Fo
59e0: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
59f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
5a00: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61  LITE_NOINLINE sa
5a10: 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28  veCursorsOnList(
5a20: 42 74 43 75 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42  BtCursor*,Pgno,B
5a30: 74 43 75 72 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a  tCursor*);../*.*
5a40: 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73 69 74  * Save the posit
5a50: 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72 73  ions of all curs
5a60: 6f 72 73 20 28 65 78 63 65 70 74 20 70 45 78 63  ors (except pExc
5a70: 65 70 74 29 20 74 68 61 74 20 61 72 65 20 6f 70  ept) that are op
5a80: 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 74 61 62  en on.** the tab
5a90: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
5aa0: 65 20 69 52 6f 6f 74 2e 20 20 22 53 61 76 69 6e  e iRoot.  "Savin
5ab0: 67 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f 73  g the cursor pos
5ac0: 69 74 69 6f 6e 22 20 6d 65 61 6e 73 20 74 68 61  ition" means tha
5ad0: 74 0a 2a 2a 20 74 68 65 20 6c 6f 63 61 74 69 6f  t.** the locatio
5ae0: 6e 20 69 6e 20 74 68 65 20 62 74 72 65 65 20 69  n in the btree i
5af0: 73 20 72 65 6d 65 6d 62 65 72 65 64 20 69 6e 20  s remembered in 
5b00: 73 75 63 68 20 61 20 77 61 79 20 74 68 61 74 20  such a way that 
5b10: 69 74 20 63 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76  it can be.** mov
5b20: 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65 20 73  ed back to the s
5b30: 61 6d 65 20 73 70 6f 74 20 61 66 74 65 72 20 74  ame spot after t
5b40: 68 65 20 62 74 72 65 65 20 68 61 73 20 62 65 65  he btree has bee
5b50: 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 54 68 69  n modified.  Thi
5b60: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20  s.** routine is 
5b70: 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65 66 6f  called just befo
5b80: 72 65 20 63 75 72 73 6f 72 20 70 45 78 63 65 70  re cursor pExcep
5b90: 74 20 69 73 20 75 73 65 64 20 74 6f 20 6d 6f 64  t is used to mod
5ba0: 69 66 79 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65  ify the.** table
5bb0: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 20 69 6e  , for example in
5bc0: 20 42 74 72 65 65 44 65 6c 65 74 65 28 29 20 6f   BtreeDelete() o
5bd0: 72 20 42 74 72 65 65 49 6e 73 65 72 74 28 29 2e  r BtreeInsert().
5be0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
5bf0: 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  are two or more 
5c00: 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 73  cursors on the s
5c10: 61 6d 65 20 62 74 72 65 65 2c 20 74 68 65 6e 20  ame btree, then 
5c20: 61 6c 6c 20 73 75 63 68 20 0a 2a 2a 20 63 75 72  all such .** cur
5c30: 73 6f 72 73 20 73 68 6f 75 6c 64 20 68 61 76 65  sors should have
5c40: 20 74 68 65 69 72 20 42 54 43 46 5f 4d 75 6c 74   their BTCF_Mult
5c50: 69 70 6c 65 20 66 6c 61 67 20 73 65 74 2e 20 20  iple flag set.  
5c60: 54 68 65 20 62 74 72 65 65 43 75 72 73 6f 72 28  The btreeCursor(
5c70: 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 65 6e 66  ).** routine enf
5c80: 6f 72 63 65 73 20 74 68 61 74 20 72 75 6c 65 2e  orces that rule.
5c90: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6f    This routine o
5ca0: 6e 6c 79 20 6e 65 65 64 73 20 74 6f 20 62 65 20  nly needs to be 
5cb0: 63 61 6c 6c 65 64 20 69 6e 0a 2a 2a 20 74 68 65  called in.** the
5cc0: 20 75 6e 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77   uncommon case w
5cd0: 68 65 6e 20 70 45 78 70 65 63 74 20 68 61 73 20  hen pExpect has 
5ce0: 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c  the BTCF_Multipl
5cf0: 65 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a  e flag set..**.*
5d00: 2a 20 49 66 20 70 45 78 70 65 63 74 21 3d 4e 55  * If pExpect!=NU
5d10: 4c 4c 20 61 6e 64 20 69 66 20 6e 6f 20 6f 74 68  LL and if no oth
5d20: 65 72 20 63 75 72 73 6f 72 73 20 61 72 65 20 66  er cursors are f
5d30: 6f 75 6e 64 20 6f 6e 20 74 68 65 20 73 61 6d 65  ound on the same
5d40: 20 72 6f 6f 74 2d 70 61 67 65 2c 0a 2a 2a 20 74   root-page,.** t
5d50: 68 65 6e 20 74 68 65 20 42 54 43 46 5f 4d 75 6c  hen the BTCF_Mul
5d60: 74 69 70 6c 65 20 66 6c 61 67 20 6f 6e 20 70 45  tiple flag on pE
5d70: 78 70 65 63 74 20 69 73 20 63 6c 65 61 72 65 64  xpect is cleared
5d80: 2c 20 74 6f 20 61 76 6f 69 64 20 61 6e 6f 74 68  , to avoid anoth
5d90: 65 72 0a 2a 2a 20 70 6f 69 6e 74 6c 65 73 73 20  er.** pointless 
5da0: 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75  call to this rou
5db0: 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c  tine..**.** Impl
5dc0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6e 6f 74 65 3a  ementation note:
5dd0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
5de0: 65 72 65 6c 79 20 63 68 65 63 6b 73 20 74 6f 20  erely checks to 
5df0: 73 65 65 20 69 66 20 61 6e 79 20 63 75 72 73 6f  see if any curso
5e00: 72 73 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65  rs.** need to be
5e10: 20 73 61 76 65 64 2e 20 20 49 74 20 63 61 6c 6c   saved.  It call
5e20: 73 20 6f 75 74 20 74 6f 20 73 61 76 65 43 75 72  s out to saveCur
5e30: 73 6f 72 73 4f 6e 4c 69 73 74 28 29 20 69 6e 20  sorsOnList() in 
5e40: 74 68 65 20 28 75 6e 75 73 75 61 6c 29 0a 2a 2a  the (unusual).**
5e50: 20 65 76 65 6e 74 20 74 68 61 74 20 63 75 72 73   event that curs
5e60: 6f 72 73 20 61 72 65 20 69 6e 20 6e 65 65 64 20  ors are in need 
5e70: 74 6f 20 62 65 69 6e 67 20 73 61 76 65 64 2e 0a  to being saved..
5e80: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  */.static int sa
5e90: 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 53  veAllCursors(BtS
5ea0: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
5eb0: 20 69 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72   iRoot, BtCursor
5ec0: 20 2a 70 45 78 63 65 70 74 29 7b 0a 20 20 42 74   *pExcept){.  Bt
5ed0: 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73  Cursor *p;.  ass
5ee0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
5ef0: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
5f00: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
5f10: 20 70 45 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70   pExcept==0 || p
5f20: 45 78 63 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74  Except->pBt==pBt
5f30: 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d   );.  for(p=pBt-
5f40: 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
5f50: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
5f60: 28 20 70 21 3d 70 45 78 63 65 70 74 20 26 26 20  ( p!=pExcept && 
5f70: 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e  (0==iRoot || p->
5f80: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29  pgnoRoot==iRoot)
5f90: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
5fa0: 69 66 28 20 70 20 29 20 72 65 74 75 72 6e 20 73  if( p ) return s
5fb0: 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74  aveCursorsOnList
5fc0: 28 70 2c 20 69 52 6f 6f 74 2c 20 70 45 78 63 65  (p, iRoot, pExce
5fd0: 70 74 29 3b 0a 20 20 69 66 28 20 70 45 78 63 65  pt);.  if( pExce
5fe0: 70 74 20 29 20 70 45 78 63 65 70 74 2d 3e 63 75  pt ) pExcept->cu
5ff0: 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f  rFlags &= ~BTCF_
6000: 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 72 65 74 75  Multiple;.  retu
6010: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
6020: 0a 2f 2a 20 54 68 69 73 20 68 65 6c 70 65 72 20  ./* This helper 
6030: 72 6f 75 74 69 6e 65 20 74 6f 20 73 61 76 65 41  routine to saveA
6040: 6c 6c 43 75 72 73 6f 72 73 20 64 6f 65 73 20 74  llCursors does t
6050: 68 65 20 61 63 74 75 61 6c 20 77 6f 72 6b 20 6f  he actual work o
6060: 66 20 73 61 76 69 6e 67 0a 2a 2a 20 74 68 65 20  f saving.** the 
6070: 63 75 72 73 6f 72 73 20 69 66 20 61 6e 64 20 77  cursors if and w
6080: 68 65 6e 20 61 20 63 75 72 73 6f 72 20 69 73 20  hen a cursor is 
6090: 66 6f 75 6e 64 20 74 68 61 74 20 61 63 74 75 61  found that actua
60a0: 6c 6c 79 20 72 65 71 75 69 72 65 73 20 73 61 76  lly requires sav
60b0: 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d  ing..** The comm
60c0: 6f 6e 20 63 61 73 65 20 69 73 20 74 68 61 74 20  on case is that 
60d0: 6e 6f 20 63 75 72 73 6f 72 73 20 6e 65 65 64 20  no cursors need 
60e0: 74 6f 20 62 65 20 73 61 76 65 64 2c 20 73 6f 20  to be saved, so 
60f0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a  this routine is.
6100: 2a 2a 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72  ** broken out fr
6110: 6f 6d 20 69 74 73 20 63 61 6c 6c 65 72 20 74 6f  om its caller to
6120: 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61   avoid unnecessa
6130: 72 79 20 73 74 61 63 6b 20 70 6f 69 6e 74 65 72  ry stack pointer
6140: 20 6d 6f 76 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   movement..*/.st
6150: 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
6160: 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43 75 72  NOINLINE saveCur
6170: 73 6f 72 73 4f 6e 4c 69 73 74 28 0a 20 20 42 74  sorsOnList(.  Bt
6180: 43 75 72 73 6f 72 20 2a 70 2c 20 20 20 20 20 20  Cursor *p,      
6190: 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20     /* The first 
61a0: 63 75 72 73 6f 72 20 74 68 61 74 20 6e 65 65 64  cursor that need
61b0: 73 20 73 61 76 69 6e 67 20 2a 2f 0a 20 20 50 67  s saving */.  Pg
61c0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
61d0: 20 20 20 2f 2a 20 4f 6e 6c 79 20 73 61 76 65 20     /* Only save 
61e0: 63 75 72 73 6f 72 20 77 69 74 68 20 74 68 69 73  cursor with this
61f0: 20 69 52 6f 6f 74 2e 20 53 61 76 65 20 61 6c 6c   iRoot. Save all
6200: 20 69 66 20 7a 65 72 6f 20 2a 2f 0a 20 20 42 74   if zero */.  Bt
6210: 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74 20  Cursor *pExcept 
6220: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 61 76     /* Do not sav
6230: 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f  e this cursor */
6240: 0a 29 7b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66  .){.  do{.    if
6250: 28 20 70 21 3d 70 45 78 63 65 70 74 20 26 26 20  ( p!=pExcept && 
6260: 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e  (0==iRoot || p->
6270: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29  pgnoRoot==iRoot)
6280: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
6290: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
62a0: 56 41 4c 49 44 20 7c 7c 20 70 2d 3e 65 53 74 61  VALID || p->eSta
62b0: 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e  te==CURSOR_SKIPN
62c0: 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69  EXT ){.        i
62d0: 6e 74 20 72 63 20 3d 20 73 61 76 65 43 75 72 73  nt rc = saveCurs
62e0: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20  orPosition(p);. 
62f0: 20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54         if( SQLIT
6300: 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK!=rc ){.    
6310: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
6320: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6330: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6340: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 69 50 61  testcase( p->iPa
6350: 67 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ge>0 );.        
6360: 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43  btreeReleaseAllC
6370: 75 72 73 6f 72 50 61 67 65 73 28 70 29 3b 0a 20  ursorPages(p);. 
6380: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
6390: 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20   p = p->pNext;. 
63a0: 20 7d 77 68 69 6c 65 28 20 70 20 29 3b 0a 20 20   }while( p );.  
63b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
63c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
63d0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
63e0: 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f  sor position..*/
63f0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
6400: 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 42 74  eeClearCursor(Bt
6410: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
6420: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
6430: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
6440: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
6450: 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20  e(pCur->pKey);. 
6460: 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b   pCur->pKey = 0;
6470: 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20  .  pCur->eState 
6480: 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
6490: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68  ;.}../*.** In th
64a0: 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 42 74  is version of Bt
64b0: 72 65 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20  reeMoveto, pKey 
64c0: 69 73 20 61 20 70 61 63 6b 65 64 20 69 6e 64 65  is a packed inde
64d0: 78 20 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68  x record.** such
64e0: 20 61 73 20 69 73 20 67 65 6e 65 72 61 74 65 64   as is generated
64f0: 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52   by the OP_MakeR
6500: 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20 55  ecord opcode.  U
6510: 6e 70 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63  npack the.** rec
6520: 6f 72 64 20 61 6e 64 20 74 68 65 6e 20 63 61 6c  ord and then cal
6530: 6c 20 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  l BtreeMovetoUnp
6540: 61 63 6b 65 64 28 29 20 74 6f 20 64 6f 20 74 68  acked() to do th
6550: 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69  e work..*/.stati
6560: 63 20 69 6e 74 20 62 74 72 65 65 4d 6f 76 65 74  c int btreeMovet
6570: 6f 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  o(.  BtCursor *p
6580: 43 75 72 2c 20 20 20 20 20 2f 2a 20 43 75 72 73  Cur,     /* Curs
6590: 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62  or open on the b
65a0: 74 72 65 65 20 74 6f 20 62 65 20 73 65 61 72 63  tree to be searc
65b0: 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  hed */.  const v
65c0: 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20  oid *pKey,   /* 
65d0: 50 61 63 6b 65 64 20 6b 65 79 20 69 66 20 74 68  Packed key if th
65e0: 65 20 62 74 72 65 65 20 69 73 20 61 6e 20 69 6e  e btree is an in
65f0: 64 65 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65  dex */.  i64 nKe
6600: 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y,           /* 
6610: 49 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20  Integer key for 
6620: 74 61 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66  tables.  Size of
6630: 20 70 4b 65 79 20 66 6f 72 20 69 6e 64 69 63 65   pKey for indice
6640: 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c  s */.  int bias,
6650: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
6660: 61 73 20 73 65 61 72 63 68 20 74 6f 20 74 68 65  as search to the
6670: 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69   high end */.  i
6680: 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20  nt *pRes        
6690: 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72     /* Write sear
66a0: 63 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  ch results here 
66b0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
66c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66d0: 20 20 20 2f 2a 20 53 74 61 74 75 73 20 63 6f 64     /* Status cod
66e0: 65 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  e */.  UnpackedR
66f0: 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b 20  ecord *pIdxKey; 
6700: 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e    /* Unpacked in
6710: 64 65 78 20 6b 65 79 20 2a 2f 0a 0a 20 20 69 66  dex key */..  if
6720: 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 73  ( pKey ){.    as
6730: 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34  sert( nKey==(i64
6740: 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20  )(int)nKey );.  
6750: 20 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c 69    pIdxKey = sqli
6760: 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61  te3VdbeAllocUnpa
6770: 63 6b 65 64 52 65 63 6f 72 64 28 70 43 75 72 2d  ckedRecord(pCur-
6780: 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20  >pKeyInfo);.    
6790: 69 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29  if( pIdxKey==0 )
67a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
67b0: 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 73  OMEM_BKPT;.    s
67c0: 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
67d0: 55 6e 70 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65  Unpack(pCur->pKe
67e0: 79 49 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b 65 79  yInfo, (int)nKey
67f0: 2c 20 70 4b 65 79 2c 20 70 49 64 78 4b 65 79 29  , pKey, pIdxKey)
6800: 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 4b 65  ;.    if( pIdxKe
6810: 79 2d 3e 6e 46 69 65 6c 64 3d 3d 30 20 29 7b 0a  y->nField==0 ){.
6820: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
6830: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
6840: 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
6850: 6f 5f 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 20 20  o_done;.    }.  
6860: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64 78 4b  }else{.    pIdxK
6870: 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63  ey = 0;.  }.  rc
6880: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
6890: 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43  ovetoUnpacked(pC
68a0: 75 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65  ur, pIdxKey, nKe
68b0: 79 2c 20 62 69 61 73 2c 20 70 52 65 73 29 3b 0a  y, bias, pRes);.
68c0: 6d 6f 76 65 74 6f 5f 64 6f 6e 65 3a 0a 20 20 69  moveto_done:.  i
68d0: 66 28 20 70 49 64 78 4b 65 79 20 29 7b 0a 20 20  f( pIdxKey ){.  
68e0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
68f0: 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  pCur->pKeyInfo->
6900: 64 62 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  db, pIdxKey);.  
6910: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
6920: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20  ../*.** Restore 
6930: 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
6940: 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61  e position it wa
6950: 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73  s in (or as clos
6960: 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65  e to as possible
6970: 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75  ).** when saveCu
6980: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77  rsorPosition() w
6990: 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20  as called. Note 
69a0: 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64  that this call d
69b0: 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73  eletes the .** s
69c0: 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e  aved position in
69d0: 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61 76  fo stored by sav
69e0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
69f0: 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20  ), so there can 
6a00: 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e  be.** at most on
6a10: 65 20 65 66 66 65 63 74 69 76 65 20 72 65 73 74  e effective rest
6a20: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
6a30: 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65  n() call after e
6a40: 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73  ach .** saveCurs
6a50: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f  orPosition()..*/
6a60: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
6a70: 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f  eRestoreCursorPo
6a80: 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20  sition(BtCursor 
6a90: 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
6aa0: 3b 0a 20 20 69 6e 74 20 73 6b 69 70 4e 65 78 74  ;.  int skipNext
6ab0: 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
6ac0: 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
6ad0: 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
6ae0: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d  ( pCur->eState>=
6af0: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
6b00: 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  EK );.  if( pCur
6b10: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
6b20: 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65  _FAULT ){.    re
6b30: 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e  turn pCur->skipN
6b40: 65 78 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  ext;.  }.  pCur-
6b50: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
6b60: 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d  _INVALID;.  rc =
6b70: 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75   btreeMoveto(pCu
6b80: 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70  r, pCur->pKey, p
6b90: 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 73  Cur->nKey, 0, &s
6ba0: 6b 69 70 4e 65 78 74 29 3b 0a 20 20 69 66 28 20  kipNext);.  if( 
6bb0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
6bc0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
6bd0: 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20  e(pCur->pKey);. 
6be0: 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20     pCur->pKey = 
6bf0: 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  0;.    assert( p
6c00: 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
6c10: 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75  SOR_VALID || pCu
6c20: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
6c30: 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20  R_INVALID );.   
6c40: 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
6c50: 7c 3d 20 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20  |= skipNext;.   
6c60: 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e   if( pCur->skipN
6c70: 65 78 74 20 26 26 20 70 43 75 72 2d 3e 65 53 74  ext && pCur->eSt
6c80: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
6c90: 44 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  D ){.      pCur-
6ca0: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
6cb0: 5f 53 4b 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d  _SKIPNEXT;.    }
6cc0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
6cd0: 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73  ;.}..#define res
6ce0: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
6cf0: 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53  on(p) \.  (p->eS
6d00: 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
6d10: 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20  UIRESEEK ? \.   
6d20: 20 20 20 20 20 20 62 74 72 65 65 52 65 73 74 6f        btreeResto
6d30: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
6d40: 28 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20  (p) : \.        
6d50: 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a   SQLITE_OK)../*.
6d60: 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65  ** Determine whe
6d70: 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75  ther or not a cu
6d80: 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66  rsor has moved f
6d90: 72 6f 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  rom the position
6da0: 20 77 68 65 72 65 0a 2a 2a 20 69 74 20 77 61 73   where.** it was
6db0: 20 6c 61 73 74 20 70 6c 61 63 65 64 2c 20 6f 72   last placed, or
6dc0: 20 68 61 73 20 62 65 65 6e 20 69 6e 76 61 6c 69   has been invali
6dd0: 64 61 74 65 64 20 66 6f 72 20 61 6e 79 20 6f 74  dated for any ot
6de0: 68 65 72 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20 43  her reason..** C
6df0: 75 72 73 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20  ursors can move 
6e00: 77 68 65 6e 20 74 68 65 20 72 6f 77 20 74 68 65  when the row the
6e10: 79 20 61 72 65 20 70 6f 69 6e 74 69 6e 67 20 61  y are pointing a
6e20: 74 20 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74  t is deleted out
6e30: 0a 2a 2a 20 66 72 6f 6d 20 75 6e 64 65 72 20 74  .** from under t
6e40: 68 65 6d 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  hem, for example
6e50: 2e 20 20 43 75 72 73 6f 72 20 6d 69 67 68 74 20  .  Cursor might 
6e60: 61 6c 73 6f 20 6d 6f 76 65 20 69 66 20 61 20 62  also move if a b
6e70: 74 72 65 65 0a 2a 2a 20 69 73 20 72 65 62 61 6c  tree.** is rebal
6e80: 61 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c  anced..**.** Cal
6e90: 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
6ea0: 65 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 63 75  e with a NULL cu
6eb0: 72 73 6f 72 20 70 6f 69 6e 74 65 72 20 72 65 74  rsor pointer ret
6ec0: 75 72 6e 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a  urns false..**.*
6ed0: 2a 20 55 73 65 20 74 68 65 20 73 65 70 61 72 61  * Use the separa
6ee0: 74 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  te sqlite3BtreeC
6ef0: 75 72 73 6f 72 52 65 73 74 6f 72 65 28 29 20 72  ursorRestore() r
6f00: 6f 75 74 69 6e 65 20 74 6f 20 72 65 73 74 6f 72  outine to restor
6f10: 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 62 61  e a cursor.** ba
6f20: 63 6b 20 74 6f 20 77 68 65 72 65 20 69 74 20 6f  ck to where it o
6f30: 75 67 68 74 20 74 6f 20 62 65 20 69 66 20 74 68  ught to be if th
6f40: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
6f50: 6e 73 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20  ns true..*/.int 
6f60: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
6f70: 6f 72 48 61 73 4d 6f 76 65 64 28 42 74 43 75 72  orHasMoved(BtCur
6f80: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65  sor *pCur){.  re
6f90: 74 75 72 6e 20 70 43 75 72 2d 3e 65 53 74 61 74  turn pCur->eStat
6fa0: 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b  e!=CURSOR_VALID;
6fb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
6fc0: 6f 75 74 69 6e 65 20 72 65 73 74 6f 72 65 73 20  outine restores 
6fd0: 61 20 63 75 72 73 6f 72 20 62 61 63 6b 20 74 6f  a cursor back to
6fe0: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 70 6f   its original po
6ff0: 73 69 74 69 6f 6e 20 61 66 74 65 72 20 69 74 0a  sition after it.
7000: 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 76 65  ** has been move
7010: 64 20 62 79 20 73 6f 6d 65 20 6f 75 74 73 69 64  d by some outsid
7020: 65 20 61 63 74 69 76 69 74 79 20 28 73 75 63 68  e activity (such
7030: 20 61 73 20 61 20 62 74 72 65 65 20 72 65 62 61   as a btree reba
7040: 6c 61 6e 63 65 20 6f 72 0a 2a 2a 20 61 20 72 6f  lance or.** a ro
7050: 77 20 68 61 76 69 6e 67 20 62 65 65 6e 20 64 65  w having been de
7060: 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75  leted out from u
7070: 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 29  nder the cursor)
7080: 2e 20 20 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63  .  .**.** On suc
7090: 63 65 73 73 2c 20 74 68 65 20 2a 70 44 69 66 66  cess, the *pDiff
70a0: 65 72 65 6e 74 52 6f 77 20 70 61 72 61 6d 65 74  erentRow paramet
70b0: 65 72 20 69 73 20 66 61 6c 73 65 20 69 66 20 74  er is false if t
70c0: 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
70d0: 74 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 61 74  t.** pointing at
70e0: 20 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d   exactly the sam
70f0: 65 20 72 6f 77 2e 20 20 2a 70 44 69 66 66 65 72  e row.  *pDiffer
7100: 6e 74 52 6f 77 20 69 73 20 74 68 65 20 72 6f 77  ntRow is the row
7110: 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77   the cursor.** w
7120: 61 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 68  as pointing to h
7130: 61 73 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2c  as been deleted,
7140: 20 66 6f 72 63 69 6e 67 20 74 68 65 20 63 75 72   forcing the cur
7150: 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  sor to point to 
7160: 73 6f 6d 65 0a 2a 2a 20 6e 65 61 72 62 79 20 72  some.** nearby r
7170: 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ow..**.** This r
7180: 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e  outine should on
7190: 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 66 6f 72  ly be called for
71a0: 20 61 20 63 75 72 73 6f 72 20 74 68 61 74 20 6a   a cursor that j
71b0: 75 73 74 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20  ust returned.** 
71c0: 54 52 55 45 20 66 72 6f 6d 20 73 71 6c 69 74 65  TRUE from sqlite
71d0: 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d  3BtreeCursorHasM
71e0: 6f 76 65 64 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  oved()..*/.int s
71f0: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
7200: 72 52 65 73 74 6f 72 65 28 42 74 43 75 72 73 6f  rRestore(BtCurso
7210: 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 44  r *pCur, int *pD
7220: 69 66 66 65 72 65 6e 74 52 6f 77 29 7b 0a 20 20  ifferentRow){.  
7230: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
7240: 74 28 20 70 43 75 72 21 3d 30 20 29 3b 0a 20 20  t( pCur!=0 );.  
7250: 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
7260: 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
7270: 49 44 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  ID );.  rc = res
7280: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
7290: 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
72a0: 72 63 20 29 7b 0a 20 20 20 20 2a 70 44 69 66 66  rc ){.    *pDiff
72b0: 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20  erentRow = 1;.  
72c0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
72d0: 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
72e0: 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
72f0: 44 20 29 7b 0a 20 20 20 20 2a 70 44 69 66 66 65  D ){.    *pDiffe
7300: 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20 7d  rentRow = 1;.  }
7310: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
7320: 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
7330: 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70 44 69 66  ==0 );.    *pDif
7340: 66 65 72 65 6e 74 52 6f 77 20 3d 20 30 3b 0a 20  ferentRow = 0;. 
7350: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
7360: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66  TE_OK;.}..#ifdef
7370: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
7380: 55 52 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a  URSOR_HINTS./*.*
7390: 2a 20 50 72 6f 76 69 64 65 20 68 69 6e 74 73 20  * Provide hints 
73a0: 74 6f 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20  to the cursor.  
73b0: 54 68 65 20 70 61 72 74 69 63 75 6c 61 72 20 68  The particular h
73c0: 69 6e 74 20 67 69 76 65 6e 20 28 61 6e 64 20 74  int given (and t
73d0: 68 65 20 74 79 70 65 0a 2a 2a 20 61 6e 64 20 6e  he type.** and n
73e0: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 76 61 72  umber of the var
73f0: 61 72 67 73 20 70 61 72 61 6d 65 74 65 72 73 29  args parameters)
7400: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62   is determined b
7410: 79 20 74 68 65 20 65 48 69 6e 74 54 79 70 65 0a  y the eHintType.
7420: 2a 2a 20 70 61 72 61 6d 65 74 65 72 2e 20 20 53  ** parameter.  S
7430: 65 65 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f  ee the definitio
7440: 6e 73 20 6f 66 20 74 68 65 20 42 54 52 45 45 5f  ns of the BTREE_
7450: 48 49 4e 54 5f 2a 20 6d 61 63 72 6f 73 20 66 6f  HINT_* macros fo
7460: 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 76 6f  r details..*/.vo
7470: 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
7480: 75 72 73 6f 72 48 69 6e 74 28 42 74 43 75 72 73  ursorHint(BtCurs
7490: 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 65 48  or *pCur, int eH
74a0: 69 6e 74 54 79 70 65 2c 20 2e 2e 2e 29 7b 0a 20  intType, ...){. 
74b0: 20 2f 2a 20 55 73 65 64 20 6f 6e 6c 79 20 62 79   /* Used only by
74c0: 20 73 79 73 74 65 6d 20 74 68 61 74 20 73 75 62   system that sub
74d0: 73 74 69 74 75 74 65 20 74 68 65 69 72 20 6f 77  stitute their ow
74e0: 6e 20 73 74 6f 72 61 67 65 20 65 6e 67 69 6e 65  n storage engine
74f0: 20 2a 2f 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   */.}.#endif../*
7500: 0a 2a 2a 20 50 72 6f 76 69 64 65 20 66 6c 61 67  .** Provide flag
7510: 20 68 69 6e 74 73 20 74 6f 20 74 68 65 20 63 75   hints to the cu
7520: 72 73 6f 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  rsor..*/.void sq
7530: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
7540: 48 69 6e 74 46 6c 61 67 73 28 42 74 43 75 72 73  HintFlags(BtCurs
7550: 6f 72 20 2a 70 43 75 72 2c 20 75 6e 73 69 67 6e  or *pCur, unsign
7560: 65 64 20 78 29 7b 0a 20 20 61 73 73 65 72 74 28  ed x){.  assert(
7570: 20 78 3d 3d 42 54 52 45 45 5f 53 45 45 4b 5f 45   x==BTREE_SEEK_E
7580: 51 20 7c 7c 20 78 3d 3d 42 54 52 45 45 5f 42 55  Q || x==BTREE_BU
7590: 4c 4b 4c 4f 41 44 20 7c 7c 20 78 3d 3d 30 20 29  LKLOAD || x==0 )
75a0: 3b 0a 20 20 70 43 75 72 2d 3e 68 69 6e 74 73 20  ;.  pCur->hints 
75b0: 3d 20 78 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66  = x;.}...#ifndef
75c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
75d0: 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69  OVACUUM./*.** Gi
75e0: 76 65 6e 20 61 20 70 61 67 65 20 6e 75 6d 62 65  ven a page numbe
75f0: 72 20 6f 66 20 61 20 72 65 67 75 6c 61 72 20 64  r of a regular d
7600: 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 72 65  atabase page, re
7610: 74 75 72 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a  turn the page.**
7620: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
7630: 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
7640: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
7650: 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  he entry for the
7660: 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67 65 20 6e  .** input page n
7670: 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  umber..**.** Ret
7680: 75 72 6e 20 30 20 28 6e 6f 74 20 61 20 76 61 6c  urn 0 (not a val
7690: 69 64 20 70 61 67 65 29 20 66 6f 72 20 70 67 6e  id page) for pgn
76a0: 6f 3d 3d 31 20 73 69 6e 63 65 20 74 68 65 72 65  o==1 since there
76b0: 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65   is.** no pointe
76c0: 72 20 6d 61 70 20 61 73 73 6f 63 69 61 74 65 64  r map associated
76d0: 20 77 69 74 68 20 70 61 67 65 20 31 2e 20 20 54   with page 1.  T
76e0: 68 65 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  he integrity_che
76f0: 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20 72 65 71 75  ck logic.** requ
7700: 69 72 65 73 20 74 68 61 74 20 70 74 72 6d 61 70  ires that ptrmap
7710: 50 61 67 65 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a  Pageno(*,1)!=1..
7720: 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70  */.static Pgno p
7730: 74 72 6d 61 70 50 61 67 65 6e 6f 28 42 74 53 68  trmapPageno(BtSh
7740: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
7750: 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61  pgno){.  int nPa
7760: 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20  gesPerMapPage;. 
7770: 20 50 67 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72   Pgno iPtrMap, r
7780: 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  et;.  assert( sq
7790: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
77a0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
77b0: 20 20 69 66 28 20 70 67 6e 6f 3c 32 20 29 20 72    if( pgno<2 ) r
77c0: 65 74 75 72 6e 20 30 3b 0a 20 20 6e 50 61 67 65  eturn 0;.  nPage
77d0: 73 50 65 72 4d 61 70 50 61 67 65 20 3d 20 28 70  sPerMapPage = (p
77e0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35  Bt->usableSize/5
77f0: 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d  )+1;.  iPtrMap =
7800: 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73   (pgno-2)/nPages
7810: 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 72 65  PerMapPage;.  re
7820: 74 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50 61  t = (iPtrMap*nPa
7830: 67 65 73 50 65 72 4d 61 70 50 61 67 65 29 20 2b  gesPerMapPage) +
7840: 20 32 3b 20 0a 20 20 69 66 28 20 72 65 74 3d 3d   2; .  if( ret==
7850: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
7860: 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 65  E(pBt) ){.    re
7870: 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  t++;.  }.  retur
7880: 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n ret;.}../*.** 
7890: 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69  Write an entry i
78a0: 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20  nto the pointer 
78b0: 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  map..**.** This 
78c0: 72 6f 75 74 69 6e 65 20 75 70 64 61 74 65 73 20  routine updates 
78d0: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
78e0: 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 6e  entry for page n
78f0: 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73  umber 'key'.** s
7900: 6f 20 74 68 61 74 20 69 74 20 6d 61 70 73 20 74  o that it maps t
7910: 6f 20 74 79 70 65 20 27 65 54 79 70 65 27 20 61  o type 'eType' a
7920: 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e  nd parent page n
7930: 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a  umber 'pgno'..**
7940: 0a 2a 2a 20 49 66 20 2a 70 52 43 20 69 73 20 69  .** If *pRC is i
7950: 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72  nitially non-zer
7960: 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b  o (non-SQLITE_OK
7970: 29 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  ) then this rout
7980: 69 6e 65 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f  ine is.** a no-o
7990: 70 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20  p.  If an error 
79a0: 6f 63 63 75 72 73 2c 20 74 68 65 20 61 70 70 72  occurs, the appr
79b0: 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
79c0: 64 65 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a  de is written.**
79d0: 20 69 6e 74 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73   into *pRC..*/.s
79e0: 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61  tatic void ptrma
79f0: 70 50 75 74 28 42 74 53 68 61 72 65 64 20 2a 70  pPut(BtShared *p
7a00: 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38  Bt, Pgno key, u8
7a10: 20 65 54 79 70 65 2c 20 50 67 6e 6f 20 70 61 72   eType, Pgno par
7a20: 65 6e 74 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  ent, int *pRC){.
7a30: 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
7a40: 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74  e;  /* The point
7a50: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
7a60: 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20   u8 *pPtrmap;   
7a70: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
7a80: 72 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20 20  r map data */.  
7a90: 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20 20  Pgno iPtrmap;   
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 6e 75 6d 62 65 72   map page number
7ac0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74   */.  int offset
7ad0: 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65  ;       /* Offse
7ae0: 74 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70  t in pointer map
7af0: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72   page */.  int r
7b00: 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  c;           /* 
7b10: 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d  Return code from
7b20: 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f   subfunctions */
7b30: 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72  ..  if( *pRC ) r
7b40: 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74  eturn;..  assert
7b50: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
7b60: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
7b70: 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73   );.  /* The mas
7b80: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65  ter-journal page
7b90: 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 6e 65 76   number must nev
7ba0: 65 72 20 62 65 20 75 73 65 64 20 61 73 20 61 20  er be used as a 
7bb0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
7bc0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d   */.  assert( 0=
7bd0: 3d 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70  =PTRMAP_ISPAGE(p
7be0: 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  Bt, PENDING_BYTE
7bf0: 5f 50 41 47 45 28 70 42 74 29 29 20 29 3b 0a 0a  _PAGE(pBt)) );..
7c00: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
7c10: 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 69  utoVacuum );.  i
7c20: 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20  f( key==0 ){.   
7c30: 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43   *pRC = SQLITE_C
7c40: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
7c50: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
7c60: 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f  Ptrmap = PTRMAP_
7c70: 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29  PAGENO(pBt, key)
7c80: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
7c90: 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
7ca0: 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26  ager, iPtrmap, &
7cb0: 70 44 62 50 61 67 65 2c 20 30 29 3b 0a 20 20 69  pDbPage, 0);.  i
7cc0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
7cd0: 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72   ){.    *pRC = r
7ce0: 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  c;.    return;. 
7cf0: 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54   }.  offset = PT
7d00: 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69  RMAP_PTROFFSET(i
7d10: 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20  Ptrmap, key);.  
7d20: 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a  if( offset<0 ){.
7d30: 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54      *pRC = SQLIT
7d40: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
7d50: 20 20 20 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f      goto ptrmap_
7d60: 65 78 69 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65  exit;.  }.  asse
7d70: 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69  rt( offset <= (i
7d80: 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  nt)pBt->usableSi
7d90: 7a 65 2d 35 20 29 3b 0a 20 20 70 50 74 72 6d 61  ze-5 );.  pPtrma
7da0: 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  p = (u8 *)sqlite
7db0: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
7dc0: 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28 20 65  bPage);..  if( e
7dd0: 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66  Type!=pPtrmap[of
7de0: 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62 79 74  fset] || get4byt
7df0: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
7e00: 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b  t+1])!=parent ){
7e10: 0a 20 20 20 20 54 52 41 43 45 28 28 22 50 54 52  .    TRACE(("PTR
7e20: 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e  MAP_UPDATE: %d->
7e30: 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c  (%d,%d)\n", key,
7e40: 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74 29 29   eType, parent))
7e50: 3b 0a 20 20 20 20 2a 70 52 43 3d 20 72 63 20 3d  ;.    *pRC= rc =
7e60: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
7e70: 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  te(pDbPage);.   
7e80: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
7e90: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 74 72  OK ){.      pPtr
7ea0: 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54  map[offset] = eT
7eb0: 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ype;.      put4b
7ec0: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
7ed0: 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b  set+1], parent);
7ee0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d  .    }.  }..ptrm
7ef0: 61 70 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74  ap_exit:.  sqlit
7f00: 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
7f10: 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
7f20: 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20 66 72  Read an entry fr
7f30: 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  om the pointer m
7f40: 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ap..**.** This r
7f50: 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76 65 73  outine retrieves
7f60: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
7f70: 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20   entry for page 
7f80: 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a  'key', writing.*
7f90: 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 70  * the type and p
7fa0: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
7fb0: 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61 6e 64  r to *pEType and
7fc0: 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63 74 69   *pPgno respecti
7fd0: 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f  vely..** An erro
7fe0: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
7ff0: 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20  ed if something 
8000: 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65  goes wrong, othe
8010: 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e  rwise SQLITE_OK.
8020: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
8030: 74 72 6d 61 70 47 65 74 28 42 74 53 68 61 72 65  trmapGet(BtShare
8040: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79  d *pBt, Pgno key
8050: 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20 50 67  , u8 *pEType, Pg
8060: 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62  no *pPgno){.  Db
8070: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
8080: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
8090: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  map page */.  in
80a0: 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 20  t iPtrmap;      
80b0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
80c0: 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20  page index */.  
80d0: 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20  u8 *pPtrmap;    
80e0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
80f0: 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  p page data */. 
8100: 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20   int offset;    
8110: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
8120: 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74 65   entry in pointe
8130: 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72  r map */.  int r
8140: 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  c;..  assert( sq
8150: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
8160: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
8170: 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52  .  iPtrmap = PTR
8180: 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
8190: 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  key);.  rc = sql
81a0: 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
81b0: 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61  ->pPager, iPtrma
81c0: 70 2c 20 26 70 44 62 50 61 67 65 2c 20 30 29 3b  p, &pDbPage, 0);
81d0: 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a  .  if( rc!=0 ){.
81e0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
81f0: 20 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28   }.  pPtrmap = (
8200: 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  u8 *)sqlite3Page
8210: 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
8220: 29 3b 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20 50  );..  offset = P
8230: 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28  TRMAP_PTROFFSET(
8240: 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20  iPtrmap, key);. 
8250: 20 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b   if( offset<0 ){
8260: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
8270: 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
8280: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
8290: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
82a0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f  .  }.  assert( o
82b0: 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42  ffset <= (int)pB
82c0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20  t->usableSize-5 
82d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 54  );.  assert( pET
82e0: 79 70 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54  ype!=0 );.  *pET
82f0: 79 70 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66  ype = pPtrmap[of
8300: 66 73 65 74 5d 3b 0a 20 20 69 66 28 20 70 50 67  fset];.  if( pPg
8310: 6e 6f 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65  no ) *pPgno = ge
8320: 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b  t4byte(&pPtrmap[
8330: 6f 66 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73  offset+1]);..  s
8340: 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
8350: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  (pDbPage);.  if(
8360: 20 2a 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70   *pEType<1 || *p
8370: 45 54 79 70 65 3e 35 20 29 20 72 65 74 75 72 6e  EType>5 ) return
8380: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
8390: 42 4b 50 54 3b 0a 20 20 72 65 74 75 72 6e 20 53  BKPT;.  return S
83a0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c  QLITE_OK;.}..#el
83b0: 73 65 20 2f 2a 20 69 66 20 64 65 66 69 6e 65 64  se /* if defined
83c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
83d0: 4f 56 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65  OVACUUM */.  #de
83e0: 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74 28 77  fine ptrmapPut(w
83f0: 2c 78 2c 79 2c 7a 2c 72 63 29 0a 20 20 23 64 65  ,x,y,z,rc).  #de
8400: 66 69 6e 65 20 70 74 72 6d 61 70 47 65 74 28 77  fine ptrmapGet(w
8410: 2c 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f  ,x,y,z) SQLITE_O
8420: 4b 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d  K.  #define ptrm
8430: 61 70 50 75 74 4f 76 66 6c 50 74 72 28 78 2c 20  apPutOvflPtr(x, 
8440: 79 2c 20 72 63 29 0a 23 65 6e 64 69 66 0a 0a 2f  y, rc).#endif../
8450: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62 74 72  *.** Given a btr
8460: 65 65 20 70 61 67 65 20 61 6e 64 20 61 20 63 65  ee page and a ce
8470: 6c 6c 20 69 6e 64 65 78 20 28 30 20 6d 65 61 6e  ll index (0 mean
8480: 73 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c  s the first cell
8490: 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c   on.** the page,
84a0: 20 31 20 6d 65 61 6e 73 20 74 68 65 20 73 65 63   1 means the sec
84b0: 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f  ond cell, and so
84c0: 20 66 6f 72 74 68 29 20 72 65 74 75 72 6e 20 61   forth) return a
84d0: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
84e0: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e  he cell content.
84f0: 0a 2a 2a 0a 2a 2a 20 66 69 6e 64 43 65 6c 6c 50  .**.** findCellP
8500: 61 73 74 50 74 72 28 29 20 64 6f 65 73 20 74 68  astPtr() does th
8510: 65 20 73 61 6d 65 20 65 78 63 65 70 74 20 69 74  e same except it
8520: 20 73 6b 69 70 73 20 70 61 73 74 20 74 68 65 20   skips past the 
8530: 69 6e 69 74 69 61 6c 0a 2a 2a 20 34 2d 62 79 74  initial.** 4-byt
8540: 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20  e child pointer 
8550: 66 6f 75 6e 64 20 6f 6e 20 69 6e 74 65 72 69 6f  found on interio
8560: 72 20 70 61 67 65 73 2c 20 69 66 20 74 68 65 72  r pages, if ther
8570: 65 20 69 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20  e is one..**.** 
8580: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72  This routine wor
8590: 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65  ks only for page
85a0: 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f  s that do not co
85b0: 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63  ntain overflow c
85c0: 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ells..*/.#define
85d0: 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c   findCell(P,I) \
85e0: 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61 20 2b  .  ((P)->aData +
85f0: 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20   ((P)->maskPage 
8600: 26 20 67 65 74 32 62 79 74 65 41 6c 69 67 6e 65  & get2byteAligne
8610: 64 28 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78  d(&(P)->aCellIdx
8620: 5b 32 2a 28 49 29 5d 29 29 29 0a 23 64 65 66 69  [2*(I)]))).#defi
8630: 6e 65 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50  ne findCellPastP
8640: 74 72 28 50 2c 49 29 20 5c 0a 20 20 28 28 50 29  tr(P,I) \.  ((P)
8650: 2d 3e 61 44 61 74 61 4f 66 73 74 20 2b 20 28 28  ->aDataOfst + ((
8660: 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67  P)->maskPage & g
8670: 65 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28 26  et2byteAligned(&
8680: 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a  (P)->aCellIdx[2*
8690: 28 49 29 5d 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a 20  (I)]))).../*.** 
86a0: 54 68 69 73 20 69 73 20 63 6f 6d 6d 6f 6e 20 74  This is common t
86b0: 61 69 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 66  ail processing f
86c0: 6f 72 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  or btreeParseCel
86d0: 6c 50 74 72 28 29 20 61 6e 64 0a 2a 2a 20 62 74  lPtr() and.** bt
86e0: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49  reeParseCellPtrI
86f0: 6e 64 65 78 28 29 20 66 6f 72 20 74 68 65 20 63  ndex() for the c
8700: 61 73 65 20 77 68 65 6e 20 74 68 65 20 63 65 6c  ase when the cel
8710: 6c 20 64 6f 65 73 20 6e 6f 74 20 66 69 74 20 65  l does not fit e
8720: 6e 74 69 72 65 6c 79 0a 2a 2a 20 6f 6e 20 61 20  ntirely.** on a 
8730: 73 69 6e 67 6c 65 20 42 2d 74 72 65 65 20 70 61  single B-tree pa
8740: 67 65 2e 20 20 4d 61 6b 65 20 6e 65 63 65 73 73  ge.  Make necess
8750: 61 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 73 20  ary adjustments 
8760: 74 6f 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 0a  to the CellInfo.
8770: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  ** structure..*/
8780: 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
8790: 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 62 74 72  OINLINE void btr
87a0: 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75 73  eeParseCellAdjus
87b0: 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77  tSizeForOverflow
87c0: 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
87d0: 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ge,         /* P
87e0: 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
87f0: 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  he cell */.  u8 
8800: 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
8810: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
8820: 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74  to the cell text
8830: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
8840: 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f  *pInfo         /
8850: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73  * Fill in this s
8860: 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20  tructure */.){. 
8870: 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79 6c 6f   /* If the paylo
8880: 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20  ad will not fit 
8890: 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68  completely on th
88a0: 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77 65  e local page, we
88b0: 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64 65   have.  ** to de
88c0: 63 69 64 65 20 68 6f 77 20 6d 75 63 68 20 74 6f  cide how much to
88d0: 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61   store locally a
88e0: 6e 64 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73  nd how much to s
88f0: 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20 2a 2a 20 6f  pill onto.  ** o
8900: 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 20  verflow pages.  
8910: 54 68 65 20 73 74 72 61 74 65 67 79 20 69 73 20  The strategy is 
8920: 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20  to minimize the 
8930: 61 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65 64  amount of unused
8940: 0a 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f  .  ** space on o
8950: 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77 68  verflow pages wh
8960: 69 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65 20  ile keeping the 
8970: 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20  amount of local 
8980: 73 74 6f 72 61 67 65 0a 20 20 2a 2a 20 69 6e 20  storage.  ** in 
8990: 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c  between minLocal
89a0: 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20   and maxLocal.. 
89b0: 20 2a 2a 0a 20 20 2a 2a 20 57 61 72 6e 69 6e 67   **.  ** Warning
89c0: 3a 20 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  :  changing the 
89d0: 77 61 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 79  way overflow pay
89e0: 6c 6f 61 64 20 69 73 20 64 69 73 74 72 69 62 75  load is distribu
89f0: 74 65 64 20 69 6e 20 61 6e 79 0a 20 20 2a 2a 20  ted in any.  ** 
8a00: 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74 20  way will result 
8a10: 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62  in an incompatib
8a20: 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a  le file format..
8a30: 20 20 2a 2f 0a 20 20 69 6e 74 20 6d 69 6e 4c 6f    */.  int minLo
8a40: 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d  cal;  /* Minimum
8a50: 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f   amount of paylo
8a60: 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20  ad held locally 
8a70: 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61  */.  int maxLoca
8a80: 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61  l;  /* Maximum a
8a90: 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64  mount of payload
8aa0: 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f   held locally */
8ab0: 0a 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b 20  .  int surplus; 
8ac0: 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61    /* Overflow pa
8ad0: 79 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65 20  yload available 
8ae0: 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67  for local storag
8af0: 65 20 2a 2f 0a 0a 20 20 6d 69 6e 4c 6f 63 61 6c  e */..  minLocal
8b00: 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63   = pPage->minLoc
8b10: 61 6c 3b 0a 20 20 6d 61 78 4c 6f 63 61 6c 20 3d  al;.  maxLocal =
8b20: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
8b30: 3b 0a 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69  ;.  surplus = mi
8b40: 6e 4c 6f 63 61 6c 20 2b 20 28 70 49 6e 66 6f 2d  nLocal + (pInfo-
8b50: 3e 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c  >nPayload - minL
8b60: 6f 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70 42  ocal)%(pPage->pB
8b70: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 29  t->usableSize-4)
8b80: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 75  ;.  testcase( su
8b90: 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20  rplus==maxLocal 
8ba0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  );.  testcase( s
8bb0: 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c  urplus==maxLocal
8bc0: 2b 31 20 29 3b 0a 20 20 69 66 28 20 73 75 72 70  +1 );.  if( surp
8bd0: 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20  lus <= maxLocal 
8be0: 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  ){.    pInfo->nL
8bf0: 6f 63 61 6c 20 3d 20 28 75 31 36 29 73 75 72 70  ocal = (u16)surp
8c00: 6c 75 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  lus;.  }else{.  
8c10: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
8c20: 3d 20 28 75 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b  = (u16)minLocal;
8c30: 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53  .  }.  pInfo->nS
8c40: 69 7a 65 20 3d 20 28 75 31 36 29 28 26 70 49 6e  ize = (u16)(&pIn
8c50: 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 5b 70 49 6e  fo->pPayload[pIn
8c60: 66 6f 2d 3e 6e 4c 6f 63 61 6c 5d 20 2d 20 70 43  fo->nLocal] - pC
8c70: 65 6c 6c 29 20 2b 20 34 3b 0a 7d 0a 0a 2f 2a 0a  ell) + 4;.}../*.
8c80: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
8c90: 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 69 6d   routines are im
8ca0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66  plementations of
8cb0: 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 78 50 61   the MemPage.xPa
8cc0: 72 73 65 43 65 6c 6c 28 29 0a 2a 2a 20 6d 65 74  rseCell().** met
8cd0: 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 73 65  hod..**.** Parse
8ce0: 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20   a cell content 
8cf0: 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69  block and fill i
8d00: 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73  n the CellInfo s
8d10: 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20  tructure..**.** 
8d20: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
8d30: 72 28 29 20 20 20 20 20 20 20 20 3d 3e 20 20 20  r()        =>   
8d40: 74 61 62 6c 65 20 62 74 72 65 65 20 6c 65 61 66  table btree leaf
8d50: 20 6e 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65 50   nodes.** btreeP
8d60: 61 72 73 65 43 65 6c 6c 4e 6f 50 61 79 6c 6f 61  arseCellNoPayloa
8d70: 64 28 29 20 20 3d 3e 20 20 20 74 61 62 6c 65 20  d()  =>   table 
8d80: 62 74 72 65 65 20 69 6e 74 65 72 6e 61 6c 20 6e  btree internal n
8d90: 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65 50 61 72  odes.** btreePar
8da0: 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28 29  seCellPtrIndex()
8db0: 20 20 20 3d 3e 20 20 20 69 6e 64 65 78 20 62 74     =>   index bt
8dc0: 72 65 65 20 6e 6f 64 65 73 0a 2a 2a 0a 2a 2a 20  ree nodes.**.** 
8dd0: 54 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61 20  There is also a 
8de0: 77 72 61 70 70 65 72 20 66 75 6e 63 74 69 6f 6e  wrapper function
8df0: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
8e00: 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f 72  ) that works for
8e10: 0a 2a 2a 20 61 6c 6c 20 4d 65 6d 50 61 67 65 20  .** all MemPage 
8e20: 74 79 70 65 73 20 61 6e 64 20 74 68 61 74 20 72  types and that r
8e30: 65 66 65 72 65 6e 63 65 73 20 74 68 65 20 63 65  eferences the ce
8e40: 6c 6c 20 62 79 20 69 6e 64 65 78 20 72 61 74 68  ll by index rath
8e50: 65 72 20 74 68 61 6e 0a 2a 2a 20 62 79 20 70 6f  er than.** by po
8e60: 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  inter..*/.static
8e70: 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65   void btreeParse
8e80: 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61 64  CellPtrNoPayload
8e90: 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
8ea0: 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ge,         /* P
8eb0: 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
8ec0: 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  he cell */.  u8 
8ed0: 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
8ee0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
8ef0: 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74  to the cell text
8f00: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
8f10: 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f  *pInfo         /
8f20: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73  * Fill in this s
8f30: 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20  tructure */.){. 
8f40: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
8f50: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
8f60: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
8f70: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
8f80: 65 2d 3e 6c 65 61 66 3d 3d 30 20 29 3b 0a 20 20  e->leaf==0 );.  
8f90: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63  assert( pPage->c
8fa0: 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20 29  hildPtrSize==4 )
8fb0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
8fc0: 5f 44 45 42 55 47 0a 20 20 55 4e 55 53 45 44 5f  _DEBUG.  UNUSED_
8fd0: 50 41 52 41 4d 45 54 45 52 28 70 50 61 67 65 29  PARAMETER(pPage)
8fe0: 3b 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e 66 6f  ;.#endif.  pInfo
8ff0: 2d 3e 6e 53 69 7a 65 20 3d 20 34 20 2b 20 67 65  ->nSize = 4 + ge
9000: 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34  tVarint(&pCell[4
9010: 5d 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d  ], (u64*)&pInfo-
9020: 3e 6e 4b 65 79 29 3b 0a 20 20 70 49 6e 66 6f 2d  >nKey);.  pInfo-
9030: 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20  >nPayload = 0;. 
9040: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
9050: 20 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61   0;.  pInfo->pPa
9060: 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 72 65 74  yload = 0;.  ret
9070: 75 72 6e 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  urn;.}.static vo
9080: 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  id btreeParseCel
9090: 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67 65 20  lPtr(.  MemPage 
90a0: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
90b0: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
90c0: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
90d0: 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
90e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
90f0: 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  ter to the cell 
9100: 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  text. */.  CellI
9110: 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20  nfo *pInfo      
9120: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68     /* Fill in th
9130: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
9140: 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 3b 20  ){.  u8 *pIter; 
9150: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9160: 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 68 72  For scanning thr
9170: 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  ough pCell */.  
9180: 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20  u32 nPayload;   
9190: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
91a0: 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65  r of bytes of ce
91b0: 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20  ll payload */.  
91c0: 75 36 34 20 69 4b 65 79 3b 20 20 20 20 20 20 20  u64 iKey;       
91d0: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
91e0: 63 74 65 64 20 4b 65 79 20 76 61 6c 75 65 20 2a  cted Key value *
91f0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
9200: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
9210: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
9220: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
9230: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c  pPage->leaf==0 |
9240: 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31  | pPage->leaf==1
9250: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
9260: 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20  age->intKeyLeaf 
9270: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
9280: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
9290: 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65 72 20 3d  ==0 );.  pIter =
92a0: 20 70 43 65 6c 6c 3b 0a 0a 20 20 2f 2a 20 54 68   pCell;..  /* Th
92b0: 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20  e next block of 
92c0: 63 6f 64 65 20 69 73 20 65 71 75 69 76 61 6c 65  code is equivale
92d0: 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  nt to:.  **.  **
92e0: 20 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65       pIter += ge
92f0: 74 56 61 72 69 6e 74 33 32 28 70 49 74 65 72 2c  tVarint32(pIter,
9300: 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 2a 2a   nPayload);.  **
9310: 0a 20 20 2a 2a 20 54 68 65 20 63 6f 64 65 20 69  .  ** The code i
9320: 73 20 69 6e 6c 69 6e 65 64 20 74 6f 20 61 76 6f  s inlined to avo
9330: 69 64 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61  id a function ca
9340: 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 6e 50 61 79 6c  ll..  */.  nPayl
9350: 6f 61 64 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20  oad = *pIter;.  
9360: 69 66 28 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78  if( nPayload>=0x
9370: 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45  80 ){.    u8 *pE
9380: 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a  nd = &pIter[8];.
9390: 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20      nPayload &= 
93a0: 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20  0x7f;.    do{.  
93b0: 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28      nPayload = (
93c0: 6e 50 61 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28  nPayload<<7) | (
93d0: 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29  *++pIter & 0x7f)
93e0: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2a  ;.    }while( (*
93f0: 70 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20  pIter)>=0x80 && 
9400: 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20  pIter<pEnd );.  
9410: 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20  }.  pIter++;..  
9420: 2f 2a 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63  /* The next bloc
9430: 6b 20 6f 66 20 63 6f 64 65 20 69 73 20 65 71 75  k of code is equ
9440: 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a  ivalent to:.  **
9450: 0a 20 20 2a 2a 20 20 20 20 20 70 49 74 65 72 20  .  **     pIter 
9460: 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 70 49 74  += getVarint(pIt
9470: 65 72 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f  er, (u64*)&pInfo
9480: 2d 3e 6e 4b 65 79 29 3b 0a 20 20 2a 2a 0a 20 20  ->nKey);.  **.  
9490: 2a 2a 20 54 68 65 20 63 6f 64 65 20 69 73 20 69  ** The code is i
94a0: 6e 6c 69 6e 65 64 20 74 6f 20 61 76 6f 69 64 20  nlined to avoid 
94b0: 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e  a function call.
94c0: 0a 20 20 2a 2f 0a 20 20 69 4b 65 79 20 3d 20 2a  .  */.  iKey = *
94d0: 70 49 74 65 72 3b 0a 20 20 69 66 28 20 69 4b 65  pIter;.  if( iKe
94e0: 79 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 75  y>=0x80 ){.    u
94f0: 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65 72  8 *pEnd = &pIter
9500: 5b 37 5d 3b 0a 20 20 20 20 69 4b 65 79 20 26 3d  [7];.    iKey &=
9510: 20 30 78 37 66 3b 0a 20 20 20 20 77 68 69 6c 65   0x7f;.    while
9520: 28 31 29 7b 0a 20 20 20 20 20 20 69 4b 65 79 20  (1){.      iKey 
9530: 3d 20 28 69 4b 65 79 3c 3c 37 29 20 7c 20 28 2a  = (iKey<<7) | (*
9540: 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b  ++pIter & 0x7f);
9550: 0a 20 20 20 20 20 20 69 66 28 20 28 2a 70 49 74  .      if( (*pIt
9560: 65 72 29 3c 30 78 38 30 20 29 20 62 72 65 61 6b  er)<0x80 ) break
9570: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ;.      if( pIte
9580: 72 3e 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20 20  r>=pEnd ){.     
9590: 20 20 20 69 4b 65 79 20 3d 20 28 69 4b 65 79 3c     iKey = (iKey<
95a0: 3c 38 29 20 7c 20 2a 2b 2b 70 49 74 65 72 3b 0a  <8) | *++pIter;.
95b0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
95c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
95d0: 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20 70  .  pIter++;..  p
95e0: 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 2a 28 69  Info->nKey = *(i
95f0: 36 34 2a 29 26 69 4b 65 79 3b 0a 20 20 70 49 6e  64*)&iKey;.  pIn
9600: 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e  fo->nPayload = n
9610: 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f  Payload;.  pInfo
9620: 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70 49 74  ->pPayload = pIt
9630: 65 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  er;.  testcase( 
9640: 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d  nPayload==pPage-
9650: 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74  >maxLocal );.  t
9660: 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61  estcase( nPayloa
9670: 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d==pPage->maxLoc
9680: 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 50  al+1 );.  if( nP
9690: 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d  ayload<=pPage->m
96a0: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f  axLocal ){.    /
96b0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65  * This is the (e
96c0: 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65  asy) common case
96d0: 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72   where the entir
96e0: 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20  e payload fits. 
96f0: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63     ** on the loc
9700: 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65  al page.  No ove
9710: 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65  rflow is require
9720: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  d..    */.    pI
9730: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50 61  nfo->nSize = nPa
9740: 79 6c 6f 61 64 20 2b 20 28 75 31 36 29 28 70 49  yload + (u16)(pI
9750: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
9760: 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53 69    if( pInfo->nSi
9770: 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53  ze<4 ) pInfo->nS
9780: 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e  ize = 4;.    pIn
9790: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
97a0: 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65  6)nPayload;.  }e
97b0: 6c 73 65 7b 0a 20 20 20 20 62 74 72 65 65 50 61  lse{.    btreePa
97c0: 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a  rseCellAdjustSiz
97d0: 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50 61  eForOverflow(pPa
97e0: 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f  ge, pCell, pInfo
97f0: 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
9800: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
9810: 65 6c 6c 50 74 72 49 6e 64 65 78 28 0a 20 20 4d  ellPtrIndex(.  M
9820: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
9830: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
9840: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65  ontaining the ce
9850: 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  ll */.  u8 *pCel
9860: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
9870: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
9880: 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a  e cell text. */.
9890: 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66    CellInfo *pInf
98a0: 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  o         /* Fil
98b0: 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  l in this struct
98c0: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a  ure */.){.  u8 *
98d0: 70 49 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  pIter;          
98e0: 20 20 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e      /* For scann
98f0: 69 6e 67 20 74 68 72 6f 75 67 68 20 70 43 65 6c  ing through pCel
9900: 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c  l */.  u32 nPayl
9910: 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f  oad;           /
9920: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
9930: 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61  s of cell payloa
9940: 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
9950: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
9960: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
9970: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
9980: 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  t( pPage->leaf==
9990: 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66  0 || pPage->leaf
99a0: 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
99b0: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65   pPage->intKeyLe
99c0: 61 66 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65 72  af==0 );.  pIter
99d0: 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67 65   = pCell + pPage
99e0: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
99f0: 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49    nPayload = *pI
9a00: 74 65 72 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c  ter;.  if( nPayl
9a10: 6f 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20  oad>=0x80 ){.   
9a20: 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74   u8 *pEnd = &pIt
9a30: 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c  er[8];.    nPayl
9a40: 6f 61 64 20 26 3d 20 30 78 37 66 3b 0a 20 20 20  oad &= 0x7f;.   
9a50: 20 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c   do{.      nPayl
9a60: 6f 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c  oad = (nPayload<
9a70: 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20  <7) | (*++pIter 
9a80: 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68  & 0x7f);.    }wh
9a90: 69 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d 30  ile( *(pIter)>=0
9aa0: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
9ab0: 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72  d );.  }.  pIter
9ac0: 2b 2b 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65  ++;.  pInfo->nKe
9ad0: 79 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  y = nPayload;.  
9ae0: 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20  pInfo->nPayload 
9af0: 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49  = nPayload;.  pI
9b00: 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20  nfo->pPayload = 
9b10: 70 49 74 65 72 3b 0a 20 20 74 65 73 74 63 61 73  pIter;.  testcas
9b20: 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61  e( nPayload==pPa
9b30: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  ge->maxLocal );.
9b40: 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79    testcase( nPay
9b50: 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  load==pPage->max
9b60: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28  Local+1 );.  if(
9b70: 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65   nPayload<=pPage
9b80: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20  ->maxLocal ){.  
9b90: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
9ba0: 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63   (easy) common c
9bb0: 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65 6e  ase where the en
9bc0: 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74  tire payload fit
9bd0: 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20  s.    ** on the 
9be0: 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20  local page.  No 
9bf0: 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75  overflow is requ
9c00: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
9c10: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20   pInfo->nSize = 
9c20: 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75 31 36 29  nPayload + (u16)
9c30: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b  (pIter - pCell);
9c40: 0a 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e  .    if( pInfo->
9c50: 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d  nSize<4 ) pInfo-
9c60: 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20  >nSize = 4;.    
9c70: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
9c80: 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20  (u16)nPayload;. 
9c90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 74 72 65   }else{.    btre
9ca0: 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75 73 74  eParseCellAdjust
9cb0: 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28  SizeForOverflow(
9cc0: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49  pPage, pCell, pI
9cd0: 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  nfo);.  }.}.stat
9ce0: 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72  ic void btreePar
9cf0: 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  seCell(.  MemPag
9d00: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
9d10: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
9d20: 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ning the cell */
9d30: 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20  .  int iCell,   
9d40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
9d50: 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46  e cell index.  F
9d60: 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20 2a  irst cell is 0 *
9d70: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
9d80: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
9d90: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
9da0: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 50  cture */.){.  pP
9db0: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
9dc0: 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28  pPage, findCell(
9dd0: 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 2c 20 70  pPage, iCell), p
9de0: 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Info);.}../*.** 
9df0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  The following ro
9e00: 75 74 69 6e 65 73 20 61 72 65 20 69 6d 70 6c 65  utines are imple
9e10: 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68  mentations of th
9e20: 65 20 4d 65 6d 50 61 67 65 2e 78 43 65 6c 6c 53  e MemPage.xCellS
9e30: 69 7a 65 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a  ize.** method..*
9e40: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
9e50: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
9e60: 20 62 79 74 65 73 20 74 68 61 74 20 61 20 43 65   bytes that a Ce
9e70: 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65 20  ll needs in the 
9e80: 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65  cell.** data are
9e90: 61 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d 70  a of the btree-p
9ea0: 61 67 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e  age.  The return
9eb0: 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65 73   number includes
9ec0: 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74   the cell.** dat
9ed0: 61 20 68 65 61 64 65 72 20 61 6e 64 20 74 68 65  a header and the
9ee0: 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20   local payload, 
9ef0: 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72  but not any over
9f00: 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20  flow page or.** 
9f10: 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20 62  the space used b
9f20: 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  y the cell point
9f30: 65 72 2e 0a 2a 2a 0a 2a 2a 20 63 65 6c 6c 53 69  er..**.** cellSi
9f40: 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 29  zePtrNoPayload()
9f50: 20 20 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 69      =>   table i
9f60: 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a  nternal nodes.**
9f70: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 29 20 20   cellSizePtr()  
9f80: 20 20 20 20 20 20 20 20 20 20 20 3d 3e 20 20 20             =>   
9f90: 61 6c 6c 20 69 6e 64 65 78 20 6e 6f 64 65 73 20  all index nodes 
9fa0: 26 20 74 61 62 6c 65 20 6c 65 61 66 20 6e 6f 64  & table leaf nod
9fb0: 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36  es.*/.static u16
9fc0: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d   cellSizePtr(Mem
9fd0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20  Page *pPage, u8 
9fe0: 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70  *pCell){.  u8 *p
9ff0: 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70  Iter = pCell + p
a000: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
a010: 7a 65 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69  ze; /* For loopi
a020: 6e 67 20 6f 76 65 72 20 62 79 74 65 73 20 6f 66  ng over bytes of
a030: 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a   pCell */.  u8 *
a040: 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  pEnd;           
a050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a060: 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b       /* End mark
a070: 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20 2a 2f   for a varint */
a080: 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b 20 20 20  .  u32 nSize;   
a090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
a0b0: 69 7a 65 20 76 61 6c 75 65 20 74 6f 20 72 65 74  ize value to ret
a0c0: 75 72 6e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  urn */..#ifdef S
a0d0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
a0e0: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
a0f0: 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ned by this func
a100: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61  tion should alwa
a110: 79 73 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  ys be the same a
a120: 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c  s.  ** the (Cell
a130: 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75  Info.nSize) valu
a140: 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67  e found by doing
a150: 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f 66   a full parse of
a160: 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20   the.  ** cell. 
a170: 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  If SQLITE_DEBUG 
a180: 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61  is defined, an a
a190: 73 73 65 72 74 28 29 20 61 74 20 74 68 65 20 62  ssert() at the b
a1a0: 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68  ottom of.  ** th
a1b0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72 69  is function veri
a1c0: 66 69 65 73 20 74 68 61 74 20 74 68 69 73 20 69  fies that this i
a1d0: 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74 20  nvariant is not 
a1e0: 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43  violated. */.  C
a1f0: 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e 66  ellInfo debuginf
a200: 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72  o;.  pPage->xPar
a210: 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  seCell(pPage, pC
a220: 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f 29  ell, &debuginfo)
a230: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 6e 53 69 7a  ;.#endif..  nSiz
a240: 65 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66  e = *pIter;.  if
a250: 28 20 6e 53 69 7a 65 3e 3d 30 78 38 30 20 29 7b  ( nSize>=0x80 ){
a260: 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74  .    pEnd = &pIt
a270: 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 53 69 7a 65  er[8];.    nSize
a280: 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64 6f   &= 0x7f;.    do
a290: 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20  {.      nSize = 
a2a0: 28 6e 53 69 7a 65 3c 3c 37 29 20 7c 20 28 2a 2b  (nSize<<7) | (*+
a2b0: 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a  +pIter & 0x7f);.
a2c0: 20 20 20 20 7d 77 68 69 6c 65 28 20 2a 28 70 49      }while( *(pI
a2d0: 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70 49  ter)>=0x80 && pI
a2e0: 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a  ter<pEnd );.  }.
a2f0: 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20 69 66 28    pIter++;.  if(
a300: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
a310: 7b 0a 20 20 20 20 2f 2a 20 70 49 74 65 72 20 6e  {.    /* pIter n
a320: 6f 77 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65  ow points at the
a330: 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20   64-bit integer 
a340: 6b 65 79 20 76 61 6c 75 65 2c 20 61 20 76 61 72  key value, a var
a350: 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20 20  iable length .  
a360: 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54 68    ** integer. Th
a370: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63  e following bloc
a380: 6b 20 6d 6f 76 65 73 20 70 49 74 65 72 20 74 6f  k moves pIter to
a390: 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 66 69   point at the fi
a3a0: 72 73 74 20 62 79 74 65 0a 20 20 20 20 2a 2a 20  rst byte.    ** 
a3b0: 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
a3c0: 74 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20 2a  the key value. *
a3d0: 2f 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49  /.    pEnd = &pI
a3e0: 74 65 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c  ter[9];.    whil
a3f0: 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30 78  e( (*pIter++)&0x
a400: 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64  80 && pIter<pEnd
a410: 20 29 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63 61   );.  }.  testca
a420: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
a430: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
a440: 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d  testcase( nSize=
a450: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
a460: 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 53 69 7a  +1 );.  if( nSiz
a470: 65 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e<=pPage->maxLoc
a480: 61 6c 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20  al ){.    nSize 
a490: 2b 3d 20 28 75 33 32 29 28 70 49 74 65 72 20 2d  += (u32)(pIter -
a4a0: 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28   pCell);.    if(
a4b0: 20 6e 53 69 7a 65 3c 34 20 29 20 6e 53 69 7a 65   nSize<4 ) nSize
a4c0: 20 3d 20 34 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 4;.  }else{. 
a4d0: 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20     int minLocal 
a4e0: 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61  = pPage->minLoca
a4f0: 6c 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d  l;.    nSize = m
a500: 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a 65  inLocal + (nSize
a510: 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20 28   - minLocal) % (
a520: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
a530: 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20  leSize - 4);.   
a540: 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65   testcase( nSize
a550: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
a560: 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  l );.    testcas
a570: 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d  e( nSize==pPage-
a580: 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
a590: 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50 61     if( nSize>pPa
a5a0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a  ge->maxLocal ){.
a5b0: 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69        nSize = mi
a5c0: 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20  nLocal;.    }.  
a5d0: 20 20 6e 53 69 7a 65 20 2b 3d 20 34 20 2b 20 28    nSize += 4 + (
a5e0: 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65  u16)(pIter - pCe
a5f0: 6c 6c 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ll);.  }.  asser
a600: 74 28 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67 69  t( nSize==debugi
a610: 6e 66 6f 2e 6e 53 69 7a 65 20 7c 7c 20 43 4f 52  nfo.nSize || COR
a620: 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 72 65 74  RUPT_DB );.  ret
a630: 75 72 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a  urn (u16)nSize;.
a640: 7d 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c  }.static u16 cel
a650: 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61  lSizePtrNoPayloa
a660: 64 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  d(MemPage *pPage
a670: 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20  , u8 *pCell){.  
a680: 75 38 20 2a 70 49 74 65 72 20 3d 20 70 43 65 6c  u8 *pIter = pCel
a690: 6c 20 2b 20 34 3b 20 2f 2a 20 46 6f 72 20 6c 6f  l + 4; /* For lo
a6a0: 6f 70 69 6e 67 20 6f 76 65 72 20 62 79 74 65 73  oping over bytes
a6b0: 20 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75   of pCell */.  u
a6c0: 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20 20  8 *pEnd;        
a6d0: 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61 72        /* End mar
a6e0: 6b 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20 2a  k for a varint *
a6f0: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
a700: 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20  _DEBUG.  /* The 
a710: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
a720: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  y this function 
a730: 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65  should always be
a740: 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a   the same as.  *
a750: 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e  * the (CellInfo.
a760: 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75  nSize) value fou
a770: 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75  nd by doing a fu
a780: 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a  ll parse of the.
a790: 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51    ** cell. If SQ
a7a0: 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65  LITE_DEBUG is de
a7b0: 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74  fined, an assert
a7c0: 28 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d  () at the bottom
a7d0: 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75   of.  ** this fu
a7e0: 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20  nction verifies 
a7f0: 74 68 61 74 20 74 68 69 73 20 69 6e 76 61 72 69  that this invari
a800: 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61  ant is not viola
a810: 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  ted. */.  CellIn
a820: 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20  fo debuginfo;.  
a830: 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
a840: 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  l(pPage, pCell, 
a850: 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6c  &debuginfo);.#el
a860: 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  se.  UNUSED_PARA
a870: 4d 45 54 45 52 28 70 50 61 67 65 29 3b 0a 23 65  METER(pPage);.#e
a880: 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
a890: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
a8a0: 69 7a 65 3d 3d 34 20 29 3b 0a 20 20 70 45 6e 64  ize==4 );.  pEnd
a8b0: 20 3d 20 70 49 74 65 72 20 2b 20 39 3b 0a 20 20   = pIter + 9;.  
a8c0: 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b  while( (*pIter++
a8d0: 29 26 30 78 38 30 20 26 26 20 70 49 74 65 72 3c  )&0x80 && pIter<
a8e0: 70 45 6e 64 20 29 3b 0a 20 20 61 73 73 65 72 74  pEnd );.  assert
a8f0: 28 20 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a  ( debuginfo.nSiz
a900: 65 3d 3d 28 75 31 36 29 28 70 49 74 65 72 20 2d  e==(u16)(pIter -
a910: 20 70 43 65 6c 6c 29 20 7c 7c 20 43 4f 52 52 55   pCell) || CORRU
a920: 50 54 5f 44 42 20 29 3b 0a 20 20 72 65 74 75 72  PT_DB );.  retur
a930: 6e 20 28 75 31 36 29 28 70 49 74 65 72 20 2d 20  n (u16)(pIter - 
a940: 70 43 65 6c 6c 29 3b 0a 7d 0a 0a 0a 23 69 66 64  pCell);.}...#ifd
a950: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
a960: 2f 2a 20 54 68 69 73 20 76 61 72 69 61 74 69 6f  /* This variatio
a970: 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72  n on cellSizePtr
a980: 28 29 20 69 73 20 75 73 65 64 20 69 6e 73 69 64  () is used insid
a990: 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  e of assert() st
a9a0: 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79  atements.** only
a9b0: 2e 20 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20  . */.static u16 
a9c0: 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65  cellSize(MemPage
a9d0: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65   *pPage, int iCe
a9e0: 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  ll){.  return pP
a9f0: 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70  age->xCellSize(p
aa00: 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70  Page, findCell(p
aa10: 50 61 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d  Page, iCell));.}
aa20: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
aa30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
aa40: 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66  OVACUUM./*.** If
aa50: 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c   the cell pCell,
aa60: 20 70 61 72 74 20 6f 66 20 70 61 67 65 20 70 50   part of page pP
aa70: 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  age contains a p
aa80: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20  ointer.** to an 
aa90: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69  overflow page, i
aaa0: 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69  nsert an entry i
aab0: 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  nto the pointer-
aac0: 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f  map.** for the o
aad0: 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f  verflow page..*/
aae0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 74 72  .static void ptr
aaf0: 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65  mapPutOvflPtr(Me
ab00: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
ab10: 20 2a 70 43 65 6c 6c 2c 20 69 6e 74 20 2a 70 52   *pCell, int *pR
ab20: 43 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  C){.  CellInfo i
ab30: 6e 66 6f 3b 0a 20 20 69 66 28 20 2a 70 52 43 20  nfo;.  if( *pRC 
ab40: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
ab50: 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a  rt( pCell!=0 );.
ab60: 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
ab70: 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
ab80: 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20  , &info);.  if( 
ab90: 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f  info.nLocal<info
aba0: 2e 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20  .nPayload ){.   
abb0: 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74   Pgno ovfl = get
abc0: 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
abd0: 6f 2e 6e 53 69 7a 65 2d 34 5d 29 3b 0a 20 20 20  o.nSize-4]);.   
abe0: 20 70 74 72 6d 61 70 50 75 74 28 70 50 61 67 65   ptrmapPut(pPage
abf0: 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52  ->pBt, ovfl, PTR
ac00: 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70  MAP_OVERFLOW1, p
ac10: 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 52 43 29  Page->pgno, pRC)
ac20: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
ac30: 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e  ./*.** Defragmen
ac40: 74 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e  t the page given
ac50: 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  . This routine r
ac60: 65 6f 72 67 61 6e 69 7a 65 73 20 63 65 6c 6c 73  eorganizes cells
ac70: 20 77 69 74 68 69 6e 20 74 68 65 0a 2a 2a 20 70   within the.** p
ac80: 61 67 65 20 73 6f 20 74 68 61 74 20 74 68 65 72  age so that ther
ac90: 65 20 61 72 65 20 6e 6f 20 66 72 65 65 2d 62 6c  e are no free-bl
aca0: 6f 63 6b 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ocks on the free
acb0: 2d 62 6c 6f 63 6b 20 6c 69 73 74 2e 0a 2a 2a 0a  -block list..**.
acc0: 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6e 4d 61  ** Parameter nMa
acd0: 78 46 72 61 67 20 69 73 20 74 68 65 20 6d 61 78  xFrag is the max
ace0: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 66  imum amount of f
acf0: 72 61 67 6d 65 6e 74 65 64 20 73 70 61 63 65 20  ragmented space 
ad00: 74 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a 20 70  that may be.** p
ad10: 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 70 61  resent in the pa
ad20: 67 65 20 61 66 74 65 72 20 74 68 69 73 20 72 6f  ge after this ro
ad30: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2e 0a 2a  utine returns..*
ad40: 2a 0a 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46  *.** EVIDENCE-OF
ad50: 3a 20 52 2d 34 34 35 38 32 2d 36 30 31 33 38 20  : R-44582-60138 
ad60: 53 51 4c 69 74 65 20 6d 61 79 20 66 72 6f 6d 20  SQLite may from 
ad70: 74 69 6d 65 20 74 6f 20 74 69 6d 65 20 72 65 6f  time to time reo
ad80: 72 67 61 6e 69 7a 65 20 61 0a 2a 2a 20 62 2d 74  rganize a.** b-t
ad90: 72 65 65 20 70 61 67 65 20 73 6f 20 74 68 61 74  ree page so that
ada0: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 66 72   there are no fr
adb0: 65 65 62 6c 6f 63 6b 73 20 6f 72 20 66 72 61 67  eeblocks or frag
adc0: 6d 65 6e 74 20 62 79 74 65 73 2c 20 61 6c 6c 0a  ment bytes, all.
add0: 2a 2a 20 75 6e 75 73 65 64 20 62 79 74 65 73 20  ** unused bytes 
ade0: 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  are contained in
adf0: 20 74 68 65 20 75 6e 61 6c 6c 6f 63 61 74 65 64   the unallocated
ae00: 20 73 70 61 63 65 20 72 65 67 69 6f 6e 2c 20 61   space region, a
ae10: 6e 64 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c 73 20  nd all.** cells 
ae20: 61 72 65 20 70 61 63 6b 65 64 20 74 69 67 68 74  are packed tight
ae30: 6c 79 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ly at the end of
ae40: 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74   the page..*/.st
ae50: 61 74 69 63 20 69 6e 74 20 64 65 66 72 61 67 6d  atic int defragm
ae60: 65 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20  entPage(MemPage 
ae70: 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e 4d 61 78  *pPage, int nMax
ae80: 46 72 61 67 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Frag){.  int i; 
ae90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aea0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
aeb0: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b  ter */.  int pc;
aec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aed0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
aee0: 66 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20  f the i-th cell 
aef0: 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
af00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af10: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65  /* Offset to the
af20: 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a   page header */.
af30: 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20    int size;     
af40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
af50: 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a  Size of a cell *
af60: 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69  /.  int usableSi
af70: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ze;            /
af80: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62  * Number of usab
af90: 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61  le bytes on a pa
afa0: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c  ge */.  int cell
afb0: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
afc0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
afd0: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
afe0: 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20   array */.  int 
aff0: 63 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20  cbrk;           
b000: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
b010: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
b020: 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69  tent area */.  i
b030: 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20  nt nCell;       
b040: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
b050: 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20  ber of cells on 
b060: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e  the page */.  un
b070: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
b080: 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  a;       /* The 
b090: 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75  page data */.  u
b0a0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65  nsigned char *te
b0b0: 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d  mp;       /* Tem
b0c0: 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20  p area for cell 
b0d0: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 75 6e 73  content */.  uns
b0e0: 69 67 6e 65 64 20 63 68 61 72 20 2a 73 72 63 3b  igned char *src;
b0f0: 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63          /* Sourc
b100: 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  e of content */.
b110: 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74    int iCellFirst
b120: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
b130: 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20  First allowable 
b140: 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20  cell index */.  
b150: 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20  int iCellLast;  
b160: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
b170: 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c  st possible cell
b180: 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 61 73 73   index */..  ass
b190: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
b1a0: 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
b1b0: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
b1c0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
b1d0: 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  >pBt!=0 );.  ass
b1e0: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d  ert( pPage->pBt-
b1f0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53  >usableSize <= S
b200: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
b210: 49 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IZE );.  assert(
b220: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
b230: 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  w==0 );.  assert
b240: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
b250: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
b260: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65 6d  >mutex) );.  tem
b270: 70 20 3d 20 30 3b 0a 20 20 73 72 63 20 3d 20 64  p = 0;.  src = d
b280: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
b290: 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67  ta;.  hdr = pPag
b2a0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
b2b0: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61  cellOffset = pPa
b2c0: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a  ge->cellOffset;.
b2d0: 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d    nCell = pPage-
b2e0: 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74  >nCell;.  assert
b2f0: 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74  ( nCell==get2byt
b300: 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 20  e(&data[hdr+3]) 
b310: 29 3b 0a 20 20 69 43 65 6c 6c 46 69 72 73 74 20  );.  iCellFirst 
b320: 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  = cellOffset + 2
b330: 2a 6e 43 65 6c 6c 3b 0a 20 20 75 73 61 62 6c 65  *nCell;.  usable
b340: 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42  Size = pPage->pB
b350: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 0a  t->usableSize;..
b360: 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
b370: 68 61 6e 64 6c 65 73 20 70 61 67 65 73 20 77 69  handles pages wi
b380: 74 68 20 74 77 6f 20 6f 72 20 66 65 77 65 72 20  th two or fewer 
b390: 66 72 65 65 20 62 6c 6f 63 6b 73 20 61 6e 64 20  free blocks and 
b3a0: 6e 4d 61 78 46 72 61 67 0a 20 20 2a 2a 20 6f 72  nMaxFrag.  ** or
b3b0: 20 66 65 77 65 72 20 66 72 61 67 6d 65 6e 74 65   fewer fragmente
b3c0: 64 20 62 79 74 65 73 2e 20 49 6e 20 74 68 69 73  d bytes. In this
b3d0: 20 63 61 73 65 20 69 74 20 69 73 20 66 61 73 74   case it is fast
b3e0: 65 72 20 74 6f 20 6d 6f 76 65 20 74 68 65 0a 20  er to move the. 
b3f0: 20 2a 2a 20 74 77 6f 20 28 6f 72 20 6f 6e 65 29   ** two (or one)
b400: 20 62 6c 6f 63 6b 73 20 6f 66 20 63 65 6c 6c 73   blocks of cells
b410: 20 75 73 69 6e 67 20 6d 65 6d 6d 6f 76 65 28 29   using memmove()
b420: 20 61 6e 64 20 61 64 64 20 74 68 65 20 72 65 71   and add the req
b430: 75 69 72 65 64 0a 20 20 2a 2a 20 6f 66 66 73 65  uired.  ** offse
b440: 74 73 20 74 6f 20 65 61 63 68 20 70 6f 69 6e 74  ts to each point
b450: 65 72 20 69 6e 20 74 68 65 20 63 65 6c 6c 2d 70  er in the cell-p
b460: 6f 69 6e 74 65 72 20 61 72 72 61 79 20 74 68 61  ointer array tha
b470: 6e 20 69 74 20 69 73 20 74 6f 20 0a 20 20 2a 2a  n it is to .  **
b480: 20 72 65 63 6f 6e 73 74 72 75 63 74 20 74 68 65   reconstruct the
b490: 20 65 6e 74 69 72 65 20 70 61 67 65 2e 20 20 2a   entire page.  *
b4a0: 2f 0a 20 20 69 66 28 20 28 69 6e 74 29 64 61 74  /.  if( (int)dat
b4b0: 61 5b 68 64 72 2b 37 5d 3c 3d 6e 4d 61 78 46 72  a[hdr+7]<=nMaxFr
b4c0: 61 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 46  ag ){.    int iF
b4d0: 72 65 65 20 3d 20 67 65 74 32 62 79 74 65 28 26  ree = get2byte(&
b4e0: 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20  data[hdr+1]);.  
b4f0: 20 20 69 66 28 20 69 46 72 65 65 20 29 7b 0a 20    if( iFree ){. 
b500: 20 20 20 20 20 69 6e 74 20 69 46 72 65 65 32 20       int iFree2 
b510: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
b520: 5b 69 46 72 65 65 5d 29 3b 0a 0a 20 20 20 20 20  [iFree]);..     
b530: 20 2f 2a 20 70 61 67 65 46 69 6e 64 53 6c 6f 74   /* pageFindSlot
b540: 28 29 20 68 61 73 20 61 6c 72 65 61 64 79 20 76  () has already v
b550: 65 72 69 66 69 65 64 20 74 68 61 74 20 66 72 65  erified that fre
b560: 65 20 62 6c 6f 63 6b 73 20 61 72 65 20 73 6f 72  e blocks are sor
b570: 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20  ted.      ** in 
b580: 6f 72 64 65 72 20 6f 66 20 6f 66 66 73 65 74 20  order of offset 
b590: 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2c  within the page,
b5a0: 20 61 6e 64 20 74 68 61 74 20 6e 6f 20 62 6c 6f   and that no blo
b5b0: 63 6b 20 65 78 74 65 6e 64 73 0a 20 20 20 20 20  ck extends.     
b5c0: 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64   ** past the end
b5d0: 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 50 72   of the page. Pr
b5e0: 6f 76 69 64 65 64 20 74 68 65 20 74 77 6f 20 66  ovided the two f
b5f0: 72 65 65 20 73 6c 6f 74 73 20 64 6f 20 6e 6f 74  ree slots do not
b600: 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 6c   .      ** overl
b610: 61 70 2c 20 74 68 69 73 20 67 75 61 72 61 6e 74  ap, this guarant
b620: 65 65 73 20 74 68 61 74 20 74 68 65 20 6d 65 6d  ees that the mem
b630: 6d 6f 76 65 28 29 20 63 61 6c 6c 73 20 62 65 6c  move() calls bel
b640: 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 20 20  ow will not.    
b650: 20 20 2a 2a 20 6f 76 65 72 77 72 69 74 65 20 74    ** overwrite t
b660: 68 65 20 75 73 61 62 6c 65 53 69 7a 65 20 62 79  he usableSize by
b670: 74 65 20 62 75 66 66 65 72 2c 20 65 76 65 6e 20  te buffer, even 
b680: 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
b690: 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  page.      ** is
b6a0: 20 63 6f 72 72 75 70 74 2e 20 20 2a 2f 0a 20 20   corrupt.  */.  
b6b0: 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65      assert( iFre
b6c0: 65 32 3d 3d 30 20 7c 7c 20 69 46 72 65 65 32 3e  e2==0 || iFree2>
b6d0: 69 46 72 65 65 20 29 3b 0a 20 20 20 20 20 20 61  iFree );.      a
b6e0: 73 73 65 72 74 28 20 69 46 72 65 65 2b 67 65 74  ssert( iFree+get
b6f0: 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65  2byte(&data[iFre
b700: 65 2b 32 5d 29 20 3c 3d 20 75 73 61 62 6c 65 53  e+2]) <= usableS
b710: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ize );.      ass
b720: 65 72 74 28 20 69 46 72 65 65 32 3d 3d 30 20 7c  ert( iFree2==0 |
b730: 7c 20 69 46 72 65 65 32 2b 67 65 74 32 62 79 74  | iFree2+get2byt
b740: 65 28 26 64 61 74 61 5b 69 46 72 65 65 32 2b 32  e(&data[iFree2+2
b750: 5d 29 20 3c 3d 20 75 73 61 62 6c 65 53 69 7a 65  ]) <= usableSize
b760: 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 30   );..      if( 0
b770: 3d 3d 69 46 72 65 65 32 20 7c 7c 20 28 64 61 74  ==iFree2 || (dat
b780: 61 5b 69 46 72 65 65 32 5d 3d 3d 30 20 26 26 20  a[iFree2]==0 && 
b790: 64 61 74 61 5b 69 46 72 65 65 32 2b 31 5d 3d 3d  data[iFree2+1]==
b7a0: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38  0) ){.        u8
b7b0: 20 2a 70 45 6e 64 20 3d 20 26 64 61 74 61 5b 63   *pEnd = &data[c
b7c0: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 6e 43 65 6c  ellOffset + nCel
b7d0: 6c 2a 32 5d 3b 0a 20 20 20 20 20 20 20 20 75 38  l*2];.        u8
b7e0: 20 2a 70 41 64 64 72 3b 0a 20 20 20 20 20 20 20   *pAddr;.       
b7f0: 20 69 6e 74 20 73 7a 32 20 3d 20 30 3b 0a 20 20   int sz2 = 0;.  
b800: 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 67        int sz = g
b810: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46  et2byte(&data[iF
b820: 72 65 65 2b 32 5d 29 3b 0a 20 20 20 20 20 20 20  ree+2]);.       
b830: 20 69 6e 74 20 74 6f 70 20 3d 20 67 65 74 32 62   int top = get2b
b840: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
b850: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
b860: 46 72 65 65 32 20 29 7b 0a 20 20 20 20 20 20 20  Free2 ){.       
b870: 20 20 20 69 66 28 20 69 46 72 65 65 2b 73 7a 3e     if( iFree+sz>
b880: 69 46 72 65 65 32 20 29 20 72 65 74 75 72 6e 20  iFree2 ) return 
b890: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
b8a0: 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 73  KPT;.          s
b8b0: 7a 32 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  z2 = get2byte(&d
b8c0: 61 74 61 5b 69 46 72 65 65 32 2b 32 5d 29 3b 0a  ata[iFree2+2]);.
b8d0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
b8e0: 28 20 69 46 72 65 65 2b 73 7a 2b 73 7a 32 2b 69  ( iFree+sz+sz2+i
b8f0: 46 72 65 65 32 2d 28 69 46 72 65 65 2b 73 7a 29  Free2-(iFree+sz)
b900: 20 3c 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 29   <= usableSize )
b910: 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6d  ;.          memm
b920: 6f 76 65 28 26 64 61 74 61 5b 69 46 72 65 65 2b  ove(&data[iFree+
b930: 73 7a 2b 73 7a 32 5d 2c 20 26 64 61 74 61 5b 69  sz+sz2], &data[i
b940: 46 72 65 65 2b 73 7a 5d 2c 20 69 46 72 65 65 32  Free+sz], iFree2
b950: 2d 28 69 46 72 65 65 2b 73 7a 29 29 3b 0a 20 20  -(iFree+sz));.  
b960: 20 20 20 20 20 20 20 20 73 7a 20 2b 3d 20 73 7a          sz += sz
b970: 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  2;.        }.   
b980: 20 20 20 20 20 63 62 72 6b 20 3d 20 74 6f 70 2b       cbrk = top+
b990: 73 7a 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  sz;.        asse
b9a0: 72 74 28 20 63 62 72 6b 2b 28 69 46 72 65 65 2d  rt( cbrk+(iFree-
b9b0: 74 6f 70 29 20 3c 3d 20 75 73 61 62 6c 65 53 69  top) <= usableSi
b9c0: 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65  ze );.        me
b9d0: 6d 6d 6f 76 65 28 26 64 61 74 61 5b 63 62 72 6b  mmove(&data[cbrk
b9e0: 5d 2c 20 26 64 61 74 61 5b 74 6f 70 5d 2c 20 69  ], &data[top], i
b9f0: 46 72 65 65 2d 74 6f 70 29 3b 0a 20 20 20 20 20  Free-top);.     
ba00: 20 20 20 66 6f 72 28 70 41 64 64 72 3d 26 64 61     for(pAddr=&da
ba10: 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 20  ta[cellOffset]; 
ba20: 70 41 64 64 72 3c 70 45 6e 64 3b 20 70 41 64 64  pAddr<pEnd; pAdd
ba30: 72 2b 3d 32 29 7b 0a 20 20 20 20 20 20 20 20 20  r+=2){.         
ba40: 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70   pc = get2byte(p
ba50: 41 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Addr);.         
ba60: 20 69 66 28 20 70 63 3c 69 46 72 65 65 20 29 7b   if( pc<iFree ){
ba70: 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72 2c   put2byte(pAddr,
ba80: 20 70 63 2b 73 7a 29 3b 20 7d 0a 20 20 20 20 20   pc+sz); }.     
ba90: 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 63       else if( pc
baa0: 3c 69 46 72 65 65 32 20 29 7b 20 70 75 74 32 62  <iFree2 ){ put2b
bab0: 79 74 65 28 70 41 64 64 72 2c 20 70 63 2b 73 7a  yte(pAddr, pc+sz
bac0: 32 29 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a  2); }.        }.
bad0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 66          goto def
bae0: 72 61 67 6d 65 6e 74 5f 6f 75 74 3b 0a 20 20 20  ragment_out;.   
baf0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
bb00: 20 20 63 62 72 6b 20 3d 20 75 73 61 62 6c 65 53    cbrk = usableS
bb10: 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74  ize;.  iCellLast
bb20: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20   = usableSize - 
bb30: 34 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  4;.  for(i=0; i<
bb40: 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
bb50: 20 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20   u8 *pAddr;     
bb60: 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c  /* The i-th cell
bb70: 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20   pointer */.    
bb80: 70 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65  pAddr = &data[ce
bb90: 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b  llOffset + i*2];
bba0: 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79  .    pc = get2by
bbb0: 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20 74  te(pAddr);.    t
bbc0: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
bbd0: 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74  llFirst );.    t
bbe0: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
bbf0: 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 2f 2a  llLast );.    /*
bc00: 20 54 68 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e   These condition
bc10: 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
bc20: 65 65 6e 20 76 65 72 69 66 69 65 64 20 69 6e 20  een verified in 
bc30: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 0a  btreeInitPage().
bc40: 20 20 20 20 2a 2a 20 69 66 20 50 52 41 47 4d 41      ** if PRAGMA
bc50: 20 63 65 6c 6c 5f 73 69 7a 65 5f 63 68 65 63 6b   cell_size_check
bc60: 3d 4f 4e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  =ON..    */.    
bc70: 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73  if( pc<iCellFirs
bc80: 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73  t || pc>iCellLas
bc90: 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  t ){.      retur
bca0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
bcb0: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
bcc0: 20 61 73 73 65 72 74 28 20 70 63 3e 3d 69 43 65   assert( pc>=iCe
bcd0: 6c 6c 46 69 72 73 74 20 26 26 20 70 63 3c 3d 69  llFirst && pc<=i
bce0: 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20  CellLast );.    
bcf0: 73 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 78 43  size = pPage->xC
bd00: 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 26  ellSize(pPage, &
bd10: 73 72 63 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62  src[pc]);.    cb
bd20: 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20 20 20 20  rk -= size;.    
bd30: 69 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69  if( cbrk<iCellFi
bd40: 72 73 74 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75  rst || pc+size>u
bd50: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
bd60: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
bd70: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
bd80: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
bd90: 20 63 62 72 6b 2b 73 69 7a 65 3c 3d 75 73 61 62   cbrk+size<=usab
bda0: 6c 65 53 69 7a 65 20 26 26 20 63 62 72 6b 3e 3d  leSize && cbrk>=
bdb0: 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20  iCellFirst );.  
bdc0: 20 20 74 65 73 74 63 61 73 65 28 20 63 62 72 6b    testcase( cbrk
bdd0: 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a  +size==usableSiz
bde0: 65 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  e );.    testcas
bdf0: 65 28 20 70 63 2b 73 69 7a 65 3d 3d 75 73 61 62  e( pc+size==usab
be00: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 75  leSize );.    pu
be10: 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 63 62  t2byte(pAddr, cb
be20: 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 74 65 6d  rk);.    if( tem
be30: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  p==0 ){.      in
be40: 74 20 78 3b 0a 20 20 20 20 20 20 69 66 28 20 63  t x;.      if( c
be50: 62 72 6b 3d 3d 70 63 20 29 20 63 6f 6e 74 69 6e  brk==pc ) contin
be60: 75 65 3b 0a 20 20 20 20 20 20 74 65 6d 70 20 3d  ue;.      temp =
be70: 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d   sqlite3PagerTem
be80: 70 53 70 61 63 65 28 70 50 61 67 65 2d 3e 70 42  pSpace(pPage->pB
be90: 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
bea0: 20 20 78 20 3d 20 67 65 74 32 62 79 74 65 28 26    x = get2byte(&
beb0: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
bec0: 20 20 20 20 6d 65 6d 63 70 79 28 26 74 65 6d 70      memcpy(&temp
bed0: 5b 78 5d 2c 20 26 64 61 74 61 5b 78 5d 2c 20 28  [x], &data[x], (
bee0: 63 62 72 6b 2b 73 69 7a 65 29 20 2d 20 78 29 3b  cbrk+size) - x);
bef0: 0a 20 20 20 20 20 20 73 72 63 20 3d 20 74 65 6d  .      src = tem
bf00: 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  p;.    }.    mem
bf10: 63 70 79 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c  cpy(&data[cbrk],
bf20: 20 26 73 72 63 5b 70 63 5d 2c 20 73 69 7a 65 29   &src[pc], size)
bf30: 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b 68 64 72  ;.  }.  data[hdr
bf40: 2b 37 5d 20 3d 20 30 3b 0a 0a 20 64 65 66 72 61  +7] = 0;.. defra
bf50: 67 6d 65 6e 74 5f 6f 75 74 3a 0a 20 20 69 66 28  gment_out:.  if(
bf60: 20 64 61 74 61 5b 68 64 72 2b 37 5d 2b 63 62 72   data[hdr+7]+cbr
bf70: 6b 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d 70 50  k-iCellFirst!=pP
bf80: 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20  age->nFree ){.  
bf90: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
bfa0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
bfb0: 7d 0a 20 20 61 73 73 65 72 74 28 20 63 62 72 6b  }.  assert( cbrk
bfc0: 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a  >=iCellFirst );.
bfd0: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
bfe0: 5b 68 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a  [hdr+5], cbrk);.
bff0: 20 20 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20    data[hdr+1] = 
c000: 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d  0;.  data[hdr+2]
c010: 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26   = 0;.  memset(&
c020: 64 61 74 61 5b 69 43 65 6c 6c 46 69 72 73 74 5d  data[iCellFirst]
c030: 2c 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c 6c 46  , 0, cbrk-iCellF
c040: 69 72 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28  irst);.  assert(
c050: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
c060: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
c070: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65  pDbPage) );.  re
c080: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
c090: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20  }../*.** Search 
c0a0: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6f 6e  the free-list on
c0b0: 20 70 61 67 65 20 70 50 67 20 66 6f 72 20 73 70   page pPg for sp
c0c0: 61 63 65 20 74 6f 20 73 74 6f 72 65 20 61 20 63  ace to store a c
c0d0: 65 6c 6c 20 6e 42 79 74 65 20 62 79 74 65 73 20  ell nByte bytes 
c0e0: 69 6e 0a 2a 2a 20 73 69 7a 65 2e 20 49 66 20 6f  in.** size. If o
c0f0: 6e 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c  ne can be found,
c100: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
c110: 72 20 74 6f 20 74 68 65 20 73 70 61 63 65 20 61  r to the space a
c120: 6e 64 20 72 65 6d 6f 76 65 20 69 74 0a 2a 2a 20  nd remove it.** 
c130: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69  from the free-li
c140: 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20  st..**.** If no 
c150: 73 75 69 74 61 62 6c 65 20 73 70 61 63 65 20 63  suitable space c
c160: 61 6e 20 62 65 20 66 6f 75 6e 64 20 6f 6e 20 74  an be found on t
c170: 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 72 65  he free-list, re
c180: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  turn NULL..**.**
c190: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
c1a0: 61 79 20 64 65 74 65 63 74 20 63 6f 72 72 75 70  ay detect corrup
c1b0: 74 69 6f 6e 20 77 69 74 68 69 6e 20 70 50 67 2e  tion within pPg.
c1c0: 20 20 49 66 20 63 6f 72 72 75 70 74 69 6f 6e 20    If corruption 
c1d0: 69 73 0a 2a 2a 20 64 65 74 65 63 74 65 64 20 74  is.** detected t
c1e0: 68 65 6e 20 2a 70 52 63 20 69 73 20 73 65 74 20  hen *pRc is set 
c1f0: 74 6f 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  to SQLITE_CORRUP
c200: 54 20 61 6e 64 20 4e 55 4c 4c 20 69 73 20 72 65  T and NULL is re
c210: 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 6c  turned..**.** Sl
c220: 6f 74 73 20 6f 6e 20 74 68 65 20 66 72 65 65 20  ots on the free 
c230: 6c 69 73 74 20 74 68 61 74 20 61 72 65 20 62 65  list that are be
c240: 74 77 65 65 6e 20 31 20 61 6e 64 20 33 20 62 79  tween 1 and 3 by
c250: 74 65 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20  tes larger than 
c260: 6e 42 79 74 65 0a 2a 2a 20 77 69 6c 6c 20 62 65  nByte.** will be
c270: 20 69 67 6e 6f 72 65 64 20 69 66 20 61 64 64 69   ignored if addi
c280: 6e 67 20 74 68 65 20 65 78 74 72 61 20 73 70 61  ng the extra spa
c290: 63 65 20 74 6f 20 74 68 65 20 66 72 61 67 6d 65  ce to the fragme
c2a0: 6e 74 61 74 69 6f 6e 20 63 6f 75 6e 74 0a 2a 2a  ntation count.**
c2b0: 20 63 61 75 73 65 73 20 74 68 65 20 66 72 61 67   causes the frag
c2c0: 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 75 6e 74 20  mentation count 
c2d0: 74 6f 20 65 78 63 65 65 64 20 36 30 2e 0a 2a 2f  to exceed 60..*/
c2e0: 0a 73 74 61 74 69 63 20 75 38 20 2a 70 61 67 65  .static u8 *page
c2f0: 46 69 6e 64 53 6c 6f 74 28 4d 65 6d 50 61 67 65  FindSlot(MemPage
c300: 20 2a 70 50 67 2c 20 69 6e 74 20 6e 42 79 74 65   *pPg, int nByte
c310: 2c 20 69 6e 74 20 2a 70 52 63 29 7b 0a 20 20 63  , int *pRc){.  c
c320: 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70  onst int hdr = p
c330: 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  Pg->hdrOffset;. 
c340: 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61 74   u8 * const aDat
c350: 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a  a = pPg->aData;.
c360: 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20 68 64    int iAddr = hd
c370: 72 20 2b 20 31 3b 0a 20 20 69 6e 74 20 70 63 20  r + 1;.  int pc 
c380: 3d 20 67 65 74 32 62 79 74 65 28 26 61 44 61 74  = get2byte(&aDat
c390: 61 5b 69 41 64 64 72 5d 29 3b 0a 20 20 69 6e 74  a[iAddr]);.  int
c3a0: 20 78 3b 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   x;.  int usable
c3b0: 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 42 74 2d  Size = pPg->pBt-
c3c0: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 0a 20 20  >usableSize;..  
c3d0: 61 73 73 65 72 74 28 20 70 63 3e 30 20 29 3b 0a  assert( pc>0 );.
c3e0: 20 20 64 6f 7b 0a 20 20 20 20 69 6e 74 20 73 69    do{.    int si
c3f0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ze;            /
c400: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66 72  * Size of the fr
c410: 65 65 20 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 2f  ee slot */.    /
c420: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
c430: 2d 30 36 38 36 36 2d 33 39 31 32 35 20 46 72 65  -06866-39125 Fre
c440: 65 62 6c 6f 63 6b 73 20 61 72 65 20 61 6c 77 61  eblocks are alwa
c450: 79 73 20 63 6f 6e 6e 65 63 74 65 64 20 69 6e 20  ys connected in 
c460: 6f 72 64 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20  order of.    ** 
c470: 69 6e 63 72 65 61 73 69 6e 67 20 6f 66 66 73 65  increasing offse
c480: 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63  t. */.    if( pc
c490: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 7c 7c  >usableSize-4 ||
c4a0: 20 70 63 3c 69 41 64 64 72 2b 34 20 29 7b 0a 20   pc<iAddr+4 ){. 
c4b0: 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49       *pRc = SQLI
c4c0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
c4d0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
c4e0: 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56  .    }.    /* EV
c4f0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 37  IDENCE-OF: R-227
c500: 31 30 2d 35 33 33 32 38 20 54 68 65 20 74 68 69  10-53328 The thi
c510: 72 64 20 61 6e 64 20 66 6f 75 72 74 68 20 62 79  rd and fourth by
c520: 74 65 73 20 6f 66 20 65 61 63 68 0a 20 20 20 20  tes of each.    
c530: 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 20 66 6f 72  ** freeblock for
c540: 6d 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  m a big-endian i
c550: 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
c560: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
c570: 66 72 65 65 62 6c 6f 63 6b 0a 20 20 20 20 2a 2a  freeblock.    **
c580: 20 69 6e 20 62 79 74 65 73 2c 20 69 6e 63 6c 75   in bytes, inclu
c590: 64 69 6e 67 20 74 68 65 20 34 2d 62 79 74 65 20  ding the 4-byte 
c5a0: 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 73  header. */.    s
c5b0: 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26  ize = get2byte(&
c5c0: 61 44 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20  aData[pc+2]);.  
c5d0: 20 20 69 66 28 20 28 78 20 3d 20 73 69 7a 65 20    if( (x = size 
c5e0: 2d 20 6e 42 79 74 65 29 3e 3d 30 20 29 7b 0a 20  - nByte)>=0 ){. 
c5f0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78       testcase( x
c600: 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ==4 );.      tes
c610: 74 63 61 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20  tcase( x==3 );. 
c620: 20 20 20 20 20 69 66 28 20 70 63 20 3c 20 70 50       if( pc < pP
c630: 67 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a  g->cellOffset+2*
c640: 70 50 67 2d 3e 6e 43 65 6c 6c 20 7c 7c 20 73 69  pPg->nCell || si
c650: 7a 65 2b 70 63 20 3e 20 75 73 61 62 6c 65 53 69  ze+pc > usableSi
c660: 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  ze ){.        *p
c670: 52 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  Rc = SQLITE_CORR
c680: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
c690: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
c6a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 78 3c 34 20    }else if( x<4 
c6b0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56  ){.        /* EV
c6c0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 31 34  IDENCE-OF: R-114
c6d0: 39 38 2d 35 38 30 32 32 20 49 6e 20 61 20 77 65  98-58022 In a we
c6e0: 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65 65  ll-formed b-tree
c6f0: 20 70 61 67 65 2c 20 74 68 65 20 74 6f 74 61 6c   page, the total
c700: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62  .        ** numb
c710: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 66  er of bytes in f
c720: 72 61 67 6d 65 6e 74 73 20 6d 61 79 20 6e 6f 74  ragments may not
c730: 20 65 78 63 65 65 64 20 36 30 2e 20 2a 2f 0a 20   exceed 60. */. 
c740: 20 20 20 20 20 20 20 69 66 28 20 61 44 61 74 61         if( aData
c750: 5b 68 64 72 2b 37 5d 3e 35 37 20 29 20 72 65 74  [hdr+7]>57 ) ret
c760: 75 72 6e 20 30 3b 0a 0a 20 20 20 20 20 20 20 20  urn 0;..        
c770: 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73 6c  /* Remove the sl
c780: 6f 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ot from the free
c790: 2d 6c 69 73 74 2e 20 55 70 64 61 74 65 20 74 68  -list. Update th
c7a0: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20  e number of.    
c7b0: 20 20 20 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65      ** fragmente
c7c0: 64 20 62 79 74 65 73 20 77 69 74 68 69 6e 20 74  d bytes within t
c7d0: 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  he page. */.    
c7e0: 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74      memcpy(&aDat
c7f0: 61 5b 69 41 64 64 72 5d 2c 20 26 61 44 61 74 61  a[iAddr], &aData
c800: 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20  [pc], 2);.      
c810: 20 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 20 2b    aData[hdr+7] +
c820: 3d 20 28 75 38 29 78 3b 0a 20 20 20 20 20 20 7d  = (u8)x;.      }
c830: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
c840: 20 54 68 65 20 73 6c 6f 74 20 72 65 6d 61 69 6e   The slot remain
c850: 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  s on the free-li
c860: 73 74 2e 20 52 65 64 75 63 65 20 69 74 73 20 73  st. Reduce its s
c870: 69 7a 65 20 74 6f 20 61 63 63 6f 75 6e 74 0a 20  ize to account. 
c880: 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74          ** for t
c890: 68 65 20 70 6f 72 74 69 6f 6e 20 75 73 65 64 20  he portion used 
c8a0: 62 79 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63  by the new alloc
c8b0: 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20  ation. */.      
c8c0: 20 20 70 75 74 32 62 79 74 65 28 26 61 44 61 74    put2byte(&aDat
c8d0: 61 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a 20 20 20  a[pc+2], x);.   
c8e0: 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
c8f0: 6e 20 26 61 44 61 74 61 5b 70 63 20 2b 20 78 5d  n &aData[pc + x]
c900: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 41 64 64  ;.    }.    iAdd
c910: 72 20 3d 20 70 63 3b 0a 20 20 20 20 70 63 20 3d  r = pc;.    pc =
c920: 20 67 65 74 32 62 79 74 65 28 26 61 44 61 74 61   get2byte(&aData
c930: 5b 70 63 5d 29 3b 0a 20 20 7d 77 68 69 6c 65 28  [pc]);.  }while(
c940: 20 70 63 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e   pc );..  return
c950: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c   0;.}../*.** All
c960: 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74 65  ocate nByte byte
c970: 73 20 6f 66 20 73 70 61 63 65 20 66 72 6f 6d 20  s of space from 
c980: 77 69 74 68 69 6e 20 74 68 65 20 42 2d 54 72 65  within the B-Tre
c990: 65 20 70 61 67 65 20 70 61 73 73 65 64 0a 2a 2a  e page passed.**
c9a0: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
c9b0: 67 75 6d 65 6e 74 2e 20 57 72 69 74 65 20 69 6e  gument. Write in
c9c0: 74 6f 20 2a 70 49 64 78 20 74 68 65 20 69 6e 64  to *pIdx the ind
c9d0: 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61  ex into pPage->a
c9e0: 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68 65  Data[].** of the
c9f0: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 61   first byte of a
ca00: 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e 20  llocated space. 
ca10: 52 65 74 75 72 6e 20 65 69 74 68 65 72 20 53 51  Return either SQ
ca20: 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61 6e  LITE_OK or.** an
ca30: 20 65 72 72 6f 72 20 63 6f 64 65 20 28 75 73 75   error code (usu
ca40: 61 6c 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52 52  ally SQLITE_CORR
ca50: 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  UPT)..**.** The 
ca60: 63 61 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65  caller guarantee
ca70: 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  s that there is 
ca80: 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
ca90: 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20   to make the.** 
caa0: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68 69  allocation.  Thi
cab0: 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
cac0: 6e 65 65 64 20 74 6f 20 64 65 66 72 61 67 6d 65  need to defragme
cad0: 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62  nt in order to b
cae0: 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65 20  ring.** all the 
caf0: 73 70 61 63 65 20 74 6f 67 65 74 68 65 72 2c 20  space together, 
cb00: 68 6f 77 65 76 65 72 2e 20 20 54 68 69 73 20 72  however.  This r
cb10: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f 69  outine will avoi
cb20: 64 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66  d using.** the f
cb30: 69 72 73 74 20 74 77 6f 20 62 79 74 65 73 20 70  irst two bytes p
cb40: 61 73 74 20 74 68 65 20 63 65 6c 6c 20 70 6f 69  ast the cell poi
cb50: 6e 74 65 72 20 61 72 65 61 20 73 69 6e 63 65 20  nter area since 
cb60: 70 72 65 73 75 6d 61 62 6c 79 20 74 68 69 73 0a  presumably this.
cb70: 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  ** allocation is
cb80: 20 62 65 69 6e 67 20 6d 61 64 65 20 69 6e 20 6f   being made in o
cb90: 72 64 65 72 20 74 6f 20 69 6e 73 65 72 74 20 61  rder to insert a
cba0: 20 6e 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77 65   new cell, so we
cbb0: 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65 6e   will.** also en
cbc0: 64 20 75 70 20 6e 65 65 64 69 6e 67 20 61 20 6e  d up needing a n
cbd0: 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e  ew cell pointer.
cbe0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
cbf0: 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d 65 6d  llocateSpace(Mem
cc00: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
cc10: 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 49 64   nByte, int *pId
cc20: 78 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  x){.  const int 
cc30: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
cc40: 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f  Offset;    /* Lo
cc50: 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61  cal cache of pPa
cc60: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f  ge->hdrOffset */
cc70: 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61  .  u8 * const da
cc80: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
cc90: 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  a;      /* Local
cca0: 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d   cache of pPage-
ccb0: 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  >aData */.  int 
ccc0: 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  top;            
ccd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cce0: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
ccf0: 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  f cell content a
cd00: 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  rea */.  int rc 
cd10: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
cd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cd30: 20 49 6e 74 65 67 65 72 20 72 65 74 75 72 6e 20   Integer return 
cd40: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 67 61  code */.  int ga
cd50: 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72  p;        /* Fir
cd60: 73 74 20 62 79 74 65 20 6f 66 20 67 61 70 20 62  st byte of gap b
cd70: 65 74 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69 6e  etween cell poin
cd80: 74 65 72 73 20 61 6e 64 20 63 65 6c 6c 20 63 6f  ters and cell co
cd90: 6e 74 65 6e 74 20 2a 2f 0a 20 20 0a 20 20 61 73  ntent */.  .  as
cda0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
cdb0: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
cdc0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
cdd0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
cde0: 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72  ->pBt );.  asser
cdf0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
ce00: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
ce10: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
ce20: 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30 20 29  sert( nByte>=0 )
ce30: 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65  ;  /* Minimum ce
ce40: 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a  ll size is 4 */.
ce50: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
ce60: 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b  >nFree>=nByte );
ce70: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
ce80: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
ce90: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74  ;.  assert( nByt
cea0: 65 20 3c 20 28 69 6e 74 29 28 70 50 61 67 65 2d  e < (int)(pPage-
ceb0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
cec0: 2d 38 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  -8) );..  assert
ced0: 28 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  ( pPage->cellOff
cee0: 73 65 74 20 3d 3d 20 68 64 72 20 2b 20 31 32 20  set == hdr + 12 
cef0: 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20  - 4*pPage->leaf 
cf00: 29 3b 0a 20 20 67 61 70 20 3d 20 70 50 61 67 65  );.  gap = pPage
cf10: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  ->cellOffset + 2
cf20: 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20  *pPage->nCell;. 
cf30: 20 61 73 73 65 72 74 28 20 67 61 70 3c 3d 36 35   assert( gap<=65
cf40: 35 33 36 20 29 3b 0a 20 20 2f 2a 20 45 56 49 44  536 );.  /* EVID
cf50: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 39 33 35 36  ENCE-OF: R-29356
cf60: 2d 30 32 33 39 31 20 49 66 20 74 68 65 20 64 61  -02391 If the da
cf70: 74 61 62 61 73 65 20 75 73 65 73 20 61 20 36 35  tabase uses a 65
cf80: 35 33 36 2d 62 79 74 65 20 70 61 67 65 20 73 69  536-byte page si
cf90: 7a 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  ze.  ** and the 
cfa0: 72 65 73 65 72 76 65 64 20 73 70 61 63 65 20 69  reserved space i
cfb0: 73 20 7a 65 72 6f 20 28 74 68 65 20 75 73 75 61  s zero (the usua
cfc0: 6c 20 76 61 6c 75 65 20 66 6f 72 20 72 65 73 65  l value for rese
cfd0: 72 76 65 64 20 73 70 61 63 65 29 0a 20 20 2a 2a  rved space).  **
cfe0: 20 74 68 65 6e 20 74 68 65 20 63 65 6c 6c 20 63   then the cell c
cff0: 6f 6e 74 65 6e 74 20 6f 66 66 73 65 74 20 6f 66  ontent offset of
d000: 20 61 6e 20 65 6d 70 74 79 20 70 61 67 65 20 77   an empty page w
d010: 61 6e 74 73 20 74 6f 20 62 65 20 36 35 35 33 36  ants to be 65536
d020: 2e 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 2c 20  ..  ** However, 
d030: 74 68 61 74 20 69 6e 74 65 67 65 72 20 69 73 20  that integer is 
d040: 74 6f 6f 20 6c 61 72 67 65 20 74 6f 20 62 65 20  too large to be 
d050: 73 74 6f 72 65 64 20 69 6e 20 61 20 32 2d 62 79  stored in a 2-by
d060: 74 65 20 75 6e 73 69 67 6e 65 64 0a 20 20 2a 2a  te unsigned.  **
d070: 20 69 6e 74 65 67 65 72 2c 20 73 6f 20 61 20 76   integer, so a v
d080: 61 6c 75 65 20 6f 66 20 30 20 69 73 20 75 73 65  alue of 0 is use
d090: 64 20 69 6e 20 69 74 73 20 70 6c 61 63 65 2e 20  d in its place. 
d0a0: 2a 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62  */.  top = get2b
d0b0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
d0c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70  );.  assert( top
d0d0: 3c 3d 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42  <=(int)pPage->pB
d0e0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
d0f0: 20 2f 2a 20 50 72 65 76 65 6e 74 20 62 79 20 67   /* Prevent by g
d100: 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 29 20  etAndInitPage() 
d110: 2a 2f 0a 20 20 69 66 28 20 67 61 70 3e 74 6f 70  */.  if( gap>top
d120: 20 29 7b 0a 20 20 20 20 69 66 28 20 74 6f 70 3d   ){.    if( top=
d130: 3d 30 20 26 26 20 70 50 61 67 65 2d 3e 70 42 74  =0 && pPage->pBt
d140: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3d 3d 36 35  ->usableSize==65
d150: 35 33 36 20 29 7b 0a 20 20 20 20 20 20 74 6f 70  536 ){.      top
d160: 20 3d 20 36 35 35 33 36 3b 0a 20 20 20 20 7d 65   = 65536;.    }e
d170: 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72  lse{.      retur
d180: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
d190: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BKPT;.    }.  }
d1a0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
d1b0: 69 73 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20  is enough space 
d1c0: 62 65 74 77 65 65 6e 20 67 61 70 20 61 6e 64 20  between gap and 
d1d0: 74 6f 70 20 66 6f 72 20 6f 6e 65 20 6d 6f 72 65  top for one more
d1e0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 0a 20 20   cell pointer.  
d1f0: 2a 2a 20 61 72 72 61 79 20 65 6e 74 72 79 20 6f  ** array entry o
d200: 66 66 73 65 74 2c 20 61 6e 64 20 69 66 20 74 68  ffset, and if th
d210: 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 6e 6f  e freelist is no
d220: 74 20 65 6d 70 74 79 2c 20 74 68 65 6e 20 73 65  t empty, then se
d230: 61 72 63 68 20 74 68 65 0a 20 20 2a 2a 20 66 72  arch the.  ** fr
d240: 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66  eelist looking f
d250: 6f 72 20 61 20 66 72 65 65 20 73 6c 6f 74 20 62  or a free slot b
d260: 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74  ig enough to sat
d270: 69 73 66 79 20 74 68 65 20 72 65 71 75 65 73 74  isfy the request
d280: 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  ..  */.  testcas
d290: 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70 20 29 3b  e( gap+2==top );
d2a0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70  .  testcase( gap
d2b0: 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73  +1==top );.  tes
d2c0: 74 63 61 73 65 28 20 67 61 70 3d 3d 74 6f 70 20  tcase( gap==top 
d2d0: 29 3b 0a 20 20 69 66 28 20 28 64 61 74 61 5b 68  );.  if( (data[h
d2e0: 64 72 2b 32 5d 20 7c 7c 20 64 61 74 61 5b 68 64  dr+2] || data[hd
d2f0: 72 2b 31 5d 29 20 26 26 20 67 61 70 2b 32 3c 3d  r+1]) && gap+2<=
d300: 74 6f 70 20 29 7b 0a 20 20 20 20 75 38 20 2a 70  top ){.    u8 *p
d310: 53 70 61 63 65 20 3d 20 70 61 67 65 46 69 6e 64  Space = pageFind
d320: 53 6c 6f 74 28 70 50 61 67 65 2c 20 6e 42 79 74  Slot(pPage, nByt
d330: 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28  e, &rc);.    if(
d340: 20 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20   pSpace ){.     
d350: 20 61 73 73 65 72 74 28 20 70 53 70 61 63 65 3e   assert( pSpace>
d360: 3d 64 61 74 61 20 26 26 20 28 70 53 70 61 63 65  =data && (pSpace
d370: 20 2d 20 64 61 74 61 29 3c 36 35 35 33 36 20 29   - data)<65536 )
d380: 3b 0a 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20  ;.      *pIdx = 
d390: 28 69 6e 74 29 28 70 53 70 61 63 65 20 2d 20 64  (int)(pSpace - d
d3a0: 61 74 61 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ata);.      retu
d3b0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
d3c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 20 29    }else if( rc )
d3d0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
d3e0: 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  c;.    }.  }..  
d3f0: 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 20 63  /* The request c
d400: 6f 75 6c 64 20 6e 6f 74 20 62 65 20 66 75 6c 66  ould not be fulf
d410: 69 6c 6c 65 64 20 75 73 69 6e 67 20 61 20 66 72  illed using a fr
d420: 65 65 6c 69 73 74 20 73 6c 6f 74 2e 20 20 43 68  eelist slot.  Ch
d430: 65 63 6b 0a 20 20 2a 2a 20 74 6f 20 73 65 65 20  eck.  ** to see 
d440: 69 66 20 64 65 66 72 61 67 6d 65 6e 74 61 74 69  if defragmentati
d450: 6f 6e 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e  on is necessary.
d460: 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  .  */.  testcase
d470: 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3d 3d 74  ( gap+2+nByte==t
d480: 6f 70 20 29 3b 0a 20 20 69 66 28 20 67 61 70 2b  op );.  if( gap+
d490: 32 2b 6e 42 79 74 65 3e 74 6f 70 20 29 7b 0a 20  2+nByte>top ){. 
d4a0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
d4b0: 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 43 4f 52  ->nCell>0 || COR
d4c0: 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 72  RUPT_DB );.    r
d4d0: 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61  c = defragmentPa
d4e0: 67 65 28 70 50 61 67 65 2c 20 4d 49 4e 28 34 2c  ge(pPage, MIN(4,
d4f0: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 20   pPage->nFree - 
d500: 28 32 2b 6e 42 79 74 65 29 29 29 3b 0a 20 20 20  (2+nByte)));.   
d510: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
d520: 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67   rc;.    top = g
d530: 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26  et2byteNotZero(&
d540: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
d550: 20 20 61 73 73 65 72 74 28 20 67 61 70 2b 32 2b    assert( gap+2+
d560: 6e 42 79 74 65 3c 3d 74 6f 70 20 29 3b 0a 20 20  nByte<=top );.  
d570: 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  }...  /* Allocat
d580: 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68  e memory from th
d590: 65 20 67 61 70 20 69 6e 20 62 65 74 77 65 65 6e  e gap in between
d5a0: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
d5b0: 72 20 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64  r array.  ** and
d5c0: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
d5d0: 74 20 61 72 65 61 2e 20 20 54 68 65 20 62 74 72  t area.  The btr
d5e0: 65 65 49 6e 69 74 50 61 67 65 28 29 20 63 61 6c  eeInitPage() cal
d5f0: 6c 20 68 61 73 20 61 6c 72 65 61 64 79 0a 20 20  l has already.  
d600: 2a 2a 20 76 61 6c 69 64 61 74 65 64 20 74 68 65  ** validated the
d610: 20 66 72 65 65 6c 69 73 74 2e 20 20 47 69 76 65   freelist.  Give
d620: 6e 20 74 68 61 74 20 74 68 65 20 66 72 65 65 6c  n that the freel
d630: 69 73 74 20 69 73 20 76 61 6c 69 64 2c 20 74 68  ist is valid, th
d640: 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77  ere.  ** is no w
d650: 61 79 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f  ay that the allo
d660: 63 61 74 69 6f 6e 20 63 61 6e 20 65 78 74 65 6e  cation can exten
d670: 64 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66  d off the end of
d680: 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20   the page..  ** 
d690: 54 68 65 20 61 73 73 65 72 74 28 29 20 62 65 6c  The assert() bel
d6a0: 6f 77 20 76 65 72 69 66 69 65 73 20 74 68 65 20  ow verifies the 
d6b0: 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63  previous sentenc
d6c0: 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d  e..  */.  top -=
d6d0: 20 6e 42 79 74 65 3b 0a 20 20 70 75 74 32 62 79   nByte;.  put2by
d6e0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
d6f0: 20 74 6f 70 29 3b 0a 20 20 61 73 73 65 72 74 28   top);.  assert(
d700: 20 74 6f 70 2b 6e 42 79 74 65 20 3c 3d 20 28 69   top+nByte <= (i
d710: 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  nt)pPage->pBt->u
d720: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 2a  sableSize );.  *
d730: 70 49 64 78 20 3d 20 74 6f 70 3b 0a 20 20 72 65  pIdx = top;.  re
d740: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
d750: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
d760: 61 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65  a section of the
d770: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 74 6f   pPage->aData to
d780: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a   the freelist..*
d790: 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65  * The first byte
d7a0: 20 6f 66 20 74 68 65 20 6e 65 77 20 66 72 65 65   of the new free
d7b0: 20 62 6c 6f 63 6b 20 69 73 20 70 50 61 67 65 2d   block is pPage-
d7c0: 3e 61 44 61 74 61 5b 69 53 74 61 72 74 5d 0a 2a  >aData[iStart].*
d7d0: 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  * and the size o
d7e0: 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73 20 69  f the block is i
d7f0: 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  Size bytes..**.*
d800: 2a 20 41 64 6a 61 63 65 6e 74 20 66 72 65 65 62  * Adjacent freeb
d810: 6c 6f 63 6b 73 20 61 72 65 20 63 6f 61 6c 65 73  locks are coales
d820: 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ced..**.** Note 
d830: 74 68 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68  that even though
d840: 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 20 6c   the freeblock l
d850: 69 73 74 20 77 61 73 20 63 68 65 63 6b 65 64 20  ist was checked 
d860: 62 79 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  by btreeInitPage
d870: 28 29 2c 0a 2a 2a 20 74 68 61 74 20 72 6f 75 74  (),.** that rout
d880: 69 6e 65 20 77 69 6c 6c 20 6e 6f 74 20 64 65 74  ine will not det
d890: 65 63 74 20 6f 76 65 72 6c 61 70 20 62 65 74 77  ect overlap betw
d8a0: 65 65 6e 20 63 65 6c 6c 73 20 6f 72 20 66 72 65  een cells or fre
d8b0: 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 72 0a 2a 2a  eblocks.  Nor.**
d8c0: 20 64 6f 65 73 20 69 74 20 64 65 74 65 63 74 20   does it detect 
d8d0: 63 65 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f  cells or freeblo
d8e0: 63 6b 73 20 74 68 61 74 20 65 6e 63 72 6f 75 63  cks that encrouc
d8f0: 68 20 69 6e 74 6f 20 74 68 65 20 72 65 73 65 72  h into the reser
d900: 76 65 64 20 62 79 74 65 73 0a 2a 2a 20 61 74 20  ved bytes.** at 
d910: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
d920: 61 67 65 2e 20 20 53 6f 20 64 6f 20 61 64 64 69  age.  So do addi
d930: 74 69 6f 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f  tional corruptio
d940: 6e 20 63 68 65 63 6b 73 20 69 6e 73 69 64 65 20  n checks inside 
d950: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
d960: 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
d970: 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 6e 79  E_CORRUPT if any
d980: 20 70 72 6f 62 6c 65 6d 73 20 61 72 65 20 66 6f   problems are fo
d990: 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  und..*/.static i
d9a0: 6e 74 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d  nt freeSpace(Mem
d9b0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 31 36  Page *pPage, u16
d9c0: 20 69 53 74 61 72 74 2c 20 75 31 36 20 69 53 69   iStart, u16 iSi
d9d0: 7a 65 29 7b 0a 20 20 75 31 36 20 69 50 74 72 3b  ze){.  u16 iPtr;
d9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
da00: 41 64 64 72 65 73 73 20 6f 66 20 70 74 72 20 74  Address of ptr t
da10: 6f 20 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b  o next freeblock
da20: 20 2a 2f 0a 20 20 75 31 36 20 69 46 72 65 65 42   */.  u16 iFreeB
da30: 6c 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  lk;             
da40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
da50: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
da60: 78 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a  xt freeblock */.
da70: 20 20 75 38 20 68 64 72 3b 20 20 20 20 20 20 20    u8 hdr;       
da80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da90: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
daa0: 68 65 61 64 65 72 20 73 69 7a 65 2e 20 20 30 20  header size.  0 
dab0: 6f 72 20 31 30 30 20 2a 2f 0a 20 20 75 38 20 6e  or 100 */.  u8 n
dac0: 46 72 61 67 20 3d 20 30 3b 20 20 20 20 20 20 20  Frag = 0;       
dad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dae0: 20 20 2f 2a 20 52 65 64 75 63 74 69 6f 6e 20 69    /* Reduction i
daf0: 6e 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20  n fragmentation 
db00: 2a 2f 0a 20 20 75 31 36 20 69 4f 72 69 67 53 69  */.  u16 iOrigSi
db10: 7a 65 20 3d 20 69 53 69 7a 65 3b 20 20 20 20 20  ze = iSize;     
db20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72             /* Or
db30: 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20  iginal value of 
db40: 69 53 69 7a 65 20 2a 2f 0a 20 20 75 33 32 20 69  iSize */.  u32 i
db50: 4c 61 73 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  Last = pPage->pB
db60: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 3b  t->usableSize-4;
db70: 20 2f 2a 20 4c 61 72 67 65 73 74 20 70 6f 73 73   /* Largest poss
db80: 69 62 6c 65 20 66 72 65 65 62 6c 6f 63 6b 20 6f  ible freeblock o
db90: 66 66 73 65 74 20 2a 2f 0a 20 20 75 33 32 20 69  ffset */.  u32 i
dba0: 45 6e 64 20 3d 20 69 53 74 61 72 74 20 2b 20 69  End = iStart + i
dbb0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
dbc0: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 70   /* First byte p
dbd0: 61 73 74 20 74 68 65 20 69 53 74 61 72 74 20 62  ast the iStart b
dbe0: 75 66 66 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67  uffer */.  unsig
dbf0: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d  ned char *data =
dc00: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20   pPage->aData;  
dc10: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 65 6e 74   /* Page content
dc20: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
dc30: 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a  Page->pBt!=0 );.
dc40: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
dc50: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
dc60: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
dc70: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  ) );.  assert( C
dc80: 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 53 74  ORRUPT_DB || iSt
dc90: 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f  art>=pPage->hdrO
dca0: 66 66 73 65 74 2b 36 2b 70 50 61 67 65 2d 3e 63  ffset+6+pPage->c
dcb0: 68 69 6c 64 50 74 72 53 69 7a 65 20 29 3b 0a 20  hildPtrSize );. 
dcc0: 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54   assert( CORRUPT
dcd0: 5f 44 42 20 7c 7c 20 69 45 6e 64 20 3c 3d 20 70  _DB || iEnd <= p
dce0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
dcf0: 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72  eSize );.  asser
dd00: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
dd10: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
dd20: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
dd30: 73 65 72 74 28 20 69 53 69 7a 65 3e 3d 34 20 29  sert( iSize>=4 )
dd40: 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63  ;   /* Minimum c
dd50: 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f  ell size is 4 */
dd60: 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61 72  .  assert( iStar
dd70: 74 3c 3d 69 4c 61 73 74 20 29 3b 0a 0a 20 20 2f  t<=iLast );..  /
dd80: 2a 20 4f 76 65 72 77 72 69 74 65 20 64 65 6c 65  * Overwrite dele
dd90: 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ted information 
dda0: 77 69 74 68 20 7a 65 72 6f 73 20 77 68 65 6e 20  with zeros when 
ddb0: 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74  the secure_delet
ddc0: 65 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73  e.  ** option is
ddd0: 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66   enabled */.  if
dde0: 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 62 74  ( pPage->pBt->bt
ddf0: 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43  sFlags & BTS_SEC
de00: 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20  URE_DELETE ){.  
de10: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69    memset(&data[i
de20: 53 74 61 72 74 5d 2c 20 30 2c 20 69 53 69 7a 65  Start], 0, iSize
de30: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
de40: 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62 6c 6f   list of freeblo
de50: 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61  cks must be in a
de60: 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20  scending order. 
de70: 20 46 69 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20   Find the .  ** 
de80: 73 70 6f 74 20 6f 6e 20 74 68 65 20 6c 69 73 74  spot on the list
de90: 20 77 68 65 72 65 20 69 53 74 61 72 74 20 73 68   where iStart sh
dea0: 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74 65 64  ould be inserted
deb0: 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70  ..  */.  hdr = p
dec0: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
ded0: 0a 20 20 69 50 74 72 20 3d 20 68 64 72 20 2b 20  .  iPtr = hdr + 
dee0: 31 3b 0a 20 20 69 66 28 20 64 61 74 61 5b 69 50  1;.  if( data[iP
def0: 74 72 2b 31 5d 3d 3d 30 20 26 26 20 64 61 74 61  tr+1]==0 && data
df00: 5b 69 50 74 72 5d 3d 3d 30 20 29 7b 0a 20 20 20  [iPtr]==0 ){.   
df10: 20 69 46 72 65 65 42 6c 6b 20 3d 20 30 3b 20 20   iFreeBlk = 0;  
df20: 2f 2a 20 53 68 6f 72 74 63 75 74 20 66 6f 72 20  /* Shortcut for 
df30: 74 68 65 20 63 61 73 65 20 77 68 65 6e 20 74 68  the case when th
df40: 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 65 6d  e freelist is em
df50: 70 74 79 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a  pty */.  }else{.
df60: 20 20 20 20 77 68 69 6c 65 28 20 28 69 46 72 65      while( (iFre
df70: 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74 65 28  eBlk = get2byte(
df80: 26 64 61 74 61 5b 69 50 74 72 5d 29 29 3c 69 53  &data[iPtr]))<iS
df90: 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 69 66  tart ){.      if
dfa0: 28 20 69 46 72 65 65 42 6c 6b 3c 69 50 74 72 2b  ( iFreeBlk<iPtr+
dfb0: 34 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  4 ){.        if(
dfc0: 20 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29 20 62   iFreeBlk==0 ) b
dfd0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 72 65  reak;.        re
dfe0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
dff0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
e000: 7d 0a 20 20 20 20 20 20 69 50 74 72 20 3d 20 69  }.      iPtr = i
e010: 46 72 65 65 42 6c 6b 3b 0a 20 20 20 20 7d 0a 20  FreeBlk;.    }. 
e020: 20 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3e     if( iFreeBlk>
e030: 69 4c 61 73 74 20 29 20 72 65 74 75 72 6e 20 53  iLast ) return S
e040: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
e050: 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  PT;.    assert( 
e060: 69 46 72 65 65 42 6c 6b 3e 69 50 74 72 20 7c 7c  iFreeBlk>iPtr ||
e070: 20 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29 3b 0a   iFreeBlk==0 );.
e080: 20 20 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69    .    /* At thi
e090: 73 20 70 6f 69 6e 74 3a 0a 20 20 20 20 2a 2a 20  s point:.    ** 
e0a0: 20 20 20 69 46 72 65 65 42 6c 6b 3a 20 20 20 46     iFreeBlk:   F
e0b0: 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 61  irst freeblock a
e0c0: 66 74 65 72 20 69 53 74 61 72 74 2c 20 6f 72 20  fter iStart, or 
e0d0: 7a 65 72 6f 20 69 66 20 6e 6f 6e 65 0a 20 20 20  zero if none.   
e0e0: 20 2a 2a 20 20 20 20 69 50 74 72 3a 20 20 20 20   **    iPtr:    
e0f0: 20 20 20 54 68 65 20 61 64 64 72 65 73 73 20 6f     The address o
e100: 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  f a pointer to i
e110: 46 72 65 65 42 6c 6b 0a 20 20 20 20 2a 2a 0a 20  FreeBlk.    **. 
e120: 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73     ** Check to s
e130: 65 65 20 69 66 20 69 46 72 65 65 42 6c 6b 20 73  ee if iFreeBlk s
e140: 68 6f 75 6c 64 20 62 65 20 63 6f 61 6c 65 73 63  hould be coalesc
e150: 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20  ed onto the end 
e160: 6f 66 20 69 53 74 61 72 74 2e 0a 20 20 20 20 2a  of iStart..    *
e170: 2f 0a 20 20 20 20 69 66 28 20 69 46 72 65 65 42  /.    if( iFreeB
e180: 6c 6b 20 26 26 20 69 45 6e 64 2b 33 3e 3d 69 46  lk && iEnd+3>=iF
e190: 72 65 65 42 6c 6b 20 29 7b 0a 20 20 20 20 20 20  reeBlk ){.      
e1a0: 6e 46 72 61 67 20 3d 20 69 46 72 65 65 42 6c 6b  nFrag = iFreeBlk
e1b0: 20 2d 20 69 45 6e 64 3b 0a 20 20 20 20 20 20 69   - iEnd;.      i
e1c0: 66 28 20 69 45 6e 64 3e 69 46 72 65 65 42 6c 6b  f( iEnd>iFreeBlk
e1d0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
e1e0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
e1f0: 20 20 20 20 20 69 45 6e 64 20 3d 20 69 46 72 65       iEnd = iFre
e200: 65 42 6c 6b 20 2b 20 67 65 74 32 62 79 74 65 28  eBlk + get2byte(
e210: 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 2b 32  &data[iFreeBlk+2
e220: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45  ]);.      if( iE
e230: 6e 64 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d  nd > pPage->pBt-
e240: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 20 72 65  >usableSize ) re
e250: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
e260: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
e270: 69 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69  iSize = iEnd - i
e280: 53 74 61 72 74 3b 0a 20 20 20 20 20 20 69 46 72  Start;.      iFr
e290: 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74 65  eeBlk = get2byte
e2a0: 28 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 5d  (&data[iFreeBlk]
e2b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
e2c0: 2f 2a 20 49 66 20 69 50 74 72 20 69 73 20 61 6e  /* If iPtr is an
e2d0: 6f 74 68 65 72 20 66 72 65 65 62 6c 6f 63 6b 20  other freeblock 
e2e0: 28 74 68 61 74 20 69 73 2c 20 69 66 20 69 50 74  (that is, if iPt
e2f0: 72 20 69 73 20 6e 6f 74 20 74 68 65 20 66 72 65  r is not the fre
e300: 65 6c 69 73 74 0a 20 20 20 20 2a 2a 20 70 6f 69  elist.    ** poi
e310: 6e 74 65 72 20 69 6e 20 74 68 65 20 70 61 67 65  nter in the page
e320: 20 68 65 61 64 65 72 29 20 74 68 65 6e 20 63 68   header) then ch
e330: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 53  eck to see if iS
e340: 74 61 72 74 20 73 68 6f 75 6c 64 20 62 65 0a 20  tart should be. 
e350: 20 20 20 2a 2a 20 63 6f 61 6c 65 73 63 65 64 20     ** coalesced 
e360: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
e370: 69 50 74 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  iPtr..    */.   
e380: 20 69 66 28 20 69 50 74 72 3e 68 64 72 2b 31 20   if( iPtr>hdr+1 
e390: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50 74  ){.      int iPt
e3a0: 72 45 6e 64 20 3d 20 69 50 74 72 20 2b 20 67 65  rEnd = iPtr + ge
e3b0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 50 74  t2byte(&data[iPt
e3c0: 72 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  r+2]);.      if(
e3d0: 20 69 50 74 72 45 6e 64 2b 33 3e 3d 69 53 74 61   iPtrEnd+3>=iSta
e3e0: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  rt ){.        if
e3f0: 28 20 69 50 74 72 45 6e 64 3e 69 53 74 61 72 74  ( iPtrEnd>iStart
e400: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
e410: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
e420: 20 20 20 20 20 20 20 6e 46 72 61 67 20 2b 3d 20         nFrag += 
e430: 69 53 74 61 72 74 20 2d 20 69 50 74 72 45 6e 64  iStart - iPtrEnd
e440: 3b 0a 20 20 20 20 20 20 20 20 69 53 69 7a 65 20  ;.        iSize 
e450: 3d 20 69 45 6e 64 20 2d 20 69 50 74 72 3b 0a 20  = iEnd - iPtr;. 
e460: 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20         iStart = 
e470: 69 50 74 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iPtr;.      }.  
e480: 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 46 72 61    }.    if( nFra
e490: 67 3e 64 61 74 61 5b 68 64 72 2b 37 5d 20 29 20  g>data[hdr+7] ) 
e4a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
e4b0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
e4c0: 64 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 6e  data[hdr+7] -= n
e4d0: 46 72 61 67 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Frag;.  }.  if( 
e4e0: 69 53 74 61 72 74 3d 3d 67 65 74 32 62 79 74 65  iStart==get2byte
e4f0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29  (&data[hdr+5]) )
e500: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77  {.    /* The new
e510: 20 66 72 65 65 62 6c 6f 63 6b 20 69 73 20 61 74   freeblock is at
e520: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
e530: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
e540: 6e 74 20 61 72 65 61 2c 0a 20 20 20 20 2a 2a 20  nt area,.    ** 
e550: 73 6f 20 6a 75 73 74 20 65 78 74 65 6e 64 20 74  so just extend t
e560: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
e570: 61 72 65 61 20 72 61 74 68 65 72 20 74 68 61 6e  area rather than
e580: 20 63 72 65 61 74 65 20 61 6e 6f 74 68 65 72 0a   create another.
e590: 20 20 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20      ** freelist 
e5a0: 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20 69 66 28  entry */.    if(
e5b0: 20 69 50 74 72 21 3d 68 64 72 2b 31 20 29 20 72   iPtr!=hdr+1 ) r
e5c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
e5d0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 70  RUPT_BKPT;.    p
e5e0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
e5f0: 72 2b 31 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b  r+1], iFreeBlk);
e600: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
e610: 61 74 61 5b 68 64 72 2b 35 5d 2c 20 69 45 6e 64  ata[hdr+5], iEnd
e620: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
e630: 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65  /* Insert the ne
e640: 77 20 66 72 65 65 62 6c 6f 63 6b 20 69 6e 74 6f  w freeblock into
e650: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f   the freelist */
e660: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
e670: 61 74 61 5b 69 50 74 72 5d 2c 20 69 53 74 61 72  ata[iPtr], iStar
e680: 74 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  t);.    put2byte
e690: 28 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c 20  (&data[iStart], 
e6a0: 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70  iFreeBlk);.    p
e6b0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 53  ut2byte(&data[iS
e6c0: 74 61 72 74 2b 32 5d 2c 20 69 53 69 7a 65 29 3b  tart+2], iSize);
e6d0: 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 46  .  }.  pPage->nF
e6e0: 72 65 65 20 2b 3d 20 69 4f 72 69 67 53 69 7a 65  ree += iOrigSize
e6f0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
e700: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
e710: 65 63 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20  ecode the flags 
e720: 62 79 74 65 20 28 74 68 65 20 66 69 72 73 74 20  byte (the first 
e730: 62 79 74 65 20 6f 66 20 74 68 65 20 68 65 61 64  byte of the head
e740: 65 72 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a  er) for a page.*
e750: 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  * and initialize
e760: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d   fields of the M
e770: 65 6d 50 61 67 65 20 73 74 72 75 63 74 75 72 65  emPage structure
e780: 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a   accordingly..**
e790: 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c  .** Only the fol
e7a0: 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69  lowing combinati
e7b0: 6f 6e 73 20 61 72 65 20 73 75 70 70 6f 72 74 65  ons are supporte
e7c0: 64 2e 20 20 41 6e 79 74 68 69 6e 67 20 64 69 66  d.  Anything dif
e7d0: 66 65 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61  ferent.** indica
e7e0: 74 65 73 20 61 20 63 6f 72 72 75 70 74 20 64 61  tes a corrupt da
e7f0: 74 61 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a  tabase files:.**
e800: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
e810: 5a 45 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20  ZERODATA.**     
e820: 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41      PTF_ZERODATA
e830: 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20   | PTF_LEAF.**  
e840: 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44         PTF_LEAFD
e850: 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59  ATA | PTF_INTKEY
e860: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
e870: 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49  LEAFDATA | PTF_I
e880: 4e 54 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41 46  NTKEY | PTF_LEAF
e890: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
e8a0: 65 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61  ecodeFlags(MemPa
e8b0: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66  ge *pPage, int f
e8c0: 6c 61 67 42 79 74 65 29 7b 0a 20 20 42 74 53 68  lagByte){.  BtSh
e8d0: 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f  ared *pBt;     /
e8e0: 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67  * A copy of pPag
e8f0: 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73  e->pBt */..  ass
e900: 65 72 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f  ert( pPage->hdrO
e910: 66 66 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70  ffset==(pPage->p
e920: 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30  gno==1 ? 100 : 0
e930: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
e940: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
e950: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
e960: 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d  tex) );.  pPage-
e970: 3e 6c 65 61 66 20 3d 20 28 75 38 29 28 66 6c 61  >leaf = (u8)(fla
e980: 67 42 79 74 65 3e 3e 33 29 3b 20 20 61 73 73 65  gByte>>3);  asse
e990: 72 74 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20  rt( PTF_LEAF == 
e9a0: 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42 79  1<<3 );.  flagBy
e9b0: 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b  te &= ~PTF_LEAF;
e9c0: 0a 20 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50  .  pPage->childP
e9d0: 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61  trSize = 4-4*pPa
e9e0: 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 50 61 67  ge->leaf;.  pPag
e9f0: 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20 3d 20 63  e->xCellSize = c
ea00: 65 6c 6c 53 69 7a 65 50 74 72 3b 0a 20 20 70 42  ellSizePtr;.  pB
ea10: 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
ea20: 20 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d    if( flagByte==
ea30: 28 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20  (PTF_LEAFDATA | 
ea40: 50 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20  PTF_INTKEY) ){. 
ea50: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
ea60: 46 3a 20 52 2d 30 37 32 39 31 2d 33 35 33 32 38  F: R-07291-35328
ea70: 20 41 20 76 61 6c 75 65 20 6f 66 20 35 20 28 30   A value of 5 (0
ea80: 78 30 35 29 20 6d 65 61 6e 73 20 74 68 65 20 70  x05) means the p
ea90: 61 67 65 20 69 73 20 61 6e 0a 20 20 20 20 2a 2a  age is an.    **
eaa0: 20 69 6e 74 65 72 69 6f 72 20 74 61 62 6c 65 20   interior table 
eab0: 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a  b-tree page. */.
eac0: 20 20 20 20 61 73 73 65 72 74 28 20 28 50 54 46      assert( (PTF
ead0: 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 49 4e  _LEAFDATA|PTF_IN
eae0: 54 4b 45 59 29 3d 3d 35 20 29 3b 0a 20 20 20 20  TKEY)==5 );.    
eaf0: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
eb00: 52 2d 32 36 39 30 30 2d 30 39 31 37 36 20 41 20  R-26900-09176 A 
eb10: 76 61 6c 75 65 20 6f 66 20 31 33 20 28 30 78 30  value of 13 (0x0
eb20: 64 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67  d) means the pag
eb30: 65 20 69 73 20 61 0a 20 20 20 20 2a 2a 20 6c 65  e is a.    ** le
eb40: 61 66 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20  af table b-tree 
eb50: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  page. */.    ass
eb60: 65 72 74 28 20 28 50 54 46 5f 4c 45 41 46 44 41  ert( (PTF_LEAFDA
eb70: 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54  TA|PTF_INTKEY|PT
eb80: 46 5f 4c 45 41 46 29 3d 3d 31 33 20 29 3b 0a 20  F_LEAF)==13 );. 
eb90: 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79     pPage->intKey
eba0: 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 50   = 1;.    if( pP
ebb0: 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
ebc0: 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79     pPage->intKey
ebd0: 4c 65 61 66 20 3d 20 31 3b 0a 20 20 20 20 20 20  Leaf = 1;.      
ebe0: 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
ebf0: 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65 43 65  l = btreeParseCe
ec00: 6c 6c 50 74 72 3b 0a 20 20 20 20 7d 65 6c 73 65  llPtr;.    }else
ec10: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69  {.      pPage->i
ec20: 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20  ntKeyLeaf = 0;. 
ec30: 20 20 20 20 20 70 50 61 67 65 2d 3e 78 43 65 6c       pPage->xCel
ec40: 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65  lSize = cellSize
ec50: 50 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20 20  PtrNoPayload;.  
ec60: 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73      pPage->xPars
ec70: 65 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72  eCell = btreePar
ec80: 73 65 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f  seCellPtrNoPaylo
ec90: 61 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  ad;.    }.    pP
eca0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20  age->maxLocal = 
ecb0: 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20  pBt->maxLeaf;.  
ecc0: 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61    pPage->minLoca
ecd0: 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66  l = pBt->minLeaf
ece0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c  ;.  }else if( fl
ecf0: 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f  agByte==PTF_ZERO
ed00: 44 41 54 41 20 29 7b 0a 20 20 20 20 2f 2a 20 45  DATA ){.    /* E
ed10: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33  VIDENCE-OF: R-43
ed20: 33 31 36 2d 33 37 33 30 38 20 41 20 76 61 6c 75  316-37308 A valu
ed30: 65 20 6f 66 20 32 20 28 30 78 30 32 29 20 6d 65  e of 2 (0x02) me
ed40: 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20  ans the page is 
ed50: 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72 69  an.    ** interi
ed60: 6f 72 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20  or index b-tree 
ed70: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  page. */.    ass
ed80: 65 72 74 28 20 28 50 54 46 5f 5a 45 52 4f 44 41  ert( (PTF_ZERODA
ed90: 54 41 29 3d 3d 32 20 29 3b 0a 20 20 20 20 2f 2a  TA)==2 );.    /*
eda0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
edb0: 35 39 36 31 35 2d 34 32 38 32 38 20 41 20 76 61  59615-42828 A va
edc0: 6c 75 65 20 6f 66 20 31 30 20 28 30 78 30 61 29  lue of 10 (0x0a)
edd0: 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20   means the page 
ede0: 69 73 20 61 0a 20 20 20 20 2a 2a 20 6c 65 61 66  is a.    ** leaf
edf0: 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 70 61   index b-tree pa
ee00: 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ge. */.    asser
ee10: 74 28 20 28 50 54 46 5f 5a 45 52 4f 44 41 54 41  t( (PTF_ZERODATA
ee20: 7c 50 54 46 5f 4c 45 41 46 29 3d 3d 31 30 20 29  |PTF_LEAF)==10 )
ee30: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74  ;.    pPage->int
ee40: 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Key = 0;.    pPa
ee50: 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d  ge->intKeyLeaf =
ee60: 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 78   0;.    pPage->x
ee70: 50 61 72 73 65 43 65 6c 6c 20 3d 20 62 74 72 65  ParseCell = btre
ee80: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64  eParseCellPtrInd
ee90: 65 78 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d  ex;.    pPage->m
eea0: 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  axLocal = pBt->m
eeb0: 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61  axLocal;.    pPa
eec0: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70  ge->minLocal = p
eed0: 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  Bt->minLocal;.  
eee0: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45 56  }else{.    /* EV
eef0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 37 36  IDENCE-OF: R-476
ef00: 30 38 2d 35 36 34 36 39 20 41 6e 79 20 6f 74 68  08-56469 Any oth
ef10: 65 72 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  er value for the
ef20: 20 62 2d 74 72 65 65 20 70 61 67 65 20 74 79 70   b-tree page typ
ef30: 65 20 69 73 0a 20 20 20 20 2a 2a 20 61 6e 20 65  e is.    ** an e
ef40: 72 72 6f 72 2e 20 2a 2f 0a 20 20 20 20 72 65 74  rror. */.    ret
ef50: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
ef60: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70  PT_BKPT;.  }.  p
ef70: 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61  Page->max1bytePa
ef80: 79 6c 6f 61 64 20 3d 20 70 42 74 2d 3e 6d 61 78  yload = pBt->max
ef90: 31 62 79 74 65 50 61 79 6c 6f 61 64 3b 0a 20 20  1bytePayload;.  
efa0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
efb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
efc0: 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69  alize the auxili
efd0: 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ary information 
efe0: 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b  for a disk block
eff0: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
f000: 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
f010: 65 73 73 2e 20 20 49 66 20 77 65 20 73 65 65 20  ess.  If we see 
f020: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 64 6f  that the page do
f030: 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69  es.** not contai
f040: 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20  n a well-formed 
f050: 64 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 74  database page, t
f060: 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53  hen return .** S
f070: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20  QLITE_CORRUPT.  
f080: 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65 74 75  Note that a retu
f090: 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20  rn of SQLITE_OK 
f0a0: 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72  does not.** guar
f0b0: 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 70  antee that the p
f0c0: 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d  age is well-form
f0d0: 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f  ed.  It only sho
f0e0: 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61  ws that.** we fa
f0f0: 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74 20 61  iled to detect a
f100: 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a  ny corruption..*
f110: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
f120: 65 65 49 6e 69 74 50 61 67 65 28 4d 65 6d 50 61  eeInitPage(MemPa
f130: 67 65 20 2a 70 50 61 67 65 29 7b 0a 0a 20 20 61  ge *pPage){..  a
f140: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
f150: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
f160: 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 64 62  ( pPage->pBt->db
f170: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
f180: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
f190: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
f1a0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
f1b0: 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d  rt( pPage->pgno=
f1c0: 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67  =sqlite3PagerPag
f1d0: 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70  enumber(pPage->p
f1e0: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
f1f0: 65 72 74 28 20 70 50 61 67 65 20 3d 3d 20 73 71  ert( pPage == sq
f200: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
f210: 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ra(pPage->pDbPag
f220: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
f230: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20  pPage->aData == 
f240: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
f250: 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ata(pPage->pDbPa
f260: 67 65 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 70  ge) );..  if( !p
f270: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a  Page->isInit ){.
f280: 20 20 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20      int pc;     
f290: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
f2a0: 73 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b  s of a freeblock
f2b0: 20 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61   within pPage->a
f2c0: 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 20 20 75 38  Data[] */.    u8
f2d0: 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20   hdr;           
f2e0: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65   /* Offset to be
f2f0: 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20  ginning of page 
f300: 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 38  header */.    u8
f310: 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
f320: 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61   /* Equal to pPa
f330: 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 20  ge->aData */.   
f340: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
f350: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
f360: 69 6e 20 62 74 72 65 65 20 73 74 72 75 63 74 75  in btree structu
f370: 72 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 73  re */.    int us
f380: 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20  ableSize;    /* 
f390: 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c 65  Amount of usable
f3a0: 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70   space on each p
f3b0: 61 67 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 63  age */.    u16 c
f3c0: 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a  ellOffset;    /*
f3d0: 20 4f 66 66 73 65 74 20 66 72 6f 6d 20 73 74 61   Offset from sta
f3e0: 72 74 20 6f 66 20 70 61 67 65 20 74 6f 20 66 69  rt of page to fi
f3f0: 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  rst cell pointer
f400: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 46 72 65   */.    int nFre
f410: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  e;         /* Nu
f420: 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62  mber of unused b
f430: 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65  ytes on the page
f440: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b   */.    int top;
f450: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
f460: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
f470: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
f480: 61 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65  a */.    int iCe
f490: 6c 6c 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 46  llFirst;    /* F
f4a0: 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63  irst allowable c
f4b0: 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b  ell or freeblock
f4c0: 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 69   offset */.    i
f4d0: 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20  nt iCellLast;   
f4e0: 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62    /* Last possib
f4f0: 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62  le cell or freeb
f500: 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 0a  lock offset */..
f510: 20 20 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d      pBt = pPage-
f520: 3e 70 42 74 3b 0a 0a 20 20 20 20 68 64 72 20 3d  >pBt;..    hdr =
f530: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
f540: 74 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50  t;.    data = pP
f550: 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  age->aData;.    
f560: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
f570: 52 2d 32 38 35 39 34 2d 30 32 38 39 30 20 54 68  R-28594-02890 Th
f580: 65 20 6f 6e 65 2d 62 79 74 65 20 66 6c 61 67 20  e one-byte flag 
f590: 61 74 20 6f 66 66 73 65 74 20 30 20 69 6e 64 69  at offset 0 indi
f5a0: 63 61 74 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68  cating.    ** th
f5b0: 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 74 79  e b-tree page ty
f5c0: 70 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 64  pe. */.    if( d
f5d0: 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65  ecodeFlags(pPage
f5e0: 2c 20 64 61 74 61 5b 68 64 72 5d 29 20 29 20 72  , data[hdr]) ) r
f5f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
f600: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61  RUPT_BKPT;.    a
f610: 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65  ssert( pBt->page
f620: 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74  Size>=512 && pBt
f630: 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33  ->pageSize<=6553
f640: 36 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  6 );.    pPage->
f650: 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29  maskPage = (u16)
f660: 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  (pBt->pageSize -
f670: 20 31 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e   1);.    pPage->
f680: 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  nOverflow = 0;. 
f690: 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20     usableSize = 
f6a0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
f6b0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c  .    pPage->cell
f6c0: 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66  Offset = cellOff
f6d0: 73 65 74 20 3d 20 68 64 72 20 2b 20 38 20 2b 20  set = hdr + 8 + 
f6e0: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
f6f0: 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ize;.    pPage->
f700: 61 44 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61  aDataEnd = &data
f710: 5b 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20  [usableSize];.  
f720: 20 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64    pPage->aCellId
f730: 78 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66  x = &data[cellOf
f740: 66 73 65 74 5d 3b 0a 20 20 20 20 70 50 61 67 65  fset];.    pPage
f750: 2d 3e 61 44 61 74 61 4f 66 73 74 20 3d 20 26 64  ->aDataOfst = &d
f760: 61 74 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64  ata[pPage->child
f770: 50 74 72 53 69 7a 65 5d 3b 0a 20 20 20 20 2f 2a  PtrSize];.    /*
f780: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
f790: 35 38 30 31 35 2d 34 38 31 37 35 20 54 68 65 20  58015-48175 The 
f7a0: 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72  two-byte integer
f7b0: 20 61 74 20 6f 66 66 73 65 74 20 35 20 64 65 73   at offset 5 des
f7c0: 69 67 6e 61 74 65 73 0a 20 20 20 20 2a 2a 20 74  ignates.    ** t
f7d0: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
f7e0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
f7f0: 61 2e 20 41 20 7a 65 72 6f 20 76 61 6c 75 65 20  a. A zero value 
f800: 66 6f 72 20 74 68 69 73 20 69 6e 74 65 67 65 72  for this integer
f810: 20 69 73 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72   is.    ** inter
f820: 70 72 65 74 65 64 20 61 73 20 36 35 35 33 36 2e  preted as 65536.
f830: 20 2a 2f 0a 20 20 20 20 74 6f 70 20 3d 20 67 65   */.    top = ge
f840: 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64  t2byteNotZero(&d
f850: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20  ata[hdr+5]);.   
f860: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
f870: 20 52 2d 33 37 30 30 32 2d 33 32 37 37 34 20 54   R-37002-32774 T
f880: 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65  he two-byte inte
f890: 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 33 20  ger at offset 3 
f8a0: 67 69 76 65 73 20 74 68 65 0a 20 20 20 20 2a 2a  gives the.    **
f8b0: 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   number of cells
f8c0: 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f   on the page. */
f8d0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  .    pPage->nCel
f8e0: 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  l = get2byte(&da
f8f0: 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20  ta[hdr+3]);.    
f900: 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  if( pPage->nCell
f910: 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b  >MX_CELL(pBt) ){
f920: 0a 20 20 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e  .      /* To man
f930: 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69  y cells for a si
f940: 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20  ngle page.  The 
f950: 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72  page must be cor
f960: 72 75 70 74 20 2a 2f 0a 20 20 20 20 20 20 72 65  rupt */.      re
f970: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
f980: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
f990: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50      testcase( pP
f9a0: 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43  age->nCell==MX_C
f9b0: 45 4c 4c 28 70 42 74 29 20 29 3b 0a 20 20 20 20  ELL(pBt) );.    
f9c0: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
f9d0: 52 2d 32 34 30 38 39 2d 35 37 39 37 39 20 49 66  R-24089-57979 If
f9e0: 20 61 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73   a page contains
f9f0: 20 6e 6f 20 63 65 6c 6c 73 20 28 77 68 69 63 68   no cells (which
fa00: 20 69 73 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20   is only.    ** 
fa10: 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 72  possible for a r
fa20: 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 74 61  oot page of a ta
fa30: 62 6c 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ble that contain
fa40: 73 20 6e 6f 20 72 6f 77 73 29 20 74 68 65 6e 20  s no rows) then 
fa50: 74 68 65 0a 20 20 20 20 2a 2a 20 6f 66 66 73 65  the.    ** offse
fa60: 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  t to the cell co
fa70: 6e 74 65 6e 74 20 61 72 65 61 20 77 69 6c 6c 20  ntent area will 
fa80: 65 71 75 61 6c 20 74 68 65 20 70 61 67 65 20 73  equal the page s
fa90: 69 7a 65 20 6d 69 6e 75 73 20 74 68 65 0a 20 20  ize minus the.  
faa0: 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 72 65    ** bytes of re
fab0: 73 65 72 76 65 64 20 73 70 61 63 65 2e 20 2a 2f  served space. */
fac0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
fad0: 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 74  ge->nCell>0 || t
fae0: 6f 70 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c  op==usableSize |
faf0: 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
fb00: 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c 66 6f 72  .    /* A malfor
fb10: 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61 67  med database pag
fb20: 65 20 6d 69 67 68 74 20 63 61 75 73 65 20 75 73  e might cause us
fb30: 20 74 6f 20 72 65 61 64 20 70 61 73 74 20 74 68   to read past th
fb40: 65 20 65 6e 64 0a 20 20 20 20 2a 2a 20 6f 66 20  e end.    ** of 
fb50: 70 61 67 65 20 77 68 65 6e 20 70 61 72 73 69 6e  page when parsin
fb60: 67 20 61 20 63 65 6c 6c 2e 20 20 0a 20 20 20 20  g a cell.  .    
fb70: 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f  **.    ** The fo
fb80: 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f 66  llowing block of
fb90: 20 63 6f 64 65 20 63 68 65 63 6b 73 20 65 61 72   code checks ear
fba0: 6c 79 20 74 6f 20 73 65 65 20 69 66 20 61 20 63  ly to see if a c
fbb0: 65 6c 6c 20 65 78 74 65 6e 64 73 0a 20 20 20 20  ell extends.    
fbc0: 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  ** past the end 
fbd0: 6f 66 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  of a page bounda
fbe0: 72 79 20 61 6e 64 20 63 61 75 73 65 73 20 53 51  ry and causes SQ
fbf0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 74 6f 20  LITE_CORRUPT to 
fc00: 62 65 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72  be .    ** retur
fc10: 6e 65 64 20 69 66 20 69 74 20 64 6f 65 73 2e 0a  ned if it does..
fc20: 20 20 20 20 2a 2f 0a 20 20 20 20 69 43 65 6c 6c      */.    iCell
fc30: 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73  First = cellOffs
fc40: 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43  et + 2*pPage->nC
fc50: 65 6c 6c 3b 0a 20 20 20 20 69 43 65 6c 6c 4c 61  ell;.    iCellLa
fc60: 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20  st = usableSize 
fc70: 2d 20 34 3b 0a 20 20 20 20 69 66 28 20 70 42 74  - 4;.    if( pBt
fc80: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
fc90: 4c 49 54 45 5f 43 65 6c 6c 53 69 7a 65 43 6b 20  LITE_CellSizeCk 
fca0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20  ){.      int i; 
fcb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
fcc0: 64 65 78 20 69 6e 74 6f 20 74 68 65 20 63 65 6c  dex into the cel
fcd0: 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20  l pointer array 
fce0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b  */.      int sz;
fcf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
fd00: 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a  ze of a cell */.
fd10: 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67  .      if( !pPag
fd20: 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c  e->leaf ) iCellL
fd30: 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20 66 6f 72  ast--;.      for
fd40: 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e  (i=0; i<pPage->n
fd50: 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
fd60: 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74      pc = get2byt
fd70: 65 41 6c 69 67 6e 65 64 28 26 64 61 74 61 5b 63  eAligned(&data[c
fd80: 65 6c 6c 4f 66 66 73 65 74 2b 69 2a 32 5d 29 3b  ellOffset+i*2]);
fd90: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
fda0: 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73  e( pc==iCellFirs
fdb0: 74 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  t );.        tes
fdc0: 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c  tcase( pc==iCell
fdd0: 4c 61 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Last );.        
fde0: 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73  if( pc<iCellFirs
fdf0: 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73  t || pc>iCellLas
fe00: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  t ){.          r
fe10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
fe20: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
fe30: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 7a 20     }.        sz 
fe40: 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69  = pPage->xCellSi
fe50: 7a 65 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b  ze(pPage, &data[
fe60: 70 63 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65  pc]);.        te
fe70: 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 75  stcase( pc+sz==u
fe80: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
fe90: 20 20 20 20 20 69 66 28 20 70 63 2b 73 7a 3e 75       if( pc+sz>u
fea0: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
feb0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
fec0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
fed0: 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  T;.        }.   
fee0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
fef0: 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43  pPage->leaf ) iC
ff00: 65 6c 6c 4c 61 73 74 2b 2b 3b 0a 20 20 20 20 7d  ellLast++;.    }
ff10: 20 20 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75    ..    /* Compu
ff20: 74 65 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65  te the total fre
ff30: 65 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70  e space on the p
ff40: 61 67 65 0a 20 20 20 20 2a 2a 20 45 56 49 44 45  age.    ** EVIDE
ff50: 4e 43 45 2d 4f 46 3a 20 52 2d 32 33 35 38 38 2d  NCE-OF: R-23588-
ff60: 33 34 34 35 30 20 54 68 65 20 74 77 6f 2d 62 79  34450 The two-by
ff70: 74 65 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66  te integer at of
ff80: 66 73 65 74 20 31 20 67 69 76 65 73 20 74 68 65  fset 1 gives the
ff90: 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 20 6f 66  .    ** start of
ffa0: 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65 62   the first freeb
ffb0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61 67 65  lock on the page
ffc0: 2c 20 6f 72 20 69 73 20 7a 65 72 6f 20 69 66 20  , or is zero if 
ffd0: 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 20  there are no.   
ffe0: 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20   ** freeblocks. 
fff0: 2a 2f 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32  */.    pc = get2
10000 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31  byte(&data[hdr+1
10010 5d 29 3b 0a 20 20 20 20 6e 46 72 65 65 20 3d 20  ]);.    nFree = 
10020 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f  data[hdr+7] + to
10030 70 3b 20 20 2f 2a 20 49 6e 69 74 20 6e 46 72 65  p;  /* Init nFre
10040 65 20 74 6f 20 6e 6f 6e 2d 66 72 65 65 62 6c 6f  e to non-freeblo
10050 63 6b 20 66 72 65 65 20 73 70 61 63 65 20 2a 2f  ck free space */
10060 0a 20 20 20 20 69 66 28 20 70 63 3e 30 20 29 7b  .    if( pc>0 ){
10070 0a 20 20 20 20 20 20 75 33 32 20 6e 65 78 74 2c  .      u32 next,
10080 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28   size;.      if(
10090 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 29   pc<iCellFirst )
100a0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49  {.        /* EVI
100b0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35 33  DENCE-OF: R-5553
100c0 30 2d 35 32 39 33 30 20 49 6e 20 61 20 77 65 6c  0-52930 In a wel
100d0 6c 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65 65 20  l-formed b-tree 
100e0 70 61 67 65 2c 20 74 68 65 72 65 20 77 69 6c 6c  page, there will
100f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61  .        ** alwa
10100 79 73 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f  ys be at least o
10110 6e 65 20 63 65 6c 6c 20 62 65 66 6f 72 65 20 74  ne cell before t
10120 68 65 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f  he first freeblo
10130 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ck..        */. 
10140 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
10150 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
10160 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  T; .      }.    
10170 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
10180 20 20 20 20 20 20 69 66 28 20 70 63 3e 69 43 65        if( pc>iCe
10190 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  llLast ){.      
101a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
101b0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20  E_CORRUPT_BKPT; 
101c0 2f 2a 20 46 72 65 65 62 6c 6f 63 6b 20 6f 66 66  /* Freeblock off
101d0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
101e0 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  page */.        
101f0 7d 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20 3d  }.        next =
10200 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
10210 70 63 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 69  pc]);.        si
10220 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ze = get2byte(&d
10230 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20  ata[pc+2]);.    
10240 20 20 20 20 6e 46 72 65 65 20 3d 20 6e 46 72 65      nFree = nFre
10250 65 20 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20 20  e + size;.      
10260 20 20 69 66 28 20 6e 65 78 74 3c 3d 70 63 2b 73    if( next<=pc+s
10270 69 7a 65 2b 33 20 29 20 62 72 65 61 6b 3b 0a 20  ize+3 ) break;. 
10280 20 20 20 20 20 20 20 70 63 20 3d 20 6e 65 78 74         pc = next
10290 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
102a0 69 66 28 20 6e 65 78 74 3e 30 20 29 7b 0a 20 20  if( next>0 ){.  
102b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
102c0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
102d0 3b 20 20 2f 2a 20 46 72 65 65 62 6c 6f 63 6b 20  ;  /* Freeblock 
102e0 6e 6f 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  not in ascending
102f0 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20   order */.      
10300 7d 0a 20 20 20 20 20 20 69 66 28 20 70 63 2b 73  }.      if( pc+s
10310 69 7a 65 3e 28 75 6e 73 69 67 6e 65 64 20 69 6e  ize>(unsigned in
10320 74 29 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  t)usableSize ){.
10330 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
10340 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
10350 50 54 3b 20 20 2f 2a 20 4c 61 73 74 20 66 72 65  PT;  /* Last fre
10360 65 62 6c 6f 63 6b 20 65 78 74 65 6e 64 73 20 70  eblock extends p
10370 61 73 74 20 70 61 67 65 20 65 6e 64 20 2a 2f 0a  ast page end */.
10380 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
10390 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
103a0 69 6e 74 2c 20 6e 46 72 65 65 20 63 6f 6e 74 61  int, nFree conta
103b0 69 6e 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74  ins the sum of t
103c0 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65  he offset to the
103d0 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 6f 66   start.    ** of
103e0 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e   the cell-conten
103f0 74 20 61 72 65 61 20 70 6c 75 73 20 74 68 65 20  t area plus the 
10400 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 62  number of free b
10410 79 74 65 73 20 77 69 74 68 69 6e 0a 20 20 20 20  ytes within.    
10420 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74  ** the cell-cont
10430 65 6e 74 20 61 72 65 61 2e 20 49 66 20 74 68 69  ent area. If thi
10440 73 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  s is greater tha
10450 6e 20 74 68 65 20 75 73 61 62 6c 65 2d 73 69 7a  n the usable-siz
10460 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  e.    ** of the 
10470 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 70  page, then the p
10480 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72  age must be corr
10490 75 70 74 65 64 2e 20 54 68 69 73 20 63 68 65 63  upted. This chec
104a0 6b 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 73 65  k also.    ** se
104b0 72 76 65 73 20 74 6f 20 76 65 72 69 66 79 20 74  rves to verify t
104c0 68 61 74 20 74 68 65 20 6f 66 66 73 65 74 20 74  hat the offset t
104d0 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
104e0 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a  he cell-content.
104f0 20 20 20 20 2a 2a 20 61 72 65 61 2c 20 61 63 63      ** area, acc
10500 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61  ording to the pa
10510 67 65 20 68 65 61 64 65 72 2c 20 6c 69 65 73 20  ge header, lies 
10520 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e  within the page.
10530 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
10540 6e 46 72 65 65 3e 75 73 61 62 6c 65 53 69 7a 65  nFree>usableSize
10550 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
10560 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
10570 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20  BKPT; .    }.   
10580 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20   pPage->nFree = 
10590 28 75 31 36 29 28 6e 46 72 65 65 20 2d 20 69 43  (u16)(nFree - iC
105a0 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20 20 20 70  ellFirst);.    p
105b0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31  Page->isInit = 1
105c0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
105d0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
105e0 2a 2a 20 53 65 74 20 75 70 20 61 20 72 61 77 20  ** Set up a raw 
105f0 70 61 67 65 20 73 6f 20 74 68 61 74 20 69 74 20  page so that it 
10600 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61 74  looks like a dat
10610 61 62 61 73 65 20 70 61 67 65 20 68 6f 6c 64 69  abase page holdi
10620 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73  ng.** no entries
10630 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
10640 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50 61 67   zeroPage(MemPag
10650 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c  e *pPage, int fl
10660 61 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  ags){.  unsigned
10670 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50   char *data = pP
10680 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74  age->aData;.  Bt
10690 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
106a0 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68  age->pBt;.  u8 h
106b0 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
106c0 66 66 73 65 74 3b 0a 20 20 75 31 36 20 66 69 72  ffset;.  u16 fir
106d0 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  st;..  assert( s
106e0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e  qlite3PagerPagen
106f0 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62  umber(pPage->pDb
10700 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67  Page)==pPage->pg
10710 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  no );.  assert( 
10720 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
10730 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50  xtra(pPage->pDbP
10740 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70  age) == (void*)p
10750 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
10760 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
10770 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62  tData(pPage->pDb
10780 50 61 67 65 29 20 3d 3d 20 64 61 74 61 20 29 3b  Page) == data );
10790 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
107a0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
107b0 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
107c0 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
107d0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
107e0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
107f0 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73  ;.  if( pBt->bts
10800 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55  Flags & BTS_SECU
10810 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20  RE_DELETE ){.   
10820 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64   memset(&data[hd
10830 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61 62  r], 0, pBt->usab
10840 6c 65 53 69 7a 65 20 2d 20 68 64 72 29 3b 0a 20  leSize - hdr);. 
10850 20 7d 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d   }.  data[hdr] =
10860 20 28 63 68 61 72 29 66 6c 61 67 73 3b 0a 20 20   (char)flags;.  
10870 66 69 72 73 74 20 3d 20 68 64 72 20 2b 20 28 28  first = hdr + ((
10880 66 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d  flags&PTF_LEAF)=
10890 3d 30 20 3f 20 31 32 20 3a 20 38 29 3b 0a 20 20  =0 ? 12 : 8);.  
108a0 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72  memset(&data[hdr
108b0 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61  +1], 0, 4);.  da
108c0 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20  ta[hdr+7] = 0;. 
108d0 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
108e0 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61  hdr+5], pBt->usa
108f0 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67  bleSize);.  pPag
10900 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29  e->nFree = (u16)
10910 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
10920 20 2d 20 66 69 72 73 74 29 3b 0a 20 20 64 65 63   - first);.  dec
10930 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20  odeFlags(pPage, 
10940 66 6c 61 67 73 29 3b 0a 20 20 70 50 61 67 65 2d  flags);.  pPage-
10950 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69  >cellOffset = fi
10960 72 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44  rst;.  pPage->aD
10970 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b 70  ataEnd = &data[p
10980 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 3b  Bt->usableSize];
10990 0a 20 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49  .  pPage->aCellI
109a0 64 78 20 3d 20 26 64 61 74 61 5b 66 69 72 73 74  dx = &data[first
109b0 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74  ];.  pPage->aDat
109c0 61 4f 66 73 74 20 3d 20 26 64 61 74 61 5b 70 50  aOfst = &data[pP
109d0 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
109e0 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76  e];.  pPage->nOv
109f0 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 61 73  erflow = 0;.  as
10a00 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53  sert( pBt->pageS
10a10 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d  ize>=512 && pBt-
10a20 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36  >pageSize<=65536
10a30 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73   );.  pPage->mas
10a40 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28 70 42  kPage = (u16)(pB
10a50 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 29  t->pageSize - 1)
10a60 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ;.  pPage->nCell
10a70 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69   = 0;.  pPage->i
10a80 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f  sInit = 1;.}.../
10a90 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 44  *.** Convert a D
10aa0 62 50 61 67 65 20 6f 62 74 61 69 6e 65 64 20 66  bPage obtained f
10ab0 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 69 6e  rom the pager in
10ac0 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 75 73 65  to a MemPage use
10ad0 64 20 62 79 0a 2a 2a 20 74 68 65 20 62 74 72 65  d by.** the btre
10ae0 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74  e layer..*/.stat
10af0 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65  ic MemPage *btre
10b00 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28  ePageFromDbPage(
10b10 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c  DbPage *pDbPage,
10b20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53 68   Pgno pgno, BtSh
10b30 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65  ared *pBt){.  Me
10b40 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 28  mPage *pPage = (
10b50 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33  MemPage*)sqlite3
10b60 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44  PagerGetExtra(pD
10b70 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 70 67  bPage);.  if( pg
10b80 6e 6f 21 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20  no!=pPage->pgno 
10b90 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 44  ){.    pPage->aD
10ba0 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ata = sqlite3Pag
10bb0 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
10bc0 65 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70  e);.    pPage->p
10bd0 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65  DbPage = pDbPage
10be0 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 42 74  ;.    pPage->pBt
10bf0 20 3d 20 70 42 74 3b 0a 20 20 20 20 70 50 61 67   = pBt;.    pPag
10c00 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a  e->pgno = pgno;.
10c10 20 20 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66      pPage->hdrOf
10c20 66 73 65 74 20 3d 20 70 67 6e 6f 3d 3d 31 20 3f  fset = pgno==1 ?
10c30 20 31 30 30 20 3a 20 30 3b 0a 20 20 7d 0a 20 20   100 : 0;.  }.  
10c40 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61  assert( pPage->a
10c50 44 61 74 61 3d 3d 73 71 6c 69 74 65 33 50 61 67  Data==sqlite3Pag
10c60 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
10c70 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  e) );.  return p
10c80 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page; .}../*.** 
10c90 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20  Get a page from 
10ca0 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74  the pager.  Init
10cb0 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61  ialize the MemPa
10cc0 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65  ge.pBt and.** Me
10cd0 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d  mPage.aData elem
10ce0 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 20  ents if needed. 
10cf0 20 53 65 65 20 61 6c 73 6f 3a 20 62 74 72 65 65   See also: btree
10d00 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 29 2e  GetUnusedPage().
10d10 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 41  .**.** If the PA
10d20 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
10d30 54 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 69  T flag is set, i
10d40 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  t means that we 
10d50 64 6f 20 6e 6f 74 20 63 61 72 65 0a 2a 2a 20 61  do not care.** a
10d60 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  bout the content
10d70 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 74 20   of the page at 
10d80 74 68 69 73 20 74 69 6d 65 2e 20 20 53 6f 20 64  this time.  So d
10d90 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65 20  o not go to the 
10da0 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68  disk.** to fetch
10db0 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a   the content.  J
10dc0 75 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 20  ust fill in the 
10dd0 63 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72  content with zer
10de0 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49  os for now..** I
10df0 66 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20  f in the future 
10e00 77 65 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50  we call sqlite3P
10e10 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74  agerWrite() on t
10e20 68 69 73 20 70 61 67 65 2c 20 74 68 61 74 0a 2a  his page, that.*
10e30 2a 20 6d 65 61 6e 73 20 77 65 20 68 61 76 65 20  * means we have 
10e40 73 74 61 72 74 65 64 20 74 6f 20 62 65 20 63 6f  started to be co
10e50 6e 63 65 72 6e 65 64 20 61 62 6f 75 74 20 63 6f  ncerned about co
10e60 6e 74 65 6e 74 20 61 6e 64 20 74 68 65 20 64 69  ntent and the di
10e70 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c  sk.** read shoul
10e80 64 20 6f 63 63 75 72 20 61 74 20 74 68 61 74 20  d occur at that 
10e90 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  point..*/.static
10ea0 20 69 6e 74 20 62 74 72 65 65 47 65 74 50 61 67   int btreeGetPag
10eb0 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
10ec0 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  Bt,       /* The
10ed0 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f   btree */.  Pgno
10ee0 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
10ef0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68   /* Number of th
10f00 65 20 70 61 67 65 20 74 6f 20 66 65 74 63 68 20  e page to fetch 
10f10 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  */.  MemPage **p
10f20 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74  pPage,    /* Ret
10f30 75 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20  urn the page in 
10f40 74 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a  this parameter *
10f50 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
10f60 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45           /* PAGE
10f70 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20  R_GET_NOCONTENT 
10f80 6f 72 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41  or PAGER_GET_REA
10f90 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e  DONLY */.){.  in
10fa0 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a  t rc;.  DbPage *
10fb0 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65  pDbPage;..  asse
10fc0 72 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20  rt( flags==0 || 
10fd0 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47 45 54  flags==PAGER_GET
10fe0 5f 4e 4f 43 4f 4e 54 45 4e 54 20 7c 7c 20 66 6c  _NOCONTENT || fl
10ff0 61 67 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f 52  ags==PAGER_GET_R
11000 45 41 44 4f 4e 4c 59 20 29 3b 0a 20 20 61 73 73  EADONLY );.  ass
11010 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
11020 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
11030 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ex) );.  rc = sq
11040 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
11050 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  t->pPager, pgno,
11060 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50   (DbPage**)&pDbP
11070 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69  age, flags);.  i
11080 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
11090 63 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 62  c;.  *ppPage = b
110a0 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61  treePageFromDbPa
110b0 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f  ge(pDbPage, pgno
110c0 2c 20 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e  , pBt);.  return
110d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
110e0 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20  *.** Retrieve a 
110f0 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
11100 67 65 72 20 63 61 63 68 65 2e 20 49 66 20 74 68  ger cache. If th
11110 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
11120 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61   is not.** alrea
11130 64 79 20 69 6e 20 74 68 65 20 70 61 67 65 72 20  dy in the pager 
11140 63 61 63 68 65 20 72 65 74 75 72 6e 20 4e 55 4c  cache return NUL
11150 4c 2e 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  L. Initialize th
11160 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e  e MemPage.pBt an
11170 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61  d.** MemPage.aDa
11180 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e  ta elements if n
11190 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eeded..*/.static
111a0 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50   MemPage *btreeP
111b0 61 67 65 4c 6f 6f 6b 75 70 28 42 74 53 68 61 72  ageLookup(BtShar
111c0 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67  ed *pBt, Pgno pg
111d0 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70  no){.  DbPage *p
111e0 44 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74  DbPage;.  assert
111f0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
11200 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
11210 20 29 3b 0a 20 20 70 44 62 50 61 67 65 20 3d 20   );.  pDbPage = 
11220 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
11230 75 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  up(pBt->pPager, 
11240 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44 62  pgno);.  if( pDb
11250 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Page ){.    retu
11260 72 6e 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d  rn btreePageFrom
11270 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20  DbPage(pDbPage, 
11280 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 7d 0a  pgno, pBt);.  }.
11290 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
112a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
112b0 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
112c0 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67  base file in pag
112d0 65 73 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  es. If there is 
112e0 61 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65  any kind of.** e
112f0 72 72 6f 72 2c 20 72 65 74 75 72 6e 20 28 28 75  rror, return ((u
11300 6e 73 69 67 6e 65 64 20 69 6e 74 29 2d 31 29 2e  nsigned int)-1).
11310 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20  .*/.static Pgno 
11320 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 42  btreePagecount(B
11330 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
11340 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 6e 50 61   return pBt->nPa
11350 67 65 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65  ge;.}.u32 sqlite
11360 33 42 74 72 65 65 4c 61 73 74 50 61 67 65 28 42  3BtreeLastPage(B
11370 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65  tree *p){.  asse
11380 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
11390 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
113a0 0a 20 20 61 73 73 65 72 74 28 20 28 28 70 2d 3e  .  assert( ((p->
113b0 70 42 74 2d 3e 6e 50 61 67 65 29 26 30 78 38 30  pBt->nPage)&0x80
113c0 30 30 30 30 30 29 3d 3d 30 20 29 3b 0a 20 20 72  00000)==0 );.  r
113d0 65 74 75 72 6e 20 62 74 72 65 65 50 61 67 65 63  eturn btreePagec
113e0 6f 75 6e 74 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a  ount(p->pBt);.}.
113f0 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67  ./*.** Get a pag
11400 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  e from the pager
11410 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
11420 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 43 75  it..**.** If pCu
11430 72 21 3d 30 20 74 68 65 6e 20 74 68 65 20 70 61  r!=0 then the pa
11440 67 65 20 69 73 20 62 65 69 6e 67 20 66 65 74 63  ge is being fetc
11450 68 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61  hed as part of a
11460 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 0a 2a   moveToChild().*
11470 2a 20 63 61 6c 6c 2e 20 20 44 6f 20 61 64 64 69  * call.  Do addi
11480 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 20 63 68  tional sanity ch
11490 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61  ecking on the pa
114a0 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ge in this case.
114b0 0a 2a 2a 20 41 6e 64 20 69 66 20 74 68 65 20 66  .** And if the f
114c0 65 74 63 68 20 66 61 69 6c 73 2c 20 74 68 69 73  etch fails, this
114d0 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 64 65   routine must de
114e0 63 72 65 6d 65 6e 74 20 70 43 75 72 2d 3e 69 50  crement pCur->iP
114f0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  age..**.** The p
11500 61 67 65 20 69 73 20 66 65 74 63 68 65 64 20 61  age is fetched a
11510 73 20 72 65 61 64 2d 77 72 69 74 65 20 75 6e 6c  s read-write unl
11520 65 73 73 20 70 43 75 72 20 69 73 20 6e 6f 74 20  ess pCur is not 
11530 4e 55 4c 4c 20 61 6e 64 20 69 73 0a 2a 2a 20 61  NULL and is.** a
11540 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f   read-only curso
11550 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  r..**.** If an e
11560 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
11570 6e 20 2a 70 70 50 61 67 65 20 69 73 20 75 6e 64  n *ppPage is und
11580 65 66 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61  efined. It.** ma
11590 79 20 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67  y remain unchang
115a0 65 64 2c 20 6f 72 20 69 74 20 6d 61 79 20 62 65  ed, or it may be
115b0 20 73 65 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c   set to an inval
115c0 69 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61  id value..*/.sta
115d0 74 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e  tic int getAndIn
115e0 69 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  itPage(.  BtShar
115f0 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
11600 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
11610 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
11620 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
11630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11640 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
11650 20 74 68 65 20 70 61 67 65 20 74 6f 20 67 65 74   the page to get
11660 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
11670 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  ppPage,         
11680 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
11690 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20  he page pointer 
116a0 68 65 72 65 20 2a 2f 0a 20 20 42 74 43 75 72 73  here */.  BtCurs
116b0 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20  or *pCur,       
116c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
116d0 73 6f 72 20 74 6f 20 72 65 63 65 69 76 65 20 74  sor to receive t
116e0 68 65 20 70 61 67 65 2c 20 6f 72 20 4e 55 4c 4c  he page, or NULL
116f0 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 61 64 4f   */.  int bReadO
11700 6e 6c 79 20 20 20 20 20 20 20 20 20 20 20 20 20  nly             
11710 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
11720 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 70 61  r a read-only pa
11730 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ge */.){.  int r
11740 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  c;.  DbPage *pDb
11750 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
11760 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
11770 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
11780 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
11790 3d 3d 30 20 7c 7c 20 70 70 50 61 67 65 3d 3d 26  ==0 || ppPage==&
117a0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
117b0 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61  r->iPage] );.  a
117c0 73 73 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c  ssert( pCur==0 |
117d0 7c 20 62 52 65 61 64 4f 6e 6c 79 3d 3d 70 43 75  | bReadOnly==pCu
117e0 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73  r->curPagerFlags
117f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
11800 75 72 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 69  ur==0 || pCur->i
11810 50 61 67 65 3e 30 20 29 3b 0a 0a 20 20 69 66 28  Page>0 );..  if(
11820 20 70 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63   pgno>btreePagec
11830 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20  ount(pBt) ){.   
11840 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
11850 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67  RUPT_BKPT;.    g
11860 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61  oto getAndInitPa
11870 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  ge_error;.  }.  
11880 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
11890 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
118a0 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a  , pgno, (DbPage*
118b0 2a 29 26 70 44 62 50 61 67 65 2c 20 62 52 65 61  *)&pDbPage, bRea
118c0 64 4f 6e 6c 79 29 3b 0a 20 20 69 66 28 20 72 63  dOnly);.  if( rc
118d0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74   ){.    goto get
118e0 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f  AndInitPage_erro
118f0 72 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65  r;.  }.  *ppPage
11900 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c   = (MemPage*)sql
11910 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
11920 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  a(pDbPage);.  if
11930 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49  ( (*ppPage)->isI
11940 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 62 74  nit==0 ){.    bt
11950 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67  reePageFromDbPag
11960 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c  e(pDbPage, pgno,
11970 20 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d 20   pBt);.    rc = 
11980 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 2a 70  btreeInitPage(*p
11990 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  pPage);.    if( 
119a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
119b0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
119c0 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
119d0 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e     goto getAndIn
119e0 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20  itPage_error;.  
119f0 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
11a00 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 67 6e  ( (*ppPage)->pgn
11a10 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73  o==pgno );.  ass
11a20 65 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e  ert( (*ppPage)->
11a30 61 44 61 74 61 3d 3d 73 71 6c 69 74 65 33 50 61  aData==sqlite3Pa
11a40 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
11a50 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ge) );..  /* If 
11a60 6f 62 74 61 69 6e 69 6e 67 20 61 20 63 68 69 6c  obtaining a chil
11a70 64 20 70 61 67 65 20 66 6f 72 20 61 20 63 75 72  d page for a cur
11a80 73 6f 72 2c 20 77 65 20 6d 75 73 74 20 76 65 72  sor, we must ver
11a90 69 66 79 20 74 68 61 74 20 74 68 65 20 70 61 67  ify that the pag
11aa0 65 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 61 74  e is.  ** compat
11ab0 69 62 6c 65 20 77 69 74 68 20 74 68 65 20 72 6f  ible with the ro
11ac0 6f 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 69 66  ot page. */.  if
11ad0 28 20 70 43 75 72 20 26 26 20 28 28 2a 70 70 50  ( pCur && ((*ppP
11ae0 61 67 65 29 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c  age)->nCell<1 ||
11af0 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 6e 74 4b   (*ppPage)->intK
11b00 65 79 21 3d 70 43 75 72 2d 3e 63 75 72 49 6e 74  ey!=pCur->curInt
11b10 4b 65 79 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  Key) ){.    rc =
11b20 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
11b30 42 4b 50 54 3b 0a 20 20 20 20 72 65 6c 65 61 73  BKPT;.    releas
11b40 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
11b50 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49      goto getAndI
11b60 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20  nitPage_error;. 
11b70 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
11b80 54 45 5f 4f 4b 3b 0a 0a 67 65 74 41 6e 64 49 6e  TE_OK;..getAndIn
11b90 69 74 50 61 67 65 5f 65 72 72 6f 72 3a 0a 20 20  itPage_error:.  
11ba0 69 66 28 20 70 43 75 72 20 29 20 70 43 75 72 2d  if( pCur ) pCur-
11bb0 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 74 65 73 74  >iPage--;.  test
11bc0 63 61 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b  case( pgno==0 );
11bd0 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21  .  assert( pgno!
11be0 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
11bf0 5f 43 4f 52 52 55 50 54 20 29 3b 0a 20 20 72 65  _CORRUPT );.  re
11c00 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
11c10 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50  * Release a MemP
11c20 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c  age.  This shoul
11c30 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65  d be called once
11c40 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a   for each prior.
11c50 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65  ** call to btree
11c60 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  GetPage..*/.stat
11c70 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50  ic void releaseP
11c80 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65 6d 50 61  ageNotNull(MemPa
11c90 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 61 73  ge *pPage){.  as
11ca0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61  sert( pPage->aDa
11cb0 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ta );.  assert( 
11cc0 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20  pPage->pBt );.  
11cd0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
11ce0 44 62 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61  DbPage!=0 );.  a
11cf0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
11d00 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
11d10 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28  e->pDbPage) == (
11d20 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20  void*)pPage );. 
11d30 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
11d40 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61  PagerGetData(pPa
11d50 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50  ge->pDbPage)==pP
11d60 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20  age->aData );.  
11d70 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
11d80 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
11d90 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
11da0 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
11db0 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 61 67  nrefNotNull(pPag
11dc0 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 7d 0a 73  e->pDbPage);.}.s
11dd0 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
11de0 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  sePage(MemPage *
11df0 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50  pPage){.  if( pP
11e00 61 67 65 20 29 20 72 65 6c 65 61 73 65 50 61 67  age ) releasePag
11e10 65 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 29 3b  eNotNull(pPage);
11e20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 6e  .}../*.** Get an
11e30 20 75 6e 75 73 65 64 20 70 61 67 65 2e 0a 2a 2a   unused page..**
11e40 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 6a  .** This works j
11e50 75 73 74 20 6c 69 6b 65 20 62 74 72 65 65 47 65  ust like btreeGe
11e60 74 50 61 67 65 28 29 20 77 69 74 68 20 74 68 65  tPage() with the
11e70 20 61 64 64 69 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a   addition:.**.**
11e80 20 20 20 2a 20 20 49 66 20 74 68 65 20 70 61 67     *  If the pag
11e90 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
11ea0 75 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68  use for some oth
11eb0 65 72 20 70 75 72 70 6f 73 65 2c 20 69 6d 6d 65  er purpose, imme
11ec0 64 69 61 74 65 6c 79 0a 2a 2a 20 20 20 20 20 20  diately.**      
11ed0 72 65 6c 65 61 73 65 20 69 74 20 61 6e 64 20 72  release it and r
11ee0 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f  eturn an SQLITE_
11ef0 43 55 52 52 55 50 54 20 65 72 72 6f 72 2e 0a 2a  CURRUPT error..*
11f00 2a 20 20 20 2a 20 20 4d 61 6b 65 20 73 75 72 65  *   *  Make sure
11f10 20 74 68 65 20 69 73 49 6e 69 74 20 66 6c 61 67   the isInit flag
11f20 20 69 73 20 63 6c 65 61 72 0a 2a 2f 0a 73 74 61   is clear.*/.sta
11f30 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65 74  tic int btreeGet
11f40 55 6e 75 73 65 64 50 61 67 65 28 0a 20 20 42 74  UnusedPage(.  Bt
11f50 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
11f60 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
11f70 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
11f80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
11f90 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
11fa0 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65  to fetch */.  Me
11fb0 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
11fc0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
11fd0 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 70 61   page in this pa
11fe0 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74  rameter */.  int
11ff0 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
12000 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e    /* PAGER_GET_N
12010 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47 45  OCONTENT or PAGE
12020 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a  R_GET_READONLY *
12030 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
12040 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
12050 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  , pgno, ppPage, 
12060 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63  flags);.  if( rc
12070 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
12080 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
12090 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
120a0 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
120b0 67 65 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 72  ge)>1 ){.      r
120c0 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
120d0 67 65 29 3b 0a 20 20 20 20 20 20 2a 70 70 50 61  ge);.      *ppPa
120e0 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  ge = 0;.      re
120f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
12100 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
12110 20 20 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69      (*ppPage)->i
12120 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  sInit = 0;.  }el
12130 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20  se{.    *ppPage 
12140 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
12150 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
12160 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  During a rollbac
12170 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  k, when the page
12180 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d  r reloads inform
12190 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63  ation into the c
121a0 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20  ache.** so that 
121b0 74 68 65 20 63 61 63 68 65 20 69 73 20 72 65 73  the cache is res
121c0 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
121d0 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74  ginal state at t
121e0 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74  he start of.** t
121f0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
12200 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 72 65  for each page re
12210 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74  stored this rout
12220 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
12230 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
12240 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74  e needs to reset
12250 20 74 68 65 20 65 78 74 72 61 20 64 61 74 61 20   the extra data 
12260 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65  section at the e
12270 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67  nd of the.** pag
12280 65 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20  e to agree with 
12290 74 68 65 20 72 65 73 74 6f 72 65 64 20 64 61 74  the restored dat
122a0 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  a..*/.static voi
122b0 64 20 70 61 67 65 52 65 69 6e 69 74 28 44 62 50  d pageReinit(DbP
122c0 61 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d  age *pData){.  M
122d0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
122e0 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67   pPage = (MemPag
122f0 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  e *)sqlite3Pager
12300 47 65 74 45 78 74 72 61 28 70 44 61 74 61 29 3b  GetExtra(pData);
12310 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
12320 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
12330 75 6e 74 28 70 44 61 74 61 29 3e 30 20 29 3b 0a  unt(pData)>0 );.
12340 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49    if( pPage->isI
12350 6e 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nit ){.    asser
12360 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
12370 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
12380 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20  ->mutex) );.    
12390 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
123a0 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  0;.    if( sqlit
123b0 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
123c0 75 6e 74 28 70 44 61 74 61 29 3e 31 20 29 7b 0a  unt(pData)>1 ){.
123d0 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 6d        /* pPage m
123e0 69 67 68 74 20 6e 6f 74 20 62 65 20 61 20 62 74  ight not be a bt
123f0 72 65 65 20 70 61 67 65 3b 20 20 69 74 20 6d 69  ree page;  it mi
12400 67 68 74 20 62 65 20 61 6e 20 6f 76 65 72 66 6c  ght be an overfl
12410 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  ow page.      **
12420 20 6f 72 20 70 74 72 6d 61 70 20 70 61 67 65 20   or ptrmap page 
12430 6f 72 20 61 20 66 72 65 65 20 70 61 67 65 2e 20  or a free page. 
12440 20 49 6e 20 74 68 6f 73 65 20 63 61 73 65 73 2c   In those cases,
12450 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
12460 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20       ** call to 
12470 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
12480 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75  will likely retu
12490 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
124a0 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20  T..      ** But 
124b0 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e 65 20  no harm is done 
124c0 62 79 20 74 68 69 73 2e 20 20 41 6e 64 20 69 74  by this.  And it
124d0 20 69 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61   is very importa
124e0 6e 74 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  nt that.      **
124f0 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
12500 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76   be called on ev
12510 65 72 79 20 62 74 72 65 65 20 70 61 67 65 20 73  ery btree page s
12520 6f 20 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20  o we make.      
12530 2a 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20  ** the call for 
12540 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74 20  every page that 
12550 63 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d  comes in for re-
12560 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  initing. */.    
12570 20 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28    btreeInitPage(
12580 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
12590 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  }.}../*.** Invok
125a0 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
125b0 65 72 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a  er for a btree..
125c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
125d0 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
125e0 64 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67 29  dler(void *pArg)
125f0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
12600 74 20 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70  t = (BtShared*)p
12610 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Arg;.  assert( p
12620 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65  Bt->db );.  asse
12630 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
12640 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e  x_held(pBt->db->
12650 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75  mutex) );.  retu
12660 72 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65  rn sqlite3Invoke
12670 42 75 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74  BusyHandler(&pBt
12680 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65  ->db->busyHandle
12690 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  r);.}../*.** Ope
126a0 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  n a database fil
126b0 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e  e..** .** zFilen
126c0 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ame is the name 
126d0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
126e0 66 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e  file.  If zFilen
126f0 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74  ame is NULL.** t
12700 68 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  hen an ephemeral
12710 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65   database is cre
12720 61 74 65 64 2e 20 20 54 68 65 20 65 70 68 65 6d  ated.  The ephem
12730 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 6d 69  eral database mi
12740 67 68 74 0a 2a 2a 20 62 65 20 65 78 63 6c 75 73  ght.** be exclus
12750 69 76 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c  ively in memory,
12760 20 6f 72 20 69 74 20 6d 69 67 68 74 20 75 73 65   or it might use
12770 20 61 20 64 69 73 6b 2d 62 61 73 65 64 20 6d 65   a disk-based me
12780 6d 6f 72 79 20 63 61 63 68 65 2e 0a 2a 2a 20 45  mory cache..** E
12790 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 65  ither way, the e
127a0 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73  phemeral databas
127b0 65 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61  e will be automa
127c0 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20  tically deleted 
127d0 0a 2a 2a 20 77 68 65 6e 20 73 71 6c 69 74 65 33  .** when sqlite3
127e0 42 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20  BtreeClose() is 
127f0 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  called..**.** If
12800 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a   zFilename is ":
12810 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e  memory:" then an
12820 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
12830 61 73 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ase is created.*
12840 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61  * that is automa
12850 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65  tically destroye
12860 64 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f  d when it is clo
12870 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22  sed..**.** The "
12880 66 6c 61 67 73 22 20 70 61 72 61 6d 65 74 65 72  flags" parameter
12890 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 68   is a bitmask th
128a0 61 74 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  at might contain
128b0 20 62 69 74 73 20 6c 69 6b 65 0a 2a 2a 20 42 54   bits like.** BT
128c0 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c  REE_OMIT_JOURNAL
128d0 20 61 6e 64 2f 6f 72 20 42 54 52 45 45 5f 4d 45   and/or BTREE_ME
128e0 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  MORY..**.** If t
128f0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61  he database is a
12900 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69 6e  lready opened in
12910 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
12920 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a  se connection.**
12930 20 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20 73   and we are in s
12940 68 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64 65  hared cache mode
12950 2c 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e 20  , then the open 
12960 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 61  will fail with a
12970 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53  n.** SQLITE_CONS
12980 54 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20 57  TRAINT error.  W
12990 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74  e cannot allow t
129a0 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68 61  wo or more BtSha
129b0 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69  red.** objects i
129c0 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
129d0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  ase connection s
129e0 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77 69  ince doing so wi
129f0 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72  ll lead.** to pr
12a00 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b  oblems with lock
12a10 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ing..*/.int sqli
12a20 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20  te3BtreeOpen(.  
12a30 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
12a40 73 2c 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74  s,      /* VFS t
12a50 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 62  o use for this b
12a60 2d 74 72 65 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  -tree */.  const
12a70 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
12a80 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ,  /* Name of th
12a90 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e  e file containin
12aa0 67 20 74 68 65 20 42 54 72 65 65 20 64 61 74 61  g the BTree data
12ab0 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  base */.  sqlite
12ac0 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
12ad0 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20    /* Associated 
12ae0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
12af0 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42  */.  Btree **ppB
12b00 74 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  tree,        /* 
12b10 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42  Pointer to new B
12b20 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74  tree object writ
12b30 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  ten here */.  in
12b40 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
12b50 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73        /* Options
12b60 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61   */.  int vfsFla
12b70 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
12b80 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68   Flags passed th
12b90 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33  rough to sqlite3
12ba0 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a  _vfs.xOpen() */.
12bb0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
12bc0 42 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Bt = 0;         
12bd0 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61      /* Shared pa
12be0 72 74 20 6f 66 20 62 74 72 65 65 20 73 74 72 75  rt of btree stru
12bf0 63 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65  cture */.  Btree
12c00 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
12c10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
12c20 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  dle to return */
12c30 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
12c40 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b   *mutexOpen = 0;
12c50 20 20 2f 2a 20 50 72 65 76 65 6e 74 73 20 61 20    /* Prevents a 
12c60 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20  race condition. 
12c70 54 69 63 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a  Ticket #3537 */.
12c80 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
12c90 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
12ca0 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
12cb0 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69  from this functi
12cc0 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65  on */.  u8 nRese
12cd0 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rve;            
12ce0 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f         /* Byte o
12cf0 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 6f  f unused space o
12d00 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20  n each page */. 
12d10 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a   unsigned char z
12d20 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 20 20  DbHeader[100];  
12d30 2f 2a 20 44 61 74 61 62 61 73 65 20 68 65 61 64  /* Database head
12d40 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20  er content */.. 
12d50 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 70 65 6e   /* True if open
12d60 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ing an ephemeral
12d70 2c 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  , temporary data
12d80 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  base */.  const 
12d90 69 6e 74 20 69 73 54 65 6d 70 44 62 20 3d 20 7a  int isTempDb = z
12da0 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a  Filename==0 || z
12db0 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a  Filename[0]==0;.
12dc0 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61  .  /* Set the va
12dd0 72 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74  riable isMemdb t
12de0 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e  o true for an in
12df0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
12e00 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65  , or .  ** false
12e10 20 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65   for a file-base
12e20 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  d database..  */
12e30 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
12e40 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 63  MIT_MEMORYDB.  c
12e50 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62  onst int isMemdb
12e60 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 63 6f   = 0;.#else.  co
12e70 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20  nst int isMemdb 
12e80 3d 20 28 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  = (zFilename && 
12e90 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65  strcmp(zFilename
12ea0 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30  , ":memory:")==0
12eb0 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
12ec0 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 73 54           || (isT
12ed0 65 6d 70 44 62 20 26 26 20 73 71 6c 69 74 65 33  empDb && sqlite3
12ee0 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64 62 29  TempInMemory(db)
12ef0 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
12f00 20 20 20 20 20 20 20 20 20 7c 7c 20 28 76 66 73           || (vfs
12f10 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  Flags & SQLITE_O
12f20 50 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a  PEN_MEMORY)!=0;.
12f30 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
12f40 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( db!=0 );.  ass
12f50 65 72 74 28 20 70 56 66 73 21 3d 30 20 29 3b 0a  ert( pVfs!=0 );.
12f60 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
12f70 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
12f80 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
12f90 65 72 74 28 20 28 66 6c 61 67 73 26 30 78 66 66  ert( (flags&0xff
12fa0 29 3d 3d 66 6c 61 67 73 20 29 3b 20 20 20 2f 2a  )==flags );   /*
12fb0 20 66 6c 61 67 73 20 66 69 74 20 69 6e 20 38 20   flags fit in 8 
12fc0 62 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e  bits */..  /* On
12fd0 6c 79 20 61 20 42 54 52 45 45 5f 53 49 4e 47 4c  ly a BTREE_SINGL
12fe0 45 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62  E database can b
12ff0 65 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45  e BTREE_UNORDERE
13000 44 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  D */.  assert( (
13010 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 55 4e  flags & BTREE_UN
13020 4f 52 44 45 52 45 44 29 3d 3d 30 20 7c 7c 20 28  ORDERED)==0 || (
13030 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49  flags & BTREE_SI
13040 4e 47 4c 45 29 21 3d 30 20 29 3b 0a 0a 20 20 2f  NGLE)!=0 );..  /
13050 2a 20 41 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  * A BTREE_SINGLE
13060 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 77   database is alw
13070 61 79 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ays a temporary 
13080 61 6e 64 2f 6f 72 20 65 70 68 65 6d 65 72 61 6c  and/or ephemeral
13090 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66   */.  assert( (f
130a0 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e  lags & BTREE_SIN
130b0 47 4c 45 29 3d 3d 30 20 7c 7c 20 69 73 54 65 6d  GLE)==0 || isTem
130c0 70 44 62 20 29 3b 0a 0a 20 20 69 66 28 20 69 73  pDb );..  if( is
130d0 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 66 6c 61  Memdb ){.    fla
130e0 67 73 20 7c 3d 20 42 54 52 45 45 5f 4d 45 4d 4f  gs |= BTREE_MEMO
130f0 52 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 76  RY;.  }.  if( (v
13100 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  fsFlags & SQLITE
13110 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d  _OPEN_MAIN_DB)!=
13120 30 20 26 26 20 28 69 73 4d 65 6d 64 62 20 7c 7c  0 && (isMemdb ||
13130 20 69 73 54 65 6d 70 44 62 29 20 29 7b 0a 20 20   isTempDb) ){.  
13140 20 20 76 66 73 46 6c 61 67 73 20 3d 20 28 76 66    vfsFlags = (vf
13150 73 46 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45  sFlags & ~SQLITE
13160 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c  _OPEN_MAIN_DB) |
13170 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d   SQLITE_OPEN_TEM
13180 50 5f 44 42 3b 0a 20 20 7d 0a 20 20 70 20 3d 20  P_DB;.  }.  p = 
13190 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
131a0 6f 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29  o(sizeof(Btree))
131b0 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  ;.  if( !p ){.  
131c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
131d0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a  NOMEM_BKPT;.  }.
131e0 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
131f0 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e  RANS_NONE;.  p->
13200 64 62 20 3d 20 64 62 3b 0a 23 69 66 6e 64 65 66  db = db;.#ifndef
13210 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
13220 52 45 44 5f 43 41 43 48 45 0a 20 20 70 2d 3e 6c  RED_CACHE.  p->l
13230 6f 63 6b 2e 70 42 74 72 65 65 20 3d 20 70 3b 0a  ock.pBtree = p;.
13240 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65    p->lock.iTable
13250 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 23 69   = 1;.#endif..#i
13260 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
13270 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
13280 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  CHE) && !defined
13290 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53  (SQLITE_OMIT_DIS
132a0 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49  KIO).  /*.  ** I
132b0 66 20 74 68 69 73 20 42 74 72 65 65 20 69 73 20  f this Btree is 
132c0 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20  a candidate for 
132d0 73 68 61 72 65 64 20 63 61 63 68 65 2c 20 74 72  shared cache, tr
132e0 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a  y to find an.  *
132f0 2a 20 65 78 69 73 74 69 6e 67 20 42 74 53 68 61  * existing BtSha
13300 72 65 64 20 6f 62 6a 65 63 74 20 74 68 61 74 20  red object that 
13310 77 65 20 63 61 6e 20 73 68 61 72 65 20 77 69 74  we can share wit
13320 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 54  h.  */.  if( isT
13330 65 6d 70 44 62 3d 3d 30 20 26 26 20 28 69 73 4d  empDb==0 && (isM
13340 65 6d 64 62 3d 3d 30 20 7c 7c 20 28 76 66 73 46  emdb==0 || (vfsF
13350 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e  lags&SQLITE_OPEN
13360 5f 55 52 49 29 21 3d 30 29 20 29 7b 0a 20 20 20  _URI)!=0) ){.   
13370 20 69 66 28 20 76 66 73 46 6c 61 67 73 20 26 20   if( vfsFlags & 
13380 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52  SQLITE_OPEN_SHAR
13390 45 44 43 41 43 48 45 20 29 7b 0a 20 20 20 20 20  EDCACHE ){.     
133a0 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 20 3d   int nFilename =
133b0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
133c0 28 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 3b 0a 20  (zFilename)+1;. 
133d0 20 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61       int nFullPa
133e0 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d  thname = pVfs->m
133f0 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20  xPathname+1;.   
13400 20 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61     char *zFullPa
13410 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
13420 4d 61 6c 6c 6f 63 28 4d 41 58 28 6e 46 75 6c 6c  Malloc(MAX(nFull
13430 50 61 74 68 6e 61 6d 65 2c 6e 46 69 6c 65 6e 61  Pathname,nFilena
13440 6d 65 29 29 3b 0a 20 20 20 20 20 20 4d 55 54 45  me));.      MUTE
13450 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
13460 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61  _mutex *mutexSha
13470 72 65 64 3b 20 29 0a 0a 20 20 20 20 20 20 70 2d  red; )..      p-
13480 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20  >sharable = 1;. 
13490 20 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50       if( !zFullP
134a0 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20  athname ){.     
134b0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
134c0 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  p);.        retu
134d0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
134e0 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  BKPT;.      }.  
134f0 20 20 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20      if( isMemdb 
13500 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
13510 79 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  y(zFullPathname,
13520 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 69 6c   zFilename, nFil
13530 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65  ename);.      }e
13540 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
13550 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50  = sqlite3OsFullP
13560 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46  athname(pVfs, zF
13570 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ilename,.       
13580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13590 20 20 20 20 20 20 20 20 20 20 20 20 6e 46 75 6c              nFul
135a0 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c  lPathname, zFull
135b0 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
135c0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
135d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
135e0 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
135f0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
13600 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
13610 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
13620 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
13630 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45      }.#if SQLITE
13640 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20 20 20  _THREADSAFE.    
13650 20 20 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73 71    mutexOpen = sq
13660 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
13670 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
13680 54 49 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20 20  TIC_OPEN);.     
13690 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
136a0 6e 74 65 72 28 6d 75 74 65 78 4f 70 65 6e 29 3b  nter(mutexOpen);
136b0 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68 61 72  .      mutexShar
136c0 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  ed = sqlite3Mute
136d0 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
136e0 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
136f0 52 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  R);.      sqlite
13700 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75  3_mutex_enter(mu
13710 74 65 78 53 68 61 72 65 64 29 3b 0a 23 65 6e 64  texShared);.#end
13720 69 66 0a 20 20 20 20 20 20 66 6f 72 28 70 42 74  if.      for(pBt
13730 3d 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64  =GLOBAL(BtShared
13740 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
13750 61 63 68 65 4c 69 73 74 29 3b 20 70 42 74 3b 20  acheList); pBt; 
13760 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b  pBt=pBt->pNext){
13770 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
13780 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pBt->nRef>0 );.
13790 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73          if( 0==s
137a0 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e  trcmp(zFullPathn
137b0 61 6d 65 2c 20 73 71 6c 69 74 65 33 50 61 67 65  ame, sqlite3Page
137c0 72 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70  rFilename(pBt->p
137d0 50 61 67 65 72 2c 20 30 29 29 0a 20 20 20 20 20  Pager, 0)).     
137e0 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73              && s
137f0 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 70  qlite3PagerVfs(p
13800 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56 66  Bt->pPager)==pVf
13810 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  s ){.          i
13820 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20  nt iDb;.        
13830 20 20 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e 44    for(iDb=db->nD
13840 62 2d 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44 62  b-1; iDb>=0; iDb
13850 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  --){.           
13860 20 42 74 72 65 65 20 2a 70 45 78 69 73 74 69 6e   Btree *pExistin
13870 67 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  g = db->aDb[iDb]
13880 2e 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20  .pBt;.          
13890 20 20 69 66 28 20 70 45 78 69 73 74 69 6e 67 20    if( pExisting 
138a0 26 26 20 70 45 78 69 73 74 69 6e 67 2d 3e 70 42  && pExisting->pB
138b0 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20  t==pBt ){.      
138c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
138d0 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
138e0 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  xShared);.      
138f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
13900 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
13910 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  xOpen);.        
13920 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
13930 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
13940 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
13950 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
13960 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
13970 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
13980 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20 20  NSTRAINT;.      
13990 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
139a0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d    }.          p-
139b0 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20  >pBt = pBt;.    
139c0 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b        pBt->nRef+
139d0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  +;.          bre
139e0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
139f0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
13a00 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
13a10 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
13a20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
13a30 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
13a40 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
13a50 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 65  LITE_DEBUG.    e
13a60 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  lse{.      /* In
13a70 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65 20   debug mode, we 
13a80 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73 74  mark all persist
13a90 65 6e 74 20 64 61 74 61 62 61 73 65 73 20 61 73  ent databases as
13aa0 20 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20 20   sharable.      
13ab0 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65  ** even when the
13ac0 79 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69 73  y are not.  This
13ad0 20 65 78 65 72 63 69 73 65 73 20 74 68 65 20 6c   exercises the l
13ae0 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a  ocking code and.
13af0 20 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20 6d        ** gives m
13b00 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79 20  ore opportunity 
13b10 66 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c 69  for asserts(sqli
13b20 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29  te3_mutex_held()
13b30 29 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65  ).      ** state
13b40 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f  ments to find lo
13b50 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a  cking problems..
13b60 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
13b70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a  ->sharable = 1;.
13b80 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
13b90 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42  .#endif.  if( pB
13ba0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  t==0 ){.    /*. 
13bb0 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     ** The follow
13bc0 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b 65  ing asserts make
13bd0 20 73 75 72 65 20 74 68 61 74 20 73 74 72 75 63   sure that struc
13be0 74 75 72 65 73 20 75 73 65 64 20 62 79 20 74 68  tures used by th
13bf0 65 20 62 74 72 65 65 20 61 72 65 0a 20 20 20 20  e btree are.    
13c00 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73 69 7a  ** the right siz
13c10 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20 67  e.  This is to g
13c20 75 61 72 64 20 61 67 61 69 6e 73 74 20 73 69 7a  uard against siz
13c30 65 20 63 68 61 6e 67 65 73 20 74 68 61 74 20 72  e changes that r
13c40 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65  esult.    ** whe
13c50 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61  n compiling on a
13c60 20 64 69 66 66 65 72 65 6e 74 20 61 72 63 68 69   different archi
13c70 74 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a  tecture..    */.
13c80 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
13c90 6f 66 28 69 36 34 29 3d 3d 38 20 29 3b 0a 20 20  of(i64)==8 );.  
13ca0 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
13cb0 28 75 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20 20  (u64)==8 );.    
13cc0 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75  assert( sizeof(u
13cd0 33 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73  32)==4 );.    as
13ce0 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36  sert( sizeof(u16
13cf0 29 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65  )==2 );.    asse
13d00 72 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29  rt( sizeof(Pgno)
13d10 3d 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42  ==4 );.  .    pB
13d20 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  t = sqlite3Mallo
13d30 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70  cZero( sizeof(*p
13d40 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  Bt) );.    if( p
13d50 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  Bt==0 ){.      r
13d60 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
13d70 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
13d80 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
13d90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
13da0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
13db0 6e 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70 50  n(pVfs, &pBt->pP
13dc0 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  ager, zFilename,
13dd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13de0 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
13df0 66 28 4d 65 6d 50 61 67 65 29 2c 20 66 6c 61 67  f(MemPage), flag
13e00 73 2c 20 76 66 73 46 6c 61 67 73 2c 20 70 61 67  s, vfsFlags, pag
13e10 65 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 69 66  eReinit);.    if
13e20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
13e30 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
13e40 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69  PagerSetMmapLimi
13e50 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 64  t(pBt->pPager, d
13e60 62 2d 3e 73 7a 4d 6d 61 70 29 3b 0a 20 20 20 20  b->szMmap);.    
13e70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
13e80 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65  gerReadFileheade
13e90 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69  r(pBt->pPager,si
13ea0 7a 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c  zeof(zDbHeader),
13eb0 7a 44 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20  zDbHeader);.    
13ec0 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
13ed0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13ee0 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
13ef0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
13f00 70 42 74 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d  pBt->openFlags =
13f10 20 28 75 38 29 66 6c 61 67 73 3b 0a 20 20 20 20   (u8)flags;.    
13f20 70 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20  pBt->db = db;.  
13f30 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
13f40 74 42 75 73 79 68 61 6e 64 6c 65 72 28 70 42 74  tBusyhandler(pBt
13f50 2d 3e 70 50 61 67 65 72 2c 20 62 74 72 65 65 49  ->pPager, btreeI
13f60 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
13f70 2c 20 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70  , pBt);.    p->p
13f80 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20  Bt = pBt;.  .   
13f90 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
13fa0 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67  0;.    pBt->pPag
13fb0 65 31 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  e1 = 0;.    if( 
13fc0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65  sqlite3PagerIsre
13fd0 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67  adonly(pBt->pPag
13fe0 65 72 29 20 29 20 70 42 74 2d 3e 62 74 73 46 6c  er) ) pBt->btsFl
13ff0 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f  ags |= BTS_READ_
14000 4f 4e 4c 59 3b 0a 23 69 66 64 65 66 20 53 51 4c  ONLY;.#ifdef SQL
14010 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  ITE_SECURE_DELET
14020 45 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c  E.    pBt->btsFl
14030 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52  ags |= BTS_SECUR
14040 45 5f 44 45 4c 45 54 45 3b 0a 23 65 6e 64 69 66  E_DELETE;.#endif
14050 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
14060 2d 4f 46 3a 20 52 2d 35 31 38 37 33 2d 33 39 36  -OF: R-51873-396
14070 31 38 20 54 68 65 20 70 61 67 65 20 73 69 7a 65  18 The page size
14080 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20   for a database 
14090 66 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 64  file is.    ** d
140a0 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
140b0 20 32 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20   2-byte integer 
140c0 6c 6f 63 61 74 65 64 20 61 74 20 61 6e 20 6f 66  located at an of
140d0 66 73 65 74 20 6f 66 20 31 36 20 62 79 74 65 73  fset of 16 bytes
140e0 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65   from.    ** the
140f0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
14100 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
14110 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 70 61 67   */.    pBt->pag
14120 65 53 69 7a 65 20 3d 20 28 7a 44 62 48 65 61 64  eSize = (zDbHead
14130 65 72 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 7a 44  er[16]<<8) | (zD
14140 62 48 65 61 64 65 72 5b 31 37 5d 3c 3c 31 36 29  bHeader[17]<<16)
14150 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70  ;.    if( pBt->p
14160 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70  ageSize<512 || p
14170 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c  Bt->pageSize>SQL
14180 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
14190 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28  E.         || ((
141a0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29  pBt->pageSize-1)
141b0 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21  &pBt->pageSize)!
141c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  =0 ){.      pBt-
141d0 3e 70 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a 23  >pageSize = 0;.#
141e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
141f0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
14200 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61      /* If the ma
14210 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72  gic name ":memor
14220 79 3a 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20  y:" will create 
14230 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
14240 61 62 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20  abase, then.    
14250 20 20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61    ** leave the a
14260 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61  utoVacuum mode a
14270 74 20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f  t 0 (do not auto
14280 2d 76 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69  -vacuum), even i
14290 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54  f.      ** SQLIT
142a0 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
142b0 43 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e  CUUM is true. On
142c0 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
142d0 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c   if.      ** SQL
142e0 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
142f0 42 20 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e  B has been defin
14300 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72  ed, then ":memor
14310 79 3a 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20  y:" is just a.  
14320 20 20 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66      ** regular f
14330 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69  ile-name. In thi
14340 73 20 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d  s case the auto-
14350 76 61 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61  vacuum applies a
14360 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20  s per normal..  
14370 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
14380 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69   zFilename && !i
14390 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20  sMemdb ){.      
143a0 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
143b0 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41  m = (SQLITE_DEFA
143c0 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f  ULT_AUTOVACUUM ?
143d0 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20   1 : 0);.       
143e0 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
143f0 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55   = (SQLITE_DEFAU
14400 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32  LT_AUTOVACUUM==2
14410 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20   ? 1 : 0);.     
14420 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
14430 6e 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20  nReserve = 0;.  
14440 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
14450 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
14460 2d 33 37 34 39 37 2d 34 32 34 31 32 20 54 68 65  -37497-42412 The
14470 20 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65 73   size of the res
14480 65 72 76 65 64 20 72 65 67 69 6f 6e 20 69 73 0a  erved region is.
14490 20 20 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69        ** determi
144a0 6e 65 64 20 62 79 20 74 68 65 20 6f 6e 65 2d 62  ned by the one-b
144b0 79 74 65 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  yte unsigned int
144c0 65 67 65 72 20 66 6f 75 6e 64 20 61 74 20 61 6e  eger found at an
144d0 20 6f 66 66 73 65 74 20 6f 66 20 32 30 0a 20 20   offset of 20.  
144e0 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20      ** into the 
144f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65  database file he
14500 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 6e  ader. */.      n
14510 52 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61  Reserve = zDbHea
14520 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70  der[20];.      p
14530 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
14540 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
14550 45 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ED;.#ifndef SQLI
14560 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
14570 55 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75  UM.      pBt->au
14580 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  toVacuum = (get4
14590 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b  byte(&zDbHeader[
145a0 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 4*4])?1:0);
145b0 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72  .      pBt->incr
145c0 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
145d0 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36  te(&zDbHeader[36
145e0 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23   + 7*4])?1:0);.#
145f0 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
14600 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
14610 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74  rSetPagesize(pBt
14620 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e  ->pPager, &pBt->
14630 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72  pageSize, nReser
14640 76 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ve);.    if( rc 
14650 29 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65  ) goto btree_ope
14660 6e 5f 6f 75 74 3b 0a 20 20 20 20 70 42 74 2d 3e  n_out;.    pBt->
14670 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
14680 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65  ->pageSize - nRe
14690 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72  serve;.    asser
146a0 74 28 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  t( (pBt->pageSiz
146b0 65 20 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a  e & 7)==0 );  /*
146c0 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e   8-byte alignmen
146d0 74 20 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f  t of pageSize */
146e0 0a 20 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65  .   .#if !define
146f0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
14700 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21  ARED_CACHE) && !
14710 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
14720 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20  MIT_DISKIO).    
14730 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20 42  /* Add the new B
14740 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74  tShared object t
14750 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  o the linked lis
14760 74 20 73 68 61 72 61 62 6c 65 20 42 74 53 68 61  t sharable BtSha
14770 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  reds..    */.   
14780 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a   pBt->nRef = 1;.
14790 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61      if( p->shara
147a0 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 4d 55 54  ble ){.      MUT
147b0 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65  EX_LOGIC( sqlite
147c0 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68  3_mutex *mutexSh
147d0 61 72 65 64 3b 20 29 0a 20 20 20 20 20 20 4d 55  ared; ).      MU
147e0 54 45 58 5f 4c 4f 47 49 43 28 20 6d 75 74 65 78  TEX_LOGIC( mutex
147f0 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33  Shared = sqlite3
14800 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
14810 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
14820 41 53 54 45 52 29 3b 29 0a 20 20 20 20 20 20 69  ASTER);).      i
14830 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  f( SQLITE_THREAD
14840 53 41 46 45 20 26 26 20 73 71 6c 69 74 65 33 47  SAFE && sqlite3G
14850 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72  lobalConfig.bCor
14860 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20  eMutex ){.      
14870 20 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73    pBt->mutex = s
14880 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
14890 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41  (SQLITE_MUTEX_FA
148a0 53 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ST);.        if(
148b0 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29   pBt->mutex==0 )
148c0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
148d0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
148e0 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  PT;.          go
148f0 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
14900 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
14910 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
14920 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d  e3_mutex_enter(m
14930 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
14940 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20     pBt->pNext = 
14950 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
14960 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
14970 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  cheList);.      
14980 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
14990 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
149a0 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a  cheList) = pBt;.
149b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
149c0 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53  tex_leave(mutexS
149d0 68 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65  hared);.    }.#e
149e0 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64  ndif.  }..#if !d
149f0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
14a00 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
14a10 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
14a20 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29  ITE_OMIT_DISKIO)
14a30 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77  .  /* If the new
14a40 20 42 74 72 65 65 20 75 73 65 73 20 61 20 73 68   Btree uses a sh
14a50 61 72 61 62 6c 65 20 70 42 74 53 68 61 72 65 64  arable pBtShared
14a60 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20  , then link the 
14a70 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69  new.  ** Btree i
14a80 6e 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20  nto the list of 
14a90 61 6c 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72  all sharable Btr
14aa0 65 65 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65  ees for the same
14ab0 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a   connection..  *
14ac0 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65  * The list is ke
14ad0 70 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  pt in ascending 
14ae0 6f 72 64 65 72 20 62 79 20 70 42 74 20 61 64 64  order by pBt add
14af0 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ress..  */.  if(
14b00 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a   p->sharable ){.
14b10 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42      int i;.    B
14b20 74 72 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20  tree *pSib;.    
14b30 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
14b40 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
14b50 69 66 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e  if( (pSib = db->
14b60 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26  aDb[i].pBt)!=0 &
14b70 26 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65  & pSib->sharable
14b80 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   ){.        whil
14b90 65 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29  e( pSib->pPrev )
14ba0 7b 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70  { pSib = pSib->p
14bb0 50 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20  Prev; }.        
14bc0 69 66 28 20 28 75 70 74 72 29 70 2d 3e 70 42 74  if( (uptr)p->pBt
14bd0 3c 28 75 70 74 72 29 70 53 69 62 2d 3e 70 42 74  <(uptr)pSib->pBt
14be0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
14bf0 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a 20  >pNext = pSib;. 
14c00 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65           p->pPre
14c10 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  v = 0;.         
14c20 20 70 53 69 62 2d 3e 70 50 72 65 76 20 3d 20 70   pSib->pPrev = p
14c30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
14c40 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
14c50 28 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 26 26  ( pSib->pNext &&
14c60 20 28 75 70 74 72 29 70 53 69 62 2d 3e 70 4e 65   (uptr)pSib->pNe
14c70 78 74 2d 3e 70 42 74 3c 28 75 70 74 72 29 70 2d  xt->pBt<(uptr)p-
14c80 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  >pBt ){.        
14c90 20 20 20 20 70 53 69 62 20 3d 20 70 53 69 62 2d      pSib = pSib-
14ca0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
14cb0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d    }.          p-
14cc0 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e 70  >pNext = pSib->p
14cd0 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
14ce0 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62 3b  p->pPrev = pSib;
14cf0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
14d00 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ->pNext ){.     
14d10 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d         p->pNext-
14d20 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20  >pPrev = p;.    
14d30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
14d40 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20    pSib->pNext = 
14d50 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
14d60 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14d70 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
14d80 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65 20  ndif.  *ppBtree 
14d90 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e  = p;..btree_open
14da0 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d  _out:.  if( rc!=
14db0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14dc0 20 69 66 28 20 70 42 74 20 26 26 20 70 42 74 2d   if( pBt && pBt-
14dd0 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20  >pPager ){.     
14de0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
14df0 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  se(pBt->pPager, 
14e00 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  0);.    }.    sq
14e10 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b  lite3_free(pBt);
14e20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
14e30 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72  e(p);.    *ppBtr
14e40 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ee = 0;.  }else{
14e50 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  .    sqlite3_fil
14e60 65 20 2a 70 46 69 6c 65 3b 0a 0a 20 20 20 20 2f  e *pFile;..    /
14e70 2a 20 49 66 20 74 68 65 20 42 2d 54 72 65 65 20  * If the B-Tree 
14e80 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
14e90 20 6f 70 65 6e 65 64 2c 20 73 65 74 20 74 68 65   opened, set the
14ea0 20 70 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a   pager-cache siz
14eb0 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  e to the.    ** 
14ec0 64 65 66 61 75 6c 74 20 76 61 6c 75 65 2e 20 45  default value. E
14ed0 78 63 65 70 74 2c 20 77 68 65 6e 20 6f 70 65 6e  xcept, when open
14ee0 69 6e 67 20 6f 6e 20 61 6e 20 65 78 69 73 74 69  ing on an existi
14ef0 6e 67 20 73 68 61 72 65 64 20 70 61 67 65 72 2d  ng shared pager-
14f00 63 61 63 68 65 2c 0a 20 20 20 20 2a 2a 20 64 6f  cache,.    ** do
14f10 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20   not change the 
14f20 70 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65  pager-cache size
14f30 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
14f40 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68   sqlite3BtreeSch
14f50 65 6d 61 28 70 2c 20 30 2c 20 30 29 3d 3d 30 20  ema(p, 0, 0)==0 
14f60 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
14f70 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a  PagerSetCachesiz
14f80 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  e(p->pBt->pPager
14f90 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
14fa0 5f 43 41 43 48 45 5f 53 49 5a 45 29 3b 0a 20 20  _CACHE_SIZE);.  
14fb0 20 20 7d 0a 0a 20 20 20 20 70 46 69 6c 65 20 3d    }..    pFile =
14fc0 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
14fd0 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  e(pBt->pPager);.
14fe0 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70      if( pFile->p
14ff0 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20  Methods ){.     
15000 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
15010 6e 74 72 6f 6c 48 69 6e 74 28 70 46 69 6c 65 2c  ntrolHint(pFile,
15020 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 44   SQLITE_FCNTL_PD
15030 42 2c 20 28 76 6f 69 64 2a 29 26 70 42 74 2d 3e  B, (void*)&pBt->
15040 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  db);.    }.  }. 
15050 20 69 66 28 20 6d 75 74 65 78 4f 70 65 6e 20 29   if( mutexOpen )
15060 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
15070 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
15080 28 6d 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20  (mutexOpen) );. 
15090 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
150a0 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e  _leave(mutexOpen
150b0 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
150c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
150d0 7c 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  | sqlite3BtreeCo
150e0 6e 6e 65 63 74 69 6f 6e 43 6f 75 6e 74 28 2a 70  nnectionCount(*p
150f0 70 42 74 72 65 65 29 3e 30 20 29 3b 0a 20 20 72  pBtree)>0 );.  r
15100 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
15110 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  ** Decrement the
15120 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63   BtShared.nRef c
15130 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e 20 69 74  ounter.  When it
15140 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a   reaches zero,.*
15150 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 42 74 53  * remove the BtS
15160 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65 20  hared structure 
15170 66 72 6f 6d 20 74 68 65 20 73 68 61 72 69 6e 67  from the sharing
15180 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a   list.  Return.*
15190 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 42 74  * true if the Bt
151a0 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e  Shared.nRef coun
151b0 74 65 72 20 72 65 61 63 68 65 73 20 7a 65 72 6f  ter reaches zero
151c0 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66   and return.** f
151d0 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 74  alse if it is st
151e0 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f  ill positive..*/
151f0 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f  .static int remo
15200 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73  veFromSharingLis
15210 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  t(BtShared *pBt)
15220 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
15230 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
15240 48 45 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43  HE.  MUTEX_LOGIC
15250 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20  ( sqlite3_mutex 
15260 2a 70 4d 61 73 74 65 72 3b 20 29 0a 20 20 42 74  *pMaster; ).  Bt
15270 53 68 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20  Shared *pList;. 
15280 20 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20 30   int removed = 0
15290 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
152a0 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65  ite3_mutex_nothe
152b0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
152c0 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28  ;.  MUTEX_LOGIC(
152d0 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74   pMaster = sqlit
152e0 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
152f0 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
15300 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 73 71  _MASTER); ).  sq
15310 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
15320 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 70 42  r(pMaster);.  pB
15330 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28  t->nRef--;.  if(
15340 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b   pBt->nRef<=0 ){
15350 0a 20 20 20 20 69 66 28 20 47 4c 4f 42 41 4c 28  .    if( GLOBAL(
15360 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
15370 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
15380 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20  )==pBt ){.      
15390 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
153a0 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
153b0 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e  cheList) = pBt->
153c0 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65  pNext;.    }else
153d0 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20  {.      pList = 
153e0 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
153f0 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
15400 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  cheList);.      
15410 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4c  while( ALWAYS(pL
15420 69 73 74 29 20 26 26 20 70 4c 69 73 74 2d 3e 70  ist) && pList->p
15430 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a 20 20 20  Next!=pBt ){.   
15440 20 20 20 20 20 70 4c 69 73 74 3d 70 4c 69 73 74       pList=pList
15450 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
15460 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59  .      if( ALWAY
15470 53 28 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20  S(pList) ){.    
15480 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74      pList->pNext
15490 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20   = pBt->pNext;. 
154a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
154b0 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45   if( SQLITE_THRE
154c0 41 44 53 41 46 45 20 29 7b 0a 20 20 20 20 20 20  ADSAFE ){.      
154d0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72  sqlite3_mutex_fr
154e0 65 65 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a  ee(pBt->mutex);.
154f0 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65      }.    remove
15500 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c  d = 1;.  }.  sql
15510 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
15520 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74  (pMaster);.  ret
15530 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c  urn removed;.#el
15540 73 65 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23  se.  return 1;.#
15550 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  endif.}../*.** M
15560 61 6b 65 20 73 75 72 65 20 70 42 74 2d 3e 70 54  ake sure pBt->pT
15570 6d 70 53 70 61 63 65 20 70 6f 69 6e 74 73 20 74  mpSpace points t
15580 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  o an allocation 
15590 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53  of .** MX_CELL_S
155a0 49 5a 45 28 70 42 74 29 20 62 79 74 65 73 20 77  IZE(pBt) bytes w
155b0 69 74 68 20 61 20 34 2d 62 79 74 65 20 70 72 65  ith a 4-byte pre
155c0 66 69 78 20 66 6f 72 20 61 20 6c 65 66 74 2d 63  fix for a left-c
155d0 68 69 6c 64 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e  hild.** pointer.
155e0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
155f0 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63  allocateTempSpac
15600 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
15610 7b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70 54  {.  if( !pBt->pT
15620 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70  mpSpace ){.    p
15630 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  Bt->pTmpSpace = 
15640 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f  sqlite3PageMallo
15650 63 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  c( pBt->pageSize
15660 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e 65 20   );..    /* One 
15670 6f 66 20 74 68 65 20 75 73 65 73 20 6f 66 20 70  of the uses of p
15680 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 69 73  Bt->pTmpSpace is
15690 20 74 6f 20 66 6f 72 6d 61 74 20 63 65 6c 6c 73   to format cells
156a0 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69   before.    ** i
156b0 6e 73 65 72 74 69 6e 67 20 74 68 65 6d 20 69 6e  nserting them in
156c0 74 6f 20 61 20 6c 65 61 66 20 70 61 67 65 20 28  to a leaf page (
156d0 66 75 6e 63 74 69 6f 6e 20 66 69 6c 6c 49 6e 43  function fillInC
156e0 65 6c 6c 28 29 29 2e 20 49 66 0a 20 20 20 20 2a  ell()). If.    *
156f0 2a 20 61 20 63 65 6c 6c 20 69 73 20 6c 65 73 73  * a cell is less
15700 20 74 68 61 6e 20 34 20 62 79 74 65 73 20 69 6e   than 4 bytes in
15710 20 73 69 7a 65 2c 20 69 74 20 69 73 20 72 6f 75   size, it is rou
15720 6e 64 65 64 20 75 70 20 74 6f 20 34 20 62 79 74  nded up to 4 byt
15730 65 73 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65  es.    ** by the
15740 20 76 61 72 69 6f 75 73 20 72 6f 75 74 69 6e 65   various routine
15750 73 20 74 68 61 74 20 6d 61 6e 69 70 75 6c 61 74  s that manipulat
15760 65 20 62 69 6e 61 72 79 20 63 65 6c 6c 73 2e 20  e binary cells. 
15770 57 68 69 63 68 0a 20 20 20 20 2a 2a 20 63 61 6e  Which.    ** can
15780 20 6d 65 61 6e 20 74 68 61 74 20 66 69 6c 6c 49   mean that fillI
15790 6e 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 69 6e 69  nCell() only ini
157a0 74 69 61 6c 69 7a 65 73 20 74 68 65 20 66 69 72  tializes the fir
157b0 73 74 20 32 20 6f 72 20 33 0a 20 20 20 20 2a 2a  st 2 or 3.    **
157c0 20 62 79 74 65 73 20 6f 66 20 70 54 6d 70 53 70   bytes of pTmpSp
157d0 61 63 65 2c 20 62 75 74 20 74 68 61 74 20 74 68  ace, but that th
157e0 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
157f0 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a  are copied from.
15800 20 20 20 20 2a 2a 20 69 74 20 69 6e 74 6f 20 61      ** it into a
15810 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20   database page. 
15820 54 68 69 73 20 69 73 20 6e 6f 74 20 61 63 74 75  This is not actu
15830 61 6c 6c 79 20 61 20 70 72 6f 62 6c 65 6d 2c 20  ally a problem, 
15840 62 75 74 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f  but it.    ** do
15850 65 73 20 63 61 75 73 65 20 61 20 76 61 6c 67 72  es cause a valgr
15860 69 6e 64 20 65 72 72 6f 72 20 77 68 65 6e 20 74  ind error when t
15870 68 65 20 31 20 6f 72 20 32 20 62 79 74 65 73 20  he 1 or 2 bytes 
15880 6f 66 20 75 6e 69 74 69 61 6c 69 7a 65 64 20 0a  of unitialized .
15890 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 70      ** data is p
158a0 61 73 73 65 64 20 74 6f 20 73 79 73 74 65 6d 20  assed to system 
158b0 63 61 6c 6c 20 77 72 69 74 65 28 29 2e 20 53 6f  call write(). So
158c0 20 74 6f 20 61 76 6f 69 64 20 74 68 69 73 20 65   to avoid this e
158d0 72 72 6f 72 2c 0a 20 20 20 20 2a 2a 20 7a 65 72  rror,.    ** zer
158e0 6f 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79  o the first 4 by
158f0 74 65 73 20 6f 66 20 74 65 6d 70 20 73 70 61 63  tes of temp spac
15900 65 20 68 65 72 65 2e 0a 20 20 20 20 2a 2a 0a 20  e here..    **. 
15910 20 20 20 2a 2a 20 41 6c 73 6f 3a 20 20 50 72 6f     ** Also:  Pro
15920 76 69 64 65 20 66 6f 75 72 20 62 79 74 65 73 20  vide four bytes 
15930 6f 66 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 73  of initialized s
15940 70 61 63 65 20 62 65 66 6f 72 65 20 74 68 65 0a  pace before the.
15950 20 20 20 20 2a 2a 20 62 65 67 69 6e 6e 69 6e 67      ** beginning
15960 20 6f 66 20 70 54 6d 70 53 70 61 63 65 20 61 73   of pTmpSpace as
15970 20 61 6e 20 61 72 65 61 20 61 76 61 69 6c 61 62   an area availab
15980 6c 65 20 74 6f 20 70 72 65 70 65 6e 64 20 74 68  le to prepend th
15990 65 0a 20 20 20 20 2a 2a 20 6c 65 66 74 2d 63 68  e.    ** left-ch
159a0 69 6c 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  ild pointer to t
159b0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
159c0 61 20 63 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20  a cell..    */. 
159d0 20 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70     if( pBt->pTmp
159e0 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 6d  Space ){.      m
159f0 65 6d 73 65 74 28 70 42 74 2d 3e 70 54 6d 70 53  emset(pBt->pTmpS
15a00 70 61 63 65 2c 20 30 2c 20 38 29 3b 0a 20 20 20  pace, 0, 8);.   
15a10 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63     pBt->pTmpSpac
15a20 65 20 2b 3d 20 34 3b 0a 20 20 20 20 7d 0a 20 20  e += 4;.    }.  
15a30 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  }.}../*.** Free 
15a40 74 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  the pBt->pTmpSpa
15a50 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f  ce allocation.*/
15a60 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65  .static void fre
15a70 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61  eTempSpace(BtSha
15a80 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28  red *pBt){.  if(
15a90 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
15aa0 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70  ){.    pBt->pTmp
15ab0 53 70 61 63 65 20 2d 3d 20 34 3b 0a 20 20 20 20  Space -= 4;.    
15ac0 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
15ad0 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b  pBt->pTmpSpace);
15ae0 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70  .    pBt->pTmpSp
15af0 61 63 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  ace = 0;.  }.}..
15b00 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f  /*.** Close an o
15b10 70 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64  pen database and
15b20 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
15b30 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20  cursors..*/.int 
15b40 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
15b50 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  e(Btree *p){.  B
15b60 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
15b70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f  ->pBt;.  BtCurso
15b80 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43  r *pCur;..  /* C
15b90 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  lose all cursors
15ba0 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69 73   opened via this
15bb0 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61   handle.  */.  a
15bc0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
15bd0 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
15be0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
15bf0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
15c00 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d  );.  pCur = pBt-
15c10 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c  >pCursor;.  whil
15c20 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42  e( pCur ){.    B
15c30 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20  tCursor *pTmp = 
15c40 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d  pCur;.    pCur =
15c50 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20   pCur->pNext;.  
15c60 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72    if( pTmp->pBtr
15c70 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73  ee==p ){.      s
15c80 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
15c90 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20  Cursor(pTmp);.  
15ca0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f    }.  }..  /* Ro
15cb0 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76  llback any activ
15cc0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  e transaction an
15cd0 64 20 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c  d free the handl
15ce0 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a  e structure..  *
15cf0 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  * The call to sq
15d00 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
15d10 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74  ck() drops any t
15d20 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20  able-locks held 
15d30 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e  by.  ** this han
15d40 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  dle..  */.  sqli
15d50 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
15d60 28 70 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30  (p, SQLITE_OK, 0
15d70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
15d80 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a  eLeave(p);..  /*
15d90 20 49 66 20 74 68 65 72 65 20 61 72 65 20 73 74   If there are st
15da0 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61  ill other outsta
15db0 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
15dc0 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62   to the shared-b
15dd0 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74  tree.  ** struct
15de0 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e  ure, return now.
15df0 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f   The remainder o
15e00 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  f this procedure
15e10 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70   cleans .  ** up
15e20 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
15e30 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
15e40 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d  ( p->wantToLock=
15e50 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d  =0 && p->locked=
15e60 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e  =0 );.  if( !p->
15e70 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f  sharable || remo
15e80 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73  veFromSharingLis
15e90 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a  t(pBt) ){.    /*
15ea0 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c   The pBt is no l
15eb0 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61  onger on the sha
15ec0 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65  ring list, so we
15ed0 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20   can access.    
15ee0 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68 61  ** it without ha
15ef0 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65  ving to hold the
15f00 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20   mutex..    **. 
15f10 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20     ** Clean out 
15f20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 42  and delete the B
15f30 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a  tShared object..
15f40 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
15f50 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72  t( !pBt->pCursor
15f60 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   );.    sqlite3P
15f70 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70  agerClose(pBt->p
15f80 50 61 67 65 72 2c 20 70 2d 3e 64 62 29 3b 0a 20  Pager, p->db);. 
15f90 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65     if( pBt->xFre
15fa0 65 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e  eSchema && pBt->
15fb0 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
15fc0 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d   pBt->xFreeSchem
15fd0 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b  a(pBt->pSchema);
15fe0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
15ff0 65 33 44 62 46 72 65 65 28 30 2c 20 70 42 74 2d  e3DbFree(0, pBt-
16000 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 66  >pSchema);.    f
16010 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
16020 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
16030 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23  ree(pBt);.  }..#
16040 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16050 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
16060 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e    assert( p->wan
16070 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  tToLock==0 );.  
16080 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65  assert( p->locke
16090 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  d==0 );.  if( p-
160a0 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65  >pPrev ) p->pPre
160b0 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e  v->pNext = p->pN
160c0 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e  ext;.  if( p->pN
160d0 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e  ext ) p->pNext->
160e0 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76  pPrev = p->pPrev
160f0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69  ;.#endif..  sqli
16100 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72  te3_free(p);.  r
16110 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16120 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
16130 20 74 68 65 20 22 73 6f 66 74 22 20 6c 69 6d 69   the "soft" limi
16140 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  t on the number 
16150 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
16160 63 61 63 68 65 2e 0a 2a 2a 20 55 6e 75 73 65 64  cache..** Unused
16170 20 61 6e 64 20 75 6e 6d 6f 64 69 66 69 65 64 20   and unmodified 
16180 70 61 67 65 73 20 77 69 6c 6c 20 62 65 20 72 65  pages will be re
16190 63 79 63 6c 65 64 20 77 68 65 6e 20 74 68 65 20  cycled when the 
161a0 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67  number of.** pag
161b0 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  es in the cache 
161c0 65 78 63 65 65 64 73 20 74 68 69 73 20 73 6f 66  exceeds this sof
161d0 74 20 6c 69 6d 69 74 2e 20 20 42 75 74 20 74 68  t limit.  But th
161e0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  e size of the.**
161f0 20 63 61 63 68 65 20 69 73 20 61 6c 6c 6f 77 65   cache is allowe
16200 64 20 74 6f 20 67 72 6f 77 20 6c 61 72 67 65 72  d to grow larger
16210 20 74 68 61 6e 20 74 68 69 73 20 6c 69 6d 69 74   than this limit
16220 20 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a   if it contains.
16230 2a 2a 20 64 69 72 74 79 20 70 61 67 65 73 20 6f  ** dirty pages o
16240 72 20 70 61 67 65 73 20 73 74 69 6c 6c 20 69 6e  r pages still in
16250 20 61 63 74 69 76 65 20 75 73 65 2e 0a 2a 2f 0a   active use..*/.
16260 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
16270 53 65 74 43 61 63 68 65 53 69 7a 65 28 42 74 72  SetCacheSize(Btr
16280 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67  ee *p, int mxPag
16290 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
162a0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
162b0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
162c0 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
162d0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
162e0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
162f0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  p);.  sqlite3Pag
16300 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70  erSetCachesize(p
16310 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61  Bt->pPager, mxPa
16320 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ge);.  sqlite3Bt
16330 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
16340 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16350 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
16360 20 74 68 65 20 22 73 70 69 6c 6c 22 20 6c 69 6d   the "spill" lim
16370 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72  it on the number
16380 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
16390 20 63 61 63 68 65 2e 0a 2a 2a 20 49 66 20 74 68   cache..** If th
163a0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
163b0 73 20 65 78 63 65 65 64 73 20 74 68 69 73 20 6c  s exceeds this l
163c0 69 6d 69 74 20 64 75 72 69 6e 67 20 61 20 77 72  imit during a wr
163d0 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite transaction,
163e0 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 6d 69  .** the pager mi
163f0 67 68 74 20 61 74 74 65 6d 70 74 20 74 6f 20 22  ght attempt to "
16400 73 70 69 6c 6c 22 20 70 61 67 65 73 20 74 6f 20  spill" pages to 
16410 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65 61 72 6c  the journal earl
16420 79 20 69 6e 0a 2a 2a 20 6f 72 64 65 72 20 74 6f  y in.** order to
16430 20 66 72 65 65 20 75 70 20 6d 65 6d 6f 72 79 2e   free up memory.
16440 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  .**.** The value
16450 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
16460 20 63 75 72 72 65 6e 74 20 73 70 69 6c 6c 20 73   current spill s
16470 69 7a 65 2e 20 20 49 66 20 7a 65 72 6f 20 69 73  ize.  If zero is
16480 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 61 6e   passed.** as an
16490 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 20 63 68   argument, no ch
164a0 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74  anges are made t
164b0 6f 20 74 68 65 20 73 70 69 6c 6c 20 73 69 7a 65  o the spill size
164c0 20 73 65 74 74 69 6e 67 2c 20 73 6f 0a 2a 2a 20   setting, so.** 
164d0 75 73 69 6e 67 20 6d 78 50 61 67 65 20 6f 66 20  using mxPage of 
164e0 30 20 69 73 20 61 20 77 61 79 20 74 6f 20 71 75  0 is a way to qu
164f0 65 72 79 20 74 68 65 20 63 75 72 72 65 6e 74 20  ery the current 
16500 73 70 69 6c 6c 20 73 69 7a 65 2e 0a 2a 2f 0a 69  spill size..*/.i
16510 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
16520 65 74 53 70 69 6c 6c 53 69 7a 65 28 42 74 72 65  etSpillSize(Btre
16530 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65  e *p, int mxPage
16540 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
16550 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
16560 6e 74 20 72 65 73 3b 0a 20 20 61 73 73 65 72 74  nt res;.  assert
16570 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
16580 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
16590 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
165a0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
165b0 72 65 73 20 3d 20 73 71 6c 69 74 65 33 50 61 67  res = sqlite3Pag
165c0 65 72 53 65 74 53 70 69 6c 6c 73 69 7a 65 28 70  erSetSpillsize(p
165d0 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61  Bt->pPager, mxPa
165e0 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ge);.  sqlite3Bt
165f0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
16600 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 23 69  eturn res;.}..#i
16610 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
16620 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 43  P_SIZE>0./*.** C
16630 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20  hange the limit 
16640 6f 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  on the amount of
16650 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
16660 6c 65 20 74 68 61 74 20 6d 61 79 20 62 65 0a 2a  le that may be.*
16670 2a 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 2e  * memory mapped.
16680 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
16690 74 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74  treeSetMmapLimit
166a0 28 42 74 72 65 65 20 2a 70 2c 20 73 71 6c 69 74  (Btree *p, sqlit
166b0 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29  e3_int64 szMmap)
166c0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
166d0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
166e0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
166f0 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
16700 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
16710 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
16720 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
16730 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74  SetMmapLimit(pBt
16740 2d 3e 70 50 61 67 65 72 2c 20 73 7a 4d 6d 61 70  ->pPager, szMmap
16750 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
16760 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
16770 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
16780 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
16790 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
167a0 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  0 */../*.** Chan
167b0 67 65 20 74 68 65 20 77 61 79 20 64 61 74 61 20  ge the way data 
167c0 69 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  is synced to dis
167d0 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e  k in order to in
167e0 63 72 65 61 73 65 20 6f 72 20 64 65 63 72 65 61  crease or decrea
167f0 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74  se.** how well t
16800 68 65 20 64 61 74 61 62 61 73 65 20 72 65 73 69  he database resi
16810 73 74 73 20 64 61 6d 61 67 65 20 64 75 65 20 74  sts damage due t
16820 6f 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64  o OS crashes and
16830 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72   power.** failur
16840 65 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20  es.  Level 1 is 
16850 74 68 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e  the same as asyn
16860 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e  chronous (no syn
16870 63 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a  cs() occur and.*
16880 2a 20 74 68 65 72 65 20 69 73 20 61 20 68 69 67  * there is a hig
16890 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  h probability of
168a0 20 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20   damage)  Level 
168b0 32 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  2 is the default
168c0 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61  .  There.** is a
168d0 20 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f   very low but no
168e0 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69  n-zero probabili
168f0 74 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c  ty of damage.  L
16900 65 76 65 6c 20 33 20 72 65 64 75 63 65 73 20 74  evel 3 reduces t
16910 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74  he.** probabilit
16920 79 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e  y of damage to n
16930 65 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74  ear zero but wit
16940 68 20 61 20 77 72 69 74 65 20 70 65 72 66 6f 72  h a write perfor
16950 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e  mance reduction.
16960 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
16970 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
16980 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65  AGMAS.int sqlite
16990 33 42 74 72 65 65 53 65 74 50 61 67 65 72 46 6c  3BtreeSetPagerFl
169a0 61 67 73 28 0a 20 20 42 74 72 65 65 20 2a 70 2c  ags(.  Btree *p,
169b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
169c0 20 54 68 65 20 62 74 72 65 65 20 74 6f 20 73 65   The btree to se
169d0 74 20 74 68 65 20 73 61 66 65 74 79 20 6c 65 76  t the safety lev
169e0 65 6c 20 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69 67  el on */.  unsig
169f0 6e 65 64 20 70 67 46 6c 61 67 73 20 20 20 20 20  ned pgFlags     
16a00 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 50 41 47    /* Various PAG
16a10 45 52 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b  ER_* flags */.){
16a20 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
16a30 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
16a40 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
16a50 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
16a60 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
16a70 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
16a80 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  .  sqlite3PagerS
16a90 65 74 46 6c 61 67 73 28 70 42 74 2d 3e 70 50 61  etFlags(pBt->pPa
16aa0 67 65 72 2c 20 70 67 46 6c 61 67 73 29 3b 0a 20  ger, pgFlags);. 
16ab0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
16ac0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
16ad0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
16ae0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  dif../*.** Chang
16af0 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61  e the default pa
16b00 67 65 73 20 73 69 7a 65 20 61 6e 64 20 74 68 65  ges size and the
16b10 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
16b20 76 65 64 20 62 79 74 65 73 20 70 65 72 20 70 61  ved bytes per pa
16b30 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68  ge..** Or, if th
16b40 65 20 70 61 67 65 20 73 69 7a 65 20 68 61 73 20  e page size has 
16b50 61 6c 72 65 61 64 79 20 62 65 65 6e 20 66 69 78  already been fix
16b60 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ed, return SQLIT
16b70 45 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77  E_READONLY .** w
16b80 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20  ithout changing 
16b90 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  anything..**.** 
16ba0 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 75  The page size mu
16bb0 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66  st be a power of
16bc0 20 32 20 62 65 74 77 65 65 6e 20 35 31 32 20 61   2 between 512 a
16bd0 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20 74 68  nd 65536.  If th
16be0 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73  e page.** size s
16bf0 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74  upplied does not
16c00 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73 74   meet this const
16c10 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20 70  raint then the p
16c20 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a  age size is not.
16c30 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a  ** changed..**.*
16c40 2a 20 50 61 67 65 20 73 69 7a 65 73 20 61 72 65  * Page sizes are
16c50 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f 20   constrained to 
16c60 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77  be a power of tw
16c70 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20 72 65  o so that the re
16c80 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64  gion.** of the d
16c90 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 65  atabase file use
16ca0 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62  d for locking (b
16cb0 65 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44  eginning at PEND
16cc0 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65  ING_BYTE,.** the
16cd0 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74   first byte past
16ce0 20 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61 72   the 1GB boundar
16cf0 79 2c 20 30 78 34 30 30 30 30 30 30 30 29 20 6e  y, 0x40000000) n
16d00 65 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a  eeds to occur.**
16d10 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
16d20 67 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  g of a page..**.
16d30 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
16d40 6e 52 65 73 65 72 76 65 20 69 73 20 6c 65 73 73  nReserve is less
16d50 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
16d60 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
16d70 65 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65 73  eserved.** bytes
16d80 20 70 65 72 20 70 61 67 65 20 69 73 20 6c 65 66   per page is lef
16d90 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  t unchanged..**.
16da0 2a 2a 20 49 66 20 74 68 65 20 69 46 69 78 21 3d  ** If the iFix!=
16db0 30 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50  0 then the BTS_P
16dc0 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20 66 6c  AGESIZE_FIXED fl
16dd0 61 67 20 69 73 20 73 65 74 20 73 6f 20 74 68 61  ag is set so tha
16de0 74 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a  t the page size.
16df0 2a 2a 20 61 6e 64 20 61 75 74 6f 76 61 63 75 75  ** and autovacuu
16e00 6d 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c 6f  m mode can no lo
16e10 6e 67 65 72 20 62 65 20 63 68 61 6e 67 65 64 2e  nger be changed.
16e20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
16e30 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28  treeSetPageSize(
16e40 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61  Btree *p, int pa
16e50 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73  geSize, int nRes
16e60 65 72 76 65 2c 20 69 6e 74 20 69 46 69 78 29 7b  erve, int iFix){
16e70 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
16e80 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65  TE_OK;.  BtShare
16e90 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
16ea0 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65  .  assert( nRese
16eb0 72 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65  rve>=-1 && nRese
16ec0 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71  rve<=255 );.  sq
16ed0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
16ee0 70 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 48  p);.#if SQLITE_H
16ef0 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 6e  AS_CODEC.  if( n
16f00 52 65 73 65 72 76 65 3e 70 42 74 2d 3e 6f 70 74  Reserve>pBt->opt
16f10 69 6d 61 6c 52 65 73 65 72 76 65 20 29 20 70 42  imalReserve ) pB
16f20 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76  t->optimalReserv
16f30 65 20 3d 20 28 75 38 29 6e 52 65 73 65 72 76 65  e = (u8)nReserve
16f40 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  ;.#endif.  if( p
16f50 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
16f60 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
16f70 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  D ){.    sqlite3
16f80 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
16f90 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16fa0 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20  _READONLY;.  }. 
16fb0 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20   if( nReserve<0 
16fc0 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20  ){.    nReserve 
16fd0 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
16fe0 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  - pBt->usableSiz
16ff0 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  e;.  }.  assert(
17000 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20   nReserve>=0 && 
17010 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b  nReserve<=255 );
17020 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e  .  if( pageSize>
17030 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65  =512 && pageSize
17040 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  <=SQLITE_MAX_PAG
17050 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20  E_SIZE &&.      
17060 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26    ((pageSize-1)&
17070 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a  pageSize)==0 ){.
17080 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67      assert( (pag
17090 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
170a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42  .    assert( !pB
170b0 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20  t->pCursor );.  
170c0 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
170d0 3d 20 28 75 33 32 29 70 61 67 65 53 69 7a 65 3b  = (u32)pageSize;
170e0 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61  .    freeTempSpa
170f0 63 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72  ce(pBt);.  }.  r
17100 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
17110 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
17120 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
17130 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76  ageSize, nReserv
17140 65 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c  e);.  pBt->usabl
17150 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67  eSize = pBt->pag
17160 65 53 69 7a 65 20 2d 20 28 75 31 36 29 6e 52 65  eSize - (u16)nRe
17170 73 65 72 76 65 3b 0a 20 20 69 66 28 20 69 46 69  serve;.  if( iFi
17180 78 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  x ) pBt->btsFlag
17190 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a  s |= BTS_PAGESIZ
171a0 45 5f 46 49 58 45 44 3b 0a 20 20 73 71 6c 69 74  E_FIXED;.  sqlit
171b0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
171c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
171d0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
171e0 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69  e currently defi
171f0 6e 65 64 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f  ned page size.*/
17200 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
17210 65 47 65 74 50 61 67 65 53 69 7a 65 28 42 74 72  eGetPageSize(Btr
17220 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  ee *p){.  return
17230 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a   p->pBt->pageSiz
17240 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  e;.}../*.** This
17250 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d   function is sim
17260 69 6c 61 72 20 74 6f 20 73 71 6c 69 74 65 33 42  ilar to sqlite3B
17270 74 72 65 65 47 65 74 52 65 73 65 72 76 65 28 29  treeGetReserve()
17280 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 69 74  , except that it
17290 0a 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  .** may only be 
172a0 63 61 6c 6c 65 64 20 69 66 20 69 74 20 69 73 20  called if it is 
172b0 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20  guaranteed that 
172c0 74 68 65 20 62 2d 74 72 65 65 20 6d 75 74 65 78  the b-tree mutex
172d0 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 68   is already.** h
172e0 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  eld..**.** This 
172f0 69 73 20 75 73 65 66 75 6c 20 69 6e 20 6f 6e 65  is useful in one
17300 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 69 6e   special case in
17310 20 74 68 65 20 62 61 63 6b 75 70 20 41 50 49 20   the backup API 
17320 63 6f 64 65 20 77 68 65 72 65 20 69 74 20 69 73  code where it is
17330 0a 2a 2a 20 6b 6e 6f 77 6e 20 74 68 61 74 20 74  .** known that t
17340 68 65 20 73 68 61 72 65 64 20 62 2d 74 72 65 65  he shared b-tree
17350 20 6d 75 74 65 78 20 69 73 20 68 65 6c 64 2c 20   mutex is held, 
17360 62 75 74 20 74 68 65 20 6d 75 74 65 78 20 6f 6e  but the mutex on
17370 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
17380 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77  e handle that ow
17390 6e 73 20 2a 70 20 69 73 20 6e 6f 74 2e 20 49 6e  ns *p is not. In
173a0 20 74 68 69 73 20 63 61 73 65 20 69 66 20 73 71   this case if sq
173b0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
173c0 29 0a 2a 2a 20 77 65 72 65 20 74 6f 20 62 65 20  ).** were to be 
173d0 63 61 6c 6c 65 64 2c 20 69 74 20 6d 69 67 68 74  called, it might
173e0 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 73 6f   collide with so
173f0 6d 65 20 6f 74 68 65 72 20 6f 70 65 72 61 74 69  me other operati
17400 6f 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74  on on the.** dat
17410 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61  abase handle tha
17420 74 20 6f 77 6e 73 20 2a 70 2c 20 63 61 75 73 69  t owns *p, causi
17430 6e 67 20 75 6e 64 65 66 69 6e 65 64 20 62 65 68  ng undefined beh
17440 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  avior..*/.int sq
17450 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73  lite3BtreeGetRes
17460 65 72 76 65 4e 6f 4d 75 74 65 78 28 42 74 72 65  erveNoMutex(Btre
17470 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  e *p){.  int n;.
17480 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
17490 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
174a0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
174b0 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67   n = p->pBt->pag
174c0 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e  eSize - p->pBt->
174d0 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 72 65  usableSize;.  re
174e0 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
174f0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
17500 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
17510 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20  pace at the end 
17520 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 74 68  of every page th
17530 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74  at.** are intent
17540 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73 65  ually left unuse
17550 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20  d.  This is the 
17560 22 72 65 73 65 72 76 65 64 22 20 73 70 61 63 65  "reserved" space
17570 20 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65   that is.** some
17580 74 69 6d 65 73 20 75 73 65 64 20 62 79 20 65 78  times used by ex
17590 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  tensions..**.** 
175a0 49 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 4d 55  If SQLITE_HAS_MU
175b0 54 45 58 20 69 73 20 64 65 66 69 6e 65 64 20 74  TEX is defined t
175c0 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 72  hen the number r
175d0 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 0a 2a  eturned is the.*
175e0 2a 20 67 72 65 61 74 65 72 20 6f 66 20 74 68 65  * greater of the
175f0 20 63 75 72 72 65 6e 74 20 72 65 73 65 72 76 65   current reserve
17600 64 20 73 70 61 63 65 20 61 6e 64 20 74 68 65 20  d space and the 
17610 6d 61 78 69 6d 75 6d 20 72 65 71 75 65 73 74 65  maximum requeste
17620 64 0a 2a 2a 20 72 65 73 65 72 76 65 20 73 70 61  d.** reserve spa
17630 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ce..*/.int sqlit
17640 65 33 42 74 72 65 65 47 65 74 4f 70 74 69 6d 61  e3BtreeGetOptima
17650 6c 52 65 73 65 72 76 65 28 42 74 72 65 65 20 2a  lReserve(Btree *
17660 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73  p){.  int n;.  s
17670 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
17680 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74  (p);.  n = sqlit
17690 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76  e3BtreeGetReserv
176a0 65 4e 6f 4d 75 74 65 78 28 70 29 3b 0a 23 69 66  eNoMutex(p);.#if
176b0 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
176c0 4f 44 45 43 0a 20 20 69 66 28 20 6e 3c 70 2d 3e  ODEC.  if( n<p->
176d0 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65  pBt->optimalRese
176e0 72 76 65 20 29 20 6e 20 3d 20 70 2d 3e 70 42 74  rve ) n = p->pBt
176f0 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65  ->optimalReserve
17700 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
17710 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
17720 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
17730 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d  ./*.** Set the m
17740 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
17750 74 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65  t for a database
17760 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f   if mxPage is po
17770 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68  sitive..** No ch
17780 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69  anges are made i
17790 66 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72  f mxPage is 0 or
177a0 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65   negative..** Re
177b0 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20  gardless of the 
177c0 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c  value of mxPage,
177d0 20 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69   return the maxi
177e0 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a  mum page count..
177f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
17800 72 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28  reeMaxPageCount(
17810 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78  Btree *p, int mx
17820 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  Page){.  int n;.
17830 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
17840 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71  ter(p);.  n = sq
17850 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67  lite3PagerMaxPag
17860 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70  eCount(p->pBt->p
17870 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a  Pager, mxPage);.
17880 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
17890 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
178a0 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   n;.}../*.** Set
178b0 20 74 68 65 20 42 54 53 5f 53 45 43 55 52 45 5f   the BTS_SECURE_
178c0 44 45 4c 45 54 45 20 66 6c 61 67 20 69 66 20 6e  DELETE flag if n
178d0 65 77 46 6c 61 67 20 69 73 20 30 20 6f 72 20 31  ewFlag is 0 or 1
178e0 2e 20 20 49 66 20 6e 65 77 46 6c 61 67 20 69 73  .  If newFlag is
178f0 20 2d 31 2c 0a 2a 2a 20 74 68 65 6e 20 6d 61 6b   -1,.** then mak
17900 65 20 6e 6f 20 63 68 61 6e 67 65 73 2e 20 20 41  e no changes.  A
17910 6c 77 61 79 73 20 72 65 74 75 72 6e 20 74 68 65  lways return the
17920 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 42 54   value of the BT
17930 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a  S_SECURE_DELETE.
17940 2a 2a 20 73 65 74 74 69 6e 67 20 61 66 74 65 72  ** setting after
17950 20 74 68 65 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a   the change..*/.
17960 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
17970 53 65 63 75 72 65 44 65 6c 65 74 65 28 42 74 72  SecureDelete(Btr
17980 65 65 20 2a 70 2c 20 69 6e 74 20 6e 65 77 46 6c  ee *p, int newFl
17990 61 67 29 7b 0a 20 20 69 6e 74 20 62 3b 0a 20 20  ag){.  int b;.  
179a0 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
179b0 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  n 0;.  sqlite3Bt
179c0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69  reeEnter(p);.  i
179d0 66 28 20 6e 65 77 46 6c 61 67 3e 3d 30 20 29 7b  f( newFlag>=0 ){
179e0 0a 20 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74 73  .    p->pBt->bts
179f0 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 53 45  Flags &= ~BTS_SE
17a00 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20  CURE_DELETE;.   
17a10 20 69 66 28 20 6e 65 77 46 6c 61 67 20 29 20 70   if( newFlag ) p
17a20 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ->pBt->btsFlags 
17a30 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45  |= BTS_SECURE_DE
17a40 4c 45 54 45 3b 0a 20 20 7d 20 0a 20 20 62 20 3d  LETE;.  } .  b =
17a50 20 28 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61   (p->pBt->btsFla
17a60 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f  gs & BTS_SECURE_
17a70 44 45 4c 45 54 45 29 21 3d 30 3b 0a 20 20 73 71  DELETE)!=0;.  sq
17a80 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
17a90 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 3b 0a  p);.  return b;.
17aa0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
17ab0 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d  the 'auto-vacuum
17ac0 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68  ' property of th
17ad0 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74  e database. If t
17ae0 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a  he 'autoVacuum'.
17af0 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
17b00 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61  non-zero, then a
17b10 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20  uto-vacuum mode 
17b20 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a  is enabled. If z
17b30 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69  ero, it.** is di
17b40 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61  sabled. The defa
17b50 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ult value for th
17b60 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72  e auto-vacuum pr
17b70 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65  operty is .** de
17b80 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
17b90 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
17ba0 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e  UTOVACUUM macro.
17bb0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
17bc0 74 72 65 65 53 65 74 41 75 74 6f 56 61 63 75 75  treeSetAutoVacuu
17bd0 6d 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  m(Btree *p, int 
17be0 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66  autoVacuum){.#if
17bf0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17c00 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74  AUTOVACUUM.  ret
17c10 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
17c20 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53  NLY;.#else.  BtS
17c30 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
17c40 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pBt;.  int rc = 
17c50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20  SQLITE_OK;.  u8 
17c60 61 76 20 3d 20 28 75 38 29 61 75 74 6f 56 61 63  av = (u8)autoVac
17c70 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  uum;..  sqlite3B
17c80 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
17c90 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61  if( (pBt->btsFla
17ca0 67 73 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a  gs & BTS_PAGESIZ
17cb0 45 5f 46 49 58 45 44 29 21 3d 30 20 26 26 20 28  E_FIXED)!=0 && (
17cc0 61 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61  av ?1:0)!=pBt->a
17cd0 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
17ce0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
17cf0 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  DONLY;.  }else{.
17d00 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
17d10 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20  uum = av ?1:0;. 
17d20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
17d30 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b  um = av==2 ?1:0;
17d40 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
17d50 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
17d60 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
17d70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
17d80 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
17d90 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20  e 'auto-vacuum' 
17da0 70 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74  property. If aut
17db0 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20  o-vacuum is .** 
17dc0 65 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65 74  enabled 1 is ret
17dd0 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
17de0 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   0..*/.int sqlit
17df0 65 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61  e3BtreeGetAutoVa
17e00 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a  cuum(Btree *p){.
17e10 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
17e20 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
17e30 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54  return BTREE_AUT
17e40 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65  OVACUUM_NONE;.#e
17e50 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  lse.  int rc;.  
17e60 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
17e70 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20  r(p);.  rc = (. 
17e80 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74     (!p->pBt->aut
17e90 6f 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41  oVacuum)?BTREE_A
17ea0 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a  UTOVACUUM_NONE:.
17eb0 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e      (!p->pBt->in
17ec0 63 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f  crVacuum)?BTREE_
17ed0 41 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a  AUTOVACUUM_FULL:
17ee0 0a 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56  .    BTREE_AUTOV
17ef0 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a  ACUUM_INCR.  );.
17f00 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
17f10 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
17f20 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a   rc;.#endif.}...
17f30 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65  /*.** Get a refe
17f40 72 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20  rence to pPage1 
17f50 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
17f60 66 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c  file.  This will
17f70 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65  .** also acquire
17f80 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74   a readlock on t
17f90 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  hat file..**.** 
17fa0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
17fb0 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
17fc0 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  .  If the file i
17fd0 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d  s not a.** well-
17fe0 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
17ff0 66 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54  file, then SQLIT
18000 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65 74  E_CORRUPT is ret
18010 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45  urned..** SQLITE
18020 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
18030 64 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  d if the databas
18040 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51  e is locked.  SQ
18050 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73  LITE_NOMEM.** is
18060 20 72 65 74 75 72 6e 65 64 20 69 66 20 77 65 20   returned if we 
18070 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  run out of memor
18080 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  y. .*/.static in
18090 74 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68  t lockBtree(BtSh
180a0 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e  ared *pBt){.  in
180b0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
180c0 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
180d0 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69  e from subfuncti
180e0 6f 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ons */.  MemPage
180f0 20 2a 70 50 61 67 65 31 3b 20 20 20 20 20 2f 2a   *pPage1;     /*
18100 20 50 61 67 65 20 31 20 6f 66 20 74 68 65 20 64   Page 1 of the d
18110 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
18120 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20    int nPage;    
18130 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
18140 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
18150 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
18160 6e 74 20 6e 50 61 67 65 46 69 6c 65 20 3d 20 30  nt nPageFile = 0
18170 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ;   /* Number of
18180 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
18190 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
181a0 20 69 6e 74 20 6e 50 61 67 65 48 65 61 64 65 72   int nPageHeader
181b0 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
181c0 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
181d0 64 61 74 61 62 61 73 65 20 61 63 63 6f 72 64 69  database accordi
181e0 6e 67 20 74 6f 20 68 64 72 20 2a 2f 0a 0a 20 20  ng to hdr */..  
181f0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
18200 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
18210 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
18220 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d  rt( pBt->pPage1=
18230 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  =0 );.  rc = sql
18240 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64 4c  ite3PagerSharedL
18250 6f 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ock(pBt->pPager)
18260 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
18270 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
18280 63 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 47  c;.  rc = btreeG
18290 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26  etPage(pBt, 1, &
182a0 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69 66  pPage1, 0);.  if
182b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
182c0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
182d0 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b  /* Do some check
182e0 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75  ing to help insu
182f0 72 65 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f  re the file we o
18300 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a  pened really is.
18310 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74    ** a valid dat
18320 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a  abase file. .  *
18330 2f 0a 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67  /.  nPage = nPag
18340 65 48 65 61 64 65 72 20 3d 20 67 65 74 34 62 79  eHeader = get4by
18350 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65  te(28+(u8*)pPage
18360 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 73 71 6c  1->aData);.  sql
18370 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
18380 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
18390 26 6e 50 61 67 65 46 69 6c 65 29 3b 0a 20 20 69  &nPageFile);.  i
183a0 66 28 20 6e 50 61 67 65 3d 3d 30 20 7c 7c 20 6d  f( nPage==0 || m
183b0 65 6d 63 6d 70 28 32 34 2b 28 75 38 2a 29 70 50  emcmp(24+(u8*)pP
183c0 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 39 32 2b  age1->aData, 92+
183d0 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61  (u8*)pPage1->aDa
183e0 74 61 2c 34 29 21 3d 30 20 29 7b 0a 20 20 20 20  ta,4)!=0 ){.    
183f0 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 46 69 6c  nPage = nPageFil
18400 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61  e;.  }.  if( nPa
18410 67 65 3e 30 20 29 7b 0a 20 20 20 20 75 33 32 20  ge>0 ){.    u32 
18420 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 75 33  pageSize;.    u3
18430 32 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  2 usableSize;.  
18440 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70 50    u8 *page1 = pP
18450 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20  age1->aData;.   
18460 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54   rc = SQLITE_NOT
18470 41 44 42 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  ADB;.    /* EVID
18480 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 37 33 37  ENCE-OF: R-43737
18490 2d 33 39 39 39 39 20 45 76 65 72 79 20 76 61 6c  -39999 Every val
184a0 69 64 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  id SQLite databa
184b0 73 65 20 66 69 6c 65 20 62 65 67 69 6e 73 0a 20  se file begins. 
184c0 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 66     ** with the f
184d0 6f 6c 6c 6f 77 69 6e 67 20 31 36 20 62 79 74 65  ollowing 16 byte
184e0 73 20 28 69 6e 20 68 65 78 29 3a 20 35 33 20 35  s (in hex): 53 5
184f0 31 20 34 63 20 36 39 20 37 34 20 36 35 20 32 30  1 4c 69 74 65 20
18500 20 36 36 20 36 66 20 37 32 20 36 64 0a 20 20 20   66 6f 72 6d.   
18510 20 2a 2a 20 36 31 20 37 34 20 32 30 20 33 33 20   ** 61 74 20 33 
18520 30 30 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d  00. */.    if( m
18530 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61  emcmp(page1, zMa
18540 67 69 63 48 65 61 64 65 72 2c 20 31 36 29 21 3d  gicHeader, 16)!=
18550 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
18560 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
18570 64 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66  d;.    }..#ifdef
18580 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
18590 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
185a0 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42  8]>1 ){.      pB
185b0 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
185c0 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20  TS_READ_ONLY;.  
185d0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65    }.    if( page
185e0 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20  1[19]>1 ){.     
185f0 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
18600 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 23  _failed;.    }.#
18610 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70 61 67  else.    if( pag
18620 65 31 5b 31 38 5d 3e 32 20 29 7b 0a 20 20 20 20  e1[18]>2 ){.    
18630 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
18640 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59  |= BTS_READ_ONLY
18650 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
18660 70 61 67 65 31 5b 31 39 5d 3e 32 20 29 7b 0a 20  page1[19]>2 ){. 
18670 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
18680 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
18690 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
186a0 65 20 77 72 69 74 65 20 76 65 72 73 69 6f 6e 20  e write version 
186b0 69 73 20 73 65 74 20 74 6f 20 32 2c 20 74 68 69  is set to 2, thi
186c0 73 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c  s database shoul
186d0 64 20 62 65 20 61 63 63 65 73 73 65 64 0a 20 20  d be accessed.  
186e0 20 20 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65    ** in WAL mode
186f0 2e 20 49 66 20 74 68 65 20 6c 6f 67 20 69 73 20  . If the log is 
18700 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  not already open
18710 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 54  , open it now. T
18720 68 65 6e 20 0a 20 20 20 20 2a 2a 20 72 65 74 75  hen .    ** retu
18730 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64  rn SQLITE_OK and
18740 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   return without 
18750 70 6f 70 75 6c 61 74 69 6e 67 20 42 74 53 68 61  populating BtSha
18760 72 65 64 2e 70 50 61 67 65 31 2e 0a 20 20 20 20  red.pPage1..    
18770 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 64 65  ** The caller de
18780 74 65 63 74 73 20 74 68 69 73 20 61 6e 64 20 63  tects this and c
18790 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69  alls this functi
187a0 6f 6e 20 61 67 61 69 6e 2e 20 54 68 69 73 20 69  on again. This i
187b0 73 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65  s.    ** require
187c0 64 20 61 73 20 74 68 65 20 76 65 72 73 69 6f 6e  d as the version
187d0 20 6f 66 20 70 61 67 65 20 31 20 63 75 72 72 65   of page 1 curre
187e0 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65  ntly in the page
187f0 31 20 62 75 66 66 65 72 0a 20 20 20 20 2a 2a 20  1 buffer.    ** 
18800 6d 61 79 20 6e 6f 74 20 62 65 20 74 68 65 20 6c  may not be the l
18810 61 74 65 73 74 20 76 65 72 73 69 6f 6e 20 2d 20  atest version - 
18820 74 68 65 72 65 20 6d 61 79 20 62 65 20 61 20 6e  there may be a n
18830 65 77 65 72 20 6f 6e 65 20 69 6e 20 74 68 65 20  ewer one in the 
18840 6c 6f 67 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e  log.    ** file.
18850 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
18860 70 61 67 65 31 5b 31 39 5d 3d 3d 32 20 26 26 20  page1[19]==2 && 
18870 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
18880 20 42 54 53 5f 4e 4f 5f 57 41 4c 29 3d 3d 30 20   BTS_NO_WAL)==0 
18890 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4f  ){.      int isO
188a0 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  pen = 0;.      r
188b0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
188c0 4f 70 65 6e 57 61 6c 28 70 42 74 2d 3e 70 50 61  OpenWal(pBt->pPa
188d0 67 65 72 2c 20 26 69 73 4f 70 65 6e 29 3b 0a 20  ger, &isOpen);. 
188e0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
188f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
18900 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
18910 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  t_failed;.      
18920 7d 65 6c 73 65 7b 0a 23 69 66 20 53 51 4c 49 54  }else{.#if SQLIT
18930 45 5f 44 45 46 41 55 4c 54 5f 53 59 4e 43 48 52  E_DEFAULT_SYNCHR
18940 4f 4e 4f 55 53 21 3d 53 51 4c 49 54 45 5f 44 45  ONOUS!=SQLITE_DE
18950 46 41 55 4c 54 5f 57 41 4c 5f 53 59 4e 43 48 52  FAULT_WAL_SYNCHR
18960 4f 4e 4f 55 53 0a 20 20 20 20 20 20 20 20 73 71  ONOUS.        sq
18970 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 20 20 20  lite3 *db;.     
18980 20 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 20 20     Db *pDb;.    
18990 20 20 20 20 69 66 28 20 28 64 62 3d 70 42 74 2d      if( (db=pBt-
189a0 3e 64 62 29 21 3d 30 20 26 26 20 28 70 44 62 3d  >db)!=0 && (pDb=
189b0 64 62 2d 3e 61 44 62 29 21 3d 30 20 29 7b 0a 20  db->aDb)!=0 ){. 
189c0 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
189d0 70 44 62 2d 3e 70 42 74 3d 3d 30 20 7c 7c 20 70  pDb->pBt==0 || p
189e0 44 62 2d 3e 70 42 74 2d 3e 70 42 74 21 3d 70 42  Db->pBt->pBt!=pB
189f0 74 20 29 7b 20 70 44 62 2b 2b 3b 20 7d 0a 20 20  t ){ pDb++; }.  
18a00 20 20 20 20 20 20 20 20 69 66 28 20 70 44 62 2d          if( pDb-
18a10 3e 62 53 79 6e 63 53 65 74 3d 3d 30 0a 20 20 20  >bSyncSet==0.   
18a20 20 20 20 20 20 20 20 20 26 26 20 70 44 62 2d 3e          && pDb->
18a30 73 61 66 65 74 79 5f 6c 65 76 65 6c 3d 3d 53 51  safety_level==SQ
18a40 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 59 4e  LITE_DEFAULT_SYN
18a50 43 48 52 4f 4e 4f 55 53 2b 31 0a 20 20 20 20 20  CHRONOUS+1.     
18a60 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
18a70 20 20 20 20 70 44 62 2d 3e 73 61 66 65 74 79 5f      pDb->safety_
18a80 6c 65 76 65 6c 20 3d 20 53 51 4c 49 54 45 5f 44  level = SQLITE_D
18a90 45 46 41 55 4c 54 5f 57 41 4c 5f 53 59 4e 43 48  EFAULT_WAL_SYNCH
18aa0 52 4f 4e 4f 55 53 2b 31 3b 0a 20 20 20 20 20 20  RONOUS+1;.      
18ab0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
18ac0 65 72 53 65 74 46 6c 61 67 73 28 70 42 74 2d 3e  erSetFlags(pBt->
18ad0 70 50 61 67 65 72 2c 0a 20 20 20 20 20 20 20 20  pPager,.        
18ae0 20 20 20 20 20 20 20 70 44 62 2d 3e 73 61 66 65         pDb->safe
18af0 74 79 5f 6c 65 76 65 6c 20 7c 20 28 64 62 2d 3e  ty_level | (db->
18b00 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 46 4c  flags & PAGER_FL
18b10 41 47 53 5f 4d 41 53 4b 29 29 3b 0a 20 20 20 20  AGS_MASK));.    
18b20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
18b30 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  }.#endif.       
18b40 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d 30 20 29   if( isOpen==0 )
18b50 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65  {.          rele
18b60 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
18b70 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
18b80 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
18b90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
18ba0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
18bb0 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d 0a 23  _NOTADB;.    }.#
18bc0 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 45 56  endif..    /* EV
18bd0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 35 34  IDENCE-OF: R-154
18be0 36 35 2d 32 30 38 31 33 20 54 68 65 20 6d 61 78  65-20813 The max
18bf0 69 6d 75 6d 20 61 6e 64 20 6d 69 6e 69 6d 75 6d  imum and minimum
18c00 20 65 6d 62 65 64 64 65 64 20 70 61 79 6c 6f 61   embedded payloa
18c10 64 0a 20 20 20 20 2a 2a 20 66 72 61 63 74 69 6f  d.    ** fractio
18c20 6e 73 20 61 6e 64 20 74 68 65 20 6c 65 61 66 20  ns and the leaf 
18c30 70 61 79 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e  payload fraction
18c40 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20   values must be 
18c50 36 34 2c 20 33 32 2c 20 61 6e 64 20 33 32 2e 0a  64, 32, and 32..
18c60 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
18c70 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67  e original desig
18c80 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65 73 65 20  n allowed these 
18c90 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72 79 2c  amounts to vary,
18ca0 20 62 75 74 20 61 73 20 6f 66 0a 20 20 20 20 2a   but as of.    *
18cb0 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c  * version 3.6.0,
18cc0 20 77 65 20 72 65 71 75 69 72 65 20 74 68 65 6d   we require them
18cd0 20 74 6f 20 62 65 20 66 69 78 65 64 2e 0a 20 20   to be fixed..  
18ce0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d    */.    if( mem
18cf0 63 6d 70 28 26 70 61 67 65 31 5b 32 31 5d 2c 20  cmp(&page1[21], 
18d00 22 5c 31 30 30 5c 30 34 30 5c 30 34 30 22 2c 33  "\100\040\040",3
18d10 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  )!=0 ){.      go
18d20 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
18d30 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
18d40 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
18d50 52 2d 35 31 38 37 33 2d 33 39 36 31 38 20 54 68  R-51873-39618 Th
18d60 65 20 70 61 67 65 20 73 69 7a 65 20 66 6f 72 20  e page size for 
18d70 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
18d80 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d  is.    ** determ
18d90 69 6e 65 64 20 62 79 20 74 68 65 20 32 2d 62 79  ined by the 2-by
18da0 74 65 20 69 6e 74 65 67 65 72 20 6c 6f 63 61 74  te integer locat
18db0 65 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20  ed at an offset 
18dc0 6f 66 20 31 36 20 62 79 74 65 73 20 66 72 6f 6d  of 16 bytes from
18dd0 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 65 67 69  .    ** the begi
18de0 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74  nning of the dat
18df0 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20  abase file. */. 
18e00 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20 28 70     pageSize = (p
18e10 61 67 65 31 5b 31 36 5d 3c 3c 38 29 20 7c 20 28  age1[16]<<8) | (
18e20 70 61 67 65 31 5b 31 37 5d 3c 3c 31 36 29 3b 0a  page1[17]<<16);.
18e30 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
18e40 4f 46 3a 20 52 2d 32 35 30 30 38 2d 32 31 36 38  OF: R-25008-2168
18e50 38 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61 20  8 The size of a 
18e60 70 61 67 65 20 69 73 20 61 20 70 6f 77 65 72 20  page is a power 
18e70 6f 66 20 74 77 6f 0a 20 20 20 20 2a 2a 20 62 65  of two.    ** be
18e80 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35  tween 512 and 65
18e90 35 33 36 20 69 6e 63 6c 75 73 69 76 65 2e 20 2a  536 inclusive. *
18ea0 2f 0a 20 20 20 20 69 66 28 20 28 28 70 61 67 65  /.    if( ((page
18eb0 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65  Size-1)&pageSize
18ec0 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 70 61 67  )!=0.     || pag
18ed0 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58  eSize>SQLITE_MAX
18ee0 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20 20 20  _PAGE_SIZE .    
18ef0 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 3d 32 35   || pageSize<=25
18f00 36 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  6 .    ){.      
18f10 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
18f20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
18f30 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53    assert( (pageS
18f40 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20  ize & 7)==0 );. 
18f50 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
18f60 46 3a 20 52 2d 35 39 33 31 30 2d 35 31 32 30 35  F: R-59310-51205
18f70 20 54 68 65 20 22 72 65 73 65 72 76 65 64 20 73   The "reserved s
18f80 70 61 63 65 22 20 73 69 7a 65 20 69 6e 20 74 68  pace" size in th
18f90 65 20 31 2d 62 79 74 65 0a 20 20 20 20 2a 2a 20  e 1-byte.    ** 
18fa0 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
18fb0 74 20 32 30 20 69 73 20 74 68 65 20 6e 75 6d 62  t 20 is the numb
18fc0 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
18fd0 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20  pace at the end 
18fe0 6f 66 0a 20 20 20 20 2a 2a 20 65 61 63 68 20 70  of.    ** each p
18ff0 61 67 65 20 74 6f 20 72 65 73 65 72 76 65 20 66  age to reserve f
19000 6f 72 20 65 78 74 65 6e 73 69 6f 6e 73 2e 20 0a  or extensions. .
19010 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 56      **.    ** EV
19020 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 34  IDENCE-OF: R-374
19030 39 37 2d 34 32 34 31 32 20 54 68 65 20 73 69 7a  97-42412 The siz
19040 65 20 6f 66 20 74 68 65 20 72 65 73 65 72 76 65  e of the reserve
19050 64 20 72 65 67 69 6f 6e 20 69 73 0a 20 20 20 20  d region is.    
19060 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
19070 20 74 68 65 20 6f 6e 65 2d 62 79 74 65 20 75 6e   the one-byte un
19080 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66  signed integer f
19090 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66 66 73 65  ound at an offse
190a0 74 20 6f 66 20 32 30 0a 20 20 20 20 2a 2a 20 69  t of 20.    ** i
190b0 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
190c0 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f   file header. */
190d0 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20  .    usableSize 
190e0 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67  = pageSize - pag
190f0 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20  e1[20];.    if( 
19100 28 75 33 32 29 70 61 67 65 53 69 7a 65 21 3d 70  (u32)pageSize!=p
19110 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a  Bt->pageSize ){.
19120 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20 72        /* After r
19130 65 61 64 69 6e 67 20 74 68 65 20 66 69 72 73 74  eading the first
19140 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
19150 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20 61  abase assuming a
19160 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20 20   page size.     
19170 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64 2e   ** of BtShared.
19180 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61 76  pageSize, we hav
19190 65 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61  e discovered tha
191a0 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  t the page-size 
191b0 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 75  is.      ** actu
191c0 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20 55  ally pageSize. U
191d0 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
191e0 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e 70  se, leave pBt->p
191f0 50 61 67 65 31 20 61 74 0a 20 20 20 20 20 20 2a  Page1 at.      *
19200 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72  * zero and retur
19210 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65  n SQLITE_OK. The
19220 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c   caller will cal
19230 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  l this function.
19240 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77        ** again w
19250 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20  ith the correct 
19260 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20  page-size..     
19270 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73   */.      releas
19280 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20  ePage(pPage1);. 
19290 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65       pBt->usable
192a0 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a  Size = usableSiz
192b0 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61  e;.      pBt->pa
192c0 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
192d0 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65 6d  e;.      freeTem
192e0 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20  pSpace(pBt);.   
192f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
19300 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
19310 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
19320 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20  t->pageSize,.   
19330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19350 70 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65 53  pageSize-usableS
19360 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ize);.      retu
19370 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
19380 20 69 66 28 20 28 70 42 74 2d 3e 64 62 2d 3e 66   if( (pBt->db->f
19390 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
193a0 63 6f 76 65 72 79 4d 6f 64 65 29 3d 3d 30 20 26  coveryMode)==0 &
193b0 26 20 6e 50 61 67 65 3e 6e 50 61 67 65 46 69 6c  & nPage>nPageFil
193c0 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  e ){.      rc = 
193d0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
193e0 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
193f0 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
19400 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  d;.    }.    /* 
19410 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
19420 38 33 31 32 2d 36 34 37 30 34 20 48 6f 77 65 76  8312-64704 Howev
19430 65 72 2c 20 74 68 65 20 75 73 61 62 6c 65 20 73  er, the usable s
19440 69 7a 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  ize is not allow
19450 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20  ed to.    ** be 
19460 6c 65 73 73 20 74 68 61 6e 20 34 38 30 2e 20 49  less than 480. I
19470 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69  n other words, i
19480 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  f the page size 
19490 69 73 20 35 31 32 2c 20 74 68 65 6e 20 74 68 65  is 512, then the
194a0 0a 20 20 20 20 2a 2a 20 72 65 73 65 72 76 65 64  .    ** reserved
194b0 20 73 70 61 63 65 20 73 69 7a 65 20 63 61 6e 6e   space size cann
194c0 6f 74 20 65 78 63 65 65 64 20 33 32 2e 20 2a 2f  ot exceed 32. */
194d0 0a 20 20 20 20 69 66 28 20 75 73 61 62 6c 65 53  .    if( usableS
194e0 69 7a 65 3c 34 38 30 20 29 7b 0a 20 20 20 20 20  ize<480 ){.     
194f0 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
19500 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
19510 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
19520 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20   = pageSize;.   
19530 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
19540 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 23   = usableSize;.#
19550 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
19560 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
19570 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
19580 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70  m = (get4byte(&p
19590 61 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f  age1[36 + 4*4])?
195a0 31 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69  1:0);.    pBt->i
195b0 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74  ncrVacuum = (get
195c0 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20  4byte(&page1[36 
195d0 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65  + 7*4])?1:0);.#e
195e0 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d  ndif.  }..  /* m
195f0 61 78 4c 6f 63 61 6c 20 69 73 20 74 68 65 20 6d  axLocal is the m
19600 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  aximum amount of
19610 20 70 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72   payload to stor
19620 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20  e locally for.  
19630 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65  ** a cell.  Make
19640 20 73 75 72 65 20 69 74 20 69 73 20 73 6d 61 6c   sure it is smal
19650 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74 68 61 74  l enough so that
19660 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e   at least minFan
19670 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63  out.  ** cells c
19680 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f  an will fit on o
19690 6e 65 20 70 61 67 65 2e 20 20 57 65 20 61 73 73  ne page.  We ass
196a0 75 6d 65 20 61 20 31 30 2d 62 79 74 65 20 70 61  ume a 10-byte pa
196b0 67 65 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20  ge header..  ** 
196c0 42 65 73 69 64 65 73 20 74 68 65 20 70 61 79 6c  Besides the payl
196d0 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75  oad, the cell mu
196e0 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20  st store:.  **  
196f0 20 20 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65     2-byte pointe
19700 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20  r to the cell.  
19710 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 63 68  **     4-byte ch
19720 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a  ild pointer.  **
19730 20 20 20 20 20 39 2d 62 79 74 65 20 6e 4b 65 79       9-byte nKey
19740 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20   value.  **     
19750 34 2d 62 79 74 65 20 6e 44 61 74 61 20 76 61 6c  4-byte nData val
19760 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79  ue.  **     4-by
19770 74 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  te overflow page
19780 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f   pointer.  ** So
19790 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73   a cell consists
197a0 20 6f 66 20 61 20 32 2d 62 79 74 65 20 70 6f 69   of a 2-byte poi
197b0 6e 74 65 72 2c 20 61 20 68 65 61 64 65 72 20 77  nter, a header w
197c0 68 69 63 68 20 69 73 20 61 73 20 6d 75 63 68 20  hich is as much 
197d0 61 73 0a 20 20 2a 2a 20 31 37 20 62 79 74 65 73  as.  ** 17 bytes
197e0 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79   long, 0 to N by
197f0 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20  tes of payload, 
19800 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20  and an optional 
19810 34 20 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a  4 byte overflow.
19820 20 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74 65    ** page pointe
19830 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d  r..  */.  pBt->m
19840 61 78 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28  axLocal = (u16)(
19850 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
19860 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d 20 32 33  -12)*64/255 - 23
19870 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63  );.  pBt->minLoc
19880 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d  al = (u16)((pBt-
19890 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
198a0 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20  32/255 - 23);.  
198b0 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 28  pBt->maxLeaf = (
198c0 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65  u16)(pBt->usable
198d0 53 69 7a 65 20 2d 20 33 35 29 3b 0a 20 20 70 42  Size - 35);.  pB
198e0 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 75 31  t->minLeaf = (u1
198f0 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  6)((pBt->usableS
19900 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d  ize-12)*32/255 -
19910 20 32 33 29 3b 0a 20 20 69 66 28 20 70 42 74 2d   23);.  if( pBt-
19920 3e 6d 61 78 4c 6f 63 61 6c 3e 31 32 37 20 29 7b  >maxLocal>127 ){
19930 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62 79  .    pBt->max1by
19940 74 65 50 61 79 6c 6f 61 64 20 3d 20 31 32 37 3b  tePayload = 127;
19950 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42  .  }else{.    pB
19960 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f  t->max1bytePaylo
19970 61 64 20 3d 20 28 75 38 29 70 42 74 2d 3e 6d 61  ad = (u8)pBt->ma
19980 78 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 61 73  xLocal;.  }.  as
19990 73 65 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65  sert( pBt->maxLe
199a0 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45  af + 23 <= MX_CE
199b0 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a  LL_SIZE(pBt) );.
199c0 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
199d0 70 50 61 67 65 31 3b 0a 20 20 70 42 74 2d 3e 6e  pPage1;.  pBt->n
199e0 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Page = nPage;.  
199f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
19a00 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  ;..page1_init_fa
19a10 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73 65 50  iled:.  releaseP
19a20 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 70  age(pPage1);.  p
19a30 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a  Bt->pPage1 = 0;.
19a40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
19a50 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f  #ifndef NDEBUG./
19a60 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
19a70 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72  number of cursor
19a80 73 20 6f 70 65 6e 20 6f 6e 20 70 42 74 2e 20 54  s open on pBt. T
19a90 68 69 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a  his is for use.*
19aa0 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20 65 78  * in assert() ex
19ab0 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74  pressions, so it
19ac0 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65   is only compile
19ad0 64 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e  d if NDEBUG is n
19ae0 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a  ot.** defined..*
19af0 2a 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20  *.** Only write 
19b00 63 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e  cursors are coun
19b10 74 65 64 20 69 66 20 77 72 4f 6e 6c 79 20 69 73  ted if wrOnly is
19b20 20 74 72 75 65 2e 20 20 49 66 20 77 72 4f 6e 6c   true.  If wrOnl
19b30 79 20 69 73 0a 2a 2a 20 66 61 6c 73 65 20 74 68  y is.** false th
19b40 65 6e 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61  en all cursors a
19b50 72 65 20 63 6f 75 6e 74 65 64 2e 0a 2a 2a 0a 2a  re counted..**.*
19b60 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73  * For the purpos
19b70 65 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  es of this routi
19b80 6e 65 2c 20 61 20 63 75 72 73 6f 72 20 69 73 20  ne, a cursor is 
19b90 61 6e 79 20 63 75 72 73 6f 72 20 74 68 61 74 0a  any cursor that.
19ba0 2a 2a 20 69 73 20 63 61 70 61 62 6c 65 20 6f 66  ** is capable of
19bb0 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
19bc0 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
19bd0 61 73 65 2e 20 20 43 75 72 73 6f 72 73 20 74 68  ase.  Cursors th
19be0 61 74 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20  at.** have been 
19bf0 74 72 69 70 70 65 64 20 69 6e 74 6f 20 74 68 65  tripped into the
19c00 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 73 74   CURSOR_FAULT st
19c10 61 74 65 20 61 72 65 20 6e 6f 74 20 63 6f 75 6e  ate are not coun
19c20 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ted..*/.static i
19c30 6e 74 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72  nt countValidCur
19c40 73 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70  sors(BtShared *p
19c50 42 74 2c 20 69 6e 74 20 77 72 4f 6e 6c 79 29 7b  Bt, int wrOnly){
19c60 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
19c70 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a  r;.  int r = 0;.
19c80 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e    for(pCur=pBt->
19c90 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70  pCursor; pCur; p
19ca0 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29  Cur=pCur->pNext)
19cb0 7b 0a 20 20 20 20 69 66 28 20 28 77 72 4f 6e 6c  {.    if( (wrOnl
19cc0 79 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e 63  y==0 || (pCur->c
19cd0 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57  urFlags & BTCF_W
19ce0 72 69 74 65 46 6c 61 67 29 21 3d 30 29 0a 20 20  riteFlag)!=0).  
19cf0 20 20 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61     && pCur->eSta
19d00 74 65 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te!=CURSOR_FAULT
19d10 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72   ) r++; .  }.  r
19d20 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69  eturn r;.}.#endi
19d30 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72  f../*.** If ther
19d40 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e  e are no outstan
19d50 64 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e 64  ding cursors and
19d60 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 74   we are not in t
19d70 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20  he middle.** of 
19d80 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75  a transaction bu
19d90 74 20 74 68 65 72 65 20 69 73 20 61 20 72 65 61  t there is a rea
19da0 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d lock on the da
19db0 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20  tabase, then.** 
19dc0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e 72  this routine unr
19dd0 65 66 73 20 74 68 65 20 66 69 72 73 74 20 70 61  efs the first pa
19de0 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
19df0 73 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a 2a  se file which .*
19e00 2a 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74  * has the effect
19e10 20 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74 68   of releasing th
19e20 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a  e read lock..**.
19e30 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  ** If there is a
19e40 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
19e50 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20 72  progress, this r
19e60 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
19e70 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
19e80 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55  d unlockBtreeIfU
19e90 6e 75 73 65 64 28 42 74 53 68 61 72 65 64 20 2a  nused(BtShared *
19ea0 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20  pBt){.  assert( 
19eb0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
19ec0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
19ed0 3b 0a 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e  ;.  assert( coun
19ee0 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70 42  tValidCursors(pB
19ef0 74 2c 30 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e  t,0)==0 || pBt->
19f00 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 54 52  inTransaction>TR
19f10 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69 66  ANS_NONE );.  if
19f20 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
19f30 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  tion==TRANS_NONE
19f40 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 21   && pBt->pPage1!
19f50 3d 30 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67  =0 ){.    MemPag
19f60 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d  e *pPage1 = pBt-
19f70 3e 70 50 61 67 65 31 3b 0a 20 20 20 20 61 73 73  >pPage1;.    ass
19f80 65 72 74 28 20 70 50 61 67 65 31 2d 3e 61 44 61  ert( pPage1->aDa
19f90 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ta );.    assert
19fa0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  ( sqlite3PagerRe
19fb0 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  fcount(pBt->pPag
19fc0 65 72 29 3d 3d 31 20 29 3b 0a 20 20 20 20 70 42  er)==1 );.    pB
19fd0 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20  t->pPage1 = 0;. 
19fe0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f     releasePageNo
19ff0 74 4e 75 6c 6c 28 70 50 61 67 65 31 29 3b 0a 20  tNull(pPage1);. 
1a000 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70   }.}../*.** If p
1a010 42 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  Bt points to an 
1a020 65 6d 70 74 79 20 66 69 6c 65 20 74 68 65 6e 20  empty file then 
1a030 63 6f 6e 76 65 72 74 20 74 68 61 74 20 65 6d 70  convert that emp
1a040 74 79 20 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20  ty file.** into 
1a050 61 20 6e 65 77 20 65 6d 70 74 79 20 64 61 74 61  a new empty data
1a060 62 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c 69  base by initiali
1a070 7a 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70  zing the first p
1a080 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20 64 61  age of.** the da
1a090 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  tabase..*/.stati
1a0a0 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73  c int newDatabas
1a0b0 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
1a0c0 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 31  {.  MemPage *pP1
1a0d0 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
1a0e0 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20 72  r *data;.  int r
1a0f0 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  c;..  assert( sq
1a100 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1a110 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
1a120 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65    if( pBt->nPage
1a130 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  >0 ){.    return
1a140 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1a150 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61    pP1 = pBt->pPa
1a160 67 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ge1;.  assert( p
1a170 50 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61 20  P1!=0 );.  data 
1a180 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20  = pP1->aData;.  
1a190 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1a1a0 72 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62 50  rWrite(pP1->pDbP
1a1b0 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
1a1c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65   return rc;.  me
1a1d0 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67 69  mcpy(data, zMagi
1a1e0 63 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28  cHeader, sizeof(
1a1f0 7a 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b 0a  zMagicHeader));.
1a200 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
1a210 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d 3d  (zMagicHeader)==
1a220 31 36 20 29 3b 0a 20 20 64 61 74 61 5b 31 36 5d  16 );.  data[16]
1a230 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61   = (u8)((pBt->pa
1a240 67 65 53 69 7a 65 3e 3e 38 29 26 30 78 66 66 29  geSize>>8)&0xff)
1a250 3b 0a 20 20 64 61 74 61 5b 31 37 5d 20 3d 20 28  ;.  data[17] = (
1a260 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69  u8)((pBt->pageSi
1a270 7a 65 3e 3e 31 36 29 26 30 78 66 66 29 3b 0a 20  ze>>16)&0xff);. 
1a280 20 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20   data[18] = 1;. 
1a290 20 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20   data[19] = 1;. 
1a2a0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73   assert( pBt->us
1a2b0 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d 3e 70  ableSize<=pBt->p
1a2c0 61 67 65 53 69 7a 65 20 26 26 20 70 42 74 2d 3e  ageSize && pBt->
1a2d0 75 73 61 62 6c 65 53 69 7a 65 2b 32 35 35 3e 3d  usableSize+255>=
1a2e0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  pBt->pageSize);.
1a2f0 20 20 64 61 74 61 5b 32 30 5d 20 3d 20 28 75 38    data[20] = (u8
1a300 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  )(pBt->pageSize 
1a310 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  - pBt->usableSiz
1a320 65 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d  e);.  data[21] =
1a330 20 36 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20   64;.  data[22] 
1a340 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d  = 32;.  data[23]
1a350 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28   = 32;.  memset(
1a360 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30  &data[24], 0, 10
1a370 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67  0-24);.  zeroPag
1a380 65 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45  e(pP1, PTF_INTKE
1a390 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c  Y|PTF_LEAF|PTF_L
1a3a0 45 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42 74  EAFDATA );.  pBt
1a3b0 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
1a3c0 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44  S_PAGESIZE_FIXED
1a3d0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1a3e0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1a3f0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
1a400 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c  autoVacuum==1 ||
1a410 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
1a420 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
1a430 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
1a440 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72  ==1 || pBt->incr
1a450 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70  Vacuum==0 );.  p
1a460 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36  ut4byte(&data[36
1a470 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75   + 4*4], pBt->au
1a480 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70 75 74  toVacuum);.  put
1a490 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b  4byte(&data[36 +
1a4a0 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72   7*4], pBt->incr
1a4b0 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a  Vacuum);.#endif.
1a4c0 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 31    pBt->nPage = 1
1a4d0 3b 0a 20 20 64 61 74 61 5b 33 31 5d 20 3d 20 31  ;.  data[31] = 1
1a4e0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1a4f0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
1a500 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 66 69  nitialize the fi
1a510 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
1a520 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 63  database file (c
1a530 72 65 61 74 69 6e 67 20 61 20 64 61 74 61 62 61  reating a databa
1a540 73 65 0a 2a 2a 20 63 6f 6e 73 69 73 74 69 6e 67  se.** consisting
1a550 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67   of a single pag
1a560 65 20 61 6e 64 20 6e 6f 20 73 63 68 65 6d 61 20  e and no schema 
1a570 6f 62 6a 65 63 74 73 29 2e 20 52 65 74 75 72 6e  objects). Return
1a580 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 66   SQLITE_OK.** if
1a590 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
1a5a0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
1a5b0 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  code otherwise..
1a5c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1a5d0 72 65 65 4e 65 77 44 62 28 42 74 72 65 65 20 2a  reeNewDb(Btree *
1a5e0 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
1a5f0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1a600 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e  r(p);.  p->pBt->
1a610 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 63 20  nPage = 0;.  rc 
1a620 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 2d  = newDatabase(p-
1a630 3e 70 42 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  >pBt);.  sqlite3
1a640 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1a650 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1a660 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
1a670 73 74 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e  start a new tran
1a680 73 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74 65  saction. A write
1a690 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20  -transaction.** 
1a6a0 69 73 20 73 74 61 72 74 65 64 20 69 66 20 74 68  is started if th
1a6b0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
1a6c0 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74  t is nonzero, ot
1a6d0 68 65 72 77 69 73 65 20 61 20 72 65 61 64 2d 0a  herwise a read-.
1a6e0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
1a6f0 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
1a700 72 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72 20  rgument is 2 or 
1a710 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73 69  more and exclusi
1a720 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  ve.** transactio
1a730 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d 65  n is started, me
1a740 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74  aning that no ot
1a750 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 61  her process is a
1a760 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63  llowed.** to acc
1a770 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ess the database
1a780 2e 20 20 41 20 70 72 65 65 78 69 73 74 69 6e 67  .  A preexisting
1a790 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79   transaction may
1a7a0 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72 61   not be.** upgra
1a7b0 64 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65  ded to exclusive
1a7c0 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   by calling this
1a7d0 20 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f 6e   routine a secon
1a7e0 64 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20  d time - the.** 
1a7f0 65 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61 67  exclusivity flag
1a800 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20   only works for 
1a810 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  a new transactio
1a820 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65  n..**.** A write
1a830 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73  -transaction mus
1a840 74 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66  t be started bef
1a850 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61  ore attempting a
1a860 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74  ny .** changes t
1a870 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
1a880 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c   None of the fol
1a890 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  lowing routines 
1a8a0 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e  .** will work un
1a8b0 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63 74 69  less a transacti
1a8c0 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20 66 69  on is started fi
1a8d0 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  rst:.**.**      
1a8e0 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61  sqlite3BtreeCrea
1a8f0 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  teTable().**    
1a900 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72    sqlite3BtreeCr
1a910 65 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20  eateIndex().**  
1a920 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1a930 43 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20  ClearTable().** 
1a940 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
1a950 65 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20  eDropTable().** 
1a960 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
1a970 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20 20  eInsert().**    
1a980 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65    sqlite3BtreeDe
1a990 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  lete().**      s
1a9a0 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74  qlite3BtreeUpdat
1a9b0 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66  eMeta().**.** If
1a9c0 20 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74 65   an initial atte
1a9d0 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65 20 74  mpt to acquire t
1a9e0 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65  he lock fails be
1a9f0 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f  cause of lock co
1aa00 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20  ntention.** and 
1aa10 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73  the database was
1aa20 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f   previously unlo
1aa30 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b  cked, then invok
1aa40 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
1aa50 65 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69  er.** if there i
1aa60 73 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20 74  s one.  But if t
1aa70 68 65 72 65 20 77 61 73 20 70 72 65 76 69 6f 75  here was previou
1aa80 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c  sly a read-lock,
1aa90 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b   do not.** invok
1aaa0 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
1aab0 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e  er - just return
1aac0 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 53   SQLITE_BUSY.  S
1aad0 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a 2a  QLITE_BUSY is .*
1aae0 2a 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20  * returned when 
1aaf0 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
1ab00 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20   a read-lock in 
1ab10 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 61  order to avoid a
1ab20 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a   deadlock..**.**
1ab30 20 53 75 70 70 6f 73 65 20 74 68 65 72 65 20 61   Suppose there a
1ab40 72 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73  re two processes
1ab50 20 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61 73   A and B.  A has
1ab60 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64   a read lock and
1ab70 20 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73 65   B has.** a rese
1ab80 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72  rved lock.  B tr
1ab90 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74  ies to promote t
1aba0 6f 20 65 78 63 6c 75 73 69 76 65 20 62 75 74 20  o exclusive but 
1abb0 69 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61 75  is blocked becau
1abc0 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65 61  se.** of A's rea
1abd0 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65 73  d lock.  A tries
1abe0 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72   to promote to r
1abf0 65 73 65 72 76 65 64 20 62 75 74 20 69 73 20 62  eserved but is b
1ac00 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20  locked by B..** 
1ac10 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72  One or the other
1ac20 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f 63   of the two proc
1ac30 65 73 73 65 73 20 6d 75 73 74 20 67 69 76 65 20  esses must give 
1ac40 77 61 79 20 6f 72 20 74 68 65 72 65 20 63 61 6e  way or there can
1ac50 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65   be.** no progre
1ac60 73 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69 6e  ss.  By returnin
1ac70 67 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e  g SQLITE_BUSY an
1ac80 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74  d not invoking t
1ac90 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
1aca0 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65 61  .** when A alrea
1acb0 64 79 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f  dy has a read lo
1acc0 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67 65  ck, we encourage
1acd0 20 41 20 74 6f 20 67 69 76 65 20 75 70 20 61 6e   A to give up an
1ace0 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65  d let B.** proce
1acf0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
1ad00 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  e3BtreeBeginTran
1ad10 73 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  s(Btree *p, int 
1ad20 77 72 66 6c 61 67 29 7b 0a 20 20 42 74 53 68 61  wrflag){.  BtSha
1ad30 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
1ad40 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
1ad50 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69  LITE_OK;..  sqli
1ad60 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
1ad70 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ;.  btreeIntegri
1ad80 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ty(p);..  /* If 
1ad90 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6c 72  the btree is alr
1ada0 65 61 64 79 20 69 6e 20 61 20 77 72 69 74 65 2d  eady in a write-
1adb0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20  transaction, or 
1adc0 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65 61  it.  ** is alrea
1add0 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74 72 61  dy in a read-tra
1ade0 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20 72  nsaction and a r
1adf0 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ead-transaction.
1ae00 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73 74 65    ** is requeste
1ae10 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d  d, this is a no-
1ae20 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  op..  */.  if( p
1ae30 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1ae40 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e  _WRITE || (p->in
1ae50 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41  Trans==TRANS_REA
1ae60 44 20 26 26 20 21 77 72 66 6c 61 67 29 20 29 7b  D && !wrflag) ){
1ae70 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f  .    goto trans_
1ae80 62 65 67 75 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  begun;.  }.  ass
1ae90 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
1aea0 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
1aeb0 52 49 54 45 20 7c 7c 20 49 66 4e 6f 74 4f 6d 69  RITE || IfNotOmi
1aec0 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e  tAV(pBt->bDoTrun
1aed0 63 61 74 65 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f  cate)==0 );..  /
1aee0 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61 63 74  * Write transact
1aef0 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f 73  ions are not pos
1af00 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d  sible on a read-
1af10 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
1af20 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73  .  if( (pBt->bts
1af30 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44  Flags & BTS_READ
1af40 5f 4f 4e 4c 59 29 21 3d 30 20 26 26 20 77 72 66  _ONLY)!=0 && wrf
1af50 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  lag ){.    rc = 
1af60 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
1af70 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f  .    goto trans_
1af80 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e  begun;.  }..#ifn
1af90 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1afa0 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 7b  SHARED_CACHE.  {
1afb0 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 70 42  .    sqlite3 *pB
1afc0 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 2f 2a  lock = 0;.    /*
1afd0 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61   If another data
1afe0 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73 20  base handle has 
1aff0 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 61  already opened a
1b000 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
1b010 6f 6e 20 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  on .    ** on th
1b020 69 73 20 73 68 61 72 65 64 2d 62 74 72 65 65 20  is shared-btree 
1b030 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20  structure and a 
1b040 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61  second write tra
1b050 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 20 20  nsaction is.    
1b060 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20 72 65  ** requested, re
1b070 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  turn SQLITE_LOCK
1b080 45 44 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ED..    */.    i
1b090 66 28 20 28 77 72 66 6c 61 67 20 26 26 20 70 42  f( (wrflag && pB
1b0a0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1b0b0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 0a 20  ==TRANS_WRITE). 
1b0c0 20 20 20 20 7c 7c 20 28 70 42 74 2d 3e 62 74 73      || (pBt->bts
1b0d0 46 6c 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44  Flags & BTS_PEND
1b0e0 49 4e 47 29 21 3d 30 0a 20 20 20 20 29 7b 0a 20  ING)!=0.    ){. 
1b0f0 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 42       pBlock = pB
1b100 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 3b 0a  t->pWriter->db;.
1b110 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72      }else if( wr
1b120 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 20 20  flag>1 ){.      
1b130 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20  BtLock *pIter;. 
1b140 20 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70       for(pIter=p
1b150 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72  Bt->pLock; pIter
1b160 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70  ; pIter=pIter->p
1b170 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69  Next){.        i
1b180 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  f( pIter->pBtree
1b190 21 3d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=p ){.         
1b1a0 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72 2d   pBlock = pIter-
1b1b0 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20  >pBtree->db;.   
1b1c0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1b1d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1b1e0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42      }.    if( pB
1b1f0 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 73 71  lock ){.      sq
1b200 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42  lite3ConnectionB
1b210 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42  locked(p->db, pB
1b220 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 72 63 20  lock);.      rc 
1b230 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f  = SQLITE_LOCKED_
1b240 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 20  SHAREDCACHE;.   
1b250 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65     goto trans_be
1b260 67 75 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  gun;.    }.  }.#
1b270 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 79 20  endif..  /* Any 
1b280 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 72 65 61  read-only or rea
1b290 64 2d 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  d-write transact
1b2a0 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61 20 72 65  ion implies a re
1b2b0 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a  ad-lock on .  **
1b2c0 20 70 61 67 65 20 31 2e 20 53 6f 20 69 66 20 73   page 1. So if s
1b2d0 6f 6d 65 20 6f 74 68 65 72 20 73 68 61 72 65 64  ome other shared
1b2e0 2d 63 61 63 68 65 20 63 6c 69 65 6e 74 20 61 6c  -cache client al
1b2f0 72 65 61 64 79 20 68 61 73 20 61 20 77 72 69 74  ready has a writ
1b300 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20  e-lock .  ** on 
1b310 70 61 67 65 20 31 2c 20 74 68 65 20 74 72 61 6e  page 1, the tran
1b320 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62  saction cannot b
1b330 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 72  e opened. */.  r
1b340 63 20 3d 20 71 75 65 72 79 53 68 61 72 65 64 43  c = querySharedC
1b350 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  acheTableLock(p,
1b360 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45   MASTER_ROOT, RE
1b370 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20  AD_LOCK);.  if( 
1b380 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 20  SQLITE_OK!=rc ) 
1b390 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
1b3a0 3b 0a 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  ;..  pBt->btsFla
1b3b0 67 73 20 26 3d 20 7e 42 54 53 5f 49 4e 49 54 49  gs &= ~BTS_INITI
1b3c0 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 69 66  ALLY_EMPTY;.  if
1b3d0 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 30 20  ( pBt->nPage==0 
1b3e0 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ) pBt->btsFlags 
1b3f0 7c 3d 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59  |= BTS_INITIALLY
1b400 5f 45 4d 50 54 59 3b 0a 20 20 64 6f 20 7b 0a 20  _EMPTY;.  do {. 
1b410 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63 6b 42     /* Call lockB
1b420 74 72 65 65 28 29 20 75 6e 74 69 6c 20 65 69 74  tree() until eit
1b430 68 65 72 20 70 42 74 2d 3e 70 50 61 67 65 31 20  her pBt->pPage1 
1b440 69 73 20 70 6f 70 75 6c 61 74 65 64 20 6f 72 0a  is populated or.
1b450 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74 72 65 65      ** lockBtree
1b460 28 29 20 72 65 74 75 72 6e 73 20 73 6f 6d 65 74  () returns somet
1b470 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
1b480 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63 6b 42  SQLITE_OK. lockB
1b490 74 72 65 65 28 29 0a 20 20 20 20 2a 2a 20 6d 61  tree().    ** ma
1b4a0 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
1b4b0 4f 4b 20 62 75 74 20 6c 65 61 76 65 20 70 42 74  OK but leave pBt
1b4c0 2d 3e 70 50 61 67 65 31 20 73 65 74 20 74 6f 20  ->pPage1 set to 
1b4d0 30 20 69 66 20 61 66 74 65 72 0a 20 20 20 20 2a  0 if after.    *
1b4e0 2a 20 72 65 61 64 69 6e 67 20 70 61 67 65 20 31  * reading page 1
1b4f0 20 69 74 20 64 69 73 63 6f 76 65 72 73 20 74 68   it discovers th
1b500 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  at the page-size
1b510 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1b520 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 69 73   .    ** file is
1b530 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67 65 53 69   not pBt->pageSi
1b540 7a 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ze. In this case
1b550 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 77 69 6c   lockBtree() wil
1b560 6c 20 75 70 64 61 74 65 0a 20 20 20 20 2a 2a 20  l update.    ** 
1b570 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 74 6f  pBt->pageSize to
1b580 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f   the page-size o
1b590 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69  f the file on di
1b5a0 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77  sk..    */.    w
1b5b0 68 69 6c 65 28 20 70 42 74 2d 3e 70 50 61 67 65  hile( pBt->pPage
1b5c0 31 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f  1==0 && SQLITE_O
1b5d0 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b 42 74 72  K==(rc = lockBtr
1b5e0 65 65 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 20  ee(pBt)) );..   
1b5f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1b600 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a  OK && wrflag ){.
1b610 20 20 20 20 20 20 69 66 28 20 28 70 42 74 2d 3e        if( (pBt->
1b620 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52  btsFlags & BTS_R
1b630 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a  EAD_ONLY)!=0 ){.
1b640 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1b650 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
1b660 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b670 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1b680 61 67 65 72 42 65 67 69 6e 28 70 42 74 2d 3e 70  agerBegin(pBt->p
1b690 50 61 67 65 72 2c 77 72 66 6c 61 67 3e 31 2c 73  Pager,wrflag>1,s
1b6a0 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f  qlite3TempInMemo
1b6b0 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20  ry(p->db));.    
1b6c0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1b6d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1b6e0 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62     rc = newDatab
1b6f0 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ase(pBt);.      
1b700 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1b710 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72 63 21  }.  .    if( rc!
1b720 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b730 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
1b740 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
1b750 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 28 72    }.  }while( (r
1b760 63 26 30 78 46 46 29 3d 3d 53 51 4c 49 54 45 5f  c&0xFF)==SQLITE_
1b770 42 55 53 59 20 26 26 20 70 42 74 2d 3e 69 6e 54  BUSY && pBt->inT
1b780 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
1b790 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20 20  S_NONE &&.      
1b7a0 20 20 20 20 62 74 72 65 65 49 6e 76 6f 6b 65 42      btreeInvokeB
1b7b0 75 73 79 48 61 6e 64 6c 65 72 28 70 42 74 29 20  usyHandler(pBt) 
1b7c0 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
1b7d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
1b7e0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
1b7f0 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  RANS_NONE ){.   
1b800 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63     pBt->nTransac
1b810 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66 20  tion++;.#ifndef 
1b820 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
1b830 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20 69  ED_CACHE.      i
1b840 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  f( p->sharable )
1b850 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
1b860 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65  ( p->lock.pBtree
1b870 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f 63 6b 2e 69  ==p && p->lock.i
1b880 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20  Table==1 );.    
1b890 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63      p->lock.eLoc
1b8a0 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20  k = READ_LOCK;. 
1b8b0 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 70         p->lock.p
1b8c0 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63  Next = pBt->pLoc
1b8d0 6b 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  k;.        pBt->
1b8e0 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f 63 6b  pLock = &p->lock
1b8f0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
1b900 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e  .    }.    p->in
1b910 54 72 61 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f  Trans = (wrflag?
1b920 54 52 41 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e  TRANS_WRITE:TRAN
1b930 53 5f 52 45 41 44 29 3b 0a 20 20 20 20 69 66 28  S_READ);.    if(
1b940 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d   p->inTrans>pBt-
1b950 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  >inTransaction )
1b960 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54  {.      pBt->inT
1b970 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e  ransaction = p->
1b980 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 20  inTrans;.    }. 
1b990 20 20 20 69 66 28 20 77 72 66 6c 61 67 20 29 7b     if( wrflag ){
1b9a0 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
1b9b0 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50  pPage1 = pBt->pP
1b9c0 61 67 65 31 3b 0a 23 69 66 6e 64 65 66 20 53 51  age1;.#ifndef SQ
1b9d0 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
1b9e0 5f 43 41 43 48 45 0a 20 20 20 20 20 20 61 73 73  _CACHE.      ass
1b9f0 65 72 74 28 20 21 70 42 74 2d 3e 70 57 72 69 74  ert( !pBt->pWrit
1ba00 65 72 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  er );.      pBt-
1ba10 3e 70 57 72 69 74 65 72 20 3d 20 70 3b 0a 20 20  >pWriter = p;.  
1ba20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
1ba30 73 20 26 3d 20 7e 42 54 53 5f 45 58 43 4c 55 53  s &= ~BTS_EXCLUS
1ba40 49 56 45 3b 0a 20 20 20 20 20 20 69 66 28 20 77  IVE;.      if( w
1ba50 72 66 6c 61 67 3e 31 20 29 20 70 42 74 2d 3e 62  rflag>1 ) pBt->b
1ba60 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 45  tsFlags |= BTS_E
1ba70 58 43 4c 55 53 49 56 45 3b 0a 23 65 6e 64 69 66  XCLUSIVE;.#endif
1ba80 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
1ba90 65 20 64 62 2d 73 69 7a 65 20 68 65 61 64 65 72  e db-size header
1baa0 20 66 69 65 6c 64 20 69 73 20 69 6e 63 6f 72 72   field is incorr
1bab0 65 63 74 20 28 61 73 20 69 74 20 6d 61 79 20 62  ect (as it may b
1bac0 65 20 69 66 20 61 6e 20 6f 6c 64 0a 20 20 20 20  e if an old.    
1bad0 20 20 2a 2a 20 63 6c 69 65 6e 74 20 68 61 73 20    ** client has 
1bae0 62 65 65 6e 20 77 72 69 74 69 6e 67 20 74 68 65  been writing the
1baf0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c   database file),
1bb00 20 75 70 64 61 74 65 20 69 74 20 6e 6f 77 2e 20   update it now. 
1bb10 44 6f 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74  Doing.      ** t
1bb20 68 69 73 20 73 6f 6f 6e 65 72 20 72 61 74 68 65  his sooner rathe
1bb30 72 20 74 68 61 6e 20 6c 61 74 65 72 20 6d 65 61  r than later mea
1bb40 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
1bb50 73 69 7a 65 20 63 61 6e 20 73 61 66 65 6c 79 20  size can safely 
1bb60 0a 20 20 20 20 20 20 2a 2a 20 72 65 2d 72 65 61  .      ** re-rea
1bb70 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
1bb80 69 7a 65 20 66 72 6f 6d 20 70 61 67 65 20 31 20  ize from page 1 
1bb90 69 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 6f  if a savepoint o
1bba0 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  r transaction.  
1bbb0 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20      ** rollback 
1bbc0 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
1bbd0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
1bbe0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
1bbf0 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 67 65  ( pBt->nPage!=ge
1bc00 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
1bc10 61 44 61 74 61 5b 32 38 5d 29 20 29 7b 0a 20 20  aData[28]) ){.  
1bc20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1bc30 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
1bc40 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
1bc50 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1bc60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1bc70 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1bc80 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38  pPage1->aData[28
1bc90 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a  ], pBt->nPage);.
1bca0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1bcb0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 74 72  }.    }.  }...tr
1bcc0 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 69 66 28  ans_begun:.  if(
1bcd0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1bce0 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  & wrflag ){.    
1bcf0 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 61 6b  /* This call mak
1bd00 65 73 20 73 75 72 65 20 74 68 61 74 20 74 68 65  es sure that the
1bd10 20 70 61 67 65 72 20 68 61 73 20 74 68 65 20 63   pager has the c
1bd20 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20 6f 66  orrect number of
1bd30 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 20 73 61 76  .    ** open sav
1bd40 65 70 6f 69 6e 74 73 2e 20 49 66 20 74 68 65 20  epoints. If the 
1bd50 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
1bd60 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
1bd70 20 30 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74 68   0 and.    ** th
1bd80 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73  e sub-journal is
1bd90 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
1bda0 6e 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20  n, then it will 
1bdb0 62 65 20 6f 70 65 6e 65 64 20 68 65 72 65 2e 0a  be opened here..
1bdc0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
1bdd0 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
1bde0 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70  Savepoint(pBt->p
1bdf0 50 61 67 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53  Pager, p->db->nS
1be00 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 0a  avepoint);.  }..
1be10 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
1be20 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  (p);.  sqlite3Bt
1be30 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
1be40 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
1be50 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1be60 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a  _AUTOVACUUM../*.
1be70 2a 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74  ** Set the point
1be80 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66  er-map entries f
1be90 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20  or all children 
1bea0 6f 66 20 70 61 67 65 20 70 50 61 67 65 2e 20 41  of page pPage. A
1beb0 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65  lso, if.** pPage
1bec0 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20   contains cells 
1bed0 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76  that point to ov
1bee0 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 73 65  erflow pages, se
1bef0 74 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a  t the pointer.**
1bf00 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72   map entries for
1bf10 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
1bf20 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a  ges as well..*/.
1bf30 73 74 61 74 69 63 20 69 6e 74 20 73 65 74 43 68  static int setCh
1bf40 69 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d 50 61  ildPtrmaps(MemPa
1bf50 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e  ge *pPage){.  in
1bf60 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
1bf70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf80 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61 72 69   /* Counter vari
1bf90 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  able */.  int nC
1bfa0 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
1bfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bfc0 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
1bfd0 69 6e 20 70 61 67 65 20 70 50 61 67 65 20 2a 2f  in page pPage */
1bfe0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1bff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c000 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1c010 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68 61 72  code */.  BtShar
1c020 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
1c030 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e  >pBt;.  Pgno pgn
1c040 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b  o = pPage->pgno;
1c050 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
1c060 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1c070 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
1c080 29 20 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65  ) );.  rc = btre
1c090 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29  eInitPage(pPage)
1c0a0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1c0b0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
1c0c0 63 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61  c;.  nCell = pPa
1c0d0 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f  ge->nCell;..  fo
1c0e0 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
1c0f0 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43  i++){.    u8 *pC
1c100 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
1c110 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 70  Page, i);..    p
1c120 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
1c130 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 72  pPage, pCell, &r
1c140 63 29 3b 0a 0a 20 20 20 20 69 66 28 20 21 70 50  c);..    if( !pP
1c150 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
1c160 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e     Pgno childPgn
1c170 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65  o = get4byte(pCe
1c180 6c 6c 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61  ll);.      ptrma
1c190 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50  pPut(pBt, childP
1c1a0 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  gno, PTRMAP_BTRE
1c1b0 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20  E, pgno, &rc);. 
1c1c0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
1c1d0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
1c1e0 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67      Pgno childPg
1c1f0 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
1c200 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
1c210 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
1c220 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28  ;.    ptrmapPut(
1c230 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20  pBt, childPgno, 
1c240 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67  PTRMAP_BTREE, pg
1c250 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 7d 0a 0a 20  no, &rc);.  }.. 
1c260 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1c270 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f  *.** Somewhere o
1c280 6e 20 70 50 61 67 65 20 69 73 20 61 20 70 6f 69  n pPage is a poi
1c290 6e 74 65 72 20 74 6f 20 70 61 67 65 20 69 46 72  nter to page iFr
1c2a0 6f 6d 2e 20 20 4d 6f 64 69 66 79 20 74 68 69 73  om.  Modify this
1c2b0 20 70 6f 69 6e 74 65 72 20 73 6f 0a 2a 2a 20 74   pointer so.** t
1c2c0 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
1c2d0 20 69 54 6f 2e 20 50 61 72 61 6d 65 74 65 72 20   iTo. Parameter 
1c2e0 65 54 79 70 65 20 64 65 73 63 72 69 62 65 73 20  eType describes 
1c2f0 74 68 65 20 74 79 70 65 20 6f 66 20 70 6f 69 6e  the type of poin
1c300 74 65 72 20 74 6f 0a 2a 2a 20 62 65 20 6d 6f 64  ter to.** be mod
1c310 69 66 69 65 64 2c 20 61 73 20 20 66 6f 6c 6c 6f  ified, as  follo
1c320 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  ws:.**.** PTRMAP
1c330 5f 42 54 52 45 45 3a 20 20 20 20 20 70 50 61 67  _BTREE:     pPag
1c340 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67  e is a btree-pag
1c350 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70  e. The pointer p
1c360 6f 69 6e 74 73 20 61 74 20 61 20 63 68 69 6c 64  oints at a child
1c370 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20   .**            
1c380 20 20 20 20 20 20 20 70 61 67 65 20 6f 66 20 70         page of p
1c390 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  Page..**.** PTRM
1c3a0 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50  AP_OVERFLOW1: pP
1c3b0 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70  age is a btree-p
1c3c0 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  age. The pointer
1c3d0 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f 76   points at an ov
1c3e0 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20  erflow.**       
1c3f0 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65              page
1c400 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 6f   pointed to by o
1c410 6e 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20  ne of the cells 
1c420 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  on pPage..**.** 
1c430 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
1c440 3a 20 70 50 61 67 65 20 69 73 20 61 6e 20 6f 76  : pPage is an ov
1c450 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65  erflow-page. The
1c460 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
1c470 61 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20  at the next.**  
1c480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c490 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
1c4a0 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73  n the list..*/.s
1c4b0 74 61 74 69 63 20 69 6e 74 20 6d 6f 64 69 66 79  tatic int modify
1c4c0 50 61 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50  PagePointer(MemP
1c4d0 61 67 65 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f  age *pPage, Pgno
1c4e0 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f   iFrom, Pgno iTo
1c4f0 2c 20 75 38 20 65 54 79 70 65 29 7b 0a 20 20 61  , u8 eType){.  a
1c500 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1c510 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
1c520 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
1c530 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1c540 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
1c550 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
1c560 29 20 29 3b 0a 20 20 69 66 28 20 65 54 79 70 65  ) );.  if( eType
1c570 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
1c580 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  W2 ){.    /* The
1c590 20 70 6f 69 6e 74 65 72 20 69 73 20 61 6c 77 61   pointer is alwa
1c5a0 79 73 20 74 68 65 20 66 69 72 73 74 20 34 20 62  ys the first 4 b
1c5b0 79 74 65 73 20 6f 66 20 74 68 65 20 70 61 67 65  ytes of the page
1c5c0 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20   in this case.  
1c5d0 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74 34 62  */.    if( get4b
1c5e0 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
1c5f0 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  )!=iFrom ){.    
1c600 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c610 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1c620 20 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74 65    }.    put4byte
1c630 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69  (pPage->aData, i
1c640 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  To);.  }else{.  
1c650 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74    int i;.    int
1c660 20 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 74 20   nCell;.    int 
1c670 72 63 3b 0a 0a 20 20 20 20 72 63 20 3d 20 62 74  rc;..    rc = bt
1c680 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67  reeInitPage(pPag
1c690 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
1c6a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1c6b0 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e  nCell = pPage->n
1c6c0 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69  Cell;..    for(i
1c6d0 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
1c6e0 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65  ){.      u8 *pCe
1c6f0 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
1c700 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 69  age, i);.      i
1c710 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
1c720 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20  _OVERFLOW1 ){.  
1c730 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69        CellInfo i
1c740 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 70 50 61  nfo;.        pPa
1c750 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70  ge->xParseCell(p
1c760 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
1c770 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  fo);.        if(
1c780 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66   info.nLocal<inf
1c790 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20  o.nPayload ){.  
1c7a0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 65 6c          if( pCel
1c7b0 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 20 3e 20 70  l+info.nSize > p
1c7c0 50 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61 67  Page->aData+pPag
1c7d0 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
1c7e0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
1c7f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c800 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1c810 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1c820 20 20 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d 67      if( iFrom==g
1c830 65 74 34 62 79 74 65 28 70 43 65 6c 6c 2b 69 6e  et4byte(pCell+in
1c840 66 6f 2e 6e 53 69 7a 65 2d 34 29 20 29 7b 0a 20  fo.nSize-4) ){. 
1c850 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
1c860 79 74 65 28 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e  yte(pCell+info.n
1c870 53 69 7a 65 2d 34 2c 20 69 54 6f 29 3b 0a 20 20  Size-4, iTo);.  
1c880 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1c890 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1c8a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
1c8b0 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  se{.        if( 
1c8c0 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3d  get4byte(pCell)=
1c8d0 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
1c8e0 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65      put4byte(pCe
1c8f0 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20  ll, iTo);.      
1c900 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1c910 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1c920 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 69 3d   }.  .    if( i=
1c930 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  =nCell ){.      
1c940 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41  if( eType!=PTRMA
1c950 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20 20 20  P_BTREE || .    
1c960 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26        get4byte(&
1c970 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
1c980 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
1c990 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  )!=iFrom ){.    
1c9a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1c9b0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1c9c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75        }.      pu
1c9d0 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
1c9e0 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
1c9f0 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a  ffset+8], iTo);.
1ca00 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1ca10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1ca20 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
1ca30 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 70   open database p
1ca40 61 67 65 20 70 44 62 50 61 67 65 20 74 6f 20 6c  age pDbPage to l
1ca50 6f 63 61 74 69 6f 6e 20 69 46 72 65 65 50 61 67  ocation iFreePag
1ca60 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74  e in the .** dat
1ca70 61 62 61 73 65 2e 20 54 68 65 20 70 44 62 50 61  abase. The pDbPa
1ca80 67 65 20 72 65 66 65 72 65 6e 63 65 20 72 65 6d  ge reference rem
1ca90 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a  ains valid..**.*
1caa0 2a 20 54 68 65 20 69 73 43 6f 6d 6d 69 74 20 66  * The isCommit f
1cab0 6c 61 67 20 69 6e 64 69 63 61 74 65 73 20 74 68  lag indicates th
1cac0 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  at there is no n
1cad0 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20  eed to remember 
1cae0 74 68 61 74 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  that.** the jour
1caf0 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20  nal needs to be 
1cb00 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20  sync()ed before 
1cb10 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44  database page pD
1cb20 62 50 61 67 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20  bPage->pgno .** 
1cb30 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 74  can be written t
1cb40 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 68 61  o. The caller ha
1cb50 73 20 61 6c 72 65 61 64 79 20 70 72 6f 6d 69 73  s already promis
1cb60 65 64 20 6e 6f 74 20 74 6f 20 77 72 69 74 65 20  ed not to write 
1cb70 74 6f 20 74 68 61 74 0a 2a 2a 20 70 61 67 65 2e  to that.** page.
1cb80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
1cb90 65 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20 42  elocatePage(.  B
1cba0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
1cbb0 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65          /* Btree
1cbc0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
1cbd0 44 62 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f  DbPage,        /
1cbe0 2a 20 4f 70 65 6e 20 70 61 67 65 20 74 6f 20 6d  * Open page to m
1cbf0 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70  ove */.  u8 eTyp
1cc00 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1cc10 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
1cc20 20 27 74 79 70 65 27 20 65 6e 74 72 79 20 66 6f   'type' entry fo
1cc30 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50  r pDbPage */.  P
1cc40 67 6e 6f 20 69 50 74 72 50 61 67 65 2c 20 20 20  gno iPtrPage,   
1cc50 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
1cc60 65 72 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27  er map 'page-no'
1cc70 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61   entry for pDbPa
1cc80 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72  ge */.  Pgno iFr
1cc90 65 65 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  eePage,         
1cca0 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e   /* The location
1ccb0 20 74 6f 20 6d 6f 76 65 20 70 44 62 50 61 67 65   to move pDbPage
1ccc0 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43   to */.  int isC
1ccd0 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 20 20 20  ommit           
1cce0 20 20 2f 2a 20 69 73 43 6f 6d 6d 69 74 20 66 6c    /* isCommit fl
1ccf0 61 67 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c  ag passed to sql
1cd00 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67  ite3PagerMovepag
1cd10 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67  e */.){.  MemPag
1cd20 65 20 2a 70 50 74 72 50 61 67 65 3b 20 20 20 2f  e *pPtrPage;   /
1cd30 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
1cd40 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
1cd50 65 72 20 74 6f 20 70 44 62 50 61 67 65 20 2a 2f  er to pDbPage */
1cd60 0a 20 20 50 67 6e 6f 20 69 44 62 50 61 67 65 20  .  Pgno iDbPage 
1cd70 3d 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b  = pDbPage->pgno;
1cd80 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1cd90 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a   = pBt->pPager;.
1cda0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
1cdb0 65 72 74 28 20 65 54 79 70 65 3d 3d 50 54 52 4d  ert( eType==PTRM
1cdc0 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20  AP_OVERFLOW2 || 
1cdd0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
1cde0 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20  ERFLOW1 || .    
1cdf0 20 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f    eType==PTRMAP_
1ce00 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d  BTREE || eType==
1ce10 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
1ce20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
1ce30 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1ce40 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
1ce50 20 61 73 73 65 72 74 28 20 70 44 62 50 61 67 65   assert( pDbPage
1ce60 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 0a 20  ->pBt==pBt );.. 
1ce70 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20 69 44   /* Move page iD
1ce80 62 50 61 67 65 20 66 72 6f 6d 20 69 74 73 20 63  bPage from its c
1ce90 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20  urrent location 
1cea0 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  to page number i
1ceb0 46 72 65 65 50 61 67 65 20 2a 2f 0a 20 20 54 52  FreePage */.  TR
1cec0 41 43 45 28 28 22 41 55 54 4f 56 41 43 55 55 4d  ACE(("AUTOVACUUM
1ced0 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20 66  : Moving %d to f
1cee0 72 65 65 20 70 61 67 65 20 25 64 20 28 70 74 72  ree page %d (ptr
1cef0 20 70 61 67 65 20 25 64 20 74 79 70 65 20 25 64   page %d type %d
1cf00 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69 44 62  )\n", .      iDb
1cf10 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c  Page, iFreePage,
1cf20 20 69 50 74 72 50 61 67 65 2c 20 65 54 79 70 65   iPtrPage, eType
1cf30 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ));.  rc = sqlit
1cf40 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28  e3PagerMovepage(
1cf50 70 50 61 67 65 72 2c 20 70 44 62 50 61 67 65 2d  pPager, pDbPage-
1cf60 3e 70 44 62 50 61 67 65 2c 20 69 46 72 65 65 50  >pDbPage, iFreeP
1cf70 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a  age, isCommit);.
1cf80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1cf90 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
1cfa0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50  n rc;.  }.  pDbP
1cfb0 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65  age->pgno = iFre
1cfc0 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  ePage;..  /* If 
1cfd0 70 44 62 50 61 67 65 20 77 61 73 20 61 20 62 74  pDbPage was a bt
1cfe0 72 65 65 2d 70 61 67 65 2c 20 74 68 65 6e 20 69  ree-page, then i
1cff0 74 20 6d 61 79 20 68 61 76 65 20 63 68 69 6c 64  t may have child
1d000 20 70 61 67 65 73 20 61 6e 64 2f 6f 72 20 63 65   pages and/or ce
1d010 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f  lls.  ** that po
1d020 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20  int to overflow 
1d030 70 61 67 65 73 2e 20 54 68 65 20 70 6f 69 6e 74  pages. The point
1d040 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66  er map entries f
1d050 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a  or all these.  *
1d060 2a 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20  * pages need to 
1d070 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a  be changed..  **
1d080 0a 20 20 2a 2a 20 49 66 20 70 44 62 50 61 67 65  .  ** If pDbPage
1d090 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   is an overflow 
1d0a0 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 66  page, then the f
1d0b0 69 72 73 74 20 34 20 62 79 74 65 73 20 6d 61 79  irst 4 bytes may
1d0c0 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f   store a.  ** po
1d0d0 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62 73 65  inter to a subse
1d0e0 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70  quent overflow p
1d0f0 61 67 65 2e 20 49 66 20 74 68 69 73 20 69 73 20  age. If this is 
1d100 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 0a 20  the case, then. 
1d110 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 20   ** the pointer 
1d120 6d 61 70 20 6e 65 65 64 73 20 74 6f 20 62 65 20  map needs to be 
1d130 75 70 64 61 74 65 64 20 66 6f 72 20 74 68 65 20  updated for the 
1d140 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66  subsequent overf
1d150 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20  low page..  */. 
1d160 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
1d170 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70  AP_BTREE || eTyp
1d180 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e==PTRMAP_ROOTPA
1d190 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  GE ){.    rc = s
1d1a0 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70  etChildPtrmaps(p
1d1b0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
1d1c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1d1d0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
1d1e0 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  c;.    }.  }else
1d1f0 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f  {.    Pgno nextO
1d200 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 70  vfl = get4byte(p
1d210 44 62 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a  DbPage->aData);.
1d220 20 20 20 20 69 66 28 20 6e 65 78 74 4f 76 66 6c      if( nextOvfl
1d230 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 74 72  !=0 ){.      ptr
1d240 6d 61 70 50 75 74 28 70 42 74 2c 20 6e 65 78 74  mapPut(pBt, next
1d250 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45  Ovfl, PTRMAP_OVE
1d260 52 46 4c 4f 57 32 2c 20 69 46 72 65 65 50 61 67  RFLOW2, iFreePag
1d270 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69  e, &rc);.      i
1d280 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1d290 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
1d2a0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
1d2b0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
1d2c0 69 78 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ix the database 
1d2d0 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67 65 20  pointer on page 
1d2e0 69 50 74 72 50 61 67 65 20 74 68 61 74 20 70 6f  iPtrPage that po
1d2f0 69 6e 74 65 64 20 61 74 20 69 44 62 50 61 67 65  inted at iDbPage
1d300 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69 74   so.  ** that it
1d310 20 70 6f 69 6e 74 73 20 61 74 20 69 46 72 65 65   points at iFree
1d320 50 61 67 65 2e 20 41 6c 73 6f 20 66 69 78 20 74  Page. Also fix t
1d330 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
1d340 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50  ntry for.  ** iP
1d350 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  trPage..  */.  i
1d360 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50  f( eType!=PTRMAP
1d370 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
1d380 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
1d390 67 65 28 70 42 74 2c 20 69 50 74 72 50 61 67 65  ge(pBt, iPtrPage
1d3a0 2c 20 26 70 50 74 72 50 61 67 65 2c 20 30 29 3b  , &pPtrPage, 0);
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 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1d3f0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 74 72  3PagerWrite(pPtr
1d400 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
1d410 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1d420 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1d430 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50  eleasePage(pPtrP
1d440 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  age);.      retu
1d450 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
1d460 20 72 63 20 3d 20 6d 6f 64 69 66 79 50 61 67 65   rc = modifyPage
1d470 50 6f 69 6e 74 65 72 28 70 50 74 72 50 61 67 65  Pointer(pPtrPage
1d480 2c 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65  , iDbPage, iFree
1d490 50 61 67 65 2c 20 65 54 79 70 65 29 3b 0a 20 20  Page, eType);.  
1d4a0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
1d4b0 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  trPage);.    if(
1d4c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1d4d0 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75  {.      ptrmapPu
1d4e0 74 28 70 42 74 2c 20 69 46 72 65 65 50 61 67 65  t(pBt, iFreePage
1d4f0 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67  , eType, iPtrPag
1d500 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20  e, &rc);.    }. 
1d510 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1d520 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65  }../* Forward de
1d530 63 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72  claration requir
1d540 65 64 20 62 79 20 69 6e 63 72 56 61 63 75 75 6d  ed by incrVacuum
1d550 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69  Step(). */.stati
1d560 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74  c int allocateBt
1d570 72 65 65 50 61 67 65 28 42 74 53 68 61 72 65 64  reePage(BtShared
1d580 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20   *, MemPage **, 
1d590 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38  Pgno *, Pgno, u8
1d5a0 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72  );../*.** Perfor
1d5b0 6d 20 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20  m a single step 
1d5c0 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  of an incrementa
1d5d0 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20 73 75 63  l-vacuum. If suc
1d5e0 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a  cessful, return.
1d5f0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66  ** SQLITE_OK. If
1d600 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72   there is no wor
1d610 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20 74 68 65  k to do (and the
1d620 72 65 66 6f 72 65 20 6e 6f 20 70 6f 69 6e 74 20  refore no point 
1d630 69 6e 20 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74  in .** calling t
1d640 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61  his function aga
1d650 69 6e 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  in), return SQLI
1d660 54 45 5f 44 4f 4e 45 2e 20 4f 72 2c 20 69 66 20  TE_DONE. Or, if 
1d670 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63  an error .** occ
1d680 75 72 73 2c 20 72 65 74 75 72 6e 20 73 6f 6d 65  urs, return some
1d690 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64   other error cod
1d6a0 65 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70  e..**.** More sp
1d6b0 65 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 69 73  ecifically, this
1d6c0 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70   function attemp
1d6d0 74 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a  ts to re-organiz
1d6e0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  e the database s
1d6f0 6f 20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6c  o .** that the l
1d700 61 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  ast page of the 
1d710 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69  file currently i
1d720 6e 20 75 73 65 20 69 73 20 6e 6f 20 6c 6f 6e 67  n use is no long
1d730 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a  er in use..**.**
1d740 20 50 61 72 61 6d 65 74 65 72 20 6e 46 69 6e 20   Parameter nFin 
1d750 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
1d760 20 70 61 67 65 73 20 74 68 61 74 20 74 68 69 73   pages that this
1d770 20 64 61 74 61 62 61 73 65 20 77 6f 75 6c 64 20   database would 
1d780 63 6f 6e 74 61 69 6e 0a 2a 2a 20 77 65 72 65 20  contain.** were 
1d790 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61  this function ca
1d7a0 6c 6c 65 64 20 75 6e 74 69 6c 20 69 74 20 72 65  lled until it re
1d7b0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e  turns SQLITE_DON
1d7c0 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  E..**.** If the 
1d7d0 62 43 6f 6d 6d 69 74 20 70 61 72 61 6d 65 74 65  bCommit paramete
1d7e0 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  r is non-zero, t
1d7f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73  his function ass
1d800 75 6d 65 73 20 74 68 61 74 20 74 68 65 20 0a 2a  umes that the .*
1d810 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65  * caller will ke
1d820 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56  ep calling incrV
1d830 61 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69  acuumStep() unti
1d840 6c 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c  l it returns SQL
1d850 49 54 45 5f 44 4f 4e 45 20 0a 2a 2a 20 6f 72 20  ITE_DONE .** or 
1d860 61 6e 20 65 72 72 6f 72 2e 20 62 43 6f 6d 6d 69  an error. bCommi
1d870 74 20 69 73 20 70 61 73 73 65 64 20 74 72 75 65  t is passed true
1d880 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63   for an auto-vac
1d890 75 75 6d 2d 6f 6e 2d 63 6f 6d 6d 69 74 20 0a 2a  uum-on-commit .*
1d8a0 2a 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6f 72 20  * operation, or 
1d8b0 66 61 6c 73 65 20 66 6f 72 20 61 6e 20 69 6e 63  false for an inc
1d8c0 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e  remental vacuum.
1d8d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
1d8e0 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 42 74  ncrVacuumStep(Bt
1d8f0 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
1d900 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61  o nFin, Pgno iLa
1d910 73 74 50 67 2c 20 69 6e 74 20 62 43 6f 6d 6d 69  stPg, int bCommi
1d920 74 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65  t){.  Pgno nFree
1d930 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
1d940 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
1d950 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20  es still on the 
1d960 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69  free-list */.  i
1d970 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
1d980 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1d990 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
1d9a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c   );.  assert( iL
1d9b0 61 73 74 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20  astPg>nFin );.. 
1d9c0 20 69 66 28 20 21 50 54 52 4d 41 50 5f 49 53 50   if( !PTRMAP_ISP
1d9d0 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67  AGE(pBt, iLastPg
1d9e0 29 20 26 26 20 69 4c 61 73 74 50 67 21 3d 50 45  ) && iLastPg!=PE
1d9f0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
1da00 70 42 74 29 20 29 7b 0a 20 20 20 20 75 38 20 65  pBt) ){.    u8 e
1da10 54 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69  Type;.    Pgno i
1da20 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46  PtrPage;..    nF
1da30 72 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79  reeList = get4by
1da40 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
1da50 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20  >aData[36]);.   
1da60 20 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d   if( nFreeList==
1da70 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
1da80 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
1da90 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70     }..    rc = p
1daa0 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c  trmapGet(pBt, iL
1dab0 61 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26  astPg, &eType, &
1dac0 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69  iPtrPage);.    i
1dad0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1dae0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1daf0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
1db00 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
1db10 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
1db20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1db30 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1db40 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54     }..    if( eT
1db50 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
1db60 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66  PAGE ){.      if
1db70 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a  ( bCommit==0 ){.
1db80 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76          /* Remov
1db90 65 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  e the page from 
1dba0 74 68 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c  the files free-l
1dbb0 69 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  ist. This is not
1dbc0 20 72 65 71 75 69 72 65 64 0a 20 20 20 20 20 20   required.      
1dbd0 20 20 2a 2a 20 69 66 20 62 43 6f 6d 6d 69 74 20    ** if bCommit 
1dbe0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20  is non-zero. In 
1dbf0 74 68 61 74 20 63 61 73 65 2c 20 74 68 65 20 66  that case, the f
1dc00 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65  ree-list will be
1dc10 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75 6e  .        ** trun
1dc20 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61 66  cated to zero af
1dc30 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
1dc40 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69 74  n returns, so it
1dc50 20 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20 20   doesn't .      
1dc60 20 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20 69    ** matter if i
1dc70 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73  t still contains
1dc80 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65 6e   some garbage en
1dc90 74 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  tries..        *
1dca0 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69  /.        Pgno i
1dcb0 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20  FreePg;.        
1dcc0 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67  MemPage *pFreePg
1dcd0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  ;.        rc = a
1dce0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
1dcf0 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20  (pBt, &pFreePg, 
1dd00 26 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74 50  &iFreePg, iLastP
1dd10 67 2c 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54  g, BTALLOC_EXACT
1dd20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1dd30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1dd40 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1dd50 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
1dd60 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
1dd70 46 72 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20  FreePg==iLastPg 
1dd80 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
1dd90 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b  sePage(pFreePg);
1dda0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65  .      }.    } e
1ddb0 6c 73 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f  lse {.      Pgno
1ddc0 20 69 46 72 65 65 50 67 3b 20 20 20 20 20 20 20   iFreePg;       
1ddd0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
1dde0 66 20 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d  f free page to m
1ddf0 6f 76 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a  ove pLastPg to *
1de00 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20  /.      MemPage 
1de10 2a 70 4c 61 73 74 50 67 3b 0a 20 20 20 20 20 20  *pLastPg;.      
1de20 75 38 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c  u8 eMode = BTALL
1de30 4f 43 5f 41 4e 59 3b 20 20 20 2f 2a 20 4d 6f 64  OC_ANY;   /* Mod
1de40 65 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20  e parameter for 
1de50 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
1de60 65 28 29 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e  e() */.      Pgn
1de70 6f 20 69 4e 65 61 72 20 3d 20 30 3b 20 20 20 20  o iNear = 0;    
1de80 20 20 20 20 20 20 20 2f 2a 20 6e 65 61 72 62 79         /* nearby
1de90 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61   parameter for a
1dea0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
1deb0 28 29 20 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20  () */..      rc 
1dec0 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
1ded0 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c  Bt, iLastPg, &pL
1dee0 61 73 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20  astPg, 0);.     
1def0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1df00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
1df10 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1df20 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 62 43  ..      /* If bC
1df30 6f 6d 6d 69 74 20 69 73 20 7a 65 72 6f 2c 20 74  ommit is zero, t
1df40 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78  his loop runs ex
1df50 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70  actly once and p
1df60 61 67 65 20 70 4c 61 73 74 50 67 0a 20 20 20 20  age pLastPg.    
1df70 20 20 2a 2a 20 69 73 20 73 77 61 70 70 65 64 20    ** is swapped 
1df80 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20 66  with the first f
1df90 72 65 65 20 70 61 67 65 20 70 75 6c 6c 65 64 20  ree page pulled 
1dfa0 6f 66 66 20 74 68 65 20 66 72 65 65 20 6c 69 73  off the free lis
1dfb0 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  t..      **.    
1dfc0 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65    ** On the othe
1dfd0 72 20 68 61 6e 64 2c 20 69 66 20 62 43 6f 6d 6d  r hand, if bComm
1dfe0 69 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  it is greater th
1dff0 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65  an zero, then ke
1e000 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70  ep.      ** loop
1e010 69 6e 67 20 75 6e 74 69 6c 20 61 20 66 72 65 65  ing until a free
1e020 2d 70 61 67 65 20 6c 6f 63 61 74 65 64 20 77 69  -page located wi
1e030 74 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e  thin the first n
1e040 46 69 6e 20 70 61 67 65 73 0a 20 20 20 20 20 20  Fin pages.      
1e050 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ** of the file i
1e060 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a  s found..      *
1e070 2f 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d  /.      if( bCom
1e080 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  mit==0 ){.      
1e090 20 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f    eMode = BTALLO
1e0a0 43 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20 69 4e  C_LE;.        iN
1e0b0 65 61 72 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20  ear = nFin;.    
1e0c0 20 20 7d 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20    }.      do {. 
1e0d0 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
1e0e0 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  pFreePg;.       
1e0f0 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
1e100 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46  reePage(pBt, &pF
1e110 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c  reePg, &iFreePg,
1e120 20 69 4e 65 61 72 2c 20 65 4d 6f 64 65 29 3b 0a   iNear, eMode);.
1e130 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1e140 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1e150 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
1e160 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20  ge(pLastPg);.   
1e170 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1e180 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1e190 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1e1a0 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20  pFreePg);.      
1e1b0 7d 77 68 69 6c 65 28 20 62 43 6f 6d 6d 69 74 20  }while( bCommit 
1e1c0 26 26 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20  && iFreePg>nFin 
1e1d0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1e1e0 20 69 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67   iFreePg<iLastPg
1e1f0 20 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20   );.      .     
1e200 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61   rc = relocatePa
1e210 67 65 28 70 42 74 2c 20 70 4c 61 73 74 50 67 2c  ge(pBt, pLastPg,
1e220 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65   eType, iPtrPage
1e230 2c 20 69 46 72 65 65 50 67 2c 20 62 43 6f 6d 6d  , iFreePg, bComm
1e240 69 74 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  it);.      relea
1e250 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b  sePage(pLastPg);
1e260 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1e270 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1e280 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1e290 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1e2a0 0a 0a 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d  ..  if( bCommit=
1e2b0 3d 30 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20  =0 ){.    do {. 
1e2c0 20 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a       iLastPg--;.
1e2d0 20 20 20 20 7d 77 68 69 6c 65 28 20 69 4c 61 73      }while( iLas
1e2e0 74 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  tPg==PENDING_BYT
1e2f0 45 5f 50 41 47 45 28 70 42 74 29 20 7c 7c 20 50  E_PAGE(pBt) || P
1e300 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
1e310 2c 20 69 4c 61 73 74 50 67 29 20 29 3b 0a 20 20  , iLastPg) );.  
1e320 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61    pBt->bDoTrunca
1e330 74 65 20 3d 20 31 3b 0a 20 20 20 20 70 42 74 2d  te = 1;.    pBt-
1e340 3e 6e 50 61 67 65 20 3d 20 69 4c 61 73 74 50 67  >nPage = iLastPg
1e350 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
1e360 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1e370 2a 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  ** The database 
1e380 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 66 69  opened by the fi
1e390 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
1e3a0 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
1e3b0 61 74 61 62 61 73 65 0a 2a 2a 20 6e 4f 72 69 67  atabase.** nOrig
1e3c0 20 70 61 67 65 73 20 69 6e 20 73 69 7a 65 20 63   pages in size c
1e3d0 6f 6e 74 61 69 6e 69 6e 67 20 6e 46 72 65 65 20  ontaining nFree 
1e3e0 66 72 65 65 20 70 61 67 65 73 2e 20 52 65 74 75  free pages. Retu
1e3f0 72 6e 20 74 68 65 20 65 78 70 65 63 74 65 64 20  rn the expected 
1e400 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20  .** size of the 
1e410 64 61 74 61 62 61 73 65 20 69 6e 20 70 61 67 65  database in page
1e420 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 61  s following an a
1e430 75 74 6f 2d 76 61 63 75 75 6d 20 6f 70 65 72 61  uto-vacuum opera
1e440 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
1e450 50 67 6e 6f 20 66 69 6e 61 6c 44 62 53 69 7a 65  Pgno finalDbSize
1e460 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
1e470 50 67 6e 6f 20 6e 4f 72 69 67 2c 20 50 67 6e 6f  Pgno nOrig, Pgno
1e480 20 6e 46 72 65 65 29 7b 0a 20 20 69 6e 74 20 6e   nFree){.  int n
1e490 45 6e 74 72 79 3b 20 20 20 20 20 20 20 20 20 20  Entry;          
1e4a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1e4b0 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
1e4c0 6f 6e 20 6f 6e 65 20 70 74 72 6d 61 70 20 70 61  on one ptrmap pa
1e4d0 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 74  ge */.  Pgno nPt
1e4e0 72 6d 61 70 3b 20 20 20 20 20 20 20 20 20 20 20  rmap;           
1e4f0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1e500 72 20 6f 66 20 50 74 72 4d 61 70 20 70 61 67 65  r of PtrMap page
1e510 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f  s to be freed */
1e520 0a 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20  .  Pgno nFin;   
1e530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e540 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c     /* Return val
1e550 75 65 20 2a 2f 0a 0a 20 20 6e 45 6e 74 72 79 20  ue */..  nEntry 
1e560 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
1e570 65 2f 35 3b 0a 20 20 6e 50 74 72 6d 61 70 20 3d  e/5;.  nPtrmap =
1e580 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54   (nFree-nOrig+PT
1e590 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
1e5a0 20 6e 4f 72 69 67 29 2b 6e 45 6e 74 72 79 29 2f   nOrig)+nEntry)/
1e5b0 6e 45 6e 74 72 79 3b 0a 20 20 6e 46 69 6e 20 3d  nEntry;.  nFin =
1e5c0 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d   nOrig - nFree -
1e5d0 20 6e 50 74 72 6d 61 70 3b 0a 20 20 69 66 28 20   nPtrmap;.  if( 
1e5e0 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59  nOrig>PENDING_BY
1e5f0 54 45 5f 50 41 47 45 28 70 42 74 29 20 26 26 20  TE_PAGE(pBt) && 
1e600 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54  nFin<PENDING_BYT
1e610 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
1e620 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 20     nFin--;.  }. 
1e630 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49   while( PTRMAP_I
1e640 53 50 41 47 45 28 70 42 74 2c 20 6e 46 69 6e 29  SPAGE(pBt, nFin)
1e650 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e   || nFin==PENDIN
1e660 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
1e670 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a   ){.    nFin--;.
1e680 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 46    }..  return nF
1e690 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77  in;.}../*.** A w
1e6a0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
1e6b0 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20   must be opened 
1e6c0 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74  before calling t
1e6d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
1e6e0 20 49 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73   It performs a s
1e6f0 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f  ingle unit of wo
1e700 72 6b 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e  rk towards an in
1e710 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
1e720 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ..**.** If the i
1e730 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
1e740 6d 20 69 73 20 66 69 6e 69 73 68 65 64 20 61 66  m is finished af
1e750 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
1e760 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51  n has run,.** SQ
1e770 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74  LITE_DONE is ret
1e780 75 72 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20  urned. If it is 
1e790 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75  not finished, bu
1e7a0 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  t no error occur
1e7b0 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  red,.** SQLITE_O
1e7c0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  K is returned. O
1e7d0 74 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69  therwise an SQLi
1e7e0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a  te error code. .
1e7f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1e800 72 65 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74  reeIncrVacuum(Bt
1e810 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
1e820 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
1e830 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20  Bt = p->pBt;..  
1e840 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1e850 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r(p);.  assert( 
1e860 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1e870 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
1e880 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  && p->inTrans==T
1e890 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
1e8a0 69 66 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61  if( !pBt->autoVa
1e8b0 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d  cuum ){.    rc =
1e8c0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
1e8d0 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20  }else{.    Pgno 
1e8e0 6e 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61 67  nOrig = btreePag
1e8f0 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20  ecount(pBt);.   
1e900 20 50 67 6e 6f 20 6e 46 72 65 65 20 3d 20 67 65   Pgno nFree = ge
1e910 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
1e920 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
1e930 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d  .    Pgno nFin =
1e940 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74   finalDbSize(pBt
1e950 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b  , nOrig, nFree);
1e960 0a 0a 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3c  ..    if( nOrig<
1e970 6e 46 69 6e 20 29 7b 0a 20 20 20 20 20 20 72 63  nFin ){.      rc
1e980 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
1e990 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73  T_BKPT;.    }els
1e9a0 65 20 69 66 28 20 6e 46 72 65 65 3e 30 20 29 7b  e if( nFree>0 ){
1e9b0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65  .      rc = save
1e9c0 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
1e9d0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
1e9e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1e9f0 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69  {.        invali
1ea00 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
1ea10 61 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20 20  ache(pBt);.     
1ea20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75     rc = incrVacu
1ea30 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e  umStep(pBt, nFin
1ea40 2c 20 6e 4f 72 69 67 2c 20 30 29 3b 0a 20 20 20  , nOrig, 0);.   
1ea50 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
1ea60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1ea70 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1ea80 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1ea90 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50  Bt->pPage1->pDbP
1eaa0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 75  age);.        pu
1eab0 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
1eac0 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20  ge1->aData[28], 
1ead0 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20  pBt->nPage);.   
1eae0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
1eaf0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1eb00 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  E_DONE;.    }.  
1eb10 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
1eb20 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
1eb30 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1eb40 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1eb50 63 61 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f 20  called prior to 
1eb60 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
1eb70 69 74 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61  it when a transa
1eb80 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d  ction.** is comm
1eb90 69 74 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74  itted for an aut
1eba0 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
1ebb0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49  e..**.** If SQLI
1ebc0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1ebd0 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63  d, then *pnTrunc
1ebe0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
1ebf0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a  umber of pages.*
1ec00 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
1ec10 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 74 72  ile should be tr
1ec20 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72 69 6e  uncated to durin
1ec30 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f  g the commit pro
1ec40 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74  cess. .** i.e. t
1ec50 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20  he database has 
1ec60 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64  been reorganized
1ec70 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74 68   so that only th
1ec80 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75 6e 63  e first *pnTrunc
1ec90 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20 69 6e  .** pages are in
1eca0 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   use..*/.static 
1ecb0 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 43 6f  int autoVacuumCo
1ecc0 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20 2a 70  mmit(BtShared *p
1ecd0 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Bt){.  int rc = 
1ece0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67  SQLITE_OK;.  Pag
1ecf0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74  er *pPager = pBt
1ed00 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56 56 41 5f  ->pPager;.  VVA_
1ed10 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66 20 3d  ONLY( int nRef =
1ed20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
1ed30 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 20 29  count(pPager); )
1ed40 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
1ed50 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1ed60 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1ed70 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
1ed80 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b  rflowCache(pBt);
1ed90 0a 20 20 61 73 73 65 72 74 28 70 42 74 2d 3e 61  .  assert(pBt->a
1eda0 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69 66  utoVacuum);.  if
1edb0 28 20 21 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  ( !pBt->incrVacu
1edc0 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  um ){.    Pgno n
1edd0 46 69 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Fin;         /* 
1ede0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
1edf0 69 6e 20 64 61 74 61 62 61 73 65 20 61 66 74 65  in database afte
1ee00 72 20 61 75 74 6f 76 61 63 75 75 6d 69 6e 67 20  r autovacuuming 
1ee10 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65  */.    Pgno nFre
1ee20 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  e;        /* Num
1ee30 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20  ber of pages on 
1ee40 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 6e 69  the freelist ini
1ee50 74 69 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 50 67  tially */.    Pg
1ee60 6e 6f 20 69 46 72 65 65 3b 20 20 20 20 20 20 20  no iFree;       
1ee70 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 70 61 67   /* The next pag
1ee80 65 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f  e to be freed */
1ee90 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b  .    Pgno nOrig;
1eea0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
1eeb0 61 73 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20  ase size before 
1eec0 66 72 65 65 69 6e 67 20 2a 2f 0a 0a 20 20 20 20  freeing */..    
1eed0 6e 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61 67  nOrig = btreePag
1eee0 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20  ecount(pBt);.   
1eef0 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41   if( PTRMAP_ISPA
1ef00 47 45 28 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c  GE(pBt, nOrig) |
1ef10 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47  | nOrig==PENDING
1ef20 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1ef30 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69  ){.      /* It i
1ef40 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
1ef50 6f 20 63 72 65 61 74 65 20 61 20 64 61 74 61 62  o create a datab
1ef60 61 73 65 20 66 6f 72 20 77 68 69 63 68 20 74 68  ase for which th
1ef70 65 20 66 69 6e 61 6c 20 70 61 67 65 0a 20 20 20  e final page.   
1ef80 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20     ** is either 
1ef90 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  a pointer-map pa
1efa0 67 65 20 6f 72 20 74 68 65 20 70 65 6e 64 69 6e  ge or the pendin
1efb0 67 2d 62 79 74 65 20 70 61 67 65 2e 20 49 66 20  g-byte page. If 
1efc0 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  one.      ** is 
1efd0 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 69  encountered, thi
1efe0 73 20 69 6e 64 69 63 61 74 65 73 20 63 6f 72 72  s indicates corr
1eff0 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  uption..      */
1f000 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1f010 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1f020 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46  T;.    }..    nF
1f030 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  ree = get4byte(&
1f040 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
1f050 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 6e 46 69  ta[36]);.    nFi
1f060 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65 28  n = finalDbSize(
1f070 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65  pBt, nOrig, nFre
1f080 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e  e);.    if( nFin
1f090 3e 6e 4f 72 69 67 20 29 20 72 65 74 75 72 6e 20  >nOrig ) return 
1f0a0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1f0b0 4b 50 54 3b 0a 20 20 20 20 69 66 28 20 6e 46 69  KPT;.    if( nFi
1f0c0 6e 3c 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  n<nOrig ){.     
1f0d0 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72   rc = saveAllCur
1f0e0 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b  sors(pBt, 0, 0);
1f0f0 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
1f100 46 72 65 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65  Free=nOrig; iFre
1f110 65 3e 6e 46 69 6e 20 26 26 20 72 63 3d 3d 53 51  e>nFin && rc==SQ
1f120 4c 49 54 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d  LITE_OK; iFree--
1f130 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e  ){.      rc = in
1f140 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74  crVacuumStep(pBt
1f150 2c 20 6e 46 69 6e 2c 20 69 46 72 65 65 2c 20 31  , nFin, iFree, 1
1f160 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1f170 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e   (rc==SQLITE_DON
1f180 45 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  E || rc==SQLITE_
1f190 4f 4b 29 20 26 26 20 6e 46 72 65 65 3e 30 20 29  OK) && nFree>0 )
1f1a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
1f1b0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1f1c0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50  Bt->pPage1->pDbP
1f1d0 61 67 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34  age);.      put4
1f1e0 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
1f1f0 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29  1->aData[32], 0)
1f200 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
1f210 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
1f220 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20  Data[36], 0);.  
1f230 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42      put4byte(&pB
1f240 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1f250 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20 20  [28], nFin);.   
1f260 20 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63     pBt->bDoTrunc
1f270 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  ate = 1;.      p
1f280 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 46 69 6e  Bt->nPage = nFin
1f290 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1f2a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1f2b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
1f2c0 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  gerRollback(pPag
1f2d0 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  er);.    }.  }..
1f2e0 20 20 61 73 73 65 72 74 28 20 6e 52 65 66 3e 3d    assert( nRef>=
1f2f0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
1f300 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a  ount(pPager) );.
1f310 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1f320 23 65 6c 73 65 20 2f 2a 20 69 66 6e 64 65 66 20  #else /* ifndef 
1f330 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1f340 56 41 43 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69  VACUUM */.# defi
1f350 6e 65 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61  ne setChildPtrma
1f360 70 73 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  ps(x) SQLITE_OK.
1f370 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
1f380 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
1f390 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20  the first phase 
1f3a0 6f 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63  of a two-phase c
1f3b0 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75  ommit.  This rou
1f3c0 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61  tine.** causes a
1f3d0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
1f3e0 6c 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  l to be created 
1f3f0 28 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  (if it does not 
1f400 61 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a  already exist).*
1f410 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20  * and populated 
1f420 77 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f  with enough info
1f430 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20  rmation so that 
1f440 69 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20  if a power loss 
1f450 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61  occurs.** the da
1f460 74 61 62 61 73 65 20 63 61 6e 20 62 65 20 72 65  tabase can be re
1f470 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72  stored to its or
1f480 69 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20  iginal state by 
1f490 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20  playing back.** 
1f4a0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  the journal.  Th
1f4b0 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  en the contents 
1f4c0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  of the journal a
1f4d0 72 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74  re flushed out t
1f4e0 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20  o.** the disk.  
1f4f0 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61  After the journa
1f500 6c 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f  l is safely on o
1f510 78 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65  xide, the change
1f520 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61  s to the.** data
1f530 62 61 73 65 20 61 72 65 20 77 72 69 74 74 65 6e  base are written
1f540 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
1f550 73 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73  se file and flus
1f560 68 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a  hed to oxide..**
1f570 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   At the end of t
1f580 68 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f  his call, the ro
1f590 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73  llback journal s
1f5a0 74 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74  till exists on t
1f5b0 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77  he.** disk and w
1f5c0 65 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64  e are still hold
1f5d0 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73  ing all locks, s
1f5e0 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  o the transactio
1f5f0 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d  n has not.** com
1f600 6d 69 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c  mitted.  See sql
1f610 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
1f620 68 61 73 65 54 77 6f 28 29 20 66 6f 72 20 74 68  haseTwo() for th
1f630 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f  e second phase o
1f640 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20  f the.** commit 
1f650 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54  process..**.** T
1f660 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f  his call is a no
1f670 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d  -op if no write-
1f680 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
1f690 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20  urrently active 
1f6a0 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74  on pBt..**.** Ot
1f6b0 68 65 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68  herwise, sync th
1f6c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1f6d0 66 6f 72 20 74 68 65 20 62 74 72 65 65 20 70 42  for the btree pB
1f6e0 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74  t. zMaster point
1f6f0 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65  s to.** the name
1f700 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
1f710 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73  rnal file that s
1f720 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e  hould be written
1f730 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64   into the.** ind
1f740 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20  ividual journal 
1f750 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c  file, or is NULL
1f760 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20  , indicating no 
1f770 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1f780 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20  ile .** (single 
1f790 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
1f7a0 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  tion)..**.** Whe
1f7b0 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  n this is called
1f7c0 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  , the master jou
1f7d0 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65  rnal should alre
1f7e0 61 64 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a  ady have been.**
1f7f0 20 63 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61   created, popula
1f800 74 65 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f  ted with this jo
1f810 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e  urnal pointer an
1f820 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  d synced to disk
1f830 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69  ..**.** Once thi
1f840 73 20 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  s is routine has
1f850 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f   returned, the o
1f860 6e 6c 79 20 74 68 69 6e 67 20 72 65 71 75 69 72  nly thing requir
1f870 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20  ed to commit.** 
1f880 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  the write-transa
1f890 63 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64  ction for this d
1f8a0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
1f8b0 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  to delete the jo
1f8c0 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urnal..*/.int sq
1f8d0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
1f8e0 50 68 61 73 65 4f 6e 65 28 42 74 72 65 65 20 2a  PhaseOne(Btree *
1f8f0 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
1f900 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
1f910 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1f920 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
1f930 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
1f940 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
1f950 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20  t = p->pBt;.    
1f960 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1f970 72 28 70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  r(p);.#ifndef SQ
1f980 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1f990 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74  CUUM.    if( pBt
1f9a0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
1f9b0 20 20 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56        rc = autoV
1f9c0 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 29  acuumCommit(pBt)
1f9d0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1f9e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f9f0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
1fa00 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20  eLeave(p);.     
1fa10 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1fa20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1fa30 69 66 28 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e  if( pBt->bDoTrun
1fa40 63 61 74 65 20 29 7b 0a 20 20 20 20 20 20 73 71  cate ){.      sq
1fa50 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
1fa60 74 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50 61  teImage(pBt->pPa
1fa70 67 65 72 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  ger, pBt->nPage)
1fa80 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
1fa90 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1faa0 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f  agerCommitPhaseO
1fab0 6e 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ne(pBt->pPager, 
1fac0 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20  zMaster, 0);.   
1fad0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1fae0 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ve(p);.  }.  ret
1faf0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1fb00 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1fb10 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 6f  s called from bo
1fb20 74 68 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  th BtreeCommitPh
1fb30 61 73 65 54 77 6f 28 29 20 61 6e 64 20 42 74 72  aseTwo() and Btr
1fb40 65 65 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20  eeRollback().** 
1fb50 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
1fb60 6e 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  n of a transacti
1fb70 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
1fb80 69 64 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73  id btreeEndTrans
1fb90 61 63 74 69 6f 6e 28 42 74 72 65 65 20 2a 70 29  action(Btree *p)
1fba0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
1fbb0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71  t = p->pBt;.  sq
1fbc0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
1fbd0 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  b;.  assert( sql
1fbe0 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
1fbf0 74 65 78 28 70 29 20 29 3b 0a 0a 23 69 66 6e 64  tex(p) );..#ifnd
1fc00 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1fc10 55 54 4f 56 41 43 55 55 4d 0a 20 20 70 42 74 2d  UTOVACUUM.  pBt-
1fc20 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 30  >bDoTruncate = 0
1fc30 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  ;.#endif.  if( p
1fc40 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f  ->inTrans>TRANS_
1fc50 4e 4f 4e 45 20 26 26 20 64 62 2d 3e 6e 56 64 62  NONE && db->nVdb
1fc60 65 52 65 61 64 3e 31 20 29 7b 0a 20 20 20 20 2f  eRead>1 ){.    /
1fc70 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  * If there are o
1fc80 74 68 65 72 20 61 63 74 69 76 65 20 73 74 61 74  ther active stat
1fc90 65 6d 65 6e 74 73 20 74 68 61 74 20 62 65 6c 6f  ements that belo
1fca0 6e 67 20 74 6f 20 74 68 69 73 20 64 61 74 61 62  ng to this datab
1fcb0 61 73 65 0a 20 20 20 20 2a 2a 20 68 61 6e 64 6c  ase.    ** handl
1fcc0 65 2c 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20  e, downgrade to 
1fcd0 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e  a read-only tran
1fce0 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 6f 74 68  saction. The oth
1fcf0 65 72 20 73 74 61 74 65 6d 65 6e 74 73 0a 20 20  er statements.  
1fd00 20 20 2a 2a 20 6d 61 79 20 73 74 69 6c 6c 20 62    ** may still b
1fd10 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74  e reading from t
1fd20 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f  he database.  */
1fd30 0a 20 20 20 20 64 6f 77 6e 67 72 61 64 65 41 6c  .    downgradeAl
1fd40 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
1fd50 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 70  eLocks(p);.    p
1fd60 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e  ->inTrans = TRAN
1fd70 53 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b  S_READ;.  }else{
1fd80 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 68  .    /* If the h
1fd90 61 6e 64 6c 65 20 68 61 64 20 61 6e 79 20 6b 69  andle had any ki
1fda0 6e 64 20 6f 66 20 74 72 61 6e 73 61 63 74 69 6f  nd of transactio
1fdb0 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e  n open, decremen
1fdc0 74 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 74 72  t the .    ** tr
1fdd0 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20  ansaction count 
1fde0 6f 66 20 74 68 65 20 73 68 61 72 65 64 20 62 74  of the shared bt
1fdf0 72 65 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e  ree. If the tran
1fe00 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 0a 20  saction count . 
1fe10 20 20 20 2a 2a 20 72 65 61 63 68 65 73 20 30 2c     ** reaches 0,
1fe20 20 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20   set the shared 
1fe30 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e  state to TRANS_N
1fe40 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42  ONE. The unlockB
1fe50 74 72 65 65 49 66 55 6e 75 73 65 64 28 29 0a 20  treeIfUnused(). 
1fe60 20 20 20 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f 77     ** call below
1fe70 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65   will unlock the
1fe80 20 70 61 67 65 72 2e 20 20 2a 2f 0a 20 20 20 20   pager.  */.    
1fe90 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d  if( p->inTrans!=
1fea0 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20  TRANS_NONE ){.  
1feb0 20 20 20 20 63 6c 65 61 72 41 6c 6c 53 68 61 72      clearAllShar
1fec0 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
1fed0 73 28 70 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  s(p);.      pBt-
1fee0 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b  >nTransaction--;
1fef0 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70 42  .      if( 0==pB
1ff00 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  t->nTransaction 
1ff10 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  ){.        pBt->
1ff20 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
1ff30 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20  TRANS_NONE;.    
1ff40 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1ff50 2a 20 53 65 74 20 74 68 65 20 63 75 72 72 65 6e  * Set the curren
1ff60 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74  t transaction st
1ff70 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e  ate to TRANS_NON
1ff80 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65  E and unlock the
1ff90 20 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 69   .    ** pager i
1ffa0 66 20 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73  f this call clos
1ffb0 65 64 20 74 68 65 20 6f 6e 6c 79 20 72 65 61 64  ed the only read
1ffc0 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61   or write transa
1ffd0 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 70  ction.  */.    p
1ffe0 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e  ->inTrans = TRAN
1fff0 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f  S_NONE;.    unlo
20000 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
20010 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72  pBt);.  }..  btr
20020 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
20030 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  }../*.** Commit 
20040 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
20050 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f  currently in pro
20060 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  gress..**.** Thi
20070 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d  s routine implem
20080 65 6e 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20  ents the second 
20090 70 68 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61  phase of a 2-pha
200a0 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a  se commit.  The.
200b0 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ** sqlite3BtreeC
200c0 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20  ommitPhaseOne() 
200d0 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65  routine does the
200e0 20 66 69 72 73 74 20 70 68 61 73 65 20 61 6e 64   first phase and
200f0 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e   should.** be in
20100 76 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f 20 63  voked prior to c
20110 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
20120 69 6e 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65  ine.  The sqlite
20130 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
20140 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  eOne().** routin
20150 65 20 64 69 64 20 61 6c 6c 20 74 68 65 20 77 6f  e did all the wo
20160 72 6b 20 6f 66 20 77 72 69 74 69 6e 67 20 69 6e  rk of writing in
20170 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f  formation out to
20180 20 64 69 73 6b 20 61 6e 64 20 66 6c 75 73 68 69   disk and flushi
20190 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  ng the.** conten
201a0 74 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20  ts so that they 
201b0 61 72 65 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f  are written onto
201c0 20 74 68 65 20 64 69 73 6b 20 70 6c 61 74 74 65   the disk platte
201d0 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20  r.  All this.** 
201e0 72 6f 75 74 69 6e 65 20 68 61 73 20 74 6f 20 64  routine has to d
201f0 6f 20 69 73 20 64 65 6c 65 74 65 20 6f 72 20 74  o is delete or t
20200 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20  runcate or zero 
20210 74 68 65 20 68 65 61 64 65 72 20 69 6e 20 74 68  the header in th
20220 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63  e.** the rollbac
20230 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63 68  k journal (which
20240 20 63 61 75 73 65 73 20 74 68 65 20 74 72 61 6e   causes the tran
20250 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69  saction to commi
20260 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c  t) and.** drop l
20270 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d  ocks..**.** Norm
20280 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f  ally, if an erro
20290 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
202a0 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 69  he pager layer i
202b0 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  s attempting to 
202c0 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 20 74 68 65  .** finalize the
202d0 20 75 6e 64 65 72 6c 79 69 6e 67 20 6a 6f 75 72   underlying jour
202e0 6e 61 6c 20 66 69 6c 65 2c 20 74 68 69 73 20 66  nal file, this f
202f0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
20300 61 6e 20 65 72 72 6f 72 20 61 6e 64 0a 2a 2a 20  an error and.** 
20310 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20  the upper layer 
20320 77 69 6c 6c 20 61 74 74 65 6d 70 74 20 61 20 72  will attempt a r
20330 6f 6c 6c 62 61 63 6b 2e 20 48 6f 77 65 76 65 72  ollback. However
20340 2c 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20  , if the second 
20350 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e  argument.** is n
20360 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e 20 74 68 69  on-zero then thi
20370 73 20 62 2d 74 72 65 65 20 74 72 61 6e 73 61 63  s b-tree transac
20380 74 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20  tion is part of 
20390 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 0a 2a 2a  a multi-file .**
203a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e   transaction. In
203b0 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20   this case, the 
203c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
203d0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6d  already been com
203e0 6d 69 74 74 65 64 20 0a 2a 2a 20 28 62 79 20 64  mitted .** (by d
203f0 65 6c 65 74 69 6e 67 20 61 20 6d 61 73 74 65 72  eleting a master
20400 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61   journal file) a
20410 6e 64 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  nd the caller wi
20420 6c 6c 20 69 67 6e 6f 72 65 20 74 68 69 73 20 0a  ll ignore this .
20430 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74  ** functions ret
20440 75 72 6e 20 63 6f 64 65 2e 20 53 6f 2c 20 65 76  urn code. So, ev
20450 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  en if an error o
20460 63 63 75 72 73 20 69 6e 20 74 68 65 20 70 61 67  ccurs in the pag
20470 65 72 20 6c 61 79 65 72 2c 0a 2a 2a 20 72 65 73  er layer,.** res
20480 65 74 20 74 68 65 20 62 2d 74 72 65 65 20 6f 62  et the b-tree ob
20490 6a 65 63 74 73 20 69 6e 74 65 72 6e 61 6c 20 73  jects internal s
204a0 74 61 74 65 20 74 6f 20 69 6e 64 69 63 61 74 65  tate to indicate
204b0 20 74 68 61 74 20 74 68 65 20 77 72 69 74 65 0a   that the write.
204c0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  ** transaction h
204d0 61 73 20 62 65 65 6e 20 63 6c 6f 73 65 64 2e 20  as been closed. 
204e0 54 68 69 73 20 69 73 20 71 75 69 74 65 20 73 61  This is quite sa
204f0 66 65 2c 20 61 73 20 74 68 65 20 70 61 67 65 72  fe, as the pager
20500 20 77 69 6c 6c 20 68 61 76 65 0a 2a 2a 20 74 72   will have.** tr
20510 61 6e 73 69 74 69 6f 6e 65 64 20 74 6f 20 74 68  ansitioned to th
20520 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a  e error state..*
20530 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72  *.** This will r
20540 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
20550 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
20560 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
20570 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
20580 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20  active cursors, 
20590 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73  it also releases
205a0 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
205b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
205c0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
205d0 6f 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  o(Btree *p, int 
205e0 62 43 6c 65 61 6e 75 70 29 7b 0a 0a 20 20 69 66  bCleanup){..  if
205f0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
20600 41 4e 53 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72  ANS_NONE ) retur
20610 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73  n SQLITE_OK;.  s
20620 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
20630 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65  (p);.  btreeInte
20640 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20  grity(p);..  /* 
20650 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61  If the handle ha
20660 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  s a write-transa
20670 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d  ction open, comm
20680 69 74 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  it the shared-bt
20690 72 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73  rees .  ** trans
206a0 61 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74  action and set t
206b0 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20  he shared state 
206c0 74 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20  to TRANS_READ.. 
206d0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54   */.  if( p->inT
206e0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
206f0 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  E ){.    int rc;
20700 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
20710 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20  Bt = p->pBt;.   
20720 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
20730 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
20740 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20  NS_WRITE );.    
20750 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72  assert( pBt->nTr
20760 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20  ansaction>0 );. 
20770 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
20780 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
20790 77 6f 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  wo(pBt->pPager);
207a0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
207b0 49 54 45 5f 4f 4b 20 26 26 20 62 43 6c 65 61 6e  ITE_OK && bClean
207c0 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  up==0 ){.      s
207d0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
207e0 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  (p);.      retur
207f0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
20800 70 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2d  p->iDataVersion-
20810 2d 3b 20 20 2f 2a 20 43 6f 6d 70 65 6e 73 61 74  -;  /* Compensat
20820 65 20 66 6f 72 20 70 50 61 67 65 72 2d 3e 69 44  e for pPager->iD
20830 61 74 61 56 65 72 73 69 6f 6e 2b 2b 3b 20 2a 2f  ataVersion++; */
20840 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e  .    pBt->inTran
20850 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f  saction = TRANS_
20860 52 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43  READ;.    btreeC
20870 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70  learHasContent(p
20880 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65  Bt);.  }..  btre
20890 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  eEndTransaction(
208a0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
208b0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
208c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
208d0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68  }../*.** Do both
208e0 20 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d   phases of a com
208f0 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  mit..*/.int sqli
20900 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42  te3BtreeCommit(B
20910 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
20920 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
20930 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63  eeEnter(p);.  rc
20940 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
20950 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c  ommitPhaseOne(p,
20960 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
20970 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20980 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
20990 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
209a0 70 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  p, 0);.  }.  sql
209b0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
209c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
209d0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
209e0 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 73  utine sets the s
209f0 74 61 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46  tate to CURSOR_F
20a00 41 55 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72  AULT and the err
20a10 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72  or.** code to er
20a20 72 43 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20  rCode for every 
20a30 63 75 72 73 6f 72 20 6f 6e 20 61 6e 79 20 42 74  cursor on any Bt
20a40 53 68 61 72 65 64 20 74 68 61 74 20 70 42 74 72  Shared that pBtr
20a50 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73  ee.** references
20a60 2e 20 20 4f 72 20 69 66 20 74 68 65 20 77 72 69  .  Or if the wri
20a70 74 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 73  teOnly flag is s
20a80 65 74 20 74 6f 20 31 2c 20 74 68 65 6e 20 6f 6e  et to 1, then on
20a90 6c 79 0a 2a 2a 20 74 72 69 70 20 77 72 69 74 65  ly.** trip write
20aa0 20 63 75 72 73 6f 72 73 20 61 6e 64 20 6c 65 61   cursors and lea
20ab0 76 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20  ve read cursors 
20ac0 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  unchanged..**.**
20ad0 20 45 76 65 72 79 20 63 75 72 73 6f 72 20 69 73   Every cursor is
20ae0 20 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20   a candidate to 
20af0 62 65 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c  be tripped, incl
20b00 75 64 69 6e 67 20 63 75 72 73 6f 72 73 0a 2a 2a  uding cursors.**
20b10 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20   that belong to 
20b20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  other database c
20b30 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20  onnections that 
20b40 68 61 70 70 65 6e 20 74 6f 20 62 65 0a 2a 2a 20  happen to be.** 
20b50 73 68 61 72 69 6e 67 20 74 68 65 20 63 61 63 68  sharing the cach
20b60 65 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a  e with pBtree..*
20b70 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
20b80 65 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68  e gets called wh
20b90 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63  en a rollback oc
20ba0 63 75 72 73 2e 20 49 66 20 74 68 65 20 77 72 69  curs. If the wri
20bb0 74 65 4f 6e 6c 79 0a 2a 2a 20 66 6c 61 67 20 69  teOnly.** flag i
20bc0 73 20 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e 6c  s true, then onl
20bd0 79 20 77 72 69 74 65 2d 63 75 72 73 6f 72 73 20  y write-cursors 
20be0 6e 65 65 64 20 62 65 20 74 72 69 70 70 65 64 20  need be tripped 
20bf0 2d 20 72 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 63  - read-only.** c
20c00 75 72 73 6f 72 73 20 73 61 76 65 20 74 68 65 69  ursors save thei
20c10 72 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69  r current positi
20c20 6f 6e 73 20 73 6f 20 74 68 61 74 20 74 68 65 79  ons so that they
20c30 20 6d 61 79 20 63 6f 6e 74 69 6e 75 65 20 0a 2a   may continue .*
20c40 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  * following the 
20c50 72 6f 6c 6c 62 61 63 6b 2e 20 4f 72 2c 20 69 66  rollback. Or, if
20c60 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61   writeOnly is fa
20c70 6c 73 65 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73  lse, all cursors
20c80 20 61 72 65 20 0a 2a 2a 20 74 72 69 70 70 65 64   are .** tripped
20c90 2e 20 49 6e 20 67 65 6e 65 72 61 6c 2c 20 77 72  . In general, wr
20ca0 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65  iteOnly is false
20cb0 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   if the transact
20cc0 69 6f 6e 20 62 65 69 6e 67 0a 2a 2a 20 72 6f 6c  ion being.** rol
20cd0 6c 65 64 20 62 61 63 6b 20 6d 6f 64 69 66 69 65  led back modifie
20ce0 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
20cf0 63 68 65 6d 61 2e 20 49 6e 20 74 68 69 73 20 63  chema. In this c
20d00 61 73 65 20 62 2d 74 72 65 65 20 72 6f 6f 74 0a  ase b-tree root.
20d10 2a 2a 20 70 61 67 65 73 20 6d 61 79 20 62 65 20  ** pages may be 
20d20 6d 6f 76 65 64 20 6f 72 20 64 65 6c 65 74 65 64  moved or deleted
20d30 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
20d40 73 65 20 61 6c 74 6f 67 65 74 68 65 72 2c 20 6d  se altogether, m
20d50 61 6b 69 6e 67 0a 2a 2a 20 69 74 20 75 6e 73 61  aking.** it unsa
20d60 66 65 20 66 6f 72 20 72 65 61 64 20 63 75 72 73  fe for read curs
20d70 6f 72 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e  ors to continue.
20d80 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 72  .**.** If the wr
20d90 69 74 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20  iteOnly flag is 
20da0 74 72 75 65 20 61 6e 64 20 61 6e 20 65 72 72 6f  true and an erro
20db0 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
20dc0 20 77 68 69 6c 65 20 0a 2a 2a 20 73 61 76 69 6e   while .** savin
20dd0 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f  g the current po
20de0 73 69 74 69 6f 6e 20 6f 66 20 61 20 72 65 61 64  sition of a read
20df0 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20 61 6c  -only cursor, al
20e00 6c 20 63 75 72 73 6f 72 73 2c 20 0a 2a 2a 20 69  l cursors, .** i
20e10 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20 72 65 61  ncluding all rea
20e20 64 2d 63 75 72 73 6f 72 73 20 61 72 65 20 74 72  d-cursors are tr
20e30 69 70 70 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  ipped..**.** SQL
20e40 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
20e50 65 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  ed if successful
20e60 2c 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72  , or if an error
20e70 20 6f 63 63 75 72 73 20 77 68 69 6c 65 0a 2a 2a   occurs while.**
20e80 20 73 61 76 69 6e 67 20 61 20 63 75 72 73 6f 72   saving a cursor
20e90 20 70 6f 73 69 74 69 6f 6e 2c 20 61 6e 20 53 51   position, an SQ
20ea0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
20eb0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
20ec0 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f  treeTripAllCurso
20ed0 72 73 28 42 74 72 65 65 20 2a 70 42 74 72 65 65  rs(Btree *pBtree
20ee0 2c 20 69 6e 74 20 65 72 72 43 6f 64 65 2c 20 69  , int errCode, i
20ef0 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20  nt writeOnly){. 
20f00 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
20f10 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
20f20 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28  OK;..  assert( (
20f30 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 7c 7c 20  writeOnly==0 || 
20f40 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 29 20 26 26  writeOnly==1) &&
20f50 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 3d   BTCF_WriteFlag=
20f60 3d 31 20 29 3b 0a 20 20 69 66 28 20 70 42 74 72  =1 );.  if( pBtr
20f70 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ee ){.    sqlite
20f80 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72  3BtreeEnter(pBtr
20f90 65 65 29 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70  ee);.    for(p=p
20fa0 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
20fb0 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
20fc0 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  xt){.      int i
20fd0 3b 0a 20 20 20 20 20 20 69 66 28 20 77 72 69 74  ;.      if( writ
20fe0 65 4f 6e 6c 79 20 26 26 20 28 70 2d 3e 63 75 72  eOnly && (p->cur
20ff0 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72 69  Flags & BTCF_Wri
21000 74 65 46 6c 61 67 29 3d 3d 30 20 29 7b 0a 20 20  teFlag)==0 ){.  
21010 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74        if( p->eSt
21020 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
21030 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d  D || p->eState==
21040 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
21050 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
21060 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  = saveCursorPosi
21070 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 20  tion(p);.       
21080 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
21090 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
210a0 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65      (void)sqlite
210b0 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72  3BtreeTripAllCur
210c0 73 6f 72 73 28 70 42 74 72 65 65 2c 20 72 63 2c  sors(pBtree, rc,
210d0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
210e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
210f0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
21100 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21110 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
21120 6c 65 61 72 43 75 72 73 6f 72 28 70 29 3b 0a 20  learCursor(p);. 
21130 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
21140 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b   = CURSOR_FAULT;
21150 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 6b 69 70  .        p->skip
21160 4e 65 78 74 20 3d 20 65 72 72 43 6f 64 65 3b 0a  Next = errCode;.
21170 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
21180 72 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50 61  r(i=0; i<=p->iPa
21190 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ge; i++){.      
211a0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 2d    releasePage(p-
211b0 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20  >apPage[i]);.   
211c0 20 20 20 20 20 70 2d 3e 61 70 50 61 67 65 5b 69       p->apPage[i
211d0 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
211e0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
211f0 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65  BtreeLeave(pBtre
21200 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
21210 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f   rc;.}../*.** Ro
21220 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73  llback the trans
21230 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65  action in progre
21240 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 72 69  ss..**.** If tri
21250 70 43 6f 64 65 20 69 73 20 6e 6f 74 20 53 51 4c  pCode is not SQL
21260 49 54 45 5f 4f 4b 20 74 68 65 6e 20 63 75 72 73  ITE_OK then curs
21270 6f 72 73 20 77 69 6c 6c 20 62 65 20 69 6e 76 61  ors will be inva
21280 6c 69 64 61 74 65 64 20 28 74 72 69 70 70 65 64  lidated (tripped
21290 29 2e 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65  )..** Only write
212a0 20 63 75 72 73 6f 72 73 20 61 72 65 20 74 72 69   cursors are tri
212b0 70 70 65 64 20 69 66 20 77 72 69 74 65 4f 6e 6c  pped if writeOnl
212c0 79 20 69 73 20 74 72 75 65 20 62 75 74 20 61 6c  y is true but al
212d0 6c 20 63 75 72 73 6f 72 73 20 61 72 65 0a 2a 2a  l cursors are.**
212e0 20 74 72 69 70 70 65 64 20 69 66 20 77 72 69 74   tripped if writ
212f0 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 2e 20  eOnly is false. 
21300 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
21310 75 73 65 0a 2a 2a 20 61 20 74 72 69 70 70 65 64  use.** a tripped
21320 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 72 65 73   cursor will res
21330 75 6c 74 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e  ult in an error.
21340 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c  .**.** This will
21350 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
21360 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te lock on the d
21370 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
21380 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  f there.** are n
21390 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73  o active cursors
213a0 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73  , it also releas
213b0 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  es the read lock
213c0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
213d0 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74  BtreeRollback(Bt
213e0 72 65 65 20 2a 70 2c 20 69 6e 74 20 74 72 69 70  ree *p, int trip
213f0 43 6f 64 65 2c 20 69 6e 74 20 77 72 69 74 65 4f  Code, int writeO
21400 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  nly){.  int rc;.
21410 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
21420 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50  = p->pBt;.  MemP
21430 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20  age *pPage1;..  
21440 61 73 73 65 72 74 28 20 77 72 69 74 65 4f 6e 6c  assert( writeOnl
21450 79 3d 3d 31 20 7c 7c 20 77 72 69 74 65 4f 6e 6c  y==1 || writeOnl
21460 79 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  y==0 );.  assert
21470 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49  ( tripCode==SQLI
21480 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
21490 4b 20 7c 7c 20 74 72 69 70 43 6f 64 65 3d 3d 53  K || tripCode==S
214a0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73 71  QLITE_OK );.  sq
214b0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
214c0 70 29 3b 0a 20 20 69 66 28 20 74 72 69 70 43 6f  p);.  if( tripCo
214d0 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  de==SQLITE_OK ){
214e0 0a 20 20 20 20 72 63 20 3d 20 74 72 69 70 43 6f  .    rc = tripCo
214f0 64 65 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  de = saveAllCurs
21500 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a  ors(pBt, 0, 0);.
21510 20 20 20 20 69 66 28 20 72 63 20 29 20 77 72 69      if( rc ) wri
21520 74 65 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 7d 65  teOnly = 0;.  }e
21530 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  lse{.    rc = SQ
21540 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
21550 66 28 20 74 72 69 70 43 6f 64 65 20 29 7b 0a 20  f( tripCode ){. 
21560 20 20 20 69 6e 74 20 72 63 32 20 3d 20 73 71 6c     int rc2 = sql
21570 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c  ite3BtreeTripAll
21580 43 75 72 73 6f 72 73 28 70 2c 20 74 72 69 70 43  Cursors(p, tripC
21590 6f 64 65 2c 20 77 72 69 74 65 4f 6e 6c 79 29 3b  ode, writeOnly);
215a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
215b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 77  =SQLITE_OK || (w
215c0 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 26 26 20 72  riteOnly==0 && r
215d0 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29  c2==SQLITE_OK) )
215e0 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53  ;.    if( rc2!=S
215f0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20  QLITE_OK ) rc = 
21600 72 63 32 3b 0a 20 20 7d 0a 20 20 62 74 72 65 65  rc2;.  }.  btree
21610 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20  Integrity(p);.. 
21620 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
21630 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
21640 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20      int rc2;..  
21650 20 20 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f    assert( TRANS_
21660 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72  WRITE==pBt->inTr
21670 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20  ansaction );.   
21680 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61   rc2 = sqlite3Pa
21690 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d  gerRollback(pBt-
216a0 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
216b0 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2!=SQLITE_OK
216c0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72   ){.      rc = r
216d0 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  c2;.    }..    /
216e0 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d  * The rollback m
216f0 61 79 20 68 61 76 65 20 64 65 73 74 72 6f 79 65  ay have destroye
21700 64 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44  d the pPage1->aD
21710 61 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20  ata value.  So. 
21720 20 20 20 2a 2a 20 63 61 6c 6c 20 62 74 72 65 65     ** call btree
21730 47 65 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67  GetPage() on pag
21740 65 20 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b  e 1 again to mak
21750 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50  e.    ** sure pP
21760 61 67 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73  age1->aData is s
21770 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f  et correctly. */
21780 0a 20 20 20 20 69 66 28 20 62 74 72 65 65 47 65  .    if( btreeGe
21790 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70  tPage(pBt, 1, &p
217a0 50 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54  Page1, 0)==SQLIT
217b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e  E_OK ){.      in
217c0 74 20 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79  t nPage = get4by
217d0 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65  te(28+(u8*)pPage
217e0 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20  1->aData);.     
217f0 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 67 65   testcase( nPage
21800 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
21810 20 6e 50 61 67 65 3d 3d 30 20 29 20 73 71 6c 69   nPage==0 ) sqli
21820 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
21830 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  t(pBt->pPager, &
21840 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 74 65  nPage);.      te
21850 73 74 63 61 73 65 28 20 70 42 74 2d 3e 6e 50 61  stcase( pBt->nPa
21860 67 65 21 3d 6e 50 61 67 65 20 29 3b 0a 20 20 20  ge!=nPage );.   
21870 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
21880 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 72 65 6c  nPage;.      rel
21890 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29  easePage(pPage1)
218a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
218b0 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75  rt( countValidCu
218c0 72 73 6f 72 73 28 70 42 74 2c 20 31 29 3d 3d 30  rsors(pBt, 1)==0
218d0 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54   );.    pBt->inT
218e0 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41  ransaction = TRA
218f0 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74 72  NS_READ;.    btr
21900 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e  eeClearHasConten
21910 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62  t(pBt);.  }..  b
21920 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69  treeEndTransacti
21930 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  on(p);.  sqlite3
21940 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
21950 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
21960 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61  *.** Start a sta
21970 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61  tement subtransa
21980 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72  ction. The subtr
21990 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 20 62 65  ansaction can be
219a0 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20   rolled.** back 
219b0 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66  independently of
219c0 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61   the main transa
219d0 63 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20  ction. You must 
219e0 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74  start a transact
219f0 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73  ion .** before s
21a00 74 61 72 74 69 6e 67 20 61 20 73 75 62 74 72 61  tarting a subtra
21a10 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75  nsaction. The su
21a20 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  btransaction is 
21a30 65 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61  ended automatica
21a40 6c 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d  lly .** if the m
21a50 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ain transaction 
21a60 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73  commits or rolls
21a70 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61   back..**.** Sta
21a80 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61  tement subtransa
21a90 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20  ctions are used 
21aa0 61 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61  around individua
21ab0 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  l SQL statements
21ac0 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e  .** that are con
21ad0 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20  tained within a 
21ae0 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62  BEGIN...COMMIT b
21af0 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73  lock.  If a cons
21b00 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20  traint.** error 
21b10 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
21b20 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  e statement, the
21b30 20 65 66 66 65 63 74 20 6f 66 20 74 68 61 74 20   effect of that 
21b40 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  one statement.**
21b50 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62   can be rolled b
21b60 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69  ack without havi
21b70 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74  ng to rollback t
21b80 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61  he entire transa
21b90 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73  ction..**.** A s
21ba0 74 61 74 65 6d 65 6e 74 20 73 75 62 2d 74 72 61  tatement sub-tra
21bb0 6e 73 61 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c  nsaction is impl
21bc0 65 6d 65 6e 74 65 64 20 61 73 20 61 6e 20 61 6e  emented as an an
21bd0 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e  onymous savepoin
21be0 74 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20  t. The.** value 
21bf0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
21c00 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  cond parameter i
21c10 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
21c20 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73  er of savepoints
21c30 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74  ,.** including t
21c40 68 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73  he new anonymous
21c50 20 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e   savepoint, open
21c60 20 6f 6e 20 74 68 65 20 42 2d 54 72 65 65 2e 20   on the B-Tree. 
21c70 69 2e 65 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a  i.e. if there.**
21c80 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 73   are no active s
21c90 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f  avepoints and no
21ca0 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74   other statement
21cb0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70  -transactions op
21cc0 65 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e  en,.** iStatemen
21cd0 74 20 69 73 20 31 2e 20 54 68 69 73 20 61 6e 6f  t is 1. This ano
21ce0 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74  nymous savepoint
21cf0 20 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64   can be released
21d00 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a   or rolled back.
21d10 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c  ** using the sql
21d20 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69  ite3BtreeSavepoi
21d30 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  nt() function..*
21d40 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
21d50 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65  eeBeginStmt(Btre
21d60 65 20 2a 70 2c 20 69 6e 74 20 69 53 74 61 74 65  e *p, int iState
21d70 6d 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ment){.  int rc;
21d80 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
21d90 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c   = p->pBt;.  sql
21da0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
21db0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
21dc0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
21dd0 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74  RITE );.  assert
21de0 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  ( (pBt->btsFlags
21df0 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59   & BTS_READ_ONLY
21e00 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
21e10 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 30 20 29  ( iStatement>0 )
21e20 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61  ;.  assert( iSta
21e30 74 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53  tement>p->db->nS
21e40 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 61 73  avepoint );.  as
21e50 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
21e60 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
21e70 57 52 49 54 45 20 29 3b 0a 20 20 2f 2a 20 41 74  WRITE );.  /* At
21e80 20 74 68 65 20 70 61 67 65 72 20 6c 65 76 65 6c   the pager level
21e90 2c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  , a statement tr
21ea0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 20 73  ansaction is a s
21eb0 61 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 20 20  avepoint with.  
21ec0 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61  ** an index grea
21ed0 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 76  ter than all sav
21ee0 65 70 6f 69 6e 74 73 20 63 72 65 61 74 65 64 20  epoints created 
21ef0 65 78 70 6c 69 63 69 74 6c 79 20 75 73 69 6e 67  explicitly using
21f00 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d  .  ** SQL statem
21f10 65 6e 74 73 2e 20 49 74 20 69 73 20 69 6c 6c 65  ents. It is ille
21f20 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c  gal to open, rel
21f30 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  ease or rollback
21f40 20 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20 73   any.  ** such s
21f50 61 76 65 70 6f 69 6e 74 73 20 77 68 69 6c 65 20  avepoints while 
21f60 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  the statement tr
21f70 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f  ansaction savepo
21f80 69 6e 74 20 69 73 20 61 63 74 69 76 65 2e 0a 20  int is active.. 
21f90 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
21fa0 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70  e3PagerOpenSavep
21fb0 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  oint(pBt->pPager
21fc0 2c 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20  , iStatement);. 
21fd0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
21fe0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
21ff0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
22000 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
22010 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
22020 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77 61 79 73  n, op, is always
22030 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
22040 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f  ACK.** or SAVEPO
22050 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 54 68 69  INT_RELEASE. Thi
22060 73 20 66 75 6e 63 74 69 6f 6e 20 65 69 74 68 65  s function eithe
22070 72 20 72 65 6c 65 61 73 65 73 20 6f 72 20 72 6f  r releases or ro
22080 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20  lls back the.** 
22090 73 61 76 65 70 6f 69 6e 74 20 69 64 65 6e 74 69  savepoint identi
220a0 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
220b0 72 20 69 53 61 76 65 70 6f 69 6e 74 2c 20 64 65  r iSavepoint, de
220c0 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 76  pending on the v
220d0 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a  alue .** of op..
220e0 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  **.** Normally, 
220f0 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72  iSavepoint is gr
22100 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
22110 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77  ual to zero. How
22120 65 76 65 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a  ever, if op is.*
22130 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  * SAVEPOINT_ROLL
22140 42 41 43 4b 2c 20 74 68 65 6e 20 69 53 61 76 65  BACK, then iSave
22150 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62  point may also b
22160 65 20 2d 31 2e 20 49 6e 20 74 68 69 73 20 63 61  e -1. In this ca
22170 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65  se the .** conte
22180 6e 74 73 20 6f 66 20 74 68 65 20 65 6e 74 69 72  nts of the entir
22190 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72  e transaction ar
221a0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54  e rolled back. T
221b0 68 69 73 20 69 73 20 64 69 66 66 65 72 65 6e 74  his is different
221c0 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61  .** from a norma
221d0 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f  l transaction ro
221e0 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f  llback, as no lo
221f0 63 6b 73 20 61 72 65 20 72 65 6c 65 61 73 65 64  cks are released
22200 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e   and the.** tran
22210 73 61 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20  saction remains 
22220 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  open..*/.int sql
22230 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69  ite3BtreeSavepoi
22240 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  nt(Btree *p, int
22250 20 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f   op, int iSavepo
22260 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  int){.  int rc =
22270 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
22280 28 20 70 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e  ( p && p->inTran
22290 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
222a0 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  {.    BtShared *
222b0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
222c0 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41    assert( op==SA
222d0 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20  VEPOINT_RELEASE 
222e0 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  || op==SAVEPOINT
222f0 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20  _ROLLBACK );.   
22300 20 61 73 73 65 72 74 28 20 69 53 61 76 65 70 6f   assert( iSavepo
22310 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65  int>=0 || (iSave
22320 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d  point==-1 && op=
22330 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
22340 41 43 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  ACK) );.    sqli
22350 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
22360 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 53 41  ;.    if( op==SA
22370 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
22380 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
22390 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  aveAllCursors(pB
223a0 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  t, 0, 0);.    }.
223b0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
223c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
223d0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
223e0 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70  Savepoint(pBt->p
223f0 50 61 67 65 72 2c 20 6f 70 2c 20 69 53 61 76 65  Pager, op, iSave
22400 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20  point);.    }.  
22410 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
22420 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
22430 20 69 53 61 76 65 70 6f 69 6e 74 3c 30 20 26 26   iSavepoint<0 &&
22440 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
22450 26 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f  & BTS_INITIALLY_
22460 45 4d 50 54 59 29 21 3d 30 20 29 7b 0a 20 20 20  EMPTY)!=0 ){.   
22470 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20       pBt->nPage 
22480 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
22490 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62     rc = newDatab
224a0 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ase(pBt);.      
224b0 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74  pBt->nPage = get
224c0 34 62 79 74 65 28 32 38 20 2b 20 70 42 74 2d 3e  4byte(28 + pBt->
224d0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a  pPage1->aData);.
224e0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61  .      /* The da
224f0 74 61 62 61 73 65 20 73 69 7a 65 20 77 61 73 20  tabase size was 
22500 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
22510 20 6f 66 66 73 65 74 20 32 38 20 6f 66 20 74 68   offset 28 of th
22520 65 20 68 65 61 64 65 72 0a 20 20 20 20 20 20 2a  e header.      *
22530 2a 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73  * when the trans
22540 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20  action started, 
22550 73 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  so we know that 
22560 74 68 65 20 76 61 6c 75 65 20 61 74 20 6f 66 66  the value at off
22570 73 65 74 0a 20 20 20 20 20 20 2a 2a 20 32 38 20  set.      ** 28 
22580 69 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20  is nonzero. */. 
22590 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
225a0 2d 3e 6e 50 61 67 65 3e 30 20 29 3b 0a 20 20 20  ->nPage>0 );.   
225b0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
225c0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d  reeLeave(p);.  }
225d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
225e0 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
225f0 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74  new cursor for t
22600 68 65 20 42 54 72 65 65 20 77 68 6f 73 65 20 72  he BTree whose r
22610 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61  oot is on the pa
22620 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66  ge.** iTable. If
22630 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72   a read-only cur
22640 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64  sor is requested
22650 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20  , it is assumed 
22660 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c  that.** the call
22670 65 72 20 61 6c 72 65 61 64 79 20 68 61 73 20 61  er already has a
22680 74 20 6c 65 61 73 74 20 61 20 72 65 61 64 2d 6f  t least a read-o
22690 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  nly transaction 
226a0 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64  open.** on the d
226b0 61 74 61 62 61 73 65 20 61 6c 72 65 61 64 79 2e  atabase already.
226c0 20 49 66 20 61 20 77 72 69 74 65 2d 63 75 72 73   If a write-curs
226d0 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  or is requested,
226e0 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c   then.** the cal
226f0 6c 65 72 20 69 73 20 61 73 73 75 6d 65 64 20 74  ler is assumed t
22700 6f 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77  o have an open w
22710 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
22720 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 42  ..**.** If the B
22730 54 52 45 45 5f 57 52 43 53 52 20 62 69 74 20 6f  TREE_WRCSR bit o
22740 66 20 77 72 46 6c 61 67 20 69 73 20 63 6c 65 61  f wrFlag is clea
22750 72 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  r, then the curs
22760 6f 72 20 63 61 6e 20 6f 6e 6c 79 0a 2a 2a 20 62  or can only.** b
22770 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69  e used for readi
22780 6e 67 2e 20 20 49 66 20 74 68 65 20 42 54 52 45  ng.  If the BTRE
22790 45 5f 57 52 43 53 52 20 62 69 74 20 69 73 20 73  E_WRCSR bit is s
227a0 65 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  et, then the cur
227b0 73 6f 72 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73  sor.** can be us
227c0 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f  ed for reading o
227d0 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20 69 66  r for writing if
227e0 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e   other condition
227f0 73 20 66 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a  s for writing.**
22800 20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20   are also met.  
22810 54 68 65 73 65 20 61 72 65 20 74 68 65 20 63 6f  These are the co
22820 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75  nditions that mu
22830 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64  st be met in ord
22840 65 72 0a 2a 2a 20 66 6f 72 20 77 72 69 74 69 6e  er.** for writin
22850 67 20 74 6f 20 62 65 20 61 6c 6c 6f 77 65 64 3a  g to be allowed:
22860 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63  .**.** 1:  The c
22870 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20  ursor must have 
22880 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68  been opened with
22890 20 77 72 46 6c 61 67 20 63 6f 6e 74 61 69 6e 69   wrFlag containi
228a0 6e 67 20 42 54 52 45 45 5f 57 52 43 53 52 0a 2a  ng BTREE_WRCSR.*
228b0 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64  *.** 2:  Other d
228c0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
228d0 6f 6e 73 20 74 68 61 74 20 73 68 61 72 65 20 74  ons that share t
228e0 68 65 20 73 61 6d 65 20 70 61 67 65 72 20 63 61  he same pager ca
228f0 63 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77  che.**     but w
22900 68 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20  hich are not in 
22910 74 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49  the READ_UNCOMMI
22920 54 54 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e  TTED state may n
22930 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63  ot have.**     c
22940 75 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68  ursors open with
22950 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68   wrFlag==0 on th
22960 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f  e same table.  O
22970 74 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20  therwise.**     
22980 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65  the changes made
22990 20 62 79 20 74 68 69 73 20 77 72 69 74 65 20 63   by this write c
229a0 75 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76  ursor would be v
229b0 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20  isible to.**    
229c0 20 74 68 65 20 72 65 61 64 20 63 75 72 73 6f 72   the read cursor
229d0 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64  s in the other d
229e0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
229f0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68  on..**.** 3:  Th
22a00 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
22a10 62 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74  be writable (not
22a20 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65   on read-only me
22a30 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54  dia).**.** 4:  T
22a40 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20  here must be an 
22a50 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69  active transacti
22a60 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 54  on..**.** The BT
22a70 52 45 45 5f 46 4f 52 44 45 4c 45 54 45 20 62 69  REE_FORDELETE bi
22a80 74 20 6f 66 20 77 72 46 6c 61 67 20 6d 61 79 20  t of wrFlag may 
22a90 6f 70 74 69 6f 6e 61 6c 6c 79 20 62 65 20 73 65  optionally be se
22aa0 74 20 69 66 20 42 54 52 45 45 5f 57 52 43 53 52  t if BTREE_WRCSR
22ab0 0a 2a 2a 20 69 73 20 73 65 74 2e 20 20 49 66 20  .** is set.  If 
22ac0 46 4f 52 44 45 4c 45 54 45 20 69 73 20 73 65 74  FORDELETE is set
22ad0 2c 20 74 68 61 74 20 69 73 20 61 20 68 69 6e 74  , that is a hint
22ae0 20 74 6f 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e   to the implemen
22af0 74 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 74  tation that.** t
22b00 68 69 73 20 63 75 72 73 6f 72 20 77 69 6c 6c 20  his cursor will 
22b10 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 74 6f 20  only be used to 
22b20 73 65 65 6b 20 74 6f 20 61 6e 64 20 64 65 6c 65  seek to and dele
22b30 74 65 20 65 6e 74 72 69 65 73 20 6f 66 20 61 6e  te entries of an
22b40 20 69 6e 64 65 78 0a 2a 2a 20 61 73 20 70 61 72   index.** as par
22b50 74 20 6f 66 20 61 20 6c 61 72 67 65 72 20 44 45  t of a larger DE
22b60 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  LETE statement. 
22b70 20 54 68 65 20 46 4f 52 44 45 4c 45 54 45 20 68   The FORDELETE h
22b80 69 6e 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20  int is not used 
22b90 62 79 0a 2a 2a 20 74 68 69 73 20 69 6d 70 6c 65  by.** this imple
22ba0 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 42 75 74 20  mentation.  But 
22bb0 69 6e 20 61 20 68 79 70 6f 74 68 65 74 69 63 61  in a hypothetica
22bc0 6c 20 61 6c 74 65 72 6e 61 74 69 76 65 20 73 74  l alternative st
22bd0 6f 72 61 67 65 20 65 6e 67 69 6e 65 20 0a 2a 2a  orage engine .**
22be0 20 69 6e 20 77 68 69 63 68 20 69 6e 64 65 78 20   in which index 
22bf0 65 6e 74 72 69 65 73 20 61 72 65 20 61 75 74 6f  entries are auto
22c00 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
22c10 64 20 77 68 65 6e 20 63 6f 72 72 65 73 70 6f 6e  d when correspon
22c20 64 69 6e 67 20 74 61 62 6c 65 0a 2a 2a 20 72 6f  ding table.** ro
22c30 77 73 20 61 72 65 20 64 65 6c 65 74 65 64 2c 20  ws are deleted, 
22c40 74 68 65 20 46 4f 52 44 45 4c 45 54 45 20 66 6c  the FORDELETE fl
22c50 61 67 20 69 73 20 61 20 68 69 6e 74 20 74 68 61  ag is a hint tha
22c60 74 20 61 6c 6c 20 53 45 45 4b 20 61 6e 64 20 44  t all SEEK and D
22c70 45 4c 45 54 45 0a 2a 2a 20 6f 70 65 72 61 74 69  ELETE.** operati
22c80 6f 6e 73 20 6f 6e 20 74 68 69 73 20 63 75 72 73  ons on this curs
22c90 6f 72 20 63 61 6e 20 62 65 20 6e 6f 2d 6f 70 73  or can be no-ops
22ca0 20 61 6e 64 20 61 6c 6c 20 52 45 41 44 20 6f 70   and all READ op
22cb0 65 72 61 74 69 6f 6e 73 20 63 61 6e 20 0a 2a 2a  erations can .**
22cc0 20 72 65 74 75 72 6e 20 61 20 6e 75 6c 6c 20 72   return a null r
22cd0 6f 77 20 28 32 2d 62 79 74 65 73 3a 20 30 78 30  ow (2-bytes: 0x0
22ce0 31 20 30 78 30 30 29 2e 0a 2a 2a 0a 2a 2a 20 4e  1 0x00)..**.** N
22cf0 6f 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f  o checking is do
22d00 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ne to make sure 
22d10 74 68 61 74 20 70 61 67 65 20 69 54 61 62 6c 65  that page iTable
22d20 20 72 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a   really is the.*
22d30 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61  * root page of a
22d40 20 62 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20   b-tree.  If it 
22d50 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65  is not, then the
22d60 20 63 75 72 73 6f 72 20 61 63 71 75 69 72 65 64   cursor acquired
22d70 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72  .** will not wor
22d80 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a  k correctly..**.
22d90 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  ** It is assumed
22da0 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65   that the sqlite
22db0 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f  3BtreeCursorZero
22dc0 28 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c  () has been call
22dd0 65 64 0a 2a 2a 20 6f 6e 20 70 43 75 72 20 74 6f  ed.** on pCur to
22de0 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
22df0 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 70 72 69  memory space pri
22e00 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74  or to invoking t
22e10 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  his routine..*/.
22e20 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
22e30 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20  Cursor(.  Btree 
22e40 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
22e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e60 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
22e70 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
22e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
22ea0 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20  t page of table 
22eb0 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
22ec0 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20   wrFlag,        
22ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ee0 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74      /* 1 to writ
22ef0 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a  e. 0 read-only *
22f00 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e  /.  struct KeyIn
22f10 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
22f20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
22f30 72 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70 61  rst arg to compa
22f40 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a  rison function *
22f50 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  /.  BtCursor *pC
22f60 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ur              
22f70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
22f80 61 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72 73  ace for new curs
22f90 6f 72 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61  or */.){.  BtSha
22fa0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
22fb0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
22fc0 20 20 2f 2a 20 53 68 61 72 65 64 20 62 2d 74 72    /* Shared b-tr
22fd0 65 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42  ee handle */.  B
22fe0 74 43 75 72 73 6f 72 20 2a 70 58 3b 20 20 20 20  tCursor *pX;    
22ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23000 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 69 6e 67        /* Looping
23010 20 6f 76 65 72 20 6f 74 68 65 72 20 61 6c 6c 20   over other all 
23020 63 75 72 73 6f 72 73 20 2a 2f 0a 0a 20 20 61 73  cursors */..  as
23030 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
23040 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
23050 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  );.  assert( wrF
23060 6c 61 67 3d 3d 30 20 0a 20 20 20 20 20 20 20 7c  lag==0 .       |
23070 7c 20 77 72 46 6c 61 67 3d 3d 42 54 52 45 45 5f  | wrFlag==BTREE_
23080 57 52 43 53 52 20 0a 20 20 20 20 20 20 20 7c 7c  WRCSR .       ||
23090 20 77 72 46 6c 61 67 3d 3d 28 42 54 52 45 45 5f   wrFlag==(BTREE_
230a0 57 52 43 53 52 7c 42 54 52 45 45 5f 46 4f 52 44  WRCSR|BTREE_FORD
230b0 45 4c 45 54 45 29 20 0a 20 20 29 3b 0a 0a 20 20  ELETE) .  );..  
230c0 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
230d0 20 61 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e   assert statemen
230e0 74 73 20 76 65 72 69 66 79 20 74 68 61 74 20 69  ts verify that i
230f0 66 20 74 68 69 73 20 69 73 20 61 20 73 68 61 72  f this is a shar
23100 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74 72 65  able .  ** b-tre
23110 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  e database, the 
23120 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f  connection is ho
23130 6c 64 69 6e 67 20 74 68 65 20 72 65 71 75 69 72  lding the requir
23140 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2c 20  ed table locks, 
23150 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61 74 20 6e  .  ** and that n
23160 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  o other connecti
23170 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70 65 6e 20  on has any open 
23180 63 75 72 73 6f 72 20 74 68 61 74 20 63 6f 6e 66  cursor that conf
23190 6c 69 63 74 73 20 77 69 74 68 20 0a 20 20 2a 2a  licts with .  **
231a0 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a   this lock.  */.
231b0 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
231c0 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
231d0 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 4b 65  k(p, iTable, pKe
231e0 79 49 6e 66 6f 21 3d 30 2c 20 28 77 72 46 6c 61  yInfo!=0, (wrFla
231f0 67 3f 32 3a 31 29 29 20 29 3b 0a 20 20 61 73 73  g?2:1)) );.  ass
23200 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c  ert( wrFlag==0 |
23210 7c 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69  | !hasReadConfli
23220 63 74 73 28 70 2c 20 69 54 61 62 6c 65 29 20 29  cts(p, iTable) )
23230 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74  ;..  /* Assert t
23240 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68  hat the caller h
23250 61 73 20 6f 70 65 6e 65 64 20 74 68 65 20 72 65  as opened the re
23260 71 75 69 72 65 64 20 74 72 61 6e 73 61 63 74 69  quired transacti
23270 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  on. */.  assert(
23280 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e   p->inTrans>TRAN
23290 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65  S_NONE );.  asse
232a0 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c  rt( wrFlag==0 ||
232b0 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
232c0 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73  NS_WRITE );.  as
232d0 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65  sert( pBt->pPage
232e0 31 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31  1 && pBt->pPage1
232f0 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73  ->aData );.  ass
23300 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c  ert( wrFlag==0 |
23310 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  | (pBt->btsFlags
23320 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59   & BTS_READ_ONLY
23330 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 77  )==0 );..  if( w
23340 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 61 6c 6c  rFlag ){.    all
23350 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 70  ocateTempSpace(p
23360 42 74 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  Bt);.    if( pBt
23370 2d 3e 70 54 6d 70 53 70 61 63 65 3d 3d 30 20 29  ->pTmpSpace==0 )
23380 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
23390 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  OMEM_BKPT;.  }. 
233a0 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 31 20 26   if( iTable==1 &
233b0 26 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  & btreePagecount
233c0 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20  (pBt)==0 ){.    
233d0 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
233e0 30 20 29 3b 0a 20 20 20 20 69 54 61 62 6c 65 20  0 );.    iTable 
233f0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  = 0;.  }..  /* N
23400 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ow that no other
23410 20 65 72 72 6f 72 73 20 63 61 6e 20 6f 63 63 75   errors can occu
23420 72 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e  r, finish fillin
23430 67 20 69 6e 20 74 68 65 20 42 74 43 75 72 73 6f  g in the BtCurso
23440 72 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73  r.  ** variables
23450 20 61 6e 64 20 6c 69 6e 6b 20 74 68 65 20 63 75   and link the cu
23460 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20 42 74  rsor into the Bt
23470 53 68 61 72 65 64 20 6c 69 73 74 2e 20 20 2a 2f  Shared list.  */
23480 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  .  pCur->pgnoRoo
23490 74 20 3d 20 28 50 67 6e 6f 29 69 54 61 62 6c 65  t = (Pgno)iTable
234a0 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20  ;.  pCur->iPage 
234b0 3d 20 2d 31 3b 0a 20 20 70 43 75 72 2d 3e 70 4b  = -1;.  pCur->pK
234c0 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66  eyInfo = pKeyInf
234d0 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 72 65  o;.  pCur->pBtre
234e0 65 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70  e = p;.  pCur->p
234f0 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 43 75 72  Bt = pBt;.  pCur
23500 2d 3e 63 75 72 46 6c 61 67 73 20 3d 20 77 72 46  ->curFlags = wrF
23510 6c 61 67 20 3f 20 42 54 43 46 5f 57 72 69 74 65  lag ? BTCF_Write
23520 46 6c 61 67 20 3a 20 30 3b 0a 20 20 70 43 75 72  Flag : 0;.  pCur
23530 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73 20  ->curPagerFlags 
23540 3d 20 77 72 46 6c 61 67 20 3f 20 30 20 3a 20 50  = wrFlag ? 0 : P
23550 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c  AGER_GET_READONL
23560 59 3b 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  Y;.  /* If there
23570 20 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65   are two or more
23580 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20   cursors on the 
23590 73 61 6d 65 20 62 74 72 65 65 2c 20 74 68 65 6e  same btree, then
235a0 20 61 6c 6c 20 73 75 63 68 0a 20 20 2a 2a 20 63   all such.  ** c
235b0 75 72 73 6f 72 73 20 2a 6d 75 73 74 2a 20 68 61  ursors *must* ha
235c0 76 65 20 74 68 65 20 42 54 43 46 5f 4d 75 6c 74  ve the BTCF_Mult
235d0 69 70 6c 65 20 66 6c 61 67 20 73 65 74 2e 20 2a  iple flag set. *
235e0 2f 0a 20 20 66 6f 72 28 70 58 3d 70 42 74 2d 3e  /.  for(pX=pBt->
235f0 70 43 75 72 73 6f 72 3b 20 70 58 3b 20 70 58 3d  pCursor; pX; pX=
23600 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  pX->pNext){.    
23610 69 66 28 20 70 58 2d 3e 70 67 6e 6f 52 6f 6f 74  if( pX->pgnoRoot
23620 3d 3d 28 50 67 6e 6f 29 69 54 61 62 6c 65 20 29  ==(Pgno)iTable )
23630 7b 0a 20 20 20 20 20 20 70 58 2d 3e 63 75 72 46  {.      pX->curF
23640 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 4d 75 6c  lags |= BTCF_Mul
23650 74 69 70 6c 65 3b 0a 20 20 20 20 20 20 70 43 75  tiple;.      pCu
23660 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42  r->curFlags |= B
23670 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20  TCF_Multiple;.  
23680 20 20 7d 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e    }.  }.  pCur->
23690 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 43 75  pNext = pBt->pCu
236a0 72 73 6f 72 3b 0a 20 20 70 42 74 2d 3e 70 43 75  rsor;.  pBt->pCu
236b0 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70  rsor = pCur;.  p
236c0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
236d0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
236e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
236f0 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  ;.}.int sqlite3B
23700 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74  treeCursor(.  Bt
23710 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ree *p,         
23720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23730 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
23740 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20   btree */.  int 
23750 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
23760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23770 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
23780 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f  page of table to
23790 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77   open */.  int w
237a0 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20  rFlag,          
237b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
237c0 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77         /* 1 to w
237d0 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c  rite. 0 read-onl
237e0 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65  y */.  struct Ke
237f0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
23800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23810 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20     /* First arg 
23820 74 6f 20 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f  to xCompare() */
23830 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
23840 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
23850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23860 2a 20 57 72 69 74 65 20 6e 65 77 20 63 75 72 73  * Write new curs
23870 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  or here */.){.  
23880 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 69 54  int rc;.  if( iT
23890 61 62 6c 65 3c 31 20 29 7b 0a 20 20 20 20 72 63  able<1 ){.    rc
238a0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
238b0 54 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b  T_BKPT;.  }else{
238c0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
238d0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 72  eEnter(p);.    r
238e0 63 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72 28  c = btreeCursor(
238f0 70 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c 61  p, iTable, wrFla
23900 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75  g, pKeyInfo, pCu
23910 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  r);.    sqlite3B
23920 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
23930 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
23940 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
23950 68 65 20 73 69 7a 65 20 6f 66 20 61 20 42 74 43  he size of a BtC
23960 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20  ursor object in 
23970 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  bytes..**.** Thi
23980 73 20 69 6e 74 65 72 66 61 63 65 73 20 69 73 20  s interfaces is 
23990 6e 65 65 64 65 64 20 73 6f 20 74 68 61 74 20 75  needed so that u
239a0 73 65 72 73 20 6f 66 20 63 75 72 73 6f 72 73 20  sers of cursors 
239b0 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a  can preallocate.
239c0 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73 74  ** sufficient st
239d0 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64 20 61 20  orage to hold a 
239e0 63 75 72 73 6f 72 2e 20 20 54 68 65 20 42 74 43  cursor.  The BtC
239f0 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 73 20  ursor object is 
23a00 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65  opaque.** to use
23a10 72 73 20 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f  rs so they canno
23a20 74 20 64 6f 20 74 68 65 20 73 69 7a 65 6f 66 28  t do the sizeof(
23a30 29 20 74 68 65 6d 73 65 6c 76 65 73 20 2d 20 74  ) themselves - t
23a40 68 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a  hey must call.**
23a50 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
23a60 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
23a70 65 65 43 75 72 73 6f 72 53 69 7a 65 28 76 6f 69  eeCursorSize(voi
23a80 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 52 4f 55  d){.  return ROU
23a90 4e 44 38 28 73 69 7a 65 6f 66 28 42 74 43 75 72  ND8(sizeof(BtCur
23aa0 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  sor));.}../*.** 
23ab0 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72  Initialize memor
23ac0 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 63  y that will be c
23ad0 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20  onverted into a 
23ae0 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 2e  BtCursor object.
23af0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 6d 70 6c  .**.** The simpl
23b00 65 20 61 70 70 72 6f 61 63 68 20 68 65 72 65 20  e approach here 
23b10 77 6f 75 6c 64 20 62 65 20 74 6f 20 6d 65 6d 73  would be to mems
23b20 65 74 28 29 20 74 68 65 20 65 6e 74 69 72 65 20  et() the entire 
23b30 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a 65 72  object.** to zer
23b40 6f 2e 20 20 42 75 74 20 69 74 20 74 75 72 6e 73  o.  But it turns
23b50 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 61 70   out that the ap
23b60 50 61 67 65 5b 5d 20 61 6e 64 20 61 69 49 64 78  Page[] and aiIdx
23b70 5b 5d 20 61 72 72 61 79 73 0a 2a 2a 20 64 6f 20  [] arrays.** do 
23b80 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 7a  not need to be z
23b90 65 72 6f 65 64 20 61 6e 64 20 74 68 65 79 20 61  eroed and they a
23ba0 72 65 20 6c 61 72 67 65 2c 20 73 6f 20 77 65 20  re large, so we 
23bb0 63 61 6e 20 73 61 76 65 20 61 20 6c 6f 74 0a 2a  can save a lot.*
23bc0 2a 20 6f 66 20 72 75 6e 2d 74 69 6d 65 20 62 79  * of run-time by
23bd0 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e   skipping the in
23be0 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20  itialization of 
23bf0 74 68 6f 73 65 20 65 6c 65 6d 65 6e 74 73 2e 0a  those elements..
23c00 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
23c10 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 42  treeCursorZero(B
23c20 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 6d  tCursor *p){.  m
23c30 65 6d 73 65 74 28 70 2c 20 30 2c 20 6f 66 66 73  emset(p, 0, offs
23c40 65 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 69  etof(BtCursor, i
23c50 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Page));.}../*.**
23c60 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e   Close a cursor.
23c70 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20    The read lock 
23c80 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
23c90 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64  file is released
23ca0 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73  .** when the las
23cb0 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73  t cursor is clos
23cc0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
23cd0 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
23ce0 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  or(BtCursor *pCu
23cf0 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74  r){.  Btree *pBt
23d00 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42 74 72  ree = pCur->pBtr
23d10 65 65 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65  ee;.  if( pBtree
23d20 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
23d30 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
23d40 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20   = pCur->pBt;.  
23d50 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
23d60 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20  ter(pBtree);.   
23d70 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
23d80 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a  arCursor(pCur);.
23d90 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
23da0 3e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20  >pCursor!=0 );. 
23db0 20 20 20 69 66 28 20 70 42 74 2d 3e 70 43 75 72     if( pBt->pCur
23dc0 73 6f 72 3d 3d 70 43 75 72 20 29 7b 0a 20 20 20  sor==pCur ){.   
23dd0 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20     pBt->pCursor 
23de0 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
23df0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23e00 42 74 43 75 72 73 6f 72 20 2a 70 50 72 65 76 20  BtCursor *pPrev 
23e10 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a  = pBt->pCursor;.
23e20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20        do{.      
23e30 20 20 69 66 28 20 70 50 72 65 76 2d 3e 70 4e 65    if( pPrev->pNe
23e40 78 74 3d 3d 70 43 75 72 20 29 7b 0a 20 20 20 20  xt==pCur ){.    
23e50 20 20 20 20 20 20 70 50 72 65 76 2d 3e 70 4e 65        pPrev->pNe
23e60 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74  xt = pCur->pNext
23e70 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
23e80 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
23e90 20 20 20 20 20 70 50 72 65 76 20 3d 20 70 50 72       pPrev = pPr
23ea0 65 76 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ev->pNext;.     
23eb0 20 7d 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28   }while( ALWAYS(
23ec0 70 50 72 65 76 29 20 29 3b 0a 20 20 20 20 7d 0a  pPrev) );.    }.
23ed0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d      for(i=0; i<=
23ee0 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b  pCur->iPage; i++
23ef0 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
23f00 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67  Page(pCur->apPag
23f10 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e[i]);.    }.   
23f20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
23f30 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 73  used(pBt);.    s
23f40 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
23f50 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20  ->aOverflow);.  
23f60 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72 65    /* sqlite3_fre
23f70 65 28 70 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20  e(pCur); */.    
23f80 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
23f90 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20  e(pBtree);.  }. 
23fa0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
23fb0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  K;.}../*.** Make
23fc0 20 73 75 72 65 20 74 68 65 20 42 74 43 75 72 73   sure the BtCurs
23fd0 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65  or* given in the
23fe0 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61 20   argument has a 
23ff0 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f  valid.** BtCurso
24000 72 2e 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  r.info structure
24010 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  .  If it is not 
24020 61 6c 72 65 61 64 79 20 76 61 6c 69 64 2c 20 63  already valid, c
24030 61 6c 6c 0a 2a 2a 20 62 74 72 65 65 50 61 72 73  all.** btreePars
24040 65 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20  eCell() to fill 
24050 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43  it in..**.** BtC
24060 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20  ursor.info is a 
24070 63 61 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66  cache of the inf
24080 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  ormation in the 
24090 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a  current cell..**
240a0 20 55 73 69 6e 67 20 74 68 69 73 20 63 61 63 68   Using this cach
240b0 65 20 72 65 64 75 63 65 73 20 74 68 65 20 6e 75  e reduces the nu
240c0 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f  mber of calls to
240d0 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
240e0 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  )..*/.#ifndef ND
240f0 45 42 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f  EBUG.  static vo
24100 69 64 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66  id assertCellInf
24110 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  o(BtCursor *pCur
24120 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20  ){.    CellInfo 
24130 69 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20 69 50  info;.    int iP
24140 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67  age = pCur->iPag
24150 65 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69  e;.    memset(&i
24160 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69  nfo, 0, sizeof(i
24170 6e 66 6f 29 29 3b 0a 20 20 20 20 62 74 72 65 65  nfo));.    btree
24180 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e  ParseCell(pCur->
24190 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 20 70  apPage[iPage], p
241a0 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65  Cur->aiIdx[iPage
241b0 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61  ], &info);.    a
241c0 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
241d0 42 20 7c 7c 20 6d 65 6d 63 6d 70 28 26 69 6e 66  B || memcmp(&inf
241e0 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20  o, &pCur->info, 
241f0 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30  sizeof(info))==0
24200 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20   );.  }.#else.  
24210 23 64 65 66 69 6e 65 20 61 73 73 65 72 74 43 65  #define assertCe
24220 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66  llInfo(x).#endif
24230 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
24240 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 67 65 74  OINLINE void get
24250 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f  CellInfo(BtCurso
24260 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 66 28 20  r *pCur){.  if( 
24270 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
24280 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==0 ){.    int i
24290 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61  Page = pCur->iPa
242a0 67 65 3b 0a 20 20 20 20 70 43 75 72 2d 3e 63 75  ge;.    pCur->cu
242b0 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56  rFlags |= BTCF_V
242c0 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20 62 74  alidNKey;.    bt
242d0 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75  reeParseCell(pCu
242e0 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d  r->apPage[iPage]
242f0 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61  ,pCur->aiIdx[iPa
24300 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29  ge],&pCur->info)
24310 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
24320 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43  ssertCellInfo(pC
24330 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e  ur);.  }.}..#ifn
24340 64 65 66 20 4e 44 45 42 55 47 20 20 2f 2a 20 54  def NDEBUG  /* T
24350 68 65 20 6e 65 78 74 20 72 6f 75 74 69 6e 65 20  he next routine 
24360 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e  used only within
24370 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
24380 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65  ents */./*.** Re
24390 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
243a0 20 67 69 76 65 6e 20 42 74 43 75 72 73 6f 72 20   given BtCursor 
243b0 69 73 20 76 61 6c 69 64 2e 20 20 41 20 76 61 6c  is valid.  A val
243c0 69 64 20 63 75 72 73 6f 72 20 69 73 20 6f 6e 65  id cursor is one
243d0 0a 2a 2a 20 74 68 61 74 20 69 73 20 63 75 72 72  .** that is curr
243e0 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74  ently pointing t
243f0 6f 20 61 20 72 6f 77 20 69 6e 20 61 20 28 6e 6f  o a row in a (no
24400 6e 2d 65 6d 70 74 79 29 20 74 61 62 6c 65 2e 0a  n-empty) table..
24410 2a 2a 20 54 68 69 73 20 69 73 20 61 20 76 65 72  ** This is a ver
24420 69 66 69 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e  ification routin
24430 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 77  e is used only w
24440 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 73  ithin assert() s
24450 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e  tatements..*/.in
24460 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
24470 72 73 6f 72 49 73 56 61 6c 69 64 28 42 74 43 75  rsorIsValid(BtCu
24480 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72  rsor *pCur){.  r
24490 65 74 75 72 6e 20 70 43 75 72 20 26 26 20 70 43  eturn pCur && pC
244a0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
244b0 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64  OR_VALID;.}.#end
244c0 69 66 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a  if /* NDEBUG */.
244d0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
244e0 43 75 72 73 6f 72 49 73 56 61 6c 69 64 4e 4e 28  CursorIsValidNN(
244f0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
24500 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21  .  assert( pCur!
24510 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  =0 );.  return p
24520 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
24530 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a  SOR_VALID;.}../*
24540 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76  .** Return the v
24550 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65  alue of the inte
24560 67 65 72 20 6b 65 79 20 6f 72 20 22 72 6f 77 69  ger key or "rowi
24570 64 22 20 66 6f 72 20 61 20 74 61 62 6c 65 20 62  d" for a table b
24580 74 72 65 65 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  tree..** This ro
24590 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 76 61  utine is only va
245a0 6c 69 64 20 66 6f 72 20 61 20 63 75 72 73 6f 72  lid for a cursor
245b0 20 74 68 61 74 20 69 73 20 70 6f 69 6e 74 69 6e   that is pointin
245c0 67 20 69 6e 74 6f 20 61 0a 2a 2a 20 6f 72 64 69  g into a.** ordi
245d0 6e 61 72 79 20 74 61 62 6c 65 20 62 74 72 65 65  nary table btree
245e0 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  .  If the cursor
245f0 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 69 6e   points to an in
24600 64 65 78 20 62 74 72 65 65 20 6f 72 0a 2a 2a 20  dex btree or.** 
24610 69 73 20 69 6e 76 61 6c 69 64 2c 20 74 68 65 20  is invalid, the 
24620 72 65 73 75 6c 74 20 6f 66 20 74 68 69 73 20 72  result of this r
24630 6f 75 74 69 6e 65 20 69 73 20 75 6e 64 65 66 69  outine is undefi
24640 6e 65 64 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69  ned..*/.i64 sqli
24650 74 65 33 42 74 72 65 65 49 6e 74 65 67 65 72 4b  te3BtreeIntegerK
24660 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ey(BtCursor *pCu
24670 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  r){.  assert( cu
24680 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
24690 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
246a0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
246b0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
246c0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
246d0 63 75 72 49 6e 74 4b 65 79 20 29 3b 0a 20 20 67  curIntKey );.  g
246e0 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
246f0 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d  ;.  return pCur-
24700 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 7d 0a 0a 2f  >info.nKey;.}../
24710 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
24720 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
24730 6f 66 20 70 61 79 6c 6f 61 64 20 66 6f 72 20 74  of payload for t
24740 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 70 43  he entry that pC
24750 75 72 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74  ur is.** current
24760 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  ly pointing to. 
24770 20 46 6f 72 20 74 61 62 6c 65 20 62 74 72 65 65   For table btree
24780 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20  s, this will be 
24790 74 68 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66  the amount.** of
247a0 20 64 61 74 61 2e 20 20 46 6f 72 20 69 6e 64 65   data.  For inde
247b0 78 20 62 74 72 65 65 73 2c 20 74 68 69 73 20 77  x btrees, this w
247c0 69 6c 6c 20 62 65 20 74 68 65 20 73 69 7a 65 20  ill be the size 
247d0 6f 66 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a  of the key..**.*
247e0 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  * The caller mus
247f0 74 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  t guarantee that
24800 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70   the cursor is p
24810 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 6e 6f 6e  ointing to a non
24820 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64 20 65  -NULL.** valid e
24830 6e 74 72 79 2e 20 20 49 6e 20 6f 74 68 65 72 20  ntry.  In other 
24840 77 6f 72 64 73 2c 20 74 68 65 20 63 61 6c 6c 69  words, the calli
24850 6e 67 20 70 72 6f 63 65 64 75 72 65 20 6d 75 73  ng procedure mus
24860 74 20 67 75 61 72 61 6e 74 65 65 0a 2a 2a 20 74  t guarantee.** t
24870 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 68  hat the cursor h
24880 61 73 20 43 75 72 73 6f 72 2e 65 53 74 61 74 65  as Cursor.eState
24890 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a  ==CURSOR_VALID..
248a0 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 42 74  */.u32 sqlite3Bt
248b0 72 65 65 50 61 79 6c 6f 61 64 53 69 7a 65 28 42  reePayloadSize(B
248c0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
248d0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
248e0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
248f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
24900 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
24910 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 67 65  OR_VALID );.  ge
24920 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
24930 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e  .  return pCur->
24940 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a 7d  info.nPayload;.}
24950 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68  ../*.** Given th
24960 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
24970 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
24980 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
24990 65 20 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20  e (parameter.** 
249a0 6f 76 66 6c 29 2c 20 74 68 69 73 20 66 75 6e 63  ovfl), this func
249b0 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 70  tion finds the p
249c0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
249d0 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
249e0 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69  he .** linked li
249f0 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70  st of overflow p
24a00 61 67 65 73 2e 20 49 66 20 70 6f 73 73 69 62 6c  ages. If possibl
24a10 65 2c 20 69 74 20 75 73 65 73 20 74 68 65 20 61  e, it uses the a
24a20 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f  uto-vacuum.** po
24a30 69 6e 74 65 72 2d 6d 61 70 20 64 61 74 61 20 69  inter-map data i
24a40 6e 73 74 65 61 64 20 6f 66 20 72 65 61 64 69 6e  nstead of readin
24a50 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  g the content of
24a60 20 70 61 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f   page ovfl to do
24a70 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61   so. .**.** If a
24a80 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61  n error occurs a
24a90 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
24aa0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
24ab0 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a   Otherwise:.**.*
24ac0 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
24ad0 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6f 76  r of the next ov
24ae0 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74  erflow page in t
24af0 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69  he linked list i
24b00 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f  s .** written to
24b10 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20   *pPgnoNext. If 
24b20 70 61 67 65 20 6f 76 66 6c 20 69 73 20 74 68 65  page ovfl is the
24b30 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 69 74   last page in it
24b40 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73  s linked .** lis
24b50 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73  t, *pPgnoNext is
24b60 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a   set to zero. .*
24b70 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67 65 20 69  *.** If ppPage i
24b80 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64 20  s not NULL, and 
24b90 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
24ba0 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63  he MemPage objec
24bb0 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  t corresponding.
24bc0 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65  ** to page numbe
24bd0 72 20 70 4f 76 66 6c 20 77 61 73 20 6f 62 74 61  r pOvfl was obta
24be0 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70 50 61  ined, then *ppPa
24bf0 67 65 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  ge is set to poi
24c00 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 72 65  nt to that.** re
24c10 66 65 72 65 6e 63 65 2e 20 49 74 20 69 73 20 74  ference. It is t
24c20 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
24c30 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
24c40 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65 50  to call releaseP
24c50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50  age().** on *ppP
24c60 61 67 65 20 74 6f 20 66 72 65 65 20 74 68 65 20  age to free the 
24c70 72 65 66 65 72 65 6e 63 65 2e 20 49 6e 20 6e 6f  reference. In no
24c80 20 72 65 66 65 72 65 6e 63 65 20 77 61 73 20 6f   reference was o
24c90 62 74 61 69 6e 65 64 20 28 62 65 63 61 75 73 65  btained (because
24ca0 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  .** the pointer-
24cb0 6d 61 70 20 77 61 73 20 75 73 65 64 20 74 6f 20  map was used to 
24cc0 6f 62 74 61 69 6e 20 74 68 65 20 76 61 6c 75 65  obtain the value
24cd0 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78 74 29   for *pPgnoNext)
24ce0 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50 61 67  , then.** *ppPag
24cf0 65 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  e is set to zero
24d00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
24d10 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
24d20 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
24d30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24d40 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
24d50 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f  file */.  Pgno o
24d60 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  vfl,            
24d70 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
24d80 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
24d90 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 4d 65 6d 50  number */.  MemP
24da0 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
24db0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
24dc0 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c 65 20   MemPage handle 
24dd0 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 2a 2f  (may be NULL) */
24de0 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65  .  Pgno *pPgnoNe
24df0 78 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  xt              
24e00 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65  /* OUT: Next ove
24e10 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65  rflow page numbe
24e20 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e  r */.){.  Pgno n
24e30 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  ext = 0;.  MemPa
24e40 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20  ge *pPage = 0;. 
24e50 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
24e60 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
24e70 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
24e80 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
24e90 3b 0a 20 20 61 73 73 65 72 74 28 70 50 67 6e 6f  ;.  assert(pPgno
24ea0 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20  Next);..#ifndef 
24eb0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
24ec0 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20  VACUUM.  /* Try 
24ed0 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65 78 74  to find the next
24ee0 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65   page in the ove
24ef0 72 66 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e 67  rflow list using
24f00 20 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61   the.  ** autova
24f10 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70  cuum pointer-map
24f20 20 70 61 67 65 73 2e 20 47 75 65 73 73 20 74 68   pages. Guess th
24f30 61 74 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  at the next page
24f40 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76   in .  ** the ov
24f50 65 72 66 6c 6f 77 20 6c 69 73 74 20 69 73 20 70  erflow list is p
24f60 61 67 65 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c  age number (ovfl
24f70 2b 31 29 2e 20 49 66 20 74 68 61 74 20 67 75 65  +1). If that gue
24f80 73 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f  ss turns .  ** o
24f90 75 74 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20  ut to be wrong, 
24fa0 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61  fall back to loa
24fb0 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 6f 66  ding the data of
24fc0 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62   page .  ** numb
24fd0 65 72 20 6f 76 66 6c 20 74 6f 20 64 65 74 65 72  er ovfl to deter
24fe0 6d 69 6e 65 20 74 68 65 20 6e 65 78 74 20 70 61  mine the next pa
24ff0 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a  ge number..  */.
25000 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
25010 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e  acuum ){.    Pgn
25020 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f  o pgno;.    Pgno
25030 20 69 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31   iGuess = ovfl+1
25040 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a  ;.    u8 eType;.
25050 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d  .    while( PTRM
25060 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
25070 47 75 65 73 73 29 20 7c 7c 20 69 47 75 65 73 73  Guess) || iGuess
25080 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
25090 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
250a0 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20    iGuess++;.    
250b0 7d 0a 0a 20 20 20 20 69 66 28 20 69 47 75 65 73  }..    if( iGues
250c0 73 3c 3d 62 74 72 65 65 50 61 67 65 63 6f 75 6e  s<=btreePagecoun
250d0 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  t(pBt) ){.      
250e0 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
250f0 42 74 2c 20 69 47 75 65 73 73 2c 20 26 65 54 79  Bt, iGuess, &eTy
25100 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20  pe, &pgno);.    
25110 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
25120 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d 50 54  _OK && eType==PT
25130 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26  RMAP_OVERFLOW2 &
25140 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a  & pgno==ovfl ){.
25150 20 20 20 20 20 20 20 20 6e 65 78 74 20 3d 20 69          next = i
25160 47 75 65 73 73 3b 0a 20 20 20 20 20 20 20 20 72  Guess;.        r
25170 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
25180 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
25190 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73   }.#endif..  ass
251a0 65 72 74 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20  ert( next==0 || 
251b0 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
251c0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
251d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
251e0 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
251f0 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67  pBt, ovfl, &pPag
25200 65 2c 20 28 70 70 50 61 67 65 3d 3d 30 29 20 3f  e, (ppPage==0) ?
25210 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f   PAGER_GET_READO
25220 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 20 20 61 73  NLY : 0);.    as
25230 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
25240 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30 20  _OK || pPage==0 
25250 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
25260 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
25270 20 20 6e 65 78 74 20 3d 20 67 65 74 34 62 79 74    next = get4byt
25280 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b  e(pPage->aData);
25290 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70  .    }.  }..  *p
252a0 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b  PgnoNext = next;
252b0 0a 20 20 69 66 28 20 70 70 50 61 67 65 20 29 7b  .  if( ppPage ){
252c0 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70  .    *ppPage = p
252d0 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Page;.  }else{. 
252e0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
252f0 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Page);.  }.  ret
25300 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  urn (rc==SQLITE_
25310 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f 4b  DONE ? SQLITE_OK
25320 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   : rc);.}../*.**
25330 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   Copy data from 
25340 61 20 62 75 66 66 65 72 20 74 6f 20 61 20 70 61  a buffer to a pa
25350 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70 61  ge, or from a pa
25360 67 65 20 74 6f 20 61 20 62 75 66 66 65 72 2e 0a  ge to a buffer..
25370 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69  **.** pPayload i
25380 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64  s a pointer to d
25390 61 74 61 20 73 74 6f 72 65 64 20 6f 6e 20 64 61  ata stored on da
253a0 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50  tabase page pDbP
253b0 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d  age..** If argum
253c0 65 6e 74 20 65 4f 70 20 69 73 20 66 61 6c 73 65  ent eOp is false
253d0 2c 20 74 68 65 6e 20 6e 42 79 74 65 20 62 79 74  , then nByte byt
253e0 65 73 20 6f 66 20 64 61 74 61 20 61 72 65 20 63  es of data are c
253f0 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50  opied.** from pP
25400 61 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 62 75  ayload to the bu
25410 66 66 65 72 20 70 6f 69 6e 74 65 64 20 61 74 20  ffer pointed at 
25420 62 79 20 70 42 75 66 2e 20 49 66 20 65 4f 70 20  by pBuf. If eOp 
25430 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e  is true,.** then
25440 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
25450 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f  te() is called o
25460 6e 20 70 44 62 50 61 67 65 20 61 6e 64 20 6e 42  n pDbPage and nB
25470 79 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20  yte bytes.** of 
25480 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 20  data are copied 
25490 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20  from the buffer 
254a0 70 42 75 66 20 74 6f 20 70 50 61 79 6c 6f 61 64  pBuf to pPayload
254b0 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
254c0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
254d0 20 73 75 63 63 65 73 73 2c 20 6f 74 68 65 72 77   success, otherw
254e0 69 73 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ise an error cod
254f0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
25500 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20 20   copyPayload(.  
25510 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20  void *pPayload, 
25520 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
25530 6e 74 65 72 20 74 6f 20 70 61 67 65 20 64 61 74  nter to page dat
25540 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75  a */.  void *pBu
25550 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
25560 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62   /* Pointer to b
25570 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  uffer */.  int n
25580 42 79 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  Byte,           
25590 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
255a0 66 20 62 79 74 65 73 20 74 6f 20 63 6f 70 79 20  f bytes to copy 
255b0 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20 20  */.  int eOp,   
255c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
255d0 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d  * 0 -> copy from
255e0 20 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79   page, 1 -> copy
255f0 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44 62   to page */.  Db
25600 50 61 67 65 20 2a 70 44 62 50 61 67 65 20 20 20  Page *pDbPage   
25610 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
25620 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61 79 6c  containing pPayl
25630 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  oad */.){.  if( 
25640 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f  eOp ){.    /* Co
25650 70 79 20 64 61 74 61 20 66 72 6f 6d 20 62 75 66  py data from buf
25660 66 65 72 20 74 6f 20 70 61 67 65 20 28 61 20 77  fer to page (a w
25670 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 29 20  rite operation) 
25680 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  */.    int rc = 
25690 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
256a0 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  e(pDbPage);.    
256b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
256c0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
256d0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
256e0 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c  memcpy(pPayload,
256f0 20 70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20   pBuf, nByte);. 
25700 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43   }else{.    /* C
25710 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 70 61  opy data from pa
25720 67 65 20 74 6f 20 62 75 66 66 65 72 20 28 61 20  ge to buffer (a 
25730 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 29 20  read operation) 
25740 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 42  */.    memcpy(pB
25750 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42  uf, pPayload, nB
25760 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  yte);.  }.  retu
25770 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
25780 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
25790 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
257a0 72 65 61 64 20 6f 72 20 6f 76 65 72 77 72 69 74  read or overwrit
257b0 65 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d  e payload inform
257c0 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65  ation.** for the
257d0 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
257e0 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70  pCur cursor is p
257f0 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 54 68 65 20  ointing to. The 
25800 65 4f 70 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20  eOp.** argument 
25810 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
25820 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
25830 20 20 20 30 3a 20 54 68 65 20 6f 70 65 72 61 74     0: The operat
25840 69 6f 6e 20 69 73 20 61 20 72 65 61 64 2e 20 50  ion is a read. P
25850 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72  opulate the over
25860 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 20 20  flow cache..**  
25870 20 31 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f   1: The operatio
25880 6e 20 69 73 20 61 20 77 72 69 74 65 2e 20 50 6f  n is a write. Po
25890 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66  pulate the overf
258a0 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a  low cache..**.**
258b0 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74   A total of "amt
258c0 22 20 62 79 74 65 73 20 61 72 65 20 72 65 61 64  " bytes are read
258d0 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67 69   or written begi
258e0 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65 74  nning at "offset
258f0 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72 65  "..** Data is re
25900 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68  ad to or from th
25910 65 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a  e buffer pBuf..*
25920 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74  *.** The content
25930 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 20 77   being read or w
25940 72 69 74 74 65 6e 20 6d 69 67 68 74 20 61 70 70  ritten might app
25950 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ear on the main 
25960 70 61 67 65 0a 2a 2a 20 6f 72 20 62 65 20 73 63  page.** or be sc
25970 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d  attered out on m
25980 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77  ultiple overflow
25990 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   pages..**.** If
259a0 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
259b0 73 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20 6f  sor entry uses o
259c0 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66  ne or more overf
259d0 6c 6f 77 20 70 61 67 65 73 0a 2a 2a 20 74 68 69  low pages.** thi
259e0 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61  s function may a
259f0 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
25a00 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20 70 6f 70  r and lazily pop
25a10 75 6c 61 74 65 0a 2a 2a 20 74 68 65 20 6f 76 65  ulate.** the ove
25a20 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
25a30 63 61 63 68 65 20 61 72 72 61 79 20 28 42 74 43  cache array (BtC
25a40 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 29  ursor.aOverflow)
25a50 2e 20 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e 74  . .** Subsequent
25a60 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69 73 20   calls use this 
25a70 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20 73 65  cache to make se
25a80 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70  eking to the sup
25a90 70 6c 69 65 64 20 6f 66 66 73 65 74 20 0a 2a 2a  plied offset .**
25aa0 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 2e   more efficient.
25ab0 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f  .**.** Once an o
25ac0 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
25ad0 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e  t cache has been
25ae0 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d   allocated, it m
25af0 75 73 74 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69  ust be.** invali
25b00 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74  dated if some ot
25b10 68 65 72 20 63 75 72 73 6f 72 20 77 72 69 74 65  her cursor write
25b20 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74 61  s to the same ta
25b30 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68  ble, or if.** th
25b40 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65  e cursor is move
25b50 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74  d to a different
25b60 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c   row. Additional
25b70 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63 75  ly, in auto-vacu
25b80 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20  um.** mode, the 
25b90 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73  following events
25ba0 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65 20   may invalidate 
25bb0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
25bc0 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a  -list cache..**.
25bd0 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d  **   * An increm
25be0 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a  ental vacuum,.**
25bf0 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e     * A commit in
25c00 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75   auto_vacuum="fu
25c10 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a  ll" mode,.**   *
25c20 20 43 72 65 61 74 69 6e 67 20 61 20 74 61 62 6c   Creating a tabl
25c30 65 20 28 6d 61 79 20 72 65 71 75 69 72 65 20 6d  e (may require m
25c40 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f  oving an overflo
25c50 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74  w page)..*/.stat
25c60 69 63 20 69 6e 74 20 61 63 63 65 73 73 50 61 79  ic int accessPay
25c70 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72  load(.  BtCursor
25c80 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20   *pCur,      /* 
25c90 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  Cursor pointing 
25ca0 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64  to entry to read
25cb0 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 6f   from */.  u32 o
25cc0 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20  ffset,          
25cd0 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67  /* Begin reading
25ce0 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20 70   this far into p
25cf0 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32 20  ayload */.  u32 
25d00 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  amt,            
25d10 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d 61   /* Read this ma
25d20 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e  ny bytes */.  un
25d30 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42 75  signed char *pBu
25d40 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  f, /* Write the 
25d50 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73 20  bytes into this 
25d60 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74  buffer */ .  int
25d70 20 65 4f 70 20 20 20 20 20 20 20 20 20 20 20 20   eOp            
25d80 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61    /* zero to rea
25d90 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77  d. non-zero to w
25da0 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e  rite. */.){.  un
25db0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61  signed char *aPa
25dc0 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20  yload;.  int rc 
25dd0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
25de0 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d  nt iIdx = 0;.  M
25df0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
25e00 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
25e10 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 42 74  r->iPage]; /* Bt
25e20 72 65 65 20 70 61 67 65 20 6f 66 20 63 75 72 72  ree page of curr
25e30 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42  ent entry */.  B
25e40 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
25e50 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20 20 20  Cur->pBt;       
25e60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74             /* Bt
25e70 72 65 65 20 74 68 69 73 20 63 75 72 73 6f 72 20  ree this cursor 
25e80 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 23 69  belongs to */.#i
25e90 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45  fdef SQLITE_DIRE
25ea0 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44  CT_OVERFLOW_READ
25eb0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
25ec0 20 2a 20 63 6f 6e 73 74 20 70 42 75 66 53 74 61   * const pBufSta
25ed0 72 74 20 3d 20 70 42 75 66 3b 20 20 20 20 20 2f  rt = pBuf;     /
25ee0 2a 20 53 74 61 72 74 20 6f 66 20 6f 72 69 67 69  * Start of origi
25ef0 6e 61 6c 20 6f 75 74 20 62 75 66 66 65 72 20 2a  nal out buffer *
25f00 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  /.#endif..  asse
25f10 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20 61  rt( pPage );.  a
25f20 73 73 65 72 74 28 20 65 4f 70 3d 3d 30 20 7c 7c  ssert( eOp==0 ||
25f30 20 65 4f 70 3d 3d 31 20 29 3b 0a 20 20 61 73 73   eOp==1 );.  ass
25f40 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
25f50 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
25f60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
25f70 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
25f80 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65  Page]<pPage->nCe
25f90 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
25fa0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
25fb0 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 67 65 74  (pCur) );..  get
25fc0 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
25fd0 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75    aPayload = pCu
25fe0 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  r->info.pPayload
25ff0 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  ;.  assert( offs
26000 65 74 2b 61 6d 74 20 3c 3d 20 70 43 75 72 2d 3e  et+amt <= pCur->
26010 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b  info.nPayload );
26020 0a 0a 20 20 61 73 73 65 72 74 28 20 61 50 61 79  ..  assert( aPay
26030 6c 6f 61 64 20 3e 20 70 50 61 67 65 2d 3e 61 44  load > pPage->aD
26040 61 74 61 20 29 3b 0a 20 20 69 66 28 20 28 75 70  ata );.  if( (up
26050 74 72 29 28 61 50 61 79 6c 6f 61 64 20 2d 20 70  tr)(aPayload - p
26060 50 61 67 65 2d 3e 61 44 61 74 61 29 20 3e 20 28  Page->aData) > (
26070 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
26080 2d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  - pCur->info.nLo
26090 63 61 6c 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  cal) ){.    /* T
260a0 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20 6f 72  rying to read or
260b0 20 77 72 69 74 65 20 70 61 73 74 20 74 68 65 20   write past the 
260c0 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 20  end of the data 
260d0 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 20 54 68  is an error.  Th
260e0 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 64 69 74 69  e.    ** conditi
260f0 6f 6e 61 6c 20 61 62 6f 76 65 20 69 73 20 72 65  onal above is re
26100 61 6c 6c 79 3a 0a 20 20 20 20 2a 2a 20 20 20 20  ally:.    **    
26110 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e  &aPayload[pCur->
26120 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26  info.nLocal] > &
26130 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
26140 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 0a 20 20  ->usableSize].  
26150 20 20 2a 2a 20 62 75 74 20 69 73 20 72 65 63 61    ** but is reca
26160 73 74 20 69 6e 74 6f 20 69 74 73 20 63 75 72 72  st into its curr
26170 65 6e 74 20 66 6f 72 6d 20 74 6f 20 61 76 6f 69  ent form to avoi
26180 64 20 69 6e 74 65 67 65 72 20 6f 76 65 72 66 6c  d integer overfl
26190 6f 77 20 70 72 6f 62 6c 65 6d 73 0a 20 20 20 20  ow problems.    
261a0 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
261b0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
261c0 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  T;.  }..  /* Che
261d0 63 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74 20  ck if data must 
261e0 62 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20  be read/written 
261f0 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72 65  to/from the btre
26200 65 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20 2a  e page itself. *
26210 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70  /.  if( offset<p
26220 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
26230 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20   ){.    int a = 
26240 61 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f  amt;.    if( a+o
26250 66 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f  ffset>pCur->info
26260 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20  .nLocal ){.     
26270 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   a = pCur->info.
26280 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b  nLocal - offset;
26290 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
262a0 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61  copyPayload(&aPa
262b0 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70  yload[offset], p
262c0 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 50 61  Buf, a, eOp, pPa
262d0 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
262e0 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20    offset = 0;.  
262f0 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20    pBuf += a;.   
26300 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c   amt -= a;.  }el
26310 73 65 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2d  se{.    offset -
26320 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
26330 63 61 6c 3b 0a 20 20 7d 0a 0a 0a 20 20 69 66 28  cal;.  }...  if(
26340 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
26350 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63  & amt>0 ){.    c
26360 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c 53 69 7a  onst u32 ovflSiz
26370 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
26380 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74  ize - 4;  /* Byt
26390 65 73 20 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f  es content per o
263a0 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  vfl page */.    
263b0 50 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a  Pgno nextPage;..
263c0 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67      nextPage = g
263d0 65 74 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61  et4byte(&aPayloa
263e0 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  d[pCur->info.nLo
263f0 63 61 6c 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  cal]);..    /* I
26400 66 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 61  f the BtCursor.a
26410 4f 76 65 72 66 6c 6f 77 5b 5d 20 68 61 73 20 6e  Overflow[] has n
26420 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ot been allocate
26430 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e  d, allocate it n
26440 6f 77 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ow..    **.    *
26450 2a 20 54 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b  * The aOverflow[
26460 5d 20 61 72 72 61 79 20 69 73 20 73 69 7a 65 64  ] array is sized
26470 20 61 74 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f   at one entry fo
26480 72 20 65 61 63 68 20 6f 76 65 72 66 6c 6f 77 20  r each overflow 
26490 70 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74  page.    ** in t
264a0 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69  he overflow chai
264b0 6e 2e 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  n. The page numb
264c0 65 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  er of the first 
264d0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73  overflow page is
264e0 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 69  .    ** stored i
264f0 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 20  n aOverflow[0], 
26500 65 74 63 2e 20 41 20 76 61 6c 75 65 20 6f 66 20  etc. A value of 
26510 30 20 69 6e 20 74 68 65 20 61 4f 76 65 72 66 6c  0 in the aOverfl
26520 6f 77 5b 5d 20 61 72 72 61 79 0a 20 20 20 20 2a  ow[] array.    *
26530 2a 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65 74  * means "not yet
26540 20 6b 6e 6f 77 6e 22 20 28 74 68 65 20 63 61 63   known" (the cac
26550 68 65 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70  he is lazily pop
26560 75 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a  ulated)..    */.
26570 20 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63      if( (pCur->c
26580 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
26590 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 7b 0a  alidOvfl)==0 ){.
265a0 20 20 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20        int nOvfl 
265b0 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50  = (pCur->info.nP
265c0 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66  ayload-pCur->inf
265d0 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a  o.nLocal+ovflSiz
265e0 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20  e-1)/ovflSize;. 
265f0 20 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 3e 70       if( nOvfl>p
26600 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20  Cur->nOvflAlloc 
26610 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  ){.        Pgno 
26620 2a 61 4e 65 77 20 3d 20 28 50 67 6e 6f 2a 29 73  *aNew = (Pgno*)s
26630 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63 28 0a 20  qlite3Realloc(. 
26640 20 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d             pCur-
26650 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 6e 4f 76 66  >aOverflow, nOvf
26660 6c 2a 32 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29  l*2*sizeof(Pgno)
26670 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
26680 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20      if( aNew==0 
26690 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
266a0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
266b0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d  _BKPT;.        }
266c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
266d0 70 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f 63  pCur->nOvflAlloc
266e0 20 3d 20 6e 4f 76 66 6c 2a 32 3b 0a 20 20 20 20   = nOvfl*2;.    
266f0 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65        pCur->aOve
26700 72 66 6c 6f 77 20 3d 20 61 4e 65 77 3b 0a 20 20  rflow = aNew;.  
26710 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
26720 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 43 75        memset(pCu
26730 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 30 2c  r->aOverflow, 0,
26740 20 6e 4f 76 66 6c 2a 73 69 7a 65 6f 66 28 50 67   nOvfl*sizeof(Pg
26750 6e 6f 29 29 3b 0a 20 20 20 20 20 20 70 43 75 72  no));.      pCur
26760 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54  ->curFlags |= BT
26770 43 46 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a 20 20  CF_ValidOvfl;.  
26780 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
26790 2a 20 49 66 20 74 68 65 20 6f 76 65 72 66 6c 6f  * If the overflo
267a0 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
267b0 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
267c0 61 74 65 64 20 61 6e 64 20 74 68 65 0a 20 20 20  ated and the.   
267d0 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20     ** entry for 
267e0 74 68 65 20 66 69 72 73 74 20 72 65 71 75 69 72  the first requir
267f0 65 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ed overflow page
26800 20 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a   is valid, skip.
26810 20 20 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c        ** directl
26820 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 20 20 2a  y to it..      *
26830 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  /.      if( pCur
26840 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73  ->aOverflow[offs
26850 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a  et/ovflSize] ){.
26860 20 20 20 20 20 20 20 20 69 49 64 78 20 3d 20 28          iIdx = (
26870 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29  offset/ovflSize)
26880 3b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 50 61  ;.        nextPa
26890 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72  ge = pCur->aOver
268a0 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20  flow[iIdx];.    
268b0 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66      offset = (of
268c0 66 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a  fset%ovflSize);.
268d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
268e0 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
268f0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e  QLITE_OK && amt>
26900 30 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  0 );.    while( 
26910 6e 65 78 74 50 61 67 65 20 29 7b 0a 20 20 20 20  nextPage ){.    
26920 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65 64    /* If required
26930 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f  , populate the o
26940 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
26950 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20  t cache. */.    
26960 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
26970 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d  aOverflow[iIdx]=
26980 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
26990 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66   || pCur->aOverf
269a0 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50  low[iIdx]==nextP
269b0 61 67 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  age.            
269c0 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20    || CORRUPT_DB 
269d0 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61  );.      pCur->a
269e0 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d  Overflow[iIdx] =
269f0 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20   nextPage;..    
26a00 20 20 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76    if( offset>=ov
26a10 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  flSize ){.      
26a20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65    /* The only re
26a30 61 73 6f 6e 20 74 6f 20 72 65 61 64 20 74 68 69  ason to read thi
26a40 73 20 70 61 67 65 20 69 73 20 74 6f 20 6f 62 74  s page is to obt
26a50 61 69 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20  ain the page.   
26a60 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66       ** number f
26a70 6f 72 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  or the next page
26a80 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
26a90 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65   chain. The page
26aa0 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61  .        ** data
26ab0 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
26ac0 2e 20 53 6f 20 66 69 72 73 74 20 74 72 79 20 74  . So first try t
26ad0 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65  o lookup the ove
26ae0 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a  rflow.        **
26af0 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
26b00 2c 20 69 66 20 61 6e 79 2c 20 74 68 65 6e 20 66  , if any, then f
26b10 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20  all back to the 
26b20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
26b30 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e  ).        ** fun
26b40 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a  ction..        *
26b50 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
26b60 28 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73  ( pCur->curFlags
26b70 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66   & BTCF_ValidOvf
26b80 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  l );.        ass
26b90 65 72 74 28 20 70 43 75 72 2d 3e 70 42 74 72 65  ert( pCur->pBtre
26ba0 65 2d 3e 64 62 3d 3d 70 42 74 2d 3e 64 62 20 29  e->db==pBt->db )
26bb0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  ;.        if( pC
26bc0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
26bd0 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20  dx+1] ){.       
26be0 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43     nextPage = pC
26bf0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
26c00 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d  dx+1];.        }
26c10 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
26c20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77  rc = getOverflow
26c30 50 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50 61  Page(pBt, nextPa
26c40 67 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67 65  ge, 0, &nextPage
26c50 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
26c60 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f       offset -= o
26c70 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d  vflSize;.      }
26c80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
26c90 20 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74 68   Need to read th
26ca0 69 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c 79  is page properly
26cb0 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f  . It contains so
26cc0 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  me of the.      
26cd0 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61    ** range of da
26ce0 74 61 20 74 68 61 74 20 69 73 20 62 65 69 6e 67  ta that is being
26cf0 20 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f   read (eOp==0) o
26d00 72 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21 3d  r written (eOp!=
26d10 30 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23  0)..        */.#
26d20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52  ifdef SQLITE_DIR
26d30 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41  ECT_OVERFLOW_REA
26d40 44 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  D.        sqlite
26d50 33 5f 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 20  3_file *fd;     
26d60 20 2f 2a 20 46 69 6c 65 20 66 72 6f 6d 20 77 68   /* File from wh
26d70 69 63 68 20 74 6f 20 64 6f 20 64 69 72 65 63 74  ich to do direct
26d80 20 6f 76 65 72 66 6c 6f 77 20 72 65 61 64 20 2a   overflow read *
26d90 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  /.#endif.       
26da0 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20   int a = amt;.  
26db0 20 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66        if( a + of
26dc0 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20  fset > ovflSize 
26dd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 20 3d  ){.          a =
26de0 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73   ovflSize - offs
26df0 65 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 23  et;.        }..#
26e00 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52  ifdef SQLITE_DIR
26e10 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41  ECT_OVERFLOW_REA
26e20 44 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  D.        /* If 
26e30 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  all the followin
26e40 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20 20  g are true:.    
26e50 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
26e60 2a 20 20 20 31 29 20 74 68 69 73 20 69 73 20 61  *   1) this is a
26e70 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 2c   read operation,
26e80 20 61 6e 64 20 0a 20 20 20 20 20 20 20 20 2a 2a   and .        **
26e90 20 20 20 32 29 20 64 61 74 61 20 69 73 20 72 65     2) data is re
26ea0 71 75 69 72 65 64 20 66 72 6f 6d 20 74 68 65 20  quired from the 
26eb0 73 74 61 72 74 20 6f 66 20 74 68 69 73 20 6f 76  start of this ov
26ec0 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 61 6e 64  erflow page, and
26ed0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 33 29  .        **   3)
26ee0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6f 70 65   there is no ope
26ef0 6e 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  n write-transact
26f00 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20 20 20  ion, and.       
26f10 20 2a 2a 20 20 20 34 29 20 74 68 65 20 64 61 74   **   4) the dat
26f20 61 62 61 73 65 20 69 73 20 66 69 6c 65 2d 62 61  abase is file-ba
26f30 63 6b 65 64 2c 20 61 6e 64 0a 20 20 20 20 20 20  cked, and.      
26f40 20 20 2a 2a 20 20 20 35 29 20 74 68 65 20 70 61    **   5) the pa
26f50 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65  ge is not in the
26f60 20 57 41 4c 20 66 69 6c 65 0a 20 20 20 20 20 20   WAL file.      
26f70 20 20 2a 2a 20 20 20 36 29 20 61 74 20 6c 65 61    **   6) at lea
26f80 73 74 20 34 20 62 79 74 65 73 20 68 61 76 65 20  st 4 bytes have 
26f90 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65 61  already been rea
26fa0 64 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  d into the outpu
26fb0 74 20 62 75 66 66 65 72 20 0a 20 20 20 20 20 20  t buffer .      
26fc0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
26fd0 74 68 65 6e 20 64 61 74 61 20 63 61 6e 20 62 65  then data can be
26fe0 20 72 65 61 64 20 64 69 72 65 63 74 6c 79 20 66   read directly f
26ff0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
27000 20 66 69 6c 65 20 69 6e 74 6f 20 74 68 65 0a 20   file into the. 
27010 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74         ** output
27020 20 62 75 66 66 65 72 2c 20 62 79 70 61 73 73 69   buffer, bypassi
27030 6e 67 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  ng the page-cach
27040 65 20 61 6c 74 6f 67 65 74 68 65 72 2e 20 54 68  e altogether. Th
27050 69 73 20 73 70 65 65 64 73 0a 20 20 20 20 20 20  is speeds.      
27060 20 20 2a 2a 20 75 70 20 6c 6f 61 64 69 6e 67 20    ** up loading 
27070 6c 61 72 67 65 20 72 65 63 6f 72 64 73 20 74 68  large records th
27080 61 74 20 73 70 61 6e 20 6d 61 6e 79 20 6f 76 65  at span many ove
27090 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20 20  rflow pages..   
270a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
270b0 69 66 28 20 65 4f 70 3d 3d 30 20 20 20 20 20 20  if( eOp==0      
270c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
270d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
270e0 20 20 20 20 20 20 20 2f 2a 20 28 31 29 20 2a 2f         /* (1) */
270f0 0a 20 20 20 20 20 20 20 20 20 26 26 20 6f 66 66  .         && off
27100 73 65 74 3d 3d 30 20 20 20 20 20 20 20 20 20 20  set==0          
27110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27130 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20 20 20  /* (2) */.      
27140 20 20 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61     && pBt->inTra
27150 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
27160 52 45 41 44 20 20 20 20 20 20 20 20 20 20 20 20  READ            
27170 20 20 20 20 20 20 20 20 20 2f 2a 20 28 33 29 20           /* (3) 
27180 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  */.         && (
27190 66 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  fd = sqlite3Page
271a0 72 46 69 6c 65 28 70 42 74 2d 3e 70 50 61 67 65  rFile(pBt->pPage
271b0 72 29 29 2d 3e 70 4d 65 74 68 6f 64 73 20 20 20  r))->pMethods   
271c0 20 20 2f 2a 20 28 34 29 20 2a 2f 0a 20 20 20 20    /* (4) */.    
271d0 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74       && 0==sqlit
271e0 65 33 50 61 67 65 72 55 73 65 57 61 6c 28 70 42  e3PagerUseWal(pB
271f0 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50  t->pPager, nextP
27200 61 67 65 29 20 20 20 20 20 20 20 2f 2a 20 28 35  age)       /* (5
27210 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
27220 20 26 70 42 75 66 5b 2d 34 5d 3e 3d 70 42 75 66   &pBuf[-4]>=pBuf
27230 53 74 61 72 74 20 20 20 20 20 20 20 20 20 20 20  Start           
27240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27250 20 20 20 20 2f 2a 20 28 36 29 20 2a 2f 0a 20 20      /* (6) */.  
27260 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
27270 20 20 20 75 38 20 61 53 61 76 65 5b 34 5d 3b 0a     u8 aSave[4];.
27280 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 61 57            u8 *aW
27290 72 69 74 65 20 3d 20 26 70 42 75 66 5b 2d 34 5d  rite = &pBuf[-4]
272a0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
272b0 72 74 28 20 61 57 72 69 74 65 3e 3d 70 42 75 66  rt( aWrite>=pBuf
272c0 53 74 61 72 74 20 29 3b 20 20 20 20 20 20 20 20  Start );        
272d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
272e0 20 2f 2a 20 64 75 65 20 74 6f 20 28 36 29 20 2a   /* due to (6) *
272f0 2f 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  /.          memc
27300 70 79 28 61 53 61 76 65 2c 20 61 57 72 69 74 65  py(aSave, aWrite
27310 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
27320 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
27330 61 64 28 66 64 2c 20 61 57 72 69 74 65 2c 20 61  ad(fd, aWrite, a
27340 2b 34 2c 20 28 69 36 34 29 70 42 74 2d 3e 70 61  +4, (i64)pBt->pa
27350 67 65 53 69 7a 65 2a 28 6e 65 78 74 50 61 67 65  geSize*(nextPage
27360 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -1));.          
27370 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62  nextPage = get4b
27380 79 74 65 28 61 57 72 69 74 65 29 3b 0a 20 20 20  yte(aWrite);.   
27390 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 57         memcpy(aW
273a0 72 69 74 65 2c 20 61 53 61 76 65 2c 20 34 29 3b  rite, aSave, 4);
273b0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  .        }else.#
273c0 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 20 20 7b  endif..        {
273d0 0a 20 20 20 20 20 20 20 20 20 20 44 62 50 61 67  .          DbPag
273e0 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20  e *pDbPage;.    
273f0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
27400 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
27410 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65  pPager, nextPage
27420 2c 20 26 70 44 62 50 61 67 65 2c 0a 20 20 20 20  , &pDbPage,.    
27430 20 20 20 20 20 20 20 20 20 20 28 65 4f 70 3d 3d            (eOp==
27440 30 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45  0 ? PAGER_GET_RE
27450 41 44 4f 4e 4c 59 20 3a 20 30 29 0a 20 20 20 20  ADONLY : 0).    
27460 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
27470 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
27480 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
27490 20 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73      aPayload = s
274a0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
274b0 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ta(pDbPage);.   
274c0 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67           nextPag
274d0 65 20 3d 20 67 65 74 34 62 79 74 65 28 61 50 61  e = get4byte(aPa
274e0 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20  yload);.        
274f0 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79      rc = copyPay
27500 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f  load(&aPayload[o
27510 66 66 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20  ffset+4], pBuf, 
27520 61 2c 20 65 4f 70 2c 20 70 44 62 50 61 67 65 29  a, eOp, pDbPage)
27530 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
27540 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
27550 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
27560 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30        offset = 0
27570 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
27580 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27590 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20  amt -= a;.      
275a0 20 20 69 66 28 20 61 6d 74 3d 3d 30 20 29 20 72    if( amt==0 ) r
275b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
275c0 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20    pBuf += a;.   
275d0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
275e0 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  c ) break;.     
275f0 20 69 49 64 78 2b 2b 3b 0a 20 20 20 20 7d 0a 20   iIdx++;.    }. 
27600 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
27610 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30  LITE_OK && amt>0
27620 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
27630 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
27640 50 54 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20  PT; /* Overflow 
27650 63 68 61 69 6e 20 65 6e 64 73 20 70 72 65 6d 61  chain ends prema
27660 74 75 72 65 6c 79 20 2a 2f 0a 20 20 7d 0a 20 20  turely */.  }.  
27670 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
27680 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66  .** Read part of
27690 20 74 68 65 20 70 61 79 6c 6f 61 64 20 66 6f 72   the payload for
276a0 20 74 68 65 20 72 6f 77 20 61 74 20 77 68 69 63   the row at whic
276b0 68 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43  h that cursor pC
276c0 75 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a  ur is currently.
276d0 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 22 61  ** pointing.  "a
276e0 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62  mt" bytes will b
276f0 65 20 74 72 61 6e 73 66 65 72 72 65 64 20 69 6e  e transferred in
27700 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20  to pBuf[].  The 
27710 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69  transfer.** begi
27720 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a  ns at "offset"..
27730 2a 2a 0a 2a 2a 20 70 43 75 72 20 63 61 6e 20 62  **.** pCur can b
27740 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 69  e pointing to ei
27750 74 68 65 72 20 61 20 74 61 62 6c 65 20 6f 72 20  ther a table or 
27760 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e  an index b-tree.
27770 0a 2a 2a 20 49 66 20 70 6f 69 6e 74 69 6e 67 20  .** If pointing 
27780 74 6f 20 61 20 74 61 62 6c 65 20 62 74 72 65 65  to a table btree
27790 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65  , then the conte
277a0 6e 74 20 73 65 63 74 69 6f 6e 20 69 73 20 72 65  nt section is re
277b0 61 64 2e 20 20 49 66 0a 2a 2a 20 70 43 75 72 20  ad.  If.** pCur 
277c0 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  is pointing to a
277d0 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 74  n index b-tree t
277e0 68 65 6e 20 74 68 65 20 6b 65 79 20 73 65 63 74  hen the key sect
277f0 69 6f 6e 20 69 73 20 72 65 61 64 2e 0a 2a 2a 0a  ion is read..**.
27800 2a 2a 20 46 6f 72 20 73 71 6c 69 74 65 33 42 74  ** For sqlite3Bt
27810 72 65 65 50 61 79 6c 6f 61 64 28 29 2c 20 74 68  reePayload(), th
27820 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e  e caller must en
27830 73 75 72 65 20 74 68 61 74 20 70 43 75 72 20 69  sure that pCur i
27840 73 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f  s pointing.** to
27850 20 61 20 76 61 6c 69 64 20 72 6f 77 20 69 6e 20   a valid row in 
27860 74 68 65 20 74 61 62 6c 65 2e 20 20 46 6f 72 20  the table.  For 
27870 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c  sqlite3BtreePayl
27880 6f 61 64 43 68 65 63 6b 65 64 28 29 2c 20 74 68  oadChecked(), th
27890 65 0a 2a 2a 20 63 75 72 73 6f 72 20 6d 69 67 68  e.** cursor migh
278a0 74 20 62 65 20 69 6e 76 61 6c 69 64 20 6f 72 20  t be invalid or 
278b0 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 62 65  might need to be
278c0 20 72 65 73 74 6f 72 65 64 20 62 65 66 6f 72 65   restored before
278d0 20 62 65 69 6e 67 20 72 65 61 64 2e 0a 2a 2a 0a   being read..**.
278e0 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
278f0 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
27900 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
27910 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
27920 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65  .** wrong.  An e
27930 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
27940 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22   if "offset+amt"
27950 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a   is larger than.
27960 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65  ** the available
27970 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74   payload..*/.int
27980 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
27990 6c 6f 61 64 28 42 74 43 75 72 73 6f 72 20 2a 70  load(BtCursor *p
279a0 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c  Cur, u32 offset,
279b0 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a   u32 amt, void *
279c0 70 42 75 66 29 7b 0a 20 20 61 73 73 65 72 74 28  pBuf){.  assert(
279d0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
279e0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
279f0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
27a00 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
27a10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
27a20 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70  r->iPage>=0 && p
27a30 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
27a40 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73  ->iPage] );.  as
27a50 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
27a60 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
27a70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
27a80 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20  ->iPage]->nCell 
27a90 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 63 63 65  );.  return acce
27aa0 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  ssPayload(pCur, 
27ab0 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e  offset, amt, (un
27ac0 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75  signed char*)pBu
27ad0 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  f, 0);.}../*.** 
27ae0 54 68 69 73 20 76 61 72 69 61 6e 74 20 6f 66 20  This variant of 
27af0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c  sqlite3BtreePayl
27b00 6f 61 64 28 29 20 77 6f 72 6b 73 20 65 76 65 6e  oad() works even
27b10 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 68   if the cursor h
27b20 61 73 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65  as not.** in the
27b30 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 73 74   CURSOR_VALID st
27b40 61 74 65 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79  ate.  It is only
27b50 20 75 73 65 64 20 62 79 20 74 68 65 20 73 71 6c   used by the sql
27b60 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 29  ite3_blob_read()
27b70 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  .** interface..*
27b80 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
27b90 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 73  _OMIT_INCRBLOB.s
27ba0 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
27bb0 4e 4c 49 4e 45 20 69 6e 74 20 61 63 63 65 73 73  NLINE int access
27bc0 50 61 79 6c 6f 61 64 43 68 65 63 6b 65 64 28 0a  PayloadChecked(.
27bd0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
27be0 2c 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c 0a  ,.  u32 offset,.
27bf0 20 20 75 33 32 20 61 6d 74 2c 0a 20 20 76 6f 69    u32 amt,.  voi
27c00 64 20 2a 70 42 75 66 0a 29 7b 0a 20 20 69 6e 74  d *pBuf.){.  int
27c10 20 72 63 3b 0a 20 20 69 66 20 28 20 70 43 75 72   rc;.  if ( pCur
27c20 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
27c30 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  _INVALID ){.    
27c40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42  return SQLITE_AB
27c50 4f 52 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ORT;.  }.  asser
27c60 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
27c70 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
27c80 20 72 63 20 3d 20 62 74 72 65 65 52 65 73 74 6f   rc = btreeResto
27c90 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
27ca0 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e  (pCur);.  return
27cb0 20 72 63 20 3f 20 72 63 20 3a 20 61 63 63 65 73   rc ? rc : acces
27cc0 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f  sPayload(pCur, o
27cd0 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66  ffset, amt, pBuf
27ce0 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  , 0);.}.int sqli
27cf0 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 43  te3BtreePayloadC
27d00 68 65 63 6b 65 64 28 42 74 43 75 72 73 6f 72 20  hecked(BtCursor 
27d10 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65  *pCur, u32 offse
27d20 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64  t, u32 amt, void
27d30 20 2a 70 42 75 66 29 7b 0a 20 20 69 66 28 20 70   *pBuf){.  if( p
27d40 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
27d50 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
27d60 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
27d70 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
27d80 29 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) );.    return 
27d90 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
27da0 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c  ur, offset, amt,
27db0 20 70 42 75 66 2c 20 30 29 3b 0a 20 20 7d 65 6c   pBuf, 0);.  }el
27dc0 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 61  se{.    return a
27dd0 63 63 65 73 73 50 61 79 6c 6f 61 64 43 68 65 63  ccessPayloadChec
27de0 6b 65 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74  ked(pCur, offset
27df0 2c 20 61 6d 74 2c 20 70 42 75 66 29 3b 0a 20 20  , amt, pBuf);.  
27e00 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  }.}.#endif /* SQ
27e10 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
27e20 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OB */../*.** Ret
27e30 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
27e40 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61   payload informa
27e50 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e  tion from the en
27e60 74 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a  try that the .**
27e70 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20   pCur cursor is 
27e80 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68  pointing to.  Th
27e90 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20  e pointer is to 
27ea0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
27eb0 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20 69  .** the key if i
27ec0 6e 64 65 78 20 62 74 72 65 65 73 20 28 70 50 61  ndex btrees (pPa
27ed0 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30 29 20 61  ge->intKey==0) a
27ee0 6e 64 20 69 73 20 74 68 65 20 64 61 74 61 20 66  nd is the data f
27ef0 6f 72 0a 2a 2a 20 74 61 62 6c 65 20 62 74 72 65  or.** table btre
27f00 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65  es (pPage->intKe
27f10 79 3d 3d 31 29 2e 20 54 68 65 20 6e 75 6d 62 65  y==1). The numbe
27f20 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76  r of bytes of av
27f30 61 69 6c 61 62 6c 65 0a 2a 2a 20 6b 65 79 2f 64  ailable.** key/d
27f40 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 69  ata is written i
27f50 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a  nto *pAmt.  If *
27f60 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68  pAmt==0, then th
27f70 65 20 76 61 6c 75 65 0a 2a 2a 20 72 65 74 75 72  e value.** retur
27f80 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  ned will not be 
27f90 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e  a valid pointer.
27fa0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
27fb0 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  ine is an optimi
27fc0 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63  zation.  It is c
27fd0 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e  ommon for the en
27fe0 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20  tire key.** and 
27ff0 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74  data to fit on t
28000 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e  he local page an
28010 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62  d for there to b
28020 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a  e no overflow.**
28030 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68   pages.  When th
28040 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72  at is so, this r
28050 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73  outine can be us
28060 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ed to access the
28070 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61  .** key and data
28080 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20   without making 
28090 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65 20  a copy.  If the 
280a0 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 20  key and/or data 
280b0 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f  spills.** onto o
280c0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74  verflow pages, t
280d0 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61  hen accessPayloa
280e0 64 28 29 20 6d 75 73 74 20 62 65 20 75 73 65 64  d() must be used
280f0 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a   to reassemble.*
28100 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61 20 61  * the key/data a
28110 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74 6f 20  nd copy it into 
28120 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62  a preallocated b
28130 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  uffer..**.** The
28140 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
28150 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  d by this routin
28160 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79  e looks directly
28170 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 64   into the cached
28180 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68 65 20  .** page of the 
28190 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 64  database.  The d
281a0 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e 67 65  ata might change
281b0 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e 65 78   or move the nex
281c0 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74  t time.** any bt
281d0 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73 20 63  ree routine is c
281e0 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  alled..*/.static
281f0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 66 65 74   const void *fet
28200 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43  chPayload(.  BtC
28210 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
28220 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e    /* Cursor poin
28230 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f  ting to entry to
28240 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
28250 75 33 32 20 2a 70 41 6d 74 20 20 20 20 20 20 20  u32 *pAmt       
28260 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
28270 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69  e number of avai
28280 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65 72 65  lable bytes here
28290 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 61 6d 74   */.){.  u32 amt
282a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
282b0 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 50 61  !=0 && pCur->iPa
282c0 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61  ge>=0 && pCur->a
282d0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
282e0 65 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e]);.  assert( p
282f0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
28300 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
28310 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
28320 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
28330 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
28340 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
28350 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
28360 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
28370 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
28380 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
28390 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
283a0 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20  ->iPage]->nCell 
283b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
283c0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3e 30 20  r->info.nSize>0 
283d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
283e0 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  r->info.pPayload
283f0 3e 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  >pCur->apPage[pC
28400 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44 61 74  ur->iPage]->aDat
28410 61 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  a || CORRUPT_DB 
28420 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
28430 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  r->info.pPayload
28440 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  <pCur->apPage[pC
28450 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44 61 74  ur->iPage]->aDat
28460 61 45 6e 64 20 7c 7c 43 4f 52 52 55 50 54 5f 44  aEnd ||CORRUPT_D
28470 42 29 3b 0a 20 20 61 6d 74 20 3d 20 28 69 6e 74  B);.  amt = (int
28480 29 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  )(pCur->apPage[p
28490 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44 61  Cur->iPage]->aDa
284a0 74 61 45 6e 64 20 2d 20 70 43 75 72 2d 3e 69 6e  taEnd - pCur->in
284b0 66 6f 2e 70 50 61 79 6c 6f 61 64 29 3b 0a 20 20  fo.pPayload);.  
284c0 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
284d0 4c 6f 63 61 6c 3c 61 6d 74 20 29 20 61 6d 74 20  Local<amt ) amt 
284e0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
284f0 63 61 6c 3b 0a 20 20 2a 70 41 6d 74 20 3d 20 61  cal;.  *pAmt = a
28500 6d 74 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f  mt;.  return (vo
28510 69 64 2a 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  id*)pCur->info.p
28520 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a  Payload;.}.../*.
28530 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74 72 79  ** For the entry
28540 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 75   that cursor pCu
28550 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72  r is point to, r
28560 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79  eturn as.** many
28570 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65   bytes of the ke
28580 79 20 6f 72 20 64 61 74 61 20 61 73 20 61 72 65  y or data as are
28590 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68   available on th
285a0 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65  e local.** b-tre
285b0 65 20 70 61 67 65 2e 20 20 57 72 69 74 65 20 74  e page.  Write t
285c0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61  he number of ava
285d0 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69 6e 74  ilable bytes int
285e0 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54  o *pAmt..**.** T
285f0 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
28600 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c  ned is ephemeral
28610 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20  .  The key/data 
28620 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62  may move.** or b
28630 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74  e destroyed on t
28640 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20  he next call to 
28650 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e  any Btree routin
28660 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  e,.** including 
28670 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72  calls from other
28680 20 74 68 72 65 61 64 73 20 61 67 61 69 6e 73 74   threads against
28690 20 74 68 65 20 73 61 6d 65 20 63 61 63 68 65 2e   the same cache.
286a0 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75 74  .** Hence, a mut
286b0 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72  ex on the BtShar
286c0 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c  ed should be hel
286d0 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69  d prior to calli
286e0 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  ng.** this routi
286f0 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20  ne..**.** These 
28700 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73 65 64  routines is used
28710 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20 61 63   to get quick ac
28720 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e 64 20  cess to key and 
28730 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63  data.** in the c
28740 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
28750 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   no overflow pag
28760 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a  es are used..*/.
28770 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69  const void *sqli
28780 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 46  te3BtreePayloadF
28790 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70  etch(BtCursor *p
287a0 43 75 72 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b  Cur, u32 *pAmt){
287b0 0a 20 20 72 65 74 75 72 6e 20 66 65 74 63 68 50  .  return fetchP
287c0 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d  ayload(pCur, pAm
287d0 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  t);.}.../*.** Mo
287e0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
287f0 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c  wn to a new chil
28800 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65 77  d page.  The new
28810 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69 73  Pgno argument is
28820 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d   the.** page num
28830 62 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ber of the child
28840 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f   page to move to
28850 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
28860 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51  ction returns SQ
28870 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20  LITE_CORRUPT if 
28880 74 68 65 20 70 61 67 65 2d 68 65 61 64 65 72 20  the page-header 
28890 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 0a 2a  flags field of.*
288a0 2a 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20  * the new child 
288b0 70 61 67 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61  page does not ma
288c0 74 63 68 20 74 68 65 20 66 6c 61 67 73 20 66 69  tch the flags fi
288d0 65 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e  eld of the paren
288e0 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e  t (i.e..** if an
288f0 20 69 6e 74 6b 65 79 20 70 61 67 65 20 61 70 70   intkey page app
28900 65 61 72 73 20 74 6f 20 62 65 20 74 68 65 20 70  ears to be the p
28910 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d 69  arent of a non-i
28920 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f 72 0a 2a  ntkey page, or.*
28930 2a 20 76 69 63 65 2d 76 65 72 73 61 29 2e 0a 2a  * vice-versa)..*
28940 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
28950 65 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f  eToChild(BtCurso
28960 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77  r *pCur, u32 new
28970 50 67 6e 6f 29 7b 0a 20 20 42 74 53 68 61 72 65  Pgno){.  BtShare
28980 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
28990 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  Bt;..  assert( c
289a0 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
289b0 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
289c0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
289d0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
289e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
289f0 72 2d 3e 69 50 61 67 65 3c 42 54 43 55 52 53 4f  r->iPage<BTCURSO
28a00 52 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a 20  R_MAX_DEPTH );. 
28a10 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
28a20 50 61 67 65 3e 3d 30 20 29 3b 0a 20 20 69 66 28  Page>=0 );.  if(
28a30 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 28 42   pCur->iPage>=(B
28a40 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54  TCURSOR_MAX_DEPT
28a50 48 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75  H-1) ){.    retu
28a60 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
28a70 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 43  T_BKPT;.  }.  pC
28a80 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
28a90 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46   0;.  pCur->curF
28aa0 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56  lags &= ~(BTCF_V
28ab0 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61  alidNKey|BTCF_Va
28ac0 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 70 43 75 72  lidOvfl);.  pCur
28ad0 2d 3e 69 50 61 67 65 2b 2b 3b 0a 20 20 70 43 75  ->iPage++;.  pCu
28ae0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
28af0 50 61 67 65 5d 20 3d 20 30 3b 0a 20 20 72 65 74  Page] = 0;.  ret
28b00 75 72 6e 20 67 65 74 41 6e 64 49 6e 69 74 50 61  urn getAndInitPa
28b10 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c  ge(pBt, newPgno,
28b20 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70   &pCur->apPage[p
28b30 43 75 72 2d 3e 69 50 61 67 65 5d 2c 0a 20 20 20  Cur->iPage],.   
28b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b50 20 20 20 20 20 70 43 75 72 2c 20 70 43 75 72 2d       pCur, pCur-
28b60 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73 29 3b  >curPagerFlags);
28b70 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
28b80 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61  E_DEBUG./*.** Pa
28b90 67 65 20 70 50 61 72 65 6e 74 20 69 73 20 61 6e  ge pParent is an
28ba0 20 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c   internal (non-l
28bb0 65 61 66 29 20 74 72 65 65 20 70 61 67 65 2e 20  eaf) tree page. 
28bc0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a  This function .*
28bd0 2a 20 61 73 73 65 72 74 73 20 74 68 61 74 20 70  * asserts that p
28be0 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c  age number iChil
28bf0 64 20 69 73 20 74 68 65 20 6c 65 66 74 2d 63 68  d is the left-ch
28c00 69 6c 64 20 69 66 20 74 68 65 20 69 49 64 78 27  ild if the iIdx'
28c10 74 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61  th.** cell in pa
28c20 67 65 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20  ge pParent. Or, 
28c30 69 66 20 69 49 64 78 20 69 73 20 65 71 75 61 6c  if iIdx is equal
28c40 20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   to the total nu
28c50 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73  mber of.** cells
28c60 20 69 6e 20 70 50 61 72 65 6e 74 2c 20 74 68 61   in pParent, tha
28c70 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43  t page number iC
28c80 68 69 6c 64 20 69 73 20 74 68 65 20 72 69 67 68  hild is the righ
28c90 74 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68  t-child of.** th
28ca0 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  e page..*/.stati
28cb0 63 20 76 6f 69 64 20 61 73 73 65 72 74 50 61 72  c void assertPar
28cc0 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61 67 65  entIndex(MemPage
28cd0 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74 20 69   *pParent, int i
28ce0 49 64 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64  Idx, Pgno iChild
28cf0 29 7b 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54  ){.  if( CORRUPT
28d00 5f 44 42 20 29 20 72 65 74 75 72 6e 3b 20 20 2f  _DB ) return;  /
28d10 2a 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73  * The conditions
28d20 20 74 65 73 74 65 64 20 62 65 6c 6f 77 20 6d 69   tested below mi
28d30 67 68 74 20 6e 6f 74 20 62 65 20 74 72 75 65 0a  ght not be true.
28d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d50 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69              ** i
28d60 6e 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  n a corrupt data
28d70 62 61 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  base */.  assert
28d80 28 20 69 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d  ( iIdx<=pParent-
28d90 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20  >nCell );.  if( 
28da0 69 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e  iIdx==pParent->n
28db0 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73 65  Cell ){.    asse
28dc0 72 74 28 20 67 65 74 34 62 79 74 65 28 26 70 50  rt( get4byte(&pP
28dd0 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61  arent->aData[pPa
28de0 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  rent->hdrOffset+
28df0 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20  8])==iChild );. 
28e00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
28e10 72 74 28 20 67 65 74 34 62 79 74 65 28 66 69 6e  rt( get4byte(fin
28e20 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69  dCell(pParent, i
28e30 49 64 78 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b  Idx))==iChild );
28e40 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20  .  }.}.#else.#  
28e50 64 65 66 69 6e 65 20 61 73 73 65 72 74 50 61 72  define assertPar
28e60 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20  entIndex(x,y,z) 
28e70 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
28e80 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 75  ove the cursor u
28e90 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  p to the parent 
28ea0 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72  page..**.** pCur
28eb0 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20  ->idx is set to 
28ec0 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74  the cell index t
28ed0 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
28ee0 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
28ef0 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20 63  he page we are c
28f00 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20  oming from.  If 
28f10 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72  we are coming fr
28f20 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d  om the.** right-
28f30 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65 20  most child page 
28f40 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69  then pCur->idx i
28f50 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72  s set to one mor
28f60 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61  e than.** the la
28f70 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78  rgest cell index
28f80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
28f90 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74   moveToParent(Bt
28fa0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
28fb0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
28fc0 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
28fd0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
28fe0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
28ff0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
29000 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
29010 67 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ge>0 );.  assert
29020 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
29030 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20  Cur->iPage] );. 
29040 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64   assertParentInd
29050 65 78 28 0a 20 20 20 20 70 43 75 72 2d 3e 61 70  ex(.    pCur->ap
29060 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
29070 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e  -1], .    pCur->
29080 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
29090 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d  e-1], .    pCur-
290a0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
290b0 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a  age]->pgno.  );.
290c0 20 20 74 65 73 74 63 61 73 65 28 20 70 43 75 72    testcase( pCur
290d0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
290e0 61 67 65 2d 31 5d 20 3e 20 70 43 75 72 2d 3e 61  age-1] > pCur->a
290f0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
29100 65 2d 31 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  e-1]->nCell );. 
29110 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
29120 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63  e = 0;.  pCur->c
29130 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43  urFlags &= ~(BTC
29140 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46  F_ValidNKey|BTCF
29150 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 72  _ValidOvfl);.  r
29160 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c  eleasePageNotNul
29170 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  l(pCur->apPage[p
29180 43 75 72 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a  Cur->iPage--]);.
29190 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
291a0 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e  e cursor to poin
291b0 74 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61  t to the root pa
291c0 67 65 20 6f 66 20 69 74 73 20 62 2d 74 72 65 65  ge of its b-tree
291d0 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a   structure..**.*
291e0 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 68  * If the table h
291f0 61 73 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f  as a virtual roo
29200 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  t page, then the
29210 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64   cursor is moved
29220 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20   to point.** to 
29230 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  the virtual root
29240 20 70 61 67 65 20 69 6e 73 74 65 61 64 20 6f 66   page instead of
29250 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74   the actual root
29260 20 70 61 67 65 2e 20 41 20 74 61 62 6c 65 20 68   page. A table h
29270 61 73 20 61 0a 2a 2a 20 76 69 72 74 75 61 6c 20  as a.** virtual 
29280 72 6f 6f 74 20 70 61 67 65 20 77 68 65 6e 20 74  root page when t
29290 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70  he actual root p
292a0 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  age contains no 
292b0 63 65 6c 6c 73 20 61 6e 64 20 61 20 0a 2a 2a 20  cells and a .** 
292c0 73 69 6e 67 6c 65 20 63 68 69 6c 64 20 70 61 67  single child pag
292d0 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79  e. This can only
292e0 20 68 61 70 70 65 6e 20 77 69 74 68 20 74 68 65   happen with the
292f0 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 61 74   table rooted at
29300 20 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49   page 1..**.** I
29310 66 20 74 68 65 20 62 2d 74 72 65 65 20 73 74 72  f the b-tree str
29320 75 63 74 75 72 65 20 69 73 20 65 6d 70 74 79 2c  ucture is empty,
29330 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74   the cursor stat
29340 65 20 69 73 20 73 65 74 20 74 6f 20 0a 2a 2a 20  e is set to .** 
29350 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 2e 20  CURSOR_INVALID. 
29360 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 63  Otherwise, the c
29370 75 72 73 6f 72 20 69 73 20 73 65 74 20 74 6f 20  ursor is set to 
29380 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72  point to the fir
29390 73 74 0a 2a 2a 20 63 65 6c 6c 20 6c 6f 63 61 74  st.** cell locat
293a0 65 64 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 28  ed on the root (
293b0 6f 72 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 29  or virtual root)
293c0 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 63 75   page and the cu
293d0 72 73 6f 72 20 73 74 61 74 65 0a 2a 2a 20 69 73  rsor state.** is
293e0 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 56   set to CURSOR_V
293f0 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ALID..**.** If t
29400 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
29410 75 72 6e 73 20 73 75 63 63 65 73 73 66 75 6c 6c  urns successfull
29420 79 2c 20 69 74 20 6d 61 79 20 62 65 20 61 73 73  y, it may be ass
29430 75 6d 65 64 20 74 68 61 74 20 74 68 65 0a 2a 2a  umed that the.**
29440 20 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61   page-header fla
29450 67 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  gs indicate that
29460 20 74 68 65 20 5b 76 69 72 74 75 61 6c 5d 20 72   the [virtual] r
29470 6f 6f 74 2d 70 61 67 65 20 69 73 20 74 68 65 20  oot-page is the 
29480 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 6b 69 6e  expected .** kin
29490 64 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65  d of b-tree page
294a0 20 28 69 2e 65 2e 20 69 66 20 77 68 65 6e 20 6f   (i.e. if when o
294b0 70 65 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f  pening the curso
294c0 72 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64  r the caller did
294d0 20 6e 6f 74 0a 2a 2a 20 73 70 65 63 69 66 79 20   not.** specify 
294e0 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  a KeyInfo struct
294f0 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62 79  ure the flags by
29500 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78 30  te is set to 0x0
29510 35 20 6f 72 20 30 78 30 44 2c 0a 2a 2a 20 69 6e  5 or 0x0D,.** in
29520 64 69 63 61 74 69 6e 67 20 61 20 74 61 62 6c 65  dicating a table
29530 20 62 2d 74 72 65 65 2c 20 6f 72 20 69 66 20 74   b-tree, or if t
29540 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20 73 70  he caller did sp
29550 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20  ecify a KeyInfo 
29560 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74 68  .** structure th
29570 65 20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20  e flags byte is 
29580 73 65 74 20 74 6f 20 30 78 30 32 20 6f 72 20 30  set to 0x02 or 0
29590 78 30 41 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  x0A, indicating 
295a0 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 62 2d 74 72  an index.** b-tr
295b0 65 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ee)..*/.static i
295c0 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74  nt moveToRoot(Bt
295d0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
295e0 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b   MemPage *pRoot;
295f0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
29600 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
29610 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
29620 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
29630 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 49  assert( CURSOR_I
29640 4e 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f  NVALID < CURSOR_
29650 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
29660 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
29670 56 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f 52  VALID   < CURSOR
29680 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
29690 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
296a0 5f 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53 4f  _FAULT   > CURSO
296b0 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
296c0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
296d0 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate>=CURSOR_REQU
296e0 49 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 69  IRESEEK ){.    i
296f0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
29700 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b  =CURSOR_FAULT ){
29710 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
29720 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 53  Cur->skipNext!=S
29730 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
29740 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73    return pCur->s
29750 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  kipNext;.    }. 
29760 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
29770 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29  learCursor(pCur)
29780 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 43 75  ;.  }..  if( pCu
29790 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20  r->iPage>=0 ){. 
297a0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61     if( pCur->iPa
297b0 67 65 20 29 7b 0a 20 20 20 20 20 20 64 6f 7b 0a  ge ){.      do{.
297c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
297d0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
297e0 72 2d 3e 69 50 61 67 65 5d 21 3d 30 20 29 3b 0a  r->iPage]!=0 );.
297f0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
29800 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d  ageNotNull(pCur-
29810 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
29820 61 67 65 2d 2d 5d 29 3b 0a 20 20 20 20 20 20 7d  age--]);.      }
29830 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 50 61  while( pCur->iPa
29840 67 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ge);.      goto 
29850 73 6b 69 70 5f 69 6e 69 74 3b 0a 20 20 20 20 7d  skip_init;.    }
29860 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 75  .  }else if( pCu
29870 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 29  r->pgnoRoot==0 )
29880 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  {.    pCur->eSta
29890 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
298a0 4c 49 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  LID;.    return 
298b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
298c0 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
298d0 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 28 2d 31  pCur->iPage==(-1
298e0 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 67 65  ) );.    rc = ge
298f0 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 43 75  tAndInitPage(pCu
29900 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 2c 20  r->pBtree->pBt, 
29910 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
29920 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d  &pCur->apPage[0]
29930 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
29940 20 20 20 20 20 20 20 20 20 20 30 2c 20 70 43 75            0, pCu
29950 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73  r->curPagerFlags
29960 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
29970 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
29980 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
29990 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
299a0 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  .       return r
299b0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75  c;.    }.    pCu
299c0 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20 20  r->iPage = 0;.  
299d0 20 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65    pCur->curIntKe
299e0 79 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  y = pCur->apPage
299f0 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3b 0a 20 20 7d  [0]->intKey;.  }
29a00 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d  .  pRoot = pCur-
29a10 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 61 73  >apPage[0];.  as
29a20 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e  sert( pRoot->pgn
29a30 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  o==pCur->pgnoRoo
29a40 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 43  t );..  /* If pC
29a50 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 69 73 20  ur->pKeyInfo is 
29a60 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74  not NULL, then t
29a70 68 65 20 63 61 6c 6c 65 72 20 74 68 61 74 20 6f  he caller that o
29a80 70 65 6e 65 64 20 74 68 69 73 20 63 75 72 73 6f  pened this curso
29a90 72 0a 20 20 2a 2a 20 65 78 70 65 63 74 65 64 20  r.  ** expected 
29aa0 74 6f 20 6f 70 65 6e 20 69 74 20 6f 6e 20 61 6e  to open it on an
29ab0 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 20 4f   index b-tree. O
29ac0 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 4b 65  therwise, if pKe
29ad0 79 49 6e 66 6f 20 69 73 0a 20 20 2a 2a 20 4e 55  yInfo is.  ** NU
29ae0 4c 4c 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 65  LL, the caller e
29af0 78 70 65 63 74 73 20 61 20 74 61 62 6c 65 20 62  xpects a table b
29b00 2d 74 72 65 65 2e 20 49 66 20 74 68 69 73 20 69  -tree. If this i
29b10 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2c 0a  s not the case,.
29b20 20 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53    ** return an S
29b30 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72  QLITE_CORRUPT er
29b40 72 6f 72 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ror. .  **.  ** 
29b50 45 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73  Earlier versions
29b60 20 6f 66 20 53 51 4c 69 74 65 20 61 73 73 75 6d   of SQLite assum
29b70 65 64 20 74 68 61 74 20 74 68 69 73 20 74 65 73  ed that this tes
29b80 74 20 63 6f 75 6c 64 20 6e 6f 74 20 66 61 69 6c  t could not fail
29b90 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 72 6f 6f  .  ** if the roo
29ba0 74 20 70 61 67 65 20 77 61 73 20 61 6c 72 65 61  t page was alrea
29bb0 64 79 20 6c 6f 61 64 65 64 20 77 68 65 6e 20 74  dy loaded when t
29bc0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73  his function was
29bd0 20 63 61 6c 6c 65 64 20 28 69 2e 65 2e 0a 20 20   called (i.e..  
29be0 2a 2a 20 69 66 20 70 43 75 72 2d 3e 69 50 61 67  ** if pCur->iPag
29bf0 65 3e 3d 30 29 2e 20 42 75 74 20 74 68 69 73 20  e>=0). But this 
29c00 69 73 20 6e 6f 74 20 73 6f 20 69 66 20 74 68 65  is not so if the
29c10 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6f 72   database is cor
29c20 72 75 70 74 65 64 20 0a 20 20 2a 2a 20 69 6e 20  rupted .  ** in 
29c30 73 75 63 68 20 61 20 77 61 79 20 74 68 61 74 20  such a way that 
29c40 70 61 67 65 20 70 52 6f 6f 74 20 69 73 20 6c 69  page pRoot is li
29c50 6e 6b 65 64 20 69 6e 74 6f 20 61 20 73 65 63 6f  nked into a seco
29c60 6e 64 20 62 2d 74 72 65 65 20 74 61 62 6c 65 20  nd b-tree table 
29c70 0a 20 20 2a 2a 20 28 6f 72 20 74 68 65 20 66 72  .  ** (or the fr
29c80 65 65 6c 69 73 74 29 2e 20 20 2a 2f 0a 20 20 61  eelist).  */.  a
29c90 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69 6e  ssert( pRoot->in
29ca0 74 4b 65 79 3d 3d 31 20 7c 7c 20 70 52 6f 6f 74  tKey==1 || pRoot
29cb0 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20  ->intKey==0 );. 
29cc0 20 69 66 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e   if( pRoot->isIn
29cd0 69 74 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e  it==0 || (pCur->
29ce0 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 21 3d 70 52  pKeyInfo==0)!=pR
29cf0 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  oot->intKey ){. 
29d00 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
29d10 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
29d20 20 7d 0a 0a 73 6b 69 70 5f 69 6e 69 74 3a 20 20   }..skip_init:  
29d30 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 30  .  pCur->aiIdx[0
29d40 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69  ] = 0;.  pCur->i
29d50 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
29d60 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
29d70 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61 73 74  &= ~(BTCF_AtLast
29d80 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c  |BTCF_ValidNKey|
29d90 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b  BTCF_ValidOvfl);
29da0 0a 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72  ..  pRoot = pCur
29db0 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 69  ->apPage[0];.  i
29dc0 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e  f( pRoot->nCell>
29dd0 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65  0 ){.    pCur->e
29de0 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56  State = CURSOR_V
29df0 41 4c 49 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ALID;.  }else if
29e00 28 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29  ( !pRoot->leaf )
29e10 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70 61  {.    Pgno subpa
29e20 67 65 3b 0a 20 20 20 20 69 66 28 20 70 52 6f 6f  ge;.    if( pRoo
29e30 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72 65 74  t->pgno!=1 ) ret
29e40 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
29e50 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 73 75 62  PT_BKPT;.    sub
29e60 70 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  page = get4byte(
29e70 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52  &pRoot->aData[pR
29e80 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  oot->hdrOffset+8
29e90 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53  ]);.    pCur->eS
29ea0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41  tate = CURSOR_VA
29eb0 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  LID;.    rc = mo
29ec0 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
29ed0 73 75 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73  subpage);.  }els
29ee0 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  e{.    pCur->eSt
29ef0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
29f00 41 4c 49 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ALID;.  }.  retu
29f10 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
29f20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
29f30 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74  down to the left
29f40 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79  -most leaf entry
29f50 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20   beneath the.** 
29f60 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 69  entry to which i
29f70 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
29f80 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  ointing..**.** T
29f90 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61  he left-most lea
29fa0 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74  f is the one wit
29fb0 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b  h the smallest k
29fc0 65 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a  ey - the first.*
29fd0 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  * in ascending o
29fe0 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
29ff0 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  int moveToLeftmo
2a000 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
2a010 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  r){.  Pgno pgno;
2a020 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2a030 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65  TE_OK;.  MemPage
2a040 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
2a050 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
2a060 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
2a070 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2a080 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
2a090 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28  ALID );.  while(
2a0a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2a0b0 26 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72  & !(pPage = pCur
2a0c0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2a0d0 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a  Page])->leaf ){.
2a0e0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2a0f0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2a100 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  age]<pPage->nCel
2a110 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20  l );.    pgno = 
2a120 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
2a130 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 61  l(pPage, pCur->a
2a140 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2a150 5d 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  ]));.    rc = mo
2a160 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
2a170 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pgno);.  }.  ret
2a180 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2a190 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
2a1a0 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67   down to the rig
2a1b0 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74  ht-most leaf ent
2a1c0 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a  ry beneath the.*
2a1d0 2a 20 70 61 67 65 20 74 6f 20 77 68 69 63 68 20  * page to which 
2a1e0 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  it is currently 
2a1f0 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63  pointing.  Notic
2a200 65 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65  e the difference
2a210 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65  .** between move
2a220 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64  ToLeftmost() and
2a230 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
2a240 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  ().  moveToLeftm
2a250 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74  ost().** finds t
2a260 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74  he left-most ent
2a270 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a  ry beneath the *
2a280 65 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d  entry* whereas m
2a290 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29  oveToRightmost()
2a2a0 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69  .** finds the ri
2a2b0 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62  ght-most entry b
2a2c0 65 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67 65  eneath the *page
2a2d0 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67  *..**.** The rig
2a2e0 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73  ht-most entry is
2a2f0 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68   the one with th
2a300 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20  e largest key - 
2a310 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20  the last.** key 
2a320 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
2a330 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
2a340 74 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  t moveToRightmos
2a350 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
2a360 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  ){.  Pgno pgno;.
2a370 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2a380 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20  E_OK;.  MemPage 
2a390 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61  *pPage = 0;..  a
2a3a0 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
2a3b0 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
2a3c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2a3d0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2a3e0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69  R_VALID );.  whi
2a3f0 6c 65 28 20 21 28 70 50 61 67 65 20 3d 20 70 43  le( !(pPage = pC
2a400 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2a410 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29  >iPage])->leaf )
2a420 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74  {.    pgno = get
2a430 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
2a440 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
2a450 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43  fset+8]);.    pC
2a460 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2a470 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e  iPage] = pPage->
2a480 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20  nCell;.    rc = 
2a490 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
2a4a0 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28  , pgno);.    if(
2a4b0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2a4c0 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 69 49  .  }.  pCur->aiI
2a4d0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
2a4e0 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31  = pPage->nCell-1
2a4f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2a500 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
2a510 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 43  );.  assert( (pC
2a520 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
2a530 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3d 3d  TCF_ValidNKey)==
2a540 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  0 );.  return SQ
2a550 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d  LITE_OK;.}../* M
2a560 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
2a570 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  o the first entr
2a580 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  y in the table. 
2a590 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
2a5a0 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e  K.** on success.
2a5b0 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30    Set *pRes to 0
2a5c0 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61   if the cursor a
2a5d0 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74  ctually points t
2a5e0 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f  o something.** o
2a5f0 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31  r set *pRes to 1
2a600 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
2a610 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
2a620 71 6c 69 74 65 33 42 74 72 65 65 46 69 72 73 74  qlite3BtreeFirst
2a630 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
2a640 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
2a650 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
2a660 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
2a670 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
2a680 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2a690 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
2a6a0 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
2a6b0 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f  ex) );.  rc = mo
2a6c0 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
2a6d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2a6e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
2a6f0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2a700 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
2a710 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
2a720 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c  r->pgnoRoot==0 |
2a730 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  | pCur->apPage[p
2a740 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
2a750 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a  ll==0 );.      *
2a760 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65  pRes = 1;.    }e
2a770 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
2a780 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
2a790 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
2a7a0 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 2a  ell>0 );.      *
2a7b0 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
2a7c0 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  rc = moveToLeftm
2a7d0 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d  ost(pCur);.    }
2a7e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2a7f0 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
2a800 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c   cursor to the l
2a810 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
2a820 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
2a830 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
2a840 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70  success.  Set *p
2a850 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20  Res to 0 if the 
2a860 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20  cursor actually 
2a870 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68  points to someth
2a880 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70  ing.** or set *p
2a890 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20  Res to 1 if the 
2a8a0 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
2a8b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
2a8c0 72 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72  reeLast(BtCursor
2a8d0 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
2a8e0 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a  s){.  int rc;. .
2a8f0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2a900 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
2a910 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2a920 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2a930 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
2a940 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  >db->mutex) );..
2a950 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73    /* If the curs
2a960 6f 72 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  or already point
2a970 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  s to the last en
2a980 74 72 79 2c 20 74 68 69 73 20 69 73 20 61 20 6e  try, this is a n
2a990 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43  o-op. */.  if( C
2a9a0 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75  URSOR_VALID==pCu
2a9b0 72 2d 3e 65 53 74 61 74 65 20 26 26 20 28 70 43  r->eState && (pC
2a9c0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
2a9d0 54 43 46 5f 41 74 4c 61 73 74 29 21 3d 30 20 29  TCF_AtLast)!=0 )
2a9e0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
2a9f0 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 69  DEBUG.    /* Thi
2aa00 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 74  s block serves t
2aa10 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74 20  o assert() that 
2aa20 74 68 65 20 63 75 72 73 6f 72 20 72 65 61 6c 6c  the cursor reall
2aa30 79 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20  y does point .  
2aa40 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73 74    ** to the last
2aa50 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 62 2d   entry in the b-
2aa60 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  tree. */.    int
2aa70 20 69 69 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d   ii;.    for(ii=
2aa80 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50 61 67  0; ii<pCur->iPag
2aa90 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  e; ii++){.      
2aaa0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
2aab0 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61  Idx[ii]==pCur->a
2aac0 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c  pPage[ii]->nCell
2aad0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73   );.    }.    as
2aae0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
2aaf0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d  x[pCur->iPage]==
2ab00 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2ab10 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
2ab20 2d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  -1 );.    assert
2ab30 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
2ab40 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61  Cur->iPage]->lea
2ab50 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  f );.#endif.    
2ab60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2ab70 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f  ;.  }..  rc = mo
2ab80 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
2ab90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2aba0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 43  _OK ){.    if( C
2abb0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
2abc0 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
2abd0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
2abe0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c  r->pgnoRoot==0 |
2abf0 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  | pCur->apPage[p
2ac00 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
2ac10 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a  ll==0 );.      *
2ac20 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65  pRes = 1;.    }e
2ac30 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
2ac40 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
2ac50 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
2ac60 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30  .      *pRes = 0
2ac70 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  ;.      rc = mov
2ac80 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75  eToRightmost(pCu
2ac90 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
2aca0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2acb0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72         pCur->cur
2acc0 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 41 74  Flags |= BTCF_At
2acd0 4c 61 73 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Last;.      }els
2ace0 65 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  e{.        pCur-
2acf0 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54  >curFlags &= ~BT
2ad00 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20 20  CF_AtLast;.     
2ad10 20 7d 0a 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d   }.   .    }.  }
2ad20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2ad30 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  ./* Move the cur
2ad40 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20 70  sor so that it p
2ad50 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72  oints to an entr
2ad60 79 20 6e 65 61 72 20 74 68 65 20 6b 65 79 20 0a  y near the key .
2ad70 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ** specified by 
2ad80 70 49 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65  pIdxKey or intKe
2ad90 79 2e 20 20 20 52 65 74 75 72 6e 20 61 20 73 75  y.   Return a su
2ada0 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  ccess code..**.*
2adb0 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61 62  * For INTKEY tab
2adc0 6c 65 73 2c 20 74 68 65 20 69 6e 74 4b 65 79 20  les, the intKey 
2add0 70 61 72 61 6d 65 74 65 72 20 69 73 20 75 73 65  parameter is use
2ade0 64 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20  d.  pIdxKey .** 
2adf0 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46  must be NULL.  F
2ae00 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c  or index tables,
2ae10 20 70 49 64 78 4b 65 79 20 69 73 20 75 73 65 64   pIdxKey is used
2ae20 20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69   and intKey.** i
2ae30 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a  s ignored..**.**
2ae40 20 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74   If an exact mat
2ae50 63 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c  ch is not found,
2ae60 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
2ae70 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65   is always.** le
2ae80 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
2ae90 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68   leaf page which
2aea0 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20   would hold the 
2aeb0 65 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77  entry if it.** w
2aec0 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68  ere present.  Th
2aed0 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70  e cursor might p
2aee0 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79  oint to an entry
2aef0 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62   that comes.** b
2af00 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74  efore or after t
2af10 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e  he key..**.** An
2af20 20 69 6e 74 65 67 65 72 20 69 73 20 77 72 69 74   integer is writ
2af30 74 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20 77  ten into *pRes w
2af40 68 69 63 68 20 69 73 20 74 68 65 20 72 65 73 75  hich is the resu
2af50 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69  lt of.** compari
2af60 6e 67 20 74 68 65 20 6b 65 79 20 77 69 74 68 20  ng the key with 
2af70 74 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69  the entry to whi
2af80 63 68 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  ch the cursor is
2af90 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20   .** pointing.  
2afa0 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74  The meaning of t
2afb0 68 65 20 69 6e 74 65 67 65 72 20 77 72 69 74 74  he integer writt
2afc0 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73  en into.** *pRes
2afd0 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
2afe0 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c  **.**     *pRes<
2aff0 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  0      The curso
2b000 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
2b010 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
2b020 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
2b030 20 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c          is small
2b040 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70  er than intKey/p
2b050 49 64 78 4b 65 79 20 6f 72 20 69 66 20 74 68 65  IdxKey or if the
2b060 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a   table is empty.
2b070 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
2b080 20 20 20 20 61 6e 64 20 74 68 65 20 63 75 72 73      and the curs
2b090 6f 72 20 69 73 20 74 68 65 72 65 66 6f 72 65 20  or is therefore 
2b0a0 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f  left point to no
2b0b0 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  thing..**.**    
2b0c0 20 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68   *pRes==0     Th
2b0d0 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
2b0e0 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
2b0f0 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20  entry that.**   
2b100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
2b110 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 69  xactly matches i
2b120 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a  ntKey/pIdxKey..*
2b130 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30  *.**     *pRes>0
2b140 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72        The cursor
2b150 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
2b160 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  g at an entry th
2b170 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
2b180 20 20 20 20 20 20 20 69 73 20 6c 61 72 67 65 72         is larger
2b190 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64   than intKey/pId
2b1a0 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  xKey..**.** For 
2b1b0 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 74 68  index tables, th
2b1c0 65 20 70 49 64 78 4b 65 79 2d 3e 65 71 53 65 65  e pIdxKey->eqSee
2b1d0 6e 20 66 69 65 6c 64 20 69 73 20 73 65 74 20 74  n field is set t
2b1e0 6f 20 31 20 69 66 20 74 68 65 72 65 0a 2a 2a 20  o 1 if there.** 
2b1f0 65 78 69 73 74 73 20 61 6e 20 65 6e 74 72 79 20  exists an entry 
2b200 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  in the table tha
2b210 74 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65  t exactly matche
2b220 73 20 70 49 64 78 4b 65 79 2e 20 20 0a 2a 2f 0a  s pIdxKey.  .*/.
2b230 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2b240 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a  MovetoUnpacked(.
2b250 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
2b260 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
2b270 65 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d  e cursor to be m
2b280 6f 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  oved */.  Unpack
2b290 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65  edRecord *pIdxKe
2b2a0 79 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69  y, /* Unpacked i
2b2b0 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36  ndex key */.  i6
2b2c0 34 20 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20  4 intKey,       
2b2d0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
2b2e0 62 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  ble key */.  int
2b2f0 20 62 69 61 73 52 69 67 68 74 2c 20 20 20 20 20   biasRight,     
2b300 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65        /* If true
2b310 2c 20 62 69 61 73 20 74 68 65 20 73 65 61 72 63  , bias the searc
2b320 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e  h to the high en
2b330 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73  d */.  int *pRes
2b340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b350 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20  /* Write search 
2b360 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
2b370 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 52  ){.  int rc;.  R
2b380 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 78 52 65  ecordCompare xRe
2b390 63 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 0a 20 20  cordCompare;..  
2b3a0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
2b3b0 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
2b3c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
2b3d0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2b3e0 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
2b3f0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  b->mutex) );.  a
2b400 73 73 65 72 74 28 20 70 52 65 73 20 29 3b 0a 20  ssert( pRes );. 
2b410 20 61 73 73 65 72 74 28 20 28 70 49 64 78 4b 65   assert( (pIdxKe
2b420 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 70 4b  y==0)==(pCur->pK
2b430 65 79 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a 20 20  eyInfo==0) );.  
2b440 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
2b450 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
2b460 49 44 20 7c 7c 20 28 70 49 64 78 4b 65 79 3d 3d  ID || (pIdxKey==
2b470 30 29 3d 3d 28 70 43 75 72 2d 3e 63 75 72 49 6e  0)==(pCur->curIn
2b480 74 4b 65 79 21 3d 30 29 20 29 3b 0a 0a 20 20 2f  tKey!=0) );..  /
2b490 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20  * If the cursor 
2b4a0 69 73 20 61 6c 72 65 61 64 79 20 70 6f 73 69 74  is already posit
2b4b0 69 6f 6e 65 64 20 61 74 20 74 68 65 20 70 6f 69  ioned at the poi
2b4c0 6e 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  nt we are trying
2b4d0 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f  .  ** to move to
2b4e0 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75  , then just retu
2b4f0 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  rn without doing
2b500 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69   any work */.  i
2b510 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 0a 20 20  f( pIdxKey==0.  
2b520 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
2b530 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 26  ==CURSOR_VALID &
2b540 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  & (pCur->curFlag
2b550 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b  s & BTCF_ValidNK
2b560 65 79 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20  ey)!=0.  ){.    
2b570 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
2b580 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20  Key==intKey ){. 
2b590 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
2b5a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2b5b0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
2b5c0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
2b5d0 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a  .nKey<intKey ){.
2b5e0 20 20 20 20 20 20 69 66 28 20 28 70 43 75 72 2d        if( (pCur-
2b5f0 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
2b600 5f 41 74 4c 61 73 74 29 21 3d 30 20 29 7b 0a 20  _AtLast)!=0 ){. 
2b610 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d         *pRes = -
2b620 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  1;.        retur
2b630 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
2b640 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 49 66     }.      /* If
2b650 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6b   the requested k
2b660 65 79 20 69 73 20 6f 6e 65 20 6d 6f 72 65 20 74  ey is one more t
2b670 68 61 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73  han the previous
2b680 20 6b 65 79 2c 20 74 68 65 6e 0a 20 20 20 20 20   key, then.     
2b690 20 2a 2a 20 74 72 79 20 74 6f 20 67 65 74 20 74   ** try to get t
2b6a0 68 65 72 65 20 75 73 69 6e 67 20 73 71 6c 69 74  here using sqlit
2b6b0 65 33 42 74 72 65 65 4e 65 78 74 28 29 20 72 61  e3BtreeNext() ra
2b6c0 74 68 65 72 20 74 68 61 6e 20 61 20 66 75 6c 6c  ther than a full
2b6d0 0a 20 20 20 20 20 20 2a 2a 20 62 69 6e 61 72 79  .      ** binary
2b6e0 20 73 65 61 72 63 68 2e 20 20 54 68 69 73 20 69   search.  This i
2b6f0 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
2b700 6e 20 6f 6e 6c 79 2e 20 20 54 68 65 20 63 6f 72  n only.  The cor
2b710 72 65 63 74 20 61 6e 73 77 65 72 0a 20 20 20 20  rect answer.    
2b720 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 6f 62    ** is still ob
2b730 74 61 69 6e 65 64 20 77 69 74 68 6f 75 74 20 74  tained without t
2b740 68 69 73 20 61 73 65 2c 20 6f 6e 6c 79 20 61 20  his ase, only a 
2b750 6c 69 74 74 6c 65 20 6d 6f 72 65 20 73 6c 6f 77  little more slow
2b760 65 6c 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ely */.      if(
2b770 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
2b780 2b 31 3d 3d 69 6e 74 4b 65 79 20 26 26 20 21 70  +1==intKey && !p
2b790 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b  Cur->skipNext ){
2b7a0 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d  .        *pRes =
2b7b0 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
2b7c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
2b7d0 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  t(pCur, pRes);. 
2b7e0 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20         if( rc ) 
2b7f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2b800 20 20 20 69 66 28 20 2a 70 52 65 73 3d 3d 30 20     if( *pRes==0 
2b810 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 65 74  ){.          get
2b820 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
2b830 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
2b840 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69  ur->info.nKey==i
2b850 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  ntKey ){.       
2b860 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2b870 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
2b880 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2b890 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
2b8a0 20 20 69 66 28 20 70 49 64 78 4b 65 79 20 29 7b    if( pIdxKey ){
2b8b0 0a 20 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70  .    xRecordComp
2b8c0 61 72 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  are = sqlite3Vdb
2b8d0 65 46 69 6e 64 43 6f 6d 70 61 72 65 28 70 49 64  eFindCompare(pId
2b8e0 78 4b 65 79 29 3b 0a 20 20 20 20 70 49 64 78 4b  xKey);.    pIdxK
2b8f0 65 79 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b  ey->errCode = 0;
2b900 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64  .    assert( pId
2b910 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63  xKey->default_rc
2b920 3d 3d 31 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  ==1 .         ||
2b930 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c   pIdxKey->defaul
2b940 74 5f 72 63 3d 3d 30 20 0a 20 20 20 20 20 20 20  t_rc==0 .       
2b950 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65    || pIdxKey->de
2b960 66 61 75 6c 74 5f 72 63 3d 3d 2d 31 0a 20 20 20  fault_rc==-1.   
2b970 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
2b980 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20   xRecordCompare 
2b990 3d 20 30 3b 20 2f 2a 20 41 6c 6c 20 6b 65 79 73  = 0; /* All keys
2b9a0 20 61 72 65 20 69 6e 74 65 67 65 72 73 20 2a 2f   are integers */
2b9b0 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76  .  }..  rc = mov
2b9c0 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
2b9d0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
2b9e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
2b9f0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67  assert( pCur->pg
2ba00 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75  noRoot==0 || pCu
2ba10 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2ba20 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65  iPage] );.  asse
2ba30 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  rt( pCur->pgnoRo
2ba40 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61  ot==0 || pCur->a
2ba50 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2ba60 65 5d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  e]->isInit );.  
2ba70 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
2ba80 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
2ba90 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 61 70  ALID || pCur->ap
2baa0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2bab0 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20  ]->nCell>0 );.  
2bac0 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
2bad0 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
2bae0 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   ){.    *pRes = 
2baf0 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  -1;.    assert( 
2bb00 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  pCur->pgnoRoot==
2bb10 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67  0 || pCur->apPag
2bb20 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
2bb30 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  nCell==0 );.    
2bb40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2bb50 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
2bb60 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d  pCur->apPage[0]-
2bb70 3e 69 6e 74 4b 65 79 3d 3d 70 43 75 72 2d 3e 63  >intKey==pCur->c
2bb80 75 72 49 6e 74 4b 65 79 20 29 3b 0a 20 20 61 73  urIntKey );.  as
2bb90 73 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72 49  sert( pCur->curI
2bba0 6e 74 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65 79  ntKey || pIdxKey
2bbb0 20 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20   );.  for(;;){. 
2bbc0 20 20 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 2c     int lwr, upr,
2bbd0 20 69 64 78 2c 20 63 3b 0a 20 20 20 20 50 67 6e   idx, c;.    Pgn
2bbe0 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65  o chldPg;.    Me
2bbf0 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70  mPage *pPage = p
2bc00 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2bc10 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 75 38  ->iPage];.    u8
2bc20 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20   *pCell;        
2bc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bc40 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
2bc50 63 75 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20  current cell in 
2bc60 70 50 61 67 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a  pPage */..    /*
2bc70 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75   pPage->nCell mu
2bc80 73 74 20 62 65 20 67 72 65 61 74 65 72 20 74 68  st be greater th
2bc90 61 6e 20 7a 65 72 6f 2e 20 49 66 20 74 68 69 73  an zero. If this
2bca0 20 69 73 20 74 68 65 20 72 6f 6f 74 2d 70 61 67   is the root-pag
2bcb0 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72  e.    ** the cur
2bcc0 73 6f 72 20 77 6f 75 6c 64 20 68 61 76 65 20 62  sor would have b
2bcd0 65 65 6e 20 49 4e 56 41 4c 49 44 20 61 62 6f 76  een INVALID abov
2bce0 65 20 61 6e 64 20 74 68 69 73 20 66 6f 72 28 3b  e and this for(;
2bcf0 3b 29 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e  ;) loop.    ** n
2bd00 6f 74 20 72 75 6e 2e 20 49 66 20 74 68 69 73 20  ot run. If this 
2bd10 69 73 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d  is not the root-
2bd20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 6d  page, then the m
2bd30 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 72 6f 75  oveToChild() rou
2bd40 74 69 6e 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c  tine.    ** woul
2bd50 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64  d have already d
2bd60 65 74 65 63 74 65 64 20 64 62 20 63 6f 72 72 75  etected db corru
2bd70 70 74 69 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79  ption. Similarly
2bd80 2c 20 70 50 61 67 65 20 6d 75 73 74 0a 20 20 20  , pPage must.   
2bd90 20 2a 2a 20 62 65 20 74 68 65 20 72 69 67 68 74   ** be the right
2bda0 20 6b 69 6e 64 20 28 69 6e 64 65 78 20 6f 72 20   kind (index or 
2bdb0 74 61 62 6c 65 29 20 6f 66 20 62 2d 74 72 65 65  table) of b-tree
2bdc0 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65   page. Otherwise
2bdd0 0a 20 20 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f  .    ** a moveTo
2bde0 43 68 69 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54  Child() or moveT
2bdf0 6f 52 6f 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75  oRoot() call wou
2be00 6c 64 20 68 61 76 65 20 64 65 74 65 63 74 65 64  ld have detected
2be10 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f   corruption.  */
2be20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2be30 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20  ge->nCell>0 );. 
2be40 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2be50 2d 3e 69 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b  ->intKey==(pIdxK
2be60 65 79 3d 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77  ey==0) );.    lw
2be70 72 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d  r = 0;.    upr =
2be80 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b   pPage->nCell-1;
2be90 0a 20 20 20 20 61 73 73 65 72 74 28 20 62 69 61  .    assert( bia
2bea0 73 52 69 67 68 74 3d 3d 30 20 7c 7c 20 62 69 61  sRight==0 || bia
2beb0 73 52 69 67 68 74 3d 3d 31 20 29 3b 0a 20 20 20  sRight==1 );.   
2bec0 20 69 64 78 20 3d 20 75 70 72 3e 3e 28 31 2d 62   idx = upr>>(1-b
2bed0 69 61 73 52 69 67 68 74 29 3b 20 2f 2a 20 69 64  iasRight); /* id
2bee0 78 20 3d 20 62 69 61 73 52 69 67 68 74 20 3f 20  x = biasRight ? 
2bef0 75 70 72 20 3a 20 28 6c 77 72 2b 75 70 72 29 2f  upr : (lwr+upr)/
2bf00 32 3b 20 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e  2; */.    pCur->
2bf10 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2bf20 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20  e] = (u16)idx;. 
2bf30 20 20 20 69 66 28 20 78 52 65 63 6f 72 64 43 6f     if( xRecordCo
2bf40 6d 70 61 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20  mpare==0 ){.    
2bf50 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20    for(;;){.     
2bf60 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b     i64 nCellKey;
2bf70 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  .        pCell =
2bf80 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72   findCellPastPtr
2bf90 28 70 50 61 67 65 2c 20 69 64 78 29 3b 0a 20 20  (pPage, idx);.  
2bfa0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
2bfb0 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20  >intKeyLeaf ){. 
2bfc0 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
2bfd0 30 78 38 30 20 3c 3d 20 2a 28 70 43 65 6c 6c 2b  0x80 <= *(pCell+
2bfe0 2b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  +) ){.          
2bff0 20 20 69 66 28 20 70 43 65 6c 6c 3e 3d 70 50 61    if( pCell>=pPa
2c000 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 20 72  ge->aDataEnd ) r
2c010 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
2c020 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
2c030 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2c040 0a 20 20 20 20 20 20 20 20 67 65 74 56 61 72 69  .        getVari
2c050 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29  nt(pCell, (u64*)
2c060 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20  &nCellKey);.    
2c070 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79      if( nCellKey
2c080 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  <intKey ){.     
2c090 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31       lwr = idx+1
2c0a0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2c0b0 6c 77 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2d  lwr>upr ){ c = -
2c0c0 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20  1; break; }.    
2c0d0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43      }else if( nC
2c0e0 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29 7b  ellKey>intKey ){
2c0f0 0a 20 20 20 20 20 20 20 20 20 20 75 70 72 20 3d  .          upr =
2c100 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20   idx-1;.        
2c110 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b    if( lwr>upr ){
2c120 20 63 20 3d 20 2b 31 3b 20 62 72 65 61 6b 3b 20   c = +1; break; 
2c130 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
2c140 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2c150 74 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74  t( nCellKey==int
2c160 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Key );.         
2c170 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2c180 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36  r->iPage] = (u16
2c190 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20  )idx;.          
2c1a0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
2c1b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2c1c0 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20 20 20 20  lwr = idx;.     
2c1d0 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
2c1e0 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3b 0a 20  to_next_layer;. 
2c1f0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2c200 20 20 20 20 20 20 20 20 20 20 20 20 70 43 75 72              pCur
2c210 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54  ->curFlags |= BT
2c220 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20  CF_ValidNKey;.  
2c230 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
2c240 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c  info.nKey = nCel
2c250 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20  lKey;.          
2c260 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
2c270 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ze = 0;.        
2c280 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
2c290 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
2c2a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
2c2b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2c2c0 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
2c2d0 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b  t( lwr+upr>=0 );
2c2e0 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d 20 28  .        idx = (
2c2f0 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a  lwr+upr)>>1;  /*
2c300 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29   idx = (lwr+upr)
2c310 2f 32 3b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  /2; */.      }. 
2c320 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c330 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20  for(;;){.       
2c340 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 2f 2a 20   int nCell;  /* 
2c350 53 69 7a 65 20 6f 66 20 74 68 65 20 70 43 65 6c  Size of the pCel
2c360 6c 20 63 65 6c 6c 20 69 6e 20 62 79 74 65 73 20  l cell in bytes 
2c370 2a 2f 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c  */.        pCell
2c380 20 3d 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50   = findCellPastP
2c390 74 72 28 70 50 61 67 65 2c 20 69 64 78 29 3b 0a  tr(pPage, idx);.
2c3a0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
2c3b0 6d 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65  maximum supporte
2c3c0 64 20 70 61 67 65 2d 73 69 7a 65 20 69 73 20 36  d page-size is 6
2c3d0 35 35 33 36 20 62 79 74 65 73 2e 20 54 68 69 73  5536 bytes. This
2c3e0 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 20 20   means that.    
2c3f0 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d      ** the maxim
2c400 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 63  um number of rec
2c410 6f 72 64 20 62 79 74 65 73 20 73 74 6f 72 65 64  ord bytes stored
2c420 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d 54   on an index B-T
2c430 72 65 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  ree.        ** p
2c440 61 67 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e  age is less than
2c450 20 31 36 33 38 34 20 62 79 74 65 73 20 61 6e 64   16384 bytes and
2c460 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20 61   may be stored a
2c470 73 20 61 20 32 2d 62 79 74 65 0a 20 20 20 20 20  s a 2-byte.     
2c480 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68     ** varint. Th
2c490 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
2c4a0 73 20 75 73 65 64 20 74 6f 20 61 74 74 65 6d 70  s used to attemp
2c4b0 74 20 74 6f 20 61 76 6f 69 64 20 70 61 72 73 69  t to avoid parsi
2c4c0 6e 67 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ng .        ** t
2c4d0 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 62  he entire cell b
2c4e0 79 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 74  y checking for t
2c4f0 68 65 20 63 61 73 65 73 20 77 68 65 72 65 20 74  he cases where t
2c500 68 65 20 72 65 63 6f 72 64 20 69 73 20 0a 20 20  he record is .  
2c510 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20        ** stored 
2c520 65 6e 74 69 72 65 6c 79 20 77 69 74 68 69 6e 20  entirely within 
2c530 74 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20  the b-tree page 
2c540 62 79 20 69 6e 73 70 65 63 74 69 6e 67 20 74 68  by inspecting th
2c550 65 20 66 69 72 73 74 20 0a 20 20 20 20 20 20 20  e first .       
2c560 20 2a 2a 20 32 20 62 79 74 65 73 20 6f 66 20 74   ** 2 bytes of t
2c570 68 65 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20  he cell..       
2c580 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 43 65 6c   */.        nCel
2c590 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20  l = pCell[0];.  
2c5a0 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c        if( nCell<
2c5b0 3d 70 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65  =pPage->max1byte
2c5c0 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 20  Payload ){.     
2c5d0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
2c5e0 6e 63 68 20 72 75 6e 73 20 69 66 20 74 68 65 20  nch runs if the 
2c5f0 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c  record-size fiel
2c600 64 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 73  d of the cell is
2c610 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20   a.          ** 
2c620 73 69 6e 67 6c 65 20 62 79 74 65 20 76 61 72 69  single byte vari
2c630 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72  nt and the recor
2c640 64 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20  d fits entirely 
2c650 6f 6e 20 74 68 65 20 6d 61 69 6e 0a 20 20 20 20  on the main.    
2c660 20 20 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20        ** b-tree 
2c670 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  page.  */.      
2c680 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43      testcase( pC
2c690 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d 70 50 61  ell+nCell+1==pPa
2c6a0 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a  ge->aDataEnd );.
2c6b0 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52            c = xR
2c6c0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65  ecordCompare(nCe
2c6d0 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c  ll, (void*)&pCel
2c6e0 6c 5b 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a  l[1], pIdxKey);.
2c6f0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
2c700 28 20 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30  ( !(pCell[1] & 0
2c710 78 38 30 29 20 0a 20 20 20 20 20 20 20 20 20 20  x80) .          
2c720 26 26 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43  && (nCell = ((nC
2c730 65 6c 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b 20  ell&0x7f)<<7) + 
2c740 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65  pCell[1])<=pPage
2c750 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20  ->maxLocal.     
2c760 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
2c770 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 2d 73 69  /* The record-si
2c780 7a 65 20 66 69 65 6c 64 20 69 73 20 61 20 32 20  ze field is a 2 
2c790 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20  byte varint and 
2c7a0 74 68 65 20 72 65 63 6f 72 64 20 0a 20 20 20 20  the record .    
2c7b0 20 20 20 20 20 20 2a 2a 20 66 69 74 73 20 65 6e        ** fits en
2c7c0 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61  tirely on the ma
2c7d0 69 6e 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  in b-tree page. 
2c7e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65   */.          te
2c7f0 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43  stcase( pCell+nC
2c800 65 6c 6c 2b 32 3d 3d 70 50 61 67 65 2d 3e 61 44  ell+2==pPage->aD
2c810 61 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20  ataEnd );.      
2c820 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43      c = xRecordC
2c830 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76  ompare(nCell, (v
2c840 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20  oid*)&pCell[2], 
2c850 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20  pIdxKey);.      
2c860 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2c870 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64     /* The record
2c880 20 66 6c 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f   flows over onto
2c890 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65   one or more ove
2c8a0 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a  rflow pages. In.
2c8b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69            ** thi
2c8c0 73 20 63 61 73 65 20 74 68 65 20 77 68 6f 6c 65  s case the whole
2c8d0 20 63 65 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62   cell needs to b
2c8e0 65 20 70 61 72 73 65 64 2c 20 61 20 62 75 66 66  e parsed, a buff
2c8f0 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20  er allocated.   
2c900 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 61 63         ** and ac
2c910 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 75 73  cessPayload() us
2c920 65 64 20 74 6f 20 72 65 74 72 69 65 76 65 20 74  ed to retrieve t
2c930 68 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74  he record into t
2c940 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
2c950 62 75 66 66 65 72 20 62 65 66 6f 72 65 20 56 64  buffer before Vd
2c960 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
2c970 29 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e  ) can be called.
2c980 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20   .          **. 
2c990 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74           ** If t
2c9a0 68 65 20 72 65 63 6f 72 64 20 69 73 20 63 6f 72  he record is cor
2c9b0 72 75 70 74 2c 20 74 68 65 20 78 52 65 63 6f 72  rupt, the xRecor
2c9c0 64 43 6f 6d 70 61 72 65 20 72 6f 75 74 69 6e 65  dCompare routine
2c9d0 20 6d 61 79 20 72 65 61 64 0a 20 20 20 20 20 20   may read.      
2c9e0 20 20 20 20 2a 2a 20 75 70 20 74 6f 20 74 77 6f      ** up to two
2c9f0 20 76 61 72 69 6e 74 73 20 70 61 73 74 20 74 68   varints past th
2ca00 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62 75 66  e end of the buf
2ca10 66 65 72 2e 20 41 6e 20 65 78 74 72 61 20 31 38  fer. An extra 18
2ca20 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62   .          ** b
2ca30 79 74 65 73 20 6f 66 20 70 61 64 64 69 6e 67 20  ytes of padding 
2ca40 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 74 20  is allocated at 
2ca50 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62  the end of the b
2ca60 75 66 66 65 72 20 69 6e 0a 20 20 20 20 20 20 20  uffer in.       
2ca70 20 20 20 2a 2a 20 63 61 73 65 20 74 68 69 73 20     ** case this 
2ca80 68 61 70 70 65 6e 73 2e 20 20 2a 2f 0a 20 20 20  happens.  */.   
2ca90 20 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65         void *pCe
2caa0 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20  llKey;.         
2cab0 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c   u8 * const pCel
2cac0 6c 42 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20  lBody = pCell - 
2cad0 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
2cae0 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ize;.          p
2caf0 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
2cb00 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64  (pPage, pCellBod
2cb10 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b  y, &pCur->info);
2cb20 0a 20 20 20 20 20 20 20 20 20 20 6e 43 65 6c 6c  .          nCell
2cb30 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e   = (int)pCur->in
2cb40 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20  fo.nKey;.       
2cb50 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43 65     testcase( nCe
2cb60 6c 6c 3c 30 20 29 3b 20 20 20 2f 2a 20 54 72 75  ll<0 );   /* Tru
2cb70 65 20 69 66 20 6b 65 79 20 73 69 7a 65 20 69 73  e if key size is
2cb80 20 32 5e 33 32 20 6f 72 20 6d 6f 72 65 20 2a 2f   2^32 or more */
2cb90 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
2cba0 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 30 20 29 3b  ase( nCell==0 );
2cbb0 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79    /* Invalid key
2cbc0 20 73 69 7a 65 3a 20 20 30 78 38 30 20 30 78 38   size:  0x80 0x8
2cbd0 30 20 30 78 30 30 20 2a 2f 0a 20 20 20 20 20 20  0 0x00 */.      
2cbe0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43      testcase( nC
2cbf0 65 6c 6c 3d 3d 31 20 29 3b 20 20 2f 2a 20 49 6e  ell==1 );  /* In
2cc00 76 61 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a 20  valid key size: 
2cc10 20 30 78 38 30 20 30 78 38 30 20 30 78 30 31 20   0x80 0x80 0x01 
2cc20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  */.          tes
2cc30 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 32 20  tcase( nCell==2 
2cc40 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6c  );  /* Minimum l
2cc50 65 67 61 6c 20 69 6e 64 65 78 20 6b 65 79 20 73  egal index key s
2cc60 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ize */.         
2cc70 20 69 66 28 20 6e 43 65 6c 6c 3c 32 20 29 7b 0a   if( nCell<2 ){.
2cc80 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2cc90 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2cca0 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
2ccb0 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
2ccc0 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20  nish;.          
2ccd0 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43 65 6c  }.          pCel
2cce0 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61  lKey = sqlite3Ma
2ccf0 6c 6c 6f 63 28 20 6e 43 65 6c 6c 2b 31 38 20 29  lloc( nCell+18 )
2cd00 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2cd10 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20  pCellKey==0 ){. 
2cd20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2cd30 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
2cd40 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  T;.            g
2cd50 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
2cd60 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  h;.          }. 
2cd70 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61           pCur->a
2cd80 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2cd90 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20  ] = (u16)idx;.  
2cda0 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 63 63          rc = acc
2cdb0 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  essPayload(pCur,
2cdc0 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73 69   0, nCell, (unsi
2cdd0 67 6e 65 64 20 63 68 61 72 2a 29 70 43 65 6c 6c  gned char*)pCell
2cde0 4b 65 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Key, 0);.       
2cdf0 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
2ce00 73 20 26 3d 20 7e 42 54 43 46 5f 56 61 6c 69 64  s &= ~BTCF_Valid
2ce10 4f 76 66 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  Ovfl;.          
2ce20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
2ce30 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2ce40 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  ee(pCellKey);.  
2ce50 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
2ce60 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
2ce70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ce80 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43      c = xRecordC
2ce90 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70 43  ompare(nCell, pC
2cea0 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79 29  ellKey, pIdxKey)
2ceb0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
2cec0 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65  te3_free(pCellKe
2ced0 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  y);.        }.  
2cee0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 0a 20        assert( . 
2cef0 20 20 20 20 20 20 20 20 20 20 20 28 70 49 64 78             (pIdx
2cf00 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51  Key->errCode!=SQ
2cf10 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 7c 7c 20  LITE_CORRUPT || 
2cf20 63 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20 26  c==0).         &
2cf30 26 20 28 70 49 64 78 4b 65 79 2d 3e 65 72 72 43  & (pIdxKey->errC
2cf40 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  ode!=SQLITE_NOME
2cf50 4d 20 7c 7c 20 70 43 75 72 2d 3e 70 42 74 72 65  M || pCur->pBtre
2cf60 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
2cf70 6c 65 64 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  led).        );.
2cf80 20 20 20 20 20 20 20 20 69 66 28 20 63 3c 30 20          if( c<0 
2cf90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72  ){.          lwr
2cfa0 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20   = idx+1;.      
2cfb0 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3e 30 20    }else if( c>0 
2cfc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70 72  ){.          upr
2cfd0 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20   = idx-1;.      
2cfe0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2cff0 20 20 20 61 73 73 65 72 74 28 20 63 3d 3d 30 20     assert( c==0 
2d000 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 52  );.          *pR
2d010 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  es = 0;.        
2d020 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
2d030 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  ;.          pCur
2d040 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2d050 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b  age] = (u16)idx;
2d060 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2d070 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20  IdxKey->errCode 
2d080 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  ) rc = SQLITE_CO
2d090 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20  RRUPT;.         
2d0a0 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
2d0b0 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ish;.        }. 
2d0c0 20 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75         if( lwr>u
2d0d0 70 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  pr ) break;.    
2d0e0 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 2b      assert( lwr+
2d0f0 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  upr>=0 );.      
2d100 20 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72    idx = (lwr+upr
2d110 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20  )>>1;  /* idx = 
2d120 28 6c 77 72 2b 75 70 72 29 2f 32 20 2a 2f 0a 20  (lwr+upr)/2 */. 
2d130 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2d140 20 61 73 73 65 72 74 28 20 6c 77 72 3d 3d 75 70   assert( lwr==up
2d150 72 2b 31 20 7c 7c 20 28 70 50 61 67 65 2d 3e 69  r+1 || (pPage->i
2d160 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d  ntKey && !pPage-
2d170 3e 6c 65 61 66 29 20 29 3b 0a 20 20 20 20 61 73  >leaf) );.    as
2d180 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
2d190 6e 69 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70  nit );.    if( p
2d1a0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2d1b0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2d1c0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2d1d0 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67  age]<pCur->apPag
2d1e0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
2d1f0 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70  nCell );.      p
2d200 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2d210 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69  >iPage] = (u16)i
2d220 64 78 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20  dx;.      *pRes 
2d230 3d 20 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = c;.      rc = 
2d240 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2d250 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
2d260 69 73 68 3b 0a 20 20 20 20 7d 0a 6d 6f 76 65 74  ish;.    }.movet
2d270 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3a 0a 20 20  o_next_layer:.  
2d280 20 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67 65    if( lwr>=pPage
2d290 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ->nCell ){.     
2d2a0 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79   chldPg = get4by
2d2b0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
2d2c0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
2d2d0 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t+8]);.    }else
2d2e0 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d  {.      chldPg =
2d2f0 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65   get4byte(findCe
2d300 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72 29 29 3b  ll(pPage, lwr));
2d310 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d  .    }.    pCur-
2d320 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2d330 67 65 5d 20 3d 20 28 75 31 36 29 6c 77 72 3b 0a  ge] = (u16)lwr;.
2d340 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
2d350 68 69 6c 64 28 70 43 75 72 2c 20 63 68 6c 64 50  hild(pCur, chldP
2d360 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  g);.    if( rc )
2d370 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 6d 6f 76 65   break;.  }.move
2d380 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 70 43 75  to_finish:.  pCu
2d390 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
2d3a0 30 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 43  0;.  assert( (pC
2d3b0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
2d3c0 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d  TCF_ValidOvfl)==
2d3d0 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  0 );.  return rc
2d3e0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ;.}.../*.** Retu
2d3f0 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 63  rn TRUE if the c
2d400 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69  ursor is not poi
2d410 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
2d420 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a  y of the table..
2d430 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20  **.** TRUE will 
2d440 62 65 20 72 65 74 75 72 6e 65 64 20 61 66 74 65  be returned afte
2d450 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  r a call to sqli
2d460 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 20 6d  te3BtreeNext() m
2d470 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20 74 68 65  oves.** past the
2d480 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
2d490 68 65 20 74 61 62 6c 65 20 6f 72 20 73 71 6c 69  he table or sqli
2d4a0 74 65 33 42 74 72 65 65 50 72 65 76 28 29 20 6d  te3BtreePrev() m
2d4b0 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20 74 68 65  oves past.** the
2d4c0 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20 20 54   first entry.  T
2d4d0 52 55 45 20 69 73 20 61 6c 73 6f 20 72 65 74 75  RUE is also retu
2d4e0 72 6e 65 64 20 69 66 20 74 68 65 20 74 61 62 6c  rned if the tabl
2d4f0 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
2d500 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  nt sqlite3BtreeE
2d510 6f 66 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  of(BtCursor *pCu
2d520 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57  r){.  /* TODO: W
2d530 68 61 74 20 69 66 20 74 68 65 20 63 75 72 73 6f  hat if the curso
2d540 72 20 69 73 20 69 6e 20 43 55 52 53 4f 52 5f 52  r is in CURSOR_R
2d550 45 51 55 49 52 45 53 45 45 4b 20 62 75 74 20 61  EQUIRESEEK but a
2d560 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73  ll table entries
2d570 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20  .  ** have been 
2d580 64 65 6c 65 74 65 64 3f 20 54 68 69 73 20 41 50  deleted? This AP
2d590 49 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63  I will need to c
2d5a0 68 61 6e 67 65 20 74 6f 20 72 65 74 75 72 6e 20  hange to return 
2d5b0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20  an error code.  
2d5c0 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68  ** as well as th
2d5d0 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74  e boolean result
2d5e0 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72   value..  */.  r
2d5f0 65 74 75 72 6e 20 28 43 55 52 53 4f 52 5f 56 41  eturn (CURSOR_VA
2d600 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID!=pCur->eStat
2d610 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  e);.}../*.** Ret
2d620 75 72 6e 20 61 6e 20 65 73 74 69 6d 61 74 65 20  urn an estimate 
2d630 66 6f 72 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  for the number o
2d640 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  f rows in the ta
2d650 62 6c 65 20 74 68 61 74 20 70 43 75 72 20 69 73  ble that pCur is
2d660 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e  .** pointing to.
2d670 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74    Return a negat
2d680 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6e 6f  ive number if no
2d690 20 65 73 74 69 6d 61 74 65 20 69 73 20 63 75 72   estimate is cur
2d6a0 72 65 6e 74 6c 79 20 0a 2a 2a 20 61 76 61 69 6c  rently .** avail
2d6b0 61 62 6c 65 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c  able..*/.i64 sql
2d6c0 69 74 65 33 42 74 72 65 65 52 6f 77 43 6f 75 6e  ite3BtreeRowCoun
2d6d0 74 45 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  tEst(BtCursor *p
2d6e0 43 75 72 29 7b 0a 20 20 69 36 34 20 6e 3b 0a 20  Cur){.  i64 n;. 
2d6f0 20 75 38 20 69 3b 0a 0a 20 20 61 73 73 65 72 74   u8 i;..  assert
2d700 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
2d710 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
2d720 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2d730 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
2d740 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
2d750 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 75 72  ex) );..  /* Cur
2d760 72 65 6e 74 6c 79 20 74 68 69 73 20 69 6e 74 65  rently this inte
2d770 72 66 61 63 65 20 69 73 20 6f 6e 6c 79 20 63 61  rface is only ca
2d780 6c 6c 65 64 20 62 79 20 74 68 65 20 4f 50 5f 49  lled by the OP_I
2d790 66 53 6d 61 6c 6c 65 72 0a 20 20 2a 2a 20 6f 70  fSmaller.  ** op
2d7a0 63 6f 64 65 2c 20 61 6e 64 20 69 74 20 74 68 61  code, and it tha
2d7b0 74 20 63 61 73 65 20 74 68 65 20 63 75 72 73 6f  t case the curso
2d7c0 72 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65  r will always be
2d7d0 20 76 61 6c 69 64 20 61 6e 64 0a 20 20 2a 2a 20   valid and.  ** 
2d7e0 77 69 6c 6c 20 61 6c 77 61 79 73 20 70 6f 69 6e  will always poin
2d7f0 74 20 74 6f 20 61 20 6c 65 61 66 20 6e 6f 64 65  t to a leaf node
2d800 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52  . */.  if( NEVER
2d810 28 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43  (pCur->eState!=C
2d820 55 52 53 4f 52 5f 56 41 4c 49 44 29 20 29 20 72  URSOR_VALID) ) r
2d830 65 74 75 72 6e 20 2d 31 3b 0a 20 20 69 66 28 20  eturn -1;.  if( 
2d840 4e 45 56 45 52 28 70 43 75 72 2d 3e 61 70 50 61  NEVER(pCur->apPa
2d850 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2d860 3e 6c 65 61 66 3d 3d 30 29 20 29 20 72 65 74 75  >leaf==0) ) retu
2d870 72 6e 20 2d 31 3b 0a 0a 20 20 66 6f 72 28 6e 3d  rn -1;..  for(n=
2d880 31 2c 20 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d  1, i=0; i<=pCur-
2d890 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  >iPage; i++){.  
2d8a0 20 20 6e 20 2a 3d 20 70 43 75 72 2d 3e 61 70 50    n *= pCur->apP
2d8b0 61 67 65 5b 69 5d 2d 3e 6e 43 65 6c 6c 3b 0a 20  age[i]->nCell;. 
2d8c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d   }.  return n;.}
2d8d0 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ../*.** Advance 
2d8e0 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
2d8f0 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20  e next entry in 
2d900 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
2d910 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20  f.** successful 
2d920 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30  then set *pRes=0
2d930 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  .  If the cursor
2d940 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20  .** was already 
2d950 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
2d960 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
2d970 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  e database befor
2d980 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  e.** this routin
2d990 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68  e was called, th
2d9a0 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a  en set *pRes=1..
2d9b0 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65  **.** The main e
2d9c0 6e 74 72 79 20 70 6f 69 6e 74 20 69 73 20 73 71  ntry point is sq
2d9d0 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29  lite3BtreeNext()
2d9e0 2e 20 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20  .  That routine 
2d9f0 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20  is optimized.** 
2da00 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63  for the common c
2da10 61 73 65 20 6f 66 20 6d 65 72 65 6c 79 20 69 6e  ase of merely in
2da20 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63  crementing the c
2da30 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75  ell counter BtCu
2da40 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f  rsor.aiIdx.** to
2da50 20 74 68 65 20 6e 65 78 74 20 63 65 6c 6c 20 6f   the next cell o
2da60 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  n the current pa
2da70 67 65 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72  ge.  The (slower
2da80 29 20 62 74 72 65 65 4e 65 78 74 28 29 20 68 65  ) btreeNext() he
2da90 6c 70 65 72 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  lper.** routine 
2daa0 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69  is called when i
2dab0 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  t is necessary t
2dac0 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66  o move to a diff
2dad0 65 72 65 6e 74 20 70 61 67 65 20 6f 72 0a 2a 2a  erent page or.**
2dae0 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
2daf0 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  cursor..**.** Th
2db00 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
2db10 6f 6e 20 77 69 6c 6c 20 73 65 74 20 2a 70 52 65  on will set *pRe
2db20 73 20 74 6f 20 30 20 6f 72 20 31 2e 20 20 54 68  s to 0 or 1.  Th
2db30 65 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20  e initial *pRes 
2db40 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65  value.** will be
2db50 20 31 20 69 66 20 74 68 65 20 63 75 72 73 6f 72   1 if the cursor
2db60 20 62 65 69 6e 67 20 73 74 65 70 70 65 64 20 63   being stepped c
2db70 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e  orresponds to an
2db80 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 0a 2a   SQL index and.*
2db90 2a 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  * if this routin
2dba0 65 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65  e could have bee
2dbb0 6e 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 61  n skipped if tha
2dbc0 74 20 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20  t SQL index had 
2dbd0 62 65 65 6e 0a 2a 2a 20 61 20 75 6e 69 71 75 65  been.** a unique
2dbe0 20 69 6e 64 65 78 2e 20 20 4f 74 68 65 72 77 69   index.  Otherwi
2dbf0 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  se the caller wi
2dc00 6c 6c 20 68 61 76 65 20 73 65 74 20 2a 70 52 65  ll have set *pRe
2dc10 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65  s to zero..** Ze
2dc20 72 6f 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e  ro is the common
2dc30 20 63 61 73 65 2e 20 54 68 65 20 62 74 72 65 65   case. The btree
2dc40 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2dc50 69 73 20 66 72 65 65 20 74 6f 20 75 73 65 20 74  is free to use t
2dc60 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 2a 70  he.** initial *p
2dc70 52 65 73 20 76 61 6c 75 65 20 61 73 20 61 20 68  Res value as a h
2dc80 69 6e 74 20 74 6f 20 69 6d 70 72 6f 76 65 20 70  int to improve p
2dc90 65 72 66 6f 72 6d 61 6e 63 65 2c 20 62 75 74 20  erformance, but 
2dca0 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 53  the current.** S
2dcb0 51 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c  QLite btree impl
2dcc0 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20  ementation does 
2dcd0 6e 6f 74 2e 20 28 4e 6f 74 65 20 74 68 61 74 20  not. (Note that 
2dce0 74 68 65 20 63 6f 6d 64 62 32 20 62 74 72 65 65  the comdb2 btree
2dcf0 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  .** implementati
2dd00 6f 6e 20 64 6f 65 73 20 75 73 65 20 74 68 69 73  on does use this
2dd10 20 68 69 6e 74 2c 20 68 6f 77 65 76 65 72 2e 29   hint, however.)
2dd20 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
2dd30 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62  E_NOINLINE int b
2dd40 74 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f  treeNext(BtCurso
2dd50 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
2dd60 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  es){.  int rc;. 
2dd70 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50   int idx;.  MemP
2dd80 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
2dd90 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
2dda0 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
2ddb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2ddc0 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c  r->skipNext==0 |
2ddd0 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  | pCur->eState!=
2dde0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2ddf0 20 20 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d    assert( *pRes=
2de00 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  =0 );.  if( pCur
2de10 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
2de20 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 61 73  _VALID ){.    as
2de30 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72  sert( (pCur->cur
2de40 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c  Flags & BTCF_Val
2de50 69 64 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a 20 20  idOvfl)==0 );.  
2de60 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
2de70 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
2de80 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
2de90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2dea0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2deb0 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53    }.    if( CURS
2dec0 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
2ded0 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
2dee0 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
2def0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2df00 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  _OK;.    }.    i
2df10 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  f( pCur->skipNex
2df20 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t ){.      asser
2df30 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
2df40 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c  =CURSOR_VALID ||
2df50 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2df60 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29  URSOR_SKIPNEXT )
2df70 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53  ;.      pCur->eS
2df80 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41  tate = CURSOR_VA
2df90 4c 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70  LID;.      if( p
2dfa0 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3e 30 20  Cur->skipNext>0 
2dfb0 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
2dfc0 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20  >skipNext = 0;. 
2dfd0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2dfe0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
2dff0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69  .      pCur->ski
2e000 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d  pNext = 0;.    }
2e010 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20  .  }..  pPage = 
2e020 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2e030 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64 78  r->iPage];.  idx
2e040 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78   = ++pCur->aiIdx
2e050 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
2e060 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2e070 69 73 49 6e 69 74 20 29 3b 0a 0a 20 20 2f 2a 20  isInit );..  /* 
2e080 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
2e090 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74 2c  file is corrupt,
2e0a0 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
2e0b0 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 6f 66  for the value of
2e0c0 20 69 64 78 20 0a 20 20 2a 2a 20 74 6f 20 62 65   idx .  ** to be
2e0d0 20 69 6e 76 61 6c 69 64 20 68 65 72 65 2e 20 54   invalid here. T
2e0e0 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63  his can only occ
2e0f0 75 72 20 69 66 20 61 20 73 65 63 6f 6e 64 20 63  ur if a second c
2e100 75 72 73 6f 72 20 6d 6f 64 69 66 69 65 73 0a 20  ursor modifies. 
2e110 20 2a 2a 20 74 68 65 20 70 61 67 65 20 77 68 69   ** the page whi
2e120 6c 65 20 63 75 72 73 6f 72 20 70 43 75 72 20 69  le cursor pCur i
2e130 73 20 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65  s holding a refe
2e140 72 65 6e 63 65 20 74 6f 20 69 74 2e 20 57 68 69  rence to it. Whi
2e150 63 68 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79  ch can.  ** only
2e160 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20 64   happen if the d
2e170 61 74 61 62 61 73 65 20 69 73 20 63 6f 72 72 75  atabase is corru
2e180 70 74 20 69 6e 20 73 75 63 68 20 61 20 77 61 79  pt in such a way
2e190 20 61 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 0a   as to link the.
2e1a0 20 20 2a 2a 20 70 61 67 65 20 69 6e 74 6f 20 6d    ** page into m
2e1b0 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 2d 74  ore than one b-t
2e1c0 72 65 65 20 73 74 72 75 63 74 75 72 65 2e 20 2a  ree structure. *
2e1d0 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 69 64  /.  testcase( id
2e1e0 78 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  x>pPage->nCell )
2e1f0 3b 0a 0a 20 20 69 66 28 20 69 64 78 3e 3d 70 50  ;..  if( idx>=pP
2e200 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  age->nCell ){.  
2e210 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
2e220 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  af ){.      rc =
2e230 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
2e240 72 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61  r, get4byte(&pPa
2e250 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
2e260 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b  >hdrOffset+8]));
2e270 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
2e280 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2e290 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65   return moveToLe
2e2a0 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
2e2b0 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20    }.    do{.    
2e2c0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
2e2d0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
2e2e0 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
2e2f0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
2e300 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
2e310 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2e320 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2e330 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f    }.      moveTo
2e340 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20  Parent(pCur);.  
2e350 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72      pPage = pCur
2e360 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2e370 50 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c  Page];.    }whil
2e380 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  e( pCur->aiIdx[p
2e390 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 50 61  Cur->iPage]>=pPa
2e3a0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
2e3b0 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
2e3c0 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ey ){.      retu
2e3d0 72 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  rn sqlite3BtreeN
2e3e0 65 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b  ext(pCur, pRes);
2e3f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2e400 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2e410 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
2e420 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
2e430 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2e440 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
2e450 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76  {.    return mov
2e460 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
2e470 29 3b 0a 20 20 7d 0a 7d 0a 69 6e 74 20 73 71 6c  );.  }.}.int sql
2e480 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 42 74  ite3BtreeNext(Bt
2e490 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
2e4a0 74 20 2a 70 52 65 73 29 7b 0a 20 20 4d 65 6d 50  t *pRes){.  MemP
2e4b0 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 61 73  age *pPage;.  as
2e4c0 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
2e4d0 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
2e4e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73  ;.  assert( pRes
2e4f0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
2e500 20 2a 70 52 65 73 3d 3d 30 20 7c 7c 20 2a 70 52   *pRes==0 || *pR
2e510 65 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  es==1 );.  asser
2e520 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  t( pCur->skipNex
2e530 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53  t==0 || pCur->eS
2e540 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
2e550 49 44 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e  ID );.  pCur->in
2e560 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
2e570 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2e580 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b  = ~(BTCF_ValidNK
2e590 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  ey|BTCF_ValidOvf
2e5a0 6c 29 3b 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b  l);.  *pRes = 0;
2e5b0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
2e5c0 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
2e5d0 44 20 29 20 72 65 74 75 72 6e 20 62 74 72 65 65  D ) return btree
2e5e0 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65 73 29  Next(pCur, pRes)
2e5f0 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ;.  pPage = pCur
2e600 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2e610 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 28 2b 2b  Page];.  if( (++
2e620 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2e630 2d 3e 69 50 61 67 65 5d 29 3e 3d 70 50 61 67 65  ->iPage])>=pPage
2e640 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70  ->nCell ){.    p
2e650 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2e660 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 72  >iPage]--;.    r
2e670 65 74 75 72 6e 20 62 74 72 65 65 4e 65 78 74 28  eturn btreeNext(
2e680 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 7d  pCur, pRes);.  }
2e690 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65  .  if( pPage->le
2e6a0 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  af ){.    return
2e6b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
2e6c0 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
2e6d0 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
2e6e0 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Cur);.  }.}../*.
2e6f0 2a 2a 20 53 74 65 70 20 74 68 65 20 63 75 72 73  ** Step the curs
2e700 6f 72 20 74 6f 20 74 68 65 20 62 61 63 6b 20 74  or to the back t
2e710 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65  o the previous e
2e720 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
2e730 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63  base.  If.** suc
2e740 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74  cessful then set
2e750 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68   *pRes=0.  If th
2e760 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20  e cursor.** was 
2e770 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67  already pointing
2e780 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e   to the first en
2e790 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
2e7a0 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  ase before.** th
2e7b0 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63  is routine was c
2e7c0 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20  alled, then set 
2e7d0 2a 70 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54  *pRes=1..**.** T
2e7e0 68 65 20 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f  he main entry po
2e7f0 69 6e 74 20 69 73 20 73 71 6c 69 74 65 33 42 74  int is sqlite3Bt
2e800 72 65 65 50 72 65 76 69 6f 75 73 28 29 2e 20 20  reePrevious().  
2e810 54 68 61 74 20 72 6f 75 74 69 6e 65 20 69 73 20  That routine is 
2e820 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72  optimized.** for
2e830 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
2e840 20 6f 66 20 6d 65 72 65 6c 79 20 64 65 63 72 65   of merely decre
2e850 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 65 6c 6c  menting the cell
2e860 20 63 6f 75 6e 74 65 72 20 42 74 43 75 72 73 6f   counter BtCurso
2e870 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68  r.aiIdx.** to th
2e880 65 20 70 72 65 76 69 6f 75 73 20 63 65 6c 6c 20  e previous cell 
2e890 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  on the current p
2e8a0 61 67 65 2e 20 20 54 68 65 20 28 73 6c 6f 77 65  age.  The (slowe
2e8b0 72 29 20 62 74 72 65 65 50 72 65 76 69 6f 75 73  r) btreePrevious
2e8c0 28 29 0a 2a 2a 20 68 65 6c 70 65 72 20 72 6f 75  ().** helper rou
2e8d0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
2e8e0 68 65 6e 20 69 74 20 69 73 20 6e 65 63 65 73 73  hen it is necess
2e8f0 61 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61  ary to move to a
2e900 20 64 69 66 66 65 72 65 6e 74 20 70 61 67 65 0a   different page.
2e910 2a 2a 20 6f 72 20 74 6f 20 72 65 73 74 6f 72 65  ** or to restore
2e920 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a   the cursor..**.
2e930 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  ** The calling f
2e940 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73 65 74  unction will set
2e950 20 2a 70 52 65 73 20 74 6f 20 30 20 6f 72 20 31   *pRes to 0 or 1
2e960 2e 20 20 54 68 65 20 69 6e 69 74 69 61 6c 20 2a  .  The initial *
2e970 70 52 65 73 20 76 61 6c 75 65 0a 2a 2a 20 77 69  pRes value.** wi
2e980 6c 6c 20 62 65 20 31 20 69 66 20 74 68 65 20 63  ll be 1 if the c
2e990 75 72 73 6f 72 20 62 65 69 6e 67 20 73 74 65 70  ursor being step
2e9a0 70 65 64 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  ped corresponds 
2e9b0 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20  to an SQL index 
2e9c0 61 6e 64 0a 2a 2a 20 69 66 20 74 68 69 73 20 72  and.** if this r
2e9d0 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76  outine could hav
2e9e0 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64 20 69  e been skipped i
2e9f0 66 20 74 68 61 74 20 53 51 4c 20 69 6e 64 65 78  f that SQL index
2ea00 20 68 61 64 20 62 65 65 6e 0a 2a 2a 20 61 20 75   had been.** a u
2ea10 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20 4f 74  nique index.  Ot
2ea20 68 65 72 77 69 73 65 20 74 68 65 20 63 61 6c 6c  herwise the call
2ea30 65 72 20 77 69 6c 6c 20 68 61 76 65 20 73 65 74  er will have set
2ea40 20 2a 70 52 65 73 20 74 6f 20 7a 65 72 6f 2e 0a   *pRes to zero..
2ea50 2a 2a 20 5a 65 72 6f 20 69 73 20 74 68 65 20 63  ** Zero is the c
2ea60 6f 6d 6d 6f 6e 20 63 61 73 65 2e 20 54 68 65 20  ommon case. The 
2ea70 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61  btree implementa
2ea80 74 69 6f 6e 20 69 73 20 66 72 65 65 20 74 6f 20  tion is free to 
2ea90 75 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69  use the.** initi
2eaa0 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 20 61  al *pRes value a
2eab0 73 20 61 20 68 69 6e 74 20 74 6f 20 69 6d 70 72  s a hint to impr
2eac0 6f 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c  ove performance,
2ead0 20 62 75 74 20 74 68 65 20 63 75 72 72 65 6e 74   but the current
2eae0 0a 2a 2a 20 53 51 4c 69 74 65 20 62 74 72 65 65  .** SQLite btree
2eaf0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2eb00 64 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f 74 65 20  does not. (Note 
2eb10 74 68 61 74 20 74 68 65 20 63 6f 6d 64 62 32 20  that the comdb2 
2eb20 62 74 72 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65  btree.** impleme
2eb30 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 75 73 65  ntation does use
2eb40 20 74 68 69 73 20 68 69 6e 74 2c 20 68 6f 77 65   this hint, howe
2eb50 76 65 72 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20  ver.).*/.static 
2eb60 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
2eb70 69 6e 74 20 62 74 72 65 65 50 72 65 76 69 6f 75  int btreePreviou
2eb80 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  s(BtCursor *pCur
2eb90 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
2eba0 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67  int rc;.  MemPag
2ebb0 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73  e *pPage;..  ass
2ebc0 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
2ebd0 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
2ebe0 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73 21  .  assert( pRes!
2ebf0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2ec00 2a 70 52 65 73 3d 3d 30 20 29 3b 0a 20 20 61 73  *pRes==0 );.  as
2ec10 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70  sert( pCur->skip
2ec20 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Next==0 || pCur-
2ec30 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
2ec40 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
2ec50 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  t( (pCur->curFla
2ec60 67 73 20 26 20 28 42 54 43 46 5f 41 74 4c 61 73  gs & (BTCF_AtLas
2ec70 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  t|BTCF_ValidOvfl
2ec80 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29  |BTCF_ValidNKey)
2ec90 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
2eca0 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69  ( pCur->info.nSi
2ecb0 7a 65 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ze==0 );.  if( p
2ecc0 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
2ecd0 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
2ece0 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
2ecf0 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
2ed00 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2ed10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2ed20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2ed30 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f   }.    if( CURSO
2ed40 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
2ed50 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20  >eState ){.     
2ed60 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
2ed70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2ed80 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OK;.    }.    if
2ed90 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
2eda0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2edb0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2edc0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
2edd0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2ede0 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b  RSOR_SKIPNEXT );
2edf0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74  .      pCur->eSt
2ee00 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
2ee10 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43  ID;.      if( pC
2ee20 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20 29  ur->skipNext<0 )
2ee30 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
2ee40 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  skipNext = 0;.  
2ee50 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2ee60 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
2ee70 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70        pCur->skip
2ee80 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Next = 0;.    }.
2ee90 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70    }..  pPage = p
2eea0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2eeb0 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65  ->iPage];.  asse
2eec0 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
2eed0 74 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67  t );.  if( !pPag
2eee0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 69  e->leaf ){.    i
2eef0 6e 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61  nt idx = pCur->a
2ef00 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2ef10 5d 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  ];.    rc = move
2ef20 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65  ToChild(pCur, ge
2ef30 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
2ef40 70 50 61 67 65 2c 20 69 64 78 29 29 29 3b 0a 20  pPage, idx)));. 
2ef50 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
2ef60 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20  rn rc;.    rc = 
2ef70 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
2ef80 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pCur);.  }else{.
2ef90 20 20 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d      while( pCur-
2efa0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2efb0 67 65 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ge]==0 ){.      
2efc0 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d  if( pCur->iPage=
2efd0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  =0 ){.        pC
2efe0 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
2eff0 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
2f000 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
2f010 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2f020 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2f030 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61  }.      moveToPa
2f040 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20  rent(pCur);.    
2f050 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  }.    assert( pC
2f060 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
2f070 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2f080 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
2f090 20 26 20 28 42 54 43 46 5f 56 61 6c 69 64 4f 76   & (BTCF_ValidOv
2f0a0 66 6c 29 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20  fl))==0 );..    
2f0b0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2f0c0 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20  ->iPage]--;.    
2f0d0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
2f0e0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2f0f0 5d 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ];.    if( pPage
2f100 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61  ->intKey && !pPa
2f110 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2f120 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2f130 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72  reePrevious(pCur
2f140 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c  , pRes);.    }el
2f150 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
2f160 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
2f170 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2f180 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
2f190 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75  reePrevious(BtCu
2f1a0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
2f1b0 2a 70 52 65 73 29 7b 0a 20 20 61 73 73 65 72 74  *pRes){.  assert
2f1c0 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
2f1d0 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
2f1e0 61 73 73 65 72 74 28 20 70 52 65 73 21 3d 30 20  assert( pRes!=0 
2f1f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52  );.  assert( *pR
2f200 65 73 3d 3d 30 20 7c 7c 20 2a 70 52 65 73 3d 3d  es==0 || *pRes==
2f210 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
2f220 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30  Cur->skipNext==0
2f230 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
2f240 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
2f250 3b 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20  ;.  *pRes = 0;. 
2f260 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
2f270 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61 73 74  &= ~(BTCF_AtLast
2f280 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c  |BTCF_ValidOvfl|
2f290 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3b  BTCF_ValidNKey);
2f2a0 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
2f2b0 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  ize = 0;.  if( p
2f2c0 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
2f2d0 53 4f 52 5f 56 41 4c 49 44 0a 20 20 20 7c 7c 20  SOR_VALID.   || 
2f2e0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2f2f0 2d 3e 69 50 61 67 65 5d 3d 3d 30 0a 20 20 20 7c  ->iPage]==0.   |
2f300 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  | pCur->apPage[p
2f310 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61  Cur->iPage]->lea
2f320 66 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72 65  f==0.  ){.    re
2f330 74 75 72 6e 20 62 74 72 65 65 50 72 65 76 69 6f  turn btreePrevio
2f340 75 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a  us(pCur, pRes);.
2f350 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 69 49 64    }.  pCur->aiId
2f360 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d  x[pCur->iPage]--
2f370 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2f380 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
2f390 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61  llocate a new pa
2f3a0 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ge from the data
2f3b0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
2f3c0 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 69 73   The new page is
2f3d0 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
2f3e0 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72  .  (In other wor
2f3f0 64 73 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72  ds, sqlite3Pager
2f400 57 72 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61  Write().** has a
2f410 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c  lready been call
2f420 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61  ed on the new pa
2f430 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61  ge.)  The new pa
2f440 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62  ge has also.** b
2f450 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61  een referenced a
2f460 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72  nd the calling r
2f470 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e  outine is respon
2f480 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e  sible for callin
2f490 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65  g.** sqlite3Page
2f4a0 72 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20  rUnref() on the 
2f4b0 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20 69 74  new page when it
2f4c0 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20   is done..**.** 
2f4d0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
2f4e0 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
2f4f0 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74  .  Any other ret
2f500 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61  urn value indica
2f510 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e  tes.** an error.
2f520 20 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74    *ppPage is set
2f530 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 74 68 65 20   to NULL in the 
2f540 65 76 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f  event of an erro
2f550 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  r..**.** If the 
2f560 22 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65 74  "nearby" paramet
2f570 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65  er is not 0, the
2f580 6e 20 61 6e 20 65 66 66 6f 72 74 20 69 73 20 6d  n an effort is m
2f590 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74  ade to .** locat
2f5a0 65 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20 74  e a page close t
2f5b0 6f 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  o the page numbe
2f5c0 72 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68 69  r "nearby".  Thi
2f5d0 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e  s can be used in
2f5e0 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74   an.** attempt t
2f5f0 6f 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20 70  o keep related p
2f600 61 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65 61  ages close to ea
2f610 63 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20  ch other in the 
2f620 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a  database file,.*
2f630 2a 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20  * which in turn 
2f640 63 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61 73  can make databas
2f650 65 20 61 63 63 65 73 73 20 66 61 73 74 65 72 2e  e access faster.
2f660 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 4d  .**.** If the eM
2f670 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20 69 73  ode parameter is
2f680 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61   BTALLOC_EXACT a
2f690 6e 64 20 74 68 65 20 6e 65 61 72 62 79 20 70 61  nd the nearby pa
2f6a0 67 65 20 65 78 69 73 74 73 0a 2a 2a 20 61 6e 79  ge exists.** any
2f6b0 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65  where on the fre
2f6c0 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20  e-list, then it 
2f6d0 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
2f6e0 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20 49   be returned.  I
2f6f0 66 0a 2a 2a 20 65 4d 6f 64 65 20 69 73 20 42 54  f.** eMode is BT
2f700 41 4c 4c 4f 43 5f 4c 54 20 74 68 65 6e 20 74 68  ALLOC_LT then th
2f710 65 20 70 61 67 65 20 72 65 74 75 72 6e 65 64 20  e page returned 
2f720 77 69 6c 6c 20 62 65 20 6c 65 73 73 20 74 68 61  will be less tha
2f730 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74 6f  n or equal.** to
2f740 20 6e 65 61 72 62 79 20 69 66 20 61 6e 79 20 73   nearby if any s
2f750 75 63 68 20 70 61 67 65 20 65 78 69 73 74 73 2e  uch page exists.
2f760 20 20 49 66 20 65 4d 6f 64 65 20 69 73 20 42 54    If eMode is BT
2f770 41 4c 4c 4f 43 5f 41 4e 59 20 74 68 65 6e 20 74  ALLOC_ANY then t
2f780 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 72  here.** are no r
2f790 65 73 74 72 69 63 74 69 6f 6e 73 20 6f 6e 20 77  estrictions on w
2f7a0 68 69 63 68 20 70 61 67 65 20 69 73 20 72 65 74  hich page is ret
2f7b0 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
2f7c0 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72   int allocateBtr
2f7d0 65 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  eePage(.  BtShar
2f7e0 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
2f7f0 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
2f800 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
2f810 61 67 65 2c 20 20 20 20 20 20 2f 2a 20 53 74 6f  age,      /* Sto
2f820 72 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  re pointer to th
2f830 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  e allocated page
2f840 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   here */.  Pgno 
2f850 2a 70 50 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  *pPgno,         
2f860 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 70    /* Store the p
2f870 61 67 65 20 6e 75 6d 62 65 72 20 68 65 72 65 20  age number here 
2f880 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79  */.  Pgno nearby
2f890 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ,           /* S
2f8a0 65 61 72 63 68 20 66 6f 72 20 61 20 70 61 67 65  earch for a page
2f8b0 20 6e 65 61 72 20 74 68 69 73 20 6f 6e 65 20 2a   near this one *
2f8c0 2f 0a 20 20 75 38 20 65 4d 6f 64 65 20 20 20 20  /.  u8 eMode    
2f8d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 54             /* BT
2f8e0 41 4c 4c 4f 43 5f 45 58 41 43 54 2c 20 42 54 41  ALLOC_EXACT, BTA
2f8f0 4c 4c 4f 43 5f 4c 54 2c 20 6f 72 20 42 54 41 4c  LLOC_LT, or BTAL
2f900 4c 4f 43 5f 41 4e 59 20 2a 2f 0a 29 7b 0a 20 20  LOC_ANY */.){.  
2f910 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
2f920 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32  .  int rc;.  u32
2f930 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65   n;     /* Numbe
2f940 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68  r of pages on th
2f950 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20  e freelist */.  
2f960 75 33 32 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75  u32 k;     /* Nu
2f970 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f  mber of leaves o
2f980 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74  n the trunk of t
2f990 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20  he freelist */. 
2f9a0 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b   MemPage *pTrunk
2f9b0 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20   = 0;.  MemPage 
2f9c0 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b  *pPrevTrunk = 0;
2f9d0 0a 20 20 50 67 6e 6f 20 6d 78 50 61 67 65 3b 20  .  Pgno mxPage; 
2f9e0 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a      /* Total siz
2f9f0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
2fa00 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73  e file */..  ass
2fa10 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2fa20 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
2fa30 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
2fa40 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
2fa50 41 4e 59 20 7c 7c 20 28 6e 65 61 72 62 79 3e 30  ANY || (nearby>0
2fa60 20 26 26 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28   && IfNotOmitAV(
2fa70 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
2fa80 29 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20  ) );.  pPage1 = 
2fa90 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d  pBt->pPage1;.  m
2faa0 78 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67  xPage = btreePag
2fab0 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 2f  ecount(pBt);.  /
2fac0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
2fad0 2d 30 35 31 31 39 2d 30 32 36 33 37 20 54 68 65  -05119-02637 The
2fae0 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4-byte big-endi
2faf0 61 6e 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66  an integer at of
2fb00 66 73 65 74 20 33 36 0a 20 20 2a 2a 20 73 74 6f  fset 36.  ** sto
2fb10 72 65 73 20 73 74 6f 72 65 73 20 74 68 65 20 74  res stores the t
2fb20 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
2fb30 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
2fb40 6c 69 73 74 2e 20 2a 2f 0a 20 20 6e 20 3d 20 67  list. */.  n = g
2fb50 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
2fb60 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 74  >aData[36]);.  t
2fb70 65 73 74 63 61 73 65 28 20 6e 3d 3d 6d 78 50 61  estcase( n==mxPa
2fb80 67 65 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 3e  ge-1 );.  if( n>
2fb90 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 72  =mxPage ){.    r
2fba0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
2fbb0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
2fbc0 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20   if( n>0 ){.    
2fbd0 2f 2a 20 54 68 65 72 65 20 61 72 65 20 70 61 67  /* There are pag
2fbe0 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
2fbf0 73 74 2e 20 20 52 65 75 73 65 20 6f 6e 65 20 6f  st.  Reuse one o
2fc00 66 20 74 68 6f 73 65 20 70 61 67 65 73 2e 20 2a  f those pages. *
2fc10 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54 72 75 6e  /.    Pgno iTrun
2fc20 6b 3b 0a 20 20 20 20 75 38 20 73 65 61 72 63 68  k;.    u8 search
2fc30 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20  List = 0; /* If 
2fc40 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6d 75  the free-list mu
2fc50 73 74 20 62 65 20 73 65 61 72 63 68 65 64 20 66  st be searched f
2fc60 6f 72 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20  or 'nearby' */. 
2fc70 20 20 20 75 33 32 20 6e 53 65 61 72 63 68 20 3d     u32 nSearch =
2fc80 20 30 3b 20 20 20 2f 2a 20 43 6f 75 6e 74 20 6f   0;   /* Count o
2fc90 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
2fca0 73 65 61 72 63 68 20 61 74 74 65 6d 70 74 73 20  search attempts 
2fcb0 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49  */.    .    /* I
2fcc0 66 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  f eMode==BTALLOC
2fcd0 5f 45 58 41 43 54 20 61 6e 64 20 61 20 71 75 65  _EXACT and a que
2fce0 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65  ry of the pointe
2fcf0 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f  r-map.    ** sho
2fd00 77 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ws that the page
2fd10 20 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d   'nearby' is som
2fd20 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72  ewhere on the fr
2fd30 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20  ee-list, then.  
2fd40 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d    ** the entire-
2fd50 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61  list will be sea
2fd60 72 63 68 65 64 20 66 6f 72 20 74 68 61 74 20 70  rched for that p
2fd70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e  age..    */.#ifn
2fd80 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2fd90 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
2fda0 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  f( eMode==BTALLO
2fdb0 43 5f 45 58 41 43 54 20 29 7b 0a 20 20 20 20 20  C_EXACT ){.     
2fdc0 20 69 66 28 20 6e 65 61 72 62 79 3c 3d 6d 78 50   if( nearby<=mxP
2fdd0 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75  age ){.        u
2fde0 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 20  8 eType;.       
2fdf0 20 61 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e   assert( nearby>
2fe00 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  0 );.        ass
2fe10 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
2fe20 63 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 20 20  cuum );.        
2fe30 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
2fe40 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79  Bt, nearby, &eTy
2fe50 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  pe, 0);.        
2fe60 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
2fe70 72 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  rc;.        if( 
2fe80 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52  eType==PTRMAP_FR
2fe90 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  EEPAGE ){.      
2fea0 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
2feb0 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
2fec0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
2fed0 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  if( eMode==BTALL
2fee0 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 73  OC_LE ){.      s
2fef0 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20  earchList = 1;. 
2ff00 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
2ff10 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
2ff20 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e  e free-list coun
2ff30 74 20 62 79 20 31 2e 20 53 65 74 20 69 54 72 75  t by 1. Set iTru
2ff40 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  nk to the index 
2ff50 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69  of the.    ** fi
2ff60 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72  rst free-list tr
2ff70 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54  unk page. iPrevT
2ff80 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c  runk is initiall
2ff90 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  y 1..    */.    
2ffa0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2ffb0 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70  rWrite(pPage1->p
2ffc0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
2ffd0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2ffe0 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70  .    put4byte(&p
2fff0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
30000 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  , n-1);..    /* 
30010 54 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20  The code within 
30020 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e  this loop is run
30030 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68   only once if th
30040 65 20 27 73 65 61 72 63 68 4c 69 73 74 27 20 76  e 'searchList' v
30050 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69  ariable.    ** i
30060 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65  s not true. Othe
30070 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f  rwise, it runs o
30080 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 72 75  nce for each tru
30090 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20  nk-page on the. 
300a0 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20     ** free-list 
300b0 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20 27  until the page '
300c0 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74  nearby' is locat
300d0 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  ed (eMode==BTALL
300e0 4f 43 5f 45 58 41 43 54 29 0a 20 20 20 20 2a 2a  OC_EXACT).    **
300f0 20 6f 72 20 75 6e 74 69 6c 20 61 20 70 61 67 65   or until a page
30100 20 6c 65 73 73 20 74 68 61 6e 20 27 6e 65 61 72   less than 'near
30110 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28  by' is located (
30120 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c  eMode==BTALLOC_L
30130 54 29 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f  T).    */.    do
30140 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72   {.      pPrevTr
30150 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  unk = pTrunk;.  
30160 20 20 20 20 69 66 28 20 70 50 72 65 76 54 72 75      if( pPrevTru
30170 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  nk ){.        /*
30180 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
30190 30 31 35 30 36 2d 31 31 30 35 33 20 54 68 65 20  01506-11053 The 
301a0 66 69 72 73 74 20 69 6e 74 65 67 65 72 20 6f 6e  first integer on
301b0 20 61 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e   a freelist trun
301c0 6b 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  k page.        *
301d0 2a 20 69 73 20 74 68 65 20 70 61 67 65 20 6e 75  * is the page nu
301e0 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74  mber of the next
301f0 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
30200 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74  page in the list
30210 20 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 7a   or.        ** z
30220 65 72 6f 20 69 66 20 74 68 69 73 20 69 73 20 74  ero if this is t
30230 68 65 20 6c 61 73 74 20 66 72 65 65 6c 69 73 74  he last freelist
30240 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 2a 2f 0a   trunk page. */.
30250 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d          iTrunk =
30260 20 67 65 74 34 62 79 74 65 28 26 70 50 72 65 76   get4byte(&pPrev
30270 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29  Trunk->aData[0])
30280 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
30290 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e         /* EVIDEN
302a0 43 45 2d 4f 46 3a 20 52 2d 35 39 38 34 31 2d 31  CE-OF: R-59841-1
302b0 33 37 39 38 20 54 68 65 20 34 2d 62 79 74 65 20  3798 The 4-byte 
302c0 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
302d0 65 72 20 61 74 20 6f 66 66 73 65 74 20 33 32 0a  er at offset 32.
302e0 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65          ** store
302f0 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  s the page numbe
30300 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70  r of the first p
30310 61 67 65 20 6f 66 20 74 68 65 20 66 72 65 65 6c  age of the freel
30320 69 73 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66 0a  ist, or zero if.
30330 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66          ** the f
30340 72 65 65 6c 69 73 74 20 69 73 20 65 6d 70 74 79  reelist is empty
30350 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 54 72  . */.        iTr
30360 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
30370 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
30380 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
30390 20 20 74 65 73 74 63 61 73 65 28 20 69 54 72 75    testcase( iTru
303a0 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  nk==mxPage );.  
303b0 20 20 20 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d      if( iTrunk>m
303c0 78 50 61 67 65 20 7c 7c 20 6e 53 65 61 72 63 68  xPage || nSearch
303d0 2b 2b 20 3e 20 6e 20 29 7b 0a 20 20 20 20 20 20  ++ > n ){.      
303e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
303f0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
30400 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
30410 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e   rc = btreeGetUn
30420 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 69 54  usedPage(pBt, iT
30430 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30  runk, &pTrunk, 0
30440 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
30450 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
30460 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20     pTrunk = 0;. 
30470 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
30480 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
30490 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
304a0 65 72 74 28 20 70 54 72 75 6e 6b 21 3d 30 20 29  ert( pTrunk!=0 )
304b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
304c0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 21 3d 30  pTrunk->aData!=0
304d0 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   );.      /* EVI
304e0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 33 35 32  DENCE-OF: R-1352
304f0 33 2d 30 34 33 39 34 20 54 68 65 20 73 65 63 6f  3-04394 The seco
30500 6e 64 20 69 6e 74 65 67 65 72 20 6f 6e 20 61 20  nd integer on a 
30510 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
30520 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  age.      ** is 
30530 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65  the number of le
30540 61 66 20 70 61 67 65 20 70 6f 69 6e 74 65 72 73  af page pointers
30550 20 74 6f 20 66 6f 6c 6c 6f 77 2e 20 2a 2f 0a 20   to follow. */. 
30560 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74       k = get4byt
30570 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
30580 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [4]);.      if( 
30590 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68 4c  k==0 && !searchL
305a0 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ist ){.        /
305b0 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73 20  * The trunk has 
305c0 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74 68  no leaves and th
305d0 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62 65  e list is not be
305e0 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a 20  ing searched. . 
305f0 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78 74         ** So ext
30600 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20 70  ract the trunk p
30610 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20 75  age itself and u
30620 73 65 20 69 74 20 61 73 20 74 68 65 20 6e 65 77  se it as the new
30630 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ly .        ** a
30640 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f  llocated page */
30650 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
30660 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29   pPrevTrunk==0 )
30670 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
30680 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
30690 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
306a0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
306b0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  c ){.          g
306c0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
306d0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  _page;.        }
306e0 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20  .        *pPgno 
306f0 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = iTrunk;.      
30700 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31    memcpy(&pPage1
30710 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54  ->aData[32], &pT
30720 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
30730 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50  4);.        *ppP
30740 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  age = pTrunk;.  
30750 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30        pTrunk = 0
30760 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28  ;.        TRACE(
30770 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74  ("ALLOCATE: %d t
30780 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70  runk - %d free p
30790 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70  ages left\n", *p
307a0 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20  Pgno, n-1));.   
307b0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 28     }else if( k>(
307c0 75 33 32 29 28 70 42 74 2d 3e 75 73 61 62 6c 65  u32)(pBt->usable
307d0 53 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a 20  Size/4 - 2) ){. 
307e0 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
307f0 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72  of k is out of r
30800 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65 20  ange.  Database 
30810 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20  corruption */.  
30820 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
30830 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
30840 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
30850 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
30860 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
30870 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
30880 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
30890 65 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20  earchList .     
308a0 20 20 20 20 20 20 20 26 26 20 28 6e 65 61 72 62         && (nearb
308b0 79 3d 3d 69 54 72 75 6e 6b 20 7c 7c 20 28 69 54  y==iTrunk || (iT
308c0 72 75 6e 6b 3c 6e 65 61 72 62 79 20 26 26 20 65  runk<nearby && e
308d0 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45  Mode==BTALLOC_LE
308e0 29 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  )) .      ){.   
308f0 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74       /* The list
30900 20 69 73 20 62 65 69 6e 67 20 73 65 61 72 63 68   is being search
30910 65 64 20 61 6e 64 20 74 68 69 73 20 74 72 75 6e  ed and this trun
30920 6b 20 70 61 67 65 20 69 73 20 74 68 65 20 70 61  k page is the pa
30930 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ge.        ** to
30940 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61 72   allocate, regar
30950 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
30960 20 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e 0a   it has leaves..
30970 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
30980 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75     *pPgno = iTru
30990 6e 6b 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50  nk;.        *ppP
309a0 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  age = pTrunk;.  
309b0 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
309c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63   = 0;.        rc
309d0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
309e0 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
309f0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
30a00 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
30a10 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
30a20 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
30a30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
30a40 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   k==0 ){.       
30a50 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75     if( !pPrevTru
30a60 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nk ){.          
30a70 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31    memcpy(&pPage1
30a80 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54  ->aData[32], &pT
30a90 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
30aa0 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  4);.          }e
30ab0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
30ac0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
30ad0 65 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75  erWrite(pPrevTru
30ae0 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
30af0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
30b00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
30b10 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74               got
30b20 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
30b30 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  age;.           
30b40 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d   }.            m
30b50 65 6d 63 70 79 28 26 70 50 72 65 76 54 72 75 6e  emcpy(&pPrevTrun
30b60 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54  k->aData[0], &pT
30b70 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
30b80 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  4);.          }.
30b90 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
30ba0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
30bb0 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65  trunk page is re
30bc0 71 75 69 72 65 64 20 62 79 20 74 68 65 20 63 61  quired by the ca
30bd0 6c 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74  ller but it cont
30be0 61 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20  ains .          
30bf0 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66  ** pointers to f
30c00 72 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e  ree-list leaves.
30c10 20 54 68 65 20 66 69 72 73 74 20 6c 65 61 66 20   The first leaf 
30c20 62 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a  becomes a trunk.
30c30 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67            ** pag
30c40 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  e in this case..
30c50 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
30c60 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
30c70 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20  pNewTrunk;.     
30c80 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72       Pgno iNewTr
30c90 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
30ca0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d  pTrunk->aData[8]
30cb0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
30cc0 20 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67   iNewTrunk>mxPag
30cd0 65 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20  e ){ .          
30ce0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
30cf0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
30d00 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
30d10 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
30d20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
30d30 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
30d40 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61 67  iNewTrunk==mxPag
30d50 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  e );.          r
30d60 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73  c = btreeGetUnus
30d70 65 64 50 61 67 65 28 70 42 74 2c 20 69 4e 65 77  edPage(pBt, iNew
30d80 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e  Trunk, &pNewTrun
30d90 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  k, 0);.         
30da0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
30db0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
30dc0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
30dd0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
30de0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
30df0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
30e00 72 57 72 69 74 65 28 70 4e 65 77 54 72 75 6e 6b  rWrite(pNewTrunk
30e10 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
30e20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
30e30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
30e40 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
30e50 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ge(pNewTrunk);. 
30e60 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
30e70 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
30e80 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
30e90 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
30ea0 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74  &pNewTrunk->aDat
30eb0 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[0], &pTrunk->a
30ec0 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
30ed0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
30ee0 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74  &pNewTrunk->aDat
30ef0 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20  a[4], k-1);.    
30f00 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e        memcpy(&pN
30f10 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38  ewTrunk->aData[8
30f20 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
30f30 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b  a[12], (k-1)*4);
30f40 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61  .          relea
30f50 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b  sePage(pNewTrunk
30f60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
30f70 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a   !pPrevTrunk ){.
30f80 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
30f90 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
30fa0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
30fb0 65 31 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  e1->pDbPage) );.
30fc0 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34              put4
30fd0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
30fe0 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75  ata[32], iNewTru
30ff0 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nk);.          }
31000 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
31010 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
31020 67 65 72 57 72 69 74 65 28 70 50 72 65 76 54 72  gerWrite(pPrevTr
31030 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
31040 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
31050 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  c ){.           
31060 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
31070 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
31080 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31090 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
310a0 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61  PrevTrunk->aData
310b0 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b  [0], iNewTrunk);
310c0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
310d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
310e0 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20  Trunk = 0;.     
310f0 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
31100 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20  ATE: %d trunk - 
31110 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65  %d free pages le
31120 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e  ft\n", *pPgno, n
31130 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  -1));.#endif.   
31140 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 30     }else if( k>0
31150 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45   ){.        /* E
31160 78 74 72 61 63 74 20 61 20 6c 65 61 66 20 66 72  xtract a leaf fr
31170 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a  om the trunk */.
31180 20 20 20 20 20 20 20 20 75 33 32 20 63 6c 6f 73          u32 clos
31190 65 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67 6e  est;.        Pgn
311a0 6f 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20  o iPage;.       
311b0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
311c0 61 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e  aData = pTrunk->
311d0 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 69  aData;.        i
311e0 66 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20  f( nearby>0 ){. 
311f0 20 20 20 20 20 20 20 20 20 75 33 32 20 69 3b 0a           u32 i;.
31200 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73            closes
31210 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
31220 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c   if( eMode==BTAL
31230 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20  LOC_LE ){.      
31240 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
31250 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <k; i++){.      
31260 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20          iPage = 
31270 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
31280 38 2b 69 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20  8+i*4]);.       
31290 20 20 20 20 20 20 20 69 66 28 20 69 50 61 67 65         if( iPage
312a0 3c 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20  <=nearby ){.    
312b0 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73              clos
312c0 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20  est = i;.       
312d0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
312e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
312f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
31300 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
31310 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64             int d
31320 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ist;.           
31330 20 64 69 73 74 20 3d 20 73 71 6c 69 74 65 33 41   dist = sqlite3A
31340 62 73 49 6e 74 33 32 28 67 65 74 34 62 79 74 65  bsInt32(get4byte
31350 28 26 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65  (&aData[8]) - ne
31360 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20  arby);.         
31370 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b     for(i=1; i<k;
31380 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
31390 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71       int d2 = sq
313a0 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28 67 65  lite3AbsInt32(ge
313b0 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b  t4byte(&aData[8+
313c0 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b  i*4]) - nearby);
313d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
313e0 66 28 20 64 32 3c 64 69 73 74 20 29 7b 0a 20 20  f( d2<dist ){.  
313f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6c                cl
31400 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20  osest = i;.     
31410 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20             dist 
31420 3d 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20  = d2;.          
31430 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
31440 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
31450 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
31460 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
31470 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
31480 0a 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d  .        iPage =
31490 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61   get4byte(&aData
314a0 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a  [8+closest*4]);.
314b0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
314c0 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20  ( iPage==mxPage 
314d0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
314e0 50 61 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a 20  Page>mxPage ){. 
314f0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
31500 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
31510 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  T;.          got
31520 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
31530 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
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 21 73  ;.        if( !s
31570 65 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20  earchList .     
31580 20 20 20 20 7c 7c 20 28 69 50 61 67 65 3d 3d 6e      || (iPage==n
31590 65 61 72 62 79 20 7c 7c 20 28 69 50 61 67 65 3c  earby || (iPage<
315a0 6e 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d  nearby && eMode=
315b0 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20  =BTALLOC_LE)) . 
315c0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
315d0 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e      int noConten
315e0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50  t;.          *pP
315f0 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20  gno = iPage;.   
31600 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41         TRACE(("A
31610 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77 61 73 20  LLOCATE: %d was 
31620 6c 65 61 66 20 25 64 20 6f 66 20 25 64 20 6f 6e  leaf %d of %d on
31630 20 74 72 75 6e 6b 20 25 64 22 0a 20 20 20 20 20   trunk %d".     
31640 20 20 20 20 20 20 20 20 20 20 20 20 22 3a 20 25              ": %
31650 64 20 6d 6f 72 65 20 66 72 65 65 20 70 61 67 65  d more free page
31660 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
31670 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63         *pPgno, c
31680 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72  losest+1, k, pTr
31690 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29  unk->pgno, n-1))
316a0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
316b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
316c0 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
316d0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ge);.          i
316e0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64  f( rc ) goto end
316f0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
31700 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 6c            if( cl
31710 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20  osest<k-1 ){.   
31720 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
31730 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74  &aData[8+closest
31740 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a  *4], &aData[4+k*
31750 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  4], 4);.        
31760 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75    }.          pu
31770 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d  t4byte(&aData[4]
31780 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  , k-1);.        
31790 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62    noContent = !b
317a0 74 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e  treeGetHasConten
317b0 74 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29 3f 20  t(pBt, *pPgno)? 
317c0 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
317d0 45 4e 54 20 3a 20 30 3b 0a 20 20 20 20 20 20 20  ENT : 0;.       
317e0 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
317f0 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20  UnusedPage(pBt, 
31800 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  *pPgno, ppPage, 
31810 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20  noContent);.    
31820 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
31830 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
31840 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
31850 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a  te3PagerWrite((*
31860 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
31870 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
31880 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
31890 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
318a0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
318b0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
318c0 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
318d0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  0;.            }
318e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
318f0 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73         searchLis
31900 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
31910 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
31920 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76  eleasePage(pPrev
31930 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50  Trunk);.      pP
31940 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20  revTrunk = 0;.  
31950 20 20 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68    }while( search
31960 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  List );.  }else{
31970 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72  .    /* There ar
31980 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74 68  e no pages on th
31990 65 20 66 72 65 65 6c 69 73 74 2c 20 73 6f 20 61  e freelist, so a
319a0 70 70 65 6e 64 20 61 20 6e 65 77 20 70 61 67 65  ppend a new page
319b0 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   to the.    ** d
319c0 61 74 61 62 61 73 65 20 69 6d 61 67 65 2e 0a 20  atabase image.. 
319d0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 72     **.    ** Nor
319e0 6d 61 6c 6c 79 2c 20 6e 65 77 20 70 61 67 65 73  mally, new pages
319f0 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68   allocated by th
31a00 69 73 20 62 6c 6f 63 6b 20 63 61 6e 20 62 65 20  is block can be 
31a10 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74  requested from t
31a20 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20  he.    ** pager 
31a30 6c 61 79 65 72 20 77 69 74 68 20 74 68 65 20 27  layer with the '
31a40 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67  no-content' flag
31a50 20 73 65 74 2e 20 54 68 69 73 20 70 72 65 76 65   set. This preve
31a60 6e 74 73 20 74 68 65 20 70 61 67 65 72 0a 20 20  nts the pager.  
31a70 20 20 2a 2a 20 66 72 6f 6d 20 74 72 79 69 6e 67    ** from trying
31a80 20 74 6f 20 72 65 61 64 20 74 68 65 20 70 61 67   to read the pag
31a90 65 73 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  es content from 
31aa0 64 69 73 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69  disk. However, i
31ab0 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72  f the.    ** cur
31ac0 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
31ad0 20 68 61 73 20 61 6c 72 65 61 64 79 20 72 75 6e   has already run
31ae0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 69 6e 63   one or more inc
31af0 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 0a  remental-vacuum.
31b00 20 20 20 20 2a 2a 20 73 74 65 70 73 2c 20 74 68      ** steps, th
31b10 65 6e 20 74 68 65 20 70 61 67 65 20 77 65 20 61  en the page we a
31b20 72 65 20 61 62 6f 75 74 20 74 6f 20 61 6c 6c 6f  re about to allo
31b30 63 61 74 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e  cate may contain
31b40 20 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20   content.    ** 
31b50 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64  that is required
31b60 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   in the event of
31b70 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 6e 20   a rollback. In 
31b80 74 68 69 73 20 63 61 73 65 2c 20 64 6f 0a 20 20  this case, do.  
31b90 20 20 2a 2a 20 6e 6f 74 20 73 65 74 20 74 68 65    ** not set the
31ba0 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 66 6c 61 67   no-content flag
31bb0 2e 20 54 68 69 73 20 63 61 75 73 65 73 20 74 68  . This causes th
31bc0 65 20 70 61 67 65 72 20 74 6f 20 6c 6f 61 64 20  e pager to load 
31bd0 61 6e 64 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  and journal.    
31be0 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  ** the current p
31bf0 61 67 65 20 63 6f 6e 74 65 6e 74 20 62 65 66 6f  age content befo
31c00 72 65 20 6f 76 65 72 77 72 69 74 69 6e 67 20 69  re overwriting i
31c10 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  t..    **.    **
31c20 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 70   Note that the p
31c30 61 67 65 72 20 77 69 6c 6c 20 6e 6f 74 20 61 63  ager will not ac
31c40 74 75 61 6c 6c 79 20 61 74 74 65 6d 70 74 20 74  tually attempt t
31c50 6f 20 6c 6f 61 64 20 6f 72 20 6a 6f 75 72 6e 61  o load or journa
31c60 6c 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e  l .    ** conten
31c70 74 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20 74  t for any page t
31c80 68 61 74 20 72 65 61 6c 6c 79 20 64 6f 65 73 20  hat really does 
31c90 6c 69 65 20 70 61 73 74 20 74 68 65 20 65 6e 64  lie past the end
31ca0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
31cb0 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 6f 6e 20  .    ** file on 
31cc0 64 69 73 6b 2e 20 53 6f 20 74 68 65 20 65 66 66  disk. So the eff
31cd0 65 63 74 73 20 6f 66 20 64 69 73 61 62 6c 69 6e  ects of disablin
31ce0 67 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74  g the no-content
31cf0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20   optimization.  
31d00 20 20 2a 2a 20 68 65 72 65 20 61 72 65 20 63 6f    ** here are co
31d10 6e 66 69 6e 65 64 20 74 6f 20 74 68 6f 73 65 20  nfined to those 
31d20 70 61 67 65 73 20 74 68 61 74 20 6c 69 65 20 62  pages that lie b
31d30 65 74 77 65 65 6e 20 74 68 65 20 65 6e 64 20 6f  etween the end o
31d40 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  f the.    ** dat
31d50 61 62 61 73 65 20 69 6d 61 67 65 20 61 6e 64 20  abase image and 
31d60 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64  the end of the d
31d70 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
31d80 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4e 6f    */.    int bNo
31d90 43 6f 6e 74 65 6e 74 20 3d 20 28 30 3d 3d 49 66  Content = (0==If
31da0 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62  NotOmitAV(pBt->b
31db0 44 6f 54 72 75 6e 63 61 74 65 29 29 3f 20 50 41  DoTruncate))? PA
31dc0 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
31dd0 54 3a 30 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73  T:0;..    rc = s
31de0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
31df0 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44  (pBt->pPage1->pD
31e00 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
31e10 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
31e20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b      pBt->nPage++
31e30 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e  ;.    if( pBt->n
31e40 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Page==PENDING_BY
31e50 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 20 70  TE_PAGE(pBt) ) p
31e60 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69  Bt->nPage++;..#i
31e70 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
31e80 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
31e90 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
31ea0 63 75 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49  cuum && PTRMAP_I
31eb0 53 50 41 47 45 28 70 42 74 2c 20 70 42 74 2d 3e  SPAGE(pBt, pBt->
31ec0 6e 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20  nPage) ){.      
31ed0 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65 66  /* If *pPgno ref
31ee0 65 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65 72  ers to a pointer
31ef0 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63  -map page, alloc
31f00 61 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67 65  ate two new page
31f10 73 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68  s.      ** at th
31f20 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
31f30 65 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65  e instead of one
31f40 2e 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c 6f  . The first allo
31f50 63 61 74 65 64 20 70 61 67 65 0a 20 20 20 20 20  cated page.     
31f60 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 65   ** becomes a ne
31f70 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  w pointer-map pa
31f80 67 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69  ge, the second i
31f90 73 20 75 73 65 64 20 62 79 20 74 68 65 20 63 61  s used by the ca
31fa0 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ller..      */. 
31fb0 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50       MemPage *pP
31fc0 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41  g = 0;.      TRA
31fd0 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
31fe0 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69  d from end of fi
31ff0 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20  le (pointer-map 
32000 70 61 67 65 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e  page)\n", pBt->n
32010 50 61 67 65 29 29 3b 0a 20 20 20 20 20 20 61 73  Page));.      as
32020 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65  sert( pBt->nPage
32030 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
32040 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20  AGE(pBt) );.    
32050 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55    rc = btreeGetU
32060 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 70  nusedPage(pBt, p
32070 42 74 2d 3e 6e 50 61 67 65 2c 20 26 70 50 67 2c  Bt->nPage, &pPg,
32080 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20   bNoContent);.  
32090 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
320a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
320b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
320c0 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62  erWrite(pPg->pDb
320d0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Page);.        r
320e0 65 6c 65 61 73 65 50 61 67 65 28 70 50 67 29 3b  eleasePage(pPg);
320f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
32100 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
32110 63 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  c;.      pBt->nP
32120 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  age++;.      if(
32130 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e   pBt->nPage==PEN
32140 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
32150 42 74 29 20 29 7b 20 70 42 74 2d 3e 6e 50 61 67  Bt) ){ pBt->nPag
32160 65 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e  e++; }.    }.#en
32170 64 69 66 0a 20 20 20 20 70 75 74 34 62 79 74 65  dif.    put4byte
32180 28 32 38 20 2b 20 28 75 38 2a 29 70 42 74 2d 3e  (28 + (u8*)pBt->
32190 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 70  pPage1->aData, p
321a0 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
321b0 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50  *pPgno = pBt->nP
321c0 61 67 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  age;..    assert
321d0 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  ( *pPgno!=PENDIN
321e0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
321f0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   );.    rc = btr
32200 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28  eeGetUnusedPage(
32210 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50  pBt, *pPgno, ppP
32220 61 67 65 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29  age, bNoContent)
32230 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
32240 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63  eturn rc;.    rc
32250 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
32260 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e  rite((*ppPage)->
32270 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
32280 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
32290 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
322a0 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
322b0 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30       *ppPage = 0
322c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43  ;.    }.    TRAC
322d0 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
322e0 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c   from end of fil
322f0 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a  e\n", *pPgno));.
32300 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a    }..  assert( *
32310 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42  pPgno!=PENDING_B
32320 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
32330 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  ..end_allocate_p
32340 61 67 65 3a 0a 20 20 72 65 6c 65 61 73 65 50 61  age:.  releasePa
32350 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65  ge(pTrunk);.  re
32360 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54  leasePage(pPrevT
32370 72 75 6e 6b 29 3b 0a 20 20 61 73 73 65 72 74 28  runk);.  assert(
32380 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
32390 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  | sqlite3PagerPa
323a0 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50  geRefcount((*ppP
323b0 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3c 3d  age)->pDbPage)<=
323c0 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  1 );.  assert( r
323d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
323e0 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69  (*ppPage)->isIni
323f0 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  t==0 );.  return
32400 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
32410 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
32420 73 65 64 20 74 6f 20 61 64 64 20 70 61 67 65 20  sed to add page 
32430 69 50 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  iPage to the dat
32440 61 62 61 73 65 20 66 69 6c 65 20 66 72 65 65 2d  abase file free-
32450 6c 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20  list. .** It is 
32460 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
32470 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
32480 65 61 64 79 20 61 20 70 61 72 74 20 6f 66 20 74  eady a part of t
32490 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a  he free-list..**
324a0 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 70 61  .** The value pa
324b0 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
324c0 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
324d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
324e0 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20  optional..** If 
324f0 74 68 65 20 63 61 6c 6c 65 72 20 68 61 70 70 65  the caller happe
32500 6e 73 20 74 6f 20 68 61 76 65 20 61 20 70 6f 69  ns to have a poi
32510 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50  nter to the MemP
32520 61 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63  age object .** c
32530 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
32540 70 61 67 65 20 69 50 61 67 65 20 68 61 6e 64 79  page iPage handy
32550 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 69 74  , it may pass it
32560 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 76   as the second v
32570 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77  alue. .** Otherw
32580 69 73 65 2c 20 69 74 20 6d 61 79 20 70 61 73 73  ise, it may pass
32590 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   NULL..**.** If 
325a0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d  a pointer to a M
325b0 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 69 73  emPage object is
325c0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
325d0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a  econd argument,.
325e0 2a 2a 20 69 74 73 20 72 65 66 65 72 65 6e 63 65  ** its reference
325f0 20 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c   count is not al
32600 74 65 72 65 64 20 62 79 20 74 68 69 73 20 66 75  tered by this fu
32610 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
32620 63 20 69 6e 74 20 66 72 65 65 50 61 67 65 32 28  c int freePage2(
32630 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 4d  BtShared *pBt, M
32640 65 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61 67 65  emPage *pMemPage
32650 2c 20 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20  , Pgno iPage){. 
32660 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b   MemPage *pTrunk
32670 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
32680 20 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73       /* Free-lis
32690 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a  t trunk page */.
326a0 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20    Pgno iTrunk = 
326b0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
326c0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
326d0 6d 62 65 72 20 6f 66 20 66 72 65 65 2d 6c 69 73  mber of free-lis
326e0 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20  t trunk page */ 
326f0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
32700 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
32710 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20  ;      /* Local 
32720 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67  reference to pag
32730 65 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  e 1 */.  MemPage
32740 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20 20   *pPage;        
32750 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32760 50 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64  Page being freed
32770 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a  . May be NULL. *
32780 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
32790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
327a0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
327b0 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n Code */.  int 
327c0 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 20  nFree;          
327d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
327e0 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65  /* Initial numbe
327f0 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 66 72  r of pages on fr
32800 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73  ee-list */..  as
32810 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
32820 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
32830 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
32840 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
32850 69 50 61 67 65 3e 31 20 29 3b 0a 20 20 61 73 73  iPage>1 );.  ass
32860 65 72 74 28 20 21 70 4d 65 6d 50 61 67 65 20 7c  ert( !pMemPage |
32870 7c 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f  | pMemPage->pgno
32880 3d 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20 69 66  ==iPage );..  if
32890 28 20 69 50 61 67 65 3c 32 20 29 20 72 65 74 75  ( iPage<2 ) retu
328a0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
328b0 54 5f 42 4b 50 54 3b 0a 20 20 69 66 28 20 70 4d  T_BKPT;.  if( pM
328c0 65 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50  emPage ){.    pP
328d0 61 67 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a  age = pMemPage;.
328e0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
328f0 52 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61  Ref(pPage->pDbPa
32900 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ge);.  }else{.  
32910 20 20 70 50 61 67 65 20 3d 20 62 74 72 65 65 50    pPage = btreeP
32920 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69  ageLookup(pBt, i
32930 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Page);.  }..  /*
32940 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66   Increment the f
32950 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f  ree page count o
32960 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63  n pPage1 */.  rc
32970 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
32980 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62  rite(pPage1->pDb
32990 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
329a0 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f  ) goto freepage_
329b0 6f 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67  out;.  nFree = g
329c0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
329d0 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70  >aData[36]);.  p
329e0 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
329f0 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65  >aData[36], nFre
32a00 65 2b 31 29 3b 0a 0a 20 20 69 66 28 20 70 42 74  e+1);..  if( pBt
32a10 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
32a20 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29  _SECURE_DELETE )
32a30 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
32a40 73 65 63 75 72 65 5f 64 65 6c 65 74 65 20 6f 70  secure_delete op
32a50 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c  tion is enabled,
32a60 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c 77   then.    ** alw
32a70 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72  ays fully overwr
32a80 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f  ite deleted info
32a90 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72  rmation with zer
32aa0 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  os..    */.    i
32ab0 66 28 20 28 21 70 50 61 67 65 20 26 26 20 28 28  f( (!pPage && ((
32ac0 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
32ad0 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70  e(pBt, iPage, &p
32ae0 50 61 67 65 2c 20 30 29 29 21 3d 30 29 20 29 0a  Page, 0))!=0) ).
32af0 20 20 20 20 20 7c 7c 20 20 20 20 20 20 20 20 20       ||         
32b00 20 20 20 28 28 72 63 20 3d 20 73 71 6c 69 74 65     ((rc = sqlite
32b10 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
32b20 65 2d 3e 70 44 62 50 61 67 65 29 29 21 3d 30 29  e->pDbPage))!=0)
32b30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f  .    ){.      go
32b40 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
32b50 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65  .    }.    memse
32b60 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  t(pPage->aData, 
32b70 30 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70  0, pPage->pBt->p
32b80 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20  ageSize);.  }.. 
32b90 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
32ba0 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74  ase supports aut
32bb0 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20  o-vacuum, write 
32bc0 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  an entry in the 
32bd0 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a  pointer-map.  **
32be0 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61   to indicate tha
32bf0 74 20 74 68 65 20 70 61 67 65 20 69 73 20 66 72  t the page is fr
32c00 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49  ee..  */.  if( I
32c10 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
32c20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
32c30 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f  , iPage, PTRMAP_
32c40 46 52 45 45 50 41 47 45 2c 20 30 2c 20 26 72 63  FREEPAGE, 0, &rc
32c50 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
32c60 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
32c70 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77  t;.  }..  /* Now
32c80 20 6d 61 6e 69 70 75 6c 61 74 65 20 74 68 65 20   manipulate the 
32c90 61 63 74 75 61 6c 20 64 61 74 61 62 61 73 65 20  actual database 
32ca0 66 72 65 65 2d 6c 69 73 74 20 73 74 72 75 63 74  free-list struct
32cb0 75 72 65 2e 20 54 68 65 72 65 20 61 72 65 20 74  ure. There are t
32cc0 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c  wo.  ** possibil
32cd0 69 74 69 65 73 2e 20 49 66 20 74 68 65 20 66 72  ities. If the fr
32ce0 65 65 2d 6c 69 73 74 20 69 73 20 63 75 72 72 65  ee-list is curre
32cf0 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20 69  ntly empty, or i
32d00 66 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a  f the first.  **
32d10 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74   trunk page in t
32d20 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20  he free-list is 
32d30 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73 20  full, then this 
32d40 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65  page will become
32d50 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65 65   a.  ** new free
32d60 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  -list trunk page
32d70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
32d80 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65  will become a le
32d90 61 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66  af of the.  ** f
32da0 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  irst trunk page 
32db0 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 66  in the current f
32dc0 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 62  ree-list. This b
32dd0 6c 6f 63 6b 20 74 65 73 74 73 20 69 66 20 69 74  lock tests if it
32de0 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c  .  ** is possibl
32df0 65 20 74 6f 20 61 64 64 20 74 68 65 20 70 61 67  e to add the pag
32e00 65 20 61 73 20 61 20 6e 65 77 20 66 72 65 65 2d  e as a new free-
32e10 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a  list leaf..  */.
32e20 20 20 69 66 28 20 6e 46 72 65 65 21 3d 30 20 29    if( nFree!=0 )
32e30 7b 0a 20 20 20 20 75 33 32 20 6e 4c 65 61 66 3b  {.    u32 nLeaf;
32e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32e50 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65  /* Initial numbe
32e60 72 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73 20  r of leaf cells 
32e70 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f  on trunk page */
32e80 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67  ..    iTrunk = g
32e90 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
32ea0 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20  >aData[32]);.   
32eb0 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
32ec0 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20  ge(pBt, iTrunk, 
32ed0 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20  &pTrunk, 0);.   
32ee0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
32ef0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
32f00 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
32f10 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66 20     }..    nLeaf 
32f20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
32f30 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20  nk->aData[4]);. 
32f40 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
32f50 75 73 61 62 6c 65 53 69 7a 65 3e 33 32 20 29 3b  usableSize>32 );
32f60 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3e  .    if( nLeaf >
32f70 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c   (u32)pBt->usabl
32f80 65 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20  eSize/4 - 2 ){. 
32f90 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
32fa0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
32fb0 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
32fc0 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
32fd0 20 20 69 66 28 20 6e 4c 65 61 66 20 3c 20 28 75    if( nLeaf < (u
32fe0 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  32)pBt->usableSi
32ff0 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20  ze/4 - 8 ){.    
33000 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73    /* In this cas
33010 65 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20  e there is room 
33020 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67  on the trunk pag
33030 65 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20  e to insert the 
33040 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65  page.      ** be
33050 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20 6e  ing freed as a n
33060 65 77 20 6c 65 61 66 2e 0a 20 20 20 20 20 20 2a  ew leaf..      *
33070 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20  *.      ** Note 
33080 74 68 61 74 20 74 68 65 20 74 72 75 6e 6b 20 70  that the trunk p
33090 61 67 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c  age is not reall
330a0 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20  y full until it 
330b0 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a  contains.      *
330c0 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  * usableSize/4 -
330d0 20 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20   2 entries, not 
330e0 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
330f0 20 65 6e 74 72 69 65 73 20 61 73 20 77 65 20 68   entries as we h
33100 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64  ave.      ** cod
33110 65 64 2e 20 20 42 75 74 20 64 75 65 20 74 6f 20  ed.  But due to 
33120 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20 69  a coding error i
33130 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  n versions of SQ
33140 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 0a 20 20  Lite prior to.  
33150 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61      ** 3.6.0, da
33160 74 61 62 61 73 65 73 20 77 69 74 68 20 66 72 65  tabases with fre
33170 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  elist trunk page
33180 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74  s holding more t
33190 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73 61  han.      ** usa
331a0 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e  bleSize/4 - 8 en
331b0 74 72 69 65 73 20 77 69 6c 6c 20 62 65 20 72 65  tries will be re
331c0 70 6f 72 74 65 64 20 61 73 20 63 6f 72 72 75 70  ported as corrup
331d0 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20 20 20  t.  In order.   
331e0 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69     ** to maintai
331f0 6e 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70  n backwards comp
33200 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f  atibility with o
33210 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  lder versions of
33220 20 53 51 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a   SQLite,.      *
33230 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e  * we will contin
33240 75 65 20 74 6f 20 72 65 73 74 72 69 63 74 20 74  ue to restrict t
33250 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74  he number of ent
33260 72 69 65 73 20 74 6f 20 75 73 61 62 6c 65 53 69  ries to usableSi
33270 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20 20 20 2a  ze/4 - 8.      *
33280 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73  * for now.  At s
33290 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  ome point in the
332a0 20 66 75 74 75 72 65 20 28 6f 6e 63 65 20 65 76   future (once ev
332b0 65 72 79 6f 6e 65 20 68 61 73 20 75 70 67 72 61  eryone has upgra
332c0 64 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ded.      ** to 
332d0 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72 29 20  3.6.0 or later) 
332e0 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64  we should consid
332f0 65 72 20 66 69 78 69 6e 67 20 74 68 65 20 63 6f  er fixing the co
33300 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a  nditional above.
33310 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 61 64        ** to read
33320 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32   "usableSize/4-2
33330 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 75 73  " instead of "us
33340 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20  ableSize/4-8".. 
33350 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
33360 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
33370 31 39 39 32 30 2d 31 31 35 37 36 20 48 6f 77 65  19920-11576 Howe
33380 76 65 72 2c 20 6e 65 77 65 72 20 76 65 72 73 69  ver, newer versi
33390 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 73 74  ons of SQLite st
333a0 69 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61 76 6f  ill.      ** avo
333b0 69 64 20 75 73 69 6e 67 20 74 68 65 20 6c 61 73  id using the las
333c0 74 20 73 69 78 20 65 6e 74 72 69 65 73 20 69 6e  t six entries in
333d0 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 74 72   the freelist tr
333e0 75 6e 6b 20 70 61 67 65 20 61 72 72 61 79 20 69  unk page array i
333f0 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72  n.      ** order
33400 20 74 68 61 74 20 64 61 74 61 62 61 73 65 20 66   that database f
33410 69 6c 65 73 20 63 72 65 61 74 65 64 20 62 79 20  iles created by 
33420 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  newer versions o
33430 66 20 53 51 4c 69 74 65 20 63 61 6e 20 62 65 0a  f SQLite can be.
33440 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 62 79        ** read by
33450 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20   older versions 
33460 6f 66 20 53 51 4c 69 74 65 2e 0a 20 20 20 20 20  of SQLite..     
33470 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
33480 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
33490 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
334a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
334b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
334c0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
334d0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d  pTrunk->aData[4]
334e0 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20 20  , nLeaf+1);.    
334f0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54      put4byte(&pT
33500 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c  runk->aData[8+nL
33510 65 61 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b 0a  eaf*4], iPage);.
33520 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
33530 65 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c  e && (pBt->btsFl
33540 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45  ags & BTS_SECURE
33550 5f 44 45 4c 45 54 45 29 3d 3d 30 20 29 7b 0a 20  _DELETE)==0 ){. 
33560 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
33570 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70  PagerDontWrite(p
33580 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
33590 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
335a0 20 20 72 63 20 3d 20 62 74 72 65 65 53 65 74 48    rc = btreeSetH
335b0 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 69  asContent(pBt, i
335c0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
335d0 20 20 20 20 20 54 52 41 43 45 28 28 22 46 52 45       TRACE(("FRE
335e0 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66 20  E-PAGE: %d leaf 
335f0 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64  on trunk page %d
33600 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  \n",pPage->pgno,
33610 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a  pTrunk->pgno));.
33620 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
33630 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
33640 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74   }..  /* If cont
33650 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68 69  rol flows to thi
33660 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69 74  s point, then it
33670 20 77 61 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c   was not possibl
33680 65 20 74 6f 20 61 64 64 20 74 68 65 0a 20 20 2a  e to add the.  *
33690 2a 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67  * the page being
336a0 20 66 72 65 65 64 20 61 73 20 61 20 6c 65 61 66   freed as a leaf
336b0 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 72   page of the fir
336c0 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20  st trunk in the 
336d0 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20  free-list..  ** 
336e0 50 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73 65  Possibly because
336f0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
33700 73 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73 73  s empty, or poss
33710 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65  ibly because the
33720 20 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75   .  ** first tru
33730 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  nk in the free-l
33740 69 73 74 20 69 73 20 66 75 6c 6c 2e 20 45 69 74  ist is full. Eit
33750 68 65 72 20 77 61 79 2c 20 74 68 65 20 70 61 67  her way, the pag
33760 65 20 62 65 69 6e 67 20 66 72 65 65 64 0a 20 20  e being freed.  
33770 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  ** will become t
33780 68 65 20 6e 65 77 20 66 69 72 73 74 20 74 72 75  he new first tru
33790 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66  nk page in the f
337a0 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20  ree-list..  */. 
337b0 20 69 66 28 20 70 50 61 67 65 3d 3d 30 20 26 26   if( pPage==0 &&
337c0 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
337d0 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
337e0 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67  Bt, iPage, &pPag
337f0 65 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 67 6f  e, 0)) ){.    go
33800 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
33810 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
33820 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
33830 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
33840 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
33850 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66  OK ){.    goto f
33860 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d  reepage_out;.  }
33870 0a 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67  .  put4byte(pPag
33880 65 2d 3e 61 44 61 74 61 2c 20 69 54 72 75 6e 6b  e->aData, iTrunk
33890 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
338a0 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20  Page->aData[4], 
338b0 30 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  0);.  put4byte(&
338c0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
338d0 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 54 52 41  ], iPage);.  TRA
338e0 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20  CE(("FREE-PAGE: 
338f0 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67  %d new trunk pag
33900 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e  e replacing %d\n
33910 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20  ", pPage->pgno, 
33920 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70  iTrunk));..freep
33930 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70  age_out:.  if( p
33940 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67  Page ){.    pPag
33950 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  e->isInit = 0;. 
33960 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65   }.  releasePage
33970 28 70 50 61 67 65 29 3b 0a 20 20 72 65 6c 65 61  (pPage);.  relea
33980 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a  sePage(pTrunk);.
33990 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73    return rc;.}.s
339a0 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 50  tatic void freeP
339b0 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
339c0 67 65 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20  ge, int *pRC){. 
339d0 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c   if( (*pRC)==SQL
339e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70  ITE_OK ){.    *p
339f0 52 43 20 3d 20 66 72 65 65 50 61 67 65 32 28 70  RC = freePage2(p
33a00 50 61 67 65 2d 3e 70 42 74 2c 20 70 50 61 67 65  Page->pBt, pPage
33a10 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  , pPage->pgno);.
33a20 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65    }.}../*.** Fre
33a30 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70  e any overflow p
33a40 61 67 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ages associated 
33a50 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 43  with the given C
33a60 65 6c 6c 2e 20 20 57 72 69 74 65 20 74 68 65 0a  ell.  Write the.
33a70 2a 2a 20 6c 6f 63 61 6c 20 43 65 6c 6c 20 73 69  ** local Cell si
33a80 7a 65 20 28 74 68 65 20 6e 75 6d 62 65 72 20 6f  ze (the number o
33a90 66 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20 6f  f bytes on the o
33aa0 72 69 67 69 6e 61 6c 20 70 61 67 65 2c 20 6f 6d  riginal page, om
33ab0 69 74 74 69 6e 67 0a 2a 2a 20 6f 76 65 72 66 6c  itting.** overfl
33ac0 6f 77 29 20 69 6e 74 6f 20 2a 70 6e 53 69 7a 65  ow) into *pnSize
33ad0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
33ae0 63 6c 65 61 72 43 65 6c 6c 28 0a 20 20 4d 65 6d  clearCell(.  Mem
33af0 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
33b00 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
33b10 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
33b20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 75 6e  the Cell */.  un
33b30 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
33b40 6c 6c 2c 20 20 20 20 2f 2a 20 46 69 72 73 74 20  ll,    /* First 
33b50 62 79 74 65 20 6f 66 20 74 68 65 20 43 65 6c 6c  byte of the Cell
33b60 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a   */.  CellInfo *
33b70 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 20 2f  pInfo          /
33b80 2a 20 53 69 7a 65 20 69 6e 66 6f 72 6d 61 74 69  * Size informati
33b90 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 65 6c  on about the cel
33ba0 6c 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72  l */.){.  BtShar
33bb0 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
33bc0 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 6f 76 66  >pBt;.  Pgno ovf
33bd0 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b  lPgno;.  int rc;
33be0 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20  .  int nOvfl;.  
33bf0 75 33 32 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  u32 ovflPageSize
33c00 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
33c10 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
33c20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
33c30 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 78  x) );.  pPage->x
33c40 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  ParseCell(pPage,
33c50 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a   pCell, pInfo);.
33c60 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 4c 6f    if( pInfo->nLo
33c70 63 61 6c 3d 3d 70 49 6e 66 6f 2d 3e 6e 50 61 79  cal==pInfo->nPay
33c80 6c 6f 61 64 20 29 7b 0a 20 20 20 20 72 65 74 75  load ){.    retu
33c90 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f  rn SQLITE_OK;  /
33ca0 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  * No overflow pa
33cb0 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68  ges. Return with
33cc0 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  out doing anythi
33cd0 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  ng */.  }.  if( 
33ce0 70 43 65 6c 6c 2b 70 49 6e 66 6f 2d 3e 6e 53 69  pCell+pInfo->nSi
33cf0 7a 65 2d 31 20 3e 20 70 50 61 67 65 2d 3e 61 44  ze-1 > pPage->aD
33d00 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50  ata+pPage->maskP
33d10 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  age ){.    retur
33d20 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
33d30 5f 42 4b 50 54 3b 20 20 2f 2a 20 43 65 6c 6c 20  _BKPT;  /* Cell 
33d40 65 78 74 65 6e 64 73 20 70 61 73 74 20 65 6e 64  extends past end
33d50 20 6f 66 20 70 61 67 65 20 2a 2f 0a 20 20 7d 0a   of page */.  }.
33d60 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74    ovflPgno = get
33d70 34 62 79 74 65 28 70 43 65 6c 6c 20 2b 20 70 49  4byte(pCell + pI
33d80 6e 66 6f 2d 3e 6e 53 69 7a 65 20 2d 20 34 29 3b  nfo->nSize - 4);
33d90 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
33da0 75 73 61 62 6c 65 53 69 7a 65 20 3e 20 34 20 29  usableSize > 4 )
33db0 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  ;.  ovflPageSize
33dc0 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
33dd0 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20  ze - 4;.  nOvfl 
33de0 3d 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  = (pInfo->nPaylo
33df0 61 64 20 2d 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  ad - pInfo->nLoc
33e00 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a  al + ovflPageSiz
33e10 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65 53  e - 1)/ovflPageS
33e20 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ize;.  assert( n
33e30 4f 76 66 6c 3e 30 20 7c 7c 20 0a 20 20 20 20 28  Ovfl>0 || .    (
33e40 43 4f 52 52 55 50 54 5f 44 42 20 26 26 20 28 70  CORRUPT_DB && (p
33e50 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 2b  Info->nPayload +
33e60 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 29 3c 6f   ovflPageSize)<o
33e70 76 66 6c 50 61 67 65 53 69 7a 65 29 0a 20 20 29  vflPageSize).  )
33e80 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c  ;.  while( nOvfl
33e90 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69  -- ){.    Pgno i
33ea0 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65  Next = 0;.    Me
33eb0 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30  mPage *pOvfl = 0
33ec0 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50 67  ;.    if( ovflPg
33ed0 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f  no<2 || ovflPgno
33ee0 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28  >btreePagecount(
33ef0 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  pBt) ){.      /*
33f00 20 30 20 69 73 20 6e 6f 74 20 61 20 6c 65 67 61   0 is not a lega
33f10 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e  l page number an
33f20 64 20 70 61 67 65 20 31 20 63 61 6e 6e 6f 74 20  d page 1 cannot 
33f30 62 65 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20  be an .      ** 
33f40 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 54  overflow page. T
33f50 68 65 72 65 66 6f 72 65 20 69 66 20 6f 76 66 6c  herefore if ovfl
33f60 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20 74  Pgno<2 or past t
33f70 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a 20  he end of the . 
33f80 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 74 68 65       ** file the
33f90 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
33fa0 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20  e corrupt. */.  
33fb0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
33fc0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
33fd0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f      }.    if( nO
33fe0 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  vfl ){.      rc 
33ff0 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  = getOverflowPag
34000 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c  e(pBt, ovflPgno,
34010 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29   &pOvfl, &iNext)
34020 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
34030 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
34040 7d 0a 0a 20 20 20 20 69 66 28 20 28 20 70 4f 76  }..    if( ( pOv
34050 66 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d 20  fl || ((pOvfl = 
34060 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28  btreePageLookup(
34070 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29 21  pBt, ovflPgno))!
34080 3d 30 29 20 29 0a 20 20 20 20 20 26 26 20 73 71  =0) ).     && sq
34090 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
340a0 66 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70 44  fcount(pOvfl->pD
340b0 62 50 61 67 65 29 21 3d 31 0a 20 20 20 20 29 7b  bPage)!=1.    ){
340c0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20  .      /* There 
340d0 69 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e 79  is no reason any
340e0 20 63 75 72 73 6f 72 20 73 68 6f 75 6c 64 20 68   cursor should h
340f0 61 76 65 20 61 6e 20 6f 75 74 73 74 61 6e 64 69  ave an outstandi
34100 6e 67 20 72 65 66 65 72 65 6e 63 65 20 0a 20 20  ng reference .  
34110 20 20 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76 65      ** to an ove
34120 72 66 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f 6e  rflow page belon
34130 67 69 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20 74  ging to a cell t
34140 68 61 74 20 69 73 20 62 65 69 6e 67 20 64 65 6c  hat is being del
34150 65 74 65 64 2f 75 70 64 61 74 65 64 2e 0a 20 20  eted/updated..  
34160 20 20 20 20 2a 2a 20 53 6f 20 69 66 20 74 68 65      ** So if the
34170 72 65 20 65 78 69 73 74 73 20 6d 6f 72 65 20 74  re exists more t
34180 68 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e 63  han one referenc
34190 65 20 74 6f 20 74 68 69 73 20 70 61 67 65 2c 20  e to this page, 
341a0 74 68 65 6e 20 69 74 20 0a 20 20 20 20 20 20 2a  then it .      *
341b0 2a 20 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c 6c  * must not reall
341c0 79 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  y be an overflow
341d0 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 64 61   page and the da
341e0 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63  tabase must be c
341f0 6f 72 72 75 70 74 2e 20 0a 20 20 20 20 20 20 2a  orrupt. .      *
34200 2a 20 49 74 20 69 73 20 68 65 6c 70 66 75 6c 20  * It is helpful 
34210 74 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 62  to detect this b
34220 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66 72  efore calling fr
34230 65 65 50 61 67 65 32 28 29 2c 20 61 73 20 0a 20  eePage2(), as . 
34240 20 20 20 20 20 2a 2a 20 66 72 65 65 50 61 67 65       ** freePage
34250 32 28 29 20 6d 61 79 20 7a 65 72 6f 20 74 68 65  2() may zero the
34260 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 69   page contents i
34270 66 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20  f secure-delete 
34280 6d 6f 64 65 20 69 73 0a 20 20 20 20 20 20 2a 2a  mode is.      **
34290 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 69   enabled. If thi
342a0 73 20 27 6f 76 65 72 66 6c 6f 77 27 20 70 61 67  s 'overflow' pag
342b0 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20  e happens to be 
342c0 61 20 70 61 67 65 20 74 68 61 74 20 74 68 65 0a  a page that the.
342d0 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20        ** caller 
342e0 69 73 20 69 74 65 72 61 74 69 6e 67 20 74 68 72  is iterating thr
342f0 6f 75 67 68 20 6f 72 20 75 73 69 6e 67 20 69 6e  ough or using in
34300 20 73 6f 6d 65 20 6f 74 68 65 72 20 77 61 79 2c   some other way,
34310 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 63   this.      ** c
34320 61 6e 20 62 65 20 70 72 6f 62 6c 65 6d 61 74 69  an be problemati
34330 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  c..      */.    
34340 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
34350 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
34360 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
34370 3d 20 66 72 65 65 50 61 67 65 32 28 70 42 74 2c  = freePage2(pBt,
34380 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f   pOvfl, ovflPgno
34390 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
343a0 28 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20  ( pOvfl ){.     
343b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
343c0 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67  ef(pOvfl->pDbPag
343d0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
343e0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
343f0 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d  ;.    ovflPgno =
34400 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65   iNext;.  }.  re
34410 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
34420 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
34430 74 68 65 20 62 79 74 65 20 73 65 71 75 65 6e 63  the byte sequenc
34440 65 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73  e used to repres
34450 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61  ent a cell on pa
34460 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20  ge pPage.** and 
34470 77 72 69 74 65 20 74 68 61 74 20 62 79 74 65 20  write that byte 
34480 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70 43  sequence into pC
34490 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77  ell[].  Overflow
344a0 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c   pages are.** al
344b0 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c 6c  located and fill
344c0 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73 61  ed in as necessa
344d0 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67  ry.  The calling
344e0 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73   procedure.** is
344f0 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
34500 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75 66   making sure suf
34510 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 68 61  ficient space ha
34520 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
34530 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e  .** for pCell[].
34540 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
34550 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20   pCell does not 
34560 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64 20 74  necessary need t
34570 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70  o point to the p
34580 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61  Page->aData.** a
34590 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68  rea.  pCell migh
345a0 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20  t point to some 
345b0 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67  temporary storag
345c0 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69 6c  e.  The cell wil
345d0 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75 63  l.** be construc
345e0 74 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d 70  ted in this temp
345f0 6f 72 61 72 79 20 61 72 65 61 20 74 68 65 6e 20  orary area then 
34600 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61 67  copied into pPag
34610 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65  e->aData.** late
34620 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
34630 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d   fillInCell(.  M
34640 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
34650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34660 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63   The page that c
34670 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c  ontains the cell
34680 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
34690 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20  har *pCell,     
346a0 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65       /* Complete
346b0 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 65 6c   text of the cel
346c0 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 42 74 72  l */.  const Btr
346d0 65 65 50 61 79 6c 6f 61 64 20 2a 70 58 2c 20 20  eePayload *pX,  
346e0 20 20 20 20 20 20 2f 2a 20 50 61 79 6c 6f 61 64        /* Payload
346f0 20 77 69 74 68 20 77 68 69 63 68 20 74 6f 20 63   with which to c
34700 6f 6e 73 74 72 75 63 74 20 74 68 65 20 63 65 6c  onstruct the cel
34710 6c 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69  l */.  int *pnSi
34720 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ze              
34730 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63        /* Write c
34740 65 6c 6c 20 73 69 7a 65 20 68 65 72 65 20 2a 2f  ell size here */
34750 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f  .){.  int nPaylo
34760 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  ad;.  const u8 *
34770 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63  pSrc;.  int nSrc
34780 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73  , n, rc;.  int s
34790 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50  paceLeft;.  MemP
347a0 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a  age *pOvfl = 0;.
347b0 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52 65    MemPage *pToRe
347c0 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73  lease = 0;.  uns
347d0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69  igned char *pPri
347e0 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  or;.  unsigned c
347f0 68 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20  har *pPayload;. 
34800 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
34810 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50   pPage->pBt;.  P
34820 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30  gno pgnoOvfl = 0
34830 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b  ;.  int nHeader;
34840 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
34850 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
34860 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
34870 29 20 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65  ) );..  /* pPage
34880 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
34890 69 6c 79 20 77 72 69 74 65 61 62 6c 65 20 73 69  ily writeable si
348a0 6e 63 65 20 70 43 65 6c 6c 20 6d 69 67 68 74 20  nce pCell might 
348b0 62 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a  be auxiliary.  *
348c0 2a 20 62 75 66 66 65 72 20 73 70 61 63 65 20 74  * buffer space t
348d0 68 61 74 20 69 73 20 73 65 70 61 72 61 74 65 20  hat is separate 
348e0 66 72 6f 6d 20 74 68 65 20 70 50 61 67 65 20 62  from the pPage b
348f0 75 66 66 65 72 20 61 72 65 61 20 2a 2f 0a 20 20  uffer area */.  
34900 61 73 73 65 72 74 28 20 70 43 65 6c 6c 3c 70 50  assert( pCell<pP
34910 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 43  age->aData || pC
34920 65 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61  ell>=&pPage->aDa
34930 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ta[pBt->pageSize
34940 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ].            ||
34950 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
34960 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
34970 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f  pDbPage) );..  /
34980 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 68 65  * Fill in the he
34990 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64  ader. */.  nHead
349a0 65 72 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c  er = pPage->chil
349b0 64 50 74 72 53 69 7a 65 3b 0a 20 20 69 66 28 20  dPtrSize;.  if( 
349c0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
349d0 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20  .    nPayload = 
349e0 70 58 2d 3e 6e 44 61 74 61 20 2b 20 70 58 2d 3e  pX->nData + pX->
349f0 6e 5a 65 72 6f 3b 0a 20 20 20 20 70 53 72 63 20  nZero;.    pSrc 
34a00 3d 20 70 58 2d 3e 70 44 61 74 61 3b 0a 20 20 20  = pX->pData;.   
34a10 20 6e 53 72 63 20 3d 20 70 58 2d 3e 6e 44 61 74   nSrc = pX->nDat
34a20 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  a;.    assert( p
34a30 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  Page->intKeyLeaf
34a40 20 29 3b 20 2f 2a 20 66 69 6c 6c 49 6e 43 65 6c   ); /* fillInCel
34a50 6c 28 29 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20  l() only called 
34a60 66 6f 72 20 6c 65 61 76 65 73 20 2a 2f 0a 20 20  for leaves */.  
34a70 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74    nHeader += put
34a80 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b  Varint32(&pCell[
34a90 6e 48 65 61 64 65 72 5d 2c 20 6e 50 61 79 6c 6f  nHeader], nPaylo
34aa0 61 64 29 3b 0a 20 20 20 20 6e 48 65 61 64 65 72  ad);.    nHeader
34ab0 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70   += putVarint(&p
34ac0 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a  Cell[nHeader], *
34ad0 28 75 36 34 2a 29 26 70 58 2d 3e 6e 4b 65 79 29  (u64*)&pX->nKey)
34ae0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
34af0 73 73 65 72 74 28 20 70 58 2d 3e 6e 4b 65 79 3c  ssert( pX->nKey<
34b00 3d 30 78 37 66 66 66 66 66 66 66 20 26 26 20 70  =0x7fffffff && p
34b10 58 2d 3e 70 4b 65 79 21 3d 30 20 29 3b 0a 20 20  X->pKey!=0 );.  
34b20 20 20 6e 53 72 63 20 3d 20 6e 50 61 79 6c 6f 61    nSrc = nPayloa
34b30 64 20 3d 20 28 69 6e 74 29 70 58 2d 3e 6e 4b 65  d = (int)pX->nKe
34b40 79 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 58  y;.    pSrc = pX
34b50 2d 3e 70 4b 65 79 3b 0a 20 20 20 20 6e 48 65 61  ->pKey;.    nHea
34b60 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74  der += putVarint
34b70 33 32 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65  32(&pCell[nHeade
34b80 72 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20  r], nPayload);. 
34b90 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20   }.  .  /* Fill 
34ba0 69 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20 2a  in the payload *
34bb0 2f 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64  /.  if( nPayload
34bc0 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  <=pPage->maxLoca
34bd0 6c 20 29 7b 0a 20 20 20 20 6e 20 3d 20 6e 48 65  l ){.    n = nHe
34be0 61 64 65 72 20 2b 20 6e 50 61 79 6c 6f 61 64 3b  ader + nPayload;
34bf0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
34c00 3d 3d 33 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ==3 );.    testc
34c10 61 73 65 28 20 6e 3d 3d 34 20 29 3b 0a 20 20 20  ase( n==4 );.   
34c20 20 69 66 28 20 6e 3c 34 20 29 20 6e 20 3d 20 34   if( n<4 ) n = 4
34c30 3b 0a 20 20 20 20 2a 70 6e 53 69 7a 65 20 3d 20  ;.    *pnSize = 
34c40 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74  n;.    spaceLeft
34c50 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20   = nPayload;.   
34c60 20 70 50 72 69 6f 72 20 3d 20 70 43 65 6c 6c 3b   pPrior = pCell;
34c70 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
34c80 74 20 6d 6e 20 3d 20 70 50 61 67 65 2d 3e 6d 69  t mn = pPage->mi
34c90 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 20 3d 20  nLocal;.    n = 
34ca0 6d 6e 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d  mn + (nPayload -
34cb0 20 6d 6e 29 20 25 20 28 70 50 61 67 65 2d 3e 70   mn) % (pPage->p
34cc0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
34cd0 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73   4);.    testcas
34ce0 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  e( n==pPage->max
34cf0 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65 73  Local );.    tes
34d00 74 63 61 73 65 28 20 6e 3d 3d 70 50 61 67 65 2d  tcase( n==pPage-
34d10 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
34d20 20 20 20 69 66 28 20 6e 20 3e 20 70 50 61 67 65     if( n > pPage
34d30 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 20 6e 20 3d  ->maxLocal ) n =
34d40 20 6d 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65   mn;.    spaceLe
34d50 66 74 20 3d 20 6e 3b 0a 20 20 20 20 2a 70 6e 53  ft = n;.    *pnS
34d60 69 7a 65 20 3d 20 6e 20 2b 20 6e 48 65 61 64 65  ize = n + nHeade
34d70 72 20 2b 20 34 3b 0a 20 20 20 20 70 50 72 69 6f  r + 4;.    pPrio
34d80 72 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64  r = &pCell[nHead
34d90 65 72 2b 6e 5d 3b 0a 20 20 7d 0a 20 20 70 50 61  er+n];.  }.  pPa
34da0 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e  yload = &pCell[n
34db0 48 65 61 64 65 72 5d 3b 0a 0a 20 20 2f 2a 20 41  Header];..  /* A
34dc0 74 20 74 68 69 73 20 70 6f 69 6e 74 20 76 61 72  t this point var
34dd0 69 61 62 6c 65 73 20 73 68 6f 75 6c 64 20 62 65  iables should be
34de0 20 73 65 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a   set as follows:
34df0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 6e 50 61  .  **.  **   nPa
34e00 79 6c 6f 61 64 20 20 20 20 20 20 20 20 20 20 20  yload           
34e10 54 6f 74 61 6c 20 70 61 79 6c 6f 61 64 20 73 69  Total payload si
34e20 7a 65 20 69 6e 20 62 79 74 65 73 0a 20 20 2a 2a  ze in bytes.  **
34e30 20 20 20 70 50 61 79 6c 6f 61 64 20 20 20 20 20     pPayload     
34e40 20 20 20 20 20 20 42 65 67 69 6e 20 77 72 69 74        Begin writ
34e50 69 6e 67 20 70 61 79 6c 6f 61 64 20 68 65 72 65  ing payload here
34e60 0a 20 20 2a 2a 20 20 20 73 70 61 63 65 4c 65 66  .  **   spaceLef
34e70 74 20 20 20 20 20 20 20 20 20 20 53 70 61 63 65  t          Space
34e80 20 61 76 61 69 6c 61 62 6c 65 20 61 74 20 70 50   available at pP
34e90 61 79 6c 6f 61 64 2e 20 20 49 66 20 6e 50 61 79  ayload.  If nPay
34ea0 6c 6f 61 64 3e 73 70 61 63 65 4c 65 66 74 2c 0a  load>spaceLeft,.
34eb0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
34ec0 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20 6d            that m
34ed0 65 61 6e 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73  eans content mus
34ee0 74 20 73 70 69 6c 6c 20 69 6e 74 6f 20 6f 76 65  t spill into ove
34ef0 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20 2a  rflow pages..  *
34f00 2a 20 20 20 2a 70 6e 53 69 7a 65 20 20 20 20 20  *   *pnSize     
34f10 20 20 20 20 20 20 20 53 69 7a 65 20 6f 66 20 74         Size of t
34f20 68 65 20 6c 6f 63 61 6c 20 63 65 6c 6c 20 28 6e  he local cell (n
34f30 6f 74 20 63 6f 75 6e 74 69 6e 67 20 6f 76 65 72  ot counting over
34f40 66 6c 6f 77 20 70 61 67 65 73 29 0a 20 20 2a 2a  flow pages).  **
34f50 20 20 20 70 50 72 69 6f 72 20 20 20 20 20 20 20     pPrior       
34f60 20 20 20 20 20 20 57 68 65 72 65 20 74 6f 20 77        Where to w
34f70 72 69 74 65 20 74 68 65 20 70 67 6e 6f 20 6f 66  rite the pgno of
34f80 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66   the first overf
34f90 6c 6f 77 20 70 61 67 65 0a 20 20 2a 2a 0a 20 20  low page.  **.  
34fa0 2a 2a 20 55 73 65 20 61 20 63 61 6c 6c 20 74 6f  ** Use a call to
34fb0 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
34fc0 74 72 28 29 20 74 6f 20 76 65 72 69 66 79 20 74  tr() to verify t
34fd0 68 61 74 20 74 68 65 20 76 61 6c 75 65 73 20 61  hat the values a
34fe0 62 6f 76 65 0a 20 20 2a 2a 20 77 65 72 65 20 63  bove.  ** were c
34ff0 6f 6d 70 75 74 65 64 20 63 6f 72 72 65 63 74 6c  omputed correctl
35000 79 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  y..  */.#ifdef S
35010 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 7b 0a  QLITE_DEBUG.  {.
35020 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
35030 6f 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 78 50  o;.    pPage->xP
35040 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
35050 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
35060 20 20 20 61 73 73 65 72 74 28 20 6e 48 65 61 64     assert( nHead
35070 65 72 3d 3d 28 69 6e 74 29 28 69 6e 66 6f 2e 70  er==(int)(info.p
35080 50 61 79 6c 6f 61 64 20 2d 20 70 43 65 6c 6c 29  Payload - pCell)
35090 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
350a0 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 70 58 2d 3e 6e  info.nKey==pX->n
350b0 4b 65 79 20 29 3b 0a 20 20 20 20 61 73 73 65 72  Key );.    asser
350c0 74 28 20 2a 70 6e 53 69 7a 65 20 3d 3d 20 69 6e  t( *pnSize == in
350d0 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 20 20  fo.nSize );.    
350e0 61 73 73 65 72 74 28 20 73 70 61 63 65 4c 65 66  assert( spaceLef
350f0 74 20 3d 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  t == info.nLocal
35100 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   );.  }.#endif..
35110 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70    /* Write the p
35120 61 79 6c 6f 61 64 20 69 6e 74 6f 20 74 68 65 20  ayload into the 
35130 6c 6f 63 61 6c 20 43 65 6c 6c 20 61 6e 64 20 61  local Cell and a
35140 6e 79 20 65 78 74 72 61 20 69 6e 74 6f 20 6f 76  ny extra into ov
35150 65 72 66 6c 6f 77 20 70 61 67 65 73 20 2a 2f 0a  erflow pages */.
35160 20 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61    while( nPayloa
35170 64 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73  d>0 ){.    if( s
35180 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23  paceLeft==0 ){.#
35190 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
351a0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
351b0 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72      Pgno pgnoPtr
351c0 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20  map = pgnoOvfl; 
351d0 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65  /* Overflow page
351e0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
351f0 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ry page */.     
35200 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
35210 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  cuum ){.        
35220 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67  do{.          pg
35230 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20  noOvfl++;.      
35240 20 20 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20    } while( .    
35250 20 20 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50        PTRMAP_ISP
35260 41 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66  AGE(pBt, pgnoOvf
35270 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d  l) || pgnoOvfl==
35280 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
35290 45 28 70 42 74 29 20 0a 20 20 20 20 20 20 20 20  E(pBt) .        
352a0 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
352b0 66 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c  f.      rc = all
352c0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
352d0 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e  Bt, &pOvfl, &pgn
352e0 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c  oOvfl, pgnoOvfl,
352f0 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c   0);.#ifndef SQL
35300 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
35310 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  UUM.      /* If 
35320 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70  the database sup
35330 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
35340 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e  m, and the secon
35350 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a  d or subsequent.
35360 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f        ** overflo
35370 77 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  w page is being 
35380 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61  allocated, add a
35390 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70  n entry to the p
353a0 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20  ointer-map.     
353b0 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67   ** for that pag
353c0 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a  e now. .      **
353d0 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69  .      ** If thi
353e0 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f  s is the first o
353f0 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68  verflow page, th
35400 65 6e 20 77 72 69 74 65 20 61 20 70 61 72 74 69  en write a parti
35410 61 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20  al entry .      
35420 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65  ** to the pointe
35430 72 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69  r-map. If we wri
35440 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68  te nothing to th
35450 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73  is pointer-map s
35460 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  lot,.      ** th
35470 65 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69  en the optimisti
35480 63 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  c overflow chain
35490 20 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63   processing in c
354a0 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20  learCell().     
354b0 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72   ** may misinter
354c0 70 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69  pret the uniniti
354d0 61 6c 69 7a 65 64 20 76 61 6c 75 65 73 20 61 6e  alized values an
354e0 64 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20  d delete the.   
354f0 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65     ** wrong page
35500 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  s from the datab
35510 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ase..      */.  
35520 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
35530 6f 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53  oVacuum && rc==S
35540 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
35550 20 20 20 20 75 38 20 65 54 79 70 65 20 3d 20 28      u8 eType = (
35560 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41  pgnoPtrmap?PTRMA
35570 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d  P_OVERFLOW2:PTRM
35580 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20  AP_OVERFLOW1);. 
35590 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74         ptrmapPut
355a0 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20  (pBt, pgnoOvfl, 
355b0 65 54 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61  eType, pgnoPtrma
355c0 70 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20  p, &rc);.       
355d0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
355e0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
355f0 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20  (pOvfl);.       
35600 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69   }.      }.#endi
35610 66 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  f.      if( rc )
35620 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
35630 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
35640 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
35650 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  n rc;.      }.. 
35660 20 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65       /* If pToRe
35670 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72  lease is not zer
35680 6f 20 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f  o than pPrior po
35690 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61  ints into the da
356a0 74 61 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a  ta area.      **
356b0 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20   of pToRelease. 
356c0 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65   Make sure pToRe
356d0 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77  lease is still w
356e0 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20  riteable. */.   
356f0 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65     assert( pToRe
35700 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69  lease==0 || sqli
35710 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
35720 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e  ble(pToRelease->
35730 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
35740 20 20 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20     /* If pPrior 
35750 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  is part of the d
35760 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67  ata area of pPag
35770 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72  e, then make sur
35780 65 20 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a  e pPage.      **
35790 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
357a0 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ble */.      ass
357b0 65 72 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67  ert( pPrior<pPag
357c0 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69  e->aData || pPri
357d0 6f 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74  or>=&pPage->aDat
357e0 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  a[pBt->pageSize]
357f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
35800 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
35810 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
35820 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
35830 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f    put4byte(pPrio
35840 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20  r, pgnoOvfl);.  
35850 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
35860 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20  pToRelease);.   
35870 20 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20     pToRelease = 
35880 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72  pOvfl;.      pPr
35890 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61  ior = pOvfl->aDa
358a0 74 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  ta;.      put4by
358b0 74 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20  te(pPrior, 0);. 
358c0 20 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20       pPayload = 
358d0 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d  &pOvfl->aData[4]
358e0 3b 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65 66  ;.      spaceLef
358f0 74 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  t = pBt->usableS
35900 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20  ize - 4;.    }. 
35910 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b     n = nPayload;
35920 0a 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65  .    if( n>space
35930 4c 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65  Left ) n = space
35940 4c 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  Left;..    /* If
35950 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e   pToRelease is n
35960 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61  ot zero than pPa
35970 79 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74  yload points int
35980 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a  o the data area.
35990 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c      ** of pToRel
359a0 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65  ease.  Make sure
359b0 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73   pToRelease is s
359c0 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20  till writeable. 
359d0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
359e0 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20  ToRelease==0 || 
359f0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
35a00 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61  iteable(pToRelea
35a10 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  se->pDbPage) );.
35a20 0a 20 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c  .    /* If pPayl
35a30 6f 61 64 20 69 73 20 70 61 72 74 20 6f 66 20 74  oad is part of t
35a40 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 20  he data area of 
35a50 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65  pPage, then make
35a60 20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20 20   sure pPage.    
35a70 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  ** is still writ
35a80 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73  eable */.    ass
35a90 65 72 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50  ert( pPayload<pP
35aa0 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50  age->aData || pP
35ab0 61 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e  ayload>=&pPage->
35ac0 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53  aData[pBt->pageS
35ad0 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20  ize].           
35ae0 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
35af0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
35b00 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
35b10 20 20 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29      if( nSrc>0 )
35b20 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53  {.      if( n>nS
35b30 72 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20  rc ) n = nSrc;. 
35b40 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72       assert( pSr
35b50 63 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  c );.      memcp
35b60 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63  y(pPayload, pSrc
35b70 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , n);.    }else{
35b80 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50  .      memset(pP
35b90 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20  ayload, 0, n);. 
35ba0 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61     }.    nPayloa
35bb0 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79  d -= n;.    pPay
35bc0 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70  load += n;.    p
35bd0 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53  Src += n;.    nS
35be0 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61  rc -= n;.    spa
35bf0 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 7d  ceLeft -= n;.  }
35c00 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
35c10 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65  ToRelease);.  re
35c20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
35c30 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
35c40 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72  the i-th cell fr
35c50 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73 20  om pPage.  This 
35c60 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73 20  routine effects 
35c70 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54  pPage only..** T
35c80 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
35c90 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20  is not freed or 
35ca0 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74  deallocated.  It
35cb0 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
35cc0 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  .** the cell con
35cd0 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f  tent has been co
35ce0 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65  pied someplace e
35cf0 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  lse.  This routi
35d00 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76  ne just.** remov
35d10 65 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  es the reference
35d20 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f   to the cell fro
35d30 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22  m pPage..**.** "
35d40 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65 20  sz" must be the 
35d50 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
35d60 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a  in the cell..*/.
35d70 73 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70  static void drop
35d80 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50  Cell(MemPage *pP
35d90 61 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e  age, int idx, in
35da0 74 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b  t sz, int *pRC){
35db0 0a 20 20 75 33 32 20 70 63 3b 20 20 20 20 20 20  .  u32 pc;      
35dc0 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
35dd0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20  cell content of 
35de0 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74  cell being delet
35df0 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61  ed */.  u8 *data
35e00 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65  ;       /* pPage
35e10 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20  ->aData */.  u8 
35e20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  *ptr;        /* 
35e30 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74  Used to move byt
35e40 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e  es around within
35e50 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
35e60 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   rc;         /* 
35e70 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  The return code 
35e80 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
35e90 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e       /* Beginnin
35ea0 67 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 2e  g of the header.
35eb0 20 20 30 20 6d 6f 73 74 20 70 61 67 65 73 2e 20    0 most pages. 
35ec0 20 31 30 30 20 70 61 67 65 20 31 20 2a 2f 0a 0a   100 page 1 */..
35ed0 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
35ee0 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 69  urn;.  assert( i
35ef0 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50 61  dx>=0 && idx<pPa
35f00 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61  ge->nCell );.  a
35f10 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
35f20 42 20 7c 7c 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a  B || sz==cellSiz
35f30 65 28 70 50 61 67 65 2c 20 69 64 78 29 20 29 3b  e(pPage, idx) );
35f40 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
35f50 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
35f60 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
35f70 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
35f80 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
35f90 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
35fa0 75 74 65 78 29 20 29 3b 0a 20 20 64 61 74 61 20  utex) );.  data 
35fb0 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
35fc0 20 20 70 74 72 20 3d 20 26 70 50 61 67 65 2d 3e    ptr = &pPage->
35fd0 61 43 65 6c 6c 49 64 78 5b 32 2a 69 64 78 5d 3b  aCellIdx[2*idx];
35fe0 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65  .  pc = get2byte
35ff0 28 70 74 72 29 3b 0a 20 20 68 64 72 20 3d 20 70  (ptr);.  hdr = p
36000 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
36010 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d  .  testcase( pc=
36020 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b  =get2byte(&data[
36030 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20 74 65 73  hdr+5]) );.  tes
36040 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 70 50  tcase( pc+sz==pP
36050 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
36060 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 70 63  Size );.  if( pc
36070 20 3c 20 28 75 33 32 29 67 65 74 32 62 79 74 65   < (u32)get2byte
36080 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 7c  (&data[hdr+5]) |
36090 7c 20 70 63 2b 73 7a 20 3e 20 70 50 61 67 65 2d  | pc+sz > pPage-
360a0 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
360b0 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53   ){.    *pRC = S
360c0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
360d0 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  PT;.    return;.
360e0 20 20 7d 0a 20 20 72 63 20 3d 20 66 72 65 65 53    }.  rc = freeS
360f0 70 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c 20  pace(pPage, pc, 
36100 73 7a 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  sz);.  if( rc ){
36110 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a  .    *pRC = rc;.
36120 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
36130 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d    pPage->nCell--
36140 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e  ;.  if( pPage->n
36150 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 6d  Cell==0 ){.    m
36160 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b  emset(&data[hdr+
36170 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 20 20 64  1], 0, 4);.    d
36180 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
36190 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
361a0 74 61 5b 68 64 72 2b 35 5d 2c 20 70 50 61 67 65  ta[hdr+5], pPage
361b0 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
361c0 65 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e  e);.    pPage->n
361d0 46 72 65 65 20 3d 20 70 50 61 67 65 2d 3e 70 42  Free = pPage->pB
361e0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
361f0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
36200 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
36210 20 20 20 20 20 20 20 20 2d 20 70 50 61 67 65 2d          - pPage-
36220 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 2d 20  >childPtrSize - 
36230 38 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  8;.  }else{.    
36240 6d 65 6d 6d 6f 76 65 28 70 74 72 2c 20 70 74 72  memmove(ptr, ptr
36250 2b 32 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e 43  +2, 2*(pPage->nC
36260 65 6c 6c 20 2d 20 69 64 78 29 29 3b 0a 20 20 20  ell - idx));.   
36270 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
36280 68 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e  hdr+3], pPage->n
36290 43 65 6c 6c 29 3b 0a 20 20 20 20 70 50 61 67 65  Cell);.    pPage
362a0 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20  ->nFree += 2;.  
362b0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72  }.}../*.** Inser
362c0 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20  t a new cell on 
362d0 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e  pPage at cell in
362e0 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20  dex "i".  pCell 
362f0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a  points to the.**
36300 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
36310 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  cell..**.** If t
36320 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
36330 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20  will fit on the 
36340 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69  page, then put i
36350 74 20 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a  t there.  If it.
36360 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c  ** will not fit,
36370 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70   then make a cop
36380 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  y of the cell co
36390 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70  ntent into pTemp
363a0 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20   if.** pTemp is 
363b0 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72  not null.  Regar
363c0 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20  dless of pTemp, 
363d0 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65  allocate a new e
363e0 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65  ntry.** in pPage
363f0 2d 3e 61 70 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d  ->apOvfl[] and m
36400 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20  ake it point to 
36410 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
36420 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70   (either.** in p
36430 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67  Temp or the orig
36440 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20  inal pCell) and 
36450 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20  also record its 
36460 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63  index. .** Alloc
36470 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72  ating a new entr
36480 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c  y in pPage->aCel
36490 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74  l[] implies that
364a0 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65   .** pPage->nOve
364b0 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65  rflow is increme
364c0 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 52 43  nted..**.** *pRC
364d0 20 6d 75 73 74 20 62 65 20 53 51 4c 49 54 45 5f   must be SQLITE_
364e0 4f 4b 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  OK when this rou
364f0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
36500 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
36510 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d  nsertCell(.  Mem
36520 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f  Page *pPage,   /
36530 2a 20 50 61 67 65 20 69 6e 74 6f 20 77 68 69 63  * Page into whic
36540 68 20 77 65 20 61 72 65 20 63 6f 70 79 69 6e 67  h we are copying
36550 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20 20   */.  int i,    
36560 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63          /* New c
36570 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68 65 20  ell becomes the 
36580 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74 68 65  i-th cell of the
36590 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70   page */.  u8 *p
365a0 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20  Cell,        /* 
365b0 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e  Content of the n
365c0 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74  ew cell */.  int
365d0 20 73 7a 2c 20 20 20 20 20 20 20 20 20 20 20 2f   sz,           /
365e0 2a 20 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 65  * Bytes of conte
365f0 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20  nt in pCell */. 
36600 20 75 38 20 2a 70 54 65 6d 70 2c 20 20 20 20 20   u8 *pTemp,     
36610 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61     /* Temp stora
36620 67 65 20 73 70 61 63 65 20 66 6f 72 20 70 43 65  ge space for pCe
36630 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f  ll, if needed */
36640 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20  .  Pgno iChild, 
36650 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a       /* If non-z
36660 65 72 6f 2c 20 72 65 70 6c 61 63 65 20 66 69 72  ero, replace fir
36670 73 74 20 34 20 62 79 74 65 73 20 77 69 74 68 20  st 4 bytes with 
36680 74 68 69 73 20 76 61 6c 75 65 20 2a 2f 0a 20 20  this value */.  
36690 69 6e 74 20 2a 70 52 43 20 20 20 20 20 20 20 20  int *pRC        
366a0 20 20 2f 2a 20 52 65 61 64 20 61 6e 64 20 77 72    /* Read and wr
366b0 69 74 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ite return code 
366c0 66 72 6f 6d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  from here */.){.
366d0 20 20 69 6e 74 20 69 64 78 20 3d 20 30 3b 20 20    int idx = 0;  
366e0 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20      /* Where to 
366f0 77 72 69 74 65 20 6e 65 77 20 63 65 6c 6c 20 63  write new cell c
36700 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d  ontent in data[]
36710 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20   */.  int j;    
36720 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
36730 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20  counter */.  u8 
36740 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f  *data;         /
36750 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  * The content of
36760 20 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20   the whole page 
36770 2a 2f 0a 20 20 75 38 20 2a 70 49 6e 73 3b 20 20  */.  u8 *pIns;  
36780 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f         /* The po
36790 69 6e 74 20 69 6e 20 70 50 61 67 65 2d 3e 61 43  int in pPage->aC
367a0 65 6c 6c 49 64 78 5b 5d 20 77 68 65 72 65 20 6e  ellIdx[] where n
367b0 6f 20 63 65 6c 6c 20 69 6e 73 65 72 74 65 64 20  o cell inserted 
367c0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70  */..  assert( *p
367d0 52 43 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  RC==SQLITE_OK );
367e0 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20  .  assert( i>=0 
367f0 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65  && i<=pPage->nCe
36800 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  ll+pPage->nOverf
36810 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28  low );.  assert(
36820 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e   MX_CELL(pPage->
36830 70 42 74 29 3c 3d 31 30 39 32 31 20 29 3b 0a 20  pBt)<=10921 );. 
36840 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
36850 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70  nCell<=MX_CELL(p
36860 50 61 67 65 2d 3e 70 42 74 29 20 7c 7c 20 43 4f  Page->pBt) || CO
36870 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73  RRUPT_DB );.  as
36880 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
36890 65 72 66 6c 6f 77 3c 3d 41 72 72 61 79 53 69 7a  erflow<=ArraySiz
368a0 65 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29  e(pPage->apOvfl)
368b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 41 72   );.  assert( Ar
368c0 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61  raySize(pPage->a
368d0 70 4f 76 66 6c 29 3d 3d 41 72 72 61 79 53 69 7a  pOvfl)==ArraySiz
368e0 65 28 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 29  e(pPage->aiOvfl)
368f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
36900 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
36910 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
36920 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20  ex) );.  /* The 
36930 63 65 6c 6c 20 73 68 6f 75 6c 64 20 6e 6f 72 6d  cell should norm
36940 61 6c 6c 79 20 62 65 20 73 69 7a 65 64 20 63 6f  ally be sized co
36950 72 72 65 63 74 6c 79 2e 20 20 48 6f 77 65 76 65  rrectly.  Howeve
36960 72 2c 20 77 68 65 6e 20 6d 6f 76 69 6e 67 20 61  r, when moving a
36970 0a 20 20 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20  .  ** malformed 
36980 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66  cell from a leaf
36990 20 70 61 67 65 20 74 6f 20 61 6e 20 69 6e 74 65   page to an inte
369a0 72 69 6f 72 20 70 61 67 65 2c 20 69 66 20 74 68  rior page, if th
369b0 65 20 63 65 6c 6c 20 73 69 7a 65 0a 20 20 2a 2a  e cell size.  **
369c0 20 77 61 6e 74 65 64 20 74 6f 20 62 65 20 6c 65   wanted to be le
369d0 73 73 20 74 68 61 6e 20 34 20 62 75 74 20 67 6f  ss than 4 but go
369e0 74 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20  t rounded up to 
369f0 34 20 6f 6e 20 74 68 65 20 6c 65 61 66 2c 20 74  4 on the leaf, t
36a00 68 65 6e 20 73 69 7a 65 0a 20 20 2a 2a 20 6d 69  hen size.  ** mi
36a10 67 68 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e  ght be less than
36a20 20 38 20 28 6c 65 61 66 2d 73 69 7a 65 20 2b 20   8 (leaf-size + 
36a30 70 6f 69 6e 74 65 72 29 20 6f 6e 20 74 68 65 20  pointer) on the 
36a40 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 2e 20 20  interior node.  
36a50 48 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20 74  Hence.  ** the t
36a60 65 72 6d 20 61 66 74 65 72 20 74 68 65 20 7c 7c  erm after the ||
36a70 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
36a80 67 20 61 73 73 65 72 74 28 29 2e 20 2a 2f 0a 20  g assert(). */. 
36a90 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 70 50 61   assert( sz==pPa
36aa0 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50  ge->xCellSize(pP
36ab0 61 67 65 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 28  age, pCell) || (
36ac0 73 7a 3d 3d 38 20 26 26 20 69 43 68 69 6c 64 3e  sz==8 && iChild>
36ad0 30 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  0) );.  if( pPag
36ae0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20  e->nOverflow || 
36af0 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65  sz+2>pPage->nFre
36b00 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65  e ){.    if( pTe
36b10 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  mp ){.      memc
36b20 70 79 28 70 54 65 6d 70 2c 20 70 43 65 6c 6c 2c  py(pTemp, pCell,
36b30 20 73 7a 29 3b 0a 20 20 20 20 20 20 70 43 65 6c   sz);.      pCel
36b40 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d  l = pTemp;.    }
36b50 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c 64 20  .    if( iChild 
36b60 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  ){.      put4byt
36b70 65 28 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64 29  e(pCell, iChild)
36b80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20  ;.    }.    j = 
36b90 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
36ba0 2b 2b 3b 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 61  ++;.    /* Compa
36bb0 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 41 72  rison against Ar
36bc0 72 61 79 53 69 7a 65 2d 31 20 73 69 6e 63 65 20  raySize-1 since 
36bd0 77 65 20 68 6f 6c 64 20 62 61 63 6b 20 6f 6e 65  we hold back one
36be0 20 65 78 74 72 61 20 73 6c 6f 74 0a 20 20 20 20   extra slot.    
36bf0 2a 2a 20 61 73 20 61 20 63 6f 6e 74 69 6e 67 65  ** as a continge
36c00 6e 63 79 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ncy.  In other w
36c10 6f 72 64 73 2c 20 6e 65 76 65 72 20 6e 65 65 64  ords, never need
36c20 20 6d 6f 72 65 20 74 68 61 6e 20 33 20 6f 76 65   more than 3 ove
36c30 72 66 6c 6f 77 0a 20 20 20 20 2a 2a 20 73 6c 6f  rflow.    ** slo
36c40 74 73 20 62 75 74 20 34 20 61 72 65 20 61 6c 6c  ts but 4 are all
36c50 6f 63 61 74 65 64 2c 20 6a 75 73 74 20 74 6f 20  ocated, just to 
36c60 62 65 20 73 61 66 65 2e 20 2a 2f 0a 20 20 20 20  be safe. */.    
36c70 61 73 73 65 72 74 28 20 6a 20 3c 20 41 72 72 61  assert( j < Arra
36c80 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f  ySize(pPage->apO
36c90 76 66 6c 29 2d 31 20 29 3b 0a 20 20 20 20 70 50  vfl)-1 );.    pP
36ca0 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 6a 5d 20 3d  age->apOvfl[j] =
36cb0 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67   pCell;.    pPag
36cc0 65 2d 3e 61 69 4f 76 66 6c 5b 6a 5d 20 3d 20 28  e->aiOvfl[j] = (
36cd0 75 31 36 29 69 3b 0a 0a 20 20 20 20 2f 2a 20 57  u16)i;..    /* W
36ce0 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65  hen multiple ove
36cf0 72 66 6c 6f 77 73 20 6f 63 63 75 72 2c 20 74 68  rflows occur, th
36d00 65 79 20 61 72 65 20 61 6c 77 61 79 73 20 73 65  ey are always se
36d10 71 75 65 6e 74 69 61 6c 20 61 6e 64 20 69 6e 0a  quential and in.
36d20 20 20 20 20 2a 2a 20 73 6f 72 74 65 64 20 6f 72      ** sorted or
36d30 64 65 72 2e 20 20 54 68 69 73 20 69 6e 76 61 72  der.  This invar
36d40 69 61 6e 74 73 20 61 72 69 73 65 20 62 65 63 61  iants arise beca
36d50 75 73 65 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65  use multiple ove
36d60 72 66 6c 6f 77 73 20 63 61 6e 0a 20 20 20 20 2a  rflows can.    *
36d70 2a 20 6f 6e 6c 79 20 6f 63 63 75 72 20 77 68 65  * only occur whe
36d80 6e 20 69 6e 73 65 72 74 69 6e 67 20 64 69 76 69  n inserting divi
36d90 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74  der cells into t
36da0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 64  he parent page d
36db0 75 72 69 6e 67 0a 20 20 20 20 2a 2a 20 62 61 6c  uring.    ** bal
36dc0 61 6e 63 69 6e 67 2c 20 61 6e 64 20 74 68 65 20  ancing, and the 
36dd0 64 69 76 69 64 65 72 73 20 61 72 65 20 61 64 6a  dividers are adj
36de0 61 63 65 6e 74 20 61 6e 64 20 73 6f 72 74 65 64  acent and sorted
36df0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
36e00 65 72 74 28 20 6a 3d 3d 30 20 7c 7c 20 70 50 61  ert( j==0 || pPa
36e10 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 2d 31 5d 3c  ge->aiOvfl[j-1]<
36e20 28 75 31 36 29 69 20 29 3b 20 2f 2a 20 4f 76 65  (u16)i ); /* Ove
36e30 72 66 6c 6f 77 73 20 69 6e 20 73 6f 72 74 65 64  rflows in sorted
36e40 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 61 73   order */.    as
36e50 73 65 72 74 28 20 6a 3d 3d 30 20 7c 7c 20 69 3d  sert( j==0 || i=
36e60 3d 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a  =pPage->aiOvfl[j
36e70 2d 31 5d 2b 31 20 29 3b 20 20 20 2f 2a 20 4f 76  -1]+1 );   /* Ov
36e80 65 72 66 6c 6f 77 73 20 61 72 65 20 73 65 71 75  erflows are sequ
36e90 65 6e 74 69 61 6c 20 2a 2f 0a 20 20 7d 65 6c 73  ential */.  }els
36ea0 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  e{.    int rc = 
36eb0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
36ec0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
36ed0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
36ee0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
36ef0 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20    *pRC = rc;.   
36f00 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
36f10 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
36f20 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
36f30 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
36f40 61 67 65 29 20 29 3b 0a 20 20 20 20 64 61 74 61  age) );.    data
36f50 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
36f60 0a 20 20 20 20 61 73 73 65 72 74 28 20 26 64 61  .    assert( &da
36f70 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  ta[pPage->cellOf
36f80 66 73 65 74 5d 3d 3d 70 50 61 67 65 2d 3e 61 43  fset]==pPage->aC
36f90 65 6c 6c 49 64 78 20 29 3b 0a 20 20 20 20 72 63  ellIdx );.    rc
36fa0 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65   = allocateSpace
36fb0 28 70 50 61 67 65 2c 20 73 7a 2c 20 26 69 64 78  (pPage, sz, &idx
36fc0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
36fd0 20 2a 70 52 43 20 3d 20 72 63 3b 20 72 65 74 75   *pRC = rc; retu
36fe0 72 6e 3b 20 7d 0a 20 20 20 20 2f 2a 20 54 68 65  rn; }.    /* The
36ff0 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 29   allocateSpace()
37000 20 72 6f 75 74 69 6e 65 20 67 75 61 72 61 6e 74   routine guarant
37010 65 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ees the followin
37020 67 20 70 72 6f 70 65 72 74 69 65 73 0a 20 20 20  g properties.   
37030 20 2a 2a 20 69 66 20 69 74 20 72 65 74 75 72 6e   ** if it return
37040 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 2a  s successfully *
37050 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64  /.    assert( id
37060 78 20 3e 3d 20 30 20 29 3b 0a 20 20 20 20 61 73  x >= 0 );.    as
37070 73 65 72 74 28 20 69 64 78 20 3e 3d 20 70 50 61  sert( idx >= pPa
37080 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32  ge->cellOffset+2
37090 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 32 20  *pPage->nCell+2 
370a0 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
370b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78  .    assert( idx
370c0 2b 73 7a 20 3c 3d 20 28 69 6e 74 29 70 50 61 67  +sz <= (int)pPag
370d0 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
370e0 7a 65 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  ze );.    pPage-
370f0 3e 6e 46 72 65 65 20 2d 3d 20 28 75 31 36 29 28  >nFree -= (u16)(
37100 32 20 2b 20 73 7a 29 3b 0a 20 20 20 20 6d 65 6d  2 + sz);.    mem
37110 63 70 79 28 26 64 61 74 61 5b 69 64 78 5d 2c 20  cpy(&data[idx], 
37120 70 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20 20 20 20  pCell, sz);.    
37130 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20  if( iChild ){.  
37140 20 20 20 20 70 75 74 34 62 79 74 65 28 26 64 61      put4byte(&da
37150 74 61 5b 69 64 78 5d 2c 20 69 43 68 69 6c 64 29  ta[idx], iChild)
37160 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 73  ;.    }.    pIns
37170 20 3d 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49   = pPage->aCellI
37180 64 78 20 2b 20 69 2a 32 3b 0a 20 20 20 20 6d 65  dx + i*2;.    me
37190 6d 6d 6f 76 65 28 70 49 6e 73 2b 32 2c 20 70 49  mmove(pIns+2, pI
371a0 6e 73 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e 43  ns, 2*(pPage->nC
371b0 65 6c 6c 20 2d 20 69 29 29 3b 0a 20 20 20 20 70  ell - i));.    p
371c0 75 74 32 62 79 74 65 28 70 49 6e 73 2c 20 69 64  ut2byte(pIns, id
371d0 78 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e  x);.    pPage->n
371e0 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 2f 2a 20 69  Cell++;.    /* i
371f0 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 63 65 6c  ncrement the cel
37200 6c 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 69  l count */.    i
37210 66 28 20 28 2b 2b 64 61 74 61 5b 70 50 61 67 65  f( (++data[pPage
37220 2d 3e 68 64 72 4f 66 66 73 65 74 2b 34 5d 29 3d  ->hdrOffset+4])=
37230 3d 30 20 29 20 64 61 74 61 5b 70 50 61 67 65 2d  =0 ) data[pPage-
37240 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2b 2b 3b  >hdrOffset+3]++;
37250 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74  .    assert( get
37260 32 62 79 74 65 28 26 64 61 74 61 5b 70 50 61 67  2byte(&data[pPag
37270 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 29  e->hdrOffset+3])
37280 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ==pPage->nCell )
37290 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
372a0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
372b0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
372c0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
372d0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
372e0 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e  cell may contain
372f0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
37300 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
37310 49 66 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20  If so, write.   
37320 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20     ** the entry 
37330 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
37340 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70   page into the p
37350 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20  ointer map..    
37360 20 20 2a 2f 0a 20 20 20 20 20 20 70 74 72 6d 61    */.      ptrma
37370 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67  pPutOvflPtr(pPag
37380 65 2c 20 70 43 65 6c 6c 2c 20 70 52 43 29 3b 0a  e, pCell, pRC);.
37390 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
373a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 43 65 6c 6c  .}../*.** A Cell
373b0 41 72 72 61 79 20 6f 62 6a 65 63 74 20 63 6f 6e  Array object con
373c0 74 61 69 6e 73 20 61 20 63 61 63 68 65 20 6f 66  tains a cache of
373d0 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 73 69   pointers and si
373e0 7a 65 73 20 66 6f 72 20 61 0a 2a 2a 20 63 6f 6e  zes for a.** con
373f0 73 65 63 75 74 69 76 65 20 73 65 71 75 65 6e 63  secutive sequenc
37400 65 20 6f 66 20 63 65 6c 6c 73 20 74 68 61 74 20  e of cells that 
37410 6d 69 67 68 74 20 62 65 20 68 65 6c 64 20 6f 6e  might be held on
37420 20 6d 75 6c 74 69 70 6c 65 20 70 61 67 65 73 2e   multiple pages.
37430 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
37440 63 74 20 43 65 6c 6c 41 72 72 61 79 20 43 65 6c  ct CellArray Cel
37450 6c 41 72 72 61 79 3b 0a 73 74 72 75 63 74 20 43  lArray;.struct C
37460 65 6c 6c 41 72 72 61 79 20 7b 0a 20 20 69 6e 74  ellArray {.  int
37470 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20   nCell;         
37480 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
37490 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c  f cells in apCel
374a0 6c 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  l[] */.  MemPage
374b0 20 2a 70 52 65 66 3b 20 20 20 20 20 20 20 20 20   *pRef;         
374c0 20 2f 2a 20 52 65 66 65 72 65 6e 63 65 20 70 61   /* Reference pa
374d0 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43  ge */.  u8 **apC
374e0 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
374f0 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67  /* All cells beg
37500 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20  in balanced */. 
37510 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20   u16 *szCell;   
37520 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61           /* Loca
37530 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65  l size of all ce
37540 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  lls in apCell[] 
37550 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  */.};../*.** Mak
37560 65 20 73 75 72 65 20 74 68 65 20 63 65 6c 6c 20  e sure the cell 
37570 73 69 7a 65 73 20 61 74 20 69 64 78 2c 20 69 64  sizes at idx, id
37580 78 2b 31 2c 20 2e 2e 2e 2c 20 69 64 78 2b 4e 2d  x+1, ..., idx+N-
37590 31 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63  1 have been.** c
375a0 6f 6d 70 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  omputed..*/.stat
375b0 69 63 20 76 6f 69 64 20 70 6f 70 75 6c 61 74 65  ic void populate
375c0 43 65 6c 6c 43 61 63 68 65 28 43 65 6c 6c 41 72  CellCache(CellAr
375d0 72 61 79 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c  ray *p, int idx,
375e0 20 69 6e 74 20 4e 29 7b 0a 20 20 61 73 73 65 72   int N){.  asser
375f0 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78  t( idx>=0 && idx
37600 2b 4e 3c 3d 70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  +N<=p->nCell );.
37610 20 20 77 68 69 6c 65 28 20 4e 3e 30 20 29 7b 0a    while( N>0 ){.
37620 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
37630 70 43 65 6c 6c 5b 69 64 78 5d 21 3d 30 20 29 3b  pCell[idx]!=0 );
37640 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 7a 43 65  .    if( p->szCe
37650 6c 6c 5b 69 64 78 5d 3d 3d 30 20 29 7b 0a 20 20  ll[idx]==0 ){.  
37660 20 20 20 20 70 2d 3e 73 7a 43 65 6c 6c 5b 69 64      p->szCell[id
37670 78 5d 20 3d 20 70 2d 3e 70 52 65 66 2d 3e 78 43  x] = p->pRef->xC
37680 65 6c 6c 53 69 7a 65 28 70 2d 3e 70 52 65 66 2c  ellSize(p->pRef,
37690 20 70 2d 3e 61 70 43 65 6c 6c 5b 69 64 78 5d 29   p->apCell[idx])
376a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
376b0 20 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55     assert( CORRU
376c0 50 54 5f 44 42 20 7c 7c 0a 20 20 20 20 20 20 20  PT_DB ||.       
376d0 20 20 20 20 20 20 20 70 2d 3e 73 7a 43 65 6c 6c         p->szCell
376e0 5b 69 64 78 5d 3d 3d 70 2d 3e 70 52 65 66 2d 3e  [idx]==p->pRef->
376f0 78 43 65 6c 6c 53 69 7a 65 28 70 2d 3e 70 52 65  xCellSize(p->pRe
37700 66 2c 20 70 2d 3e 61 70 43 65 6c 6c 5b 69 64 78  f, p->apCell[idx
37710 5d 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ]) );.    }.    
37720 69 64 78 2b 2b 3b 0a 20 20 20 20 4e 2d 2d 3b 0a  idx++;.    N--;.
37730 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
37740 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  urn the size of 
37750 74 68 65 20 4e 74 68 20 65 6c 65 6d 65 6e 74 20  the Nth element 
37760 6f 66 20 74 68 65 20 63 65 6c 6c 20 61 72 72 61  of the cell arra
37770 79 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49  y.*/.static SQLI
37780 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 75 31 36 20  TE_NOINLINE u16 
37790 63 6f 6d 70 75 74 65 43 65 6c 6c 53 69 7a 65 28  computeCellSize(
377a0 43 65 6c 6c 41 72 72 61 79 20 2a 70 2c 20 69 6e  CellArray *p, in
377b0 74 20 4e 29 7b 0a 20 20 61 73 73 65 72 74 28 20  t N){.  assert( 
377c0 4e 3e 3d 30 20 26 26 20 4e 3c 70 2d 3e 6e 43 65  N>=0 && N<p->nCe
377d0 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
377e0 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 3d 3d 30 20  p->szCell[N]==0 
377f0 29 3b 0a 20 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e  );.  p->szCell[N
37800 5d 20 3d 20 70 2d 3e 70 52 65 66 2d 3e 78 43 65  ] = p->pRef->xCe
37810 6c 6c 53 69 7a 65 28 70 2d 3e 70 52 65 66 2c 20  llSize(p->pRef, 
37820 70 2d 3e 61 70 43 65 6c 6c 5b 4e 5d 29 3b 0a 20  p->apCell[N]);. 
37830 20 72 65 74 75 72 6e 20 70 2d 3e 73 7a 43 65 6c   return p->szCel
37840 6c 5b 4e 5d 3b 0a 7d 0a 73 74 61 74 69 63 20 75  l[N];.}.static u
37850 31 36 20 63 61 63 68 65 64 43 65 6c 6c 53 69 7a  16 cachedCellSiz
37860 65 28 43 65 6c 6c 41 72 72 61 79 20 2a 70 2c 20  e(CellArray *p, 
37870 69 6e 74 20 4e 29 7b 0a 20 20 61 73 73 65 72 74  int N){.  assert
37880 28 20 4e 3e 3d 30 20 26 26 20 4e 3c 70 2d 3e 6e  ( N>=0 && N<p->n
37890 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 70 2d  Cell );.  if( p-
378a0 3e 73 7a 43 65 6c 6c 5b 4e 5d 20 29 20 72 65 74  >szCell[N] ) ret
378b0 75 72 6e 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d  urn p->szCell[N]
378c0 3b 0a 20 20 72 65 74 75 72 6e 20 63 6f 6d 70 75  ;.  return compu
378d0 74 65 43 65 6c 6c 53 69 7a 65 28 70 2c 20 4e 29  teCellSize(p, N)
378e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79  ;.}../*.** Array
378f0 20 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69   apCell[] contai
37900 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 6e  ns pointers to n
37910 43 65 6c 6c 20 62 2d 74 72 65 65 20 70 61 67 65  Cell b-tree page
37920 20 63 65 6c 6c 73 2e 20 54 68 65 20 0a 2a 2a 20   cells. The .** 
37930 73 7a 43 65 6c 6c 5b 5d 20 61 72 72 61 79 20 63  szCell[] array c
37940 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65  ontains the size
37950 20 69 6e 20 62 79 74 65 73 20 6f 66 20 65 61 63   in bytes of eac
37960 68 20 63 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e  h cell. This fun
37970 63 74 69 6f 6e 0a 2a 2a 20 72 65 70 6c 61 63 65  ction.** replace
37980 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  s the current co
37990 6e 74 65 6e 74 73 20 6f 66 20 70 61 67 65 20 70  ntents of page p
379a0 50 67 20 77 69 74 68 20 74 68 65 20 63 6f 6e 74  Pg with the cont
379b0 65 6e 74 73 20 6f 66 20 74 68 65 20 63 65 6c 6c  ents of the cell
379c0 0a 2a 2a 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a  .** array..**.**
379d0 20 53 6f 6d 65 20 6f 66 20 74 68 65 20 63 65 6c   Some of the cel
379e0 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6d  ls in apCell[] m
379f0 61 79 20 63 75 72 72 65 6e 74 6c 79 20 62 65 20  ay currently be 
37a00 73 74 6f 72 65 64 20 69 6e 20 70 50 67 2e 20 54  stored in pPg. T
37a10 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
37a20 77 6f 72 6b 73 20 61 72 6f 75 6e 64 20 70 72 6f  works around pro
37a30 62 6c 65 6d 73 20 63 61 75 73 65 64 20 62 79 20  blems caused by 
37a40 74 68 69 73 20 62 79 20 6d 61 6b 69 6e 67 20 61  this by making a
37a50 20 63 6f 70 79 20 6f 66 20 61 6e 79 20 0a 2a 2a   copy of any .**
37a60 20 73 75 63 68 20 63 65 6c 6c 73 20 62 65 66 6f   such cells befo
37a70 72 65 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74  re overwriting t
37a80 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2a  he page data..**
37a90 0a 2a 2a 20 54 68 65 20 4d 65 6d 50 61 67 65 2e  .** The MemPage.
37aa0 6e 46 72 65 65 20 66 69 65 6c 64 20 69 73 20 69  nFree field is i
37ab0 6e 76 61 6c 69 64 61 74 65 64 20 62 79 20 74 68  nvalidated by th
37ac0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 74 20  is function. It 
37ad0 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f  is the .** respo
37ae0 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
37af0 20 63 61 6c 6c 65 72 20 74 6f 20 73 65 74 20 69   caller to set i
37b00 74 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a  t correctly..*/.
37b10 73 74 61 74 69 63 20 69 6e 74 20 72 65 62 75 69  static int rebui
37b20 6c 64 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67  ldPage(.  MemPag
37b30 65 20 2a 70 50 67 2c 20 20 20 20 20 20 20 20 20  e *pPg,         
37b40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 64 69            /* Edi
37b50 74 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  t this page */. 
37b60 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20   int nCell,     
37b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37b80 20 2f 2a 20 46 69 6e 61 6c 20 6e 75 6d 62 65 72   /* Final number
37b90 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 70 61 67   of cells on pag
37ba0 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65  e */.  u8 **apCe
37bb0 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
37bc0 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
37bd0 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 75 31  of cells */.  u1
37be0 36 20 2a 73 7a 43 65 6c 6c 20 20 20 20 20 20 20  6 *szCell       
37bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
37c00 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 20 73   Array of cell s
37c10 69 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  izes */.){.  con
37c20 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 67  st int hdr = pPg
37c30 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20  ->hdrOffset;    
37c40 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
37c50 6f 66 20 68 65 61 64 65 72 20 6f 6e 20 70 50 67  of header on pPg
37c60 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74   */.  u8 * const
37c70 20 61 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44   aData = pPg->aD
37c80 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ata;           /
37c90 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 61 74  * Pointer to dat
37ca0 61 20 66 6f 72 20 70 50 67 20 2a 2f 0a 20 20 63  a for pPg */.  c
37cb0 6f 6e 73 74 20 69 6e 74 20 75 73 61 62 6c 65 53  onst int usableS
37cc0 69 7a 65 20 3d 20 70 50 67 2d 3e 70 42 74 2d 3e  ize = pPg->pBt->
37cd0 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 75 38  usableSize;.  u8
37ce0 20 2a 20 63 6f 6e 73 74 20 70 45 6e 64 20 3d 20   * const pEnd = 
37cf0 26 61 44 61 74 61 5b 75 73 61 62 6c 65 53 69 7a  &aData[usableSiz
37d00 65 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75  e];.  int i;.  u
37d10 38 20 2a 70 43 65 6c 6c 70 74 72 20 3d 20 70 50  8 *pCellptr = pP
37d20 67 2d 3e 61 43 65 6c 6c 49 64 78 3b 0a 20 20 75  g->aCellIdx;.  u
37d30 38 20 2a 70 54 6d 70 20 3d 20 73 71 6c 69 74 65  8 *pTmp = sqlite
37d40 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28  3PagerTempSpace(
37d50 70 50 67 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  pPg->pBt->pPager
37d60 29 3b 0a 20 20 75 38 20 2a 70 44 61 74 61 3b 0a  );.  u8 *pData;.
37d70 0a 20 20 69 20 3d 20 67 65 74 32 62 79 74 65 28  .  i = get2byte(
37d80 26 61 44 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  &aData[hdr+5]);.
37d90 20 20 6d 65 6d 63 70 79 28 26 70 54 6d 70 5b 69    memcpy(&pTmp[i
37da0 5d 2c 20 26 61 44 61 74 61 5b 69 5d 2c 20 75 73  ], &aData[i], us
37db0 61 62 6c 65 53 69 7a 65 20 2d 20 69 29 3b 0a 0a  ableSize - i);..
37dc0 20 20 70 44 61 74 61 20 3d 20 70 45 6e 64 3b 0a    pData = pEnd;.
37dd0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
37de0 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  ll; i++){.    u8
37df0 20 2a 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c   *pCell = apCell
37e00 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 53 51 4c  [i];.    if( SQL
37e10 49 54 45 5f 57 49 54 48 49 4e 28 70 43 65 6c 6c  ITE_WITHIN(pCell
37e20 2c 61 44 61 74 61 2c 70 45 6e 64 29 20 29 7b 0a  ,aData,pEnd) ){.
37e30 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 26 70        pCell = &p
37e40 54 6d 70 5b 70 43 65 6c 6c 20 2d 20 61 44 61 74  Tmp[pCell - aDat
37e50 61 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44  a];.    }.    pD
37e60 61 74 61 20 2d 3d 20 73 7a 43 65 6c 6c 5b 69 5d  ata -= szCell[i]
37e70 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70  ;.    put2byte(p
37e80 43 65 6c 6c 70 74 72 2c 20 28 70 44 61 74 61 20  Cellptr, (pData 
37e90 2d 20 61 44 61 74 61 29 29 3b 0a 20 20 20 20 70  - aData));.    p
37ea0 43 65 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20  Cellptr += 2;.  
37eb0 20 20 69 66 28 20 70 44 61 74 61 20 3c 20 70 43    if( pData < pC
37ec0 65 6c 6c 70 74 72 20 29 20 72 65 74 75 72 6e 20  ellptr ) return 
37ed0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
37ee0 4b 50 54 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  KPT;.    memcpy(
37ef0 70 44 61 74 61 2c 20 70 43 65 6c 6c 2c 20 73 7a  pData, pCell, sz
37f00 43 65 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 61 73  Cell[i]);.    as
37f10 73 65 72 74 28 20 73 7a 43 65 6c 6c 5b 69 5d 3d  sert( szCell[i]=
37f20 3d 70 50 67 2d 3e 78 43 65 6c 6c 53 69 7a 65 28  =pPg->xCellSize(
37f30 70 50 67 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 43  pPg, pCell) || C
37f40 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20  ORRUPT_DB );.   
37f50 20 74 65 73 74 63 61 73 65 28 20 73 7a 43 65 6c   testcase( szCel
37f60 6c 5b 69 5d 21 3d 70 50 67 2d 3e 78 43 65 6c 6c  l[i]!=pPg->xCell
37f70 53 69 7a 65 28 70 50 67 2c 70 43 65 6c 6c 29 20  Size(pPg,pCell) 
37f80 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
37f90 20 70 50 67 2d 3e 6e 46 72 65 65 20 66 69 65 6c   pPg->nFree fiel
37fa0 64 20 69 73 20 6e 6f 77 20 73 65 74 20 69 6e 63  d is now set inc
37fb0 6f 72 72 65 63 74 6c 79 2e 20 54 68 65 20 63 61  orrectly. The ca
37fc0 6c 6c 65 72 20 77 69 6c 6c 20 66 69 78 20 69 74  ller will fix it
37fd0 2e 20 2a 2f 0a 20 20 70 50 67 2d 3e 6e 43 65 6c  . */.  pPg->nCel
37fe0 6c 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 70 50 67  l = nCell;.  pPg
37ff0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
38000 0a 0a 20 20 70 75 74 32 62 79 74 65 28 26 61 44  ..  put2byte(&aD
38010 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 29 3b 0a  ata[hdr+1], 0);.
38020 20 20 70 75 74 32 62 79 74 65 28 26 61 44 61 74    put2byte(&aDat
38030 61 5b 68 64 72 2b 33 5d 2c 20 70 50 67 2d 3e 6e  a[hdr+3], pPg->n
38040 43 65 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79 74  Cell);.  put2byt
38050 65 28 26 61 44 61 74 61 5b 68 64 72 2b 35 5d 2c  e(&aData[hdr+5],
38060 20 70 44 61 74 61 20 2d 20 61 44 61 74 61 29 3b   pData - aData);
38070 0a 20 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 20  .  aData[hdr+7] 
38080 3d 20 30 78 30 30 3b 0a 20 20 72 65 74 75 72 6e  = 0x00;.  return
38090 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
380a0 2a 0a 2a 2a 20 41 72 72 61 79 20 61 70 43 65 6c  *.** Array apCel
380b0 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 6e 43 65  l[] contains nCe
380c0 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 62  ll pointers to b
380d0 2d 74 72 65 65 20 63 65 6c 6c 73 2e 20 41 72 72  -tree cells. Arr
380e0 61 79 20 73 7a 43 65 6c 6c 0a 2a 2a 20 63 6f 6e  ay szCell.** con
380f0 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 69  tains the size i
38100 6e 20 62 79 74 65 73 20 6f 66 20 65 61 63 68 20  n bytes of each 
38110 73 75 63 68 20 63 65 6c 6c 2e 20 54 68 69 73 20  such cell. This 
38120 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
38130 73 20 74 6f 20 0a 2a 2a 20 61 64 64 20 74 68 65  s to .** add the
38140 20 63 65 6c 6c 73 20 73 74 6f 72 65 64 20 69 6e   cells stored in
38150 20 74 68 65 20 61 72 72 61 79 20 74 6f 20 70 61   the array to pa
38160 67 65 20 70 50 67 2e 20 49 66 20 69 74 20 63 61  ge pPg. If it ca
38170 6e 6e 6f 74 20 28 62 65 63 61 75 73 65 20 0a 2a  nnot (because .*
38180 2a 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73  * the page needs
38190 20 74 6f 20 62 65 20 64 65 66 72 61 67 6d 65 6e   to be defragmen
381a0 74 65 64 20 62 65 66 6f 72 65 20 74 68 65 20 63  ted before the c
381b0 65 6c 6c 73 20 77 69 6c 6c 20 66 69 74 29 2c 20  ells will fit), 
381c0 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 69 73 20 72  non-zero.** is r
381d0 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
381e0 73 65 2c 20 69 66 20 74 68 65 20 63 65 6c 6c 73  se, if the cells
381f0 20 61 72 65 20 61 64 64 65 64 20 73 75 63 63 65   are added succe
38200 73 73 66 75 6c 6c 79 2c 20 7a 65 72 6f 20 69 73  ssfully, zero is
38210 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a  .** returned..**
38220 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 43 65  .** Argument pCe
38230 6c 6c 70 74 72 20 70 6f 69 6e 74 73 20 74 6f 20  llptr points to 
38240 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
38250 69 6e 20 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e  in the cell-poin
38260 74 65 72 20 61 72 72 61 79 0a 2a 2a 20 28 70 61  ter array.** (pa
38270 72 74 20 6f 66 20 70 61 67 65 20 70 50 67 29 20  rt of page pPg) 
38280 74 6f 20 70 6f 70 75 6c 61 74 65 2e 20 41 66 74  to populate. Aft
38290 65 72 20 63 65 6c 6c 20 61 70 43 65 6c 6c 5b 30  er cell apCell[0
382a0 5d 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ] is written to 
382b0 74 68 65 0a 2a 2a 20 70 61 67 65 20 62 6f 64 79  the.** page body
382c0 2c 20 61 20 31 36 2d 62 69 74 20 6f 66 66 73 65  , a 16-bit offse
382d0 74 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  t is written to 
382e0 70 43 65 6c 6c 70 74 72 2e 20 41 6e 64 20 73 6f  pCellptr. And so
382f0 20 6f 6e 2c 20 66 6f 72 20 65 61 63 68 0a 2a 2a   on, for each.**
38300 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 61 72 72   cell in the arr
38310 61 79 2e 20 49 74 20 69 73 20 74 68 65 20 72 65  ay. It is the re
38320 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
38330 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 6e  the caller to en
38340 73 75 72 65 0a 2a 2a 20 74 68 61 74 20 69 74 20  sure.** that it 
38350 69 73 20 73 61 66 65 20 74 6f 20 6f 76 65 72 77  is safe to overw
38360 72 69 74 65 20 74 68 69 73 20 70 61 72 74 20 6f  rite this part o
38370 66 20 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74  f the cell-point
38380 65 72 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20  er array..**.** 
38390 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  When this functi
383a0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70  on is called, *p
383b0 70 44 61 74 61 20 70 6f 69 6e 74 73 20 74 6f 20  pData points to 
383c0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
383d0 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61 72 65   .** content are
383e0 61 20 6f 6e 20 70 61 67 65 20 70 50 67 2e 20 49  a on page pPg. I
383f0 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  f the size of th
38400 65 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 69  e content area i
38410 73 20 65 78 74 65 6e 64 65 64 2c 0a 2a 2a 20 2a  s extended,.** *
38420 70 70 44 61 74 61 20 69 73 20 75 70 64 61 74 65  ppData is update
38430 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  d to point to th
38440 65 20 6e 65 77 20 73 74 61 72 74 20 6f 66 20 74  e new start of t
38450 68 65 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 0a  he content area.
38460 2a 2a 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ** before return
38470 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 46