/ Hex Artifact Content
Login

Artifact 50bd8434b69c419767e5d25de78d549509c5c86b:


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 23 69 66 20 64 65   enable){.#if de
0b30: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0b40: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
0b50: 49 54 45 5f 54 45 53 54 29 20 26 26 20 21 64 65  ITE_TEST) && !de
0b60: 66 69 6e 65 64 28 54 48 33 5f 43 4f 4d 50 41 54  fined(TH3_COMPAT
0b70: 49 42 49 4c 49 54 59 29 0a 20 20 2f 2a 20 45 6e  IBILITY).  /* En
0b80: 61 62 6c 65 20 67 6c 6f 62 61 6c 20 73 68 61 72  able global shar
0b90: 65 64 20 63 61 63 68 65 20 66 75 6e 63 74 69 6f  ed cache functio
0ba0: 6e 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20  n for debugging 
0bb0: 61 6e 64 20 75 6e 69 74 20 74 65 73 74 73 2c 20  and unit tests, 
0bc0: 0a 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20 66 6f  .  ** but not fo
0bd0: 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 72  r release */.  r
0be0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
0bf0: 55 53 45 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c  USE;.#else.  sql
0c00: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
0c10: 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62  .sharedCacheEnab
0c20: 6c 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20  led = enable;.  
0c30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
0c40: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 23 65 6e 64 69  ;.#endif.}.#endi
0c50: 66 0a 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  f....#ifdef SQLI
0c60: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0c70: 41 43 48 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54  ACHE.  /*.  ** T
0c80: 68 65 20 66 75 6e 63 74 69 6f 6e 73 20 71 75 65  he functions que
0c90: 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62  rySharedCacheTab
0ca0: 6c 65 4c 6f 63 6b 28 29 2c 20 73 65 74 53 68 61  leLock(), setSha
0cb0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0cc0: 6b 28 29 2c 0a 20 20 2a 2a 20 61 6e 64 20 63 6c  k(),.  ** and cl
0cd0: 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
0ce0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 29 0a 20 20  eTableLocks().  
0cf0: 2a 2a 20 6d 61 6e 69 70 75 6c 61 74 65 20 65 6e  ** manipulate en
0d00: 74 72 69 65 73 20 69 6e 20 74 68 65 20 42 74 53  tries in the BtS
0d10: 68 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e 6b  hared.pLock link
0d20: 65 64 20 6c 69 73 74 20 75 73 65 64 20 74 6f 20  ed list used to 
0d30: 73 74 6f 72 65 0a 20 20 2a 2a 20 73 68 61 72 65  store.  ** share
0d40: 64 2d 63 61 63 68 65 20 74 61 62 6c 65 20 6c 65  d-cache table le
0d50: 76 65 6c 20 6c 6f 63 6b 73 2e 20 49 66 20 74 68  vel locks. If th
0d60: 65 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d  e library is com
0d70: 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 0a 20  piled with the. 
0d80: 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65   ** shared-cache
0d90: 20 66 65 61 74 75 72 65 20 64 69 73 61 62 6c 65   feature disable
0da0: 64 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  d, then there is
0db0: 20 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20 75   only ever one u
0dc0: 73 65 72 0a 20 20 2a 2a 20 6f 66 20 65 61 63 68  ser.  ** of each
0dd0: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
0de0: 75 72 65 20 61 6e 64 20 73 6f 20 74 68 69 73 20  ure and so this 
0df0: 6c 6f 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20 6e  locking is not n
0e00: 65 63 65 73 73 61 72 79 2e 20 0a 20 20 2a 2a 20  ecessary. .  ** 
0e10: 53 6f 20 64 65 66 69 6e 65 20 74 68 65 20 6c 6f  So define the lo
0e20: 63 6b 20 72 65 6c 61 74 65 64 20 66 75 6e 63 74  ck related funct
0e30: 69 6f 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e 0a  ions as no-ops..
0e40: 20 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 71    */.  #define q
0e50: 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
0e60: 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29 20  ableLock(a,b,c) 
0e70: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66  SQLITE_OK.  #def
0e80: 69 6e 65 20 73 65 74 53 68 61 72 65 64 43 61 63  ine setSharedCac
0e90: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c  heTableLock(a,b,
0ea0: 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23  c) SQLITE_OK.  #
0eb0: 64 65 66 69 6e 65 20 63 6c 65 61 72 41 6c 6c 53  define clearAllS
0ec0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0ed0: 6f 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e  ocks(a).  #defin
0ee0: 65 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68  e downgradeAllSh
0ef0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0f00: 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e 65  cks(a).  #define
0f10: 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
0f20: 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 2c 64  ableLock(a,b,c,d
0f30: 29 20 31 0a 20 20 23 64 65 66 69 6e 65 20 68 61  ) 1.  #define ha
0f40: 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 61  sReadConflicts(a
0f50: 2c 20 62 29 20 30 0a 23 65 6e 64 69 66 0a 0a 23  , b) 0.#endif..#
0f60: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0f70: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
0f80: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
0f90: 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69  EBUG./*.**** Thi
0fa0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
0fb0: 6c 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20  ly used as part 
0fc0: 6f 66 20 61 6e 20 61 73 73 65 72 74 28 29 20 73  of an assert() s
0fd0: 74 61 74 65 6d 65 6e 74 2e 20 2a 2a 2a 0a 2a 2a  tatement. ***.**
0fe0: 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
0ff0: 20 69 66 20 70 42 74 72 65 65 20 68 6f 6c 64 73   if pBtree holds
1000: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f   the required lo
1010: 63 6b 73 20 74 6f 20 72 65 61 64 20 6f 72 20 77  cks to read or w
1020: 72 69 74 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20  rite to the .** 
1030: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 20  table with root 
1040: 70 61 67 65 20 69 52 6f 6f 74 2e 20 20 20 52 65  page iRoot.   Re
1050: 74 75 72 6e 20 31 20 69 66 20 69 74 20 64 6f 65  turn 1 if it doe
1060: 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a  s and 0 if not..
1070: 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
1080: 65 2c 20 77 68 65 6e 20 77 72 69 74 69 6e 67 20  e, when writing 
1090: 74 6f 20 61 20 74 61 62 6c 65 20 77 69 74 68 20  to a table with 
10a0: 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 20  root-page iRoot 
10b0: 76 69 61 20 0a 2a 2a 20 42 74 72 65 65 20 63 6f  via .** Btree co
10c0: 6e 6e 65 63 74 69 6f 6e 20 70 42 74 72 65 65 3a  nnection pBtree:
10d0: 0a 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74  .**.**    assert
10e0: 28 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65  ( hasSharedCache
10f0: 54 61 62 6c 65 4c 6f 63 6b 28 70 42 74 72 65 65  TableLock(pBtree
1100: 2c 20 69 52 6f 6f 74 2c 20 30 2c 20 57 52 49 54  , iRoot, 0, WRIT
1110: 45 5f 4c 4f 43 4b 29 20 29 3b 0a 2a 2a 0a 2a 2a  E_LOCK) );.**.**
1120: 20 57 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f   When writing to
1130: 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 72   an index that r
1140: 65 73 69 64 65 73 20 69 6e 20 61 20 73 68 61 72  esides in a shar
1150: 61 62 6c 65 20 64 61 74 61 62 61 73 65 2c 20 74  able database, t
1160: 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68  he .** caller sh
1170: 6f 75 6c 64 20 68 61 76 65 20 66 69 72 73 74 20  ould have first 
1180: 6f 62 74 61 69 6e 65 64 20 61 20 6c 6f 63 6b 20  obtained a lock 
1190: 73 70 65 63 69 66 79 69 6e 67 20 74 68 65 20 72  specifying the r
11a0: 6f 6f 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74  oot page of.** t
11b0: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
11c0: 20 74 61 62 6c 65 2e 20 54 68 69 73 20 6d 61 6b   table. This mak
11d0: 65 73 20 74 68 69 6e 67 73 20 61 20 62 69 74 20  es things a bit 
11e0: 6d 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64  more complicated
11f0: 2c 0a 2a 2a 20 61 73 20 74 68 69 73 20 6d 6f 64  ,.** as this mod
1200: 75 6c 65 20 74 72 65 61 74 73 20 65 61 63 68 20  ule treats each 
1210: 74 61 62 6c 65 20 61 73 20 61 20 73 65 70 61 72  table as a separ
1220: 61 74 65 20 73 74 72 75 63 74 75 72 65 2e 20 54  ate structure. T
1230: 6f 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 74  o determine.** t
1240: 68 65 20 74 61 62 6c 65 20 63 6f 72 72 65 73 70  he table corresp
1250: 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 69 6e  onding to the in
1260: 64 65 78 20 62 65 69 6e 67 20 77 72 69 74 74 65  dex being writte
1270: 6e 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  n, this.** funct
1280: 69 6f 6e 20 68 61 73 20 74 6f 20 73 65 61 72 63  ion has to searc
1290: 68 20 74 68 72 6f 75 67 68 20 74 68 65 20 64 61  h through the da
12a0: 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a  tabase schema..*
12b0: 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20  *.** Instead of 
12c0: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61  a lock on the ta
12d0: 62 6c 65 2f 69 6e 64 65 78 20 72 6f 6f 74 65 64  ble/index rooted
12e0: 20 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20   at page iRoot, 
12f0: 74 68 65 20 63 61 6c 6c 65 72 20 6d 61 79 0a 2a  the caller may.*
1300: 2a 20 68 6f 6c 64 20 61 20 77 72 69 74 65 2d 6c  * hold a write-l
1310: 6f 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d  ock on the schem
1320: 61 20 74 61 62 6c 65 20 28 72 6f 6f 74 20 70 61  a table (root pa
1330: 67 65 20 31 29 2e 20 54 68 69 73 20 69 73 20 61  ge 1). This is a
1340: 6c 73 6f 0a 2a 2a 20 61 63 63 65 70 74 61 62 6c  lso.** acceptabl
1350: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1360: 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
1370: 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 42 74 72 65  ableLock(.  Btre
1380: 65 20 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20  e *pBtree,      
1390: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 68 61     /* Handle tha
13a0: 74 20 6d 75 73 74 20 68 6f 6c 64 20 6c 6f 63 6b  t must hold lock
13b0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74   */.  Pgno iRoot
13c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
13d0: 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 62 2d 74  Root page of b-t
13e0: 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49  ree */.  int isI
13f0: 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20  ndex,           
1400: 2f 2a 20 54 72 75 65 20 69 66 20 69 52 6f 6f 74  /* True if iRoot
1410: 20 69 73 20 74 68 65 20 72 6f 6f 74 20 6f 66 20   is the root of 
1420: 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20  an index b-tree 
1430: 2a 2f 0a 20 20 69 6e 74 20 65 4c 6f 63 6b 54 79  */.  int eLockTy
1440: 70 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  pe          /* R
1450: 65 71 75 69 72 65 64 20 6c 6f 63 6b 20 74 79 70  equired lock typ
1460: 65 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20  e (READ_LOCK or 
1470: 57 52 49 54 45 5f 4c 4f 43 4b 29 20 2a 2f 0a 29  WRITE_LOCK) */.)
1480: 7b 0a 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68  {.  Schema *pSch
1490: 65 6d 61 20 3d 20 28 53 63 68 65 6d 61 20 2a 29  ema = (Schema *)
14a0: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 53 63  pBtree->pBt->pSc
14b0: 68 65 6d 61 3b 0a 20 20 50 67 6e 6f 20 69 54 61  hema;.  Pgno iTa
14c0: 62 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20  b = 0;.  BtLock 
14d0: 2a 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66  *pLock;..  /* If
14e0: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69   this database i
14f0: 73 20 6e 6f 74 20 73 68 61 72 65 61 62 6c 65 2c  s not shareable,
1500: 20 6f 72 20 69 66 20 74 68 65 20 63 6c 69 65 6e   or if the clien
1510: 74 20 69 73 20 72 65 61 64 69 6e 67 0a 20 20 2a  t is reading.  *
1520: 2a 20 61 6e 64 20 68 61 73 20 74 68 65 20 72 65  * and has the re
1530: 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66  ad-uncommitted f
1540: 6c 61 67 20 73 65 74 2c 20 74 68 65 6e 20 6e 6f  lag set, then no
1550: 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 69 72 65   lock is require
1560: 64 2e 20 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20  d. .  ** Return 
1570: 74 72 75 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  true immediately
1580: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 42  ..  */.  if( (pB
1590: 74 72 65 65 2d 3e 73 68 61 72 61 62 6c 65 3d 3d  tree->sharable==
15a0: 30 29 0a 20 20 20 7c 7c 20 28 65 4c 6f 63 6b 54  0).   || (eLockT
15b0: 79 70 65 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 26  ype==READ_LOCK &
15c0: 26 20 28 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66  & (pBtree->db->f
15d0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
15e0: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 29 0a  adUncommitted)).
15f0: 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
1600: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  1;.  }..  /* If 
1610: 74 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65  the client is re
1620: 61 64 69 6e 67 20 20 6f 72 20 77 72 69 74 69 6e  ading  or writin
1630: 67 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 74  g an index and t
1640: 68 65 20 73 63 68 65 6d 61 20 69 73 0a 20 20 2a  he schema is.  *
1650: 2a 20 6e 6f 74 20 6c 6f 61 64 65 64 2c 20 74 68  * not loaded, th
1660: 65 6e 20 69 74 20 69 73 20 74 6f 6f 20 64 69 66  en it is too dif
1670: 66 69 63 75 6c 74 20 74 6f 20 61 63 74 75 61 6c  ficult to actual
1680: 6c 79 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  ly check to see 
1690: 69 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 72 72  if.  ** the corr
16a0: 65 63 74 20 6c 6f 63 6b 73 20 61 72 65 20 68 65  ect locks are he
16b0: 6c 64 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 62  ld.  So do not b
16c0: 6f 74 68 65 72 20 2d 20 6a 75 73 74 20 72 65 74  other - just ret
16d0: 75 72 6e 20 74 72 75 65 2e 0a 20 20 2a 2a 20 54  urn true..  ** T
16e0: 68 69 73 20 63 61 73 65 20 64 6f 65 73 20 6e 6f  his case does no
16f0: 74 20 63 6f 6d 65 20 75 70 20 76 65 72 79 20 6f  t come up very o
1700: 66 74 65 6e 20 61 6e 79 68 6f 77 2e 0a 20 20 2a  ften anyhow..  *
1710: 2f 0a 20 20 69 66 28 20 69 73 49 6e 64 65 78 20  /.  if( isIndex 
1720: 26 26 20 28 21 70 53 63 68 65 6d 61 20 7c 7c 20  && (!pSchema || 
1730: 28 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61  (pSchema->schema
1740: 46 6c 61 67 73 26 44 42 5f 53 63 68 65 6d 61 4c  Flags&DB_SchemaL
1750: 6f 61 64 65 64 29 3d 3d 30 29 20 29 7b 0a 20 20  oaded)==0) ){.  
1760: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
1770: 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
1780: 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 74   the root-page t
1790: 68 61 74 20 74 68 65 20 6c 6f 63 6b 20 73 68 6f  hat the lock sho
17a0: 75 6c 64 20 62 65 20 68 65 6c 64 20 6f 6e 2e 20  uld be held on. 
17b0: 46 6f 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 62  For table.  ** b
17c0: 2d 74 72 65 65 73 2c 20 74 68 69 73 20 69 73 20  -trees, this is 
17d0: 6a 75 73 74 20 74 68 65 20 72 6f 6f 74 20 70 61  just the root pa
17e0: 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65  ge of the b-tree
17f0: 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 0a 20   being read or. 
1800: 20 2a 2a 20 77 72 69 74 74 65 6e 2e 20 46 6f 72   ** written. For
1810: 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73 2c 20   index b-trees, 
1820: 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70  it is the root p
1830: 61 67 65 20 6f 66 20 74 68 65 20 61 73 73 6f 63  age of the assoc
1840: 69 61 74 65 64 0a 20 20 2a 2a 20 74 61 62 6c 65  iated.  ** table
1850: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 49 6e  .  */.  if( isIn
1860: 64 65 78 20 29 7b 0a 20 20 20 20 48 61 73 68 45  dex ){.    HashE
1870: 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  lem *p;.    for(
1880: 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  p=sqliteHashFirs
1890: 74 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  t(&pSchema->idxH
18a0: 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69 74  ash); p; p=sqlit
18b0: 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a 20  eHashNext(p)){. 
18c0: 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78       Index *pIdx
18d0: 20 3d 20 28 49 6e 64 65 78 20 2a 29 73 71 6c 69   = (Index *)sqli
18e0: 74 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a 20  teHashData(p);. 
18f0: 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 74       if( pIdx->t
1900: 6e 75 6d 3d 3d 28 69 6e 74 29 69 52 6f 6f 74 20  num==(int)iRoot 
1910: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
1920: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Tab ){.         
1930: 20 2f 2a 20 54 77 6f 20 6f 72 20 6d 6f 72 65 20   /* Two or more 
1940: 69 6e 64 65 78 65 73 20 73 68 61 72 65 20 74 68  indexes share th
1950: 65 20 73 61 6d 65 20 72 6f 6f 74 20 70 61 67 65  e same root page
1960: 2e 20 20 54 68 65 72 65 20 6d 75 73 74 0a 20 20  .  There must.  
1970: 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20 69 6d          ** be im
1980: 70 6f 73 74 65 72 20 74 61 62 6c 65 73 2e 20 20  poster tables.  
1990: 53 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74  So just return t
19a0: 72 75 65 2e 20 20 54 68 65 20 61 73 73 65 72 74  rue.  The assert
19b0: 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20   is not.        
19c0: 20 20 2a 2a 20 75 73 65 66 75 6c 20 69 6e 20 74    ** useful in t
19d0: 68 61 74 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20  hat case. */.   
19e0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
19f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1a00: 20 20 20 69 54 61 62 20 3d 20 70 49 64 78 2d 3e     iTab = pIdx->
1a10: 70 54 61 62 6c 65 2d 3e 74 6e 75 6d 3b 0a 20 20  pTable->tnum;.  
1a20: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
1a30: 6c 73 65 7b 0a 20 20 20 20 69 54 61 62 20 3d 20  lse{.    iTab = 
1a40: 69 52 6f 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  iRoot;.  }..  /*
1a50: 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20   Search for the 
1a60: 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20 45  required lock. E
1a70: 69 74 68 65 72 20 61 20 77 72 69 74 65 2d 6c 6f  ither a write-lo
1a80: 63 6b 20 6f 6e 20 72 6f 6f 74 2d 70 61 67 65 20  ck on root-page 
1a90: 69 54 61 62 2c 20 61 20 0a 20 20 2a 2a 20 77 72  iTab, a .  ** wr
1aa0: 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite-lock on the 
1ab0: 73 63 68 65 6d 61 20 74 61 62 6c 65 2c 20 6f 72  schema table, or
1ac0: 20 28 69 66 20 74 68 65 20 63 6c 69 65 6e 74 20   (if the client 
1ad0: 69 73 20 72 65 61 64 69 6e 67 29 20 61 0a 20 20  is reading) a.  
1ae0: 2a 2a 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20  ** read-lock on 
1af0: 69 54 61 62 20 77 69 6c 6c 20 73 75 66 66 69 63  iTab will suffic
1b00: 65 2e 20 52 65 74 75 72 6e 20 31 20 69 66 20 61  e. Return 1 if a
1b10: 6e 79 20 6f 66 20 74 68 65 73 65 20 61 72 65 20  ny of these are 
1b20: 66 6f 75 6e 64 2e 20 20 2a 2f 0a 20 20 66 6f 72  found.  */.  for
1b30: 28 70 4c 6f 63 6b 3d 70 42 74 72 65 65 2d 3e 70  (pLock=pBtree->p
1b40: 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  Bt->pLock; pLock
1b50: 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70  ; pLock=pLock->p
1b60: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
1b70: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 42  Lock->pBtree==pB
1b80: 74 72 65 65 20 0a 20 20 20 20 20 26 26 20 28 70  tree .     && (p
1b90: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Lock->iTable==iT
1ba0: 61 62 20 7c 7c 20 28 70 4c 6f 63 6b 2d 3e 65 4c  ab || (pLock->eL
1bb0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
1bc0: 26 26 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65  && pLock->iTable
1bd0: 3d 3d 31 29 29 0a 20 20 20 20 20 26 26 20 70 4c  ==1)).     && pL
1be0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f 63  ock->eLock>=eLoc
1bf0: 6b 54 79 70 65 20 0a 20 20 20 20 29 7b 0a 20 20  kType .    ){.  
1c00: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1c10: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 61    }.  }..  /* Fa
1c20: 69 6c 65 64 20 74 6f 20 66 69 6e 64 20 74 68 65  iled to find the
1c30: 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20   required lock. 
1c40: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  */.  return 0;.}
1c50: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1c60: 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64  E_DEBUG */..#ifd
1c70: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1c80: 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e  /*.**** This fun
1c90: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 75 73 65  ction may be use
1ca0: 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73  d as part of ass
1cb0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
1cc0: 20 6f 6e 6c 79 2e 20 2a 2a 2a 2a 0a 2a 2a 0a 2a   only. ****.**.*
1cd0: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
1ce0: 20 69 74 20 77 6f 75 6c 64 20 62 65 20 69 6c 6c   it would be ill
1cf0: 65 67 61 6c 20 66 6f 72 20 70 42 74 72 65 65 20  egal for pBtree 
1d00: 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 74 68  to write into th
1d10: 65 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20 69 6e  e.** table or in
1d20: 64 65 78 20 72 6f 6f 74 65 64 20 61 74 20 69 52  dex rooted at iR
1d30: 6f 6f 74 20 62 65 63 61 75 73 65 20 6f 74 68 65  oot because othe
1d40: 72 20 73 68 61 72 65 64 20 63 6f 6e 6e 65 63 74  r shared connect
1d50: 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 73 69 6d 75  ions are.** simu
1d60: 6c 74 61 6e 65 6f 75 73 6c 79 20 72 65 61 64 69  ltaneously readi
1d70: 6e 67 20 74 68 61 74 20 73 61 6d 65 20 74 61 62  ng that same tab
1d80: 6c 65 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a 0a  le or index..**.
1d90: 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c  ** It is illegal
1da0: 20 66 6f 72 20 70 42 74 72 65 65 20 74 6f 20 77   for pBtree to w
1db0: 72 69 74 65 20 69 66 20 73 6f 6d 65 20 6f 74 68  rite if some oth
1dc0: 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  er Btree object 
1dd0: 74 68 61 74 0a 2a 2a 20 73 68 61 72 65 73 20 74  that.** shares t
1de0: 68 65 20 73 61 6d 65 20 42 74 53 68 61 72 65 64  he same BtShared
1df0: 20 6f 62 6a 65 63 74 20 69 73 20 63 75 72 72 65   object is curre
1e00: 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72 20  ntly reading or 
1e10: 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 69  writing.** the i
1e20: 52 6f 6f 74 20 74 61 62 6c 65 2e 20 20 45 78 63  Root table.  Exc
1e30: 65 70 74 2c 20 69 66 20 74 68 65 20 6f 74 68 65  ept, if the othe
1e40: 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 68  r Btree object h
1e50: 61 73 20 74 68 65 0a 2a 2a 20 72 65 61 64 2d 75  as the.** read-u
1e60: 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20  ncommitted flag 
1e70: 73 65 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20  set, then it is 
1e80: 4f 4b 20 66 6f 72 20 74 68 65 20 6f 74 68 65 72  OK for the other
1e90: 20 6f 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 68 61   object to.** ha
1ea0: 76 65 20 61 20 72 65 61 64 20 63 75 72 73 6f 72  ve a read cursor
1eb0: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
1ec0: 70 6c 65 2c 20 62 65 66 6f 72 65 20 77 72 69 74  ple, before writ
1ed0: 69 6e 67 20 74 6f 20 61 6e 79 20 70 61 72 74 20  ing to any part 
1ee0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  of the table or 
1ef0: 69 6e 64 65 78 0a 2a 2a 20 72 6f 6f 74 65 64 20  index.** rooted 
1f00: 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 6f  at page iRoot, o
1f10: 6e 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c 3a 0a  ne should call:.
1f20: 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28  **.**    assert(
1f30: 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63   !hasReadConflic
1f40: 74 73 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74  ts(pBtree, iRoot
1f50: 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ) );.*/.static i
1f60: 6e 74 20 68 61 73 52 65 61 64 43 6f 6e 66 6c 69  nt hasReadConfli
1f70: 63 74 73 28 42 74 72 65 65 20 2a 70 42 74 72 65  cts(Btree *pBtre
1f80: 65 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 29 7b 0a  e, Pgno iRoot){.
1f90: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
1fa0: 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70   for(p=pBtree->p
1fb0: 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
1fc0: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
1fd0: 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74   if( p->pgnoRoot
1fe0: 3d 3d 69 52 6f 6f 74 20 0a 20 20 20 20 20 26 26  ==iRoot .     &&
1ff0: 20 70 2d 3e 70 42 74 72 65 65 21 3d 70 42 74 72   p->pBtree!=pBtr
2000: 65 65 0a 20 20 20 20 20 26 26 20 30 3d 3d 28 70  ee.     && 0==(p
2010: 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c  ->pBtree->db->fl
2020: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61  ags & SQLITE_Rea
2030: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 0a 20 20  dUncommitted).  
2040: 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72    ){.      retur
2050: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
2060: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
2070: 64 69 66 20 20 20 20 2f 2a 20 23 69 66 64 65 66  dif    /* #ifdef
2080: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
2090: 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 6f  ../*.** Query to
20a0: 20 73 65 65 20 69 66 20 42 74 72 65 65 20 68 61   see if Btree ha
20b0: 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61 69  ndle p may obtai
20c0: 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65  n a lock of type
20d0: 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41 44   eLock .** (READ
20e0: 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c  _LOCK or WRITE_L
20f0: 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62 6c  OCK) on the tabl
2100: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
2110: 20 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a 2a   iTab. Return.**
2120: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68   SQLITE_OK if th
2130: 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f 62  e lock may be ob
2140: 74 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c 69  tained (by calli
2150: 6e 67 0a 2a 2a 20 73 65 74 53 68 61 72 65 64 43  ng.** setSharedC
2160: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 29  acheTableLock())
2170: 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  , or SQLITE_LOCK
2180: 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74  ED if not..*/.st
2190: 61 74 69 63 20 69 6e 74 20 71 75 65 72 79 53 68  atic int querySh
21a0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
21b0: 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e  ck(Btree *p, Pgn
21c0: 6f 20 69 54 61 62 2c 20 75 38 20 65 4c 6f 63 6b  o iTab, u8 eLock
21d0: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
21e0: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
21f0: 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20  tLock *pIter;.. 
2200: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2210: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
2220: 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
2230: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2240: 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45   || eLock==WRITE
2250: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
2260: 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 20  t( p->db!=0 );. 
2270: 20 61 73 73 65 72 74 28 20 21 28 70 2d 3e 64 62   assert( !(p->db
2280: 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52  ->flags&SQLITE_R
2290: 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 7c  eadUncommitted)|
22a0: 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f  |eLock==WRITE_LO
22b0: 43 4b 7c 7c 69 54 61 62 3d 3d 31 20 29 3b 0a 20  CK||iTab==1 );. 
22c0: 20 0a 20 20 2f 2a 20 49 66 20 72 65 71 75 65 73   .  /* If reques
22d0: 74 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63  ting a write-loc
22e0: 6b 2c 20 74 68 65 6e 20 74 68 65 20 42 74 72 65  k, then the Btre
22f0: 65 20 6d 75 73 74 20 68 61 76 65 20 61 6e 20 6f  e must have an o
2300: 70 65 6e 20 77 72 69 74 65 0a 20 20 2a 2a 20 74  pen write.  ** t
2310: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
2320: 69 73 20 66 69 6c 65 2e 20 41 6e 64 2c 20 6f 62  is file. And, ob
2330: 76 69 6f 75 73 6c 79 2c 20 66 6f 72 20 74 68 69  viously, for thi
2340: 73 20 74 6f 20 62 65 20 73 6f 20 74 68 65 72 65  s to be so there
2350: 20 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 61   .  ** must be a
2360: 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
2370: 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  nsaction on the 
2380: 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a  file itself..  *
2390: 2f 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63  /.  assert( eLoc
23a0: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
23b0: 28 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72  (p==pBt->pWriter
23c0: 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d   && p->inTrans==
23d0: 54 52 41 4e 53 5f 57 52 49 54 45 29 20 29 3b 0a  TRANS_WRITE) );.
23e0: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
23f0: 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 42  =READ_LOCK || pB
2400: 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
2410: 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
2420: 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f  .  .  /* This ro
2430: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
2440: 20 69 66 20 74 68 65 20 73 68 61 72 65 64 2d 63   if the shared-c
2450: 61 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61 62  ache is not enab
2460: 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 21 70 2d  led */.  if( !p-
2470: 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
2480: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2490: 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  K;.  }..  /* If 
24a0: 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65  some other conne
24b0: 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67  ction is holding
24c0: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
24d0: 63 6b 2c 20 74 68 65 0a 20 20 2a 2a 20 72 65 71  ck, the.  ** req
24e0: 75 65 73 74 65 64 20 6c 6f 63 6b 20 6d 61 79 20  uested lock may 
24f0: 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e  not be obtained.
2500: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
2510: 3e 70 57 72 69 74 65 72 21 3d 70 20 26 26 20 28  >pWriter!=p && (
2520: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
2530: 42 54 53 5f 45 58 43 4c 55 53 49 56 45 29 21 3d  BTS_EXCLUSIVE)!=
2540: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
2550: 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
2560: 64 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e 70 57  d(p->db, pBt->pW
2570: 72 69 74 65 72 2d 3e 64 62 29 3b 0a 20 20 20 20  riter->db);.    
2580: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
2590: 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
25a0: 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 70 49 74  ;.  }..  for(pIt
25b0: 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70  er=pBt->pLock; p
25c0: 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65  Iter; pIter=pIte
25d0: 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f  r->pNext){.    /
25e0: 2a 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  * The condition 
25f0: 28 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65  (pIter->eLock!=e
2600: 4c 6f 63 6b 29 20 69 6e 20 74 68 65 20 66 6f 6c  Lock) in the fol
2610: 6c 6f 77 69 6e 67 20 69 66 28 2e 2e 2e 29 20 0a  lowing if(...) .
2620: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
2630: 20 69 73 20 61 20 73 69 6d 70 6c 69 66 69 63 61   is a simplifica
2640: 74 69 6f 6e 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a  tion of:.    **.
2650: 20 20 20 20 2a 2a 20 20 20 28 65 4c 6f 63 6b 3d      **   (eLock=
2660: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 20 70  =WRITE_LOCK || p
2670: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Iter->eLock==WRI
2680: 54 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 2a 2a 0a  TE_LOCK).    **.
2690: 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20      ** since we 
26a0: 6b 6e 6f 77 20 74 68 61 74 20 69 66 20 65 4c 6f  know that if eLo
26b0: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 2c 20  ck==WRITE_LOCK, 
26c0: 74 68 65 6e 20 6e 6f 20 6f 74 68 65 72 20 63 6f  then no other co
26d0: 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  nnection.    ** 
26e0: 6d 61 79 20 68 6f 6c 64 20 61 20 57 52 49 54 45  may hold a WRITE
26f0: 5f 4c 4f 43 4b 20 6f 6e 20 61 6e 79 20 74 61 62  _LOCK on any tab
2700: 6c 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20  le in this file 
2710: 28 73 69 6e 63 65 20 74 68 65 72 65 20 63 61 6e  (since there can
2720: 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 62 65 20  .    ** only be 
2730: 61 20 73 69 6e 67 6c 65 20 77 72 69 74 65 72 29  a single writer)
2740: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
2750: 65 72 74 28 20 70 49 74 65 72 2d 3e 65 4c 6f 63  ert( pIter->eLoc
2760: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
2770: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52  pIter->eLock==WR
2780: 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  ITE_LOCK );.    
2790: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
27a0: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65  EAD_LOCK || pIte
27b0: 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 7c 7c 20  r->pBtree==p || 
27c0: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45  pIter->eLock==RE
27d0: 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  AD_LOCK);.    if
27e0: 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21  ( pIter->pBtree!
27f0: 3d 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54 61  =p && pIter->iTa
2800: 62 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 49 74  ble==iTab && pIt
2810: 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b  er->eLock!=eLock
2820: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2830: 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b  3ConnectionBlock
2840: 65 64 28 70 2d 3e 64 62 2c 20 70 49 74 65 72 2d  ed(p->db, pIter-
2850: 3e 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a 20 20  >pBtree->db);.  
2860: 20 20 20 20 69 66 28 20 65 4c 6f 63 6b 3d 3d 57      if( eLock==W
2870: 52 49 54 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  RITE_LOCK ){.   
2880: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d       assert( p==
2890: 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a  pBt->pWriter );.
28a0: 20 20 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73          pBt->bts
28b0: 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 45 4e  Flags |= BTS_PEN
28c0: 44 49 4e 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20  DING;.      }.  
28d0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
28e0: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
28f0: 41 43 48 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ACHE;.    }.  }.
2900: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2910: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
2920: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  !SQLITE_OMIT_SHA
2930: 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69  RED_CACHE */..#i
2940: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2950: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
2960: 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20  *.** Add a lock 
2970: 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  on the table wit
2980: 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62  h root-page iTab
2990: 6c 65 20 74 6f 20 74 68 65 20 73 68 61 72 65 64  le to the shared
29a0: 2d 62 74 72 65 65 20 75 73 65 64 0a 2a 2a 20 62  -btree used.** b
29b0: 79 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70  y Btree handle p
29c0: 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4c 6f 63  . Parameter eLoc
29d0: 6b 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  k must be either
29e0: 20 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a   READ_LOCK or .*
29f0: 2a 20 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a  * WRITE_LOCK..**
2a00: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2a10: 6e 20 61 73 73 75 6d 65 73 20 74 68 65 20 66 6f  n assumes the fo
2a20: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
2a30: 20 28 61 29 20 54 68 65 20 73 70 65 63 69 66 69   (a) The specifi
2a40: 65 64 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  ed Btree object 
2a50: 70 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74  p is connected t
2a60: 6f 20 61 20 73 68 61 72 61 62 6c 65 0a 2a 2a 20  o a sharable.** 
2a70: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28        database (
2a80: 6f 6e 65 20 77 69 74 68 20 74 68 65 20 42 74 53  one with the BtS
2a90: 68 61 72 65 64 2e 73 68 61 72 61 62 6c 65 20 66  hared.sharable f
2aa0: 6c 61 67 20 73 65 74 29 2c 20 61 6e 64 0a 2a 2a  lag set), and.**
2ab0: 0a 2a 2a 20 20 20 28 62 29 20 4e 6f 20 6f 74 68  .**   (b) No oth
2ac0: 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 73  er Btree objects
2ad0: 20 68 6f 6c 64 20 61 20 6c 6f 63 6b 20 74 68 61   hold a lock tha
2ae0: 74 20 63 6f 6e 66 6c 69 63 74 73 0a 2a 2a 20 20  t conflicts.**  
2af0: 20 20 20 20 20 77 69 74 68 20 74 68 65 20 72 65       with the re
2b00: 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 28 69 2e  quested lock (i.
2b10: 65 2e 20 71 75 65 72 79 53 68 61 72 65 64 43 61  e. querySharedCa
2b20: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20 68  cheTableLock() h
2b30: 61 73 0a 2a 2a 20 20 20 20 20 20 20 61 6c 72 65  as.**       alre
2b40: 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  ady been called 
2b50: 61 6e 64 20 72 65 74 75 72 6e 65 64 20 53 51 4c  and returned SQL
2b60: 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 53  ITE_OK)..**.** S
2b70: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2b80: 72 6e 65 64 20 69 66 20 74 68 65 20 6c 6f 63 6b  rned if the lock
2b90: 20 69 73 20 61 64 64 65 64 20 73 75 63 63 65 73   is added succes
2ba0: 73 66 75 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 4e  sfully. SQLITE_N
2bb0: 4f 4d 45 4d 20 0a 2a 2a 20 69 73 20 72 65 74 75  OMEM .** is retu
2bc0: 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63  rned if a malloc
2bd0: 20 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2e 0a   attempt fails..
2be0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
2bf0: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2c00: 65 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20  eLock(Btree *p, 
2c10: 50 67 6e 6f 20 69 54 61 62 6c 65 2c 20 75 38 20  Pgno iTable, u8 
2c20: 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61 72  eLock){.  BtShar
2c30: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
2c40: 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63  ;.  BtLock *pLoc
2c50: 6b 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20  k = 0;.  BtLock 
2c60: 2a 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72  *pIter;..  asser
2c70: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
2c80: 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
2c90: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
2ca0: 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  =READ_LOCK || eL
2cb0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
2cc0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
2cd0: 64 62 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41  db!=0 );..  /* A
2ce0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
2cf0: 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d   the read-uncomm
2d00: 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 20 77  itted flag set w
2d10: 69 6c 6c 20 6e 65 76 65 72 20 74 72 79 20 74 6f  ill never try to
2d20: 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 20 61 20 72  .  ** obtain a r
2d30: 65 61 64 2d 6c 6f 63 6b 20 75 73 69 6e 67 20 74  ead-lock using t
2d40: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68  his function. Th
2d50: 65 20 6f 6e 6c 79 20 72 65 61 64 2d 6c 6f 63 6b  e only read-lock
2d60: 20 6f 62 74 61 69 6e 65 64 0a 20 20 2a 2a 20 62   obtained.  ** b
2d70: 79 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  y a connection i
2d80: 6e 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  n read-uncommitt
2d90: 65 64 20 6d 6f 64 65 20 69 73 20 6f 6e 20 74 68  ed mode is on th
2da0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
2db0: 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 61 6e 64  .  ** table, and
2dc0: 20 74 68 61 74 20 6c 6f 63 6b 20 69 73 20 6f 62   that lock is ob
2dd0: 74 61 69 6e 65 64 20 69 6e 20 42 74 72 65 65 42  tained in BtreeB
2de0: 65 67 69 6e 54 72 61 6e 73 28 29 2e 20 20 2a 2f  eginTrans().  */
2df0: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 28 70  .  assert( 0==(p
2e00: 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  ->db->flags&SQLI
2e10: 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  TE_ReadUncommitt
2e20: 65 64 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52  ed) || eLock==WR
2e30: 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f  ITE_LOCK );..  /
2e40: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2e50: 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63  should only be c
2e60: 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72 61  alled on a shara
2e70: 62 6c 65 20 62 2d 74 72 65 65 20 61 66 74 65 72  ble b-tree after
2e80: 20 69 74 20 0a 20 20 2a 2a 20 68 61 73 20 62 65   it .  ** has be
2e90: 65 6e 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68  en determined th
2ea0: 61 74 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74 72  at no other b-tr
2eb0: 65 65 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66 6c  ee holds a confl
2ec0: 69 63 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a 2f  icting lock.  */
2ed0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 68  .  assert( p->sh
2ee0: 61 72 61 62 6c 65 20 29 3b 0a 20 20 61 73 73 65  arable );.  asse
2ef0: 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71  rt( SQLITE_OK==q
2f00: 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
2f10: 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62  ableLock(p, iTab
2f20: 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20  le, eLock) );.. 
2f30: 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63 68   /* First search
2f40: 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61 6e   the list for an
2f50: 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20 6f   existing lock o
2f60: 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f  n this table. */
2f70: 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74  .  for(pIter=pBt
2f80: 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20  ->pLock; pIter; 
2f90: 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65  pIter=pIter->pNe
2fa0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74  xt){.    if( pIt
2fb0: 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62  er->iTable==iTab
2fc0: 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42 74  le && pIter->pBt
2fd0: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
2fe0: 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a 20  pLock = pIter;. 
2ff0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3000: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
3010: 68 65 20 61 62 6f 76 65 20 73 65 61 72 63 68 20  he above search 
3020: 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 42  did not find a B
3030: 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73 73  tLock struct ass
3040: 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65 20 70  ociating Btree p
3050: 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c 65  .  ** with table
3060: 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61 74   iTable, allocat
3070: 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20 69  e one and link i
3080: 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e  t into the list.
3090: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c 6f  .  */.  if( !pLo
30a0: 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20  ck ){.    pLock 
30b0: 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c 69  = (BtLock *)sqli
30c0: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  te3MallocZero(si
30d0: 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20  zeof(BtLock));. 
30e0: 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b     if( !pLock ){
30f0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
3100: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
3110: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63 6b  .    }.    pLock
3120: 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 6c  ->iTable = iTabl
3130: 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 42  e;.    pLock->pB
3140: 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 70 4c  tree = p;.    pL
3150: 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  ock->pNext = pBt
3160: 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74  ->pLock;.    pBt
3170: 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b  ->pLock = pLock;
3180: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
3190: 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b 20  he BtLock.eLock 
31a0: 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65 20  variable to the 
31b0: 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20 63  maximum of the c
31c0: 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a 2a  urrent lock.  **
31d0: 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74   and the request
31e0: 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73 20 6d 65  ed lock. This me
31f0: 61 6e 73 20 69 66 20 61 20 77 72 69 74 65 2d 6c  ans if a write-l
3200: 6f 63 6b 20 77 61 73 20 61 6c 72 65 61 64 79 20  ock was already 
3210: 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64 20 61 20  held.  ** and a 
3220: 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71 75 65 73  read-lock reques
3230: 74 65 64 2c 20 77 65 20 64 6f 6e 27 74 20 69 6e  ted, we don't in
3240: 63 6f 72 72 65 63 74 6c 79 20 64 6f 77 6e 67 72  correctly downgr
3250: 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20  ade the lock..  
3260: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 57 52 49  */.  assert( WRI
3270: 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f 43  TE_LOCK>READ_LOC
3280: 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63 6b  K );.  if( eLock
3290: 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 7b  >pLock->eLock ){
32a0: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  .    pLock->eLoc
32b0: 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a  k = eLock;.  }..
32c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
32d0: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
32e0: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  !SQLITE_OMIT_SHA
32f0: 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69  RED_CACHE */..#i
3300: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
3310: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
3320: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c  *.** Release all
3330: 20 74 68 65 20 74 61 62 6c 65 20 6c 6f 63 6b 73   the table locks
3340: 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64   (locks obtained
3350: 20 76 69 61 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a   via calls to.**
3360: 20 74 68 65 20 73 65 74 53 68 61 72 65 64 43 61   the setSharedCa
3370: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20 70  cheTableLock() p
3380: 72 6f 63 65 64 75 72 65 29 20 68 65 6c 64 20 62  rocedure) held b
3390: 79 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 70  y Btree object p
33a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
33b0: 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
33c0: 61 74 20 42 74 72 65 65 20 70 20 68 61 73 20 61  at Btree p has a
33d0: 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f 72 20 77  n open read or w
33e0: 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63  rite .** transac
33f0: 74 69 6f 6e 2e 20 49 66 20 69 74 20 64 6f 65 73  tion. If it does
3400: 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 42   not, then the B
3410: 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c 61 67 0a  TS_PENDING flag.
3420: 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63 6f 72 72  ** may be incorr
3430: 65 63 74 6c 79 20 63 6c 65 61 72 65 64 2e 0a 2a  ectly cleared..*
3440: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c  /.static void cl
3450: 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
3460: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72 65  eTableLocks(Btre
3470: 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
3480: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
3490: 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70 70 49 74  .  BtLock **ppIt
34a0: 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c 6f 63 6b  er = &pBt->pLock
34b0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
34c0: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
34d0: 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
34e0: 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  rt( p->sharable 
34f0: 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72 20 29 3b  || 0==*ppIter );
3500: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e  .  assert( p->in
3510: 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20 20 77 68  Trans>0 );..  wh
3520: 69 6c 65 28 20 2a 70 70 49 74 65 72 20 29 7b 0a  ile( *ppIter ){.
3530: 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63      BtLock *pLoc
3540: 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a 20 20 20  k = *ppIter;.   
3550: 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 62   assert( (pBt->b
3560: 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58  tsFlags & BTS_EX
3570: 43 4c 55 53 49 56 45 29 3d 3d 30 20 7c 7c 20 70  CLUSIVE)==0 || p
3580: 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 4c 6f  Bt->pWriter==pLo
3590: 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b 0a 20 20  ck->pBtree );.  
35a0: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
35b0: 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72 61 6e 73  >pBtree->inTrans
35c0: 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29  >=pLock->eLock )
35d0: 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d  ;.    if( pLock-
35e0: 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20  >pBtree==p ){.  
35f0: 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20 70 4c      *ppIter = pL
3600: 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ock->pNext;.    
3610: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
3620: 3e 69 54 61 62 6c 65 21 3d 31 20 7c 7c 20 70 4c  >iTable!=1 || pL
3630: 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b 20 29 3b  ock==&p->lock );
3640: 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 63 6b  .      if( pLock
3650: 2d 3e 69 54 61 62 6c 65 21 3d 31 20 29 7b 0a 20  ->iTable!=1 ){. 
3660: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
3670: 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20  ree(pLock);.    
3680: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
3690: 20 20 20 20 20 70 70 49 74 65 72 20 3d 20 26 70       ppIter = &p
36a0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Lock->pNext;.   
36b0: 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
36c0: 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  ( (pBt->btsFlags
36d0: 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29 3d   & BTS_PENDING)=
36e0: 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69 74  =0 || pBt->pWrit
36f0: 65 72 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  er );.  if( pBt-
3700: 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20  >pWriter==p ){. 
3710: 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20     pBt->pWriter 
3720: 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74  = 0;.    pBt->bt
3730: 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53 5f  sFlags &= ~(BTS_
3740: 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50 45  EXCLUSIVE|BTS_PE
3750: 4e 44 49 4e 47 29 3b 0a 20 20 7d 65 6c 73 65 20  NDING);.  }else 
3760: 69 66 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61  if( pBt->nTransa
3770: 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20 20 20 20  ction==2 ){.    
3780: 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
3790: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
37a0: 42 74 72 65 65 20 70 20 69 73 20 63 6f 6e 63 6c  Btree p is concl
37b0: 75 64 69 6e 67 20 69 74 73 20 0a 20 20 20 20 2a  uding its .    *
37c0: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49  * transaction. I
37d0: 66 20 74 68 65 72 65 20 63 75 72 72 65 6e 74 6c  f there currentl
37e0: 79 20 65 78 69 73 74 73 20 61 20 77 72 69 74 65  y exists a write
37f0: 72 2c 20 61 6e 64 20 70 20 69 73 20 6e 6f 74 0a  r, and p is not.
3800: 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72 69 74      ** that writ
3810: 65 72 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d  er, then the num
3820: 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c  ber of locks hel
3830: 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  d by connections
3840: 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 74 68   other.    ** th
3850: 61 6e 20 74 68 65 20 77 72 69 74 65 72 20 6d 75  an the writer mu
3860: 73 74 20 62 65 20 61 62 6f 75 74 20 74 6f 20 64  st be about to d
3870: 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20 49 6e 20  rop to zero. In 
3880: 74 68 69 73 20 63 61 73 65 0a 20 20 20 20 2a 2a  this case.    **
3890: 20 73 65 74 20 74 68 65 20 42 54 53 5f 50 45 4e   set the BTS_PEN
38a0: 44 49 4e 47 20 66 6c 61 67 20 74 6f 20 30 2e 0a  DING flag to 0..
38b0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
38c0: 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 63 75   there is not cu
38d0: 72 72 65 6e 74 6c 79 20 61 20 77 72 69 74 65 72  rrently a writer
38e0: 2c 20 74 68 65 6e 20 42 54 53 5f 50 45 4e 44 49  , then BTS_PENDI
38f0: 4e 47 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62  NG must.    ** b
3900: 65 20 7a 65 72 6f 20 61 6c 72 65 61 64 79 2e 20  e zero already. 
3910: 53 6f 20 74 68 69 73 20 6e 65 78 74 20 6c 69 6e  So this next lin
3920: 65 20 69 73 20 68 61 72 6d 6c 65 73 73 20 69 6e  e is harmless in
3930: 20 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20 20   that case..    
3940: 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46  */.    pBt->btsF
3950: 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 50 45 4e  lags &= ~BTS_PEN
3960: 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  DING;.  }.}../*.
3970: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
3980: 20 63 68 61 6e 67 65 73 20 61 6c 6c 20 77 72 69   changes all wri
3990: 74 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  te-locks held by
39a0: 20 42 74 72 65 65 20 70 20 69 6e 74 6f 20 72 65   Btree p into re
39b0: 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74 61  ad-locks..*/.sta
39c0: 74 69 63 20 76 6f 69 64 20 64 6f 77 6e 67 72 61  tic void downgra
39d0: 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  deAllSharedCache
39e0: 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72 65 65  TableLocks(Btree
39f0: 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
3a00: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
3a10: 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74    if( pBt->pWrit
3a20: 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 42 74 4c  er==p ){.    BtL
3a30: 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20 20 20 20  ock *pLock;.    
3a40: 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30  pBt->pWriter = 0
3a50: 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c  ;.    pBt->btsFl
3a60: 61 67 73 20 26 3d 20 7e 28 42 54 53 5f 45 58 43  ags &= ~(BTS_EXC
3a70: 4c 55 53 49 56 45 7c 42 54 53 5f 50 45 4e 44 49  LUSIVE|BTS_PENDI
3a80: 4e 47 29 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f  NG);.    for(pLo
3a90: 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70  ck=pBt->pLock; p
3aa0: 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63  Lock; pLock=pLoc
3ab0: 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  k->pNext){.     
3ac0: 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e   assert( pLock->
3ad0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
3ae0: 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65   || pLock->pBtre
3af0: 65 3d 3d 70 20 29 3b 0a 20 20 20 20 20 20 70 4c  e==p );.      pL
3b00: 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 52 45 41  ock->eLock = REA
3b10: 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20  D_LOCK;.    }.  
3b20: 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53  }.}..#endif /* S
3b30: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
3b40: 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73 74 61 74  D_CACHE */..stat
3b50: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50  ic void releaseP
3b60: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
3b70: 67 65 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72 64  ge);  /* Forward
3b80: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 0a 2f   reference */../
3b90: 2a 0a 2a 2a 2a 2a 2a 20 54 68 69 73 20 72 6f 75  *.***** This rou
3ba0: 74 69 6e 65 20 69 73 20 75 73 65 64 20 69 6e 73  tine is used ins
3bb0: 69 64 65 20 6f 66 20 61 73 73 65 72 74 28 29 20  ide of assert() 
3bc0: 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  only ****.**.** 
3bd0: 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
3be0: 63 75 72 73 6f 72 20 68 6f 6c 64 73 20 74 68 65  cursor holds the
3bf0: 20 6d 75 74 65 78 20 6f 6e 20 69 74 73 20 42 74   mutex on its Bt
3c00: 53 68 61 72 65 64 0a 2a 2f 0a 23 69 66 64 65 66  Shared.*/.#ifdef
3c10: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74   SQLITE_DEBUG.st
3c20: 61 74 69 63 20 69 6e 74 20 63 75 72 73 6f 72 48  atic int cursorH
3c30: 6f 6c 64 73 4d 75 74 65 78 28 42 74 43 75 72 73  oldsMutex(BtCurs
3c40: 6f 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  or *p){.  return
3c50: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
3c60: 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65  eld(p->pBt->mute
3c70: 78 29 3b 0a 7d 0a 0a 2f 2a 20 56 65 72 69 66 79  x);.}../* Verify
3c80: 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
3c90: 20 61 6e 64 20 74 68 65 20 42 74 53 68 61 72 65   and the BtShare
3ca0: 64 20 61 67 72 65 65 20 61 62 6f 75 74 20 77 68  d agree about wh
3cb0: 61 74 20 69 73 20 74 68 65 20 63 75 72 72 65 6e  at is the curren
3cc0: 74 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f  t.** database co
3cd0: 6e 6e 65 74 69 6f 6e 2e 20 54 68 69 73 20 69 73  nnetion. This is
3ce0: 20 69 6d 70 6f 72 74 61 6e 74 20 69 6e 20 73 68   important in sh
3cf0: 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2e  ared-cache mode.
3d00: 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
3d10: 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   .** connection 
3d20: 70 6f 69 6e 74 65 72 73 20 67 65 74 20 6f 75 74  pointers get out
3d30: 2d 6f 66 2d 73 79 6e 63 2c 20 69 74 20 69 73 20  -of-sync, it is 
3d40: 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 72 6f 75  possible for rou
3d50: 74 69 6e 65 73 20 6c 69 6b 65 0a 2a 2a 20 62 74  tines like.** bt
3d60: 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 74 6f  reeInitPage() to
3d70: 20 72 65 66 65 72 65 6e 63 65 20 61 6e 20 73 74   reference an st
3d80: 61 6c 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  ale connection p
3d90: 6f 69 6e 74 65 72 20 74 68 61 74 20 72 65 66 65  ointer that refe
3da0: 72 65 6e 63 65 73 20 61 0a 2a 2a 20 61 20 63 6f  rences a.** a co
3db0: 6e 6e 65 63 74 69 6f 6e 20 74 68 61 74 20 68 61  nnection that ha
3dc0: 73 20 61 6c 72 65 61 64 79 20 63 6c 6f 73 65 64  s already closed
3dd0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
3de0: 69 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 61  is used inside a
3df0: 73 73 65 72 74 28 29 0a 2a 2a 20 73 74 61 74 65  ssert().** state
3e00: 6d 65 6e 74 73 20 6f 6e 6c 79 20 61 6e 64 20 66  ments only and f
3e10: 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 20 6f  or the purpose o
3e20: 66 20 64 6f 75 62 6c 65 2d 63 68 65 63 6b 69 6e  f double-checkin
3e30: 67 20 74 68 61 74 20 74 68 65 20 62 74 72 65 65  g that the btree
3e40: 20 63 6f 64 65 0a 2a 2a 20 64 6f 65 73 20 6b 65   code.** does ke
3e50: 65 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ep the database 
3e60: 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74  connection point
3e70: 65 72 73 20 75 70 2d 74 6f 2d 64 61 74 65 2e 0a  ers up-to-date..
3e80: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75  */.static int cu
3e90: 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
3ea0: 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20  (BtCursor *p){. 
3eb0: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
3ec0: 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
3ed0: 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 70 42 74    return (p->pBt
3ee0: 72 65 65 2d 3e 64 62 3d 3d 70 2d 3e 70 42 74 2d  ree->db==p->pBt-
3ef0: 3e 64 62 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  >db);.}.#endif..
3f00: 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65  /*.** Invalidate
3f10: 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61   the overflow ca
3f20: 63 68 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f  che of the curso
3f30: 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  r passed as the 
3f40: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a  first argument..
3f50: 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64  ** on the shared
3f60: 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
3f70: 20 70 42 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65   pBt..*/.#define
3f80: 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66   invalidateOverf
3f90: 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 20 28  lowCache(pCur) (
3fa0: 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
3fb0: 3d 20 7e 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  = ~BTCF_ValidOvf
3fc0: 6c 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69  l)../*.** Invali
3fd0: 64 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f  date the overflo
3fe0: 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
3ff0: 65 20 66 6f 72 20 61 6c 6c 20 63 75 72 73 6f 72  e for all cursor
4000: 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20 74  s opened.** on t
4010: 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65 20  he shared btree 
4020: 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a 2a  structure pBt..*
4030: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
4040: 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66  validateAllOverf
4050: 6c 6f 77 43 61 63 68 65 28 42 74 53 68 61 72 65  lowCache(BtShare
4060: 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75 72  d *pBt){.  BtCur
4070: 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74  sor *p;.  assert
4080: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
4090: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
40a0: 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d   );.  for(p=pBt-
40b0: 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
40c0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e  ->pNext){.    in
40d0: 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77  validateOverflow
40e0: 43 61 63 68 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a  Cache(p);.  }.}.
40f0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
4100: 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a  OMIT_INCRBLOB./*
4110: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
4120: 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f  n is called befo
4130: 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65  re modifying the
4140: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 74   contents of a t
4150: 61 62 6c 65 0a 2a 2a 20 74 6f 20 69 6e 76 61 6c  able.** to inval
4160: 69 64 61 74 65 20 61 6e 79 20 69 6e 63 72 62 6c  idate any incrbl
4170: 6f 62 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  ob cursors that 
4180: 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a  are open on the.
4190: 2a 2a 20 72 6f 77 20 6f 72 20 6f 6e 65 20 6f 66  ** row or one of
41a0: 20 74 68 65 20 72 6f 77 73 20 62 65 69 6e 67 20   the rows being 
41b0: 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  modified..**.** 
41c0: 49 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c  If argument isCl
41d0: 65 61 72 54 61 62 6c 65 20 69 73 20 74 72 75 65  earTable is true
41e0: 2c 20 74 68 65 6e 20 74 68 65 20 65 6e 74 69 72  , then the entir
41f0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
4200: 65 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 61 62  e.** table is ab
4210: 6f 75 74 20 74 6f 20 62 65 20 64 65 6c 65 74 65  out to be delete
4220: 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  d. In this case 
4230: 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 69  invalidate all i
4240: 6e 63 72 62 6c 6f 62 0a 2a 2a 20 63 75 72 73 6f  ncrblob.** curso
4250: 72 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 79 20 72  rs open on any r
4260: 6f 77 20 77 69 74 68 69 6e 20 74 68 65 20 74 61  ow within the ta
4270: 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  ble with root-pa
4280: 67 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 0a  ge pgnoRoot..**.
4290: 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
42a0: 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61   argument isClea
42b0: 72 54 61 62 6c 65 20 69 73 20 66 61 6c 73 65 2c  rTable is false,
42c0: 20 74 68 65 6e 20 74 68 65 20 72 6f 77 20 77 69   then the row wi
42d0: 74 68 0a 2a 2a 20 72 6f 77 69 64 20 69 52 6f 77  th.** rowid iRow
42e0: 20 69 73 20 62 65 69 6e 67 20 72 65 70 6c 61 63   is being replac
42f0: 65 64 20 6f 72 20 64 65 6c 65 74 65 64 2e 20 49  ed or deleted. I
4300: 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e 76 61  n this case inva
4310: 6c 69 64 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20 74  lidate.** only t
4320: 68 6f 73 65 20 69 6e 63 72 62 6c 6f 62 20 63 75  hose incrblob cu
4330: 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68  rsors open on th
4340: 61 74 20 73 70 65 63 69 66 69 63 20 72 6f 77 2e  at specific row.
4350: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4360: 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62 6c  invalidateIncrbl
4370: 6f 62 43 75 72 73 6f 72 73 28 0a 20 20 42 74 72  obCursors(.  Btr
4380: 65 65 20 2a 70 42 74 72 65 65 2c 20 20 20 20 20  ee *pBtree,     
4390: 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
43a0: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 68 65  base file to che
43b0: 63 6b 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77  ck */.  i64 iRow
43c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
43d0: 2f 2a 20 54 68 65 20 72 6f 77 69 64 20 74 68 61  /* The rowid tha
43e0: 74 20 6d 69 67 68 74 20 62 65 20 63 68 61 6e 67  t might be chang
43f0: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43  ing */.  int isC
4400: 6c 65 61 72 54 61 62 6c 65 20 20 20 20 20 20 20  learTable       
4410: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6c 6c 20   /* True if all 
4420: 72 6f 77 73 20 61 72 65 20 62 65 69 6e 67 20 64  rows are being d
4430: 65 6c 65 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 42  eleted */.){.  B
4440: 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69 66  tCursor *p;.  if
4450: 28 20 70 42 74 72 65 65 2d 3e 68 61 73 49 6e 63  ( pBtree->hasInc
4460: 72 62 6c 6f 62 43 75 72 3d 3d 30 20 29 20 72 65  rblobCur==0 ) re
4470: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
4480: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
4490: 73 4d 75 74 65 78 28 70 42 74 72 65 65 29 20 29  sMutex(pBtree) )
44a0: 3b 0a 20 20 70 42 74 72 65 65 2d 3e 68 61 73 49  ;.  pBtree->hasI
44b0: 6e 63 72 62 6c 6f 62 43 75 72 20 3d 20 30 3b 0a  ncrblobCur = 0;.
44c0: 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e    for(p=pBtree->
44d0: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
44e0: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
44f0: 20 20 69 66 28 20 28 70 2d 3e 63 75 72 46 6c 61    if( (p->curFla
4500: 67 73 20 26 20 42 54 43 46 5f 49 6e 63 72 62 6c  gs & BTCF_Incrbl
4510: 6f 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ob)!=0 ){.      
4520: 70 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72 62  pBtree->hasIncrb
4530: 6c 6f 62 43 75 72 20 3d 20 31 3b 0a 20 20 20 20  lobCur = 1;.    
4540: 20 20 69 66 28 20 69 73 43 6c 65 61 72 54 61 62    if( isClearTab
4550: 6c 65 20 7c 7c 20 70 2d 3e 69 6e 66 6f 2e 6e 4b  le || p->info.nK
4560: 65 79 3d 3d 69 52 6f 77 20 29 7b 0a 20 20 20 20  ey==iRow ){.    
4570: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20      p->eState = 
4580: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
4590: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
45a0: 7d 0a 7d 0a 0a 23 65 6c 73 65 0a 20 20 2f 2a 20  }.}..#else.  /* 
45b0: 53 74 75 62 20 66 75 6e 63 74 69 6f 6e 20 77 68  Stub function wh
45c0: 65 6e 20 49 4e 43 52 42 4c 4f 42 20 69 73 20 6f  en INCRBLOB is o
45d0: 6d 69 74 74 65 64 20 2a 2f 0a 20 20 23 64 65 66  mitted */.  #def
45e0: 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 49 6e  ine invalidateIn
45f0: 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 78 2c  crblobCursors(x,
4600: 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53  y,z).#endif /* S
4610: 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
4620: 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65  LOB */../*.** Se
4630: 74 20 62 69 74 20 70 67 6e 6f 20 6f 66 20 74 68  t bit pgno of th
4640: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
4650: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20 54  ontent bitvec. T
4660: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 0a 2a  his is called .*
4670: 2a 20 77 68 65 6e 20 61 20 70 61 67 65 20 74 68  * when a page th
4680: 61 74 20 70 72 65 76 69 6f 75 73 6c 79 20 63 6f  at previously co
4690: 6e 74 61 69 6e 65 64 20 64 61 74 61 20 62 65 63  ntained data bec
46a0: 6f 6d 65 73 20 61 20 66 72 65 65 2d 6c 69 73 74  omes a free-list
46b0: 20 6c 65 61 66 20 0a 2a 2a 20 70 61 67 65 2e 0a   leaf .** page..
46c0: 2a 2a 0a 2a 2a 20 54 68 65 20 42 74 53 68 61 72  **.** The BtShar
46d0: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
46e0: 69 74 76 65 63 20 65 78 69 73 74 73 20 74 6f 20  itvec exists to 
46f0: 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 6e 20 6f  work around an o
4700: 62 73 63 75 72 65 0a 2a 2a 20 62 75 67 20 63 61  bscure.** bug ca
4710: 75 73 65 64 20 62 79 20 74 68 65 20 69 6e 74 65  used by the inte
4720: 72 61 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20 75  raction of two u
4730: 73 65 66 75 6c 20 49 4f 20 6f 70 74 69 6d 69 7a  seful IO optimiz
4740: 61 74 69 6f 6e 73 20 73 75 72 72 6f 75 6e 64 69  ations surroundi
4750: 6e 67 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20  ng.** free-list 
4760: 6c 65 61 66 20 70 61 67 65 73 3a 0a 2a 2a 0a 2a  leaf pages:.**.*
4770: 2a 20 20 20 31 29 20 57 68 65 6e 20 61 6c 6c 20  *   1) When all 
4780: 64 61 74 61 20 69 73 20 64 65 6c 65 74 65 64 20  data is deleted 
4790: 66 72 6f 6d 20 61 20 70 61 67 65 20 61 6e 64 20  from a page and 
47a0: 74 68 65 20 70 61 67 65 20 62 65 63 6f 6d 65 73  the page becomes
47b0: 0a 2a 2a 20 20 20 20 20 20 61 20 66 72 65 65 2d  .**      a free-
47c0: 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 2c 20  list leaf page, 
47d0: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
47e0: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
47f0: 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20  atabase.**      
4800: 28 61 73 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  (as free-list le
4810: 61 66 20 70 61 67 65 73 20 63 6f 6e 74 61 69 6e  af pages contain
4820: 20 6e 6f 20 6d 65 61 6e 69 6e 67 66 75 6c 20 64   no meaningful d
4830: 61 74 61 29 2e 20 53 6f 6d 65 74 69 6d 65 73 0a  ata). Sometimes.
4840: 2a 2a 20 20 20 20 20 20 73 75 63 68 20 61 20 70  **      such a p
4850: 61 67 65 20 69 73 20 6e 6f 74 20 65 76 65 6e 20  age is not even 
4860: 6a 6f 75 72 6e 61 6c 6c 65 64 20 28 61 73 20 69  journalled (as i
4870: 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6d 6f  t will not be mo
4880: 64 69 66 69 65 64 2c 0a 2a 2a 20 20 20 20 20 20  dified,.**      
4890: 77 68 79 20 62 6f 74 68 65 72 20 6a 6f 75 72 6e  why bother journ
48a0: 61 6c 6c 69 6e 67 20 69 74 3f 29 2e 0a 2a 2a 0a  alling it?)..**.
48b0: 2a 2a 20 20 20 32 29 20 57 68 65 6e 20 61 20 66  **   2) When a f
48c0: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
48d0: 67 65 20 69 73 20 72 65 75 73 65 64 2c 20 69 74  ge is reused, it
48e0: 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74  s content is not
48f0: 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66 72   read.**      fr
4900: 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
4910: 6f 72 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  or written to th
4920: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
4930: 77 68 79 20 73 68 6f 75 6c 64 20 69 74 0a 2a 2a  why should it.**
4940: 20 20 20 20 20 20 62 65 2c 20 69 66 20 69 74 20        be, if it 
4950: 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 6d 65  is not at all me
4960: 61 6e 69 6e 67 66 75 6c 3f 29 2e 0a 2a 2a 0a 2a  aningful?)..**.*
4970: 2a 20 42 79 20 74 68 65 6d 73 65 6c 76 65 73 2c  * By themselves,
4980: 20 74 68 65 73 65 20 6f 70 74 69 6d 69 7a 61 74   these optimizat
4990: 69 6f 6e 73 20 77 6f 72 6b 20 66 69 6e 65 20 61  ions work fine a
49a0: 6e 64 20 70 72 6f 76 69 64 65 20 61 20 68 61 6e  nd provide a han
49b0: 64 79 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63  dy.** performanc
49c0: 65 20 62 6f 6f 73 74 20 74 6f 20 62 75 6c 6b 20  e boost to bulk 
49d0: 64 65 6c 65 74 65 20 6f 72 20 69 6e 73 65 72 74  delete or insert
49e0: 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 48 6f 77   operations. How
49f0: 65 76 65 72 2c 20 69 66 0a 2a 2a 20 61 20 70 61  ever, if.** a pa
4a00: 67 65 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74  ge is moved to t
4a10: 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64  he free-list and
4a20: 20 74 68 65 6e 20 72 65 75 73 65 64 20 77 69 74   then reused wit
4a30: 68 69 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20  hin the same.** 
4a40: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20 70  transaction, a p
4a50: 72 6f 62 6c 65 6d 20 63 6f 6d 65 73 20 75 70 2e  roblem comes up.
4a60: 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
4a70: 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77  not journalled w
4a80: 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20 6d 6f 76  hen.** it is mov
4a90: 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c  ed to the free-l
4aa0: 69 73 74 20 61 6e 64 20 69 74 20 69 73 20 61 6c  ist and it is al
4ab0: 73 6f 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65  so not journalle
4ac0: 64 20 77 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20  d when it.** is 
4ad0: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74  extracted from t
4ae0: 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64  he free-list and
4af0: 20 72 65 75 73 65 64 2c 20 74 68 65 6e 20 74 68   reused, then th
4b00: 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 0a  e original data.
4b10: 2a 2a 20 6d 61 79 20 62 65 20 6c 6f 73 74 2e 20  ** may be lost. 
4b20: 49 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20  In the event of 
4b30: 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 6d  a rollback, it m
4b40: 61 79 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62  ay not be possib
4b50: 6c 65 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65  le.** to restore
4b60: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
4b70: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f   its original co
4b80: 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a 2a 2a 0a  nfiguration..**.
4b90: 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20  ** The solution 
4ba0: 69 73 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  is the BtShared.
4bb0: 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76  pHasContent bitv
4bc0: 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20 70  ec. Whenever a p
4bd0: 61 67 65 20 69 73 20 0a 2a 2a 20 6d 6f 76 65 64  age is .** moved
4be0: 20 74 6f 20 62 65 63 6f 6d 65 20 61 20 66 72 65   to become a fre
4bf0: 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
4c00: 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  , the correspond
4c10: 69 6e 67 20 62 69 74 20 69 73 0a 2a 2a 20 73 65  ing bit is.** se
4c20: 74 20 69 6e 20 74 68 65 20 62 69 74 76 65 63 2e  t in the bitvec.
4c30: 20 57 68 65 6e 65 76 65 72 20 61 20 6c 65 61 66   Whenever a leaf
4c40: 20 70 61 67 65 20 69 73 20 65 78 74 72 61 63 74   page is extract
4c50: 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ed from the free
4c60: 2d 6c 69 73 74 2c 0a 2a 2a 20 6f 70 74 69 6d 69  -list,.** optimi
4c70: 7a 61 74 69 6f 6e 20 32 20 61 62 6f 76 65 20 69  zation 2 above i
4c80: 73 20 6f 6d 69 74 74 65 64 20 69 66 20 74 68 65  s omitted if the
4c90: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62   corresponding b
4ca0: 69 74 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a  it is already.**
4cb0: 20 73 65 74 20 69 6e 20 42 74 53 68 61 72 65 64   set in BtShared
4cc0: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 2e 20 54 68  .pHasContent. Th
4cd0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
4ce0: 65 20 62 69 74 76 65 63 20 61 72 65 20 63 6c 65  e bitvec are cle
4cf0: 61 72 65 64 0a 2a 2a 20 61 74 20 74 68 65 20 65  ared.** at the e
4d00: 6e 64 20 6f 66 20 65 76 65 72 79 20 74 72 61 6e  nd of every tran
4d10: 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  saction..*/.stat
4d20: 69 63 20 69 6e 74 20 62 74 72 65 65 53 65 74 48  ic int btreeSetH
4d30: 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72  asContent(BtShar
4d40: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67  ed *pBt, Pgno pg
4d50: 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  no){.  int rc = 
4d60: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
4d70: 20 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65   !pBt->pHasConte
4d80: 6e 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  nt ){.    assert
4d90: 28 20 70 67 6e 6f 3c 3d 70 42 74 2d 3e 6e 50 61  ( pgno<=pBt->nPa
4da0: 67 65 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70  ge );.    pBt->p
4db0: 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 73 71 6c  HasContent = sql
4dc0: 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
4dd0: 28 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20  (pBt->nPage);.  
4de0: 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73    if( !pBt->pHas
4df0: 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20  Content ){.     
4e00: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
4e10: 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
4e20: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
4e30: 49 54 45 5f 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d  ITE_OK && pgno<=
4e40: 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a  sqlite3BitvecSiz
4e50: 65 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65  e(pBt->pHasConte
4e60: 6e 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  nt) ){.    rc = 
4e70: 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
4e80: 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  (pBt->pHasConten
4e90: 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  t, pgno);.  }.  
4ea0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
4eb0: 0a 2a 2a 20 51 75 65 72 79 20 74 68 65 20 42 74  .** Query the Bt
4ec0: 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65  Shared.pHasConte
4ed0: 6e 74 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a  nt vector..**.**
4ee0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
4ef0: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
4f00: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
4f10: 61 67 65 20 69 73 20 72 65 6d 6f 76 65 64 20 66  age is removed f
4f20: 72 6f 6d 20 74 68 65 0a 2a 2a 20 66 72 65 65 2d  rom the.** free-
4f30: 6c 69 73 74 20 66 6f 72 20 72 65 75 73 65 2e 20  list for reuse. 
4f40: 49 74 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65  It returns false
4f50: 20 69 66 20 69 74 20 69 73 20 73 61 66 65 20 74   if it is safe t
4f60: 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 0a 2a  o retrieve the.*
4f70: 2a 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  * page from the 
4f80: 70 61 67 65 72 20 6c 61 79 65 72 20 77 69 74 68  pager layer with
4f90: 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74   the 'no-content
4fa0: 27 20 66 6c 61 67 20 73 65 74 2e 20 54 72 75 65  ' flag set. True
4fb0: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
4fc0: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47  tatic int btreeG
4fd0: 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53  etHasContent(BtS
4fe0: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
4ff0: 20 70 67 6e 6f 29 7b 0a 20 20 42 69 74 76 65 63   pgno){.  Bitvec
5000: 20 2a 70 20 3d 20 70 42 74 2d 3e 70 48 61 73 43   *p = pBt->pHasC
5010: 6f 6e 74 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e  ontent;.  return
5020: 20 28 70 20 26 26 20 28 70 67 6e 6f 3e 73 71 6c   (p && (pgno>sql
5030: 69 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70  ite3BitvecSize(p
5040: 29 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76  ) || sqlite3Bitv
5050: 65 63 54 65 73 74 28 70 2c 20 70 67 6e 6f 29 29  ecTest(p, pgno))
5060: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  );.}../*.** Clea
5070: 72 20 28 64 65 73 74 72 6f 79 29 20 74 68 65 20  r (destroy) the 
5080: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
5090: 74 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69  tent bitvec. Thi
50a0: 73 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69  s should be.** i
50b0: 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f  nvoked at the co
50c0: 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 65 61 63 68  nclusion of each
50d0: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
50e0: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
50f0: 69 64 20 62 74 72 65 65 43 6c 65 61 72 48 61 73  id btreeClearHas
5100: 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64  Content(BtShared
5110: 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65   *pBt){.  sqlite
5120: 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
5130: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29  Bt->pHasContent)
5140: 3b 0a 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e  ;.  pBt->pHasCon
5150: 74 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  tent = 0;.}../*.
5160: 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 6f  ** Release all o
5170: 66 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20 70  f the apPage[] p
5180: 61 67 65 73 20 66 6f 72 20 61 20 63 75 72 73 6f  ages for a curso
5190: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
51a0: 64 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c  d btreeReleaseAl
51b0: 6c 43 75 72 73 6f 72 50 61 67 65 73 28 42 74 43  lCursorPages(BtC
51c0: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
51d0: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
51e0: 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65  ; i<=pCur->iPage
51f0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65  ; i++){.    rele
5200: 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70  asePage(pCur->ap
5210: 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 70 43  Page[i]);.    pC
5220: 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20  ur->apPage[i] = 
5230: 30 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69  0;.  }.  pCur->i
5240: 50 61 67 65 20 3d 20 2d 31 3b 0a 7d 0a 0a 2f 2a  Page = -1;.}../*
5250: 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70  .** The cursor p
5260: 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c  assed as the onl
5270: 79 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20  y argument must 
5280: 70 6f 69 6e 74 20 74 6f 20 61 20 76 61 6c 69 64  point to a valid
5290: 20 65 6e 74 72 79 0a 2a 2a 20 77 68 65 6e 20 74   entry.** when t
52a0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
52b0: 63 61 6c 6c 65 64 20 28 69 2e 65 2e 20 68 61 76  called (i.e. hav
52c0: 65 20 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  e eState==CURSOR
52d0: 5f 56 41 4c 49 44 29 2e 20 54 68 69 73 0a 2a 2a  _VALID). This.**
52e0: 20 66 75 6e 63 74 69 6f 6e 20 73 61 76 65 73 20   function saves 
52f0: 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73  the current curs
5300: 6f 72 20 6b 65 79 20 69 6e 20 76 61 72 69 61 62  or key in variab
5310: 6c 65 73 20 70 43 75 72 2d 3e 6e 4b 65 79 20 61  les pCur->nKey a
5320: 6e 64 0a 2a 2a 20 70 43 75 72 2d 3e 70 4b 65 79  nd.** pCur->pKey
5330: 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  . SQLITE_OK is r
5340: 65 74 75 72 6e 65 64 20 69 66 20 73 75 63 63 65  eturned if succe
5350: 73 73 66 75 6c 20 6f 72 20 61 6e 20 53 51 4c 69  ssful or an SQLi
5360: 74 65 20 65 72 72 6f 72 20 0a 2a 2a 20 63 6f 64  te error .** cod
5370: 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a  e otherwise..**.
5380: 2a 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  ** If the cursor
5390: 20 69 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69   is open on an i
53a0: 6e 74 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65  ntkey table, the
53b0: 6e 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65  n the integer ke
53c0: 79 0a 2a 2a 20 28 74 68 65 20 72 6f 77 69 64 29  y.** (the rowid)
53d0: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 43   is stored in pC
53e0: 75 72 2d 3e 6e 4b 65 79 20 61 6e 64 20 70 43 75  ur->nKey and pCu
53f0: 72 2d 3e 70 4b 65 79 20 69 73 20 6c 65 66 74 20  r->pKey is left 
5400: 73 65 74 20 74 6f 0a 2a 2a 20 4e 55 4c 4c 2e 20  set to.** NULL. 
5410: 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  If the cursor is
5420: 20 6f 70 65 6e 20 6f 6e 20 61 20 6e 6f 6e 2d 69   open on a non-i
5430: 6e 74 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65  ntkey table, the
5440: 6e 20 70 43 75 72 2d 3e 70 4b 65 79 20 69 73 20  n pCur->pKey is 
5450: 0a 2a 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e 74  .** set to point
5460: 20 74 6f 20 61 20 6d 61 6c 6c 6f 63 65 64 20 62   to a malloced b
5470: 75 66 66 65 72 20 70 43 75 72 2d 3e 6e 4b 65 79  uffer pCur->nKey
5480: 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 20 63   bytes in size c
5490: 6f 6e 74 61 69 6e 69 6e 67 20 0a 2a 2a 20 74 68  ontaining .** th
54a0: 65 20 6b 65 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  e key..*/.static
54b0: 20 69 6e 74 20 73 61 76 65 43 75 72 73 6f 72 4b   int saveCursorK
54c0: 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ey(BtCursor *pCu
54d0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
54e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
54f0: 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  rt( CURSOR_VALID
5500: 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
5510: 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70  ;.  assert( 0==p
5520: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61  Cur->pKey );.  a
5530: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
5540: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
5550: 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 63 75  ..  if( pCur->cu
5560: 72 49 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f  rIntKey ){.    /
5570: 2a 20 4f 6e 6c 79 20 74 68 65 20 72 6f 77 69 64  * Only the rowid
5580: 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72   is required for
5590: 20 61 20 74 61 62 6c 65 20 62 74 72 65 65 20 2a   a table btree *
55a0: 2f 0a 20 20 20 20 70 43 75 72 2d 3e 6e 4b 65 79  /.    pCur->nKey
55b0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49   = sqlite3BtreeI
55c0: 6e 74 65 67 65 72 4b 65 79 28 70 43 75 72 29 3b  ntegerKey(pCur);
55d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
55e0: 20 46 6f 72 20 61 6e 20 69 6e 64 65 78 20 62 74   For an index bt
55f0: 72 65 65 2c 20 73 61 76 65 20 74 68 65 20 63 6f  ree, save the co
5600: 6d 70 6c 65 74 65 20 6b 65 79 20 63 6f 6e 74 65  mplete key conte
5610: 6e 74 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a  nt */.    void *
5620: 70 4b 65 79 3b 0a 20 20 20 20 70 43 75 72 2d 3e  pKey;.    pCur->
5630: 6e 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 42 74  nKey = sqlite3Bt
5640: 72 65 65 50 61 79 6c 6f 61 64 53 69 7a 65 28 70  reePayloadSize(p
5650: 43 75 72 29 3b 0a 20 20 20 20 70 4b 65 79 20 3d  Cur);.    pKey =
5660: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20   sqlite3Malloc( 
5670: 70 43 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20  pCur->nKey );.  
5680: 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20    if( pKey ){.  
5690: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
56a0: 42 74 72 65 65 50 61 79 6c 6f 61 64 28 70 43 75  BtreePayload(pCu
56b0: 72 2c 20 30 2c 20 28 69 6e 74 29 70 43 75 72 2d  r, 0, (int)pCur-
56c0: 3e 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20  >nKey, pKey);.  
56d0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
56e0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
56f0: 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70 4b   pCur->pKey = pK
5700: 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ey;.      }else{
5710: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5720: 5f 66 72 65 65 28 70 4b 65 79 29 3b 0a 20 20 20  _free(pKey);.   
5730: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
5740: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
5750: 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
5760: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
5770: 28 20 21 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b  ( !pCur->curIntK
5780: 65 79 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65  ey || !pCur->pKe
5790: 79 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  y );.  return rc
57a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20  ;.}../*.** Save 
57b0: 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73  the current curs
57c0: 6f 72 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74  or position in t
57d0: 68 65 20 76 61 72 69 61 62 6c 65 73 20 42 74 43  he variables BtC
57e0: 75 72 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61  ursor.nKey .** a
57f0: 6e 64 20 42 74 43 75 72 73 6f 72 2e 70 4b 65 79  nd BtCursor.pKey
5800: 2e 20 54 68 65 20 63 75 72 73 6f 72 27 73 20 73  . The cursor's s
5810: 74 61 74 65 20 69 73 20 73 65 74 20 74 6f 20 43  tate is set to C
5820: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
5830: 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  K..**.** The cal
5840: 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20  ler must ensure 
5850: 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
5860: 69 73 20 76 61 6c 69 64 20 28 68 61 73 20 65 53  is valid (has eS
5870: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
5880: 49 44 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20  ID).** prior to 
5890: 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
58a0: 74 69 6e 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69  tine.  .*/.stati
58b0: 63 20 69 6e 74 20 73 61 76 65 43 75 72 73 6f 72  c int saveCursor
58c0: 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f  Position(BtCurso
58d0: 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  r *pCur){.  int 
58e0: 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 43  rc;..  assert( C
58f0: 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75  URSOR_VALID==pCu
5900: 72 2d 3e 65 53 74 61 74 65 20 7c 7c 20 43 55 52  r->eState || CUR
5910: 53 4f 52 5f 53 4b 49 50 4e 45 58 54 3d 3d 70 43  SOR_SKIPNEXT==pC
5920: 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20 20  ur->eState );.  
5930: 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75 72 2d  assert( 0==pCur-
5940: 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72  >pKey );.  asser
5950: 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
5960: 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20  tex(pCur) );..  
5970: 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
5980: 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58  ==CURSOR_SKIPNEX
5990: 54 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65  T ){.    pCur->e
59a0: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56  State = CURSOR_V
59b0: 41 4c 49 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ALID;.  }else{. 
59c0: 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78     pCur->skipNex
59d0: 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 63  t = 0;.  }..  rc
59e0: 20 3d 20 73 61 76 65 43 75 72 73 6f 72 4b 65 79   = saveCursorKey
59f0: 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
5a00: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
5a10: 20 20 20 62 74 72 65 65 52 65 6c 65 61 73 65 41     btreeReleaseA
5a20: 6c 6c 43 75 72 73 6f 72 50 61 67 65 73 28 70 43  llCursorPages(pC
5a30: 75 72 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65  ur);.    pCur->e
5a40: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 52  State = CURSOR_R
5a50: 45 51 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a  EQUIRESEEK;.  }.
5a60: 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
5a70: 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69  s &= ~(BTCF_Vali
5a80: 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64  dNKey|BTCF_Valid
5a90: 4f 76 66 6c 7c 42 54 43 46 5f 41 74 4c 61 73 74  Ovfl|BTCF_AtLast
5aa0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
5ab0: 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  }../* Forward re
5ac0: 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69  ference */.stati
5ad0: 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49  c int SQLITE_NOI
5ae0: 4e 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f 72  NLINE saveCursor
5af0: 73 4f 6e 4c 69 73 74 28 42 74 43 75 72 73 6f 72  sOnList(BtCursor
5b00: 2a 2c 50 67 6e 6f 2c 42 74 43 75 72 73 6f 72 2a  *,Pgno,BtCursor*
5b10: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74  );../*.** Save t
5b20: 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20  he positions of 
5b30: 61 6c 6c 20 63 75 72 73 6f 72 73 20 28 65 78 63  all cursors (exc
5b40: 65 70 74 20 70 45 78 63 65 70 74 29 20 74 68 61  ept pExcept) tha
5b50: 74 20 61 72 65 20 6f 70 65 6e 20 6f 6e 0a 2a 2a  t are open on.**
5b60: 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
5b70: 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e  root-page iRoot.
5b80: 20 20 22 53 61 76 69 6e 67 20 74 68 65 20 63 75    "Saving the cu
5b90: 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 22 20 6d  rsor position" m
5ba0: 65 61 6e 73 20 74 68 61 74 0a 2a 2a 20 74 68 65  eans that.** the
5bb0: 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65   location in the
5bc0: 20 62 74 72 65 65 20 69 73 20 72 65 6d 65 6d 62   btree is rememb
5bd0: 65 72 65 64 20 69 6e 20 73 75 63 68 20 61 20 77  ered in such a w
5be0: 61 79 20 74 68 61 74 20 69 74 20 63 61 6e 20 62  ay that it can b
5bf0: 65 0a 2a 2a 20 6d 6f 76 65 64 20 62 61 63 6b 20  e.** moved back 
5c00: 74 6f 20 74 68 65 20 73 61 6d 65 20 73 70 6f 74  to the same spot
5c10: 20 61 66 74 65 72 20 74 68 65 20 62 74 72 65 65   after the btree
5c20: 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69   has been modifi
5c30: 65 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  ed.  This.** rou
5c40: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6a  tine is called j
5c50: 75 73 74 20 62 65 66 6f 72 65 20 63 75 72 73 6f  ust before curso
5c60: 72 20 70 45 78 63 65 70 74 20 69 73 20 75 73 65  r pExcept is use
5c70: 64 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 0a  d to modify the.
5c80: 2a 2a 20 74 61 62 6c 65 2c 20 66 6f 72 20 65 78  ** table, for ex
5c90: 61 6d 70 6c 65 20 69 6e 20 42 74 72 65 65 44 65  ample in BtreeDe
5ca0: 6c 65 74 65 28 29 20 6f 72 20 42 74 72 65 65 49  lete() or BtreeI
5cb0: 6e 73 65 72 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  nsert()..**.** I
5cc0: 66 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20  f there are two 
5cd0: 6f 72 20 6d 6f 72 65 20 63 75 72 73 6f 72 73 20  or more cursors 
5ce0: 6f 6e 20 74 68 65 20 73 61 6d 65 20 62 74 72 65  on the same btre
5cf0: 65 2c 20 74 68 65 6e 20 61 6c 6c 20 73 75 63 68  e, then all such
5d00: 20 0a 2a 2a 20 63 75 72 73 6f 72 73 20 73 68 6f   .** cursors sho
5d10: 75 6c 64 20 68 61 76 65 20 74 68 65 69 72 20 42  uld have their B
5d20: 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61  TCF_Multiple fla
5d30: 67 20 73 65 74 2e 20 20 54 68 65 20 62 74 72 65  g set.  The btre
5d40: 65 43 75 72 73 6f 72 28 29 0a 2a 2a 20 72 6f 75  eCursor().** rou
5d50: 74 69 6e 65 20 65 6e 66 6f 72 63 65 73 20 74 68  tine enforces th
5d60: 61 74 20 72 75 6c 65 2e 20 20 54 68 69 73 20 72  at rule.  This r
5d70: 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 6e 65 65 64  outine only need
5d80: 73 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 69  s to be called i
5d90: 6e 0a 2a 2a 20 74 68 65 20 75 6e 63 6f 6d 6d 6f  n.** the uncommo
5da0: 6e 20 63 61 73 65 20 77 68 65 6e 20 70 45 78 70  n case when pExp
5db0: 65 63 74 20 68 61 73 20 74 68 65 20 42 54 43 46  ect has the BTCF
5dc0: 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67 20 73  _Multiple flag s
5dd0: 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78  et..**.** If pEx
5de0: 70 65 63 74 21 3d 4e 55 4c 4c 20 61 6e 64 20 69  pect!=NULL and i
5df0: 66 20 6e 6f 20 6f 74 68 65 72 20 63 75 72 73 6f  f no other curso
5e00: 72 73 20 61 72 65 20 66 6f 75 6e 64 20 6f 6e 20  rs are found on 
5e10: 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 2d 70 61  the same root-pa
5e20: 67 65 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  ge,.** then the 
5e30: 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c  BTCF_Multiple fl
5e40: 61 67 20 6f 6e 20 70 45 78 70 65 63 74 20 69 73  ag on pExpect is
5e50: 20 63 6c 65 61 72 65 64 2c 20 74 6f 20 61 76 6f   cleared, to avo
5e60: 69 64 20 61 6e 6f 74 68 65 72 0a 2a 2a 20 70 6f  id another.** po
5e70: 69 6e 74 6c 65 73 73 20 63 61 6c 6c 20 74 6f 20  intless call to 
5e80: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
5e90: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
5ea0: 6f 6e 20 6e 6f 74 65 3a 20 20 54 68 69 73 20 72  on note:  This r
5eb0: 6f 75 74 69 6e 65 20 6d 65 72 65 6c 79 20 63 68  outine merely ch
5ec0: 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 61  ecks to see if a
5ed0: 6e 79 20 63 75 72 73 6f 72 73 0a 2a 2a 20 6e 65  ny cursors.** ne
5ee0: 65 64 20 74 6f 20 62 65 20 73 61 76 65 64 2e 20  ed to be saved. 
5ef0: 20 49 74 20 63 61 6c 6c 73 20 6f 75 74 20 74 6f   It calls out to
5f00: 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69   saveCursorsOnLi
5f10: 73 74 28 29 20 69 6e 20 74 68 65 20 28 75 6e 75  st() in the (unu
5f20: 73 75 61 6c 29 0a 2a 2a 20 65 76 65 6e 74 20 74  sual).** event t
5f30: 68 61 74 20 63 75 72 73 6f 72 73 20 61 72 65 20  hat cursors are 
5f40: 69 6e 20 6e 65 65 64 20 74 6f 20 62 65 69 6e 67  in need to being
5f50: 20 73 61 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69   saved..*/.stati
5f60: 63 20 69 6e 74 20 73 61 76 65 41 6c 6c 43 75 72  c int saveAllCur
5f70: 73 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70  sors(BtShared *p
5f80: 42 74 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20  Bt, Pgno iRoot, 
5f90: 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70  BtCursor *pExcep
5fa0: 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  t){.  BtCursor *
5fb0: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  p;.  assert( sql
5fc0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
5fd0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
5fe0: 20 61 73 73 65 72 74 28 20 70 45 78 63 65 70 74   assert( pExcept
5ff0: 3d 3d 30 20 7c 7c 20 70 45 78 63 65 70 74 2d 3e  ==0 || pExcept->
6000: 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20 66 6f  pBt==pBt );.  fo
6010: 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  r(p=pBt->pCursor
6020: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
6030: 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 70 45 78  {.    if( p!=pEx
6040: 63 65 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f  cept && (0==iRoo
6050: 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74  t || p->pgnoRoot
6060: 3d 3d 69 52 6f 6f 74 29 20 29 20 62 72 65 61 6b  ==iRoot) ) break
6070: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 20 29 20  ;.  }.  if( p ) 
6080: 72 65 74 75 72 6e 20 73 61 76 65 43 75 72 73 6f  return saveCurso
6090: 72 73 4f 6e 4c 69 73 74 28 70 2c 20 69 52 6f 6f  rsOnList(p, iRoo
60a0: 74 2c 20 70 45 78 63 65 70 74 29 3b 0a 20 20 69  t, pExcept);.  i
60b0: 66 28 20 70 45 78 63 65 70 74 20 29 20 70 45 78  f( pExcept ) pEx
60c0: 63 65 70 74 2d 3e 63 75 72 46 6c 61 67 73 20 26  cept->curFlags &
60d0: 3d 20 7e 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65  = ~BTCF_Multiple
60e0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
60f0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 69 73  E_OK;.}../* This
6100: 20 68 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20   helper routine 
6110: 74 6f 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72  to saveAllCursor
6120: 73 20 64 6f 65 73 20 74 68 65 20 61 63 74 75 61  s does the actua
6130: 6c 20 77 6f 72 6b 20 6f 66 20 73 61 76 69 6e 67  l work of saving
6140: 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 73 20  .** the cursors 
6150: 69 66 20 61 6e 64 20 77 68 65 6e 20 61 20 63 75  if and when a cu
6160: 72 73 6f 72 20 69 73 20 66 6f 75 6e 64 20 74 68  rsor is found th
6170: 61 74 20 61 63 74 75 61 6c 6c 79 20 72 65 71 75  at actually requ
6180: 69 72 65 73 20 73 61 76 69 6e 67 2e 0a 2a 2a 20  ires saving..** 
6190: 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  The common case 
61a0: 69 73 20 74 68 61 74 20 6e 6f 20 63 75 72 73 6f  is that no curso
61b0: 72 73 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61  rs need to be sa
61c0: 76 65 64 2c 20 73 6f 20 74 68 69 73 20 72 6f 75  ved, so this rou
61d0: 74 69 6e 65 20 69 73 0a 2a 2a 20 62 72 6f 6b 65  tine is.** broke
61e0: 6e 20 6f 75 74 20 66 72 6f 6d 20 69 74 73 20 63  n out from its c
61f0: 61 6c 6c 65 72 20 74 6f 20 61 76 6f 69 64 20 75  aller to avoid u
6200: 6e 6e 65 63 65 73 73 61 72 79 20 73 74 61 63 6b  nnecessary stack
6210: 20 70 6f 69 6e 74 65 72 20 6d 6f 76 65 6d 65 6e   pointer movemen
6220: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
6230: 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
6240: 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69   saveCursorsOnLi
6250: 73 74 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  st(.  BtCursor *
6260: 70 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  p,         /* Th
6270: 65 20 66 69 72 73 74 20 63 75 72 73 6f 72 20 74  e first cursor t
6280: 68 61 74 20 6e 65 65 64 73 20 73 61 76 69 6e 67  hat needs saving
6290: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74   */.  Pgno iRoot
62a0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e  ,          /* On
62b0: 6c 79 20 73 61 76 65 20 63 75 72 73 6f 72 20 77  ly save cursor w
62c0: 69 74 68 20 74 68 69 73 20 69 52 6f 6f 74 2e 20  ith this iRoot. 
62d0: 53 61 76 65 20 61 6c 6c 20 69 66 20 7a 65 72 6f  Save all if zero
62e0: 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a   */.  BtCursor *
62f0: 70 45 78 63 65 70 74 20 20 20 20 2f 2a 20 44 6f  pExcept    /* Do
6300: 20 6e 6f 74 20 73 61 76 65 20 74 68 69 73 20 63   not save this c
6310: 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 64 6f  ursor */.){.  do
6320: 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 70 45 78  {.    if( p!=pEx
6330: 63 65 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f  cept && (0==iRoo
6340: 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74  t || p->pgnoRoot
6350: 3d 3d 69 52 6f 6f 74 29 20 29 7b 0a 20 20 20 20  ==iRoot) ){.    
6360: 20 20 69 66 28 20 70 2d 3e 65 53 74 61 74 65 3d    if( p->eState=
6370: 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c  =CURSOR_VALID ||
6380: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53   p->eState==CURS
6390: 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20  OR_SKIPNEXT ){. 
63a0: 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20         int rc = 
63b0: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
63c0: 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69  on(p);.        i
63d0: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
63e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
63f0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
6400: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
6410: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
6420: 28 20 70 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a  ( p->iPage>0 );.
6430: 20 20 20 20 20 20 20 20 62 74 72 65 65 52 65 6c          btreeRel
6440: 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67  easeAllCursorPag
6450: 65 73 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20  es(p);.      }. 
6460: 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e     }.    p = p->
6470: 70 4e 65 78 74 3b 0a 20 20 7d 77 68 69 6c 65 28  pNext;.  }while(
6480: 20 70 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53   p );.  return S
6490: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
64a0: 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 75 72  ** Clear the cur
64b0: 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69  rent cursor posi
64c0: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
64d0: 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43  lite3BtreeClearC
64e0: 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a  ursor(BtCursor *
64f0: 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
6500: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
6510: 78 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71 6c  x(pCur) );.  sql
6520: 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e  ite3_free(pCur->
6530: 70 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 70  pKey);.  pCur->p
6540: 4b 65 79 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  Key = 0;.  pCur-
6550: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
6560: 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a  _INVALID;.}../*.
6570: 2a 2a 20 49 6e 20 74 68 69 73 20 76 65 72 73 69  ** In this versi
6580: 6f 6e 20 6f 66 20 42 74 72 65 65 4d 6f 76 65 74  on of BtreeMovet
6590: 6f 2c 20 70 4b 65 79 20 69 73 20 61 20 70 61 63  o, pKey is a pac
65a0: 6b 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64  ked index record
65b0: 0a 2a 2a 20 73 75 63 68 20 61 73 20 69 73 20 67  .** such as is g
65c0: 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 65 20  enerated by the 
65d0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  OP_MakeRecord op
65e0: 63 6f 64 65 2e 20 20 55 6e 70 61 63 6b 20 74 68  code.  Unpack th
65f0: 65 0a 2a 2a 20 72 65 63 6f 72 64 20 61 6e 64 20  e.** record and 
6600: 74 68 65 6e 20 63 61 6c 6c 20 42 74 72 65 65 4d  then call BtreeM
6610: 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29 20  ovetoUnpacked() 
6620: 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 2e 0a  to do the work..
6630: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
6640: 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43  reeMoveto(.  BtC
6650: 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
6660: 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 20   /* Cursor open 
6670: 6f 6e 20 74 68 65 20 62 74 72 65 65 20 74 6f 20  on the btree to 
6680: 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20  be searched */. 
6690: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
66a0: 79 2c 20 20 20 2f 2a 20 50 61 63 6b 65 64 20 6b  y,   /* Packed k
66b0: 65 79 20 69 66 20 74 68 65 20 62 74 72 65 65 20  ey if the btree 
66c0: 69 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 20  is an index */. 
66d0: 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 20 20   i64 nKey,      
66e0: 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20       /* Integer 
66f0: 6b 65 79 20 66 6f 72 20 74 61 62 6c 65 73 2e 20  key for tables. 
6700: 20 53 69 7a 65 20 6f 66 20 70 4b 65 79 20 66 6f   Size of pKey fo
6710: 72 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69  r indices */.  i
6720: 6e 74 20 62 69 61 73 2c 20 20 20 20 20 20 20 20  nt bias,        
6730: 20 20 20 2f 2a 20 42 69 61 73 20 73 65 61 72 63     /* Bias searc
6740: 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e  h to the high en
6750: 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73  d */.  int *pRes
6760: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
6770: 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c  ite search resul
6780: 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ts here */.){.  
6790: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
67a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
67b0: 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a 20 20 55  atus code */.  U
67c0: 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
67d0: 49 64 78 4b 65 79 3b 20 20 20 2f 2a 20 55 6e 70  IdxKey;   /* Unp
67e0: 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20  acked index key 
67f0: 2a 2f 0a 20 20 63 68 61 72 20 61 53 70 61 63 65  */.  char aSpace
6800: 5b 33 38 34 5d 3b 20 20 20 20 20 20 20 20 20 20  [384];          
6810: 2f 2a 20 54 65 6d 70 20 73 70 61 63 65 20 66 6f  /* Temp space fo
6820: 72 20 70 49 64 78 4b 65 79 20 2d 20 74 6f 20 61  r pIdxKey - to a
6830: 76 6f 69 64 20 61 20 6d 61 6c 6c 6f 63 20 2a 2f  void a malloc */
6840: 0a 20 20 63 68 61 72 20 2a 70 46 72 65 65 20 3d  .  char *pFree =
6850: 20 30 3b 0a 0a 20 20 69 66 28 20 70 4b 65 79 20   0;..  if( pKey 
6860: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  ){.    assert( n
6870: 4b 65 79 3d 3d 28 69 36 34 29 28 69 6e 74 29 6e  Key==(i64)(int)n
6880: 4b 65 79 20 29 3b 0a 20 20 20 20 70 49 64 78 4b  Key );.    pIdxK
6890: 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ey = sqlite3Vdbe
68a0: 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63  AllocUnpackedRec
68b0: 6f 72 64 28 0a 20 20 20 20 20 20 20 20 70 43 75  ord(.        pCu
68c0: 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 61 53 70  r->pKeyInfo, aSp
68d0: 61 63 65 2c 20 73 69 7a 65 6f 66 28 61 53 70 61  ace, sizeof(aSpa
68e0: 63 65 29 2c 20 26 70 46 72 65 65 0a 20 20 20 20  ce), &pFree.    
68f0: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 4b  );.    if( pIdxK
6900: 65 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ey==0 ) return S
6910: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
6920: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6930: 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43  eRecordUnpack(pC
6940: 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69  ur->pKeyInfo, (i
6950: 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 20 70  nt)nKey, pKey, p
6960: 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 69 66 28  IdxKey);.    if(
6970: 20 70 49 64 78 4b 65 79 2d 3e 6e 46 69 65 6c 64   pIdxKey->nField
6980: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
6990: 69 74 65 33 44 62 46 72 65 65 28 70 43 75 72 2d  ite3DbFree(pCur-
69a0: 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70  >pKeyInfo->db, p
69b0: 46 72 65 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Free);.      ret
69c0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
69d0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
69e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64 78   }else{.    pIdx
69f0: 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  Key = 0;.  }.  r
6a00: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
6a10: 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70  MovetoUnpacked(p
6a20: 43 75 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b  Cur, pIdxKey, nK
6a30: 65 79 2c 20 62 69 61 73 2c 20 70 52 65 73 29 3b  ey, bias, pRes);
6a40: 0a 20 20 69 66 28 20 70 46 72 65 65 20 29 7b 0a  .  if( pFree ){.
6a50: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
6a60: 65 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  e(pCur->pKeyInfo
6a70: 2d 3e 64 62 2c 20 70 46 72 65 65 29 3b 0a 20 20  ->db, pFree);.  
6a80: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
6a90: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20  ../*.** Restore 
6aa0: 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
6ab0: 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61  e position it wa
6ac0: 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73  s in (or as clos
6ad0: 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65  e to as possible
6ae0: 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75  ).** when saveCu
6af0: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77  rsorPosition() w
6b00: 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20  as called. Note 
6b10: 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64  that this call d
6b20: 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73  eletes the .** s
6b30: 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e  aved position in
6b40: 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61 76  fo stored by sav
6b50: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
6b60: 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20  ), so there can 
6b70: 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e  be.** at most on
6b80: 65 20 65 66 66 65 63 74 69 76 65 20 72 65 73 74  e effective rest
6b90: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
6ba0: 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65  n() call after e
6bb0: 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73  ach .** saveCurs
6bc0: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f  orPosition()..*/
6bd0: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
6be0: 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f  eRestoreCursorPo
6bf0: 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20  sition(BtCursor 
6c00: 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
6c10: 3b 0a 20 20 69 6e 74 20 73 6b 69 70 4e 65 78 74  ;.  int skipNext
6c20: 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
6c30: 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
6c40: 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
6c50: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d  ( pCur->eState>=
6c60: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
6c70: 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  EK );.  if( pCur
6c80: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
6c90: 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65  _FAULT ){.    re
6ca0: 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e  turn pCur->skipN
6cb0: 65 78 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  ext;.  }.  pCur-
6cc0: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
6cd0: 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d  _INVALID;.  rc =
6ce0: 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75   btreeMoveto(pCu
6cf0: 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70  r, pCur->pKey, p
6d00: 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 73  Cur->nKey, 0, &s
6d10: 6b 69 70 4e 65 78 74 29 3b 0a 20 20 69 66 28 20  kipNext);.  if( 
6d20: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
6d30: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
6d40: 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20  e(pCur->pKey);. 
6d50: 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20     pCur->pKey = 
6d60: 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  0;.    assert( p
6d70: 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
6d80: 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75  SOR_VALID || pCu
6d90: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
6da0: 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20  R_INVALID );.   
6db0: 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
6dc0: 7c 3d 20 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20  |= skipNext;.   
6dd0: 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e   if( pCur->skipN
6de0: 65 78 74 20 26 26 20 70 43 75 72 2d 3e 65 53 74  ext && pCur->eSt
6df0: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
6e00: 44 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  D ){.      pCur-
6e10: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
6e20: 5f 53 4b 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d  _SKIPNEXT;.    }
6e30: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
6e40: 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73  ;.}..#define res
6e50: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
6e60: 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53  on(p) \.  (p->eS
6e70: 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
6e80: 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20  UIRESEEK ? \.   
6e90: 20 20 20 20 20 20 62 74 72 65 65 52 65 73 74 6f        btreeResto
6ea0: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
6eb0: 28 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20  (p) : \.        
6ec0: 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a   SQLITE_OK)../*.
6ed0: 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65  ** Determine whe
6ee0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75  ther or not a cu
6ef0: 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66  rsor has moved f
6f00: 72 6f 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  rom the position
6f10: 20 77 68 65 72 65 0a 2a 2a 20 69 74 20 77 61 73   where.** it was
6f20: 20 6c 61 73 74 20 70 6c 61 63 65 64 2c 20 6f 72   last placed, or
6f30: 20 68 61 73 20 62 65 65 6e 20 69 6e 76 61 6c 69   has been invali
6f40: 64 61 74 65 64 20 66 6f 72 20 61 6e 79 20 6f 74  dated for any ot
6f50: 68 65 72 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20 43  her reason..** C
6f60: 75 72 73 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20  ursors can move 
6f70: 77 68 65 6e 20 74 68 65 20 72 6f 77 20 74 68 65  when the row the
6f80: 79 20 61 72 65 20 70 6f 69 6e 74 69 6e 67 20 61  y are pointing a
6f90: 74 20 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74  t is deleted out
6fa0: 0a 2a 2a 20 66 72 6f 6d 20 75 6e 64 65 72 20 74  .** from under t
6fb0: 68 65 6d 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  hem, for example
6fc0: 2e 20 20 43 75 72 73 6f 72 20 6d 69 67 68 74 20  .  Cursor might 
6fd0: 61 6c 73 6f 20 6d 6f 76 65 20 69 66 20 61 20 62  also move if a b
6fe0: 74 72 65 65 0a 2a 2a 20 69 73 20 72 65 62 61 6c  tree.** is rebal
6ff0: 61 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c  anced..**.** Cal
7000: 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
7010: 65 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 63 75  e with a NULL cu
7020: 72 73 6f 72 20 70 6f 69 6e 74 65 72 20 72 65 74  rsor pointer ret
7030: 75 72 6e 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a  urns false..**.*
7040: 2a 20 55 73 65 20 74 68 65 20 73 65 70 61 72 61  * Use the separa
7050: 74 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  te sqlite3BtreeC
7060: 75 72 73 6f 72 52 65 73 74 6f 72 65 28 29 20 72  ursorRestore() r
7070: 6f 75 74 69 6e 65 20 74 6f 20 72 65 73 74 6f 72  outine to restor
7080: 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 62 61  e a cursor.** ba
7090: 63 6b 20 74 6f 20 77 68 65 72 65 20 69 74 20 6f  ck to where it o
70a0: 75 67 68 74 20 74 6f 20 62 65 20 69 66 20 74 68  ught to be if th
70b0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
70c0: 6e 73 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20  ns true..*/.int 
70d0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
70e0: 6f 72 48 61 73 4d 6f 76 65 64 28 42 74 43 75 72  orHasMoved(BtCur
70f0: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65  sor *pCur){.  re
7100: 74 75 72 6e 20 70 43 75 72 2d 3e 65 53 74 61 74  turn pCur->eStat
7110: 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b  e!=CURSOR_VALID;
7120: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
7130: 6f 75 74 69 6e 65 20 72 65 73 74 6f 72 65 73 20  outine restores 
7140: 61 20 63 75 72 73 6f 72 20 62 61 63 6b 20 74 6f  a cursor back to
7150: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 70 6f   its original po
7160: 73 69 74 69 6f 6e 20 61 66 74 65 72 20 69 74 0a  sition after it.
7170: 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 76 65  ** has been move
7180: 64 20 62 79 20 73 6f 6d 65 20 6f 75 74 73 69 64  d by some outsid
7190: 65 20 61 63 74 69 76 69 74 79 20 28 73 75 63 68  e activity (such
71a0: 20 61 73 20 61 20 62 74 72 65 65 20 72 65 62 61   as a btree reba
71b0: 6c 61 6e 63 65 20 6f 72 0a 2a 2a 20 61 20 72 6f  lance or.** a ro
71c0: 77 20 68 61 76 69 6e 67 20 62 65 65 6e 20 64 65  w having been de
71d0: 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75  leted out from u
71e0: 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 29  nder the cursor)
71f0: 2e 20 20 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63  .  .**.** On suc
7200: 63 65 73 73 2c 20 74 68 65 20 2a 70 44 69 66 66  cess, the *pDiff
7210: 65 72 65 6e 74 52 6f 77 20 70 61 72 61 6d 65 74  erentRow paramet
7220: 65 72 20 69 73 20 66 61 6c 73 65 20 69 66 20 74  er is false if t
7230: 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
7240: 74 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 61 74  t.** pointing at
7250: 20 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d   exactly the sam
7260: 65 20 72 6f 77 2e 20 20 2a 70 44 69 66 66 65 72  e row.  *pDiffer
7270: 6e 74 52 6f 77 20 69 73 20 74 68 65 20 72 6f 77  ntRow is the row
7280: 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77   the cursor.** w
7290: 61 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 68  as pointing to h
72a0: 61 73 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2c  as been deleted,
72b0: 20 66 6f 72 63 69 6e 67 20 74 68 65 20 63 75 72   forcing the cur
72c0: 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  sor to point to 
72d0: 73 6f 6d 65 0a 2a 2a 20 6e 65 61 72 62 79 20 72  some.** nearby r
72e0: 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ow..**.** This r
72f0: 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e  outine should on
7300: 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 66 6f 72  ly be called for
7310: 20 61 20 63 75 72 73 6f 72 20 74 68 61 74 20 6a   a cursor that j
7320: 75 73 74 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20  ust returned.** 
7330: 54 52 55 45 20 66 72 6f 6d 20 73 71 6c 69 74 65  TRUE from sqlite
7340: 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d  3BtreeCursorHasM
7350: 6f 76 65 64 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  oved()..*/.int s
7360: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
7370: 72 52 65 73 74 6f 72 65 28 42 74 43 75 72 73 6f  rRestore(BtCurso
7380: 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 44  r *pCur, int *pD
7390: 69 66 66 65 72 65 6e 74 52 6f 77 29 7b 0a 20 20  ifferentRow){.  
73a0: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
73b0: 74 28 20 70 43 75 72 21 3d 30 20 29 3b 0a 20 20  t( pCur!=0 );.  
73c0: 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
73d0: 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
73e0: 49 44 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  ID );.  rc = res
73f0: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
7400: 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
7410: 72 63 20 29 7b 0a 20 20 20 20 2a 70 44 69 66 66  rc ){.    *pDiff
7420: 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20  erentRow = 1;.  
7430: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
7440: 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
7450: 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
7460: 44 20 29 7b 0a 20 20 20 20 2a 70 44 69 66 66 65  D ){.    *pDiffe
7470: 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20 7d  rentRow = 1;.  }
7480: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
7490: 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
74a0: 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70 44 69 66  ==0 );.    *pDif
74b0: 66 65 72 65 6e 74 52 6f 77 20 3d 20 30 3b 0a 20  ferentRow = 0;. 
74c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
74d0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66  TE_OK;.}..#ifdef
74e0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
74f0: 55 52 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a  URSOR_HINTS./*.*
7500: 2a 20 50 72 6f 76 69 64 65 20 68 69 6e 74 73 20  * Provide hints 
7510: 74 6f 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20  to the cursor.  
7520: 54 68 65 20 70 61 72 74 69 63 75 6c 61 72 20 68  The particular h
7530: 69 6e 74 20 67 69 76 65 6e 20 28 61 6e 64 20 74  int given (and t
7540: 68 65 20 74 79 70 65 0a 2a 2a 20 61 6e 64 20 6e  he type.** and n
7550: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 76 61 72  umber of the var
7560: 61 72 67 73 20 70 61 72 61 6d 65 74 65 72 73 29  args parameters)
7570: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62   is determined b
7580: 79 20 74 68 65 20 65 48 69 6e 74 54 79 70 65 0a  y the eHintType.
7590: 2a 2a 20 70 61 72 61 6d 65 74 65 72 2e 20 20 53  ** parameter.  S
75a0: 65 65 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f  ee the definitio
75b0: 6e 73 20 6f 66 20 74 68 65 20 42 54 52 45 45 5f  ns of the BTREE_
75c0: 48 49 4e 54 5f 2a 20 6d 61 63 72 6f 73 20 66 6f  HINT_* macros fo
75d0: 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 76 6f  r details..*/.vo
75e0: 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
75f0: 75 72 73 6f 72 48 69 6e 74 28 42 74 43 75 72 73  ursorHint(BtCurs
7600: 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 65 48  or *pCur, int eH
7610: 69 6e 74 54 79 70 65 2c 20 2e 2e 2e 29 7b 0a 20  intType, ...){. 
7620: 20 2f 2a 20 55 73 65 64 20 6f 6e 6c 79 20 62 79   /* Used only by
7630: 20 73 79 73 74 65 6d 20 74 68 61 74 20 73 75 62   system that sub
7640: 73 74 69 74 75 74 65 20 74 68 65 69 72 20 6f 77  stitute their ow
7650: 6e 20 73 74 6f 72 61 67 65 20 65 6e 67 69 6e 65  n storage engine
7660: 20 2a 2f 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   */.}.#endif../*
7670: 0a 2a 2a 20 50 72 6f 76 69 64 65 20 66 6c 61 67  .** Provide flag
7680: 20 68 69 6e 74 73 20 74 6f 20 74 68 65 20 63 75   hints to the cu
7690: 72 73 6f 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  rsor..*/.void sq
76a0: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
76b0: 48 69 6e 74 46 6c 61 67 73 28 42 74 43 75 72 73  HintFlags(BtCurs
76c0: 6f 72 20 2a 70 43 75 72 2c 20 75 6e 73 69 67 6e  or *pCur, unsign
76d0: 65 64 20 78 29 7b 0a 20 20 61 73 73 65 72 74 28  ed x){.  assert(
76e0: 20 78 3d 3d 42 54 52 45 45 5f 53 45 45 4b 5f 45   x==BTREE_SEEK_E
76f0: 51 20 7c 7c 20 78 3d 3d 42 54 52 45 45 5f 42 55  Q || x==BTREE_BU
7700: 4c 4b 4c 4f 41 44 20 7c 7c 20 78 3d 3d 30 20 29  LKLOAD || x==0 )
7710: 3b 0a 20 20 70 43 75 72 2d 3e 68 69 6e 74 73 20  ;.  pCur->hints 
7720: 3d 20 78 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66  = x;.}...#ifndef
7730: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
7740: 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69  OVACUUM./*.** Gi
7750: 76 65 6e 20 61 20 70 61 67 65 20 6e 75 6d 62 65  ven a page numbe
7760: 72 20 6f 66 20 61 20 72 65 67 75 6c 61 72 20 64  r of a regular d
7770: 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 72 65  atabase page, re
7780: 74 75 72 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a  turn the page.**
7790: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
77a0: 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
77b0: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
77c0: 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  he entry for the
77d0: 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67 65 20 6e  .** input page n
77e0: 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  umber..**.** Ret
77f0: 75 72 6e 20 30 20 28 6e 6f 74 20 61 20 76 61 6c  urn 0 (not a val
7800: 69 64 20 70 61 67 65 29 20 66 6f 72 20 70 67 6e  id page) for pgn
7810: 6f 3d 3d 31 20 73 69 6e 63 65 20 74 68 65 72 65  o==1 since there
7820: 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65   is.** no pointe
7830: 72 20 6d 61 70 20 61 73 73 6f 63 69 61 74 65 64  r map associated
7840: 20 77 69 74 68 20 70 61 67 65 20 31 2e 20 20 54   with page 1.  T
7850: 68 65 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  he integrity_che
7860: 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20 72 65 71 75  ck logic.** requ
7870: 69 72 65 73 20 74 68 61 74 20 70 74 72 6d 61 70  ires that ptrmap
7880: 50 61 67 65 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a  Pageno(*,1)!=1..
7890: 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70  */.static Pgno p
78a0: 74 72 6d 61 70 50 61 67 65 6e 6f 28 42 74 53 68  trmapPageno(BtSh
78b0: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
78c0: 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61  pgno){.  int nPa
78d0: 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20  gesPerMapPage;. 
78e0: 20 50 67 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72   Pgno iPtrMap, r
78f0: 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  et;.  assert( sq
7900: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
7910: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
7920: 20 20 69 66 28 20 70 67 6e 6f 3c 32 20 29 20 72    if( pgno<2 ) r
7930: 65 74 75 72 6e 20 30 3b 0a 20 20 6e 50 61 67 65  eturn 0;.  nPage
7940: 73 50 65 72 4d 61 70 50 61 67 65 20 3d 20 28 70  sPerMapPage = (p
7950: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35  Bt->usableSize/5
7960: 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d  )+1;.  iPtrMap =
7970: 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73   (pgno-2)/nPages
7980: 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 72 65  PerMapPage;.  re
7990: 74 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50 61  t = (iPtrMap*nPa
79a0: 67 65 73 50 65 72 4d 61 70 50 61 67 65 29 20 2b  gesPerMapPage) +
79b0: 20 32 3b 20 0a 20 20 69 66 28 20 72 65 74 3d 3d   2; .  if( ret==
79c0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
79d0: 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 65  E(pBt) ){.    re
79e0: 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  t++;.  }.  retur
79f0: 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n ret;.}../*.** 
7a00: 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69  Write an entry i
7a10: 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20  nto the pointer 
7a20: 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  map..**.** This 
7a30: 72 6f 75 74 69 6e 65 20 75 70 64 61 74 65 73 20  routine updates 
7a40: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
7a50: 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 6e  entry for page n
7a60: 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73  umber 'key'.** s
7a70: 6f 20 74 68 61 74 20 69 74 20 6d 61 70 73 20 74  o that it maps t
7a80: 6f 20 74 79 70 65 20 27 65 54 79 70 65 27 20 61  o type 'eType' a
7a90: 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e  nd parent page n
7aa0: 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a  umber 'pgno'..**
7ab0: 0a 2a 2a 20 49 66 20 2a 70 52 43 20 69 73 20 69  .** If *pRC is i
7ac0: 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72  nitially non-zer
7ad0: 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b  o (non-SQLITE_OK
7ae0: 29 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  ) then this rout
7af0: 69 6e 65 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f  ine is.** a no-o
7b00: 70 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20  p.  If an error 
7b10: 6f 63 63 75 72 73 2c 20 74 68 65 20 61 70 70 72  occurs, the appr
7b20: 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
7b30: 64 65 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a  de is written.**
7b40: 20 69 6e 74 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73   into *pRC..*/.s
7b50: 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61  tatic void ptrma
7b60: 70 50 75 74 28 42 74 53 68 61 72 65 64 20 2a 70  pPut(BtShared *p
7b70: 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38  Bt, Pgno key, u8
7b80: 20 65 54 79 70 65 2c 20 50 67 6e 6f 20 70 61 72   eType, Pgno par
7b90: 65 6e 74 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  ent, int *pRC){.
7ba0: 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
7bb0: 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74  e;  /* The point
7bc0: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
7bd0: 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20   u8 *pPtrmap;   
7be0: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
7bf0: 72 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20 20  r map data */.  
7c00: 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20 20  Pgno iPtrmap;   
7c10: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
7c20: 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72   map page number
7c30: 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74   */.  int offset
7c40: 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65  ;       /* Offse
7c50: 74 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70  t in pointer map
7c60: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72   page */.  int r
7c70: 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  c;           /* 
7c80: 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d  Return code from
7c90: 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f   subfunctions */
7ca0: 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72  ..  if( *pRC ) r
7cb0: 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74  eturn;..  assert
7cc0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
7cd0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
7ce0: 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73   );.  /* The mas
7cf0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65  ter-journal page
7d00: 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 6e 65 76   number must nev
7d10: 65 72 20 62 65 20 75 73 65 64 20 61 73 20 61 20  er be used as a 
7d20: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
7d30: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d   */.  assert( 0=
7d40: 3d 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70  =PTRMAP_ISPAGE(p
7d50: 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  Bt, PENDING_BYTE
7d60: 5f 50 41 47 45 28 70 42 74 29 29 20 29 3b 0a 0a  _PAGE(pBt)) );..
7d70: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
7d80: 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 69  utoVacuum );.  i
7d90: 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20  f( key==0 ){.   
7da0: 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43   *pRC = SQLITE_C
7db0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
7dc0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
7dd0: 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f  Ptrmap = PTRMAP_
7de0: 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29  PAGENO(pBt, key)
7df0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
7e00: 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
7e10: 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26  ager, iPtrmap, &
7e20: 70 44 62 50 61 67 65 2c 20 30 29 3b 0a 20 20 69  pDbPage, 0);.  i
7e30: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
7e40: 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72   ){.    *pRC = r
7e50: 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  c;.    return;. 
7e60: 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54   }.  offset = PT
7e70: 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69  RMAP_PTROFFSET(i
7e80: 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20  Ptrmap, key);.  
7e90: 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a  if( offset<0 ){.
7ea0: 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54      *pRC = SQLIT
7eb0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
7ec0: 20 20 20 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f      goto ptrmap_
7ed0: 65 78 69 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65  exit;.  }.  asse
7ee0: 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69  rt( offset <= (i
7ef0: 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  nt)pBt->usableSi
7f00: 7a 65 2d 35 20 29 3b 0a 20 20 70 50 74 72 6d 61  ze-5 );.  pPtrma
7f10: 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  p = (u8 *)sqlite
7f20: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
7f30: 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28 20 65  bPage);..  if( e
7f40: 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66  Type!=pPtrmap[of
7f50: 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62 79 74  fset] || get4byt
7f60: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
7f70: 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b  t+1])!=parent ){
7f80: 0a 20 20 20 20 54 52 41 43 45 28 28 22 50 54 52  .    TRACE(("PTR
7f90: 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e  MAP_UPDATE: %d->
7fa0: 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c  (%d,%d)\n", key,
7fb0: 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74 29 29   eType, parent))
7fc0: 3b 0a 20 20 20 20 2a 70 52 43 3d 20 72 63 20 3d  ;.    *pRC= rc =
7fd0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
7fe0: 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  te(pDbPage);.   
7ff0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
8000: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 74 72  OK ){.      pPtr
8010: 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54  map[offset] = eT
8020: 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ype;.      put4b
8030: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
8040: 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b  set+1], parent);
8050: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d  .    }.  }..ptrm
8060: 61 70 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74  ap_exit:.  sqlit
8070: 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
8080: 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
8090: 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20 66 72  Read an entry fr
80a0: 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  om the pointer m
80b0: 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ap..**.** This r
80c0: 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76 65 73  outine retrieves
80d0: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
80e0: 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20   entry for page 
80f0: 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a  'key', writing.*
8100: 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 70  * the type and p
8110: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
8120: 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61 6e 64  r to *pEType and
8130: 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63 74 69   *pPgno respecti
8140: 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f  vely..** An erro
8150: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
8160: 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20  ed if something 
8170: 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65  goes wrong, othe
8180: 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e  rwise SQLITE_OK.
8190: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
81a0: 74 72 6d 61 70 47 65 74 28 42 74 53 68 61 72 65  trmapGet(BtShare
81b0: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79  d *pBt, Pgno key
81c0: 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20 50 67  , u8 *pEType, Pg
81d0: 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62  no *pPgno){.  Db
81e0: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
81f0: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
8200: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  map page */.  in
8210: 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 20  t iPtrmap;      
8220: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
8230: 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20  page index */.  
8240: 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20  u8 *pPtrmap;    
8250: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
8260: 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  p page data */. 
8270: 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20   int offset;    
8280: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
8290: 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74 65   entry in pointe
82a0: 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72  r map */.  int r
82b0: 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  c;..  assert( sq
82c0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
82d0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
82e0: 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52  .  iPtrmap = PTR
82f0: 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
8300: 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  key);.  rc = sql
8310: 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
8320: 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61  ->pPager, iPtrma
8330: 70 2c 20 26 70 44 62 50 61 67 65 2c 20 30 29 3b  p, &pDbPage, 0);
8340: 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a  .  if( rc!=0 ){.
8350: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
8360: 20 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28   }.  pPtrmap = (
8370: 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  u8 *)sqlite3Page
8380: 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
8390: 29 3b 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20 50  );..  offset = P
83a0: 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28  TRMAP_PTROFFSET(
83b0: 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20  iPtrmap, key);. 
83c0: 20 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b   if( offset<0 ){
83d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
83e0: 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
83f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
8400: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
8410: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f  .  }.  assert( o
8420: 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42  ffset <= (int)pB
8430: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20  t->usableSize-5 
8440: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 54  );.  assert( pET
8450: 79 70 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54  ype!=0 );.  *pET
8460: 79 70 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66  ype = pPtrmap[of
8470: 66 73 65 74 5d 3b 0a 20 20 69 66 28 20 70 50 67  fset];.  if( pPg
8480: 6e 6f 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65  no ) *pPgno = ge
8490: 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b  t4byte(&pPtrmap[
84a0: 6f 66 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73  offset+1]);..  s
84b0: 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
84c0: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  (pDbPage);.  if(
84d0: 20 2a 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70   *pEType<1 || *p
84e0: 45 54 79 70 65 3e 35 20 29 20 72 65 74 75 72 6e  EType>5 ) return
84f0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
8500: 42 4b 50 54 3b 0a 20 20 72 65 74 75 72 6e 20 53  BKPT;.  return S
8510: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c  QLITE_OK;.}..#el
8520: 73 65 20 2f 2a 20 69 66 20 64 65 66 69 6e 65 64  se /* if defined
8530: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
8540: 4f 56 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65  OVACUUM */.  #de
8550: 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74 28 77  fine ptrmapPut(w
8560: 2c 78 2c 79 2c 7a 2c 72 63 29 0a 20 20 23 64 65  ,x,y,z,rc).  #de
8570: 66 69 6e 65 20 70 74 72 6d 61 70 47 65 74 28 77  fine ptrmapGet(w
8580: 2c 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f  ,x,y,z) SQLITE_O
8590: 4b 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d  K.  #define ptrm
85a0: 61 70 50 75 74 4f 76 66 6c 50 74 72 28 78 2c 20  apPutOvflPtr(x, 
85b0: 79 2c 20 72 63 29 0a 23 65 6e 64 69 66 0a 0a 2f  y, rc).#endif../
85c0: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62 74 72  *.** Given a btr
85d0: 65 65 20 70 61 67 65 20 61 6e 64 20 61 20 63 65  ee page and a ce
85e0: 6c 6c 20 69 6e 64 65 78 20 28 30 20 6d 65 61 6e  ll index (0 mean
85f0: 73 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c  s the first cell
8600: 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c   on.** the page,
8610: 20 31 20 6d 65 61 6e 73 20 74 68 65 20 73 65 63   1 means the sec
8620: 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f  ond cell, and so
8630: 20 66 6f 72 74 68 29 20 72 65 74 75 72 6e 20 61   forth) return a
8640: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
8650: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e  he cell content.
8660: 0a 2a 2a 0a 2a 2a 20 66 69 6e 64 43 65 6c 6c 50  .**.** findCellP
8670: 61 73 74 50 74 72 28 29 20 64 6f 65 73 20 74 68  astPtr() does th
8680: 65 20 73 61 6d 65 20 65 78 63 65 70 74 20 69 74  e same except it
8690: 20 73 6b 69 70 73 20 70 61 73 74 20 74 68 65 20   skips past the 
86a0: 69 6e 69 74 69 61 6c 0a 2a 2a 20 34 2d 62 79 74  initial.** 4-byt
86b0: 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20  e child pointer 
86c0: 66 6f 75 6e 64 20 6f 6e 20 69 6e 74 65 72 69 6f  found on interio
86d0: 72 20 70 61 67 65 73 2c 20 69 66 20 74 68 65 72  r pages, if ther
86e0: 65 20 69 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20  e is one..**.** 
86f0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72  This routine wor
8700: 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65  ks only for page
8710: 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f  s that do not co
8720: 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63  ntain overflow c
8730: 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ells..*/.#define
8740: 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c   findCell(P,I) \
8750: 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61 20 2b  .  ((P)->aData +
8760: 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20   ((P)->maskPage 
8770: 26 20 67 65 74 32 62 79 74 65 41 6c 69 67 6e 65  & get2byteAligne
8780: 64 28 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78  d(&(P)->aCellIdx
8790: 5b 32 2a 28 49 29 5d 29 29 29 0a 23 64 65 66 69  [2*(I)]))).#defi
87a0: 6e 65 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50  ne findCellPastP
87b0: 74 72 28 50 2c 49 29 20 5c 0a 20 20 28 28 50 29  tr(P,I) \.  ((P)
87c0: 2d 3e 61 44 61 74 61 4f 66 73 74 20 2b 20 28 28  ->aDataOfst + ((
87d0: 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67  P)->maskPage & g
87e0: 65 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28 26  et2byteAligned(&
87f0: 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a  (P)->aCellIdx[2*
8800: 28 49 29 5d 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a 20  (I)]))).../*.** 
8810: 54 68 69 73 20 69 73 20 63 6f 6d 6d 6f 6e 20 74  This is common t
8820: 61 69 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 66  ail processing f
8830: 6f 72 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  or btreeParseCel
8840: 6c 50 74 72 28 29 20 61 6e 64 0a 2a 2a 20 62 74  lPtr() and.** bt
8850: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49  reeParseCellPtrI
8860: 6e 64 65 78 28 29 20 66 6f 72 20 74 68 65 20 63  ndex() for the c
8870: 61 73 65 20 77 68 65 6e 20 74 68 65 20 63 65 6c  ase when the cel
8880: 6c 20 64 6f 65 73 20 6e 6f 74 20 66 69 74 20 65  l does not fit e
8890: 6e 74 69 72 65 6c 79 0a 2a 2a 20 6f 6e 20 61 20  ntirely.** on a 
88a0: 73 69 6e 67 6c 65 20 42 2d 74 72 65 65 20 70 61  single B-tree pa
88b0: 67 65 2e 20 20 4d 61 6b 65 20 6e 65 63 65 73 73  ge.  Make necess
88c0: 61 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 73 20  ary adjustments 
88d0: 74 6f 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 0a  to the CellInfo.
88e0: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  ** structure..*/
88f0: 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
8900: 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 62 74 72  OINLINE void btr
8910: 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75 73  eeParseCellAdjus
8920: 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77  tSizeForOverflow
8930: 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
8940: 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ge,         /* P
8950: 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
8960: 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  he cell */.  u8 
8970: 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
8980: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
8990: 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74  to the cell text
89a0: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
89b0: 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f  *pInfo         /
89c0: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73  * Fill in this s
89d0: 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20  tructure */.){. 
89e0: 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79 6c 6f   /* If the paylo
89f0: 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20  ad will not fit 
8a00: 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68  completely on th
8a10: 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77 65  e local page, we
8a20: 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64 65   have.  ** to de
8a30: 63 69 64 65 20 68 6f 77 20 6d 75 63 68 20 74 6f  cide how much to
8a40: 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61   store locally a
8a50: 6e 64 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73  nd how much to s
8a60: 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20 2a 2a 20 6f  pill onto.  ** o
8a70: 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 20  verflow pages.  
8a80: 54 68 65 20 73 74 72 61 74 65 67 79 20 69 73 20  The strategy is 
8a90: 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20  to minimize the 
8aa0: 61 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65 64  amount of unused
8ab0: 0a 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f  .  ** space on o
8ac0: 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77 68  verflow pages wh
8ad0: 69 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65 20  ile keeping the 
8ae0: 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20  amount of local 
8af0: 73 74 6f 72 61 67 65 0a 20 20 2a 2a 20 69 6e 20  storage.  ** in 
8b00: 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c  between minLocal
8b10: 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20   and maxLocal.. 
8b20: 20 2a 2a 0a 20 20 2a 2a 20 57 61 72 6e 69 6e 67   **.  ** Warning
8b30: 3a 20 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  :  changing the 
8b40: 77 61 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 79  way overflow pay
8b50: 6c 6f 61 64 20 69 73 20 64 69 73 74 72 69 62 75  load is distribu
8b60: 74 65 64 20 69 6e 20 61 6e 79 0a 20 20 2a 2a 20  ted in any.  ** 
8b70: 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74 20  way will result 
8b80: 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62  in an incompatib
8b90: 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a  le file format..
8ba0: 20 20 2a 2f 0a 20 20 69 6e 74 20 6d 69 6e 4c 6f    */.  int minLo
8bb0: 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d  cal;  /* Minimum
8bc0: 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f   amount of paylo
8bd0: 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20  ad held locally 
8be0: 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61  */.  int maxLoca
8bf0: 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61  l;  /* Maximum a
8c00: 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64  mount of payload
8c10: 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f   held locally */
8c20: 0a 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b 20  .  int surplus; 
8c30: 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61    /* Overflow pa
8c40: 79 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65 20  yload available 
8c50: 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67  for local storag
8c60: 65 20 2a 2f 0a 0a 20 20 6d 69 6e 4c 6f 63 61 6c  e */..  minLocal
8c70: 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63   = pPage->minLoc
8c80: 61 6c 3b 0a 20 20 6d 61 78 4c 6f 63 61 6c 20 3d  al;.  maxLocal =
8c90: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
8ca0: 3b 0a 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69  ;.  surplus = mi
8cb0: 6e 4c 6f 63 61 6c 20 2b 20 28 70 49 6e 66 6f 2d  nLocal + (pInfo-
8cc0: 3e 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c  >nPayload - minL
8cd0: 6f 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70 42  ocal)%(pPage->pB
8ce0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 29  t->usableSize-4)
8cf0: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 75  ;.  testcase( su
8d00: 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20  rplus==maxLocal 
8d10: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  );.  testcase( s
8d20: 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c  urplus==maxLocal
8d30: 2b 31 20 29 3b 0a 20 20 69 66 28 20 73 75 72 70  +1 );.  if( surp
8d40: 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20  lus <= maxLocal 
8d50: 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  ){.    pInfo->nL
8d60: 6f 63 61 6c 20 3d 20 28 75 31 36 29 73 75 72 70  ocal = (u16)surp
8d70: 6c 75 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  lus;.  }else{.  
8d80: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
8d90: 3d 20 28 75 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b  = (u16)minLocal;
8da0: 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53  .  }.  pInfo->nS
8db0: 69 7a 65 20 3d 20 28 75 31 36 29 28 26 70 49 6e  ize = (u16)(&pIn
8dc0: 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 5b 70 49 6e  fo->pPayload[pIn
8dd0: 66 6f 2d 3e 6e 4c 6f 63 61 6c 5d 20 2d 20 70 43  fo->nLocal] - pC
8de0: 65 6c 6c 29 20 2b 20 34 3b 0a 7d 0a 0a 2f 2a 0a  ell) + 4;.}../*.
8df0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
8e00: 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 69 6d   routines are im
8e10: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66  plementations of
8e20: 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 78 50 61   the MemPage.xPa
8e30: 72 73 65 43 65 6c 6c 28 29 0a 2a 2a 20 6d 65 74  rseCell().** met
8e40: 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 73 65  hod..**.** Parse
8e50: 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20   a cell content 
8e60: 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69  block and fill i
8e70: 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73  n the CellInfo s
8e80: 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20  tructure..**.** 
8e90: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
8ea0: 72 28 29 20 20 20 20 20 20 20 20 3d 3e 20 20 20  r()        =>   
8eb0: 74 61 62 6c 65 20 62 74 72 65 65 20 6c 65 61 66  table btree leaf
8ec0: 20 6e 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65 50   nodes.** btreeP
8ed0: 61 72 73 65 43 65 6c 6c 4e 6f 50 61 79 6c 6f 61  arseCellNoPayloa
8ee0: 64 28 29 20 20 3d 3e 20 20 20 74 61 62 6c 65 20  d()  =>   table 
8ef0: 62 74 72 65 65 20 69 6e 74 65 72 6e 61 6c 20 6e  btree internal n
8f00: 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65 50 61 72  odes.** btreePar
8f10: 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28 29  seCellPtrIndex()
8f20: 20 20 20 3d 3e 20 20 20 69 6e 64 65 78 20 62 74     =>   index bt
8f30: 72 65 65 20 6e 6f 64 65 73 0a 2a 2a 0a 2a 2a 20  ree nodes.**.** 
8f40: 54 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61 20  There is also a 
8f50: 77 72 61 70 70 65 72 20 66 75 6e 63 74 69 6f 6e  wrapper function
8f60: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
8f70: 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f 72  ) that works for
8f80: 0a 2a 2a 20 61 6c 6c 20 4d 65 6d 50 61 67 65 20  .** all MemPage 
8f90: 74 79 70 65 73 20 61 6e 64 20 74 68 61 74 20 72  types and that r
8fa0: 65 66 65 72 65 6e 63 65 73 20 74 68 65 20 63 65  eferences the ce
8fb0: 6c 6c 20 62 79 20 69 6e 64 65 78 20 72 61 74 68  ll by index rath
8fc0: 65 72 20 74 68 61 6e 0a 2a 2a 20 62 79 20 70 6f  er than.** by po
8fd0: 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  inter..*/.static
8fe0: 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65   void btreeParse
8ff0: 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61 64  CellPtrNoPayload
9000: 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
9010: 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ge,         /* P
9020: 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
9030: 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  he cell */.  u8 
9040: 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
9050: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
9060: 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74  to the cell text
9070: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
9080: 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f  *pInfo         /
9090: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73  * Fill in this s
90a0: 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20  tructure */.){. 
90b0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
90c0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
90d0: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
90e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
90f0: 65 2d 3e 6c 65 61 66 3d 3d 30 20 29 3b 0a 20 20  e->leaf==0 );.  
9100: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63  assert( pPage->c
9110: 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20 29  hildPtrSize==4 )
9120: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
9130: 5f 44 45 42 55 47 0a 20 20 55 4e 55 53 45 44 5f  _DEBUG.  UNUSED_
9140: 50 41 52 41 4d 45 54 45 52 28 70 50 61 67 65 29  PARAMETER(pPage)
9150: 3b 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e 66 6f  ;.#endif.  pInfo
9160: 2d 3e 6e 53 69 7a 65 20 3d 20 34 20 2b 20 67 65  ->nSize = 4 + ge
9170: 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34  tVarint(&pCell[4
9180: 5d 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d  ], (u64*)&pInfo-
9190: 3e 6e 4b 65 79 29 3b 0a 20 20 70 49 6e 66 6f 2d  >nKey);.  pInfo-
91a0: 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20  >nPayload = 0;. 
91b0: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
91c0: 20 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61   0;.  pInfo->pPa
91d0: 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 72 65 74  yload = 0;.  ret
91e0: 75 72 6e 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  urn;.}.static vo
91f0: 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  id btreeParseCel
9200: 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67 65 20  lPtr(.  MemPage 
9210: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
9220: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
9230: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
9240: 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
9250: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
9260: 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  ter to the cell 
9270: 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  text. */.  CellI
9280: 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20  nfo *pInfo      
9290: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68     /* Fill in th
92a0: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
92b0: 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 3b 20  ){.  u8 *pIter; 
92c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
92d0: 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 68 72  For scanning thr
92e0: 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  ough pCell */.  
92f0: 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20  u32 nPayload;   
9300: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
9310: 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65  r of bytes of ce
9320: 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20  ll payload */.  
9330: 75 36 34 20 69 4b 65 79 3b 20 20 20 20 20 20 20  u64 iKey;       
9340: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
9350: 63 74 65 64 20 4b 65 79 20 76 61 6c 75 65 20 2a  cted Key value *
9360: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
9370: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
9380: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
9390: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
93a0: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c  pPage->leaf==0 |
93b0: 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31  | pPage->leaf==1
93c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
93d0: 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20  age->intKeyLeaf 
93e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
93f0: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
9400: 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65 72 20 3d  ==0 );.  pIter =
9410: 20 70 43 65 6c 6c 3b 0a 0a 20 20 2f 2a 20 54 68   pCell;..  /* Th
9420: 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20  e next block of 
9430: 63 6f 64 65 20 69 73 20 65 71 75 69 76 61 6c 65  code is equivale
9440: 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  nt to:.  **.  **
9450: 20 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65       pIter += ge
9460: 74 56 61 72 69 6e 74 33 32 28 70 49 74 65 72 2c  tVarint32(pIter,
9470: 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 2a 2a   nPayload);.  **
9480: 0a 20 20 2a 2a 20 54 68 65 20 63 6f 64 65 20 69  .  ** The code i
9490: 73 20 69 6e 6c 69 6e 65 64 20 74 6f 20 61 76 6f  s inlined to avo
94a0: 69 64 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61  id a function ca
94b0: 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 6e 50 61 79 6c  ll..  */.  nPayl
94c0: 6f 61 64 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20  oad = *pIter;.  
94d0: 69 66 28 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78  if( nPayload>=0x
94e0: 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45  80 ){.    u8 *pE
94f0: 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a  nd = &pIter[8];.
9500: 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20      nPayload &= 
9510: 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20  0x7f;.    do{.  
9520: 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28      nPayload = (
9530: 6e 50 61 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28  nPayload<<7) | (
9540: 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29  *++pIter & 0x7f)
9550: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2a  ;.    }while( (*
9560: 70 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20  pIter)>=0x80 && 
9570: 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20  pIter<pEnd );.  
9580: 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20  }.  pIter++;..  
9590: 2f 2a 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63  /* The next bloc
95a0: 6b 20 6f 66 20 63 6f 64 65 20 69 73 20 65 71 75  k of code is equ
95b0: 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a  ivalent to:.  **
95c0: 0a 20 20 2a 2a 20 20 20 20 20 70 49 74 65 72 20  .  **     pIter 
95d0: 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 70 49 74  += getVarint(pIt
95e0: 65 72 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f  er, (u64*)&pInfo
95f0: 2d 3e 6e 4b 65 79 29 3b 0a 20 20 2a 2a 0a 20 20  ->nKey);.  **.  
9600: 2a 2a 20 54 68 65 20 63 6f 64 65 20 69 73 20 69  ** The code is i
9610: 6e 6c 69 6e 65 64 20 74 6f 20 61 76 6f 69 64 20  nlined to avoid 
9620: 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e  a function call.
9630: 0a 20 20 2a 2f 0a 20 20 69 4b 65 79 20 3d 20 2a  .  */.  iKey = *
9640: 70 49 74 65 72 3b 0a 20 20 69 66 28 20 69 4b 65  pIter;.  if( iKe
9650: 79 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 75  y>=0x80 ){.    u
9660: 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65 72  8 *pEnd = &pIter
9670: 5b 37 5d 3b 0a 20 20 20 20 69 4b 65 79 20 26 3d  [7];.    iKey &=
9680: 20 30 78 37 66 3b 0a 20 20 20 20 77 68 69 6c 65   0x7f;.    while
9690: 28 31 29 7b 0a 20 20 20 20 20 20 69 4b 65 79 20  (1){.      iKey 
96a0: 3d 20 28 69 4b 65 79 3c 3c 37 29 20 7c 20 28 2a  = (iKey<<7) | (*
96b0: 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b  ++pIter & 0x7f);
96c0: 0a 20 20 20 20 20 20 69 66 28 20 28 2a 70 49 74  .      if( (*pIt
96d0: 65 72 29 3c 30 78 38 30 20 29 20 62 72 65 61 6b  er)<0x80 ) break
96e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ;.      if( pIte
96f0: 72 3e 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20 20  r>=pEnd ){.     
9700: 20 20 20 69 4b 65 79 20 3d 20 28 69 4b 65 79 3c     iKey = (iKey<
9710: 3c 38 29 20 7c 20 2a 2b 2b 70 49 74 65 72 3b 0a  <8) | *++pIter;.
9720: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9730: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
9740: 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20 70  .  pIter++;..  p
9750: 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 2a 28 69  Info->nKey = *(i
9760: 36 34 2a 29 26 69 4b 65 79 3b 0a 20 20 70 49 6e  64*)&iKey;.  pIn
9770: 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e  fo->nPayload = n
9780: 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f  Payload;.  pInfo
9790: 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70 49 74  ->pPayload = pIt
97a0: 65 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  er;.  testcase( 
97b0: 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d  nPayload==pPage-
97c0: 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74  >maxLocal );.  t
97d0: 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61  estcase( nPayloa
97e0: 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d==pPage->maxLoc
97f0: 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 50  al+1 );.  if( nP
9800: 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d  ayload<=pPage->m
9810: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f  axLocal ){.    /
9820: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65  * This is the (e
9830: 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65  asy) common case
9840: 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72   where the entir
9850: 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20  e payload fits. 
9860: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63     ** on the loc
9870: 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65  al page.  No ove
9880: 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65  rflow is require
9890: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  d..    */.    pI
98a0: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50 61  nfo->nSize = nPa
98b0: 79 6c 6f 61 64 20 2b 20 28 75 31 36 29 28 70 49  yload + (u16)(pI
98c0: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
98d0: 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53 69    if( pInfo->nSi
98e0: 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53  ze<4 ) pInfo->nS
98f0: 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e  ize = 4;.    pIn
9900: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
9910: 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65  6)nPayload;.  }e
9920: 6c 73 65 7b 0a 20 20 20 20 62 74 72 65 65 50 61  lse{.    btreePa
9930: 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a  rseCellAdjustSiz
9940: 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50 61  eForOverflow(pPa
9950: 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f  ge, pCell, pInfo
9960: 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
9970: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
9980: 65 6c 6c 50 74 72 49 6e 64 65 78 28 0a 20 20 4d  ellPtrIndex(.  M
9990: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
99a0: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
99b0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65  ontaining the ce
99c0: 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  ll */.  u8 *pCel
99d0: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
99e0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
99f0: 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a  e cell text. */.
9a00: 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66    CellInfo *pInf
9a10: 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  o         /* Fil
9a20: 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  l in this struct
9a30: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a  ure */.){.  u8 *
9a40: 70 49 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  pIter;          
9a50: 20 20 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e      /* For scann
9a60: 69 6e 67 20 74 68 72 6f 75 67 68 20 70 43 65 6c  ing through pCel
9a70: 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c  l */.  u32 nPayl
9a80: 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f  oad;           /
9a90: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
9aa0: 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61  s of cell payloa
9ab0: 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
9ac0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
9ad0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
9ae0: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
9af0: 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  t( pPage->leaf==
9b00: 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66  0 || pPage->leaf
9b10: 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
9b20: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65   pPage->intKeyLe
9b30: 61 66 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65 72  af==0 );.  pIter
9b40: 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67 65   = pCell + pPage
9b50: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
9b60: 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49    nPayload = *pI
9b70: 74 65 72 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c  ter;.  if( nPayl
9b80: 6f 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20  oad>=0x80 ){.   
9b90: 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74   u8 *pEnd = &pIt
9ba0: 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c  er[8];.    nPayl
9bb0: 6f 61 64 20 26 3d 20 30 78 37 66 3b 0a 20 20 20  oad &= 0x7f;.   
9bc0: 20 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c   do{.      nPayl
9bd0: 6f 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c  oad = (nPayload<
9be0: 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20  <7) | (*++pIter 
9bf0: 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68  & 0x7f);.    }wh
9c00: 69 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d 30  ile( *(pIter)>=0
9c10: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
9c20: 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72  d );.  }.  pIter
9c30: 2b 2b 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65  ++;.  pInfo->nKe
9c40: 79 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  y = nPayload;.  
9c50: 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20  pInfo->nPayload 
9c60: 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49  = nPayload;.  pI
9c70: 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20  nfo->pPayload = 
9c80: 70 49 74 65 72 3b 0a 20 20 74 65 73 74 63 61 73  pIter;.  testcas
9c90: 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61  e( nPayload==pPa
9ca0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  ge->maxLocal );.
9cb0: 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79    testcase( nPay
9cc0: 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  load==pPage->max
9cd0: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28  Local+1 );.  if(
9ce0: 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65   nPayload<=pPage
9cf0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20  ->maxLocal ){.  
9d00: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
9d10: 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63   (easy) common c
9d20: 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65 6e  ase where the en
9d30: 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74  tire payload fit
9d40: 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20  s.    ** on the 
9d50: 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20  local page.  No 
9d60: 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75  overflow is requ
9d70: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
9d80: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20   pInfo->nSize = 
9d90: 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75 31 36 29  nPayload + (u16)
9da0: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b  (pIter - pCell);
9db0: 0a 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e  .    if( pInfo->
9dc0: 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d  nSize<4 ) pInfo-
9dd0: 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20  >nSize = 4;.    
9de0: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
9df0: 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20  (u16)nPayload;. 
9e00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 74 72 65   }else{.    btre
9e10: 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75 73 74  eParseCellAdjust
9e20: 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28  SizeForOverflow(
9e30: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49  pPage, pCell, pI
9e40: 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  nfo);.  }.}.stat
9e50: 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72  ic void btreePar
9e60: 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  seCell(.  MemPag
9e70: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
9e80: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
9e90: 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ning the cell */
9ea0: 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20  .  int iCell,   
9eb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
9ec0: 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46  e cell index.  F
9ed0: 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20 2a  irst cell is 0 *
9ee0: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
9ef0: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
9f00: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
9f10: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 50  cture */.){.  pP
9f20: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
9f30: 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28  pPage, findCell(
9f40: 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 2c 20 70  pPage, iCell), p
9f50: 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Info);.}../*.** 
9f60: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  The following ro
9f70: 75 74 69 6e 65 73 20 61 72 65 20 69 6d 70 6c 65  utines are imple
9f80: 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68  mentations of th
9f90: 65 20 4d 65 6d 50 61 67 65 2e 78 43 65 6c 6c 53  e MemPage.xCellS
9fa0: 69 7a 65 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a  ize.** method..*
9fb0: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
9fc0: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
9fd0: 20 62 79 74 65 73 20 74 68 61 74 20 61 20 43 65   bytes that a Ce
9fe0: 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65 20  ll needs in the 
9ff0: 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65  cell.** data are
a000: 61 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d 70  a of the btree-p
a010: 61 67 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e  age.  The return
a020: 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65 73   number includes
a030: 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74   the cell.** dat
a040: 61 20 68 65 61 64 65 72 20 61 6e 64 20 74 68 65  a header and the
a050: 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20   local payload, 
a060: 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72  but not any over
a070: 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20  flow page or.** 
a080: 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20 62  the space used b
a090: 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  y the cell point
a0a0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 63 65 6c 6c 53 69  er..**.** cellSi
a0b0: 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 29  zePtrNoPayload()
a0c0: 20 20 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 69      =>   table i
a0d0: 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a  nternal nodes.**
a0e0: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 29 20 20   cellSizePtr()  
a0f0: 20 20 20 20 20 20 20 20 20 20 20 3d 3e 20 20 20             =>   
a100: 61 6c 6c 20 69 6e 64 65 78 20 6e 6f 64 65 73 20  all index nodes 
a110: 26 20 74 61 62 6c 65 20 6c 65 61 66 20 6e 6f 64  & table leaf nod
a120: 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36  es.*/.static u16
a130: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d   cellSizePtr(Mem
a140: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20  Page *pPage, u8 
a150: 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70  *pCell){.  u8 *p
a160: 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70  Iter = pCell + p
a170: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
a180: 7a 65 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69  ze; /* For loopi
a190: 6e 67 20 6f 76 65 72 20 62 79 74 65 73 20 6f 66  ng over bytes of
a1a0: 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a   pCell */.  u8 *
a1b0: 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  pEnd;           
a1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1d0: 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b       /* End mark
a1e0: 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20 2a 2f   for a varint */
a1f0: 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b 20 20 20  .  u32 nSize;   
a200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a210: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
a220: 69 7a 65 20 76 61 6c 75 65 20 74 6f 20 72 65 74  ize value to ret
a230: 75 72 6e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  urn */..#ifdef S
a240: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
a250: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
a260: 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ned by this func
a270: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61  tion should alwa
a280: 79 73 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  ys be the same a
a290: 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c  s.  ** the (Cell
a2a0: 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75  Info.nSize) valu
a2b0: 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67  e found by doing
a2c0: 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f 66   a full parse of
a2d0: 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20   the.  ** cell. 
a2e0: 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  If SQLITE_DEBUG 
a2f0: 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61  is defined, an a
a300: 73 73 65 72 74 28 29 20 61 74 20 74 68 65 20 62  ssert() at the b
a310: 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68  ottom of.  ** th
a320: 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72 69  is function veri
a330: 66 69 65 73 20 74 68 61 74 20 74 68 69 73 20 69  fies that this i
a340: 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74 20  nvariant is not 
a350: 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43  violated. */.  C
a360: 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e 66  ellInfo debuginf
a370: 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72  o;.  pPage->xPar
a380: 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  seCell(pPage, pC
a390: 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f 29  ell, &debuginfo)
a3a0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 6e 53 69 7a  ;.#endif..  nSiz
a3b0: 65 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66  e = *pIter;.  if
a3c0: 28 20 6e 53 69 7a 65 3e 3d 30 78 38 30 20 29 7b  ( nSize>=0x80 ){
a3d0: 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74  .    pEnd = &pIt
a3e0: 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 53 69 7a 65  er[8];.    nSize
a3f0: 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64 6f   &= 0x7f;.    do
a400: 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20  {.      nSize = 
a410: 28 6e 53 69 7a 65 3c 3c 37 29 20 7c 20 28 2a 2b  (nSize<<7) | (*+
a420: 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a  +pIter & 0x7f);.
a430: 20 20 20 20 7d 77 68 69 6c 65 28 20 2a 28 70 49      }while( *(pI
a440: 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70 49  ter)>=0x80 && pI
a450: 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a  ter<pEnd );.  }.
a460: 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20 69 66 28    pIter++;.  if(
a470: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
a480: 7b 0a 20 20 20 20 2f 2a 20 70 49 74 65 72 20 6e  {.    /* pIter n
a490: 6f 77 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65  ow points at the
a4a0: 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20   64-bit integer 
a4b0: 6b 65 79 20 76 61 6c 75 65 2c 20 61 20 76 61 72  key value, a var
a4c0: 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20 20  iable length .  
a4d0: 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54 68    ** integer. Th
a4e0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63  e following bloc
a4f0: 6b 20 6d 6f 76 65 73 20 70 49 74 65 72 20 74 6f  k moves pIter to
a500: 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 66 69   point at the fi
a510: 72 73 74 20 62 79 74 65 0a 20 20 20 20 2a 2a 20  rst byte.    ** 
a520: 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
a530: 74 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20 2a  the key value. *
a540: 2f 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49  /.    pEnd = &pI
a550: 74 65 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c  ter[9];.    whil
a560: 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30 78  e( (*pIter++)&0x
a570: 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64  80 && pIter<pEnd
a580: 20 29 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63 61   );.  }.  testca
a590: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
a5a0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
a5b0: 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d  testcase( nSize=
a5c0: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
a5d0: 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 53 69 7a  +1 );.  if( nSiz
a5e0: 65 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e<=pPage->maxLoc
a5f0: 61 6c 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20  al ){.    nSize 
a600: 2b 3d 20 28 75 33 32 29 28 70 49 74 65 72 20 2d  += (u32)(pIter -
a610: 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28   pCell);.    if(
a620: 20 6e 53 69 7a 65 3c 34 20 29 20 6e 53 69 7a 65   nSize<4 ) nSize
a630: 20 3d 20 34 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 4;.  }else{. 
a640: 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20     int minLocal 
a650: 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61  = pPage->minLoca
a660: 6c 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d  l;.    nSize = m
a670: 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a 65  inLocal + (nSize
a680: 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20 28   - minLocal) % (
a690: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
a6a0: 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20  leSize - 4);.   
a6b0: 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65   testcase( nSize
a6c0: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
a6d0: 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  l );.    testcas
a6e0: 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d  e( nSize==pPage-
a6f0: 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
a700: 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50 61     if( nSize>pPa
a710: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a  ge->maxLocal ){.
a720: 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69        nSize = mi
a730: 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20  nLocal;.    }.  
a740: 20 20 6e 53 69 7a 65 20 2b 3d 20 34 20 2b 20 28    nSize += 4 + (
a750: 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65  u16)(pIter - pCe
a760: 6c 6c 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ll);.  }.  asser
a770: 74 28 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67 69  t( nSize==debugi
a780: 6e 66 6f 2e 6e 53 69 7a 65 20 7c 7c 20 43 4f 52  nfo.nSize || COR
a790: 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 72 65 74  RUPT_DB );.  ret
a7a0: 75 72 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a  urn (u16)nSize;.
a7b0: 7d 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c  }.static u16 cel
a7c0: 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61  lSizePtrNoPayloa
a7d0: 64 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  d(MemPage *pPage
a7e0: 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20  , u8 *pCell){.  
a7f0: 75 38 20 2a 70 49 74 65 72 20 3d 20 70 43 65 6c  u8 *pIter = pCel
a800: 6c 20 2b 20 34 3b 20 2f 2a 20 46 6f 72 20 6c 6f  l + 4; /* For lo
a810: 6f 70 69 6e 67 20 6f 76 65 72 20 62 79 74 65 73  oping over bytes
a820: 20 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75   of pCell */.  u
a830: 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20 20  8 *pEnd;        
a840: 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61 72        /* End mar
a850: 6b 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20 2a  k for a varint *
a860: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
a870: 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20  _DEBUG.  /* The 
a880: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
a890: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  y this function 
a8a0: 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65  should always be
a8b0: 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a   the same as.  *
a8c0: 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e  * the (CellInfo.
a8d0: 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75  nSize) value fou
a8e0: 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75  nd by doing a fu
a8f0: 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a  ll parse of the.
a900: 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51    ** cell. If SQ
a910: 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65  LITE_DEBUG is de
a920: 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74  fined, an assert
a930: 28 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d  () at the bottom
a940: 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75   of.  ** this fu
a950: 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20  nction verifies 
a960: 74 68 61 74 20 74 68 69 73 20 69 6e 76 61 72 69  that this invari
a970: 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61  ant is not viola
a980: 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  ted. */.  CellIn
a990: 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20  fo debuginfo;.  
a9a0: 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
a9b0: 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  l(pPage, pCell, 
a9c0: 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6c  &debuginfo);.#el
a9d0: 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  se.  UNUSED_PARA
a9e0: 4d 45 54 45 52 28 70 50 61 67 65 29 3b 0a 23 65  METER(pPage);.#e
a9f0: 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
aa00: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
aa10: 69 7a 65 3d 3d 34 20 29 3b 0a 20 20 70 45 6e 64  ize==4 );.  pEnd
aa20: 20 3d 20 70 49 74 65 72 20 2b 20 39 3b 0a 20 20   = pIter + 9;.  
aa30: 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b  while( (*pIter++
aa40: 29 26 30 78 38 30 20 26 26 20 70 49 74 65 72 3c  )&0x80 && pIter<
aa50: 70 45 6e 64 20 29 3b 0a 20 20 61 73 73 65 72 74  pEnd );.  assert
aa60: 28 20 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a  ( debuginfo.nSiz
aa70: 65 3d 3d 28 75 31 36 29 28 70 49 74 65 72 20 2d  e==(u16)(pIter -
aa80: 20 70 43 65 6c 6c 29 20 7c 7c 20 43 4f 52 52 55   pCell) || CORRU
aa90: 50 54 5f 44 42 20 29 3b 0a 20 20 72 65 74 75 72  PT_DB );.  retur
aaa0: 6e 20 28 75 31 36 29 28 70 49 74 65 72 20 2d 20  n (u16)(pIter - 
aab0: 70 43 65 6c 6c 29 3b 0a 7d 0a 0a 0a 23 69 66 64  pCell);.}...#ifd
aac0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
aad0: 2f 2a 20 54 68 69 73 20 76 61 72 69 61 74 69 6f  /* This variatio
aae0: 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72  n on cellSizePtr
aaf0: 28 29 20 69 73 20 75 73 65 64 20 69 6e 73 69 64  () is used insid
ab00: 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  e of assert() st
ab10: 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79  atements.** only
ab20: 2e 20 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20  . */.static u16 
ab30: 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65  cellSize(MemPage
ab40: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65   *pPage, int iCe
ab50: 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  ll){.  return pP
ab60: 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70  age->xCellSize(p
ab70: 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70  Page, findCell(p
ab80: 50 61 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d  Page, iCell));.}
ab90: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
aba0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
abb0: 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66  OVACUUM./*.** If
abc0: 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c   the cell pCell,
abd0: 20 70 61 72 74 20 6f 66 20 70 61 67 65 20 70 50   part of page pP
abe0: 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  age contains a p
abf0: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20  ointer.** to an 
ac00: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69  overflow page, i
ac10: 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69  nsert an entry i
ac20: 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  nto the pointer-
ac30: 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f  map.** for the o
ac40: 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f  verflow page..*/
ac50: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 74 72  .static void ptr
ac60: 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65  mapPutOvflPtr(Me
ac70: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
ac80: 20 2a 70 43 65 6c 6c 2c 20 69 6e 74 20 2a 70 52   *pCell, int *pR
ac90: 43 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  C){.  CellInfo i
aca0: 6e 66 6f 3b 0a 20 20 69 66 28 20 2a 70 52 43 20  nfo;.  if( *pRC 
acb0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
acc0: 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a  rt( pCell!=0 );.
acd0: 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
ace0: 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
acf0: 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20  , &info);.  if( 
ad00: 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f  info.nLocal<info
ad10: 2e 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20  .nPayload ){.   
ad20: 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74   Pgno ovfl = get
ad30: 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
ad40: 6f 2e 6e 53 69 7a 65 2d 34 5d 29 3b 0a 20 20 20  o.nSize-4]);.   
ad50: 20 70 74 72 6d 61 70 50 75 74 28 70 50 61 67 65   ptrmapPut(pPage
ad60: 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52  ->pBt, ovfl, PTR
ad70: 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70  MAP_OVERFLOW1, p
ad80: 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 52 43 29  Page->pgno, pRC)
ad90: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
ada0: 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e  ./*.** Defragmen
adb0: 74 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e  t the page given
adc0: 2e 20 20 41 6c 6c 20 43 65 6c 6c 73 20 61 72 65  .  All Cells are
add0: 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a   moved to the.**
ade0: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65   end of the page
adf0: 20 61 6e 64 20 61 6c 6c 20 66 72 65 65 20 73 70   and all free sp
ae00: 61 63 65 20 69 73 20 63 6f 6c 6c 65 63 74 65 64  ace is collected
ae10: 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67   into one.** big
ae20: 20 46 72 65 65 42 6c 6b 20 74 68 61 74 20 6f 63   FreeBlk that oc
ae30: 63 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 20  curs in between 
ae40: 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 63  the header and c
ae50: 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 61  ell.** pointer a
ae60: 72 72 61 79 20 61 6e 64 20 74 68 65 20 63 65 6c  rray and the cel
ae70: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a  l content area..
ae80: 2a 2a 0a 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f  **.** EVIDENCE-O
ae90: 46 3a 20 52 2d 34 34 35 38 32 2d 36 30 31 33 38  F: R-44582-60138
aea0: 20 53 51 4c 69 74 65 20 6d 61 79 20 66 72 6f 6d   SQLite may from
aeb0: 20 74 69 6d 65 20 74 6f 20 74 69 6d 65 20 72 65   time to time re
aec0: 6f 72 67 61 6e 69 7a 65 20 61 0a 2a 2a 20 62 2d  organize a.** b-
aed0: 74 72 65 65 20 70 61 67 65 20 73 6f 20 74 68 61  tree page so tha
aee0: 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 66  t there are no f
aef0: 72 65 65 62 6c 6f 63 6b 73 20 6f 72 20 66 72 61  reeblocks or fra
af00: 67 6d 65 6e 74 20 62 79 74 65 73 2c 20 61 6c 6c  gment bytes, all
af10: 0a 2a 2a 20 75 6e 75 73 65 64 20 62 79 74 65 73  .** unused bytes
af20: 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69   are contained i
af30: 6e 20 74 68 65 20 75 6e 61 6c 6c 6f 63 61 74 65  n the unallocate
af40: 64 20 73 70 61 63 65 20 72 65 67 69 6f 6e 2c 20  d space region, 
af50: 61 6e 64 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c 73  and all.** cells
af60: 20 61 72 65 20 70 61 63 6b 65 64 20 74 69 67 68   are packed tigh
af70: 74 6c 79 20 61 74 20 74 68 65 20 65 6e 64 20 6f  tly at the end o
af80: 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73  f the page..*/.s
af90: 74 61 74 69 63 20 69 6e 74 20 64 65 66 72 61 67  tatic int defrag
afa0: 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65  mentPage(MemPage
afb0: 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   *pPage){.  int 
afc0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
afd0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
afe0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
aff0: 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pc;             
b000: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
b010: 73 20 6f 66 20 74 68 65 20 69 2d 74 68 20 63 65  s of the i-th ce
b020: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b  ll */.  int hdr;
b030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b040: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
b050: 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20  the page header 
b060: 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20  */.  int size;  
b070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b080: 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c  /* Size of a cel
b090: 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c  l */.  int usabl
b0a0: 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  eSize;          
b0b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75    /* Number of u
b0c0: 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61  sable bytes on a
b0d0: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63   page */.  int c
b0e0: 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20  ellOffset;      
b0f0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
b100: 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  to the cell poin
b110: 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69  ter array */.  i
b120: 6e 74 20 63 62 72 6b 3b 20 20 20 20 20 20 20 20  nt cbrk;        
b130: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
b140: 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
b150: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
b160: 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20    int nCell;    
b170: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b180: 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
b190: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
b1a0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
b1b0: 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54  data;       /* T
b1c0: 68 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  he page data */.
b1d0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
b1e0: 2a 74 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20  *temp;       /* 
b1f0: 54 65 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65  Temp area for ce
b200: 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ll content */.  
b210: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73  unsigned char *s
b220: 72 63 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 6f  rc;        /* So
b230: 75 72 63 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20  urce of content 
b240: 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 46 69  */.  int iCellFi
b250: 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  rst;            
b260: 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62  /* First allowab
b270: 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f  le cell index */
b280: 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74  .  int iCellLast
b290: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
b2a0: 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20 63   Last possible c
b2b0: 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a 0a 20  ell index */... 
b2c0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
b2d0: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
b2e0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
b2f0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
b300: 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20  age->pBt!=0 );. 
b310: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
b320: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
b330: 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  <= SQLITE_MAX_PA
b340: 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61 73 73  GE_SIZE );.  ass
b350: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
b360: 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73  rflow==0 );.  as
b370: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
b380: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
b390: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
b3a0: 20 74 65 6d 70 20 3d 20 30 3b 0a 20 20 73 72 63   temp = 0;.  src
b3b0: 20 3d 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d   = data = pPage-
b3c0: 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20  >aData;.  hdr = 
b3d0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
b3e0: 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ;.  cellOffset =
b3f0: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
b400: 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50  et;.  nCell = pP
b410: 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73  age->nCell;.  as
b420: 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74  sert( nCell==get
b430: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
b440: 33 5d 29 20 29 3b 0a 20 20 75 73 61 62 6c 65 53  3]) );.  usableS
b450: 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  ize = pPage->pBt
b460: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
b470: 63 62 72 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a  cbrk = usableSiz
b480: 65 3b 0a 20 20 69 43 65 6c 6c 46 69 72 73 74 20  e;.  iCellFirst 
b490: 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  = cellOffset + 2
b4a0: 2a 6e 43 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c  *nCell;.  iCellL
b4b0: 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ast = usableSize
b4c0: 20 2d 20 34 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   - 4;.  for(i=0;
b4d0: 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
b4e0: 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b 20 20      u8 *pAddr;  
b4f0: 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63     /* The i-th c
b500: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  ell pointer */. 
b510: 20 20 20 70 41 64 64 72 20 3d 20 26 64 61 74 61     pAddr = &data
b520: 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a  [cellOffset + i*
b530: 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74  2];.    pc = get
b540: 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20  2byte(pAddr);.  
b550: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
b560: 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20  iCellFirst );.  
b570: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
b580: 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20  iCellLast );.   
b590: 20 2f 2a 20 54 68 65 73 65 20 63 6f 6e 64 69 74   /* These condit
b5a0: 69 6f 6e 73 20 68 61 76 65 20 61 6c 72 65 61 64  ions have alread
b5b0: 79 20 62 65 65 6e 20 76 65 72 69 66 69 65 64 20  y been verified 
b5c0: 69 6e 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  in btreeInitPage
b5d0: 28 29 0a 20 20 20 20 2a 2a 20 69 66 20 50 52 41  ().    ** if PRA
b5e0: 47 4d 41 20 63 65 6c 6c 5f 73 69 7a 65 5f 63 68  GMA cell_size_ch
b5f0: 65 63 6b 3d 4f 4e 2e 0a 20 20 20 20 2a 2f 0a 20  eck=ON..    */. 
b600: 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46     if( pc<iCellF
b610: 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c  irst || pc>iCell
b620: 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65  Last ){.      re
b630: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
b640: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
b650: 20 20 20 20 61 73 73 65 72 74 28 20 70 63 3e 3d      assert( pc>=
b660: 69 43 65 6c 6c 46 69 72 73 74 20 26 26 20 70 63  iCellFirst && pc
b670: 3c 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20  <=iCellLast );. 
b680: 20 20 20 73 69 7a 65 20 3d 20 70 50 61 67 65 2d     size = pPage-
b690: 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65  >xCellSize(pPage
b6a0: 2c 20 26 73 72 63 5b 70 63 5d 29 3b 0a 20 20 20  , &src[pc]);.   
b6b0: 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20   cbrk -= size;. 
b6c0: 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65 6c     if( cbrk<iCel
b6d0: 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b 73 69 7a  lFirst || pc+siz
b6e0: 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  e>usableSize ){.
b6f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
b700: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
b710: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
b720: 72 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d 75  rt( cbrk+size<=u
b730: 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63 62 72  sableSize && cbr
b740: 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  k>=iCellFirst );
b750: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 63  .    testcase( c
b760: 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65  brk+size==usable
b770: 53 69 7a 65 20 29 3b 0a 20 20 20 20 74 65 73 74  Size );.    test
b780: 63 61 73 65 28 20 70 63 2b 73 69 7a 65 3d 3d 75  case( pc+size==u
b790: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
b7a0: 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72 2c   put2byte(pAddr,
b7b0: 20 63 62 72 6b 29 3b 0a 20 20 20 20 69 66 28 20   cbrk);.    if( 
b7c0: 74 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  temp==0 ){.     
b7d0: 20 69 6e 74 20 78 3b 0a 20 20 20 20 20 20 69 66   int x;.      if
b7e0: 28 20 63 62 72 6b 3d 3d 70 63 20 29 20 63 6f 6e  ( cbrk==pc ) con
b7f0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 74 65 6d  tinue;.      tem
b800: 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  p = sqlite3Pager
b810: 54 65 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d  TempSpace(pPage-
b820: 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  >pBt->pPager);. 
b830: 20 20 20 20 20 78 20 3d 20 67 65 74 32 62 79 74       x = get2byt
b840: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
b850: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 74  .      memcpy(&t
b860: 65 6d 70 5b 78 5d 2c 20 26 64 61 74 61 5b 78 5d  emp[x], &data[x]
b870: 2c 20 28 63 62 72 6b 2b 73 69 7a 65 29 20 2d 20  , (cbrk+size) - 
b880: 78 29 3b 0a 20 20 20 20 20 20 73 72 63 20 3d 20  x);.      src = 
b890: 74 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  temp;.    }.    
b8a0: 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63 62 72  memcpy(&data[cbr
b8b0: 6b 5d 2c 20 26 73 72 63 5b 70 63 5d 2c 20 73 69  k], &src[pc], si
b8c0: 7a 65 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ze);.  }.  asser
b8d0: 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69  t( cbrk>=iCellFi
b8e0: 72 73 74 20 29 3b 0a 20 20 70 75 74 32 62 79 74  rst );.  put2byt
b8f0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
b900: 63 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64  cbrk);.  data[hd
b910: 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61  r+1] = 0;.  data
b920: 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64  [hdr+2] = 0;.  d
b930: 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
b940: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69    memset(&data[i
b950: 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63  CellFirst], 0, c
b960: 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b  brk-iCellFirst);
b970: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
b980: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
b990: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
b9a0: 65 29 20 29 3b 0a 20 20 69 66 28 20 63 62 72 6b  e) );.  if( cbrk
b9b0: 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d 70 50 61  -iCellFirst!=pPa
b9c0: 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20  ge->nFree ){.   
b9d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
b9e0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
b9f0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
ba00: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
ba10: 61 72 63 68 20 74 68 65 20 66 72 65 65 2d 6c 69  arch the free-li
ba20: 73 74 20 6f 6e 20 70 61 67 65 20 70 50 67 20 66  st on page pPg f
ba30: 6f 72 20 73 70 61 63 65 20 74 6f 20 73 74 6f 72  or space to stor
ba40: 65 20 61 20 63 65 6c 6c 20 6e 42 79 74 65 20 62  e a cell nByte b
ba50: 79 74 65 73 20 69 6e 0a 2a 2a 20 73 69 7a 65 2e  ytes in.** size.
ba60: 20 49 66 20 6f 6e 65 20 63 61 6e 20 62 65 20 66   If one can be f
ba70: 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 61 20 70  ound, return a p
ba80: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 70  ointer to the sp
ba90: 61 63 65 20 61 6e 64 20 72 65 6d 6f 76 65 20 69  ace and remove i
baa0: 74 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 72  t.** from the fr
bab0: 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49  ee-list..**.** I
bac0: 66 20 6e 6f 20 73 75 69 74 61 62 6c 65 20 73 70  f no suitable sp
bad0: 61 63 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  ace can be found
bae0: 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
baf0: 74 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  t, return NULL..
bb00: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
bb10: 69 6f 6e 20 6d 61 79 20 64 65 74 65 63 74 20 63  ion may detect c
bb20: 6f 72 72 75 70 74 69 6f 6e 20 77 69 74 68 69 6e  orruption within
bb30: 20 70 50 67 2e 20 20 49 66 20 63 6f 72 72 75 70   pPg.  If corrup
bb40: 74 69 6f 6e 20 69 73 0a 2a 2a 20 64 65 74 65 63  tion is.** detec
bb50: 74 65 64 20 74 68 65 6e 20 2a 70 52 63 20 69 73  ted then *pRc is
bb60: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 43   set to SQLITE_C
bb70: 4f 52 52 55 50 54 20 61 6e 64 20 4e 55 4c 4c 20  ORRUPT and NULL 
bb80: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
bb90: 2a 2a 20 53 6c 6f 74 73 20 6f 6e 20 74 68 65 20  ** Slots on the 
bba0: 66 72 65 65 20 6c 69 73 74 20 74 68 61 74 20 61  free list that a
bbb0: 72 65 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64  re between 1 and
bbc0: 20 33 20 62 79 74 65 73 20 6c 61 72 67 65 72 20   3 bytes larger 
bbd0: 74 68 61 6e 20 6e 42 79 74 65 0a 2a 2a 20 77 69  than nByte.** wi
bbe0: 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64 20 69 66  ll be ignored if
bbf0: 20 61 64 64 69 6e 67 20 74 68 65 20 65 78 74 72   adding the extr
bc00: 61 20 73 70 61 63 65 20 74 6f 20 74 68 65 20 66  a space to the f
bc10: 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 75  ragmentation cou
bc20: 6e 74 0a 2a 2a 20 63 61 75 73 65 73 20 74 68 65  nt.** causes the
bc30: 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 63   fragmentation c
bc40: 6f 75 6e 74 20 74 6f 20 65 78 63 65 65 64 20 36  ount to exceed 6
bc50: 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20  0..*/.static u8 
bc60: 2a 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 4d 65  *pageFindSlot(Me
bc70: 6d 50 61 67 65 20 2a 70 50 67 2c 20 69 6e 74 20  mPage *pPg, int 
bc80: 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 52 63 29  nByte, int *pRc)
bc90: 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64  {.  const int hd
bca0: 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f 66 66 73  r = pPg->hdrOffs
bcb0: 65 74 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74  et;.  u8 * const
bcc0: 20 61 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44   aData = pPg->aD
bcd0: 61 74 61 3b 0a 20 20 69 6e 74 20 69 41 64 64 72  ata;.  int iAddr
bce0: 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69 6e   = hdr + 1;.  in
bcf0: 74 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28  t pc = get2byte(
bd00: 26 61 44 61 74 61 5b 69 41 64 64 72 5d 29 3b 0a  &aData[iAddr]);.
bd10: 20 20 69 6e 74 20 78 3b 0a 20 20 69 6e 74 20 75    int x;.  int u
bd20: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 67 2d  sableSize = pPg-
bd30: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
bd40: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 63 3e  ;..  assert( pc>
bd50: 30 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 69  0 );.  do{.    i
bd60: 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20  nt size;        
bd70: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
bd80: 68 65 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a  he free slot */.
bd90: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
bda0: 4f 46 3a 20 52 2d 30 36 38 36 36 2d 33 39 31 32  OF: R-06866-3912
bdb0: 35 20 46 72 65 65 62 6c 6f 63 6b 73 20 61 72 65  5 Freeblocks are
bdc0: 20 61 6c 77 61 79 73 20 63 6f 6e 6e 65 63 74 65   always connecte
bdd0: 64 20 69 6e 20 6f 72 64 65 72 20 6f 66 0a 20 20  d in order of.  
bde0: 20 20 2a 2a 20 69 6e 63 72 65 61 73 69 6e 67 20    ** increasing 
bdf0: 6f 66 66 73 65 74 2e 20 2a 2f 0a 20 20 20 20 69  offset. */.    i
be00: 66 28 20 70 63 3e 75 73 61 62 6c 65 53 69 7a 65  f( pc>usableSize
be10: 2d 34 20 7c 7c 20 70 63 3c 69 41 64 64 72 2b 34  -4 || pc<iAddr+4
be20: 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d   ){.      *pRc =
be30: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
be40: 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75  BKPT;.      retu
be50: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
be60: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
be70: 52 2d 32 32 37 31 30 2d 35 33 33 32 38 20 54 68  R-22710-53328 Th
be80: 65 20 74 68 69 72 64 20 61 6e 64 20 66 6f 75 72  e third and four
be90: 74 68 20 62 79 74 65 73 20 6f 66 20 65 61 63 68  th bytes of each
bea0: 0a 20 20 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63  .    ** freebloc
beb0: 6b 20 66 6f 72 6d 20 61 20 62 69 67 2d 65 6e 64  k form a big-end
bec0: 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
bed0: 68 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66  h is the size of
bee0: 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 0a 20   the freeblock. 
bef0: 20 20 20 2a 2a 20 69 6e 20 62 79 74 65 73 2c 20     ** in bytes, 
bf00: 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 34 2d  including the 4-
bf10: 62 79 74 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a  byte header. */.
bf20: 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62      size = get2b
bf30: 79 74 65 28 26 61 44 61 74 61 5b 70 63 2b 32 5d  yte(&aData[pc+2]
bf40: 29 3b 0a 20 20 20 20 69 66 28 20 28 78 20 3d 20  );.    if( (x = 
bf50: 73 69 7a 65 20 2d 20 6e 42 79 74 65 29 3e 3d 30  size - nByte)>=0
bf60: 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
bf70: 73 65 28 20 78 3d 3d 34 20 29 3b 0a 20 20 20 20  se( x==4 );.    
bf80: 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 33    testcase( x==3
bf90: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 63   );.      if( pc
bfa0: 20 3c 20 70 50 67 2d 3e 63 65 6c 6c 4f 66 66 73   < pPg->cellOffs
bfb0: 65 74 2b 32 2a 70 50 67 2d 3e 6e 43 65 6c 6c 20  et+2*pPg->nCell 
bfc0: 7c 7c 20 73 69 7a 65 2b 70 63 20 3e 20 75 73 61  || size+pc > usa
bfd0: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
bfe0: 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45     *pRc = SQLITE
bff0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
c000: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
c010: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
c020: 20 78 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20   x<4 ){.        
c030: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
c040: 52 2d 31 31 34 39 38 2d 35 38 30 32 32 20 49 6e  R-11498-58022 In
c050: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 62   a well-formed b
c060: 2d 74 72 65 65 20 70 61 67 65 2c 20 74 68 65 20  -tree page, the 
c070: 74 6f 74 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a  total.        **
c080: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
c090: 20 69 6e 20 66 72 61 67 6d 65 6e 74 73 20 6d 61   in fragments ma
c0a0: 79 20 6e 6f 74 20 65 78 63 65 65 64 20 36 30 2e  y not exceed 60.
c0b0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
c0c0: 61 44 61 74 61 5b 68 64 72 2b 37 5d 3e 35 37 20  aData[hdr+7]>57 
c0d0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 20  ) return 0;..   
c0e0: 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74       /* Remove t
c0f0: 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74 68 65  he slot from the
c100: 20 66 72 65 65 2d 6c 69 73 74 2e 20 55 70 64 61   free-list. Upda
c110: 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
c120: 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 72 61 67  .        ** frag
c130: 6d 65 6e 74 65 64 20 62 79 74 65 73 20 77 69 74  mented bytes wit
c140: 68 69 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f  hin the page. */
c150: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
c160: 26 61 44 61 74 61 5b 69 41 64 64 72 5d 2c 20 26  &aData[iAddr], &
c170: 61 44 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20  aData[pc], 2);. 
c180: 20 20 20 20 20 20 20 61 44 61 74 61 5b 68 64 72         aData[hdr
c190: 2b 37 5d 20 2b 3d 20 28 75 38 29 78 3b 0a 20 20  +7] += (u8)x;.  
c1a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c1b0: 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20 72     /* The slot r
c1c0: 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20 66 72  emains on the fr
c1d0: 65 65 2d 6c 69 73 74 2e 20 52 65 64 75 63 65 20  ee-list. Reduce 
c1e0: 69 74 73 20 73 69 7a 65 20 74 6f 20 61 63 63 6f  its size to acco
c1f0: 75 6e 74 0a 20 20 20 20 20 20 20 20 20 2a 2a 20  unt.         ** 
c200: 66 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20  for the portion 
c210: 75 73 65 64 20 62 79 20 74 68 65 20 6e 65 77 20  used by the new 
c220: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20  allocation. */. 
c230: 20 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28         put2byte(
c240: 26 61 44 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29  &aData[pc+2], x)
c250: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c260: 72 65 74 75 72 6e 20 26 61 44 61 74 61 5b 70 63  return &aData[pc
c270: 20 2b 20 78 5d 3b 0a 20 20 20 20 7d 0a 20 20 20   + x];.    }.   
c280: 20 69 41 64 64 72 20 3d 20 70 63 3b 0a 20 20 20   iAddr = pc;.   
c290: 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26   pc = get2byte(&
c2a0: 61 44 61 74 61 5b 70 63 5d 29 3b 0a 20 20 7d 77  aData[pc]);.  }w
c2b0: 68 69 6c 65 28 20 70 63 20 29 3b 0a 0a 20 20 72  hile( pc );..  r
c2c0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
c2d0: 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65  * Allocate nByte
c2e0: 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
c2f0: 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20  from within the 
c300: 42 2d 54 72 65 65 20 70 61 67 65 20 70 61 73 73  B-Tree page pass
c310: 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72  ed.** as the fir
c320: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 57 72 69  st argument. Wri
c330: 74 65 20 69 6e 74 6f 20 2a 70 49 64 78 20 74 68  te into *pIdx th
c340: 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50 61  e index into pPa
c350: 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f  ge->aData[].** o
c360: 66 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  f the first byte
c370: 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 73 70   of allocated sp
c380: 61 63 65 2e 20 52 65 74 75 72 6e 20 65 69 74 68  ace. Return eith
c390: 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a  er SQLITE_OK or.
c3a0: 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  ** an error code
c3b0: 20 28 75 73 75 61 6c 6c 79 20 53 51 4c 49 54 45   (usually SQLITE
c3c0: 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a  _CORRUPT)..**.**
c3d0: 20 54 68 65 20 63 61 6c 6c 65 72 20 67 75 61 72   The caller guar
c3e0: 61 6e 74 65 65 73 20 74 68 61 74 20 74 68 65 72  antees that ther
c3f0: 65 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 20  e is sufficient 
c400: 73 70 61 63 65 20 74 6f 20 6d 61 6b 65 20 74 68  space to make th
c410: 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e  e.** allocation.
c420: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
c430: 69 67 68 74 20 6e 65 65 64 20 74 6f 20 64 65 66  ight need to def
c440: 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72 64 65 72  ragment in order
c450: 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c   to bring.** all
c460: 20 74 68 65 20 73 70 61 63 65 20 74 6f 67 65 74   the space toget
c470: 68 65 72 2c 20 68 6f 77 65 76 65 72 2e 20 20 54  her, however.  T
c480: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
c490: 20 61 76 6f 69 64 20 75 73 69 6e 67 0a 2a 2a 20   avoid using.** 
c4a0: 74 68 65 20 66 69 72 73 74 20 74 77 6f 20 62 79  the first two by
c4b0: 74 65 73 20 70 61 73 74 20 74 68 65 20 63 65 6c  tes past the cel
c4c0: 6c 20 70 6f 69 6e 74 65 72 20 61 72 65 61 20 73  l pointer area s
c4d0: 69 6e 63 65 20 70 72 65 73 75 6d 61 62 6c 79 20  ince presumably 
c4e0: 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69  this.** allocati
c4f0: 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d 61 64 65  on is being made
c500: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 73   in order to ins
c510: 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 2c 20  ert a new cell, 
c520: 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c  so we will.** al
c530: 73 6f 20 65 6e 64 20 75 70 20 6e 65 65 64 69 6e  so end up needin
c540: 67 20 61 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69  g a new cell poi
c550: 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nter..*/.static 
c560: 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70 61 63  int allocateSpac
c570: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
c580: 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74  , int nByte, int
c590: 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f 6e 73 74   *pIdx){.  const
c5a0: 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65   int hdr = pPage
c5b0: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20  ->hdrOffset;    
c5c0: 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
c5d0: 66 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  f pPage->hdrOffs
c5e0: 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e  et */.  u8 * con
c5f0: 73 74 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  st data = pPage-
c600: 3e 61 44 61 74 61 3b 20 20 20 20 20 20 2f 2a 20  >aData;      /* 
c610: 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70  Local cache of p
c620: 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20  Page->aData */. 
c630: 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20   int top;       
c640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c650: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
c660: 79 74 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74  yte of cell cont
c670: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e  ent area */.  in
c680: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
c690: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c6a0: 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 72 65     /* Integer re
c6b0: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
c6c0: 6e 74 20 67 61 70 3b 20 20 20 20 20 20 20 20 2f  nt gap;        /
c6d0: 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
c6e0: 67 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c 6c  gap between cell
c6f0: 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 63 65   pointers and ce
c700: 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ll content */.  
c710: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
c720: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
c730: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
c740: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
c750: 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20  pPage->pBt );.  
c760: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
c770: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
c780: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
c790: 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65  .  assert( nByte
c7a0: 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d  >=0 );  /* Minim
c7b0: 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20  um cell size is 
c7c0: 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  4 */.  assert( p
c7d0: 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79  Page->nFree>=nBy
c7e0: 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  te );.  assert( 
c7f0: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
c800: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
c810: 20 6e 42 79 74 65 20 3c 20 28 69 6e 74 29 28 70   nByte < (int)(p
c820: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
c830: 65 53 69 7a 65 2d 38 29 20 29 3b 0a 0a 20 20 61  eSize-8) );..  a
c840: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 65  ssert( pPage->ce
c850: 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68 64 72 20  llOffset == hdr 
c860: 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e  + 12 - 4*pPage->
c870: 6c 65 61 66 20 29 3b 0a 20 20 67 61 70 20 3d 20  leaf );.  gap = 
c880: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
c890: 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65  t + 2*pPage->nCe
c8a0: 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 67 61  ll;.  assert( ga
c8b0: 70 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 2f 2a  p<=65536 );.  /*
c8c0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
c8d0: 32 39 33 35 36 2d 30 32 33 39 31 20 49 66 20 74  29356-02391 If t
c8e0: 68 65 20 64 61 74 61 62 61 73 65 20 75 73 65 73  he database uses
c8f0: 20 61 20 36 35 35 33 36 2d 62 79 74 65 20 70 61   a 65536-byte pa
c900: 67 65 20 73 69 7a 65 0a 20 20 2a 2a 20 61 6e 64  ge size.  ** and
c910: 20 74 68 65 20 72 65 73 65 72 76 65 64 20 73 70   the reserved sp
c920: 61 63 65 20 69 73 20 7a 65 72 6f 20 28 74 68 65  ace is zero (the
c930: 20 75 73 75 61 6c 20 76 61 6c 75 65 20 66 6f 72   usual value for
c940: 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65 29   reserved space)
c950: 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 63  .  ** then the c
c960: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 66 73  ell content offs
c970: 65 74 20 6f 66 20 61 6e 20 65 6d 70 74 79 20 70  et of an empty p
c980: 61 67 65 20 77 61 6e 74 73 20 74 6f 20 62 65 20  age wants to be 
c990: 36 35 35 33 36 2e 0a 20 20 2a 2a 20 48 6f 77 65  65536..  ** Howe
c9a0: 76 65 72 2c 20 74 68 61 74 20 69 6e 74 65 67 65  ver, that intege
c9b0: 72 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 74  r is too large t
c9c0: 6f 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 61  o be stored in a
c9d0: 20 32 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64   2-byte unsigned
c9e0: 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73  .  ** integer, s
c9f0: 6f 20 61 20 76 61 6c 75 65 20 6f 66 20 30 20 69  o a value of 0 i
ca00: 73 20 75 73 65 64 20 69 6e 20 69 74 73 20 70 6c  s used in its pl
ca10: 61 63 65 2e 20 2a 2f 0a 20 20 74 6f 70 20 3d 20  ace. */.  top = 
ca20: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
ca30: 64 72 2b 35 5d 29 3b 0a 20 20 61 73 73 65 72 74  dr+5]);.  assert
ca40: 28 20 74 6f 70 3c 3d 28 69 6e 74 29 70 50 61 67  ( top<=(int)pPag
ca50: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
ca60: 7a 65 20 29 3b 20 2f 2a 20 50 72 65 76 65 6e 74  ze ); /* Prevent
ca70: 20 62 79 20 67 65 74 41 6e 64 49 6e 69 74 50 61   by getAndInitPa
ca80: 67 65 28 29 20 2a 2f 0a 20 20 69 66 28 20 67 61  ge() */.  if( ga
ca90: 70 3e 74 6f 70 20 29 7b 0a 20 20 20 20 69 66 28  p>top ){.    if(
caa0: 20 74 6f 70 3d 3d 30 20 26 26 20 70 50 61 67 65   top==0 && pPage
cab0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
cac0: 65 3d 3d 36 35 35 33 36 20 29 7b 0a 20 20 20 20  e==65536 ){.    
cad0: 20 20 74 6f 70 20 3d 20 36 35 35 33 36 3b 0a 20    top = 65536;. 
cae0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
caf0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
cb00: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
cb10: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
cb20: 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20 73  here is enough s
cb30: 70 61 63 65 20 62 65 74 77 65 65 6e 20 67 61 70  pace between gap
cb40: 20 61 6e 64 20 74 6f 70 20 66 6f 72 20 6f 6e 65   and top for one
cb50: 20 6d 6f 72 65 20 63 65 6c 6c 20 70 6f 69 6e 74   more cell point
cb60: 65 72 0a 20 20 2a 2a 20 61 72 72 61 79 20 65 6e  er.  ** array en
cb70: 74 72 79 20 6f 66 66 73 65 74 2c 20 61 6e 64 20  try offset, and 
cb80: 69 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  if the freelist 
cb90: 69 73 20 6e 6f 74 20 65 6d 70 74 79 2c 20 74 68  is not empty, th
cba0: 65 6e 20 73 65 61 72 63 68 20 74 68 65 0a 20 20  en search the.  
cbb0: 2a 2a 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b  ** freelist look
cbc0: 69 6e 67 20 66 6f 72 20 61 20 66 72 65 65 20 73  ing for a free s
cbd0: 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 20 74  lot big enough t
cbe0: 6f 20 73 61 74 69 73 66 79 20 74 68 65 20 72 65  o satisfy the re
cbf0: 71 75 65 73 74 2e 0a 20 20 2a 2f 0a 20 20 74 65  quest..  */.  te
cc00: 73 74 63 61 73 65 28 20 67 61 70 2b 32 3d 3d 74  stcase( gap+2==t
cc10: 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  op );.  testcase
cc20: 28 20 67 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a  ( gap+1==top );.
cc30: 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70 3d    testcase( gap=
cc40: 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20 28 64  =top );.  if( (d
cc50: 61 74 61 5b 68 64 72 2b 32 5d 20 7c 7c 20 64 61  ata[hdr+2] || da
cc60: 74 61 5b 68 64 72 2b 31 5d 29 20 26 26 20 67 61  ta[hdr+1]) && ga
cc70: 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a 20 20 20 20  p+2<=top ){.    
cc80: 75 38 20 2a 70 53 70 61 63 65 20 3d 20 70 61 67  u8 *pSpace = pag
cc90: 65 46 69 6e 64 53 6c 6f 74 28 70 50 61 67 65 2c  eFindSlot(pPage,
cca0: 20 6e 42 79 74 65 2c 20 26 72 63 29 3b 0a 20 20   nByte, &rc);.  
ccb0: 20 20 69 66 28 20 70 53 70 61 63 65 20 29 7b 0a    if( pSpace ){.
ccc0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
ccd0: 70 61 63 65 3e 3d 64 61 74 61 20 26 26 20 28 70  pace>=data && (p
cce0: 53 70 61 63 65 20 2d 20 64 61 74 61 29 3c 36 35  Space - data)<65
ccf0: 35 33 36 20 29 3b 0a 20 20 20 20 20 20 2a 70 49  536 );.      *pI
cd00: 64 78 20 3d 20 28 69 6e 74 29 28 70 53 70 61 63  dx = (int)(pSpac
cd10: 65 20 2d 20 64 61 74 61 29 3b 0a 20 20 20 20 20  e - data);.     
cd20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
cd30: 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  K;.    }else if(
cd40: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
cd50: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
cd60: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 71 75  }..  /* The requ
cd70: 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  est could not be
cd80: 20 66 75 6c 66 69 6c 6c 65 64 20 75 73 69 6e 67   fulfilled using
cd90: 20 61 20 66 72 65 65 6c 69 73 74 20 73 6c 6f 74   a freelist slot
cda0: 2e 20 20 43 68 65 63 6b 0a 20 20 2a 2a 20 74 6f  .  Check.  ** to
cdb0: 20 73 65 65 20 69 66 20 64 65 66 72 61 67 6d 65   see if defragme
cdc0: 6e 74 61 74 69 6f 6e 20 69 73 20 6e 65 63 65 73  ntation is neces
cdd0: 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 74 65 73  sary..  */.  tes
cde0: 74 63 61 73 65 28 20 67 61 70 2b 32 2b 6e 42 79  tcase( gap+2+nBy
cdf0: 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28  te==top );.  if(
ce00: 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e 74 6f 70   gap+2+nByte>top
ce10: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
ce20: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c  pPage->nCell>0 |
ce30: 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
ce40: 20 20 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d      rc = defragm
ce50: 65 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  entPage(pPage);.
ce60: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
ce70: 75 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20  urn rc;.    top 
ce80: 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  = get2byteNotZer
ce90: 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  o(&data[hdr+5]);
cea0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 61 70  .    assert( gap
ceb0: 2b 6e 42 79 74 65 3c 3d 74 6f 70 20 29 3b 0a 20  +nByte<=top );. 
cec0: 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   }...  /* Alloca
ced0: 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74  te memory from t
cee0: 68 65 20 67 61 70 20 69 6e 20 62 65 74 77 65 65  he gap in betwee
cef0: 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  n the cell point
cf00: 65 72 20 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e  er array.  ** an
cf10: 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  d the cell conte
cf20: 6e 74 20 61 72 65 61 2e 20 20 54 68 65 20 62 74  nt area.  The bt
cf30: 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 63 61  reeInitPage() ca
cf40: 6c 6c 20 68 61 73 20 61 6c 72 65 61 64 79 0a 20  ll has already. 
cf50: 20 2a 2a 20 76 61 6c 69 64 61 74 65 64 20 74 68   ** validated th
cf60: 65 20 66 72 65 65 6c 69 73 74 2e 20 20 47 69 76  e freelist.  Giv
cf70: 65 6e 20 74 68 61 74 20 74 68 65 20 66 72 65 65  en that the free
cf80: 6c 69 73 74 20 69 73 20 76 61 6c 69 64 2c 20 74  list is valid, t
cf90: 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20  here.  ** is no 
cfa0: 77 61 79 20 74 68 61 74 20 74 68 65 20 61 6c 6c  way that the all
cfb0: 6f 63 61 74 69 6f 6e 20 63 61 6e 20 65 78 74 65  ocation can exte
cfc0: 6e 64 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f  nd off the end o
cfd0: 66 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a  f the page..  **
cfe0: 20 54 68 65 20 61 73 73 65 72 74 28 29 20 62 65   The assert() be
cff0: 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74 68 65  low verifies the
d000: 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e   previous senten
d010: 63 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 2d  ce..  */.  top -
d020: 3d 20 6e 42 79 74 65 3b 0a 20 20 70 75 74 32 62  = nByte;.  put2b
d030: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
d040: 2c 20 74 6f 70 29 3b 0a 20 20 61 73 73 65 72 74  , top);.  assert
d050: 28 20 74 6f 70 2b 6e 42 79 74 65 20 3c 3d 20 28  ( top+nByte <= (
d060: 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e  int)pPage->pBt->
d070: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
d080: 2a 70 49 64 78 20 3d 20 74 6f 70 3b 0a 20 20 72  *pIdx = top;.  r
d090: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
d0a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
d0b0: 20 61 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68   a section of th
d0c0: 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 74  e pPage->aData t
d0d0: 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a  o the freelist..
d0e0: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74  ** The first byt
d0f0: 65 20 6f 66 20 74 68 65 20 6e 65 77 20 66 72 65  e of the new fre
d100: 65 20 62 6c 6f 63 6b 20 69 73 20 70 50 61 67 65  e block is pPage
d110: 2d 3e 61 44 61 74 61 5b 69 53 74 61 72 74 5d 0a  ->aData[iStart].
d120: 2a 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20  ** and the size 
d130: 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73 20  of the block is 
d140: 69 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a  iSize bytes..**.
d150: 2a 2a 20 41 64 6a 61 63 65 6e 74 20 66 72 65 65  ** Adjacent free
d160: 62 6c 6f 63 6b 73 20 61 72 65 20 63 6f 61 6c 65  blocks are coale
d170: 73 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  sced..**.** Note
d180: 20 74 68 61 74 20 65 76 65 6e 20 74 68 6f 75 67   that even thoug
d190: 68 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 20  h the freeblock 
d1a0: 6c 69 73 74 20 77 61 73 20 63 68 65 63 6b 65 64  list was checked
d1b0: 20 62 79 20 62 74 72 65 65 49 6e 69 74 50 61 67   by btreeInitPag
d1c0: 65 28 29 2c 0a 2a 2a 20 74 68 61 74 20 72 6f 75  e(),.** that rou
d1d0: 74 69 6e 65 20 77 69 6c 6c 20 6e 6f 74 20 64 65  tine will not de
d1e0: 74 65 63 74 20 6f 76 65 72 6c 61 70 20 62 65 74  tect overlap bet
d1f0: 77 65 65 6e 20 63 65 6c 6c 73 20 6f 72 20 66 72  ween cells or fr
d200: 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 72 0a 2a  eeblocks.  Nor.*
d210: 2a 20 64 6f 65 73 20 69 74 20 64 65 74 65 63 74  * does it detect
d220: 20 63 65 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c   cells or freebl
d230: 6f 63 6b 73 20 74 68 61 74 20 65 6e 63 72 6f 75  ocks that encrou
d240: 63 68 20 69 6e 74 6f 20 74 68 65 20 72 65 73 65  ch into the rese
d250: 72 76 65 64 20 62 79 74 65 73 0a 2a 2a 20 61 74  rved bytes.** at
d260: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
d270: 70 61 67 65 2e 20 20 53 6f 20 64 6f 20 61 64 64  page.  So do add
d280: 69 74 69 6f 6e 61 6c 20 63 6f 72 72 75 70 74 69  itional corrupti
d290: 6f 6e 20 63 68 65 63 6b 73 20 69 6e 73 69 64 65  on checks inside
d2a0: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
d2b0: 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
d2c0: 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 6e  TE_CORRUPT if an
d2d0: 79 20 70 72 6f 62 6c 65 6d 73 20 61 72 65 20 66  y problems are f
d2e0: 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
d2f0: 69 6e 74 20 66 72 65 65 53 70 61 63 65 28 4d 65  int freeSpace(Me
d300: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 31  mPage *pPage, u1
d310: 36 20 69 53 74 61 72 74 2c 20 75 31 36 20 69 53  6 iStart, u16 iS
d320: 69 7a 65 29 7b 0a 20 20 75 31 36 20 69 50 74 72  ize){.  u16 iPtr
d330: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d350: 20 41 64 64 72 65 73 73 20 6f 66 20 70 74 72 20   Address of ptr 
d360: 74 6f 20 6e 65 78 74 20 66 72 65 65 62 6c 6f 63  to next freebloc
d370: 6b 20 2a 2f 0a 20 20 75 31 36 20 69 46 72 65 65  k */.  u16 iFree
d380: 42 6c 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  Blk;            
d390: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d3a0: 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e  Address of the n
d3b0: 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f  ext freeblock */
d3c0: 0a 20 20 75 38 20 68 64 72 3b 20 20 20 20 20 20  .  u8 hdr;      
d3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
d3f0: 20 68 65 61 64 65 72 20 73 69 7a 65 2e 20 20 30   header size.  0
d400: 20 6f 72 20 31 30 30 20 2a 2f 0a 20 20 75 38 20   or 100 */.  u8 
d410: 6e 46 72 61 67 20 3d 20 30 3b 20 20 20 20 20 20  nFrag = 0;      
d420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d430: 20 20 20 2f 2a 20 52 65 64 75 63 74 69 6f 6e 20     /* Reduction 
d440: 69 6e 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e  in fragmentation
d450: 20 2a 2f 0a 20 20 75 31 36 20 69 4f 72 69 67 53   */.  u16 iOrigS
d460: 69 7a 65 20 3d 20 69 53 69 7a 65 3b 20 20 20 20  ize = iSize;    
d470: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
d480: 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66  riginal value of
d490: 20 69 53 69 7a 65 20 2a 2f 0a 20 20 75 33 32 20   iSize */.  u32 
d4a0: 69 4c 61 73 74 20 3d 20 70 50 61 67 65 2d 3e 70  iLast = pPage->p
d4b0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34  Bt->usableSize-4
d4c0: 3b 20 2f 2a 20 4c 61 72 67 65 73 74 20 70 6f 73  ; /* Largest pos
d4d0: 73 69 62 6c 65 20 66 72 65 65 62 6c 6f 63 6b 20  sible freeblock 
d4e0: 6f 66 66 73 65 74 20 2a 2f 0a 20 20 75 33 32 20  offset */.  u32 
d4f0: 69 45 6e 64 20 3d 20 69 53 74 61 72 74 20 2b 20  iEnd = iStart + 
d500: 69 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  iSize;          
d510: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
d520: 70 61 73 74 20 74 68 65 20 69 53 74 61 72 74 20  past the iStart 
d530: 62 75 66 66 65 72 20 2a 2f 0a 20 20 75 6e 73 69  buffer */.  unsi
d540: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20  gned char *data 
d550: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20  = pPage->aData; 
d560: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 65 6e    /* Page conten
d570: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
d580: 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b  pPage->pBt!=0 );
d590: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
d5a0: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
d5b0: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
d5c0: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
d5d0: 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 53  CORRUPT_DB || iS
d5e0: 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72  tart>=pPage->hdr
d5f0: 4f 66 66 73 65 74 2b 36 2b 70 50 61 67 65 2d 3e  Offset+6+pPage->
d600: 63 68 69 6c 64 50 74 72 53 69 7a 65 20 29 3b 0a  childPtrSize );.
d610: 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
d620: 54 5f 44 42 20 7c 7c 20 69 45 6e 64 20 3c 3d 20  T_DB || iEnd <= 
d630: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
d640: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65  leSize );.  asse
d650: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
d660: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
d670: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
d680: 73 73 65 72 74 28 20 69 53 69 7a 65 3e 3d 34 20  ssert( iSize>=4 
d690: 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20  );   /* Minimum 
d6a0: 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a  cell size is 4 *
d6b0: 2f 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61  /.  assert( iSta
d6c0: 72 74 3c 3d 69 4c 61 73 74 20 29 3b 0a 0a 20 20  rt<=iLast );..  
d6d0: 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64 65 6c  /* Overwrite del
d6e0: 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  eted information
d6f0: 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68 65 6e   with zeros when
d700: 20 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65   the secure_dele
d710: 74 65 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69  te.  ** option i
d720: 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69  s enabled */.  i
d730: 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 62  f( pPage->pBt->b
d740: 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45  tsFlags & BTS_SE
d750: 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20  CURE_DELETE ){. 
d760: 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b     memset(&data[
d770: 69 53 74 61 72 74 5d 2c 20 30 2c 20 69 53 69 7a  iStart], 0, iSiz
d780: 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  e);.  }..  /* Th
d790: 65 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62 6c  e list of freebl
d7a0: 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20  ocks must be in 
d7b0: 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  ascending order.
d7c0: 20 20 46 69 6e 64 20 74 68 65 20 0a 20 20 2a 2a    Find the .  **
d7d0: 20 73 70 6f 74 20 6f 6e 20 74 68 65 20 6c 69 73   spot on the lis
d7e0: 74 20 77 68 65 72 65 20 69 53 74 61 72 74 20 73  t where iStart s
d7f0: 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74 65  hould be inserte
d800: 64 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20  d..  */.  hdr = 
d810: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
d820: 3b 0a 20 20 69 50 74 72 20 3d 20 68 64 72 20 2b  ;.  iPtr = hdr +
d830: 20 31 3b 0a 20 20 69 66 28 20 64 61 74 61 5b 69   1;.  if( data[i
d840: 50 74 72 2b 31 5d 3d 3d 30 20 26 26 20 64 61 74  Ptr+1]==0 && dat
d850: 61 5b 69 50 74 72 5d 3d 3d 30 20 29 7b 0a 20 20  a[iPtr]==0 ){.  
d860: 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 30 3b 20    iFreeBlk = 0; 
d870: 20 2f 2a 20 53 68 6f 72 74 63 75 74 20 66 6f 72   /* Shortcut for
d880: 20 74 68 65 20 63 61 73 65 20 77 68 65 6e 20 74   the case when t
d890: 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 65  he freelist is e
d8a0: 6d 70 74 79 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  mpty */.  }else{
d8b0: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 69 46 72  .    while( (iFr
d8c0: 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74 65  eeBlk = get2byte
d8d0: 28 26 64 61 74 61 5b 69 50 74 72 5d 29 29 3c 69  (&data[iPtr]))<i
d8e0: 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 69  Start ){.      i
d8f0: 66 28 20 69 46 72 65 65 42 6c 6b 3c 69 50 74 72  f( iFreeBlk<iPtr
d900: 2b 34 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  +4 ){.        if
d910: 28 20 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29 20  ( iFreeBlk==0 ) 
d920: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 72  break;.        r
d930: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
d940: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
d950: 20 7d 0a 20 20 20 20 20 20 69 50 74 72 20 3d 20   }.      iPtr = 
d960: 69 46 72 65 65 42 6c 6b 3b 0a 20 20 20 20 7d 0a  iFreeBlk;.    }.
d970: 20 20 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b      if( iFreeBlk
d980: 3e 69 4c 61 73 74 20 29 20 72 65 74 75 72 6e 20  >iLast ) return 
d990: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
d9a0: 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28  KPT;.    assert(
d9b0: 20 69 46 72 65 65 42 6c 6b 3e 69 50 74 72 20 7c   iFreeBlk>iPtr |
d9c0: 7c 20 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29 3b  | iFreeBlk==0 );
d9d0: 0a 20 20 0a 20 20 20 20 2f 2a 20 41 74 20 74 68  .  .    /* At th
d9e0: 69 73 20 70 6f 69 6e 74 3a 0a 20 20 20 20 2a 2a  is point:.    **
d9f0: 20 20 20 20 69 46 72 65 65 42 6c 6b 3a 20 20 20      iFreeBlk:   
da00: 46 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20  First freeblock 
da10: 61 66 74 65 72 20 69 53 74 61 72 74 2c 20 6f 72  after iStart, or
da20: 20 7a 65 72 6f 20 69 66 20 6e 6f 6e 65 0a 20 20   zero if none.  
da30: 20 20 2a 2a 20 20 20 20 69 50 74 72 3a 20 20 20    **    iPtr:   
da40: 20 20 20 20 54 68 65 20 61 64 64 72 65 73 73 20      The address 
da50: 6f 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  of a pointer to 
da60: 69 46 72 65 65 42 6c 6b 0a 20 20 20 20 2a 2a 0a  iFreeBlk.    **.
da70: 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20      ** Check to 
da80: 73 65 65 20 69 66 20 69 46 72 65 65 42 6c 6b 20  see if iFreeBlk 
da90: 73 68 6f 75 6c 64 20 62 65 20 63 6f 61 6c 65 73  should be coales
daa0: 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  ced onto the end
dab0: 20 6f 66 20 69 53 74 61 72 74 2e 0a 20 20 20 20   of iStart..    
dac0: 2a 2f 0a 20 20 20 20 69 66 28 20 69 46 72 65 65  */.    if( iFree
dad0: 42 6c 6b 20 26 26 20 69 45 6e 64 2b 33 3e 3d 69  Blk && iEnd+3>=i
dae0: 46 72 65 65 42 6c 6b 20 29 7b 0a 20 20 20 20 20  FreeBlk ){.     
daf0: 20 6e 46 72 61 67 20 3d 20 69 46 72 65 65 42 6c   nFrag = iFreeBl
db00: 6b 20 2d 20 69 45 6e 64 3b 0a 20 20 20 20 20 20  k - iEnd;.      
db10: 69 66 28 20 69 45 6e 64 3e 69 46 72 65 65 42 6c  if( iEnd>iFreeBl
db20: 6b 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  k ) return SQLIT
db30: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
db40: 20 20 20 20 20 20 69 45 6e 64 20 3d 20 69 46 72        iEnd = iFr
db50: 65 65 42 6c 6b 20 2b 20 67 65 74 32 62 79 74 65  eeBlk + get2byte
db60: 28 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 2b  (&data[iFreeBlk+
db70: 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  2]);.      if( i
db80: 45 6e 64 20 3e 20 70 50 61 67 65 2d 3e 70 42 74  End > pPage->pBt
db90: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 20 72  ->usableSize ) r
dba0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
dbb0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
dbc0: 20 69 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20   iSize = iEnd - 
dbd0: 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 69 46  iStart;.      iF
dbe0: 72 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74  reeBlk = get2byt
dbf0: 65 28 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b  e(&data[iFreeBlk
dc00: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  ]);.    }.  .   
dc10: 20 2f 2a 20 49 66 20 69 50 74 72 20 69 73 20 61   /* If iPtr is a
dc20: 6e 6f 74 68 65 72 20 66 72 65 65 62 6c 6f 63 6b  nother freeblock
dc30: 20 28 74 68 61 74 20 69 73 2c 20 69 66 20 69 50   (that is, if iP
dc40: 74 72 20 69 73 20 6e 6f 74 20 74 68 65 20 66 72  tr is not the fr
dc50: 65 65 6c 69 73 74 0a 20 20 20 20 2a 2a 20 70 6f  eelist.    ** po
dc60: 69 6e 74 65 72 20 69 6e 20 74 68 65 20 70 61 67  inter in the pag
dc70: 65 20 68 65 61 64 65 72 29 20 74 68 65 6e 20 63  e header) then c
dc80: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69  heck to see if i
dc90: 53 74 61 72 74 20 73 68 6f 75 6c 64 20 62 65 0a  Start should be.
dca0: 20 20 20 20 2a 2a 20 63 6f 61 6c 65 73 63 65 64      ** coalesced
dcb0: 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
dcc0: 20 69 50 74 72 2e 0a 20 20 20 20 2a 2f 0a 20 20   iPtr..    */.  
dcd0: 20 20 69 66 28 20 69 50 74 72 3e 68 64 72 2b 31    if( iPtr>hdr+1
dce0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50   ){.      int iP
dcf0: 74 72 45 6e 64 20 3d 20 69 50 74 72 20 2b 20 67  trEnd = iPtr + g
dd00: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 50  et2byte(&data[iP
dd10: 74 72 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66  tr+2]);.      if
dd20: 28 20 69 50 74 72 45 6e 64 2b 33 3e 3d 69 53 74  ( iPtrEnd+3>=iSt
dd30: 61 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  art ){.        i
dd40: 66 28 20 69 50 74 72 45 6e 64 3e 69 53 74 61 72  f( iPtrEnd>iStar
dd50: 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  t ) return SQLIT
dd60: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
dd70: 20 20 20 20 20 20 20 20 6e 46 72 61 67 20 2b 3d          nFrag +=
dd80: 20 69 53 74 61 72 74 20 2d 20 69 50 74 72 45 6e   iStart - iPtrEn
dd90: 64 3b 0a 20 20 20 20 20 20 20 20 69 53 69 7a 65  d;.        iSize
dda0: 20 3d 20 69 45 6e 64 20 2d 20 69 50 74 72 3b 0a   = iEnd - iPtr;.
ddb0: 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d          iStart =
ddc0: 20 69 50 74 72 3b 0a 20 20 20 20 20 20 7d 0a 20   iPtr;.      }. 
ddd0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 46 72     }.    if( nFr
dde0: 61 67 3e 64 61 74 61 5b 68 64 72 2b 37 5d 20 29  ag>data[hdr+7] )
ddf0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
de00: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
de10: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20   data[hdr+7] -= 
de20: 6e 46 72 61 67 3b 0a 20 20 7d 0a 20 20 69 66 28  nFrag;.  }.  if(
de30: 20 69 53 74 61 72 74 3d 3d 67 65 74 32 62 79 74   iStart==get2byt
de40: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20  e(&data[hdr+5]) 
de50: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65  ){.    /* The ne
de60: 77 20 66 72 65 65 62 6c 6f 63 6b 20 69 73 20 61  w freeblock is a
de70: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
de80: 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  of the cell cont
de90: 65 6e 74 20 61 72 65 61 2c 0a 20 20 20 20 2a 2a  ent area,.    **
dea0: 20 73 6f 20 6a 75 73 74 20 65 78 74 65 6e 64 20   so just extend 
deb0: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
dec0: 20 61 72 65 61 20 72 61 74 68 65 72 20 74 68 61   area rather tha
ded0: 6e 20 63 72 65 61 74 65 20 61 6e 6f 74 68 65 72  n create another
dee0: 0a 20 20 20 20 2a 2a 20 66 72 65 65 6c 69 73 74  .    ** freelist
def0: 20 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20 69 66   entry */.    if
df00: 28 20 69 50 74 72 21 3d 68 64 72 2b 31 20 29 20  ( iPtr!=hdr+1 ) 
df10: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
df20: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
df30: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
df40: 64 72 2b 31 5d 2c 20 69 46 72 65 65 42 6c 6b 29  dr+1], iFreeBlk)
df50: 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
df60: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 69 45 6e  data[hdr+5], iEn
df70: 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  d);.  }else{.   
df80: 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e   /* Insert the n
df90: 65 77 20 66 72 65 65 62 6c 6f 63 6b 20 69 6e 74  ew freeblock int
dfa0: 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a  o the freelist *
dfb0: 2f 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  /.    put2byte(&
dfc0: 64 61 74 61 5b 69 50 74 72 5d 2c 20 69 53 74 61  data[iPtr], iSta
dfd0: 72 74 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  rt);.    put2byt
dfe0: 65 28 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c  e(&data[iStart],
dff0: 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20   iFreeBlk);.    
e000: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  put2byte(&data[i
e010: 53 74 61 72 74 2b 32 5d 2c 20 69 53 69 7a 65 29  Start+2], iSize)
e020: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e  ;.  }.  pPage->n
e030: 46 72 65 65 20 2b 3d 20 69 4f 72 69 67 53 69 7a  Free += iOrigSiz
e040: 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
e050: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
e060: 44 65 63 6f 64 65 20 74 68 65 20 66 6c 61 67 73  Decode the flags
e070: 20 62 79 74 65 20 28 74 68 65 20 66 69 72 73 74   byte (the first
e080: 20 62 79 74 65 20 6f 66 20 74 68 65 20 68 65 61   byte of the hea
e090: 64 65 72 29 20 66 6f 72 20 61 20 70 61 67 65 0a  der) for a page.
e0a0: 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  ** and initializ
e0b0: 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  e fields of the 
e0c0: 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74 75 72  MemPage structur
e0d0: 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a  e accordingly..*
e0e0: 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f  *.** Only the fo
e0f0: 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74  llowing combinat
e100: 69 6f 6e 73 20 61 72 65 20 73 75 70 70 6f 72 74  ions are support
e110: 65 64 2e 20 20 41 6e 79 74 68 69 6e 67 20 64 69  ed.  Anything di
e120: 66 66 65 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63  fferent.** indic
e130: 61 74 65 73 20 61 20 63 6f 72 72 75 70 74 20 64  ates a corrupt d
e140: 61 74 61 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a  atabase files:.*
e150: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  *.**         PTF
e160: 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20  _ZERODATA.**    
e170: 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54       PTF_ZERODAT
e180: 41 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20  A | PTF_LEAF.** 
e190: 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46          PTF_LEAF
e1a0: 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45  DATA | PTF_INTKE
e1b0: 59 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  Y.**         PTF
e1c0: 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f  _LEAFDATA | PTF_
e1d0: 49 4e 54 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41  INTKEY | PTF_LEA
e1e0: 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  F.*/.static int 
e1f0: 64 65 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50  decodeFlags(MemP
e200: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
e210: 66 6c 61 67 42 79 74 65 29 7b 0a 20 20 42 74 53  flagByte){.  BtS
e220: 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20  hared *pBt;     
e230: 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 50 61  /* A copy of pPa
e240: 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73  ge->pBt */..  as
e250: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 68 64 72  sert( pPage->hdr
e260: 4f 66 66 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e  Offset==(pPage->
e270: 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20  pgno==1 ? 100 : 
e280: 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  0) );.  assert( 
e290: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
e2a0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
e2b0: 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65  utex) );.  pPage
e2c0: 2d 3e 6c 65 61 66 20 3d 20 28 75 38 29 28 66 6c  ->leaf = (u8)(fl
e2d0: 61 67 42 79 74 65 3e 3e 33 29 3b 20 20 61 73 73  agByte>>3);  ass
e2e0: 65 72 74 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d  ert( PTF_LEAF ==
e2f0: 20 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42   1<<3 );.  flagB
e300: 79 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46  yte &= ~PTF_LEAF
e310: 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  ;.  pPage->child
e320: 50 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50  PtrSize = 4-4*pP
e330: 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 50 61  age->leaf;.  pPa
e340: 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20 3d 20  ge->xCellSize = 
e350: 63 65 6c 6c 53 69 7a 65 50 74 72 3b 0a 20 20 70  cellSizePtr;.  p
e360: 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
e370: 0a 20 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d  .  if( flagByte=
e380: 3d 28 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c  =(PTF_LEAFDATA |
e390: 20 50 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a   PTF_INTKEY) ){.
e3a0: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
e3b0: 4f 46 3a 20 52 2d 30 37 32 39 31 2d 33 35 33 32  OF: R-07291-3532
e3c0: 38 20 41 20 76 61 6c 75 65 20 6f 66 20 35 20 28  8 A value of 5 (
e3d0: 30 78 30 35 29 20 6d 65 61 6e 73 20 74 68 65 20  0x05) means the 
e3e0: 70 61 67 65 20 69 73 20 61 6e 0a 20 20 20 20 2a  page is an.    *
e3f0: 2a 20 69 6e 74 65 72 69 6f 72 20 74 61 62 6c 65  * interior table
e400: 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f   b-tree page. */
e410: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 54  .    assert( (PT
e420: 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 49  F_LEAFDATA|PTF_I
e430: 4e 54 4b 45 59 29 3d 3d 35 20 29 3b 0a 20 20 20  NTKEY)==5 );.   
e440: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
e450: 20 52 2d 32 36 39 30 30 2d 30 39 31 37 36 20 41   R-26900-09176 A
e460: 20 76 61 6c 75 65 20 6f 66 20 31 33 20 28 30 78   value of 13 (0x
e470: 30 64 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61  0d) means the pa
e480: 67 65 20 69 73 20 61 0a 20 20 20 20 2a 2a 20 6c  ge is a.    ** l
e490: 65 61 66 20 74 61 62 6c 65 20 62 2d 74 72 65 65  eaf table b-tree
e4a0: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73   page. */.    as
e4b0: 73 65 72 74 28 20 28 50 54 46 5f 4c 45 41 46 44  sert( (PTF_LEAFD
e4c0: 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59 7c 50  ATA|PTF_INTKEY|P
e4d0: 54 46 5f 4c 45 41 46 29 3d 3d 31 33 20 29 3b 0a  TF_LEAF)==13 );.
e4e0: 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
e4f0: 79 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70  y = 1;.    if( p
e500: 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
e510: 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
e520: 79 4c 65 61 66 20 3d 20 31 3b 0a 20 20 20 20 20  yLeaf = 1;.     
e530: 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
e540: 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65 43  ll = btreeParseC
e550: 65 6c 6c 50 74 72 3b 0a 20 20 20 20 7d 65 6c 73  ellPtr;.    }els
e560: 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  e{.      pPage->
e570: 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a  intKeyLeaf = 0;.
e580: 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 43 65        pPage->xCe
e590: 6c 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a  llSize = cellSiz
e5a0: 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20  ePtrNoPayload;. 
e5b0: 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72       pPage->xPar
e5c0: 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61  seCell = btreePa
e5d0: 72 73 65 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c  rseCellPtrNoPayl
e5e0: 6f 61 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  oad;.    }.    p
e5f0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d  Page->maxLocal =
e600: 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20   pBt->maxLeaf;. 
e610: 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63     pPage->minLoc
e620: 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61  al = pBt->minLea
e630: 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66  f;.  }else if( f
e640: 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52  lagByte==PTF_ZER
e650: 4f 44 41 54 41 20 29 7b 0a 20 20 20 20 2f 2a 20  ODATA ){.    /* 
e660: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
e670: 33 33 31 36 2d 33 37 33 30 38 20 41 20 76 61 6c  3316-37308 A val
e680: 75 65 20 6f 66 20 32 20 28 30 78 30 32 29 20 6d  ue of 2 (0x02) m
e690: 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73  eans the page is
e6a0: 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72   an.    ** inter
e6b0: 69 6f 72 20 69 6e 64 65 78 20 62 2d 74 72 65 65  ior index b-tree
e6c0: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73   page. */.    as
e6d0: 73 65 72 74 28 20 28 50 54 46 5f 5a 45 52 4f 44  sert( (PTF_ZEROD
e6e0: 41 54 41 29 3d 3d 32 20 29 3b 0a 20 20 20 20 2f  ATA)==2 );.    /
e6f0: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
e700: 2d 35 39 36 31 35 2d 34 32 38 32 38 20 41 20 76  -59615-42828 A v
e710: 61 6c 75 65 20 6f 66 20 31 30 20 28 30 78 30 61  alue of 10 (0x0a
e720: 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65  ) means the page
e730: 20 69 73 20 61 0a 20 20 20 20 2a 2a 20 6c 65 61   is a.    ** lea
e740: 66 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 70  f index b-tree p
e750: 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  age. */.    asse
e760: 72 74 28 20 28 50 54 46 5f 5a 45 52 4f 44 41 54  rt( (PTF_ZERODAT
e770: 41 7c 50 54 46 5f 4c 45 41 46 29 3d 3d 31 30 20  A|PTF_LEAF)==10 
e780: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  );.    pPage->in
e790: 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 50  tKey = 0;.    pP
e7a0: 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20  age->intKeyLeaf 
e7b0: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = 0;.    pPage->
e7c0: 78 50 61 72 73 65 43 65 6c 6c 20 3d 20 62 74 72  xParseCell = btr
e7d0: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e  eeParseCellPtrIn
e7e0: 64 65 78 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  dex;.    pPage->
e7f0: 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  maxLocal = pBt->
e800: 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50  maxLocal;.    pP
e810: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  age->minLocal = 
e820: 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  pBt->minLocal;. 
e830: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45   }else{.    /* E
e840: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 37  VIDENCE-OF: R-47
e850: 36 30 38 2d 35 36 34 36 39 20 41 6e 79 20 6f 74  608-56469 Any ot
e860: 68 65 72 20 76 61 6c 75 65 20 66 6f 72 20 74 68  her value for th
e870: 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 74 79  e b-tree page ty
e880: 70 65 20 69 73 0a 20 20 20 20 2a 2a 20 61 6e 20  pe is.    ** an 
e890: 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 20 20 72 65  error. */.    re
e8a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
e8b0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
e8c0: 70 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50  pPage->max1byteP
e8d0: 61 79 6c 6f 61 64 20 3d 20 70 42 74 2d 3e 6d 61  ayload = pBt->ma
e8e0: 78 31 62 79 74 65 50 61 79 6c 6f 61 64 3b 0a 20  x1bytePayload;. 
e8f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
e900: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  K;.}../*.** Init
e910: 69 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69 6c  ialize the auxil
e920: 69 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  iary information
e930: 20 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f 63   for a disk bloc
e940: 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  k..**.** Return 
e950: 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
e960: 63 65 73 73 2e 20 20 49 66 20 77 65 20 73 65 65  cess.  If we see
e970: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 64   that the page d
e980: 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61  oes.** not conta
e990: 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  in a well-formed
e9a0: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c 20   database page, 
e9b0: 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20  then return .** 
e9c0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20  SQLITE_CORRUPT. 
e9d0: 20 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65 74   Note that a ret
e9e0: 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b  urn of SQLITE_OK
e9f0: 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61   does not.** gua
ea00: 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20  rantee that the 
ea10: 70 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72  page is well-for
ea20: 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68  med.  It only sh
ea30: 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20 66  ows that.** we f
ea40: 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74 20  ailed to detect 
ea50: 61 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  any corruption..
ea60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
ea70: 72 65 65 49 6e 69 74 50 61 67 65 28 4d 65 6d 50  reeInitPage(MemP
ea80: 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 0a 20 20  age *pPage){..  
ea90: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
eaa0: 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
eab0: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 64  t( pPage->pBt->d
eac0: 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
ead0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
eae0: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
eaf0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
eb00: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f  ert( pPage->pgno
eb10: 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ==sqlite3PagerPa
eb20: 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e  genumber(pPage->
eb30: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
eb40: 73 65 72 74 28 20 70 50 61 67 65 20 3d 3d 20 73  sert( pPage == s
eb50: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
eb60: 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  tra(pPage->pDbPa
eb70: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
eb80: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d   pPage->aData ==
eb90: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
eba0: 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50  Data(pPage->pDbP
ebb0: 61 67 65 29 20 29 3b 0a 0a 20 20 69 66 28 20 21  age) );..  if( !
ebc0: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b  pPage->isInit ){
ebd0: 0a 20 20 20 20 75 33 32 20 70 63 3b 20 20 20 20  .    u32 pc;    
ebe0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
ebf0: 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63  ss of a freebloc
ec00: 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e  k within pPage->
ec10: 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 20 20 75  aData[] */.    u
ec20: 38 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  8 hdr;          
ec30: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62    /* Offset to b
ec40: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65  eginning of page
ec50: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75   header */.    u
ec60: 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  8 *data;        
ec70: 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50    /* Equal to pP
ec80: 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20  age->aData */.  
ec90: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
eca0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d          /* The m
ecb0: 61 69 6e 20 62 74 72 65 65 20 73 74 72 75 63 74  ain btree struct
ecc0: 75 72 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75  ure */.    int u
ecd0: 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a  sableSize;    /*
ece0: 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c   Amount of usabl
ecf0: 65 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20  e space on each 
ed00: 70 61 67 65 20 2a 2f 0a 20 20 20 20 75 31 36 20  page */.    u16 
ed10: 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f  cellOffset;    /
ed20: 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d 20 73 74  * Offset from st
ed30: 61 72 74 20 6f 66 20 70 61 67 65 20 74 6f 20 66  art of page to f
ed40: 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  irst cell pointe
ed50: 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 46 72  r */.    int nFr
ed60: 65 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ee;         /* N
ed70: 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20  umber of unused 
ed80: 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67  bytes on the pag
ed90: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 6f 70  e */.    int top
eda0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
edb0: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
edc0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
edd0: 65 61 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43  ea */.    int iC
ede0: 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 2f 2a 20  ellFirst;    /* 
edf0: 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20  First allowable 
ee00: 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63  cell or freebloc
ee10: 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20  k offset */.    
ee20: 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20  int iCellLast;  
ee30: 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69     /* Last possi
ee40: 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65  ble cell or free
ee50: 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a  block offset */.
ee60: 0a 20 20 20 20 70 42 74 20 3d 20 70 50 61 67 65  .    pBt = pPage
ee70: 2d 3e 70 42 74 3b 0a 0a 20 20 20 20 68 64 72 20  ->pBt;..    hdr 
ee80: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
ee90: 65 74 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70  et;.    data = p
eea0: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20  Page->aData;.   
eeb0: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
eec0: 20 52 2d 32 38 35 39 34 2d 30 32 38 39 30 20 54   R-28594-02890 T
eed0: 68 65 20 6f 6e 65 2d 62 79 74 65 20 66 6c 61 67  he one-byte flag
eee0: 20 61 74 20 6f 66 66 73 65 74 20 30 20 69 6e 64   at offset 0 ind
eef0: 69 63 61 74 69 6e 67 0a 20 20 20 20 2a 2a 20 74  icating.    ** t
ef00: 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 74  he b-tree page t
ef10: 79 70 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ype. */.    if( 
ef20: 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67  decodeFlags(pPag
ef30: 65 2c 20 64 61 74 61 5b 68 64 72 5d 29 20 29 20  e, data[hdr]) ) 
ef40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
ef50: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
ef60: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67  assert( pBt->pag
ef70: 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42  eSize>=512 && pB
ef80: 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35  t->pageSize<=655
ef90: 33 36 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  36 );.    pPage-
efa0: 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36  >maskPage = (u16
efb0: 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  )(pBt->pageSize 
efc0: 2d 20 31 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  - 1);.    pPage-
efd0: 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
efe0: 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d      usableSize =
eff0: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
f000: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 63 65 6c  ;.    pPage->cel
f010: 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66  lOffset = cellOf
f020: 66 73 65 74 20 3d 20 68 64 72 20 2b 20 38 20 2b  fset = hdr + 8 +
f030: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
f040: 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 2d  Size;.    pPage-
f050: 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64 61 74  >aDataEnd = &dat
f060: 61 5b 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20  a[usableSize];. 
f070: 20 20 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49     pPage->aCellI
f080: 64 78 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f  dx = &data[cellO
f090: 66 66 73 65 74 5d 3b 0a 20 20 20 20 70 50 61 67  ffset];.    pPag
f0a0: 65 2d 3e 61 44 61 74 61 4f 66 73 74 20 3d 20 26  e->aDataOfst = &
f0b0: 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c  data[pPage->chil
f0c0: 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 20 20 2f  dPtrSize];.    /
f0d0: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
f0e0: 2d 35 38 30 31 35 2d 34 38 31 37 35 20 54 68 65  -58015-48175 The
f0f0: 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65   two-byte intege
f100: 72 20 61 74 20 6f 66 66 73 65 74 20 35 20 64 65  r at offset 5 de
f110: 73 69 67 6e 61 74 65 73 0a 20 20 20 20 2a 2a 20  signates.    ** 
f120: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
f130: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
f140: 65 61 2e 20 41 20 7a 65 72 6f 20 76 61 6c 75 65  ea. A zero value
f150: 20 66 6f 72 20 74 68 69 73 20 69 6e 74 65 67 65   for this intege
f160: 72 20 69 73 0a 20 20 20 20 2a 2a 20 69 6e 74 65  r is.    ** inte
f170: 72 70 72 65 74 65 64 20 61 73 20 36 35 35 33 36  rpreted as 65536
f180: 2e 20 2a 2f 0a 20 20 20 20 74 6f 70 20 3d 20 67  . */.    top = g
f190: 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26  et2byteNotZero(&
f1a0: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
f1b0: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
f1c0: 3a 20 52 2d 33 37 30 30 32 2d 33 32 37 37 34 20  : R-37002-32774 
f1d0: 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74  The two-byte int
f1e0: 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 33  eger at offset 3
f1f0: 20 67 69 76 65 73 20 74 68 65 0a 20 20 20 20 2a   gives the.    *
f200: 2a 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * number of cell
f210: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 2a  s on the page. *
f220: 2f 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65  /.    pPage->nCe
f230: 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ll = get2byte(&d
f240: 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20  ata[hdr+3]);.   
f250: 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c   if( pPage->nCel
f260: 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29  l>MX_CELL(pBt) )
f270: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 6f 20 6d 61  {.      /* To ma
f280: 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73  ny cells for a s
f290: 69 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65  ingle page.  The
f2a0: 20 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f   page must be co
f2b0: 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 20 20 72  rrupt */.      r
f2c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
f2d0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
f2e0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
f2f0: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f  Page->nCell==MX_
f300: 43 45 4c 4c 28 70 42 74 29 20 29 3b 0a 20 20 20  CELL(pBt) );.   
f310: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
f320: 20 52 2d 32 34 30 38 39 2d 35 37 39 37 39 20 49   R-24089-57979 I
f330: 66 20 61 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  f a page contain
f340: 73 20 6e 6f 20 63 65 6c 6c 73 20 28 77 68 69 63  s no cells (whic
f350: 68 20 69 73 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a  h is only.    **
f360: 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20   possible for a 
f370: 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 74  root page of a t
f380: 61 62 6c 65 20 74 68 61 74 20 63 6f 6e 74 61 69  able that contai
f390: 6e 73 20 6e 6f 20 72 6f 77 73 29 20 74 68 65 6e  ns no rows) then
f3a0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 66 66 73   the.    ** offs
f3b0: 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63  et to the cell c
f3c0: 6f 6e 74 65 6e 74 20 61 72 65 61 20 77 69 6c 6c  ontent area will
f3d0: 20 65 71 75 61 6c 20 74 68 65 20 70 61 67 65 20   equal the page 
f3e0: 73 69 7a 65 20 6d 69 6e 75 73 20 74 68 65 0a 20  size minus the. 
f3f0: 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 72     ** bytes of r
f400: 65 73 65 72 76 65 64 20 73 70 61 63 65 2e 20 2a  eserved space. *
f410: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
f420: 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20  age->nCell>0 || 
f430: 74 6f 70 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20  top==usableSize 
f440: 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
f450: 0a 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c 66 6f  ..    /* A malfo
f460: 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61  rmed database pa
f470: 67 65 20 6d 69 67 68 74 20 63 61 75 73 65 20 75  ge might cause u
f480: 73 20 74 6f 20 72 65 61 64 20 70 61 73 74 20 74  s to read past t
f490: 68 65 20 65 6e 64 0a 20 20 20 20 2a 2a 20 6f 66  he end.    ** of
f4a0: 20 70 61 67 65 20 77 68 65 6e 20 70 61 72 73 69   page when parsi
f4b0: 6e 67 20 61 20 63 65 6c 6c 2e 20 20 0a 20 20 20  ng a cell.  .   
f4c0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66   **.    ** The f
f4d0: 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f  ollowing block o
f4e0: 66 20 63 6f 64 65 20 63 68 65 63 6b 73 20 65 61  f code checks ea
f4f0: 72 6c 79 20 74 6f 20 73 65 65 20 69 66 20 61 20  rly to see if a 
f500: 63 65 6c 6c 20 65 78 74 65 6e 64 73 0a 20 20 20  cell extends.   
f510: 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64   ** past the end
f520: 20 6f 66 20 61 20 70 61 67 65 20 62 6f 75 6e 64   of a page bound
f530: 61 72 79 20 61 6e 64 20 63 61 75 73 65 73 20 53  ary and causes S
f540: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 74 6f  QLITE_CORRUPT to
f550: 20 62 65 20 0a 20 20 20 20 2a 2a 20 72 65 74 75   be .    ** retu
f560: 72 6e 65 64 20 69 66 20 69 74 20 64 6f 65 73 2e  rned if it does.
f570: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 43 65 6c  .    */.    iCel
f580: 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66  lFirst = cellOff
f590: 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e  set + 2*pPage->n
f5a0: 43 65 6c 6c 3b 0a 20 20 20 20 69 43 65 6c 6c 4c  Cell;.    iCellL
f5b0: 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ast = usableSize
f5c0: 20 2d 20 34 3b 0a 20 20 20 20 69 66 28 20 70 42   - 4;.    if( pB
f5d0: 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  t->db->flags & S
f5e0: 51 4c 49 54 45 5f 43 65 6c 6c 53 69 7a 65 43 6b  QLITE_CellSizeCk
f5f0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
f600: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
f610: 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 63 65  ndex into the ce
f620: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll pointer array
f630: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a   */.      int sz
f640: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
f650: 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f  ize of a cell */
f660: 0a 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  ..      if( !pPa
f670: 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c  ge->leaf ) iCell
f680: 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20 66 6f  Last--;.      fo
f690: 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e  r(i=0; i<pPage->
f6a0: 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
f6b0: 20 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79       pc = get2by
f6c0: 74 65 41 6c 69 67 6e 65 64 28 26 64 61 74 61 5b  teAligned(&data[
f6d0: 63 65 6c 6c 4f 66 66 73 65 74 2b 69 2a 32 5d 29  cellOffset+i*2])
f6e0: 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
f6f0: 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72  se( pc==iCellFir
f700: 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  st );.        te
f710: 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c  stcase( pc==iCel
f720: 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 20 20 20  lLast );.       
f730: 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72   if( pc<iCellFir
f740: 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61  st || pc>iCellLa
f750: 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
f760: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
f770: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
f780: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 7a      }.        sz
f790: 20 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53   = pPage->xCellS
f7a0: 69 7a 65 28 70 50 61 67 65 2c 20 26 64 61 74 61  ize(pPage, &data
f7b0: 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 20 20 74  [pc]);.        t
f7c0: 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d  estcase( pc+sz==
f7d0: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
f7e0: 20 20 20 20 20 20 69 66 28 20 70 63 2b 73 7a 3e        if( pc+sz>
f7f0: 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
f800: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
f810: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
f820: 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  PT;.        }.  
f830: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
f840: 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69  !pPage->leaf ) i
f850: 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a 20 20 20 20  CellLast++;.    
f860: 7d 20 20 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70  }  ..    /* Comp
f870: 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 66 72  ute the total fr
f880: 65 65 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20  ee space on the 
f890: 70 61 67 65 0a 20 20 20 20 2a 2a 20 45 56 49 44  page.    ** EVID
f8a0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 33 35 38 38  ENCE-OF: R-23588
f8b0: 2d 33 34 34 35 30 20 54 68 65 20 74 77 6f 2d 62  -34450 The two-b
f8c0: 79 74 65 20 69 6e 74 65 67 65 72 20 61 74 20 6f  yte integer at o
f8d0: 66 66 73 65 74 20 31 20 67 69 76 65 73 20 74 68  ffset 1 gives th
f8e0: 65 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 20 6f  e.    ** start o
f8f0: 66 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65  f the first free
f900: 62 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61 67  block on the pag
f910: 65 2c 20 6f 72 20 69 73 20 7a 65 72 6f 20 69 66  e, or is zero if
f920: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20   there are no.  
f930: 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 73 2e    ** freeblocks.
f940: 20 2a 2f 0a 20 20 20 20 70 63 20 3d 20 67 65 74   */.    pc = get
f950: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
f960: 31 5d 29 3b 0a 20 20 20 20 6e 46 72 65 65 20 3d  1]);.    nFree =
f970: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74   data[hdr+7] + t
f980: 6f 70 3b 20 20 2f 2a 20 49 6e 69 74 20 6e 46 72  op;  /* Init nFr
f990: 65 65 20 74 6f 20 6e 6f 6e 2d 66 72 65 65 62 6c  ee to non-freebl
f9a0: 6f 63 6b 20 66 72 65 65 20 73 70 61 63 65 20 2a  ock free space *
f9b0: 2f 0a 20 20 20 20 69 66 28 20 70 63 3e 30 20 29  /.    if( pc>0 )
f9c0: 7b 0a 20 20 20 20 20 20 75 33 32 20 6e 65 78 74  {.      u32 next
f9d0: 2c 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66  , size;.      if
f9e0: 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20  ( pc<iCellFirst 
f9f0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56  ){.        /* EV
fa00: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35  IDENCE-OF: R-555
fa10: 33 30 2d 35 32 39 33 30 20 49 6e 20 61 20 77 65  30-52930 In a we
fa20: 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65 65  ll-formed b-tree
fa30: 20 70 61 67 65 2c 20 74 68 65 72 65 20 77 69 6c   page, there wil
fa40: 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77  l.        ** alw
fa50: 61 79 73 20 62 65 20 61 74 20 6c 65 61 73 74 20  ays be at least 
fa60: 6f 6e 65 20 63 65 6c 6c 20 62 65 66 6f 72 65 20  one cell before 
fa70: 74 68 65 20 66 69 72 73 74 20 66 72 65 65 62 6c  the first freebl
fa80: 6f 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ock..        */.
fa90: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
faa0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
fab0: 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20  PT; .      }.   
fac0: 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20     while( 1 ){. 
fad0: 20 20 20 20 20 20 20 69 66 28 20 70 63 3e 69 43         if( pc>iC
fae0: 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20  ellLast ){.     
faf0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
fb00: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
fb10: 20 2f 2a 20 46 72 65 65 62 6c 6f 63 6b 20 6f 66   /* Freeblock of
fb20: 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  f the end of the
fb30: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
fb40: 20 7d 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20   }.        next 
fb50: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
fb60: 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 20 20 73  [pc]);.        s
fb70: 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26  ize = get2byte(&
fb80: 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20  data[pc+2]);.   
fb90: 20 20 20 20 20 6e 46 72 65 65 20 3d 20 6e 46 72       nFree = nFr
fba0: 65 65 20 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20  ee + size;.     
fbb0: 20 20 20 69 66 28 20 6e 65 78 74 3c 3d 70 63 2b     if( next<=pc+
fbc0: 73 69 7a 65 2b 33 20 29 20 62 72 65 61 6b 3b 0a  size+3 ) break;.
fbd0: 20 20 20 20 20 20 20 20 70 63 20 3d 20 6e 65 78          pc = nex
fbe0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
fbf0: 20 69 66 28 20 6e 65 78 74 3e 30 20 29 7b 0a 20   if( next>0 ){. 
fc00: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
fc10: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
fc20: 54 3b 20 20 2f 2a 20 46 72 65 65 62 6c 6f 63 6b  T;  /* Freeblock
fc30: 20 6e 6f 74 20 69 6e 20 61 73 63 65 6e 64 69 6e   not in ascendin
fc40: 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20  g order */.     
fc50: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 63 2b   }.      if( pc+
fc60: 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20  size>usableSize 
fc70: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
fc80: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
fc90: 5f 42 4b 50 54 3b 20 20 2f 2a 20 4c 61 73 74 20  _BKPT;  /* Last 
fca0: 66 72 65 65 62 6c 6f 63 6b 20 65 78 74 65 6e 64  freeblock extend
fcb0: 73 20 70 61 73 74 20 70 61 67 65 20 65 6e 64 20  s past page end 
fcc0: 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  */.      }.    }
fcd0: 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73  ..    /* At this
fce0: 20 70 6f 69 6e 74 2c 20 6e 46 72 65 65 20 63 6f   point, nFree co
fcf0: 6e 74 61 69 6e 73 20 74 68 65 20 73 75 6d 20 6f  ntains the sum o
fd00: 66 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20  f the offset to 
fd10: 74 68 65 20 73 74 61 72 74 0a 20 20 20 20 2a 2a  the start.    **
fd20: 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e   of the cell-con
fd30: 74 65 6e 74 20 61 72 65 61 20 70 6c 75 73 20 74  tent area plus t
fd40: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65  he number of fre
fd50: 65 20 62 79 74 65 73 20 77 69 74 68 69 6e 0a 20  e bytes within. 
fd60: 20 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63     ** the cell-c
fd70: 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 49 66 20  ontent area. If 
fd80: 74 68 69 73 20 69 73 20 67 72 65 61 74 65 72 20  this is greater 
fd90: 74 68 61 6e 20 74 68 65 20 75 73 61 62 6c 65 2d  than the usable-
fda0: 73 69 7a 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74  size.    ** of t
fdb0: 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  he page, then th
fdc0: 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20 63  e page must be c
fdd0: 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 63  orrupted. This c
fde0: 68 65 63 6b 20 61 6c 73 6f 0a 20 20 20 20 2a 2a  heck also.    **
fdf0: 20 73 65 72 76 65 73 20 74 6f 20 76 65 72 69 66   serves to verif
fe00: 79 20 74 68 61 74 20 74 68 65 20 6f 66 66 73 65  y that the offse
fe10: 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  t to the start o
fe20: 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65  f the cell-conte
fe30: 6e 74 0a 20 20 20 20 2a 2a 20 61 72 65 61 2c 20  nt.    ** area, 
fe40: 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
fe50: 20 70 61 67 65 20 68 65 61 64 65 72 2c 20 6c 69   page header, li
fe60: 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61  es within the pa
fe70: 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ge..    */.    i
fe80: 66 28 20 6e 46 72 65 65 3e 75 73 61 62 6c 65 53  f( nFree>usableS
fe90: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ize ){.      ret
fea0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
feb0: 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a  PT_BKPT; .    }.
fec0: 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65      pPage->nFree
fed0: 20 3d 20 28 75 31 36 29 28 6e 46 72 65 65 20 2d   = (u16)(nFree -
fee0: 20 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20   iCellFirst);.  
fef0: 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
ff00: 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 1;.  }.  retur
ff10: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
ff20: 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61 20 72  /*.** Set up a r
ff30: 61 77 20 70 61 67 65 20 73 6f 20 74 68 61 74 20  aw page so that 
ff40: 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20  it looks like a 
ff50: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 68 6f  database page ho
ff60: 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72  lding.** no entr
ff70: 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ies..*/.static v
ff80: 6f 69 64 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d  oid zeroPage(Mem
ff90: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
ffa0: 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69 67   flags){.  unsig
ffb0: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d  ned char *data =
ffc0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
ffd0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
ffe0: 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75   pPage->pBt;.  u
fff0: 38 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68  8 hdr = pPage->h
10000 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 31 36 20  drOffset;.  u16 
10010 66 69 72 73 74 3b 0a 0a 20 20 61 73 73 65 72 74  first;..  assert
10020 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
10030 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e  genumber(pPage->
10040 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d  pDbPage)==pPage-
10050 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72  >pgno );.  asser
10060 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
10070 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
10080 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64  DbPage) == (void
10090 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73  *)pPage );.  ass
100a0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
100b0 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
100c0 70 44 62 50 61 67 65 29 20 3d 3d 20 64 61 74 61  pDbPage) == data
100d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
100e0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
100f0 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
10100 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
10110 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
10120 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
10130 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  ) );.  if( pBt->
10140 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53  btsFlags & BTS_S
10150 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a  ECURE_DELETE ){.
10160 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61      memset(&data
10170 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75  [hdr], 0, pBt->u
10180 73 61 62 6c 65 53 69 7a 65 20 2d 20 68 64 72 29  sableSize - hdr)
10190 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b 68 64 72  ;.  }.  data[hdr
101a0 5d 20 3d 20 28 63 68 61 72 29 66 6c 61 67 73 3b  ] = (char)flags;
101b0 0a 20 20 66 69 72 73 74 20 3d 20 68 64 72 20 2b  .  first = hdr +
101c0 20 28 28 66 6c 61 67 73 26 50 54 46 5f 4c 45 41   ((flags&PTF_LEA
101d0 46 29 3d 3d 30 20 3f 20 31 32 20 3a 20 38 29 3b  F)==0 ? 12 : 8);
101e0 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
101f0 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20  hdr+1], 0, 4);. 
10200 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30   data[hdr+7] = 0
10210 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
10220 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e  ta[hdr+5], pBt->
10230 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70  usableSize);.  p
10240 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75  Page->nFree = (u
10250 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  16)(pBt->usableS
10260 69 7a 65 20 2d 20 66 69 72 73 74 29 3b 0a 20 20  ize - first);.  
10270 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67  decodeFlags(pPag
10280 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 50 61  e, flags);.  pPa
10290 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ge->cellOffset =
102a0 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67 65 2d   first;.  pPage-
102b0 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64 61 74  >aDataEnd = &dat
102c0 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  a[pBt->usableSiz
102d0 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 43 65  e];.  pPage->aCe
102e0 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b 66 69  llIdx = &data[fi
102f0 72 73 74 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61  rst];.  pPage->a
10300 44 61 74 61 4f 66 73 74 20 3d 20 26 64 61 74 61  DataOfst = &data
10310 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72  [pPage->childPtr
10320 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e  Size];.  pPage->
10330 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  nOverflow = 0;. 
10340 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61   assert( pBt->pa
10350 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
10360 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35  Bt->pageSize<=65
10370 35 33 36 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e  536 );.  pPage->
10380 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29  maskPage = (u16)
10390 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  (pBt->pageSize -
103a0 20 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43   1);.  pPage->nC
103b0 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ell = 0;.  pPage
103c0 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a  ->isInit = 1;.}.
103d0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
103e0 61 20 44 62 50 61 67 65 20 6f 62 74 61 69 6e 65  a DbPage obtaine
103f0 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  d from the pager
10400 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65 20   into a MemPage 
10410 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 62  used by.** the b
10420 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73  tree layer..*/.s
10430 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62  tatic MemPage *b
10440 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61  treePageFromDbPa
10450 67 65 28 44 62 50 61 67 65 20 2a 70 44 62 50 61  ge(DbPage *pDbPa
10460 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 42  ge, Pgno pgno, B
10470 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
10480 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
10490 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69  = (MemPage*)sqli
104a0 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
104b0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  (pDbPage);.  if(
104c0 20 70 67 6e 6f 21 3d 70 50 61 67 65 2d 3e 70 67   pgno!=pPage->pg
104d0 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d  no ){.    pPage-
104e0 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33  >aData = sqlite3
104f0 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
10500 50 61 67 65 29 3b 0a 20 20 20 20 70 50 61 67 65  Page);.    pPage
10510 2d 3e 70 44 62 50 61 67 65 20 3d 20 70 44 62 50  ->pDbPage = pDbP
10520 61 67 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  age;.    pPage->
10530 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 70  pBt = pBt;.    p
10540 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e  Page->pgno = pgn
10550 6f 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 64  o;.    pPage->hd
10560 72 4f 66 66 73 65 74 20 3d 20 70 67 6e 6f 3d 3d  rOffset = pgno==
10570 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20 7d  1 ? 100 : 0;.  }
10580 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
10590 2d 3e 61 44 61 74 61 3d 3d 73 71 6c 69 74 65 33  ->aData==sqlite3
105a0 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
105b0 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75 72  Page) );.  retur
105c0 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a  n pPage; .}../*.
105d0 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72  ** Get a page fr
105e0 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 20 20 49  om the pager.  I
105f0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65  nitialize the Me
10600 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a  mPage.pBt and.**
10610 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65   MemPage.aData e
10620 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65  lements if neede
10630 64 2e 20 20 53 65 65 20 61 6c 73 6f 3a 20 62 74  d.  See also: bt
10640 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65  reeGetUnusedPage
10650 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ()..**.** If the
10660 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e   PAGER_GET_NOCON
10670 54 45 4e 54 20 66 6c 61 67 20 69 73 20 73 65 74  TENT flag is set
10680 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
10690 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 2a  we do not care.*
106a0 2a 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74  * about the cont
106b0 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20  ent of the page 
106c0 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 20 53  at this time.  S
106d0 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74  o do not go to t
106e0 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65  he disk.** to fe
106f0 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e  tch the content.
10700 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74    Just fill in t
10710 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20  he content with 
10720 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a  zeros for now..*
10730 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75 74 75  * If in the futu
10740 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c 69 74  re we call sqlit
10750 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 6f  e3PagerWrite() o
10760 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74 68 61  n this page, tha
10770 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68 61  t.** means we ha
10780 76 65 20 73 74 61 72 74 65 64 20 74 6f 20 62 65  ve started to be
10790 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74   concerned about
107a0 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65   content and the
107b0 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68   disk.** read sh
107c0 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68  ould occur at th
107d0 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61  at point..*/.sta
107e0 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65 74  tic int btreeGet
107f0 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
10800 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20   *pBt,       /* 
10810 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50  The btree */.  P
10820 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
10830 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
10840 20 74 68 65 20 70 61 67 65 20 74 6f 20 66 65 74   the page to fet
10850 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ch */.  MemPage 
10860 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20  **ppPage,    /* 
10870 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20  Return the page 
10880 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74 65  in this paramete
10890 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  r */.  int flags
108a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
108b0 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
108c0 4e 54 20 6f 72 20 50 41 47 45 52 5f 47 45 54 5f  NT or PAGER_GET_
108d0 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20  READONLY */.){. 
108e0 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67   int rc;.  DbPag
108f0 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61  e *pDbPage;..  a
10900 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20  ssert( flags==0 
10910 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f  || flags==PAGER_
10920 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 7c 7c  GET_NOCONTENT ||
10930 20 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47 45   flags==PAGER_GE
10940 54 5f 52 45 41 44 4f 4e 4c 59 20 29 3b 0a 20 20  T_READONLY );.  
10950 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
10960 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
10970 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
10980 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
10990 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67  (pBt->pPager, pg
109a0 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70  no, (DbPage**)&p
109b0 44 62 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a  DbPage, flags);.
109c0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
109d0 6e 20 72 63 3b 0a 20 20 2a 70 70 50 61 67 65 20  n rc;.  *ppPage 
109e0 3d 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44  = btreePageFromD
109f0 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70  bPage(pDbPage, p
10a00 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65 74  gno, pBt);.  ret
10a10 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
10a20 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65  ../*.** Retrieve
10a30 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
10a40 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 66   pager cache. If
10a50 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
10a60 61 67 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c  age is not.** al
10a70 72 65 61 64 79 20 69 6e 20 74 68 65 20 70 61 67  ready in the pag
10a80 65 72 20 63 61 63 68 65 20 72 65 74 75 72 6e 20  er cache return 
10a90 4e 55 4c 4c 2e 20 49 6e 69 74 69 61 6c 69 7a 65  NULL. Initialize
10aa0 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74   the MemPage.pBt
10ab0 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e   and.** MemPage.
10ac0 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69  aData elements i
10ad0 66 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61  f needed..*/.sta
10ae0 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72  tic MemPage *btr
10af0 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 42 74 53  eePageLookup(BtS
10b00 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
10b10 20 70 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65   pgno){.  DbPage
10b20 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73 73   *pDbPage;.  ass
10b30 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
10b40 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
10b50 65 78 29 20 29 3b 0a 20 20 70 44 62 50 61 67 65  ex) );.  pDbPage
10b60 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c   = sqlite3PagerL
10b70 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61 67 65  ookup(pBt->pPage
10b80 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  r, pgno);.  if( 
10b90 70 44 62 50 61 67 65 20 29 7b 0a 20 20 20 20 72  pDbPage ){.    r
10ba0 65 74 75 72 6e 20 62 74 72 65 65 50 61 67 65 46  eturn btreePageF
10bb0 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67  romDbPage(pDbPag
10bc0 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20  e, pgno, pBt);. 
10bd0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
10be0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
10bf0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
10c00 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
10c10 70 61 67 65 73 2e 20 49 66 20 74 68 65 72 65 20  pages. If there 
10c20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a  is any kind of.*
10c30 2a 20 65 72 72 6f 72 2c 20 72 65 74 75 72 6e 20  * error, return 
10c40 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 2d  ((unsigned int)-
10c50 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  1)..*/.static Pg
10c60 6e 6f 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e  no btreePagecoun
10c70 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  t(BtShared *pBt)
10c80 7b 0a 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e  {.  return pBt->
10c90 6e 50 61 67 65 3b 0a 7d 0a 75 33 32 20 73 71 6c  nPage;.}.u32 sql
10ca0 69 74 65 33 42 74 72 65 65 4c 61 73 74 50 61 67  ite3BtreeLastPag
10cb0 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61  e(Btree *p){.  a
10cc0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
10cd0 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
10ce0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28   );.  assert( ((
10cf0 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 29 26 30  p->pBt->nPage)&0
10d00 78 38 30 30 30 30 30 30 29 3d 3d 30 20 29 3b 0a  x8000000)==0 );.
10d10 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50 61    return btreePa
10d20 67 65 63 6f 75 6e 74 28 70 2d 3e 70 42 74 29 3b  gecount(p->pBt);
10d30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  .}../*.** Get a 
10d40 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
10d50 67 65 72 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ger and initiali
10d60 7a 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ze it..**.** If 
10d70 70 43 75 72 21 3d 30 20 74 68 65 6e 20 74 68 65  pCur!=0 then the
10d80 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 66   page is being f
10d90 65 74 63 68 65 64 20 61 73 20 70 61 72 74 20 6f  etched as part o
10da0 66 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  f a moveToChild(
10db0 29 0a 2a 2a 20 63 61 6c 6c 2e 20 20 44 6f 20 61  ).** call.  Do a
10dc0 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79  dditional sanity
10dd0 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65   checking on the
10de0 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61   page in this ca
10df0 73 65 2e 0a 2a 2a 20 41 6e 64 20 69 66 20 74 68  se..** And if th
10e00 65 20 66 65 74 63 68 20 66 61 69 6c 73 2c 20 74  e fetch fails, t
10e10 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74  his routine must
10e20 20 64 65 63 72 65 6d 65 6e 74 20 70 43 75 72 2d   decrement pCur-
10e30 3e 69 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  >iPage..**.** Th
10e40 65 20 70 61 67 65 20 69 73 20 66 65 74 63 68 65  e page is fetche
10e50 64 20 61 73 20 72 65 61 64 2d 77 72 69 74 65 20  d as read-write 
10e60 75 6e 6c 65 73 73 20 70 43 75 72 20 69 73 20 6e  unless pCur is n
10e70 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 69 73 0a 2a  ot NULL and is.*
10e80 2a 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75  * a read-only cu
10e90 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rsor..**.** If a
10ea0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
10eb0 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73 20  then *ppPage is 
10ec0 75 6e 64 65 66 69 6e 65 64 2e 20 49 74 0a 2a 2a  undefined. It.**
10ed0 20 6d 61 79 20 72 65 6d 61 69 6e 20 75 6e 63 68   may remain unch
10ee0 61 6e 67 65 64 2c 20 6f 72 20 69 74 20 6d 61 79  anged, or it may
10ef0 20 62 65 20 73 65 74 20 74 6f 20 61 6e 20 69 6e   be set to an in
10f00 76 61 6c 69 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a  valid value..*/.
10f10 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 41 6e  static int getAn
10f20 64 49 6e 69 74 50 61 67 65 28 0a 20 20 42 74 53  dInitPage(.  BtS
10f30 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
10f40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10f50 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
10f60 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
10f70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10f80 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
10f90 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20   of the page to 
10fa0 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  get */.  MemPage
10fb0 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20   **ppPage,      
10fc0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
10fd0 65 20 74 68 65 20 70 61 67 65 20 70 6f 69 6e 74  e the page point
10fe0 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 42 74 43  er here */.  BtC
10ff0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
11000 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11010 43 75 72 73 6f 72 20 74 6f 20 72 65 63 65 69 76  Cursor to receiv
11020 65 20 74 68 65 20 70 61 67 65 2c 20 6f 72 20 4e  e the page, or N
11030 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65  ULL */.  int bRe
11040 61 64 4f 6e 6c 79 20 20 20 20 20 20 20 20 20 20  adOnly          
11050 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
11060 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79   for a read-only
11070 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   page */.){.  in
11080 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a  t rc;.  DbPage *
11090 70 44 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72  pDbPage;.  asser
110a0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
110b0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
110c0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
110d0 43 75 72 3d 3d 30 20 7c 7c 20 70 70 50 61 67 65  Cur==0 || ppPage
110e0 3d 3d 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ==&pCur->apPage[
110f0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a  pCur->iPage] );.
11100 20 20 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d    assert( pCur==
11110 30 20 7c 7c 20 62 52 65 61 64 4f 6e 6c 79 3d 3d  0 || bReadOnly==
11120 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c  pCur->curPagerFl
11130 61 67 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ags );.  assert(
11140 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70 43 75 72   pCur==0 || pCur
11150 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 0a 20 20  ->iPage>0 );..  
11160 69 66 28 20 70 67 6e 6f 3e 62 74 72 65 65 50 61  if( pgno>btreePa
11170 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a  gecount(pBt) ){.
11180 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
11190 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
111a0 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69    goto getAndIni
111b0 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d  tPage_error;.  }
111c0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
111d0 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61  agerGet(pBt->pPa
111e0 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61  ger, pgno, (DbPa
111f0 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 62  ge**)&pDbPage, b
11200 52 65 61 64 4f 6e 6c 79 29 3b 0a 20 20 69 66 28  ReadOnly);.  if(
11210 20 72 63 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20   rc ){.    goto 
11220 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65  getAndInitPage_e
11230 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 2a 70 70 50  rror;.  }.  *ppP
11240 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29  age = (MemPage*)
11250 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
11260 78 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20  xtra(pDbPage);. 
11270 20 69 66 28 20 28 2a 70 70 50 61 67 65 29 2d 3e   if( (*ppPage)->
11280 69 73 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20  isInit==0 ){.   
11290 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62   btreePageFromDb
112a0 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67  Page(pDbPage, pg
112b0 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 20 20 72 63  no, pBt);.    rc
112c0 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67 65   = btreeInitPage
112d0 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 69  (*ppPage);.    i
112e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
112f0 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
11300 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
11310 20 20 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e        goto getAn
11320 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b  dInitPage_error;
11330 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
11340 65 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e  ert( (*ppPage)->
11350 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20  pgno==pgno );.  
11360 61 73 73 65 72 74 28 20 28 2a 70 70 50 61 67 65  assert( (*ppPage
11370 29 2d 3e 61 44 61 74 61 3d 3d 73 71 6c 69 74 65  )->aData==sqlite
11380 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
11390 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20  bPage) );..  /* 
113a0 49 66 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 63  If obtaining a c
113b0 68 69 6c 64 20 70 61 67 65 20 66 6f 72 20 61 20  hild page for a 
113c0 63 75 72 73 6f 72 2c 20 77 65 20 6d 75 73 74 20  cursor, we must 
113d0 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
113e0 70 61 67 65 20 69 73 0a 20 20 2a 2a 20 63 6f 6d  page is.  ** com
113f0 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 65  patible with the
11400 20 72 6f 6f 74 20 70 61 67 65 2e 20 2a 2f 0a 20   root page. */. 
11410 20 69 66 28 20 70 43 75 72 20 26 26 20 28 28 2a   if( pCur && ((*
11420 70 70 50 61 67 65 29 2d 3e 6e 43 65 6c 6c 3c 31  ppPage)->nCell<1
11430 20 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e 69   || (*ppPage)->i
11440 6e 74 4b 65 79 21 3d 70 43 75 72 2d 3e 63 75 72  ntKey!=pCur->cur
11450 49 6e 74 4b 65 79 29 20 29 7b 0a 20 20 20 20 72  IntKey) ){.    r
11460 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
11470 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 6c  PT_BKPT;.    rel
11480 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
11490 29 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41  );.    goto getA
114a0 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72  ndInitPage_error
114b0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
114c0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 67 65 74 41 6e  QLITE_OK;..getAn
114d0 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3a  dInitPage_error:
114e0 0a 20 20 69 66 28 20 70 43 75 72 20 29 20 70 43  .  if( pCur ) pC
114f0 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 74  ur->iPage--;.  t
11500 65 73 74 63 61 73 65 28 20 70 67 6e 6f 3d 3d 30  estcase( pgno==0
11510 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67   );.  assert( pg
11520 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c  no!=0 || rc==SQL
11530 49 54 45 5f 43 4f 52 52 55 50 54 20 29 3b 0a 20  ITE_CORRUPT );. 
11540 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11550 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 4d  *.** Release a M
11560 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20 73 68  emPage.  This sh
11570 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f  ould be called o
11580 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 72 69  nce for each pri
11590 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74  or.** call to bt
115a0 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73  reeGetPage..*/.s
115b0 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
115c0 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65  sePageNotNull(Me
115d0 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
115e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
115f0 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72  aData );.  asser
11600 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b  t( pPage->pBt );
11610 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
11620 2d 3e 70 44 62 50 61 67 65 21 3d 30 20 29 3b 0a  ->pDbPage!=0 );.
11630 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
11640 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
11650 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d  Page->pDbPage) =
11660 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29  = (void*)pPage )
11670 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
11680 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
11690 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d  pPage->pDbPage)=
116a0 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b  =pPage->aData );
116b0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
116c0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
116d0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
116e0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67   );.  sqlite3Pag
116f0 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70  erUnrefNotNull(p
11700 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
11710 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  }.static void re
11720 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67  leasePage(MemPag
11730 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28  e *pPage){.  if(
11740 20 70 50 61 67 65 20 29 20 72 65 6c 65 61 73 65   pPage ) release
11750 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 50 61 67  PageNotNull(pPag
11760 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  e);.}../*.** Get
11770 20 61 6e 20 75 6e 75 73 65 64 20 70 61 67 65 2e   an unused page.
11780 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b  .**.** This work
11790 73 20 6a 75 73 74 20 6c 69 6b 65 20 62 74 72 65  s just like btre
117a0 65 47 65 74 50 61 67 65 28 29 20 77 69 74 68 20  eGetPage() with 
117b0 74 68 65 20 61 64 64 69 74 69 6f 6e 3a 0a 2a 2a  the addition:.**
117c0 0a 2a 2a 20 20 20 2a 20 20 49 66 20 74 68 65 20  .**   *  If the 
117d0 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20  page is already 
117e0 69 6e 20 75 73 65 20 66 6f 72 20 73 6f 6d 65 20  in use for some 
117f0 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2c 20 69  other purpose, i
11800 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 20 20  mmediately.**   
11810 20 20 20 72 65 6c 65 61 73 65 20 69 74 20 61 6e     release it an
11820 64 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49  d return an SQLI
11830 54 45 5f 43 55 52 52 55 50 54 20 65 72 72 6f 72  TE_CURRUPT error
11840 2e 0a 2a 2a 20 20 20 2a 20 20 4d 61 6b 65 20 73  ..**   *  Make s
11850 75 72 65 20 74 68 65 20 69 73 49 6e 69 74 20 66  ure the isInit f
11860 6c 61 67 20 69 73 20 63 6c 65 61 72 0a 2a 2f 0a  lag is clear.*/.
11870 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
11880 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 0a 20  GetUnusedPage(. 
11890 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
118a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
118b0 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ee */.  Pgno pgn
118c0 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o,           /* 
118d0 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61  Number of the pa
118e0 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20  ge to fetch */. 
118f0 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
11900 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  e,    /* Return 
11910 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73  the page in this
11920 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20   parameter */.  
11930 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
11940 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45       /* PAGER_GE
11950 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50  T_NOCONTENT or P
11960 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c  AGER_GET_READONL
11970 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  Y */.){.  int rc
11980 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
11990 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67  pBt, pgno, ppPag
119a0 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28  e, flags);.  if(
119b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
119c0 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
119d0 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
119e0 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  nt((*ppPage)->pD
119f0 62 50 61 67 65 29 3e 31 20 29 7b 0a 20 20 20 20  bPage)>1 ){.    
11a00 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
11a10 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a 70  pPage);.      *p
11a20 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  pPage = 0;.     
11a30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
11a40 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
11a50 20 7d 0a 20 20 20 20 28 2a 70 70 50 61 67 65 29   }.    (*ppPage)
11a60 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
11a70 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 61  }else{.    *ppPa
11a80 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ge = 0;.  }.  re
11a90 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
11aa0 2a 2a 20 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c  ** During a roll
11ab0 62 61 63 6b 2c 20 77 68 65 6e 20 74 68 65 20 70  back, when the p
11ac0 61 67 65 72 20 72 65 6c 6f 61 64 73 20 69 6e 66  ager reloads inf
11ad0 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68  ormation into th
11ae0 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68  e cache.** so th
11af0 61 74 20 74 68 65 20 63 61 63 68 65 20 69 73 20  at the cache is 
11b00 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20  restored to its 
11b10 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 61  original state a
11b20 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a  t the start of.*
11b30 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * the transactio
11b40 6e 2c 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  n, for each page
11b50 20 72 65 73 74 6f 72 65 64 20 74 68 69 73 20 72   restored this r
11b60 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
11b70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
11b80 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20 72 65  tine needs to re
11b90 73 65 74 20 74 68 65 20 65 78 74 72 61 20 64 61  set the extra da
11ba0 74 61 20 73 65 63 74 69 6f 6e 20 61 74 20 74 68  ta section at th
11bb0 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20  e end of the.** 
11bc0 70 61 67 65 20 74 6f 20 61 67 72 65 65 20 77 69  page to agree wi
11bd0 74 68 20 74 68 65 20 72 65 73 74 6f 72 65 64 20  th the restored 
11be0 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  data..*/.static 
11bf0 76 6f 69 64 20 70 61 67 65 52 65 69 6e 69 74 28  void pageReinit(
11c00 44 62 50 61 67 65 20 2a 70 44 61 74 61 29 7b 0a  DbPage *pData){.
11c10 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
11c20 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d  ;.  pPage = (Mem
11c30 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61  Page *)sqlite3Pa
11c40 67 65 72 47 65 74 45 78 74 72 61 28 70 44 61 74  gerGetExtra(pDat
11c50 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  a);.  assert( sq
11c60 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
11c70 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 30 20  fcount(pData)>0 
11c80 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
11c90 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 61 73  isInit ){.    as
11ca0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
11cb0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
11cc0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
11cd0 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
11ce0 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71   = 0;.    if( sq
11cf0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
11d00 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 31 20  fcount(pData)>1 
11d10 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 50 61 67  ){.      /* pPag
11d20 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61  e might not be a
11d30 20 62 74 72 65 65 20 70 61 67 65 3b 20 20 69 74   btree page;  it
11d40 20 6d 69 67 68 74 20 62 65 20 61 6e 20 6f 76 65   might be an ove
11d50 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 20  rflow page.     
11d60 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70 20 70 61   ** or ptrmap pa
11d70 67 65 20 6f 72 20 61 20 66 72 65 65 20 70 61 67  ge or a free pag
11d80 65 2e 20 20 49 6e 20 74 68 6f 73 65 20 63 61 73  e.  In those cas
11d90 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  es, the followin
11da0 67 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20  g.      ** call 
11db0 74 6f 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  to btreeInitPage
11dc0 28 29 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72  () will likely r
11dd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
11de0 52 55 50 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42  RUPT..      ** B
11df0 75 74 20 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f  ut no harm is do
11e00 6e 65 20 62 79 20 74 68 69 73 2e 20 20 41 6e 64  ne by this.  And
11e10 20 69 74 20 69 73 20 76 65 72 79 20 69 6d 70 6f   it is very impo
11e20 72 74 61 6e 74 20 74 68 61 74 0a 20 20 20 20 20  rtant that.     
11e30 20 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67   ** btreeInitPag
11e40 65 28 29 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  e() be called on
11e50 20 65 76 65 72 79 20 62 74 72 65 65 20 70 61 67   every btree pag
11e60 65 20 73 6f 20 77 65 20 6d 61 6b 65 0a 20 20 20  e so we make.   
11e70 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 66     ** the call f
11e80 6f 72 20 65 76 65 72 79 20 70 61 67 65 20 74 68  or every page th
11e90 61 74 20 63 6f 6d 65 73 20 69 6e 20 66 6f 72 20  at comes in for 
11ea0 72 65 2d 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20  re-initing. */. 
11eb0 20 20 20 20 20 62 74 72 65 65 49 6e 69 74 50 61       btreeInitPa
11ec0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  ge(pPage);.    }
11ed0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
11ee0 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
11ef0 6e 64 6c 65 72 20 66 6f 72 20 61 20 62 74 72 65  ndler for a btre
11f00 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
11f10 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79   btreeInvokeBusy
11f20 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 70 41  Handler(void *pA
11f30 72 67 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  rg){.  BtShared 
11f40 2a 70 42 74 20 3d 20 28 42 74 53 68 61 72 65 64  *pBt = (BtShared
11f50 2a 29 70 41 72 67 3b 0a 20 20 61 73 73 65 72 74  *)pArg;.  assert
11f60 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61  ( pBt->db );.  a
11f70 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
11f80 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64  utex_held(pBt->d
11f90 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  b->mutex) );.  r
11fa0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49 6e 76  eturn sqlite3Inv
11fb0 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 26  okeBusyHandler(&
11fc0 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e  pBt->db->busyHan
11fd0 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  dler);.}../*.** 
11fe0 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73 65 20  Open a database 
11ff0 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69  file..** .** zFi
12000 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20 6e 61  lename is the na
12010 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
12020 73 65 20 66 69 6c 65 2e 20 20 49 66 20 7a 46 69  se file.  If zFi
12030 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a  lename is NULL.*
12040 2a 20 74 68 65 6e 20 61 6e 20 65 70 68 65 6d 65  * then an epheme
12050 72 61 6c 20 64 61 74 61 62 61 73 65 20 69 73 20  ral database is 
12060 63 72 65 61 74 65 64 2e 20 20 54 68 65 20 65 70  created.  The ep
12070 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65  hemeral database
12080 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 65 78 63   might.** be exc
12090 6c 75 73 69 76 65 6c 79 20 69 6e 20 6d 65 6d 6f  lusively in memo
120a0 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68 74 20  ry, or it might 
120b0 75 73 65 20 61 20 64 69 73 6b 2d 62 61 73 65 64  use a disk-based
120c0 20 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 0a 2a   memory cache..*
120d0 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20 74 68  * Either way, th
120e0 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61  e ephemeral data
120f0 62 61 73 65 20 77 69 6c 6c 20 62 65 20 61 75 74  base will be aut
12100 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
12110 65 64 20 0a 2a 2a 20 77 68 65 6e 20 73 71 6c 69  ed .** when sqli
12120 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 29 20  te3BtreeClose() 
12130 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
12140 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
12150 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e   ":memory:" then
12160 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
12170 74 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65  tabase is create
12180 64 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 75 74  d.** that is aut
12190 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 73 74 72  omatically destr
121a0 6f 79 65 64 20 77 68 65 6e 20 69 74 20 69 73 20  oyed when it is 
121b0 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  closed..**.** Th
121c0 65 20 22 66 6c 61 67 73 22 20 70 61 72 61 6d 65  e "flags" parame
121d0 74 65 72 20 69 73 20 61 20 62 69 74 6d 61 73 6b  ter is a bitmask
121e0 20 74 68 61 74 20 6d 69 67 68 74 20 63 6f 6e 74   that might cont
121f0 61 69 6e 20 62 69 74 73 20 6c 69 6b 65 0a 2a 2a  ain bits like.**
12200 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52   BTREE_OMIT_JOUR
12210 4e 41 4c 20 61 6e 64 2f 6f 72 20 42 54 52 45 45  NAL and/or BTREE
12220 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 49  _MEMORY..**.** I
12230 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
12240 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64  s already opened
12250 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74   in the same dat
12260 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
12270 0a 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20 69  .** and we are i
12280 6e 20 73 68 61 72 65 64 20 63 61 63 68 65 20 6d  n shared cache m
12290 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6f 70  ode, then the op
122a0 65 6e 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74  en will fail wit
122b0 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43  h an.** SQLITE_C
122c0 4f 4e 53 54 52 41 49 4e 54 20 65 72 72 6f 72 2e  ONSTRAINT error.
122d0 20 20 57 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f    We cannot allo
122e0 77 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74  w two or more Bt
122f0 53 68 61 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74  Shared.** object
12300 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61  s in the same da
12310 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
12320 6e 20 73 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f  n since doing so
12330 20 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f   will lead.** to
12340 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c   problems with l
12350 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73  ocking..*/.int s
12360 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28  qlite3BtreeOpen(
12370 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
12380 70 56 66 73 2c 20 20 20 20 20 20 2f 2a 20 56 46  pVfs,      /* VF
12390 53 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69  S to use for thi
123a0 73 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 63 6f  s b-tree */.  co
123b0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
123c0 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ame,  /* Name of
123d0 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69   the file contai
123e0 6e 69 6e 67 20 74 68 65 20 42 54 72 65 65 20 64  ning the BTree d
123f0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c  atabase */.  sql
12400 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
12410 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74       /* Associat
12420 65 64 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ed database hand
12430 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a  le */.  Btree **
12440 70 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20  ppBtree,        
12450 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65  /* Pointer to ne
12460 77 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 77  w Btree object w
12470 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20  ritten here */. 
12480 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
12490 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74 69           /* Opti
124a0 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73  ons */.  int vfs
124b0 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  Flags           
124c0 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64   /* Flags passed
124d0 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69   through to sqli
124e0 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20  te3_vfs.xOpen() 
124f0 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64  */.){.  BtShared
12500 20 2a 70 42 74 20 3d 20 30 3b 20 20 20 20 20 20   *pBt = 0;      
12510 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64         /* Shared
12520 20 70 61 72 74 20 6f 66 20 62 74 72 65 65 20 73   part of btree s
12530 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 42 74  tructure */.  Bt
12540 72 65 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20  ree *p;         
12550 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12560 48 61 6e 64 6c 65 20 74 6f 20 72 65 74 75 72 6e  Handle to return
12570 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
12580 74 65 78 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d  tex *mutexOpen =
12590 20 30 3b 20 20 2f 2a 20 50 72 65 76 65 6e 74 73   0;  /* Prevents
125a0 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f   a race conditio
125b0 6e 2e 20 54 69 63 6b 65 74 20 23 33 35 33 37 20  n. Ticket #3537 
125c0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
125d0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
125e0 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
125f0 64 65 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e  de from this fun
12600 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52  ction */.  u8 nR
12610 65 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20  eserve;         
12620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
12630 65 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63  e of unused spac
12640 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a  e on each page *
12650 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
12660 72 20 7a 44 62 48 65 61 64 65 72 5b 31 30 30 5d  r zDbHeader[100]
12670 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68  ;  /* Database h
12680 65 61 64 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f  eader content */
12690 0a 0a 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f  ..  /* True if o
126a0 70 65 6e 69 6e 67 20 61 6e 20 65 70 68 65 6d 65  pening an epheme
126b0 72 61 6c 2c 20 74 65 6d 70 6f 72 61 72 79 20 64  ral, temporary d
126c0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e  atabase */.  con
126d0 73 74 20 69 6e 74 20 69 73 54 65 6d 70 44 62 20  st int isTempDb 
126e0 3d 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c  = zFilename==0 |
126f0 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d  | zFilename[0]==
12700 30 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  0;..  /* Set the
12710 20 76 61 72 69 61 62 6c 65 20 69 73 4d 65 6d 64   variable isMemd
12720 62 20 74 6f 20 74 72 75 65 20 66 6f 72 20 61 6e  b to true for an
12730 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
12740 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61  ase, or .  ** fa
12750 6c 73 65 20 66 6f 72 20 61 20 66 69 6c 65 2d 62  lse for a file-b
12760 61 73 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20  ased database.. 
12770 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
12780 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
12790 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65    const int isMe
127a0 6d 64 62 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20  mdb = 0;.#else. 
127b0 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d   const int isMem
127c0 64 62 20 3d 20 28 7a 46 69 6c 65 6e 61 6d 65 20  db = (zFilename 
127d0 26 26 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e  && strcmp(zFilen
127e0 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29  ame, ":memory:")
127f0 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20 20  ==0).           
12800 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
12810 69 73 54 65 6d 70 44 62 20 26 26 20 73 71 6c 69  isTempDb && sqli
12820 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28  te3TempInMemory(
12830 64 62 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  db)).           
12840 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
12850 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54  vfsFlags & SQLIT
12860 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d  E_OPEN_MEMORY)!=
12870 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  0;.#endif..  ass
12880 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
12890 61 73 73 65 72 74 28 20 70 56 66 73 21 3d 30 20  assert( pVfs!=0 
128a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
128b0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
128c0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
128d0 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 26 30  assert( (flags&0
128e0 78 66 66 29 3d 3d 66 6c 61 67 73 20 29 3b 20 20  xff)==flags );  
128f0 20 2f 2a 20 66 6c 61 67 73 20 66 69 74 20 69 6e   /* flags fit in
12900 20 38 20 62 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a   8 bits */..  /*
12910 20 4f 6e 6c 79 20 61 20 42 54 52 45 45 5f 53 49   Only a BTREE_SI
12920 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20 63 61  NGLE database ca
12930 6e 20 62 65 20 42 54 52 45 45 5f 55 4e 4f 52 44  n be BTREE_UNORD
12940 45 52 45 44 20 2a 2f 0a 20 20 61 73 73 65 72 74  ERED */.  assert
12950 28 20 28 66 6c 61 67 73 20 26 20 42 54 52 45 45  ( (flags & BTREE
12960 5f 55 4e 4f 52 44 45 52 45 44 29 3d 3d 30 20 7c  _UNORDERED)==0 |
12970 7c 20 28 66 6c 61 67 73 20 26 20 42 54 52 45 45  | (flags & BTREE
12980 5f 53 49 4e 47 4c 45 29 21 3d 30 20 29 3b 0a 0a  _SINGLE)!=0 );..
12990 20 20 2f 2a 20 41 20 42 54 52 45 45 5f 53 49 4e    /* A BTREE_SIN
129a0 47 4c 45 20 64 61 74 61 62 61 73 65 20 69 73 20  GLE database is 
129b0 61 6c 77 61 79 73 20 61 20 74 65 6d 70 6f 72 61  always a tempora
129c0 72 79 20 61 6e 64 2f 6f 72 20 65 70 68 65 6d 65  ry and/or epheme
129d0 72 61 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ral */.  assert(
129e0 20 28 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f   (flags & BTREE_
129f0 53 49 4e 47 4c 45 29 3d 3d 30 20 7c 7c 20 69 73  SINGLE)==0 || is
12a00 54 65 6d 70 44 62 20 29 3b 0a 0a 20 20 69 66 28  TempDb );..  if(
12a10 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20   isMemdb ){.    
12a20 66 6c 61 67 73 20 7c 3d 20 42 54 52 45 45 5f 4d  flags |= BTREE_M
12a30 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 69 66 28  EMORY;.  }.  if(
12a40 20 28 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c   (vfsFlags & SQL
12a50 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
12a60 29 21 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62  )!=0 && (isMemdb
12a70 20 7c 7c 20 69 73 54 65 6d 70 44 62 29 20 29 7b   || isTempDb) ){
12a80 0a 20 20 20 20 76 66 73 46 6c 61 67 73 20 3d 20  .    vfsFlags = 
12a90 28 76 66 73 46 6c 61 67 73 20 26 20 7e 53 51 4c  (vfsFlags & ~SQL
12aa0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
12ab0 29 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ) | SQLITE_OPEN_
12ac0 54 45 4d 50 5f 44 42 3b 0a 20 20 7d 0a 20 20 70  TEMP_DB;.  }.  p
12ad0 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
12ae0 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 72 65  Zero(sizeof(Btre
12af0 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b  e));.  if( !p ){
12b00 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
12b10 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
12b20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20   }.  p->inTrans 
12b30 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
12b40 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 23 69 66 6e  p->db = db;.#ifn
12b50 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12b60 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 70  SHARED_CACHE.  p
12b70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 20 3d 20  ->lock.pBtree = 
12b80 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61  p;.  p->lock.iTa
12b90 62 6c 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a  ble = 1;.#endif.
12ba0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
12bb0 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
12bc0 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
12bd0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
12be0 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a  DISKIO).  /*.  *
12bf0 2a 20 49 66 20 74 68 69 73 20 42 74 72 65 65 20  * If this Btree 
12c00 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66  is a candidate f
12c10 6f 72 20 73 68 61 72 65 64 20 63 61 63 68 65 2c  or shared cache,
12c20 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a   try to find an.
12c30 20 20 2a 2a 20 65 78 69 73 74 69 6e 67 20 42 74    ** existing Bt
12c40 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 68  Shared object th
12c50 61 74 20 77 65 20 63 61 6e 20 73 68 61 72 65 20  at we can share 
12c60 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20  with.  */.  if( 
12c70 69 73 54 65 6d 70 44 62 3d 3d 30 20 26 26 20 28  isTempDb==0 && (
12c80 69 73 4d 65 6d 64 62 3d 3d 30 20 7c 7c 20 28 76  isMemdb==0 || (v
12c90 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f  fsFlags&SQLITE_O
12ca0 50 45 4e 5f 55 52 49 29 21 3d 30 29 20 29 7b 0a  PEN_URI)!=0) ){.
12cb0 20 20 20 20 69 66 28 20 76 66 73 46 6c 61 67 73      if( vfsFlags
12cc0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53   & SQLITE_OPEN_S
12cd0 48 41 52 45 44 43 41 43 48 45 20 29 7b 0a 20 20  HAREDCACHE ){.  
12ce0 20 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d      int nFilenam
12cf0 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
12d00 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b 31  n30(zFilename)+1
12d10 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 75 6c  ;.      int nFul
12d20 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73  lPathname = pVfs
12d30 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a  ->mxPathname+1;.
12d40 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46 75 6c        char *zFul
12d50 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  lPathname = sqli
12d60 74 65 33 4d 61 6c 6c 6f 63 28 4d 41 58 28 6e 46  te3Malloc(MAX(nF
12d70 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 6e 46 69 6c  ullPathname,nFil
12d80 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 4d  ename));.      M
12d90 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69  UTEX_LOGIC( sqli
12da0 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
12db0 53 68 61 72 65 64 3b 20 29 0a 0a 20 20 20 20 20  Shared; )..     
12dc0 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31   p->sharable = 1
12dd0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 46 75  ;.      if( !zFu
12de0 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20  llPathname ){.  
12df0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
12e00 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72  ee(p);.        r
12e10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
12e20 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  EM_BKPT;.      }
12e30 0a 20 20 20 20 20 20 69 66 28 20 69 73 4d 65 6d  .      if( isMem
12e40 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  db ){.        me
12e50 6d 63 70 79 28 7a 46 75 6c 6c 50 61 74 68 6e 61  mcpy(zFullPathna
12e60 6d 65 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e  me, zFilename, n
12e70 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
12e80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12e90 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75  rc = sqlite3OsFu
12ea0 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c  llPathname(pVfs,
12eb0 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20   zFilename,.    
12ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
12ee0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46  FullPathname, zF
12ef0 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
12f00 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
12f10 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
12f20 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  3_free(zFullPath
12f30 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
12f40 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
12f50 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
12f60 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
12f70 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 53 51 4c  .      }.#if SQL
12f80 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20  ITE_THREADSAFE. 
12f90 20 20 20 20 20 6d 75 74 65 78 4f 70 65 6e 20 3d       mutexOpen =
12fa0 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
12fb0 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
12fc0 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a 20 20  STATIC_OPEN);.  
12fd0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
12fe0 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f 70 65  x_enter(mutexOpe
12ff0 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 53  n);.      mutexS
13000 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d  hared = sqlite3M
13010 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
13020 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
13030 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73 71 6c  STER);.      sql
13040 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
13050 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 23  (mutexShared);.#
13060 65 6e 64 69 66 0a 20 20 20 20 20 20 66 6f 72 28  endif.      for(
13070 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68 61  pBt=GLOBAL(BtSha
13080 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
13090 65 64 43 61 63 68 65 4c 69 73 74 29 3b 20 70 42  edCacheList); pB
130a0 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78  t; pBt=pBt->pNex
130b0 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  t){.        asse
130c0 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20  rt( pBt->nRef>0 
130d0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 30  );.        if( 0
130e0 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61  ==strcmp(zFullPa
130f0 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 50  thname, sqlite3P
13100 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42 74  agerFilename(pBt
13110 2d 3e 70 50 61 67 65 72 2c 20 30 29 29 0a 20 20  ->pPager, 0)).  
13120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
13130 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 56 66  & sqlite3PagerVf
13140 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d  s(pBt->pPager)==
13150 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20 20 20  pVfs ){.        
13160 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20    int iDb;.     
13170 20 20 20 20 20 66 6f 72 28 69 44 62 3d 64 62 2d       for(iDb=db-
13180 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b 20  >nDb-1; iDb>=0; 
13190 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20  iDb--){.        
131a0 20 20 20 20 42 74 72 65 65 20 2a 70 45 78 69 73      Btree *pExis
131b0 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b 69  ting = db->aDb[i
131c0 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 20  Db].pBt;.       
131d0 20 20 20 20 20 69 66 28 20 70 45 78 69 73 74 69       if( pExisti
131e0 6e 67 20 26 26 20 70 45 78 69 73 74 69 6e 67 2d  ng && pExisting-
131f0 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20  >pBt==pBt ){.   
13200 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
13210 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
13220 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
13230 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
13240 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
13250 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20  utexOpen);.     
13260 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
13270 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  _free(zFullPathn
13280 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
13290 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
132a0 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (p);.           
132b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
132c0 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20  _CONSTRAINT;.   
132d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
132e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
132f0 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20   p->pBt = pBt;. 
13300 20 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 52           pBt->nR
13310 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ef++;.          
13320 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
13330 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
13340 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
13350 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  ve(mutexShared);
13360 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
13370 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
13380 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  e);.    }.#ifdef
13390 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
133a0 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a    else{.      /*
133b0 20 49 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20   In debug mode, 
133c0 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73  we mark all pers
133d0 69 73 74 65 6e 74 20 64 61 74 61 62 61 73 65 73  istent databases
133e0 20 61 73 20 73 68 61 72 61 62 6c 65 0a 20 20 20   as sharable.   
133f0 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20     ** even when 
13400 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 20 20 54  they are not.  T
13410 68 69 73 20 65 78 65 72 63 69 73 65 73 20 74 68  his exercises th
13420 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61  e locking code a
13430 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67 69 76 65  nd.      ** give
13440 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69  s more opportuni
13450 74 79 20 66 6f 72 20 61 73 73 65 72 74 73 28 73  ty for asserts(s
13460 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
13470 64 28 29 29 0a 20 20 20 20 20 20 2a 2a 20 73 74  d()).      ** st
13480 61 74 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64  atements to find
13490 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d   locking problem
134a0 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  s..      */.    
134b0 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20    p->sharable = 
134c0 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  1;.    }.#endif.
134d0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
134e0 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f   pBt==0 ){.    /
134f0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c  *.    ** The fol
13500 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d  lowing asserts m
13510 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 73 74  ake sure that st
13520 72 75 63 74 75 72 65 73 20 75 73 65 64 20 62 79  ructures used by
13530 20 74 68 65 20 62 74 72 65 65 20 61 72 65 0a 20   the btree are. 
13540 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20     ** the right 
13550 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74  size.  This is t
13560 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73 74 20  o guard against 
13570 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61  size changes tha
13580 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20  t result.    ** 
13590 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f  when compiling o
135a0 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 61 72  n a different ar
135b0 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20 20 20  chitecture..    
135c0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  */.    assert( s
135d0 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20 29 3b  izeof(i64)==8 );
135e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
135f0 65 6f 66 28 75 36 34 29 3d 3d 38 20 29 3b 0a 20  eof(u64)==8 );. 
13600 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
13610 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20 20  f(u32)==4 );.   
13620 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
13630 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20 20 61  u16)==2 );.    a
13640 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 50 67  ssert( sizeof(Pg
13650 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20 20 20  no)==4 );.  .   
13660 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33 4d 61   pBt = sqlite3Ma
13670 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66  llocZero( sizeof
13680 28 2a 70 42 74 29 20 29 3b 0a 20 20 20 20 69 66  (*pBt) );.    if
13690 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pBt==0 ){.    
136a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
136b0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
136c0 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
136d0 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  out;.    }.    r
136e0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
136f0 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42 74 2d  Open(pVfs, &pBt-
13700 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61  >pPager, zFilena
13710 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
13720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
13730 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 2c 20 66  zeof(MemPage), f
13740 6c 61 67 73 2c 20 76 66 73 46 6c 61 67 73 2c 20  lags, vfsFlags, 
13750 70 61 67 65 52 65 69 6e 69 74 29 3b 0a 20 20 20  pageReinit);.   
13760 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
13770 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
13780 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c  te3PagerSetMmapL
13790 69 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72  imit(pBt->pPager
137a0 2c 20 64 62 2d 3e 73 7a 4d 6d 61 70 29 3b 0a 20  , db->szMmap);. 
137b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
137c0 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65  3PagerReadFilehe
137d0 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72  ader(pBt->pPager
137e0 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61 64 65  ,sizeof(zDbHeade
137f0 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b 0a 20  r),zDbHeader);. 
13800 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
13810 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13820 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f      goto btree_o
13830 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  pen_out;.    }. 
13840 20 20 20 70 42 74 2d 3e 6f 70 65 6e 46 6c 61 67     pBt->openFlag
13850 73 20 3d 20 28 75 38 29 66 6c 61 67 73 3b 0a 20  s = (u8)flags;. 
13860 20 20 20 70 42 74 2d 3e 64 62 20 3d 20 64 62 3b     pBt->db = db;
13870 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
13880 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28  rSetBusyhandler(
13890 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 62 74 72  pBt->pPager, btr
138a0 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  eeInvokeBusyHand
138b0 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20 20 20 70  ler, pBt);.    p
138c0 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a  ->pBt = pBt;.  .
138d0 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72      pBt->pCursor
138e0 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70   = 0;.    pBt->p
138f0 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 69  Page1 = 0;.    i
13900 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  f( sqlite3PagerI
13910 73 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70  sreadonly(pBt->p
13920 50 61 67 65 72 29 20 29 20 70 42 74 2d 3e 62 74  Pager) ) pBt->bt
13930 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45  sFlags |= BTS_RE
13940 41 44 5f 4f 4e 4c 59 3b 0a 23 69 66 64 65 66 20  AD_ONLY;.#ifdef 
13950 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45  SQLITE_SECURE_DE
13960 4c 45 54 45 0a 20 20 20 20 70 42 74 2d 3e 62 74  LETE.    pBt->bt
13970 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53 45  sFlags |= BTS_SE
13980 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 23 65 6e  CURE_DELETE;.#en
13990 64 69 66 0a 20 20 20 20 2f 2a 20 45 56 49 44 45  dif.    /* EVIDE
139a0 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33 2d  NCE-OF: R-51873-
139b0 33 39 36 31 38 20 54 68 65 20 70 61 67 65 20 73  39618 The page s
139c0 69 7a 65 20 66 6f 72 20 61 20 64 61 74 61 62 61  ize for a databa
139d0 73 65 20 66 69 6c 65 20 69 73 0a 20 20 20 20 2a  se file is.    *
139e0 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  * determined by 
139f0 74 68 65 20 32 2d 62 79 74 65 20 69 6e 74 65 67  the 2-byte integ
13a00 65 72 20 6c 6f 63 61 74 65 64 20 61 74 20 61 6e  er located at an
13a10 20 6f 66 66 73 65 74 20 6f 66 20 31 36 20 62 79   offset of 16 by
13a20 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  tes from.    ** 
13a30 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
13a40 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
13a50 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e  le. */.    pBt->
13a60 70 61 67 65 53 69 7a 65 20 3d 20 28 7a 44 62 48  pageSize = (zDbH
13a70 65 61 64 65 72 5b 31 36 5d 3c 3c 38 29 20 7c 20  eader[16]<<8) | 
13a80 28 7a 44 62 48 65 61 64 65 72 5b 31 37 5d 3c 3c  (zDbHeader[17]<<
13a90 31 36 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  16);.    if( pBt
13aa0 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c  ->pageSize<512 |
13ab0 7c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  | pBt->pageSize>
13ac0 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
13ad0 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20 7c 7c  SIZE.         ||
13ae0 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   ((pBt->pageSize
13af0 2d 31 29 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  -1)&pBt->pageSiz
13b00 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  e)!=0 ){.      p
13b10 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 30  Bt->pageSize = 0
13b20 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
13b30 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
13b40 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
13b50 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65   magic name ":me
13b60 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72 65 61  mory:" will crea
13b70 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  te an in-memory 
13b80 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 20  database, then. 
13b90 20 20 20 20 20 2a 2a 20 6c 65 61 76 65 20 74 68       ** leave th
13ba0 65 20 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64  e autoVacuum mod
13bb0 65 20 61 74 20 30 20 28 64 6f 20 6e 6f 74 20 61  e at 0 (do not a
13bc0 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76 65  uto-vacuum), eve
13bd0 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51  n if.      ** SQ
13be0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
13bf0 4f 56 41 43 55 55 4d 20 69 73 20 74 72 75 65 2e  OVACUUM is true.
13c00 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
13c10 6e 64 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a 20  nd, if.      ** 
13c20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
13c30 52 59 44 42 20 68 61 73 20 62 65 65 6e 20 64 65  RYDB has been de
13c40 66 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65  fined, then ":me
13c50 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73 74 20 61  mory:" is just a
13c60 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 75 6c 61  .      ** regula
13c70 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20  r file-name. In 
13c80 74 68 69 73 20 63 61 73 65 20 74 68 65 20 61 75  this case the au
13c90 74 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c 69 65  to-vacuum applie
13ca0 73 20 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e  s as per normal.
13cb0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
13cc0 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
13cd0 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20   !isMemdb ){.   
13ce0 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61       pBt->autoVa
13cf0 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44  cuum = (SQLITE_D
13d00 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
13d10 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20  M ? 1 : 0);.    
13d20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
13d30 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45  uum = (SQLITE_DE
13d40 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
13d50 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20  ==2 ? 1 : 0);.  
13d60 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
13d70 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 30 3b     nReserve = 0;
13d80 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
13d90 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
13da0 3a 20 52 2d 33 37 34 39 37 2d 34 32 34 31 32 20  : R-37497-42412 
13db0 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  The size of the 
13dc0 72 65 73 65 72 76 65 64 20 72 65 67 69 6f 6e 20  reserved region 
13dd0 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65  is.      ** dete
13de0 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6f 6e  rmined by the on
13df0 65 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20  e-byte unsigned 
13e00 69 6e 74 65 67 65 72 20 66 6f 75 6e 64 20 61 74  integer found at
13e10 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 32 30   an offset of 20
13e20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74  .      ** into t
13e30 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
13e40 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20   header. */.    
13e50 20 20 6e 52 65 73 65 72 76 65 20 3d 20 7a 44 62    nReserve = zDb
13e60 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20  Header[20];.    
13e70 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
13e80 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f  |= BTS_PAGESIZE_
13e90 46 49 58 45 44 3b 0a 23 69 66 6e 64 65 66 20 53  FIXED;.#ifndef S
13ea0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
13eb0 41 43 55 55 4d 0a 20 20 20 20 20 20 70 42 74 2d  ACUUM.      pBt-
13ec0 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67  >autoVacuum = (g
13ed0 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64  et4byte(&zDbHead
13ee0 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a  er[36 + 4*4])?1:
13ef0 30 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69  0);.      pBt->i
13f00 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74  ncrVacuum = (get
13f10 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72  4byte(&zDbHeader
13f20 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29  [36 + 7*4])?1:0)
13f30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
13f40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
13f50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
13f60 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
13f70 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65  t->pageSize, nRe
13f80 73 65 72 76 65 29 3b 0a 20 20 20 20 69 66 28 20  serve);.    if( 
13f90 72 63 20 29 20 67 6f 74 6f 20 62 74 72 65 65 5f  rc ) goto btree_
13fa0 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 70 42  open_out;.    pB
13fb0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
13fc0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
13fd0 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73  nReserve;.    as
13fe0 73 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65  sert( (pBt->page
13ff0 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20  Size & 7)==0 ); 
14000 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   /* 8-byte align
14010 6d 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65  ment of pageSize
14020 20 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64 65 66   */.   .#if !def
14030 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
14040 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
14050 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
14060 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
14070 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65     /* Add the ne
14080 77 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  w BtShared objec
14090 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20  t to the linked 
140a0 6c 69 73 74 20 73 68 61 72 61 62 6c 65 20 42 74  list sharable Bt
140b0 53 68 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a  Shareds..    */.
140c0 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20      pBt->nRef = 
140d0 31 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 68  1;.    if( p->sh
140e0 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  arable ){.      
140f0 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c  MUTEX_LOGIC( sql
14100 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
14110 78 53 68 61 72 65 64 3b 20 29 0a 20 20 20 20 20  xShared; ).     
14120 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 6d 75   MUTEX_LOGIC( mu
14130 74 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69  texShared = sqli
14140 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
14150 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
14160 43 5f 4d 41 53 54 45 52 29 3b 29 0a 20 20 20 20  C_MASTER);).    
14170 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52    if( SQLITE_THR
14180 45 41 44 53 41 46 45 20 26 26 20 73 71 6c 69 74  EADSAFE && sqlit
14190 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
141a0 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20  CoreMutex ){.   
141b0 20 20 20 20 20 70 42 74 2d 3e 6d 75 74 65 78 20       pBt->mutex 
141c0 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
141d0 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
141e0 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20 20 20  _FAST);.        
141f0 69 66 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d  if( pBt->mutex==
14200 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
14210 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
14220 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
14230 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
14240 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
14250 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
14260 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
14270 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  r(mutexShared);.
14280 20 20 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74        pBt->pNext
14290 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72   = GLOBAL(BtShar
142a0 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
142b0 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20  dCacheList);.   
142c0 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72     GLOBAL(BtShar
142d0 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
142e0 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42  dCacheList) = pB
142f0 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
14300 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
14310 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 7d  exShared);.    }
14320 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66  .#endif.  }..#if
14330 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
14340 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
14350 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  HE) && !defined(
14360 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
14370 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  IO).  /* If the 
14380 6e 65 77 20 42 74 72 65 65 20 75 73 65 73 20 61  new Btree uses a
14390 20 73 68 61 72 61 62 6c 65 20 70 42 74 53 68 61   sharable pBtSha
143a0 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74  red, then link t
143b0 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65  he new.  ** Btre
143c0 65 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 20  e into the list 
143d0 6f 66 20 61 6c 6c 20 73 68 61 72 61 62 6c 65 20  of all sharable 
143e0 42 74 72 65 65 73 20 66 6f 72 20 74 68 65 20 73  Btrees for the s
143f0 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ame connection..
14400 20 20 2a 2a 20 54 68 65 20 6c 69 73 74 20 69 73    ** The list is
14410 20 6b 65 70 74 20 69 6e 20 61 73 63 65 6e 64 69   kept in ascendi
14420 6e 67 20 6f 72 64 65 72 20 62 79 20 70 42 74 20  ng order by pBt 
14430 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  address..  */.  
14440 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  if( p->sharable 
14450 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
14460 20 20 42 74 72 65 65 20 2a 70 53 69 62 3b 0a 20    Btree *pSib;. 
14470 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
14480 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
14490 20 20 20 69 66 28 20 28 70 53 69 62 20 3d 20 64     if( (pSib = d
144a0 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d  b->aDb[i].pBt)!=
144b0 30 20 26 26 20 70 53 69 62 2d 3e 73 68 61 72 61  0 && pSib->shara
144c0 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 77  ble ){.        w
144d0 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 50 72 65  hile( pSib->pPre
144e0 76 20 29 7b 20 70 53 69 62 20 3d 20 70 53 69 62  v ){ pSib = pSib
144f0 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20 20 20  ->pPrev; }.     
14500 20 20 20 69 66 28 20 28 75 70 74 72 29 70 2d 3e     if( (uptr)p->
14510 70 42 74 3c 28 75 70 74 72 29 70 53 69 62 2d 3e  pBt<(uptr)pSib->
14520 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBt ){.         
14530 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62   p->pNext = pSib
14540 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  ;.          p->p
14550 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20  Prev = 0;.      
14560 20 20 20 20 70 53 69 62 2d 3e 70 50 72 65 76 20      pSib->pPrev 
14570 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = p;.        }el
14580 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68  se{.          wh
14590 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65 78 74  ile( pSib->pNext
145a0 20 26 26 20 28 75 70 74 72 29 70 53 69 62 2d 3e   && (uptr)pSib->
145b0 70 4e 65 78 74 2d 3e 70 42 74 3c 28 75 70 74 72  pNext->pBt<(uptr
145c0 29 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20  )p->pBt ){.     
145d0 20 20 20 20 20 20 20 70 53 69 62 20 3d 20 70 53         pSib = pS
145e0 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ib->pNext;.     
145f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
14600 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62   p->pNext = pSib
14610 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
14620 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 70 53     p->pPrev = pS
14630 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ib;.          if
14640 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  ( p->pNext ){.  
14650 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65            p->pNe
14660 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20  xt->pPrev = p;. 
14670 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
14680 20 20 20 20 20 70 53 69 62 2d 3e 70 4e 65 78 74       pSib->pNext
14690 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = p;.        }.
146a0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
146b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
146c0 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 42 74 72  .#endif.  *ppBtr
146d0 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f  ee = p;..btree_o
146e0 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72  pen_out:.  if( r
146f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
14700 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20 70      if( pBt && p
14710 42 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20  Bt->pPager ){.  
14720 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
14730 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65  Close(pBt->pPage
14740 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  r, 0);.    }.   
14750 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42   sqlite3_free(pB
14760 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
14770 66 72 65 65 28 70 29 3b 0a 20 20 20 20 2a 70 70  free(p);.    *pp
14780 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  Btree = 0;.  }el
14790 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
147a0 66 69 6c 65 20 2a 70 46 69 6c 65 3b 0a 0a 20 20  file *pFile;..  
147b0 20 20 2f 2a 20 49 66 20 74 68 65 20 42 2d 54 72    /* If the B-Tr
147c0 65 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75  ee was successfu
147d0 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 73 65 74 20  lly opened, set 
147e0 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
147f0 73 69 7a 65 20 74 6f 20 74 68 65 0a 20 20 20 20  size to the.    
14800 2a 2a 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  ** default value
14810 2e 20 45 78 63 65 70 74 2c 20 77 68 65 6e 20 6f  . Except, when o
14820 70 65 6e 69 6e 67 20 6f 6e 20 61 6e 20 65 78 69  pening on an exi
14830 73 74 69 6e 67 20 73 68 61 72 65 64 20 70 61 67  sting shared pag
14840 65 72 2d 63 61 63 68 65 2c 0a 20 20 20 20 2a 2a  er-cache,.    **
14850 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20 74   do not change t
14860 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 73  he pager-cache s
14870 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
14880 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
14890 53 63 68 65 6d 61 28 70 2c 20 30 2c 20 30 29 3d  Schema(p, 0, 0)=
148a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
148b0 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65  te3PagerSetCache
148c0 73 69 7a 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61  size(p->pBt->pPa
148d0 67 65 72 2c 20 53 51 4c 49 54 45 5f 44 45 46 41  ger, SQLITE_DEFA
148e0 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29 3b  ULT_CACHE_SIZE);
148f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 46 69 6c  .    }..    pFil
14900 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  e = sqlite3Pager
14910 46 69 6c 65 28 70 42 74 2d 3e 70 50 61 67 65 72  File(pBt->pPager
14920 29 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65  );.    if( pFile
14930 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
14940 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c      sqlite3OsFil
14950 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 46 69  eControlHint(pFi
14960 6c 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  le, SQLITE_FCNTL
14970 5f 50 44 42 2c 20 28 76 6f 69 64 2a 29 26 70 42  _PDB, (void*)&pB
14980 74 2d 3e 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20  t->db);.    }.  
14990 7d 0a 20 20 69 66 28 20 6d 75 74 65 78 4f 70 65  }.  if( mutexOpe
149a0 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  n ){.    assert(
149b0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
149c0 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e 29 20 29  eld(mutexOpen) )
149d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
149e0 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f  tex_leave(mutexO
149f0 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  pen);.  }.  asse
14a00 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
14a10 4b 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65  K || sqlite3Btre
14a20 65 43 6f 6e 6e 65 63 74 69 6f 6e 43 6f 75 6e 74  eConnectionCount
14a30 28 2a 70 70 42 74 72 65 65 29 3e 30 20 29 3b 0a  (*ppBtree)>0 );.
14a40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
14a50 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20  /*.** Decrement 
14a60 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65  the BtShared.nRe
14a70 66 20 63 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e  f counter.  When
14a80 20 69 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f   it reaches zero
14a90 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20  ,.** remove the 
14aa0 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
14ab0 72 65 20 66 72 6f 6d 20 74 68 65 20 73 68 61 72  re from the shar
14ac0 69 6e 67 20 6c 69 73 74 2e 20 20 52 65 74 75 72  ing list.  Retur
14ad0 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65  n.** true if the
14ae0 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63   BtShared.nRef c
14af0 6f 75 6e 74 65 72 20 72 65 61 63 68 65 73 20 7a  ounter reaches z
14b00 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  ero and return.*
14b10 2a 20 66 61 6c 73 65 20 69 66 20 69 74 20 69 73  * false if it is
14b20 20 73 74 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e   still positive.
14b30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
14b40 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67  emoveFromSharing
14b50 4c 69 73 74 28 42 74 53 68 61 72 65 64 20 2a 70  List(BtShared *p
14b60 42 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  Bt){.#ifndef SQL
14b70 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
14b80 43 41 43 48 45 0a 20 20 4d 55 54 45 58 5f 4c 4f  CACHE.  MUTEX_LO
14b90 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  GIC( sqlite3_mut
14ba0 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 29 0a 20  ex *pMaster; ). 
14bb0 20 42 74 53 68 61 72 65 64 20 2a 70 4c 69 73 74   BtShared *pList
14bc0 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65 64 20  ;.  int removed 
14bd0 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
14be0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f  sqlite3_mutex_no
14bf0 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  theld(pBt->mutex
14c00 29 20 29 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f 47  ) );.  MUTEX_LOG
14c10 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20 73 71  IC( pMaster = sq
14c20 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
14c30 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
14c40 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20  TIC_MASTER); ). 
14c50 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
14c60 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20  nter(pMaster);. 
14c70 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20   pBt->nRef--;.  
14c80 69 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30  if( pBt->nRef<=0
14c90 20 29 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f 42   ){.    if( GLOB
14ca0 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
14cb0 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
14cc0 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20  ist)==pBt ){.   
14cd0 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72     GLOBAL(BtShar
14ce0 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
14cf0 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42  dCacheList) = pB
14d00 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65  t->pNext;.    }e
14d10 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 69 73 74  lse{.      pList
14d20 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72   = GLOBAL(BtShar
14d30 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
14d40 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20  dCacheList);.   
14d50 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53     while( ALWAYS
14d60 28 70 4c 69 73 74 29 20 26 26 20 70 4c 69 73 74  (pList) && pList
14d70 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a  ->pNext!=pBt ){.
14d80 20 20 20 20 20 20 20 20 70 4c 69 73 74 3d 70 4c          pList=pL
14d90 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ist->pNext;.    
14da0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c    }.      if( AL
14db0 57 41 59 53 28 70 4c 69 73 74 29 20 29 7b 0a 20  WAYS(pList) ){. 
14dc0 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e         pList->pN
14dd0 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74  ext = pBt->pNext
14de0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14df0 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54      if( SQLITE_T
14e00 48 52 45 41 44 53 41 46 45 20 29 7b 0a 20 20 20  HREADSAFE ){.   
14e10 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
14e20 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75 74 65 78  _free(pBt->mutex
14e30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d  );.    }.    rem
14e40 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  oved = 1;.  }.  
14e50 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
14e60 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ave(pMaster);.  
14e70 72 65 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a  return removed;.
14e80 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 31  #else.  return 1
14e90 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
14ea0 2a 20 4d 61 6b 65 20 73 75 72 65 20 70 42 74 2d  * Make sure pBt-
14eb0 3e 70 54 6d 70 53 70 61 63 65 20 70 6f 69 6e 74  >pTmpSpace point
14ec0 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69  s to an allocati
14ed0 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c  on of .** MX_CEL
14ee0 4c 5f 53 49 5a 45 28 70 42 74 29 20 62 79 74 65  L_SIZE(pBt) byte
14ef0 73 20 77 69 74 68 20 61 20 34 2d 62 79 74 65 20  s with a 4-byte 
14f00 70 72 65 66 69 78 20 66 6f 72 20 61 20 6c 65 66  prefix for a lef
14f10 74 2d 63 68 69 6c 64 0a 2a 2a 20 70 6f 69 6e 74  t-child.** point
14f20 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
14f30 69 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53  id allocateTempS
14f40 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70  pace(BtShared *p
14f50 42 74 29 7b 0a 20 20 69 66 28 20 21 70 42 74 2d  Bt){.  if( !pBt-
14f60 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20  >pTmpSpace ){.  
14f70 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65    pBt->pTmpSpace
14f80 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61   = sqlite3PageMa
14f90 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67 65 53  lloc( pBt->pageS
14fa0 69 7a 65 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f  ize );..    /* O
14fb0 6e 65 20 6f 66 20 74 68 65 20 75 73 65 73 20 6f  ne of the uses o
14fc0 66 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  f pBt->pTmpSpace
14fd0 20 69 73 20 74 6f 20 66 6f 72 6d 61 74 20 63 65   is to format ce
14fe0 6c 6c 73 20 62 65 66 6f 72 65 0a 20 20 20 20 2a  lls before.    *
14ff0 2a 20 69 6e 73 65 72 74 69 6e 67 20 74 68 65 6d  * inserting them
15000 20 69 6e 74 6f 20 61 20 6c 65 61 66 20 70 61 67   into a leaf pag
15010 65 20 28 66 75 6e 63 74 69 6f 6e 20 66 69 6c 6c  e (function fill
15020 49 6e 43 65 6c 6c 28 29 29 2e 20 49 66 0a 20 20  InCell()). If.  
15030 20 20 2a 2a 20 61 20 63 65 6c 6c 20 69 73 20 6c    ** a cell is l
15040 65 73 73 20 74 68 61 6e 20 34 20 62 79 74 65 73  ess than 4 bytes
15050 20 69 6e 20 73 69 7a 65 2c 20 69 74 20 69 73 20   in size, it is 
15060 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20  rounded up to 4 
15070 62 79 74 65 73 0a 20 20 20 20 2a 2a 20 62 79 20  bytes.    ** by 
15080 74 68 65 20 76 61 72 69 6f 75 73 20 72 6f 75 74  the various rout
15090 69 6e 65 73 20 74 68 61 74 20 6d 61 6e 69 70 75  ines that manipu
150a0 6c 61 74 65 20 62 69 6e 61 72 79 20 63 65 6c 6c  late binary cell
150b0 73 2e 20 57 68 69 63 68 0a 20 20 20 20 2a 2a 20  s. Which.    ** 
150c0 63 61 6e 20 6d 65 61 6e 20 74 68 61 74 20 66 69  can mean that fi
150d0 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e 6c 79 20  llInCell() only 
150e0 69 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20  initializes the 
150f0 66 69 72 73 74 20 32 20 6f 72 20 33 0a 20 20 20  first 2 or 3.   
15100 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 70 54 6d   ** bytes of pTm
15110 70 53 70 61 63 65 2c 20 62 75 74 20 74 68 61 74  pSpace, but that
15120 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74   the first 4 byt
15130 65 73 20 61 72 65 20 63 6f 70 69 65 64 20 66 72  es are copied fr
15140 6f 6d 0a 20 20 20 20 2a 2a 20 69 74 20 69 6e 74  om.    ** it int
15150 6f 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  o a database pag
15160 65 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  e. This is not a
15170 63 74 75 61 6c 6c 79 20 61 20 70 72 6f 62 6c 65  ctually a proble
15180 6d 2c 20 62 75 74 20 69 74 0a 20 20 20 20 2a 2a  m, but it.    **
15190 20 64 6f 65 73 20 63 61 75 73 65 20 61 20 76 61   does cause a va
151a0 6c 67 72 69 6e 64 20 65 72 72 6f 72 20 77 68 65  lgrind error whe
151b0 6e 20 74 68 65 20 31 20 6f 72 20 32 20 62 79 74  n the 1 or 2 byt
151c0 65 73 20 6f 66 20 75 6e 69 74 69 61 6c 69 7a 65  es of unitialize
151d0 64 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 69  d .    ** data i
151e0 73 20 70 61 73 73 65 64 20 74 6f 20 73 79 73 74  s passed to syst
151f0 65 6d 20 63 61 6c 6c 20 77 72 69 74 65 28 29 2e  em call write().
15200 20 53 6f 20 74 6f 20 61 76 6f 69 64 20 74 68 69   So to avoid thi
15210 73 20 65 72 72 6f 72 2c 0a 20 20 20 20 2a 2a 20  s error,.    ** 
15220 7a 65 72 6f 20 74 68 65 20 66 69 72 73 74 20 34  zero the first 4
15230 20 62 79 74 65 73 20 6f 66 20 74 65 6d 70 20 73   bytes of temp s
15240 70 61 63 65 20 68 65 72 65 2e 0a 20 20 20 20 2a  pace here..    *
15250 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 3a 20 20  *.    ** Also:  
15260 50 72 6f 76 69 64 65 20 66 6f 75 72 20 62 79 74  Provide four byt
15270 65 73 20 6f 66 20 69 6e 69 74 69 61 6c 69 7a 65  es of initialize
15280 64 20 73 70 61 63 65 20 62 65 66 6f 72 65 20 74  d space before t
15290 68 65 0a 20 20 20 20 2a 2a 20 62 65 67 69 6e 6e  he.    ** beginn
152a0 69 6e 67 20 6f 66 20 70 54 6d 70 53 70 61 63 65  ing of pTmpSpace
152b0 20 61 73 20 61 6e 20 61 72 65 61 20 61 76 61 69   as an area avai
152c0 6c 61 62 6c 65 20 74 6f 20 70 72 65 70 65 6e 64  lable to prepend
152d0 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 65 66 74   the.    ** left
152e0 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 74  -child pointer t
152f0 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  o the beginning 
15300 6f 66 20 61 20 63 65 6c 6c 2e 0a 20 20 20 20 2a  of a cell..    *
15310 2f 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70  /.    if( pBt->p
15320 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20  TmpSpace ){.    
15330 20 20 6d 65 6d 73 65 74 28 70 42 74 2d 3e 70 54    memset(pBt->pT
15340 6d 70 53 70 61 63 65 2c 20 30 2c 20 38 29 3b 0a  mpSpace, 0, 8);.
15350 20 20 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53        pBt->pTmpS
15360 70 61 63 65 20 2b 3d 20 34 3b 0a 20 20 20 20 7d  pace += 4;.    }
15370 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  .  }.}../*.** Fr
15380 65 65 20 74 68 65 20 70 42 74 2d 3e 70 54 6d 70  ee the pBt->pTmp
15390 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  Space allocation
153a0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
153b0 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 42 74  freeTempSpace(Bt
153c0 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
153d0 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  if( pBt->pTmpSpa
153e0 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70  ce ){.    pBt->p
153f0 54 6d 70 53 70 61 63 65 20 2d 3d 20 34 3b 0a 20  TmpSpace -= 4;. 
15400 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72     sqlite3PageFr
15410 65 65 28 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  ee(pBt->pTmpSpac
15420 65 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d  e);.    pBt->pTm
15430 70 53 70 61 63 65 20 3d 20 30 3b 0a 20 20 7d 0a  pSpace = 0;.  }.
15440 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
15450 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  n open database 
15460 61 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61  and invalidate a
15470 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69  ll cursors..*/.i
15480 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
15490 6c 6f 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  lose(Btree *p){.
154a0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
154b0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75  = p->pBt;.  BtCu
154c0 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f  rsor *pCur;..  /
154d0 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73  * Close all curs
154e0 6f 72 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74  ors opened via t
154f0 68 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a  his handle.  */.
15500 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
15510 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
15520 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
15530 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
15540 72 28 70 29 3b 0a 20 20 70 43 75 72 20 3d 20 70  r(p);.  pCur = p
15550 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77  Bt->pCursor;.  w
15560 68 69 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20  hile( pCur ){.  
15570 20 20 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70    BtCursor *pTmp
15580 20 3d 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75   = pCur;.    pCu
15590 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b  r = pCur->pNext;
155a0 0a 20 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70  .    if( pTmp->p
155b0 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20  Btree==p ){.    
155c0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
155d0 6f 73 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b  oseCursor(pTmp);
155e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
155f0 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63   Rollback any ac
15600 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
15610 20 61 6e 64 20 66 72 65 65 20 74 68 65 20 68 61   and free the ha
15620 6e 64 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a  ndle structure..
15630 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f    ** The call to
15640 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
15650 6c 62 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e  lback() drops an
15660 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65  y table-locks he
15670 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20  ld by.  ** this 
15680 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73  handle..  */.  s
15690 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
156a0 61 63 6b 28 70 2c 20 53 51 4c 49 54 45 5f 4f 4b  ack(p, SQLITE_OK
156b0 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  , 0);.  sqlite3B
156c0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20  treeLeave(p);.. 
156d0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
156e0 20 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74   still other out
156f0 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
15700 63 65 73 20 74 6f 20 74 68 65 20 73 68 61 72 65  ces to the share
15710 64 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72  d-btree.  ** str
15720 75 63 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e  ucture, return n
15730 6f 77 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65  ow. The remainde
15740 72 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64  r of this proced
15750 75 72 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a  ure cleans .  **
15760 20 75 70 20 74 68 65 20 73 68 61 72 65 64 2d 62   up the shared-b
15770 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  tree..  */.  ass
15780 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f  ert( p->wantToLo
15790 63 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b  ck==0 && p->lock
157a0 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 21  ed==0 );.  if( !
157b0 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 72  p->sharable || r
157c0 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67  emoveFromSharing
157d0 4c 69 73 74 28 70 42 74 29 20 29 7b 0a 20 20 20  List(pBt) ){.   
157e0 20 2f 2a 20 54 68 65 20 70 42 74 20 69 73 20 6e   /* The pBt is n
157f0 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20  o longer on the 
15800 73 68 61 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f  sharing list, so
15810 20 77 65 20 63 61 6e 20 61 63 63 65 73 73 0a 20   we can access. 
15820 20 20 20 2a 2a 20 69 74 20 77 69 74 68 6f 75 74     ** it without
15830 20 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20   having to hold 
15840 74 68 65 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a  the mutex..    *
15850 2a 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f  *.    ** Clean o
15860 75 74 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ut and delete th
15870 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  e BtShared objec
15880 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  t..    */.    as
15890 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72  sert( !pBt->pCur
158a0 73 6f 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  sor );.    sqlit
158b0 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74  e3PagerClose(pBt
158c0 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64 62 29  ->pPager, p->db)
158d0 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 78  ;.    if( pBt->x
158e0 46 72 65 65 53 63 68 65 6d 61 20 26 26 20 70 42  FreeSchema && pB
158f0 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  t->pSchema ){.  
15900 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63      pBt->xFreeSc
15910 68 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d  hema(pBt->pSchem
15920 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  a);.    }.    sq
15930 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 70  lite3DbFree(0, p
15940 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  Bt->pSchema);.  
15950 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28    freeTempSpace(
15960 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
15970 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 7d  3_free(pBt);.  }
15980 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
15990 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
159a0 48 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  HE.  assert( p->
159b0 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b  wantToLock==0 );
159c0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f  .  assert( p->lo
159d0 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28  cked==0 );.  if(
159e0 20 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70   p->pPrev ) p->p
159f0 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d  Prev->pNext = p-
15a00 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 2d  >pNext;.  if( p-
15a10 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78  >pNext ) p->pNex
15a20 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50  t->pPrev = p->pP
15a30 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73  rev;.#endif..  s
15a40 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
15a50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15a60 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  OK;.}../*.** Cha
15a70 6e 67 65 20 74 68 65 20 22 73 6f 66 74 22 20 6c  nge the "soft" l
15a80 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62  imit on the numb
15a90 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
15aa0 68 65 20 63 61 63 68 65 2e 0a 2a 2a 20 55 6e 75  he cache..** Unu
15ab0 73 65 64 20 61 6e 64 20 75 6e 6d 6f 64 69 66 69  sed and unmodifi
15ac0 65 64 20 70 61 67 65 73 20 77 69 6c 6c 20 62 65  ed pages will be
15ad0 20 72 65 63 79 63 6c 65 64 20 77 68 65 6e 20 74   recycled when t
15ae0 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
15af0 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63  pages in the cac
15b00 68 65 20 65 78 63 65 65 64 73 20 74 68 69 73 20  he exceeds this 
15b10 73 6f 66 74 20 6c 69 6d 69 74 2e 20 20 42 75 74  soft limit.  But
15b20 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
15b30 0a 2a 2a 20 63 61 63 68 65 20 69 73 20 61 6c 6c  .** cache is all
15b40 6f 77 65 64 20 74 6f 20 67 72 6f 77 20 6c 61 72  owed to grow lar
15b50 67 65 72 20 74 68 61 6e 20 74 68 69 73 20 6c 69  ger than this li
15b60 6d 69 74 20 69 66 20 69 74 20 63 6f 6e 74 61 69  mit if it contai
15b70 6e 73 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65  ns.** dirty page
15b80 73 20 6f 72 20 70 61 67 65 73 20 73 74 69 6c 6c  s or pages still
15b90 20 69 6e 20 61 63 74 69 76 65 20 75 73 65 2e 0a   in active use..
15ba0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
15bb0 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28  reeSetCacheSize(
15bc0 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78  Btree *p, int mx
15bd0 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65  Page){.  BtShare
15be0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
15bf0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
15c00 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
15c10 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
15c20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
15c30 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  er(p);.  sqlite3
15c40 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a  PagerSetCachesiz
15c50 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d  e(pBt->pPager, m
15c60 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65  xPage);.  sqlite
15c70 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
15c80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15c90 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  OK;.}../*.** Cha
15ca0 6e 67 65 20 74 68 65 20 22 73 70 69 6c 6c 22 20  nge the "spill" 
15cb0 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d  limit on the num
15cc0 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
15cd0 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 20 49 66  the cache..** If
15ce0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
15cf0 61 67 65 73 20 65 78 63 65 65 64 73 20 74 68 69  ages exceeds thi
15d00 73 20 6c 69 6d 69 74 20 64 75 72 69 6e 67 20 61  s limit during a
15d10 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
15d20 6f 6e 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65 72  on,.** the pager
15d30 20 6d 69 67 68 74 20 61 74 74 65 6d 70 74 20 74   might attempt t
15d40 6f 20 22 73 70 69 6c 6c 22 20 70 61 67 65 73 20  o "spill" pages 
15d50 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65  to the journal e
15d60 61 72 6c 79 20 69 6e 0a 2a 2a 20 6f 72 64 65 72  arly in.** order
15d70 20 74 6f 20 66 72 65 65 20 75 70 20 6d 65 6d 6f   to free up memo
15d80 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61  ry..**.** The va
15d90 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
15da0 74 68 65 20 63 75 72 72 65 6e 74 20 73 70 69 6c  the current spil
15db0 6c 20 73 69 7a 65 2e 20 20 49 66 20 7a 65 72 6f  l size.  If zero
15dc0 20 69 73 20 70 61 73 73 65 64 0a 2a 2a 20 61 73   is passed.** as
15dd0 20 61 6e 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f   an argument, no
15de0 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64   changes are mad
15df0 65 20 74 6f 20 74 68 65 20 73 70 69 6c 6c 20 73  e to the spill s
15e00 69 7a 65 20 73 65 74 74 69 6e 67 2c 20 73 6f 0a  ize setting, so.
15e10 2a 2a 20 75 73 69 6e 67 20 6d 78 50 61 67 65 20  ** using mxPage 
15e20 6f 66 20 30 20 69 73 20 61 20 77 61 79 20 74 6f  of 0 is a way to
15e30 20 71 75 65 72 79 20 74 68 65 20 63 75 72 72 65   query the curre
15e40 6e 74 20 73 70 69 6c 6c 20 73 69 7a 65 2e 0a 2a  nt spill size..*
15e50 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
15e60 65 65 53 65 74 53 70 69 6c 6c 53 69 7a 65 28 42  eeSetSpillSize(B
15e70 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50  tree *p, int mxP
15e80 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64  age){.  BtShared
15e90 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
15ea0 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 61 73 73    int res;.  ass
15eb0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
15ec0 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
15ed0 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
15ee0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
15ef0 0a 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33  .  res = sqlite3
15f00 50 61 67 65 72 53 65 74 53 70 69 6c 6c 73 69 7a  PagerSetSpillsiz
15f10 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d  e(pBt->pPager, m
15f20 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65  xPage);.  sqlite
15f30 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
15f40 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
15f50 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
15f60 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a  MMAP_SIZE>0./*.*
15f70 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69 6d  * Change the lim
15f80 69 74 20 6f 6e 20 74 68 65 20 61 6d 6f 75 6e 74  it on the amount
15f90 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
15fa0 20 66 69 6c 65 20 74 68 61 74 20 6d 61 79 20 62   file that may b
15fb0 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6d 61 70 70  e.** memory mapp
15fc0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
15fd0 65 33 42 74 72 65 65 53 65 74 4d 6d 61 70 4c 69  e3BtreeSetMmapLi
15fe0 6d 69 74 28 42 74 72 65 65 20 2a 70 2c 20 73 71  mit(Btree *p, sq
15ff0 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d  lite3_int64 szMm
16000 61 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ap){.  BtShared 
16010 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
16020 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
16030 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
16040 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
16050 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
16060 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  (p);.  sqlite3Pa
16070 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28  gerSetMmapLimit(
16080 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 73 7a 4d  pBt->pPager, szM
16090 6d 61 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  map);.  sqlite3B
160a0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
160b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
160c0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
160d0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
160e0 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  ZE>0 */../*.** C
160f0 68 61 6e 67 65 20 74 68 65 20 77 61 79 20 64 61  hange the way da
16100 74 61 20 69 73 20 73 79 6e 63 65 64 20 74 6f 20  ta is synced to 
16110 64 69 73 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f  disk in order to
16120 20 69 6e 63 72 65 61 73 65 20 6f 72 20 64 65 63   increase or dec
16130 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c  rease.** how wel
16140 6c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 72  l the database r
16150 65 73 69 73 74 73 20 64 61 6d 61 67 65 20 64 75  esists damage du
16160 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20  e to OS crashes 
16170 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69  and power.** fai
16180 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c 20 31 20  lures.  Level 1 
16190 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 61  is the same as a
161a0 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20  synchronous (no 
161b0 73 79 6e 63 73 28 29 20 6f 63 63 75 72 20 61 6e  syncs() occur an
161c0 64 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20  d.** there is a 
161d0 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79  high probability
161e0 20 6f 66 20 64 61 6d 61 67 65 29 20 20 4c 65 76   of damage)  Lev
161f0 65 6c 20 32 20 69 73 20 74 68 65 20 64 65 66 61  el 2 is the defa
16200 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69  ult.  There.** i
16210 73 20 61 20 76 65 72 79 20 6c 6f 77 20 62 75 74  s a very low but
16220 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62   non-zero probab
16230 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 2e  ility of damage.
16240 20 20 4c 65 76 65 6c 20 33 20 72 65 64 75 63 65    Level 3 reduce
16250 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69  s the.** probabi
16260 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 20 74  lity of damage t
16270 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62 75 74 20  o near zero but 
16280 77 69 74 68 20 61 20 77 72 69 74 65 20 70 65 72  with a write per
16290 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69  formance reducti
162a0 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  on..*/.#ifndef S
162b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
162c0 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c  _PRAGMAS.int sql
162d0 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65  ite3BtreeSetPage
162e0 72 46 6c 61 67 73 28 0a 20 20 42 74 72 65 65 20  rFlags(.  Btree 
162f0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
16300 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 74 6f   /* The btree to
16310 20 73 65 74 20 74 68 65 20 73 61 66 65 74 79 20   set the safety 
16320 6c 65 76 65 6c 20 6f 6e 20 2a 2f 0a 20 20 75 6e  level on */.  un
16330 73 69 67 6e 65 64 20 70 67 46 6c 61 67 73 20 20  signed pgFlags  
16340 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20       /* Various 
16350 50 41 47 45 52 5f 2a 20 66 6c 61 67 73 20 2a 2f  PAGER_* flags */
16360 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  .){.  BtShared *
16370 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
16380 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
16390 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
163a0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
163b0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
163c0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  p);.  sqlite3Pag
163d0 65 72 53 65 74 46 6c 61 67 73 28 70 42 74 2d 3e  erSetFlags(pBt->
163e0 70 50 61 67 65 72 2c 20 70 67 46 6c 61 67 73 29  pPager, pgFlags)
163f0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
16400 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
16410 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
16420 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68  #endif../*.** Ch
16430 61 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c 74  ange the default
16440 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e 64 20   pages size and 
16450 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
16460 73 65 72 76 65 64 20 62 79 74 65 73 20 70 65 72  served bytes per
16470 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66   page..** Or, if
16480 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 68   the page size h
16490 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
164a0 66 69 78 65 64 2c 20 72 65 74 75 72 6e 20 53 51  fixed, return SQ
164b0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a  LITE_READONLY .*
164c0 2a 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69  * without changi
164d0 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a  ng anything..**.
164e0 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65  ** The page size
164f0 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72   must be a power
16500 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35 31   of 2 between 51
16510 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20 49 66  2 and 65536.  If
16520 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a   the page.** siz
16530 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73 20  e supplied does 
16540 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63 6f  not meet this co
16550 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74 68  nstraint then th
16560 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e  e page size is n
16570 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a  ot.** changed..*
16580 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 73 20  *.** Page sizes 
16590 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 64 20  are constrained 
165a0 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66  to be a power of
165b0 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74 68 65   two so that the
165c0 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68   region.** of th
165d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
165e0 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67  used for locking
165f0 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 50   (beginning at P
16600 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20  ENDING_BYTE,.** 
16610 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 70  the first byte p
16620 61 73 74 20 74 68 65 20 31 47 42 20 62 6f 75 6e  ast the 1GB boun
16630 64 61 72 79 2c 20 30 78 34 30 30 30 30 30 30 30  dary, 0x40000000
16640 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63 75 72  ) needs to occur
16650 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e  .** at the begin
16660 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65 2e 0a  ning of a page..
16670 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74  **.** If paramet
16680 65 72 20 6e 52 65 73 65 72 76 65 20 69 73 20 6c  er nReserve is l
16690 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ess than zero, t
166a0 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
166b0 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20 62 79  f reserved.** by
166c0 74 65 73 20 70 65 72 20 70 61 67 65 20 69 73 20  tes per page is 
166d0 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a  left unchanged..
166e0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 46 69  **.** If the iFi
166f0 78 21 3d 30 20 74 68 65 6e 20 74 68 65 20 42 54  x!=0 then the BT
16700 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44  S_PAGESIZE_FIXED
16710 20 66 6c 61 67 20 69 73 20 73 65 74 20 73 6f 20   flag is set so 
16720 74 68 61 74 20 74 68 65 20 70 61 67 65 20 73 69  that the page si
16730 7a 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f 76 61  ze.** and autova
16740 63 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20 6e 6f  cuum mode can no
16750 20 6c 6f 6e 67 65 72 20 62 65 20 63 68 61 6e 67   longer be chang
16760 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
16770 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69  e3BtreeSetPageSi
16780 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ze(Btree *p, int
16790 20 70 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e   pageSize, int n
167a0 52 65 73 65 72 76 65 2c 20 69 6e 74 20 69 46 69  Reserve, int iFi
167b0 78 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  x){.  int rc = S
167c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68  QLITE_OK;.  BtSh
167d0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
167e0 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52  Bt;.  assert( nR
167f0 65 73 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e 52  eserve>=-1 && nR
16800 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20  eserve<=255 );. 
16810 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
16820 65 72 28 70 29 3b 0a 23 69 66 20 53 51 4c 49 54  er(p);.#if SQLIT
16830 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66  E_HAS_CODEC.  if
16840 28 20 6e 52 65 73 65 72 76 65 3e 70 42 74 2d 3e  ( nReserve>pBt->
16850 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20 29  optimalReserve )
16860 20 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73   pBt->optimalRes
16870 65 72 76 65 20 3d 20 28 75 38 29 6e 52 65 73 65  erve = (u8)nRese
16880 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  rve;.#endif.  if
16890 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ( pBt->btsFlags 
168a0 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46  & BTS_PAGESIZE_F
168b0 49 58 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69  IXED ){.    sqli
168c0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
168d0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
168e0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
168f0 7d 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76 65  }.  if( nReserve
16900 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65 73 65 72  <0 ){.    nReser
16910 76 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  ve = pBt->pageSi
16920 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze - pBt->usable
16930 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65  Size;.  }.  asse
16940 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20  rt( nReserve>=0 
16950 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35  && nReserve<=255
16960 20 29 3b 0a 20 20 69 66 28 20 70 61 67 65 53 69   );.  if( pageSi
16970 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53  ze>=512 && pageS
16980 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ize<=SQLITE_MAX_
16990 50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20 20 20  PAGE_SIZE &&.   
169a0 20 20 20 20 20 28 28 70 61 67 65 53 69 7a 65 2d       ((pageSize-
169b0 31 29 26 70 61 67 65 53 69 7a 65 29 3d 3d 30 20  1)&pageSize)==0 
169c0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  ){.    assert( (
169d0 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30  pageSize & 7)==0
169e0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
169f0 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b  !pBt->pCursor );
16a00 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69  .    pBt->pageSi
16a10 7a 65 20 3d 20 28 75 33 32 29 70 61 67 65 53 69  ze = (u32)pageSi
16a20 7a 65 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70  ze;.    freeTemp
16a30 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 7d 0a  Space(pBt);.  }.
16a40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
16a50 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
16a60 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
16a70 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73  ->pageSize, nRes
16a80 65 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e 75 73  erve);.  pBt->us
16a90 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
16aa0 70 61 67 65 53 69 7a 65 20 2d 20 28 75 31 36 29  pageSize - (u16)
16ab0 6e 52 65 73 65 72 76 65 3b 0a 20 20 69 66 28 20  nReserve;.  if( 
16ac0 69 46 69 78 20 29 20 70 42 74 2d 3e 62 74 73 46  iFix ) pBt->btsF
16ad0 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45  lags |= BTS_PAGE
16ae0 53 49 5a 45 5f 46 49 58 45 44 3b 0a 20 20 73 71  SIZE_FIXED;.  sq
16af0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
16b00 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
16b10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
16b20 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64   the currently d
16b30 65 66 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65  efined page size
16b40 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
16b50 74 72 65 65 47 65 74 50 61 67 65 53 69 7a 65 28  treeGetPageSize(
16b60 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74  Btree *p){.  ret
16b70 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65  urn p->pBt->page
16b80 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Size;.}../*.** T
16b90 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
16ba0 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74  similar to sqlit
16bb0 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76  e3BtreeGetReserv
16bc0 65 28 29 2c 20 65 78 63 65 70 74 20 74 68 61 74  e(), except that
16bd0 20 69 74 0a 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20   it.** may only 
16be0 62 65 20 63 61 6c 6c 65 64 20 69 66 20 69 74 20  be called if it 
16bf0 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68  is guaranteed th
16c00 61 74 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75  at the b-tree mu
16c10 74 65 78 20 69 73 20 61 6c 72 65 61 64 79 0a 2a  tex is already.*
16c20 2a 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  * held..**.** Th
16c30 69 73 20 69 73 20 75 73 65 66 75 6c 20 69 6e 20  is is useful in 
16c40 6f 6e 65 20 73 70 65 63 69 61 6c 20 63 61 73 65  one special case
16c50 20 69 6e 20 74 68 65 20 62 61 63 6b 75 70 20 41   in the backup A
16c60 50 49 20 63 6f 64 65 20 77 68 65 72 65 20 69 74  PI code where it
16c70 20 69 73 0a 2a 2a 20 6b 6e 6f 77 6e 20 74 68 61   is.** known tha
16c80 74 20 74 68 65 20 73 68 61 72 65 64 20 62 2d 74  t the shared b-t
16c90 72 65 65 20 6d 75 74 65 78 20 69 73 20 68 65 6c  ree mutex is hel
16ca0 64 2c 20 62 75 74 20 74 68 65 20 6d 75 74 65 78  d, but the mutex
16cb0 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61   on the .** data
16cc0 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74  base handle that
16cd0 20 6f 77 6e 73 20 2a 70 20 69 73 20 6e 6f 74 2e   owns *p is not.
16ce0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 66   In this case if
16cf0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
16d00 65 72 28 29 0a 2a 2a 20 77 65 72 65 20 74 6f 20  er().** were to 
16d10 62 65 20 63 61 6c 6c 65 64 2c 20 69 74 20 6d 69  be called, it mi
16d20 67 68 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68  ght collide with
16d30 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70 65 72   some other oper
16d40 61 74 69 6f 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  ation on the.** 
16d50 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
16d60 74 68 61 74 20 6f 77 6e 73 20 2a 70 2c 20 63 61  that owns *p, ca
16d70 75 73 69 6e 67 20 75 6e 64 65 66 69 6e 65 64 20  using undefined 
16d80 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74  behavior..*/.int
16d90 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
16da0 52 65 73 65 72 76 65 4e 6f 4d 75 74 65 78 28 42  ReserveNoMutex(B
16db0 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
16dc0 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  n;.  assert( sql
16dd0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
16de0 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  p->pBt->mutex) )
16df0 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e  ;.  n = p->pBt->
16e00 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42  pageSize - p->pB
16e10 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
16e20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
16e30 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
16e40 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
16e50 66 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65  f space at the e
16e60 6e 64 20 6f 66 20 65 76 65 72 79 20 70 61 67 65  nd of every page
16e70 20 74 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74   that.** are int
16e80 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e  entually left un
16e90 75 73 65 64 2e 20 20 54 68 69 73 20 69 73 20 74  used.  This is t
16ea0 68 65 20 22 72 65 73 65 72 76 65 64 22 20 73 70  he "reserved" sp
16eb0 61 63 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 73  ace that is.** s
16ec0 6f 6d 65 74 69 6d 65 73 20 75 73 65 64 20 62 79  ometimes used by
16ed0 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2a 0a   extensions..**.
16ee0 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 48 41 53  ** If SQLITE_HAS
16ef0 5f 4d 55 54 45 58 20 69 73 20 64 65 66 69 6e 65  _MUTEX is define
16f00 64 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  d then the numbe
16f10 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68  r returned is th
16f20 65 0a 2a 2a 20 67 72 65 61 74 65 72 20 6f 66 20  e.** greater of 
16f30 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 73 65  the current rese
16f40 72 76 65 64 20 73 70 61 63 65 20 61 6e 64 20 74  rved space and t
16f50 68 65 20 6d 61 78 69 6d 75 6d 20 72 65 71 75 65  he maximum reque
16f60 73 74 65 64 0a 2a 2a 20 72 65 73 65 72 76 65 20  sted.** reserve 
16f70 73 70 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  space..*/.int sq
16f80 6c 69 74 65 33 42 74 72 65 65 47 65 74 4f 70 74  lite3BtreeGetOpt
16f90 69 6d 61 6c 52 65 73 65 72 76 65 28 42 74 72 65  imalReserve(Btre
16fa0 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  e *p){.  int n;.
16fb0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
16fc0 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71  ter(p);.  n = sq
16fd0 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73  lite3BtreeGetRes
16fe0 65 72 76 65 4e 6f 4d 75 74 65 78 28 70 29 3b 0a  erveNoMutex(p);.
16ff0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
17000 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 6e 3c  S_CODEC.  if( n<
17010 70 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52  p->pBt->optimalR
17020 65 73 65 72 76 65 20 29 20 6e 20 3d 20 70 2d 3e  eserve ) n = p->
17030 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65  pBt->optimalRese
17040 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  rve;.#endif.  sq
17050 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
17060 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a  p);.  return n;.
17070 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  }.../*.** Set th
17080 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  e maximum page c
17090 6f 75 6e 74 20 66 6f 72 20 61 20 64 61 74 61 62  ount for a datab
170a0 61 73 65 20 69 66 20 6d 78 50 61 67 65 20 69 73  ase if mxPage is
170b0 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f   positive..** No
170c0 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64   changes are mad
170d0 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 30  e if mxPage is 0
170e0 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a   or negative..**
170f0 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74   Regardless of t
17100 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61  he value of mxPa
17110 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6d  ge, return the m
17120 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
17130 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
17140 33 42 74 72 65 65 4d 61 78 50 61 67 65 43 6f 75  3BtreeMaxPageCou
17150 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  nt(Btree *p, int
17160 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   mxPage){.  int 
17170 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  n;.  sqlite3Btre
17180 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d  eEnter(p);.  n =
17190 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78   sqlite3PagerMax
171a0 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74  PageCount(p->pBt
171b0 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65  ->pPager, mxPage
171c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
171d0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
171e0 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
171f0 53 65 74 20 74 68 65 20 42 54 53 5f 53 45 43 55  Set the BTS_SECU
17200 52 45 5f 44 45 4c 45 54 45 20 66 6c 61 67 20 69  RE_DELETE flag i
17210 66 20 6e 65 77 46 6c 61 67 20 69 73 20 30 20 6f  f newFlag is 0 o
17220 72 20 31 2e 20 20 49 66 20 6e 65 77 46 6c 61 67  r 1.  If newFlag
17230 20 69 73 20 2d 31 2c 0a 2a 2a 20 74 68 65 6e 20   is -1,.** then 
17240 6d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 2e  make no changes.
17250 20 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20    Always return 
17260 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
17270 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
17280 54 45 0a 2a 2a 20 73 65 74 74 69 6e 67 20 61 66  TE.** setting af
17290 74 65 72 20 74 68 65 20 63 68 61 6e 67 65 2e 0a  ter the change..
172a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
172b0 72 65 65 53 65 63 75 72 65 44 65 6c 65 74 65 28  reeSecureDelete(
172c0 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e 65  Btree *p, int ne
172d0 77 46 6c 61 67 29 7b 0a 20 20 69 6e 74 20 62 3b  wFlag){.  int b;
172e0 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
172f0 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65  turn 0;.  sqlite
17300 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
17310 20 20 69 66 28 20 6e 65 77 46 6c 61 67 3e 3d 30    if( newFlag>=0
17320 20 29 7b 0a 20 20 20 20 70 2d 3e 70 42 74 2d 3e   ){.    p->pBt->
17330 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53  btsFlags &= ~BTS
17340 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a  _SECURE_DELETE;.
17350 20 20 20 20 69 66 28 20 6e 65 77 46 6c 61 67 20      if( newFlag 
17360 29 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61  ) p->pBt->btsFla
17370 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45  gs |= BTS_SECURE
17380 5f 44 45 4c 45 54 45 3b 0a 20 20 7d 20 0a 20 20  _DELETE;.  } .  
17390 62 20 3d 20 28 70 2d 3e 70 42 74 2d 3e 62 74 73  b = (p->pBt->bts
173a0 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55  Flags & BTS_SECU
173b0 52 45 5f 44 45 4c 45 54 45 29 21 3d 30 3b 0a 20  RE_DELETE)!=0;. 
173c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
173d0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
173e0 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  b;.}../*.** Chan
173f0 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63  ge the 'auto-vac
17400 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20 6f 66  uum' property of
17410 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
17420 66 20 74 68 65 20 27 61 75 74 6f 56 61 63 75 75  f the 'autoVacuu
17430 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  m'.** parameter 
17440 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
17450 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f  n auto-vacuum mo
17460 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 49  de is enabled. I
17470 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73  f zero, it.** is
17480 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65 20 64   disabled. The d
17490 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72  efault value for
174a0 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d   the auto-vacuum
174b0 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a   property is .**
174c0 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
174d0 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  he SQLITE_DEFAUL
174e0 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d 61 63  T_AUTOVACUUM mac
174f0 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ro..*/.int sqlit
17500 65 33 42 74 72 65 65 53 65 74 41 75 74 6f 56 61  e3BtreeSetAutoVa
17510 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c 20 69  cuum(Btree *p, i
17520 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a  nt autoVacuum){.
17530 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
17540 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
17550 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
17560 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20  ADONLY;.#else.  
17570 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
17580 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63  p->pBt;.  int rc
17590 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
175a0 75 38 20 61 76 20 3d 20 28 75 38 29 61 75 74 6f  u8 av = (u8)auto
175b0 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74  Vacuum;..  sqlit
175c0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
175d0 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73  .  if( (pBt->bts
175e0 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41 47 45  Flags & BTS_PAGE
175f0 53 49 5a 45 5f 46 49 58 45 44 29 21 3d 30 20 26  SIZE_FIXED)!=0 &
17600 26 20 28 61 76 20 3f 31 3a 30 29 21 3d 70 42 74  & (av ?1:0)!=pBt
17610 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
17620 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
17630 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73  READONLY;.  }els
17640 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f  e{.    pBt->auto
17650 56 61 63 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30  Vacuum = av ?1:0
17660 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56  ;.    pBt->incrV
17670 61 63 75 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31  acuum = av==2 ?1
17680 3a 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  :0;.  }.  sqlite
17690 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
176a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e    return rc;.#en
176b0 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  dif.}../*.** Ret
176c0 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66  urn the value of
176d0 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75   the 'auto-vacuu
176e0 6d 27 20 70 72 6f 70 65 72 74 79 2e 20 49 66 20  m' property. If 
176f0 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a  auto-vacuum is .
17700 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20 69 73 20  ** enabled 1 is 
17710 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
17720 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ise 0..*/.int sq
17730 6c 69 74 65 33 42 74 72 65 65 47 65 74 41 75 74  lite3BtreeGetAut
17740 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70  oVacuum(Btree *p
17750 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
17760 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
17770 0a 20 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f  .  return BTREE_
17780 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b  AUTOVACUUM_NONE;
17790 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b  .#else.  int rc;
177a0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
177b0 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20  nter(p);.  rc = 
177c0 28 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e  (.    (!p->pBt->
177d0 61 75 74 6f 56 61 63 75 75 6d 29 3f 42 54 52 45  autoVacuum)?BTRE
177e0 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e  E_AUTOVACUUM_NON
177f0 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d  E:.    (!p->pBt-
17800 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f 42 54 52  >incrVacuum)?BTR
17810 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46 55  EE_AUTOVACUUM_FU
17820 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f 41 55  LL:.    BTREE_AU
17830 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20  TOVACUUM_INCR.  
17840 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
17850 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
17860 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d  urn rc;.#endif.}
17870 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72  .../*.** Get a r
17880 65 66 65 72 65 6e 63 65 20 74 6f 20 70 50 61 67  eference to pPag
17890 65 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  e1 of the databa
178a0 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20 77  se file.  This w
178b0 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75  ill.** also acqu
178c0 69 72 65 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f  ire a readlock o
178d0 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a  n that file..**.
178e0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
178f0 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
17900 65 73 73 2e 20 20 49 66 20 74 68 65 20 66 69 6c  ess.  If the fil
17910 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65  e is not a.** we
17920 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61  ll-formed databa
17930 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 53 51  se file, then SQ
17940 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 73 20  LITE_CORRUPT is 
17950 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c  returned..** SQL
17960 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
17970 72 6e 65 64 20 69 66 20 74 68 65 20 64 61 74 61  rned if the data
17980 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20  base is locked. 
17990 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a   SQLITE_NOMEM.**
179a0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
179b0 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65  we run out of me
179c0 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  mory. .*/.static
179d0 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65 28 42   int lockBtree(B
179e0 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
179f0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
17a00 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
17a10 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e  code from subfun
17a20 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50  ctions */.  MemP
17a30 61 67 65 20 2a 70 50 61 67 65 31 3b 20 20 20 20  age *pPage1;    
17a40 20 2f 2a 20 50 61 67 65 20 31 20 6f 66 20 74 68   /* Page 1 of th
17a50 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
17a60 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20  */.  int nPage; 
17a70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
17a80 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
17a90 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
17aa0 20 20 69 6e 74 20 6e 50 61 67 65 46 69 6c 65 20    int nPageFile 
17ab0 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72  = 0;   /* Number
17ac0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
17ad0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
17ae0 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 48 65 61  /.  int nPageHea
17af0 64 65 72 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  der;     /* Numb
17b00 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
17b10 68 65 20 64 61 74 61 62 61 73 65 20 61 63 63 6f  he database acco
17b20 72 64 69 6e 67 20 74 6f 20 68 64 72 20 2a 2f 0a  rding to hdr */.
17b30 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
17b40 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
17b50 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
17b60 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
17b70 65 31 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20  e1==0 );.  rc = 
17b80 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72  sqlite3PagerShar
17b90 65 64 4c 6f 63 6b 28 70 42 74 2d 3e 70 50 61 67  edLock(pBt->pPag
17ba0 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  er);.  if( rc!=S
17bb0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
17bc0 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 62 74 72  n rc;.  rc = btr
17bd0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31  eeGetPage(pBt, 1
17be0 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3b 0a 20  , &pPage1, 0);. 
17bf0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17c00 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
17c10 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68  .  /* Do some ch
17c20 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20 69  ecking to help i
17c30 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65 20 77  nsure the file w
17c40 65 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79 20  e opened really 
17c50 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64 20  is.  ** a valid 
17c60 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a  database file. .
17c70 20 20 2a 2f 0a 20 20 6e 50 61 67 65 20 3d 20 6e    */.  nPage = n
17c80 50 61 67 65 48 65 61 64 65 72 20 3d 20 67 65 74  PageHeader = get
17c90 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29 70 50  4byte(28+(u8*)pP
17ca0 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20  age1->aData);.  
17cb0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
17cc0 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
17cd0 72 2c 20 26 6e 50 61 67 65 46 69 6c 65 29 3b 0a  r, &nPageFile);.
17ce0 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 7c    if( nPage==0 |
17cf0 7c 20 6d 65 6d 63 6d 70 28 32 34 2b 28 75 38 2a  | memcmp(24+(u8*
17d00 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20  )pPage1->aData, 
17d10 39 32 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e  92+(u8*)pPage1->
17d20 61 44 61 74 61 2c 34 29 21 3d 30 20 29 7b 0a 20  aData,4)!=0 ){. 
17d30 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65     nPage = nPage
17d40 46 69 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  File;.  }.  if( 
17d50 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 75  nPage>0 ){.    u
17d60 33 32 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  32 pageSize;.   
17d70 20 75 33 32 20 75 73 61 62 6c 65 53 69 7a 65 3b   u32 usableSize;
17d80 0a 20 20 20 20 75 38 20 2a 70 61 67 65 31 20 3d  .    u8 *page1 =
17d90 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a   pPage1->aData;.
17da0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
17db0 4e 4f 54 41 44 42 3b 0a 20 20 20 20 2f 2a 20 45  NOTADB;.    /* E
17dc0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33  VIDENCE-OF: R-43
17dd0 37 33 37 2d 33 39 39 39 39 20 45 76 65 72 79 20  737-39999 Every 
17de0 76 61 6c 69 64 20 53 51 4c 69 74 65 20 64 61 74  valid SQLite dat
17df0 61 62 61 73 65 20 66 69 6c 65 20 62 65 67 69 6e  abase file begin
17e00 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68  s.    ** with th
17e10 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 31 36 20 62  e following 16 b
17e20 79 74 65 73 20 28 69 6e 20 68 65 78 29 3a 20 35  ytes (in hex): 5
17e30 33 20 35 31 20 34 63 20 36 39 20 37 34 20 36 35  3 51 4c 69 74 65
17e40 20 32 30 20 36 36 20 36 66 20 37 32 20 36 64 0a   20 66 6f 72 6d.
17e50 20 20 20 20 2a 2a 20 36 31 20 37 34 20 32 30 20      ** 61 74 20 
17e60 33 33 20 30 30 2e 20 2a 2f 0a 20 20 20 20 69 66  33 00. */.    if
17e70 28 20 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c 20  ( memcmp(page1, 
17e80 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 31 36  zMagicHeader, 16
17e90 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  )!=0 ){.      go
17ea0 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
17eb0 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  iled;.    }..#if
17ec0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17ed0 57 41 4c 0a 20 20 20 20 69 66 28 20 70 61 67 65  WAL.    if( page
17ee0 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20  1[18]>1 ){.     
17ef0 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
17f00 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b  = BTS_READ_ONLY;
17f10 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
17f20 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20  age1[19]>1 ){.  
17f30 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
17f40 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
17f50 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20  }.#else.    if( 
17f60 70 61 67 65 31 5b 31 38 5d 3e 32 20 29 7b 0a 20  page1[18]>2 ){. 
17f70 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61       pBt->btsFla
17f80 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f  gs |= BTS_READ_O
17f90 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  NLY;.    }.    i
17fa0 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 32 20 29  f( page1[19]>2 )
17fb0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
17fc0 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
17fd0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
17fe0 20 74 68 65 20 77 72 69 74 65 20 76 65 72 73 69   the write versi
17ff0 6f 6e 20 69 73 20 73 65 74 20 74 6f 20 32 2c 20  on is set to 2, 
18000 74 68 69 73 20 64 61 74 61 62 61 73 65 20 73 68  this database sh
18010 6f 75 6c 64 20 62 65 20 61 63 63 65 73 73 65 64  ould be accessed
18020 0a 20 20 20 20 2a 2a 20 69 6e 20 57 41 4c 20 6d  .    ** in WAL m
18030 6f 64 65 2e 20 49 66 20 74 68 65 20 6c 6f 67 20  ode. If the log 
18040 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f  is not already o
18050 70 65 6e 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77  pen, open it now
18060 2e 20 54 68 65 6e 20 0a 20 20 20 20 2a 2a 20 72  . Then .    ** r
18070 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
18080 61 6e 64 20 72 65 74 75 72 6e 20 77 69 74 68 6f  and return witho
18090 75 74 20 70 6f 70 75 6c 61 74 69 6e 67 20 42 74  ut populating Bt
180a0 53 68 61 72 65 64 2e 70 50 61 67 65 31 2e 0a 20  Shared.pPage1.. 
180b0 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72     ** The caller
180c0 20 64 65 74 65 63 74 73 20 74 68 69 73 20 61 6e   detects this an
180d0 64 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e  d calls this fun
180e0 63 74 69 6f 6e 20 61 67 61 69 6e 2e 20 54 68 69  ction again. Thi
180f0 73 20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71 75  s is.    ** requ
18100 69 72 65 64 20 61 73 20 74 68 65 20 76 65 72 73  ired as the vers
18110 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 63 75  ion of page 1 cu
18120 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70  rrently in the p
18130 61 67 65 31 20 62 75 66 66 65 72 0a 20 20 20 20  age1 buffer.    
18140 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 68  ** may not be th
18150 65 20 6c 61 74 65 73 74 20 76 65 72 73 69 6f 6e  e latest version
18160 20 2d 20 74 68 65 72 65 20 6d 61 79 20 62 65 20   - there may be 
18170 61 20 6e 65 77 65 72 20 6f 6e 65 20 69 6e 20 74  a newer one in t
18180 68 65 20 6c 6f 67 0a 20 20 20 20 2a 2a 20 66 69  he log.    ** fi
18190 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  le..    */.    i
181a0 66 28 20 70 61 67 65 31 5b 31 39 5d 3d 3d 32 20  f( page1[19]==2 
181b0 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  && (pBt->btsFlag
181c0 73 20 26 20 42 54 53 5f 4e 4f 5f 57 41 4c 29 3d  s & BTS_NO_WAL)=
181d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
181e0 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20  isOpen = 0;.    
181f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
18200 67 65 72 4f 70 65 6e 57 61 6c 28 70 42 74 2d 3e  gerOpenWal(pBt->
18210 70 50 61 67 65 72 2c 20 26 69 73 4f 70 65 6e 29  pPager, &isOpen)
18220 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
18230 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18240 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
18250 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
18260 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 20 53 51     }else{.#if SQ
18270 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 59 4e  LITE_DEFAULT_SYN
18280 43 48 52 4f 4e 4f 55 53 21 3d 53 51 4c 49 54 45  CHRONOUS!=SQLITE
18290 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53 59 4e  _DEFAULT_WAL_SYN
182a0 43 48 52 4f 4e 4f 55 53 0a 20 20 20 20 20 20 20  CHRONOUS.       
182b0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
182c0 20 20 20 20 20 20 44 62 20 2a 70 44 62 3b 0a 20        Db *pDb;. 
182d0 20 20 20 20 20 20 20 69 66 28 20 28 64 62 3d 70         if( (db=p
182e0 42 74 2d 3e 64 62 29 21 3d 30 20 26 26 20 28 70  Bt->db)!=0 && (p
182f0 44 62 3d 64 62 2d 3e 61 44 62 29 21 3d 30 20 29  Db=db->aDb)!=0 )
18300 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  {.          whil
18310 65 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 7c  e( pDb->pBt==0 |
18320 7c 20 70 44 62 2d 3e 70 42 74 2d 3e 70 42 74 21  | pDb->pBt->pBt!
18330 3d 70 42 74 20 29 7b 20 70 44 62 2b 2b 3b 20 7d  =pBt ){ pDb++; }
18340 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
18350 44 62 2d 3e 62 53 79 6e 63 53 65 74 3d 3d 30 0a  Db->bSyncSet==0.
18360 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 44             && pD
18370 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 3d  b->safety_level=
18380 3d 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  =SQLITE_DEFAULT_
18390 53 59 4e 43 48 52 4f 4e 4f 55 53 2b 31 0a 20 20  SYNCHRONOUS+1.  
183a0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
183b0 20 20 20 20 20 20 20 70 44 62 2d 3e 73 61 66 65         pDb->safe
183c0 74 79 5f 6c 65 76 65 6c 20 3d 20 53 51 4c 49 54  ty_level = SQLIT
183d0 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53 59  E_DEFAULT_WAL_SY
183e0 4e 43 48 52 4f 4e 4f 55 53 2b 31 3b 0a 20 20 20  NCHRONOUS+1;.   
183f0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
18400 50 61 67 65 72 53 65 74 46 6c 61 67 73 28 70 42  PagerSetFlags(pB
18410 74 2d 3e 70 50 61 67 65 72 2c 0a 20 20 20 20 20  t->pPager,.     
18420 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73            pDb->s
18430 61 66 65 74 79 5f 6c 65 76 65 6c 20 7c 20 28 64  afety_level | (d
18440 62 2d 3e 66 6c 61 67 73 20 26 20 50 41 47 45 52  b->flags & PAGER
18450 5f 46 4c 41 47 53 5f 4d 41 53 4b 29 29 3b 0a 20  _FLAGS_MASK));. 
18460 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
18470 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
18480 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d      if( isOpen==
18490 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
184a0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
184b0 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  1);.          re
184c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
184d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
184e0 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  }.      rc = SQL
184f0 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20  ITE_NOTADB;.    
18500 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
18510 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
18520 31 35 34 36 35 2d 32 30 38 31 33 20 54 68 65 20  15465-20813 The 
18530 6d 61 78 69 6d 75 6d 20 61 6e 64 20 6d 69 6e 69  maximum and mini
18540 6d 75 6d 20 65 6d 62 65 64 64 65 64 20 70 61 79  mum embedded pay
18550 6c 6f 61 64 0a 20 20 20 20 2a 2a 20 66 72 61 63  load.    ** frac
18560 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 6c 65  tions and the le
18570 61 66 20 70 61 79 6c 6f 61 64 20 66 72 61 63 74  af payload fract
18580 69 6f 6e 20 76 61 6c 75 65 73 20 6d 75 73 74 20  ion values must 
18590 62 65 20 36 34 2c 20 33 32 2c 20 61 6e 64 20 33  be 64, 32, and 3
185a0 32 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  2..    **.    **
185b0 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65   The original de
185c0 73 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65  sign allowed the
185d0 73 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61  se amounts to va
185e0 72 79 2c 20 62 75 74 20 61 73 20 6f 66 0a 20 20  ry, but as of.  
185f0 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36    ** version 3.6
18600 2e 30 2c 20 77 65 20 72 65 71 75 69 72 65 20 74  .0, we require t
18610 68 65 6d 20 74 6f 20 62 65 20 66 69 78 65 64 2e  hem to be fixed.
18620 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
18630 6d 65 6d 63 6d 70 28 26 70 61 67 65 31 5b 32 31  memcmp(&page1[21
18640 5d 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30 34 30  ], "\100\040\040
18650 22 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ",3)!=0 ){.     
18660 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
18670 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
18680 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
18690 46 3a 20 52 2d 35 31 38 37 33 2d 33 39 36 31 38  F: R-51873-39618
186a0 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 66   The page size f
186b0 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 66 69  or a database fi
186c0 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74  le is.    ** det
186d0 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 32  ermined by the 2
186e0 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 6c 6f  -byte integer lo
186f0 63 61 74 65 64 20 61 74 20 61 6e 20 6f 66 66 73  cated at an offs
18700 65 74 20 6f 66 20 31 36 20 62 79 74 65 73 20 66  et of 16 bytes f
18710 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 62  rom.    ** the b
18720 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
18730 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
18740 2f 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d  /.    pageSize =
18750 20 28 70 61 67 65 31 5b 31 36 5d 3c 3c 38 29 20   (page1[16]<<8) 
18760 7c 20 28 70 61 67 65 31 5b 31 37 5d 3c 3c 31 36  | (page1[17]<<16
18770 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  );.    /* EVIDEN
18780 43 45 2d 4f 46 3a 20 52 2d 32 35 30 30 38 2d 32  CE-OF: R-25008-2
18790 31 36 38 38 20 54 68 65 20 73 69 7a 65 20 6f 66  1688 The size of
187a0 20 61 20 70 61 67 65 20 69 73 20 61 20 70 6f 77   a page is a pow
187b0 65 72 20 6f 66 20 74 77 6f 0a 20 20 20 20 2a 2a  er of two.    **
187c0 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64   between 512 and
187d0 20 36 35 35 33 36 20 69 6e 63 6c 75 73 69 76 65   65536 inclusive
187e0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 28 70  . */.    if( ((p
187f0 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53  ageSize-1)&pageS
18800 69 7a 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20  ize)!=0.     || 
18810 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f  pageSize>SQLITE_
18820 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20  MAX_PAGE_SIZE . 
18830 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c      || pageSize<
18840 3d 32 35 36 20 0a 20 20 20 20 29 7b 0a 20 20 20  =256 .    ){.   
18850 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
18860 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
18870 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61  .    assert( (pa
18880 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
18890 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
188a0 45 2d 4f 46 3a 20 52 2d 35 39 33 31 30 2d 35 31  E-OF: R-59310-51
188b0 32 30 35 20 54 68 65 20 22 72 65 73 65 72 76 65  205 The "reserve
188c0 64 20 73 70 61 63 65 22 20 73 69 7a 65 20 69 6e  d space" size in
188d0 20 74 68 65 20 31 2d 62 79 74 65 0a 20 20 20 20   the 1-byte.    
188e0 2a 2a 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66  ** integer at of
188f0 66 73 65 74 20 32 30 20 69 73 20 74 68 65 20 6e  fset 20 is the n
18900 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
18910 66 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65  f space at the e
18920 6e 64 20 6f 66 0a 20 20 20 20 2a 2a 20 65 61 63  nd of.    ** eac
18930 68 20 70 61 67 65 20 74 6f 20 72 65 73 65 72 76  h page to reserv
18940 65 20 66 6f 72 20 65 78 74 65 6e 73 69 6f 6e 73  e for extensions
18950 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  . .    **.    **
18960 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
18970 33 37 34 39 37 2d 34 32 34 31 32 20 54 68 65 20  37497-42412 The 
18980 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65 73 65  size of the rese
18990 72 76 65 64 20 72 65 67 69 6f 6e 20 69 73 0a 20  rved region is. 
189a0 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64     ** determined
189b0 20 62 79 20 74 68 65 20 6f 6e 65 2d 62 79 74 65   by the one-byte
189c0 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65   unsigned intege
189d0 72 20 66 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66  r found at an of
189e0 66 73 65 74 20 6f 66 20 32 30 0a 20 20 20 20 2a  fset of 20.    *
189f0 2a 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  * into the datab
18a00 61 73 65 20 66 69 6c 65 20 68 65 61 64 65 72 2e  ase file header.
18a10 20 2a 2f 0a 20 20 20 20 75 73 61 62 6c 65 53 69   */.    usableSi
18a20 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20  ze = pageSize - 
18a30 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69  page1[20];.    i
18a40 66 28 20 28 75 33 32 29 70 61 67 65 53 69 7a 65  f( (u32)pageSize
18a50 21 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  !=pBt->pageSize 
18a60 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66 74 65  ){.      /* Afte
18a70 72 20 72 65 61 64 69 6e 67 20 74 68 65 20 66 69  r reading the fi
18a80 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
18a90 64 61 74 61 62 61 73 65 20 61 73 73 75 6d 69 6e  database assumin
18aa0 67 20 61 20 70 61 67 65 20 73 69 7a 65 0a 20 20  g a page size.  
18ab0 20 20 20 20 2a 2a 20 6f 66 20 42 74 53 68 61 72      ** of BtShar
18ac0 65 64 2e 70 61 67 65 53 69 7a 65 2c 20 77 65 20  ed.pageSize, we 
18ad0 68 61 76 65 20 64 69 73 63 6f 76 65 72 65 64 20  have discovered 
18ae0 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69  that the page-si
18af0 7a 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61  ze is.      ** a
18b00 63 74 75 61 6c 6c 79 20 70 61 67 65 53 69 7a 65  ctually pageSize
18b10 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  . Unlock the dat
18b20 61 62 61 73 65 2c 20 6c 65 61 76 65 20 70 42 74  abase, leave pBt
18b30 2d 3e 70 50 61 67 65 31 20 61 74 0a 20 20 20 20  ->pPage1 at.    
18b40 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65    ** zero and re
18b50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
18b60 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  The caller will 
18b70 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69  call this functi
18b80 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69  on.      ** agai
18b90 6e 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65  n with the corre
18ba0 63 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20  ct page-size..  
18bb0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c      */.      rel
18bc0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29  easePage(pPage1)
18bd0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 75 73 61  ;.      pBt->usa
18be0 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65  bleSize = usable
18bf0 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 42 74 2d  Size;.      pBt-
18c00 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65  >pageSize = page
18c10 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 72 65 65  Size;.      free
18c20 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
18c30 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
18c40 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
18c50 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
18c60 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a  &pBt->pageSize,.
18c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c90 20 20 20 70 61 67 65 53 69 7a 65 2d 75 73 61 62     pageSize-usab
18ca0 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72  leSize);.      r
18cb0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
18cc0 20 20 20 20 69 66 28 20 28 70 42 74 2d 3e 64 62      if( (pBt->db
18cd0 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
18ce0 5f 52 65 63 6f 76 65 72 79 4d 6f 64 65 29 3d 3d  _RecoveryMode)==
18cf0 30 20 26 26 20 6e 50 61 67 65 3e 6e 50 61 67 65  0 && nPage>nPage
18d00 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 63  File ){.      rc
18d10 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
18d20 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  T_BKPT;.      go
18d30 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
18d40 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
18d50 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
18d60 52 2d 32 38 33 31 32 2d 36 34 37 30 34 20 48 6f  R-28312-64704 Ho
18d70 77 65 76 65 72 2c 20 74 68 65 20 75 73 61 62 6c  wever, the usabl
18d80 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 61 6c  e size is not al
18d90 6c 6f 77 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  lowed to.    ** 
18da0 62 65 20 6c 65 73 73 20 74 68 61 6e 20 34 38 30  be less than 480
18db0 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  . In other words
18dc0 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 73 69  , if the page si
18dd0 7a 65 20 69 73 20 35 31 32 2c 20 74 68 65 6e 20  ze is 512, then 
18de0 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 65 72  the.    ** reser
18df0 76 65 64 20 73 70 61 63 65 20 73 69 7a 65 20 63  ved space size c
18e00 61 6e 6e 6f 74 20 65 78 63 65 65 64 20 33 32 2e  annot exceed 32.
18e10 20 2a 2f 0a 20 20 20 20 69 66 28 20 75 73 61 62   */.    if( usab
18e20 6c 65 53 69 7a 65 3c 34 38 30 20 29 7b 0a 20 20  leSize<480 ){.  
18e30 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
18e40 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
18e50 7d 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53  }.    pBt->pageS
18e60 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a  ize = pageSize;.
18e70 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53      pBt->usableS
18e80 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ize = usableSize
18e90 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
18ea0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
18eb0 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61  .    pBt->autoVa
18ec0 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
18ed0 28 26 70 61 67 65 31 5b 33 36 20 2b 20 34 2a 34  (&page1[36 + 4*4
18ee0 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42 74  ])?1:0);.    pBt
18ef0 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28  ->incrVacuum = (
18f00 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b  get4byte(&page1[
18f10 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 7*4])?1:0);
18f20 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f  .#endif.  }..  /
18f30 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74 68  * maxLocal is th
18f40 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74  e maximum amount
18f50 20 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f 20 73   of payload to s
18f60 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72  tore locally for
18f70 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d  .  ** a cell.  M
18f80 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 73  ake sure it is s
18f90 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74  mall enough so t
18fa0 68 61 74 20 61 74 20 6c 65 61 73 74 20 6d 69 6e  hat at least min
18fb0 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c  Fanout.  ** cell
18fc0 73 20 63 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f  s can will fit o
18fd0 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20 57 65 20  n one page.  We 
18fe0 61 73 73 75 6d 65 20 61 20 31 30 2d 62 79 74 65  assume a 10-byte
18ff0 20 70 61 67 65 20 68 65 61 64 65 72 2e 0a 20 20   page header..  
19000 2a 2a 20 42 65 73 69 64 65 73 20 74 68 65 20 70  ** Besides the p
19010 61 79 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c  ayload, the cell
19020 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a   must store:.  *
19030 2a 20 20 20 20 20 32 2d 62 79 74 65 20 70 6f 69  *     2-byte poi
19040 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
19050 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65  .  **     4-byte
19060 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20   child pointer. 
19070 20 2a 2a 20 20 20 20 20 39 2d 62 79 74 65 20 6e   **     9-byte n
19080 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20  Key value.  **  
19090 20 20 20 34 2d 62 79 74 65 20 6e 44 61 74 61 20     4-byte nData 
190a0 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34  value.  **     4
190b0 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 20 70  -byte overflow p
190c0 61 67 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a  age pointer.  **
190d0 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69   So a cell consi
190e0 73 74 73 20 6f 66 20 61 20 32 2d 62 79 74 65 20  sts of a 2-byte 
190f0 70 6f 69 6e 74 65 72 2c 20 61 20 68 65 61 64 65  pointer, a heade
19100 72 20 77 68 69 63 68 20 69 73 20 61 73 20 6d 75  r which is as mu
19110 63 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62 79  ch as.  ** 17 by
19120 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e  tes long, 0 to N
19130 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61   bytes of payloa
19140 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e  d, and an option
19150 61 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66 6c  al 4 byte overfl
19160 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f 69  ow.  ** page poi
19170 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74  nter..  */.  pBt
19180 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 75 31  ->maxLocal = (u1
19190 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  6)((pBt->usableS
191a0 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d  ize-12)*64/255 -
191b0 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e   23);.  pBt->min
191c0 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70  Local = (u16)((p
191d0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31  Bt->usableSize-1
191e0 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b  2)*32/255 - 23);
191f0 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20  .  pBt->maxLeaf 
19200 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61  = (u16)(pBt->usa
19210 62 6c 65 53 69 7a 65 20 2d 20 33 35 29 3b 0a 20  bleSize - 35);. 
19220 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20   pBt->minLeaf = 
19230 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62  (u16)((pBt->usab
19240 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35  leSize-12)*32/25
19250 35 20 2d 20 32 33 29 3b 0a 20 20 69 66 28 20 70  5 - 23);.  if( p
19260 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3e 31 32 37  Bt->maxLocal>127
19270 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78   ){.    pBt->max
19280 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 31  1bytePayload = 1
19290 32 37 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  27;.  }else{.   
192a0 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61   pBt->max1bytePa
192b0 79 6c 6f 61 64 20 3d 20 28 75 38 29 70 42 74 2d  yload = (u8)pBt-
192c0 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20  >maxLocal;.  }. 
192d0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d 61   assert( pBt->ma
192e0 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58  xLeaf + 23 <= MX
192f0 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20  _CELL_SIZE(pBt) 
19300 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31  );.  pBt->pPage1
19310 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 70 42 74   = pPage1;.  pBt
19320 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b  ->nPage = nPage;
19330 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
19340 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74  _OK;..page1_init
19350 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61  _failed:.  relea
19360 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
19370 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
19380 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
19390 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  }..#ifndef NDEBU
193a0 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  G./*.** Return t
193b0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72  he number of cur
193c0 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 70 42 74  sors open on pBt
193d0 2e 20 54 68 69 73 20 69 73 20 66 6f 72 20 75 73  . This is for us
193e0 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29  e.** in assert()
193f0 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f   expressions, so
19400 20 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70   it is only comp
19410 69 6c 65 64 20 69 66 20 4e 44 45 42 55 47 20 69  iled if NDEBUG i
19420 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64  s not.** defined
19430 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69  ..**.** Only wri
19440 74 65 20 63 75 72 73 6f 72 73 20 61 72 65 20 63  te cursors are c
19450 6f 75 6e 74 65 64 20 69 66 20 77 72 4f 6e 6c 79  ounted if wrOnly
19460 20 69 73 20 74 72 75 65 2e 20 20 49 66 20 77 72   is true.  If wr
19470 4f 6e 6c 79 20 69 73 0a 2a 2a 20 66 61 6c 73 65  Only is.** false
19480 20 74 68 65 6e 20 61 6c 6c 20 63 75 72 73 6f 72   then all cursor
19490 73 20 61 72 65 20 63 6f 75 6e 74 65 64 2e 0a 2a  s are counted..*
194a0 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72  *.** For the pur
194b0 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f  poses of this ro
194c0 75 74 69 6e 65 2c 20 61 20 63 75 72 73 6f 72 20  utine, a cursor 
194d0 69 73 20 61 6e 79 20 63 75 72 73 6f 72 20 74 68  is any cursor th
194e0 61 74 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c 65  at.** is capable
194f0 20 6f 66 20 72 65 61 64 69 6e 67 20 6f 72 20 77   of reading or w
19500 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
19510 74 61 62 61 73 65 2e 20 20 43 75 72 73 6f 72 73  tabase.  Cursors
19520 20 74 68 61 74 0a 2a 2a 20 68 61 76 65 20 62 65   that.** have be
19530 65 6e 20 74 72 69 70 70 65 64 20 69 6e 74 6f 20  en tripped into 
19540 74 68 65 20 43 55 52 53 4f 52 5f 46 41 55 4c 54  the CURSOR_FAULT
19550 20 73 74 61 74 65 20 61 72 65 20 6e 6f 74 20 63   state are not c
19560 6f 75 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  ounted..*/.stati
19570 63 20 69 6e 74 20 63 6f 75 6e 74 56 61 6c 69 64  c int countValid
19580 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64  Cursors(BtShared
19590 20 2a 70 42 74 2c 20 69 6e 74 20 77 72 4f 6e 6c   *pBt, int wrOnl
195a0 79 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  y){.  BtCursor *
195b0 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20  pCur;.  int r = 
195c0 30 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42  0;.  for(pCur=pB
195d0 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72  t->pCursor; pCur
195e0 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65  ; pCur=pCur->pNe
195f0 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28 77 72  xt){.    if( (wr
19600 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 28 70 43 75 72  Only==0 || (pCur
19610 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
19620 46 5f 57 72 69 74 65 46 6c 61 67 29 21 3d 30 29  F_WriteFlag)!=0)
19630 0a 20 20 20 20 20 26 26 20 70 43 75 72 2d 3e 65  .     && pCur->e
19640 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 46 41  State!=CURSOR_FA
19650 55 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a  ULT ) r++; .  }.
19660 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65    return r;.}.#e
19670 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ndif../*.** If t
19680 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73  here are no outs
19690 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 20  tanding cursors 
196a0 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69  and we are not i
196b0 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20  n the middle.** 
196c0 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  of a transaction
196d0 20 62 75 74 20 74 68 65 72 65 20 69 73 20 61 20   but there is a 
196e0 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  read lock on the
196f0 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a   database, then.
19700 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
19710 75 6e 72 65 66 73 20 74 68 65 20 66 69 72 73 74  unrefs the first
19720 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
19730 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 63 68  abase file which
19740 20 0a 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66   .** has the eff
19750 65 63 74 20 6f 66 20 72 65 6c 65 61 73 69 6e 67  ect of releasing
19760 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
19770 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69  **.** If there i
19780 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
19790 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69  in progress, thi
197a0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
197b0 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
197c0 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65  void unlockBtree
197d0 49 66 55 6e 75 73 65 64 28 42 74 53 68 61 72 65  IfUnused(BtShare
197e0 64 20 2a 70 42 74 29 7b 0a 20 20 61 73 73 65 72  d *pBt){.  asser
197f0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
19800 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
19810 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  ) );.  assert( c
19820 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73  ountValidCursors
19830 28 70 42 74 2c 30 29 3d 3d 30 20 7c 7c 20 70 42  (pBt,0)==0 || pB
19840 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
19850 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20  >TRANS_NONE );. 
19860 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e   if( pBt->inTran
19870 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e  saction==TRANS_N
19880 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 50 61 67  ONE && pBt->pPag
19890 65 31 21 3d 30 20 29 7b 0a 20 20 20 20 4d 65 6d  e1!=0 ){.    Mem
198a0 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70  Page *pPage1 = p
198b0 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 20 20  Bt->pPage1;.    
198c0 61 73 73 65 72 74 28 20 70 50 61 67 65 31 2d 3e  assert( pPage1->
198d0 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73  aData );.    ass
198e0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
198f0 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70  rRefcount(pBt->p
19900 50 61 67 65 72 29 3d 3d 31 20 29 3b 0a 20 20 20  Pager)==1 );.   
19910 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30   pBt->pPage1 = 0
19920 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
19930 65 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 31 29  eNotNull(pPage1)
19940 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
19950 66 20 70 42 74 20 70 6f 69 6e 74 73 20 74 6f 20  f pBt points to 
19960 61 6e 20 65 6d 70 74 79 20 66 69 6c 65 20 74 68  an empty file th
19970 65 6e 20 63 6f 6e 76 65 72 74 20 74 68 61 74 20  en convert that 
19980 65 6d 70 74 79 20 66 69 6c 65 0a 2a 2a 20 69 6e  empty file.** in
19990 74 6f 20 61 20 6e 65 77 20 65 6d 70 74 79 20 64  to a new empty d
199a0 61 74 61 62 61 73 65 20 62 79 20 69 6e 69 74 69  atabase by initi
199b0 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73  alizing the firs
199c0 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65  t page of.** the
199d0 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74   database..*/.st
199e0 61 74 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61  atic int newData
199f0 62 61 73 65 28 42 74 53 68 61 72 65 64 20 2a 70  base(BtShared *p
19a00 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Bt){.  MemPage *
19a10 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  pP1;.  unsigned 
19a20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e  char *data;.  in
19a30 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
19a40 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
19a50 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
19a60 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50  );.  if( pBt->nP
19a70 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 72 65 74  age>0 ){.    ret
19a80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
19a90 20 7d 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e   }.  pP1 = pBt->
19aa0 70 50 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74  pPage1;.  assert
19ab0 28 20 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61  ( pP1!=0 );.  da
19ac0 74 61 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b  ta = pP1->aData;
19ad0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
19ae0 61 67 65 72 57 72 69 74 65 28 70 50 31 2d 3e 70  agerWrite(pP1->p
19af0 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
19b00 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
19b10 20 6d 65 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d   memcpy(data, zM
19b20 61 67 69 63 48 65 61 64 65 72 2c 20 73 69 7a 65  agicHeader, size
19b30 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29  of(zMagicHeader)
19b40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a  );.  assert( siz
19b50 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72  eof(zMagicHeader
19b60 29 3d 3d 31 36 20 29 3b 0a 20 20 64 61 74 61 5b  )==16 );.  data[
19b70 31 36 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d  16] = (u8)((pBt-
19b80 3e 70 61 67 65 53 69 7a 65 3e 3e 38 29 26 30 78  >pageSize>>8)&0x
19b90 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 37 5d 20  ff);.  data[17] 
19ba0 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67  = (u8)((pBt->pag
19bb0 65 53 69 7a 65 3e 3e 31 36 29 26 30 78 66 66 29  eSize>>16)&0xff)
19bc0 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31  ;.  data[18] = 1
19bd0 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31  ;.  data[19] = 1
19be0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
19bf0 3e 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74  >usableSize<=pBt
19c00 2d 3e 70 61 67 65 53 69 7a 65 20 26 26 20 70 42  ->pageSize && pB
19c10 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32 35  t->usableSize+25
19c20 35 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  5>=pBt->pageSize
19c30 29 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20  );.  data[20] = 
19c40 28 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69  (u8)(pBt->pageSi
19c50 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze - pBt->usable
19c60 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 31  Size);.  data[21
19c70 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b 32  ] = 64;.  data[2
19c80 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b  2] = 32;.  data[
19c90 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73  23] = 32;.  mems
19ca0 65 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c  et(&data[24], 0,
19cb0 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f   100-24);.  zero
19cc0 50 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e  Page(pP1, PTF_IN
19cd0 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54  TKEY|PTF_LEAF|PT
19ce0 46 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20  F_LEAFDATA );.  
19cf0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
19d00 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49   BTS_PAGESIZE_FI
19d10 58 45 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  XED;.#ifndef SQL
19d20 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
19d30 55 55 4d 0a 20 20 61 73 73 65 72 74 28 20 70 42  UUM.  assert( pB
19d40 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31  t->autoVacuum==1
19d50 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63   || pBt->autoVac
19d60 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  uum==0 );.  asse
19d70 72 74 28 20 70 42 74 2d 3e 69 6e 63 72 56 61 63  rt( pBt->incrVac
19d80 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69  uum==1 || pBt->i
19d90 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a  ncrVacuum==0 );.
19da0 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61    put4byte(&data
19db0 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d  [36 + 4*4], pBt-
19dc0 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20  >autoVacuum);.  
19dd0 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33  put4byte(&data[3
19de0 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69  6 + 7*4], pBt->i
19df0 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64  ncrVacuum);.#end
19e00 69 66 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20  if.  pBt->nPage 
19e10 3d 20 31 3b 0a 20 20 64 61 74 61 5b 33 31 5d 20  = 1;.  data[31] 
19e20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 1;.  return SQ
19e30 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
19e40 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
19e50 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
19e60 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
19e70 20 28 63 72 65 61 74 69 6e 67 20 61 20 64 61 74   (creating a dat
19e80 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 73 69 73 74  abase.** consist
19e90 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ing of a single 
19ea0 70 61 67 65 20 61 6e 64 20 6e 6f 20 73 63 68 65  page and no sche
19eb0 6d 61 20 6f 62 6a 65 63 74 73 29 2e 20 52 65 74  ma objects). Ret
19ec0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
19ed0 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   if successful, 
19ee0 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  or an SQLite err
19ef0 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73  or code otherwis
19f00 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
19f10 33 42 74 72 65 65 4e 65 77 44 62 28 42 74 72 65  3BtreeNewDb(Btre
19f20 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
19f30 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
19f40 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42  nter(p);.  p->pB
19f50 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  t->nPage = 0;.  
19f60 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65  rc = newDatabase
19f70 28 70 2d 3e 70 42 74 29 3b 0a 20 20 73 71 6c 69  (p->pBt);.  sqli
19f80 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
19f90 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
19fa0 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
19fb0 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 74  to start a new t
19fc0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72  ransaction. A wr
19fd0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ite-transaction.
19fe0 2a 2a 20 69 73 20 73 74 61 72 74 65 64 20 69 66  ** is started if
19ff0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
1a000 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c  ment is nonzero,
1a010 20 6f 74 68 65 72 77 69 73 65 20 61 20 72 65 61   otherwise a rea
1a020 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  d-.** transactio
1a030 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e  n.  If the secon
1a040 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20  d argument is 2 
1a050 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c  or more and excl
1a060 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63  usive.** transac
1a070 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c  tion is started,
1a080 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f   meaning that no
1a090 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69   other process i
1a0a0 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20  s allowed.** to 
1a0b0 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62  access the datab
1a0c0 61 73 65 2e 20 20 41 20 70 72 65 65 78 69 73 74  ase.  A preexist
1a0d0 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ing transaction 
1a0e0 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70  may not be.** up
1a0f0 67 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73  graded to exclus
1a100 69 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74  ive by calling t
1a110 68 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65  his routine a se
1a120 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a  cond time - the.
1a130 2a 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20 66  ** exclusivity f
1a140 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66  lag only works f
1a150 6f 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  or a new transac
1a160 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72  tion..**.** A wr
1a170 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
1a180 6d 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20  must be started 
1a190 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
1a1a0 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65  g any .** change
1a1b0 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
1a1c0 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20  e.  None of the 
1a1d0 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
1a1e0 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b  es .** will work
1a1f0 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61   unless a transa
1a200 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64  ction is started
1a210 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20   first:.**.**   
1a220 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
1a230 72 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20  reateTable().** 
1a240 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
1a250 65 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a  eCreateIndex().*
1a260 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
1a270 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a  reeClearTable().
1a280 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
1a290 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a  treeDropTable().
1a2a0 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
1a2b0 74 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20  treeInsert().** 
1a2c0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
1a2d0 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20  eDelete().**    
1a2e0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70    sqlite3BtreeUp
1a2f0 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a  dateMeta().**.**
1a300 20 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61   If an initial a
1a310 74 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72  ttempt to acquir
1a320 65 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73  e the lock fails
1a330 20 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b   because of lock
1a340 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61   contention.** a
1a350 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
1a360 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75  was previously u
1a370 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e  nlocked, then in
1a380 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
1a390 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72  ndler.** if ther
1a3a0 65 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69  e is one.  But i
1a3b0 66 20 74 68 65 72 65 20 77 61 73 20 70 72 65 76  f there was prev
1a3c0 69 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f  iously a read-lo
1a3d0 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e  ck, do not.** in
1a3e0 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
1a3f0 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74  ndler - just ret
1a400 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
1a410 20 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73    SQLITE_BUSY is
1a420 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68   .** returned wh
1a430 65 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  en there is alre
1a440 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ady a read-lock 
1a450 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69  in order to avoi
1a460 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a  d a deadlock..**
1a470 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72  .** Suppose ther
1a480 65 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73  e are two proces
1a490 73 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20  ses A and B.  A 
1a4a0 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  has a read lock 
1a4b0 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72  and B has.** a r
1a4c0 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42  eserved lock.  B
1a4d0 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74   tries to promot
1a4e0 65 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62  e to exclusive b
1a4f0 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65  ut is blocked be
1a500 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20  cause.** of A's 
1a510 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72  read lock.  A tr
1a520 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74  ies to promote t
1a530 6f 20 72 65 73 65 72 76 65 64 20 62 75 74 20 69  o reserved but i
1a540 73 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a  s blocked by B..
1a550 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74  ** One or the ot
1a560 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70  her of the two p
1a570 72 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67 69  rocesses must gi
1a580 76 65 20 77 61 79 20 6f 72 20 74 68 65 72 65 20  ve way or there 
1a590 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f  can be.** no pro
1a5a0 67 72 65 73 73 2e 20 20 42 79 20 72 65 74 75 72  gress.  By retur
1a5b0 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59  ning SQLITE_BUSY
1a5c0 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e   and not invokin
1a5d0 67 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  g the busy callb
1a5e0 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c  ack.** when A al
1a5f0 72 65 61 64 79 20 68 61 73 20 61 20 72 65 61 64  ready has a read
1a600 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72   lock, we encour
1a610 61 67 65 20 41 20 74 6f 20 67 69 76 65 20 75 70  age A to give up
1a620 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72   and let B.** pr
1a630 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  oceed..*/.int sq
1a640 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54  lite3BtreeBeginT
1a650 72 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69  rans(Btree *p, i
1a660 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20 20 42 74  nt wrflag){.  Bt
1a670 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1a680 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  >pBt;.  int rc =
1a690 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73   SQLITE_OK;..  s
1a6a0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1a6b0 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65  (p);.  btreeInte
1a6c0 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20  grity(p);..  /* 
1a6d0 49 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20  If the btree is 
1a6e0 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72 69  already in a wri
1a6f0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  te-transaction, 
1a700 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c  or it.  ** is al
1a710 72 65 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d  ready in a read-
1a720 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
1a730 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
1a740 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65  on.  ** is reque
1a750 73 74 65 64 2c 20 74 68 69 73 20 69 73 20 61 20  sted, this is a 
1a760 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66  no-op..  */.  if
1a770 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
1a780 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d  ANS_WRITE || (p-
1a790 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1a7a0 52 45 41 44 20 26 26 20 21 77 72 66 6c 61 67 29  READ && !wrflag)
1a7b0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61   ){.    goto tra
1a7c0 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 20 20  ns_begun;.  }.  
1a7d0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
1a7e0 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
1a7f0 53 5f 57 52 49 54 45 20 7c 7c 20 49 66 4e 6f 74  S_WRITE || IfNot
1a800 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54  OmitAV(pBt->bDoT
1a810 72 75 6e 63 61 74 65 29 3d 3d 30 20 29 3b 0a 0a  runcate)==0 );..
1a820 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73    /* Write trans
1a830 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20  actions are not 
1a840 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65  possible on a re
1a850 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  ad-only database
1a860 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 2d 3e   */.  if( (pBt->
1a870 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52  btsFlags & BTS_R
1a880 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 26 26 20  EAD_ONLY)!=0 && 
1a890 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63  wrflag ){.    rc
1a8a0 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
1a8b0 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61  LY;.    goto tra
1a8c0 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23  ns_begun;.  }..#
1a8d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1a8e0 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
1a8f0 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20    {.    sqlite3 
1a900 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20  *pBlock = 0;.   
1a910 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64   /* If another d
1a920 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68  atabase handle h
1a930 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65  as already opene
1a940 64 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61  d a write transa
1a950 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 6f 6e  ction .    ** on
1a960 20 74 68 69 73 20 73 68 61 72 65 64 2d 62 74 72   this shared-btr
1a970 65 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ee structure and
1a980 20 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20   a second write 
1a990 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20  transaction is. 
1a9a0 20 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c     ** requested,
1a9b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
1a9c0 4f 43 4b 45 44 2e 0a 20 20 20 20 2a 2f 0a 20 20  OCKED..    */.  
1a9d0 20 20 69 66 28 20 28 77 72 66 6c 61 67 20 26 26    if( (wrflag &&
1a9e0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1a9f0 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
1aa00 29 0a 20 20 20 20 20 7c 7c 20 28 70 42 74 2d 3e  ).     || (pBt->
1aa10 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50  btsFlags & BTS_P
1aa20 45 4e 44 49 4e 47 29 21 3d 30 0a 20 20 20 20 29  ENDING)!=0.    )
1aa30 7b 0a 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d  {.      pBlock =
1aa40 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
1aa50 62 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  b;.    }else if(
1aa60 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20   wrflag>1 ){.   
1aa70 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72     BtLock *pIter
1aa80 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 49 74 65  ;.      for(pIte
1aa90 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
1aaa0 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
1aab0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
1aac0 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74    if( pIter->pBt
1aad0 72 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree!=p ){.      
1aae0 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74      pBlock = pIt
1aaf0 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a  er->pBtree->db;.
1ab00 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1ab10 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1ab20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1ab30 20 70 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20   pBlock ){.     
1ab40 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
1ab50 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
1ab60 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20   pBlock);.      
1ab70 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  rc = SQLITE_LOCK
1ab80 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a  ED_SHAREDCACHE;.
1ab90 20 20 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73        goto trans
1aba0 5f 62 65 67 75 6e 3b 0a 20 20 20 20 7d 0a 20 20  _begun;.    }.  
1abb0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41  }.#endif..  /* A
1abc0 6e 79 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20  ny read-only or 
1abd0 72 65 61 64 2d 77 72 69 74 65 20 74 72 61 6e 73  read-write trans
1abe0 61 63 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61  action implies a
1abf0 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20   read-lock on . 
1ac00 20 2a 2a 20 70 61 67 65 20 31 2e 20 53 6f 20 69   ** page 1. So i
1ac10 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 68 61  f some other sha
1ac20 72 65 64 2d 63 61 63 68 65 20 63 6c 69 65 6e 74  red-cache client
1ac30 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 77   already has a w
1ac40 72 69 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20  rite-lock .  ** 
1ac50 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65 20 74  on page 1, the t
1ac60 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f  ransaction canno
1ac70 74 20 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a  t be opened. */.
1ac80 20 20 72 63 20 3d 20 71 75 65 72 79 53 68 61 72    rc = queryShar
1ac90 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
1aca0 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c  (p, MASTER_ROOT,
1acb0 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69   READ_LOCK);.  i
1acc0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
1acd0 20 29 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65   ) goto trans_be
1ace0 67 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e 62 74 73  gun;..  pBt->bts
1acf0 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 49 4e  Flags &= ~BTS_IN
1ad00 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20  ITIALLY_EMPTY;. 
1ad10 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d   if( pBt->nPage=
1ad20 3d 30 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61  =0 ) pBt->btsFla
1ad30 67 73 20 7c 3d 20 42 54 53 5f 49 4e 49 54 49 41  gs |= BTS_INITIA
1ad40 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 64 6f 20  LLY_EMPTY;.  do 
1ad50 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f  {.    /* Call lo
1ad60 63 6b 42 74 72 65 65 28 29 20 75 6e 74 69 6c 20  ckBtree() until 
1ad70 65 69 74 68 65 72 20 70 42 74 2d 3e 70 50 61 67  either pBt->pPag
1ad80 65 31 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  e1 is populated 
1ad90 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74  or.    ** lockBt
1ada0 72 65 65 28 29 20 72 65 74 75 72 6e 73 20 73 6f  ree() returns so
1adb0 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  mething other th
1adc0 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f  an SQLITE_OK. lo
1add0 63 6b 42 74 72 65 65 28 29 0a 20 20 20 20 2a 2a  ckBtree().    **
1ade0 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
1adf0 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 20  TE_OK but leave 
1ae00 70 42 74 2d 3e 70 50 61 67 65 31 20 73 65 74 20  pBt->pPage1 set 
1ae10 74 6f 20 30 20 69 66 20 61 66 74 65 72 0a 20 20  to 0 if after.  
1ae20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 70 61 67    ** reading pag
1ae30 65 20 31 20 69 74 20 64 69 73 63 6f 76 65 72 73  e 1 it discovers
1ae40 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73   that the page-s
1ae50 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
1ae60 61 73 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65  ase .    ** file
1ae70 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67   is not pBt->pag
1ae80 65 53 69 7a 65 2e 20 49 6e 20 74 68 69 73 20 63  eSize. In this c
1ae90 61 73 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20  ase lockBtree() 
1aea0 77 69 6c 6c 20 75 70 64 61 74 65 0a 20 20 20 20  will update.    
1aeb0 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ** pBt->pageSize
1aec0 20 74 6f 20 74 68 65 20 70 61 67 65 2d 73 69 7a   to the page-siz
1aed0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e  e of the file on
1aee0 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   disk..    */.  
1aef0 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 50    while( pBt->pP
1af00 61 67 65 31 3d 3d 30 20 26 26 20 53 51 4c 49 54  age1==0 && SQLIT
1af10 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b  E_OK==(rc = lock
1af20 42 74 72 65 65 28 70 42 74 29 29 20 29 3b 0a 0a  Btree(pBt)) );..
1af30 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1af40 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20  TE_OK && wrflag 
1af50 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 42  ){.      if( (pB
1af60 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
1af70 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20  S_READ_ONLY)!=0 
1af80 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1af90 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
1afa0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1afb0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1afc0 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 42 74  e3PagerBegin(pBt
1afd0 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c 61 67 3e  ->pPager,wrflag>
1afe0 31 2c 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d  1,sqlite3TempInM
1aff0 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20  emory(p->db));. 
1b000 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1b010 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b020 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61        rc = newDa
1b030 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20  tabase(pBt);.   
1b040 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1b050 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
1b060 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1b070 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  .      unlockBtr
1b080 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
1b090 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
1b0a0 20 28 72 63 26 30 78 46 46 29 3d 3d 53 51 4c 49   (rc&0xFF)==SQLI
1b0b0 54 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d 3e  TE_BUSY && pBt->
1b0c0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
1b0d0 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20  RANS_NONE &&.   
1b0e0 20 20 20 20 20 20 20 62 74 72 65 65 49 6e 76 6f         btreeInvo
1b0f0 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42  keBusyHandler(pB
1b100 74 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  t) );..  if( rc=
1b110 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b120 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
1b130 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  ==TRANS_NONE ){.
1b140 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e        pBt->nTran
1b150 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64  saction++;.#ifnd
1b160 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
1b170 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20  HARED_CACHE.    
1b180 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c    if( p->sharabl
1b190 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  e ){.        ass
1b1a0 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74  ert( p->lock.pBt
1b1b0 72 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f 63  ree==p && p->loc
1b1c0 6b 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20  k.iTable==1 );. 
1b1d0 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65         p->lock.e
1b1e0 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b  Lock = READ_LOCK
1b1f0 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63  ;.        p->loc
1b200 6b 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  k.pNext = pBt->p
1b210 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 70 42  Lock;.        pB
1b220 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c  t->pLock = &p->l
1b230 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  ock;.      }.#en
1b240 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  dif.    }.    p-
1b250 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c  >inTrans = (wrfl
1b260 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54  ag?TRANS_WRITE:T
1b270 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20  RANS_READ);.    
1b280 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70  if( p->inTrans>p
1b290 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1b2a0 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  n ){.      pBt->
1b2b0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
1b2c0 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20  p->inTrans;.    
1b2d0 7d 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61 67  }.    if( wrflag
1b2e0 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   ){.      MemPag
1b2f0 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d  e *pPage1 = pBt-
1b300 3e 70 50 61 67 65 31 3b 0a 23 69 66 6e 64 65 66  >pPage1;.#ifndef
1b310 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
1b320 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20  RED_CACHE.      
1b330 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 57  assert( !pBt->pW
1b340 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 70  riter );.      p
1b350 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 70 3b  Bt->pWriter = p;
1b360 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46  .      pBt->btsF
1b370 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 45 58 43  lags &= ~BTS_EXC
1b380 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20 69 66  LUSIVE;.      if
1b390 28 20 77 72 66 6c 61 67 3e 31 20 29 20 70 42 74  ( wrflag>1 ) pBt
1b3a0 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
1b3b0 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 23 65 6e  S_EXCLUSIVE;.#en
1b3c0 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66  dif..      /* If
1b3d0 20 74 68 65 20 64 62 2d 73 69 7a 65 20 68 65 61   the db-size hea
1b3e0 64 65 72 20 66 69 65 6c 64 20 69 73 20 69 6e 63  der field is inc
1b3f0 6f 72 72 65 63 74 20 28 61 73 20 69 74 20 6d 61  orrect (as it ma
1b400 79 20 62 65 20 69 66 20 61 6e 20 6f 6c 64 0a 20  y be if an old. 
1b410 20 20 20 20 20 2a 2a 20 63 6c 69 65 6e 74 20 68       ** client h
1b420 61 73 20 62 65 65 6e 20 77 72 69 74 69 6e 67 20  as been writing 
1b430 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1b440 65 29 2c 20 75 70 64 61 74 65 20 69 74 20 6e 6f  e), update it no
1b450 77 2e 20 44 6f 69 6e 67 0a 20 20 20 20 20 20 2a  w. Doing.      *
1b460 2a 20 74 68 69 73 20 73 6f 6f 6e 65 72 20 72 61  * this sooner ra
1b470 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 20  ther than later 
1b480 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61  means the databa
1b490 73 65 20 73 69 7a 65 20 63 61 6e 20 73 61 66 65  se size can safe
1b4a0 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 2d  ly .      ** re-
1b4b0 72 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73  read the databas
1b4c0 65 20 73 69 7a 65 20 66 72 6f 6d 20 70 61 67 65  e size from page
1b4d0 20 31 20 69 66 20 61 20 73 61 76 65 70 6f 69 6e   1 if a savepoin
1b4e0 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e  t or transaction
1b4f0 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61  .      ** rollba
1b500 63 6b 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  ck occurs within
1b510 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1b520 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1b530 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 21   if( pBt->nPage!
1b540 3d 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65  =get4byte(&pPage
1b550 31 2d 3e 61 44 61 74 61 5b 32 38 5d 29 20 29 7b  1->aData[28]) ){
1b560 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
1b570 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1b580 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
1b590 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1b5a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1b5b0 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
1b5c0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
1b5d0 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65  [28], pBt->nPage
1b5e0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1b5f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1b600 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20  .trans_begun:.  
1b610 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1b620 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  K && wrflag ){. 
1b630 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20     /* This call 
1b640 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61 74 20  makes sure that 
1b650 74 68 65 20 70 61 67 65 72 20 68 61 73 20 74 68  the pager has th
1b660 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72  e correct number
1b670 20 6f 66 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 20   of.    ** open 
1b680 73 61 76 65 70 6f 69 6e 74 73 2e 20 49 66 20 74  savepoints. If t
1b690 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65  he second parame
1b6a0 74 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74  ter is greater t
1b6b0 68 61 6e 20 30 20 61 6e 64 0a 20 20 20 20 2a 2a  han 0 and.    **
1b6c0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
1b6d0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
1b6e0 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 77 69  open, then it wi
1b6f0 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 68 65 72  ll be opened her
1b700 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  e..    */.    rc
1b710 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
1b720 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74  penSavepoint(pBt
1b730 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64 62 2d  ->pPager, p->db-
1b740 3e 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20  >nSavepoint);.  
1b750 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  }..  btreeIntegr
1b760 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ity(p);.  sqlite
1b770 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1b780 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1b790 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1b7a0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a  MIT_AUTOVACUUM..
1b7b0 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 6f  /*.** Set the po
1b7c0 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
1b7d0 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72  s for all childr
1b7e0 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67 65  en of page pPage
1b7f0 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50  . Also, if.** pP
1b800 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c  age contains cel
1b810 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  ls that point to
1b820 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c   overflow pages,
1b830 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72   set the pointer
1b840 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20  .** map entries 
1b850 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
1b860 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a   pages as well..
1b870 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
1b880 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d 65  tChildPtrmaps(Me
1b890 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
1b8a0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
1b8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8c0 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76      /* Counter v
1b8d0 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  ariable */.  int
1b8e0 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20   nCell;         
1b8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b900 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
1b910 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61 67 65  ls in page pPage
1b920 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
1b930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b940 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1b950 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53  rn code */.  BtS
1b960 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
1b970 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 69 73  ge->pBt;.  u8 is
1b980 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65  InitOrig = pPage
1b990 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f  ->isInit;.  Pgno
1b9a0 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70   pgno = pPage->p
1b9b0 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  gno;..  assert( 
1b9c0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1b9d0 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
1b9e0 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
1b9f0 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  btreeInitPage(pP
1ba00 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
1ba10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ba20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f   goto set_child_
1ba30 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 7d  ptrmaps_out;.  }
1ba40 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65  .  nCell = pPage
1ba50 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28  ->nCell;..  for(
1ba60 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
1ba70 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  +){.    u8 *pCel
1ba80 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
1ba90 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 70 74 72  ge, i);..    ptr
1baa0 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50  mapPutOvflPtr(pP
1bab0 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29  age, pCell, &rc)
1bac0 3b 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  ;..    if( !pPag
1bad0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
1bae0 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20   Pgno childPgno 
1baf0 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  = get4byte(pCell
1bb00 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  );.      ptrmapP
1bb10 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e  ut(pBt, childPgn
1bb20 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
1bb30 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20   pgno, &rc);.   
1bb40 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70   }.  }..  if( !p
1bb50 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
1bb60 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f    Pgno childPgno
1bb70 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
1bb80 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
1bb90 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
1bba0 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
1bbb0 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54  t, childPgno, PT
1bbc0 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f  RMAP_BTREE, pgno
1bbd0 2c 20 26 72 63 29 3b 0a 20 20 7d 0a 0a 73 65 74  , &rc);.  }..set
1bbe0 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f  _child_ptrmaps_o
1bbf0 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73 49  ut:.  pPage->isI
1bc00 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67  nit = isInitOrig
1bc10 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1bc20 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72  ../*.** Somewher
1bc30 65 20 6f 6e 20 70 50 61 67 65 20 69 73 20 61 20  e on pPage is a 
1bc40 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20  pointer to page 
1bc50 69 46 72 6f 6d 2e 20 20 4d 6f 64 69 66 79 20 74  iFrom.  Modify t
1bc60 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 0a 2a  his pointer so.*
1bc70 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  * that it points
1bc80 20 74 6f 20 69 54 6f 2e 20 50 61 72 61 6d 65 74   to iTo. Paramet
1bc90 65 72 20 65 54 79 70 65 20 64 65 73 63 72 69 62  er eType describ
1bca0 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 70  es the type of p
1bcb0 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 62 65 20  ointer to.** be 
1bcc0 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 20 66 6f  modified, as  fo
1bcd0 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52  llows:.**.** PTR
1bce0 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20 70  MAP_BTREE:     p
1bcf0 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d  Page is a btree-
1bd00 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
1bd10 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63 68  r points at a ch
1bd20 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ild .**         
1bd30 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20 6f            page o
1bd40 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50  f pPage..**.** P
1bd50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a  TRMAP_OVERFLOW1:
1bd60 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65   pPage is a btre
1bd70 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  e-page. The poin
1bd80 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e  ter points at an
1bd90 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20   overflow.**    
1bda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1bdb0 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  age pointed to b
1bdc0 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65 6c  y one of the cel
1bdd0 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a  ls on pPage..**.
1bde0 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ** PTRMAP_OVERFL
1bdf0 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20 61 6e  OW2: pPage is an
1be00 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20   overflow-page. 
1be10 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  The pointer poin
1be20 74 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a 2a  ts at the next.*
1be30 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1be40 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67      overflow pag
1be50 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a  e in the list..*
1be60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 64  /.static int mod
1be70 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 4d  ifyPagePointer(M
1be80 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 50  emPage *pPage, P
1be90 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20  gno iFrom, Pgno 
1bea0 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b 0a  iTo, u8 eType){.
1beb0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1bec0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
1bed0 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
1bee0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
1bef0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
1bf00 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
1bf10 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 65 54  age) );.  if( eT
1bf20 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
1bf30 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20  FLOW2 ){.    /* 
1bf40 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61  The pointer is a
1bf50 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20  lways the first 
1bf60 34 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 70  4 bytes of the p
1bf70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  age in this case
1bf80 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65  .  */.    if( ge
1bf90 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
1bfa0 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20  ata)!=iFrom ){. 
1bfb0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1bfc0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1bfd0 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62  .    }.    put4b
1bfe0 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
1bff0 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  , iTo);.  }else{
1c000 0a 20 20 20 20 75 38 20 69 73 49 6e 69 74 4f 72  .    u8 isInitOr
1c010 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e  ig = pPage->isIn
1c020 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  it;.    int i;. 
1c030 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20     int nCell;.  
1c040 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20 72    int rc;..    r
1c050 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67  c = btreeInitPag
1c060 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66  e(pPage);.    if
1c070 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1c080 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50  ;.    nCell = pP
1c090 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20  age->nCell;..   
1c0a0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
1c0b0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75  l; i++){.      u
1c0c0 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43  8 *pCell = findC
1c0d0 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20  ell(pPage, i);. 
1c0e0 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d       if( eType==
1c0f0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
1c100 20 29 7b 0a 20 20 20 20 20 20 20 20 43 65 6c 6c   ){.        Cell
1c110 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20  Info info;.     
1c120 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65     pPage->xParse
1c130 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c  Cell(pPage, pCel
1c140 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20  l, &info);.     
1c150 20 20 20 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f 63     if( info.nLoc
1c160 61 6c 3c 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  al<info.nPayload
1c170 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 43 65  .         && pCe
1c180 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 31 3c  ll+info.nSize-1<
1c190 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70 50  =pPage->aData+pP
1c1a0 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 0a 20 20  age->maskPage.  
1c1b0 20 20 20 20 20 20 20 26 26 20 69 46 72 6f 6d 3d         && iFrom=
1c1c0 3d 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 2b  =get4byte(pCell+
1c1d0 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34 29 0a 20 20  info.nSize-4).  
1c1e0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
1c1f0 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c     put4byte(pCel
1c200 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34 2c 20  l+info.nSize-4, 
1c210 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  iTo);.          
1c220 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
1c230 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1c240 20 20 20 20 20 20 69 66 28 20 67 65 74 34 62 79        if( get4by
1c250 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d  te(pCell)==iFrom
1c260 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75   ){.          pu
1c270 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54  t4byte(pCell, iT
1c280 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  o);.          br
1c290 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
1c2a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
1c2b0 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c      if( i==nCell
1c2c0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54   ){.      if( eT
1c2d0 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype!=PTRMAP_BTRE
1c2e0 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  E || .          
1c2f0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
1c300 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
1c310 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72  rOffset+8])!=iFr
1c320 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  om ){.        re
1c330 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1c340 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
1c350 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  }.      put4byte
1c360 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
1c370 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
1c380 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a  8], iTo);.    }.
1c390 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
1c3a0 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b  it = isInitOrig;
1c3b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1c3c0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
1c3d0 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e  ** Move the open
1c3e0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70   database page p
1c3f0 44 62 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69  DbPage to locati
1c400 6f 6e 20 69 46 72 65 65 50 61 67 65 20 69 6e 20  on iFreePage in 
1c410 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65  the .** database
1c420 2e 20 54 68 65 20 70 44 62 50 61 67 65 20 72 65  . The pDbPage re
1c430 66 65 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20  ference remains 
1c440 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  valid..**.** The
1c450 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69   isCommit flag i
1c460 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68  ndicates that th
1c470 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
1c480 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74 0a  o remember that.
1c490 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e  ** the journal n
1c4a0 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28  eeds to be sync(
1c4b0 29 65 64 20 62 65 66 6f 72 65 20 64 61 74 61 62  )ed before datab
1c4c0 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65  ase page pDbPage
1c4d0 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62  ->pgno .** can b
1c4e0 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 54 68  e written to. Th
1c4f0 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72  e caller has alr
1c500 65 61 64 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f  eady promised no
1c510 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  t to write to th
1c520 61 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73  at.** page..*/.s
1c530 74 61 74 69 63 20 69 6e 74 20 72 65 6c 6f 63 61  tatic int reloca
1c540 74 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  tePage(.  BtShar
1c550 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
1c560 20 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20     /* Btree */. 
1c570 20 4d 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67   MemPage *pDbPag
1c580 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65  e,        /* Ope
1c590 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a  n page to move *
1c5a0 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20 20  /.  u8 eType,   
1c5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c5c0 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70  Pointer map 'typ
1c5d0 65 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62  e' entry for pDb
1c5e0 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
1c5f0 50 74 72 50 61 67 65 2c 20 20 20 20 20 20 20 20  PtrPage,        
1c600 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
1c610 70 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72  p 'page-no' entr
1c620 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f  y for pDbPage */
1c630 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67  .  Pgno iFreePag
1c640 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
1c650 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d  he location to m
1c660 6f 76 65 20 70 44 62 50 61 67 65 20 74 6f 20 2a  ove pDbPage to *
1c670 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74  /.  int isCommit
1c680 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c690 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 70 61  isCommit flag pa
1c6a0 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 50  ssed to sqlite3P
1c6b0 61 67 65 72 4d 6f 76 65 70 61 67 65 20 2a 2f 0a  agerMovepage */.
1c6c0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
1c6d0 74 72 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65  trPage;   /* The
1c6e0 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
1c6f0 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ins a pointer to
1c700 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67   pDbPage */.  Pg
1c710 6e 6f 20 69 44 62 50 61 67 65 20 3d 20 70 44 62  no iDbPage = pDb
1c720 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61  Page->pgno;.  Pa
1c730 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42  ger *pPager = pB
1c740 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  t->pPager;.  int
1c750 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
1c760 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
1c770 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65  ERFLOW2 || eType
1c780 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
1c790 57 31 20 7c 7c 20 0a 20 20 20 20 20 20 65 54 79  W1 || .      eTy
1c7a0 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45  pe==PTRMAP_BTREE
1c7b0 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
1c7c0 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20  P_ROOTPAGE );.  
1c7d0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1c7e0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
1c7f0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
1c800 72 74 28 20 70 44 62 50 61 67 65 2d 3e 70 42 74  rt( pDbPage->pBt
1c810 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d  ==pBt );..  /* M
1c820 6f 76 65 20 70 61 67 65 20 69 44 62 50 61 67 65  ove page iDbPage
1c830 20 66 72 6f 6d 20 69 74 73 20 63 75 72 72 65 6e   from its curren
1c840 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61  t location to pa
1c850 67 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50  ge number iFreeP
1c860 61 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28 28  age */.  TRACE((
1c870 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76  "AUTOVACUUM: Mov
1c880 69 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20 70  ing %d to free p
1c890 61 67 65 20 25 64 20 28 70 74 72 20 70 61 67 65  age %d (ptr page
1c8a0 20 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c   %d type %d)\n",
1c8b0 20 0a 20 20 20 20 20 20 69 44 62 50 61 67 65 2c   .      iDbPage,
1c8c0 20 69 46 72 65 65 50 61 67 65 2c 20 69 50 74 72   iFreePage, iPtr
1c8d0 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a 20  Page, eType));. 
1c8e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1c8f0 65 72 4d 6f 76 65 70 61 67 65 28 70 50 61 67 65  erMovepage(pPage
1c900 72 2c 20 70 44 62 50 61 67 65 2d 3e 70 44 62 50  r, pDbPage->pDbP
1c910 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20  age, iFreePage, 
1c920 69 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28  isCommit);.  if(
1c930 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1c940 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
1c950 0a 20 20 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e  .  }.  pDbPage->
1c960 70 67 6e 6f 20 3d 20 69 46 72 65 65 50 61 67 65  pgno = iFreePage
1c970 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62 50 61  ;..  /* If pDbPa
1c980 67 65 20 77 61 73 20 61 20 62 74 72 65 65 2d 70  ge was a btree-p
1c990 61 67 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 79  age, then it may
1c9a0 20 68 61 76 65 20 63 68 69 6c 64 20 70 61 67 65   have child page
1c9b0 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20  s and/or cells. 
1c9c0 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74   ** that point t
1c9d0 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
1c9e0 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  . The pointer ma
1c9f0 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c  p entries for al
1ca00 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20 70 61 67  l these.  ** pag
1ca10 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68  es need to be ch
1ca20 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  anged..  **.  **
1ca30 20 49 66 20 70 44 62 50 61 67 65 20 69 73 20 61   If pDbPage is a
1ca40 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  n overflow page,
1ca50 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   then the first 
1ca60 34 20 62 79 74 65 73 20 6d 61 79 20 73 74 6f 72  4 bytes may stor
1ca70 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72  e a.  ** pointer
1ca80 20 74 6f 20 61 20 73 75 62 73 65 71 75 65 6e 74   to a subsequent
1ca90 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
1caa0 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
1cab0 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74  ase, then.  ** t
1cac0 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e  he pointer map n
1cad0 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74  eeds to be updat
1cae0 65 64 20 66 6f 72 20 74 68 65 20 73 75 62 73 65  ed for the subse
1caf0 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70  quent overflow p
1cb00 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  age..  */.  if( 
1cb10 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54  eType==PTRMAP_BT
1cb20 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  REE || eType==PT
1cb30 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
1cb40 0a 20 20 20 20 72 63 20 3d 20 73 65 74 43 68 69  .    rc = setChi
1cb50 6c 64 50 74 72 6d 61 70 73 28 70 44 62 50 61 67  ldPtrmaps(pDbPag
1cb60 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
1cb70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1cb80 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1cb90 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1cba0 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d   Pgno nextOvfl =
1cbb0 20 67 65 74 34 62 79 74 65 28 70 44 62 50 61 67   get4byte(pDbPag
1cbc0 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69  e->aData);.    i
1cbd0 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29  f( nextOvfl!=0 )
1cbe0 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75  {.      ptrmapPu
1cbf0 74 28 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c  t(pBt, nextOvfl,
1cc00 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
1cc10 32 2c 20 69 46 72 65 65 50 61 67 65 2c 20 26 72  2, iFreePage, &r
1cc20 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  c);.      if( rc
1cc30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1cc40 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1cc50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1cc60 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68    }..  /* Fix th
1cc70 65 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74  e database point
1cc80 65 72 20 6f 6e 20 70 61 67 65 20 69 50 74 72 50  er on page iPtrP
1cc90 61 67 65 20 74 68 61 74 20 70 6f 69 6e 74 65 64  age that pointed
1cca0 20 61 74 20 69 44 62 50 61 67 65 20 73 6f 0a 20   at iDbPage so. 
1ccb0 20 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e   ** that it poin
1ccc0 74 73 20 61 74 20 69 46 72 65 65 50 61 67 65 2e  ts at iFreePage.
1ccd0 20 41 6c 73 6f 20 66 69 78 20 74 68 65 20 70 6f   Also fix the po
1cce0 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20  inter map entry 
1ccf0 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50 61 67  for.  ** iPtrPag
1cd00 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54  e..  */.  if( eT
1cd10 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype!=PTRMAP_ROOT
1cd20 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d  PAGE ){.    rc =
1cd30 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
1cd40 74 2c 20 69 50 74 72 50 61 67 65 2c 20 26 70 50  t, iPtrPage, &pP
1cd50 74 72 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20  trPage, 0);.    
1cd60 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1cd70 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
1cd80 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1cd90 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1cda0 72 57 72 69 74 65 28 70 50 74 72 50 61 67 65 2d  rWrite(pPtrPage-
1cdb0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
1cdc0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1cdd0 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
1cde0 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b  ePage(pPtrPage);
1cdf0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1ce00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
1ce10 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74   modifyPagePoint
1ce20 65 72 28 70 50 74 72 50 61 67 65 2c 20 69 44 62  er(pPtrPage, iDb
1ce30 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c  Page, iFreePage,
1ce40 20 65 54 79 70 65 29 3b 0a 20 20 20 20 72 65 6c   eType);.    rel
1ce50 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67  easePage(pPtrPag
1ce60 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  e);.    if( rc==
1ce70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ce80 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
1ce90 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79  , iFreePage, eTy
1cea0 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 26 72  pe, iPtrPage, &r
1ceb0 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  c);.    }.  }.  
1cec0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1ced0 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   Forward declara
1cee0 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79  tion required by
1cef0 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
1cf00 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ). */.static int
1cf10 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
1cf20 67 65 28 42 74 53 68 61 72 65 64 20 2a 2c 20 4d  ge(BtShared *, M
1cf30 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20  emPage **, Pgno 
1cf40 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f  *, Pgno, u8);../
1cf50 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 73  *.** Perform a s
1cf60 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 61 6e  ingle step of an
1cf70 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63   incremental-vac
1cf80 75 75 6d 2e 20 49 66 20 73 75 63 63 65 73 73 66  uum. If successf
1cf90 75 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51  ul, return.** SQ
1cfa0 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72  LITE_OK. If ther
1cfb0 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20  e is no work to 
1cfc0 64 6f 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72  do (and therefor
1cfd0 65 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 0a 2a  e no point in .*
1cfe0 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  * calling this f
1cff0 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20  unction again), 
1d000 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
1d010 4e 45 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72  NE. Or, if an er
1d020 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20  ror .** occurs, 
1d030 72 65 74 75 72 6e 20 73 6f 6d 65 20 6f 74 68 65  return some othe
1d040 72 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a  r error code..**
1d050 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66 69  .** More specifi
1d060 63 61 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e 63  cally, this func
1d070 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
1d080 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65   re-organize the
1d090 20 64 61 74 61 62 61 73 65 20 73 6f 20 0a 2a 2a   database so .**
1d0a0 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70   that the last p
1d0b0 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  age of the file 
1d0c0 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65  currently in use
1d0d0 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e   is no longer in
1d0e0 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61   use..**.** Para
1d0f0 6d 65 74 65 72 20 6e 46 69 6e 20 69 73 20 74 68  meter nFin is th
1d100 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
1d110 73 20 74 68 61 74 20 74 68 69 73 20 64 61 74 61  s that this data
1d120 62 61 73 65 20 77 6f 75 6c 64 20 63 6f 6e 74 61  base would conta
1d130 69 6e 0a 2a 2a 20 77 65 72 65 20 74 68 69 73 20  in.** were this 
1d140 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20  function called 
1d150 75 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73  until it returns
1d160 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a   SQLITE_DONE..**
1d170 0a 2a 2a 20 49 66 20 74 68 65 20 62 43 6f 6d 6d  .** If the bComm
1d180 69 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  it parameter is 
1d190 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69 73 20 66  non-zero, this f
1d1a0 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20  unction assumes 
1d1b0 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 63 61 6c  that the .** cal
1d1c0 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70 20 63 61  ler will keep ca
1d1d0 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63 75 75 6d  lling incrVacuum
1d1e0 53 74 65 70 28 29 20 75 6e 74 69 6c 20 69 74 20  Step() until it 
1d1f0 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44  returns SQLITE_D
1d200 4f 4e 45 20 0a 2a 2a 20 6f 72 20 61 6e 20 65 72  ONE .** or an er
1d210 72 6f 72 2e 20 62 43 6f 6d 6d 69 74 20 69 73 20  ror. bCommit is 
1d220 70 61 73 73 65 64 20 74 72 75 65 20 66 6f 72 20  passed true for 
1d230 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 2d 6f  an auto-vacuum-o
1d240 6e 2d 63 6f 6d 6d 69 74 20 0a 2a 2a 20 6f 70 65  n-commit .** ope
1d250 72 61 74 69 6f 6e 2c 20 6f 72 20 66 61 6c 73 65  ration, or false
1d260 20 66 6f 72 20 61 6e 20 69 6e 63 72 65 6d 65 6e   for an incremen
1d270 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2f 0a 73  tal vacuum..*/.s
1d280 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61  tatic int incrVa
1d290 63 75 75 6d 53 74 65 70 28 42 74 53 68 61 72 65  cuumStep(BtShare
1d2a0 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69  d *pBt, Pgno nFi
1d2b0 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 2c  n, Pgno iLastPg,
1d2c0 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20   int bCommit){. 
1d2d0 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b   Pgno nFreeList;
1d2e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1d2f0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74  mber of pages st
1d300 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ill on the free-
1d310 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63  list */.  int rc
1d320 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
1d330 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1d340 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
1d350 20 61 73 73 65 72 74 28 20 69 4c 61 73 74 50 67   assert( iLastPg
1d360 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20 69 66 28 20  >nFin );..  if( 
1d370 21 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70  !PTRMAP_ISPAGE(p
1d380 42 74 2c 20 69 4c 61 73 74 50 67 29 20 26 26 20  Bt, iLastPg) && 
1d390 69 4c 61 73 74 50 67 21 3d 50 45 4e 44 49 4e 47  iLastPg!=PENDING
1d3a0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1d3b0 29 7b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b  ){.    u8 eType;
1d3c0 0a 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61  .    Pgno iPtrPa
1d3d0 67 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69  ge;..    nFreeLi
1d3e0 73 74 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  st = get4byte(&p
1d3f0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1d400 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66 28 20  a[36]);.    if( 
1d410 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20 29 7b 0a  nFreeList==0 ){.
1d420 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1d430 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
1d440 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70  .    rc = ptrmap
1d450 47 65 74 28 70 42 74 2c 20 69 4c 61 73 74 50 67  Get(pBt, iLastPg
1d460 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74 72 50  , &eType, &iPtrP
1d470 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
1d480 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1d490 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1d4a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 54      }.    if( eT
1d4b0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
1d4c0 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 72 65  PAGE ){.      re
1d4d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1d4e0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
1d4f0 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d  .    if( eType==
1d500 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20  PTRMAP_FREEPAGE 
1d510 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f  ){.      if( bCo
1d520 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  mmit==0 ){.     
1d530 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65     /* Remove the
1d540 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66   page from the f
1d550 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74 2e 20  iles free-list. 
1d560 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75  This is not requ
1d570 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ired.        ** 
1d580 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 6e 6f  if bCommit is no
1d590 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74 20  n-zero. In that 
1d5a0 63 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d 6c  case, the free-l
1d5b0 69 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20  ist will be.    
1d5c0 20 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64      ** truncated
1d5d0 20 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20 74   to zero after t
1d5e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
1d5f0 75 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65 73  urns, so it does
1d600 6e 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  n't .        ** 
1d610 6d 61 74 74 65 72 20 69 66 20 69 74 20 73 74 69  matter if it sti
1d620 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65  ll contains some
1d630 20 67 61 72 62 61 67 65 20 65 6e 74 72 69 65 73   garbage entries
1d640 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
1d650 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50       Pgno iFreeP
1d660 67 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61  g;.        MemPa
1d670 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20  ge *pFreePg;.   
1d680 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
1d690 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
1d6a0 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65   &pFreePg, &iFre
1d6b0 65 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 42 54  ePg, iLastPg, BT
1d6c0 41 4c 4c 4f 43 5f 45 58 41 43 54 29 3b 0a 20 20  ALLOC_EXACT);.  
1d6d0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1d6e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1d6f0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1d700 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1d710 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50    assert( iFreeP
1d720 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20 20  g==iLastPg );.  
1d730 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1d740 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20  e(pFreePg);.    
1d750 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b    }.    } else {
1d760 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65  .      Pgno iFre
1d770 65 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  ePg;            
1d780 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 72 65   /* Index of fre
1d790 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 70  e page to move p
1d7a0 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20  LastPg to */.   
1d7b0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73     MemPage *pLas
1d7c0 74 50 67 3b 0a 20 20 20 20 20 20 75 38 20 65 4d  tPg;.      u8 eM
1d7d0 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 41 4e  ode = BTALLOC_AN
1d7e0 59 3b 20 20 20 2f 2a 20 4d 6f 64 65 20 70 61 72  Y;   /* Mode par
1d7f0 61 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63  ameter for alloc
1d800 61 74 65 42 74 72 65 65 50 61 67 65 28 29 20 2a  ateBtreePage() *
1d810 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65  /.      Pgno iNe
1d820 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ar = 0;         
1d830 20 20 2f 2a 20 6e 65 61 72 62 79 20 70 61 72 61    /* nearby para
1d840 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61  meter for alloca
1d850 74 65 42 74 72 65 65 50 61 67 65 28 29 20 2a 2f  teBtreePage() */
1d860 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72  ..      rc = btr
1d870 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
1d880 4c 61 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67  LastPg, &pLastPg
1d890 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
1d8a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1d8b0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1d8c0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rc;.      }..   
1d8d0 20 20 20 2f 2a 20 49 66 20 62 43 6f 6d 6d 69 74     /* If bCommit
1d8e0 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c   is zero, this l
1d8f0 6f 6f 70 20 72 75 6e 73 20 65 78 61 63 74 6c 79  oop runs exactly
1d900 20 6f 6e 63 65 20 61 6e 64 20 70 61 67 65 20 70   once and page p
1d910 4c 61 73 74 50 67 0a 20 20 20 20 20 20 2a 2a 20  LastPg.      ** 
1d920 69 73 20 73 77 61 70 70 65 64 20 77 69 74 68 20  is swapped with 
1d930 74 68 65 20 66 69 72 73 74 20 66 72 65 65 20 70  the first free p
1d940 61 67 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74  age pulled off t
1d950 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a 20 20  he free list..  
1d960 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
1d970 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
1d980 64 2c 20 69 66 20 62 43 6f 6d 6d 69 74 20 69 73  d, if bCommit is
1d990 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65   greater than ze
1d9a0 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20 20  ro, then keep.  
1d9b0 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75      ** looping u
1d9c0 6e 74 69 6c 20 61 20 66 72 65 65 2d 70 61 67 65  ntil a free-page
1d9d0 20 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20   located within 
1d9e0 74 68 65 20 66 69 72 73 74 20 6e 46 69 6e 20 70  the first nFin p
1d9f0 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66  ages.      ** of
1da00 20 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75   the file is fou
1da10 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nd..      */.   
1da20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d     if( bCommit==
1da30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f  0 ){.        eMo
1da40 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b  de = BTALLOC_LE;
1da50 0a 20 20 20 20 20 20 20 20 69 4e 65 61 72 20 3d  .        iNear =
1da60 20 6e 46 69 6e 3b 0a 20 20 20 20 20 20 7d 0a 20   nFin;.      }. 
1da70 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20       do {.      
1da80 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65    MemPage *pFree
1da90 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  Pg;.        rc =
1daa0 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
1dab0 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67  ge(pBt, &pFreePg
1dac0 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4e 65 61  , &iFreePg, iNea
1dad0 72 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20 20 20  r, eMode);.     
1dae0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1daf0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1db00 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c    releasePage(pL
1db10 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20  astPg);.        
1db20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1db30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
1db40 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65  eleasePage(pFree
1db50 50 67 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c  Pg);.      }whil
1db60 65 28 20 62 43 6f 6d 6d 69 74 20 26 26 20 69 46  e( bCommit && iF
1db70 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20  reePg>nFin );.  
1db80 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65      assert( iFre
1db90 65 50 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20  ePg<iLastPg );. 
1dba0 20 20 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d       .      rc =
1dbb0 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42   relocatePage(pB
1dbc0 74 2c 20 70 4c 61 73 74 50 67 2c 20 65 54 79 70  t, pLastPg, eTyp
1dbd0 65 2c 20 69 50 74 72 50 61 67 65 2c 20 69 46 72  e, iPtrPage, iFr
1dbe0 65 65 50 67 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a  eePg, bCommit);.
1dbf0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1dc00 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20  e(pLastPg);.    
1dc10 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1dc20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
1dc30 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1dc40 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  }.    }.  }..  i
1dc50 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b  f( bCommit==0 ){
1dc60 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
1dc70 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d  iLastPg--;.    }
1dc80 77 68 69 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d  while( iLastPg==
1dc90 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1dca0 45 28 70 42 74 29 20 7c 7c 20 50 54 52 4d 41 50  E(pBt) || PTRMAP
1dcb0 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61  _ISPAGE(pBt, iLa
1dcc0 73 74 50 67 29 20 29 3b 0a 20 20 20 20 70 42 74  stPg) );.    pBt
1dcd0 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20  ->bDoTruncate = 
1dce0 31 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  1;.    pBt->nPag
1dcf0 65 20 3d 20 69 4c 61 73 74 50 67 3b 0a 20 20 7d  e = iLastPg;.  }
1dd00 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1dd10 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
1dd20 65 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65  e database opene
1dd30 64 20 62 79 20 74 68 65 20 66 69 72 73 74 20 61  d by the first a
1dd40 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 75  rgument is an au
1dd50 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
1dd60 73 65 0a 2a 2a 20 6e 4f 72 69 67 20 70 61 67 65  se.** nOrig page
1dd70 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69  s in size contai
1dd80 6e 69 6e 67 20 6e 46 72 65 65 20 66 72 65 65 20  ning nFree free 
1dd90 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 74 68  pages. Return th
1dda0 65 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 73  e expected .** s
1ddb0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
1ddc0 61 73 65 20 69 6e 20 70 61 67 65 73 20 66 6f 6c  ase in pages fol
1ddd0 6c 6f 77 69 6e 67 20 61 6e 20 61 75 74 6f 2d 76  lowing an auto-v
1dde0 61 63 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e  acuum operation.
1ddf0 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20  .*/.static Pgno 
1de00 66 69 6e 61 6c 44 62 53 69 7a 65 28 42 74 53 68  finalDbSize(BtSh
1de10 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
1de20 6e 4f 72 69 67 2c 20 50 67 6e 6f 20 6e 46 72 65  nOrig, Pgno nFre
1de30 65 29 7b 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79  e){.  int nEntry
1de40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1de50 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1de60 6f 66 20 65 6e 74 72 69 65 73 20 6f 6e 20 6f 6e  of entries on on
1de70 65 20 70 74 72 6d 61 70 20 70 61 67 65 20 2a 2f  e ptrmap page */
1de80 0a 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b  .  Pgno nPtrmap;
1de90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dea0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1deb0 50 74 72 4d 61 70 20 70 61 67 65 73 20 74 6f 20  PtrMap pages to 
1dec0 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 50 67  be freed */.  Pg
1ded0 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20  no nFin;        
1dee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1def0 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f   Return value */
1df00 0a 0a 20 20 6e 45 6e 74 72 79 20 3d 20 70 42 74  ..  nEntry = pBt
1df10 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 3b 0a  ->usableSize/5;.
1df20 20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46 72    nPtrmap = (nFr
1df30 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f  ee-nOrig+PTRMAP_
1df40 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69  PAGENO(pBt, nOri
1df50 67 29 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e 74 72  g)+nEntry)/nEntr
1df60 79 3b 0a 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69  y;.  nFin = nOri
1df70 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74 72  g - nFree - nPtr
1df80 6d 61 70 3b 0a 20 20 69 66 28 20 6e 4f 72 69 67  map;.  if( nOrig
1df90 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  >PENDING_BYTE_PA
1dfa0 47 45 28 70 42 74 29 20 26 26 20 6e 46 69 6e 3c  GE(pBt) && nFin<
1dfb0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1dfc0 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e 46  E(pBt) ){.    nF
1dfd0 69 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  in--;.  }.  whil
1dfe0 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  e( PTRMAP_ISPAGE
1dff0 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e  (pBt, nFin) || n
1e000 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  Fin==PENDING_BYT
1e010 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
1e020 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a     nFin--;.  }..
1e030 20 20 72 65 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d    return nFin;.}
1e040 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d  ../*.** A write-
1e050 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
1e060 20 62 65 20 6f 70 65 6e 65 64 20 62 65 66 6f 72   be opened befor
1e070 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  e calling this f
1e080 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70  unction..** It p
1e090 65 72 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65  erforms a single
1e0a0 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f   unit of work to
1e0b0 77 61 72 64 73 20 61 6e 20 69 6e 63 72 65 6d 65  wards an increme
1e0c0 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a  ntal vacuum..**.
1e0d0 2a 2a 20 49 66 20 74 68 65 20 69 6e 63 72 65 6d  ** If the increm
1e0e0 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 69 73 20  ental vacuum is 
1e0f0 66 69 6e 69 73 68 65 64 20 61 66 74 65 72 20 74  finished after t
1e100 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73  his function has
1e110 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f   run,.** SQLITE_
1e120 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64  DONE is returned
1e130 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 66  . If it is not f
1e140 69 6e 69 73 68 65 64 2c 20 62 75 74 20 6e 6f 20  inished, but no 
1e150 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a  error occurred,.
1e160 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
1e170 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
1e180 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72  ise an SQLite er
1e190 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e  ror code. .*/.in
1e1a0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  t sqlite3BtreeIn
1e1b0 63 72 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a  crVacuum(Btree *
1e1c0 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
1e1d0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1e1e0 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74  p->pBt;..  sqlit
1e1f0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
1e200 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
1e210 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
1e220 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20 70 2d  RANS_WRITE && p-
1e230 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1e240 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20 21  WRITE );.  if( !
1e250 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
1e260 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
1e270 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65  TE_DONE;.  }else
1e280 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67  {.    Pgno nOrig
1e290 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e   = btreePagecoun
1e2a0 74 28 70 42 74 29 3b 0a 20 20 20 20 50 67 6e 6f  t(pBt);.    Pgno
1e2b0 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74   nFree = get4byt
1e2c0 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
1e2d0 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20  aData[36]);.    
1e2e0 50 67 6e 6f 20 6e 46 69 6e 20 3d 20 66 69 6e 61  Pgno nFin = fina
1e2f0 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72  lDbSize(pBt, nOr
1e300 69 67 2c 20 6e 46 72 65 65 29 3b 0a 0a 20 20 20  ig, nFree);..   
1e310 20 69 66 28 20 6e 4f 72 69 67 3c 6e 46 69 6e 20   if( nOrig<nFin 
1e320 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
1e330 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1e340 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  T;.    }else if(
1e350 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20   nFree>0 ){.    
1e360 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75    rc = saveAllCu
1e370 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29  rsors(pBt, 0, 0)
1e380 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
1e390 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1e3a0 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41       invalidateA
1e3b0 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
1e3c0 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63  pBt);.        rc
1e3d0 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65   = incrVacuumSte
1e3e0 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72  p(pBt, nFin, nOr
1e3f0 69 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ig, 0);.      }.
1e400 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1e410 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1e420 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1e430 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
1e440 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
1e450 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
1e460 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
1e470 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e  aData[28], pBt->
1e480 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  nPage);.      }.
1e490 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e4a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
1e4b0 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  E;.    }.  }.  s
1e4c0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1e4d0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
1e4e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1e4f0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
1e500 64 20 70 72 69 6f 72 20 74 6f 20 73 71 6c 69 74  d prior to sqlit
1e510 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 20 77 68  e3PagerCommit wh
1e520 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  en a transaction
1e530 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  .** is committed
1e540 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63   for an auto-vac
1e550 75 75 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  uum database..**
1e560 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b  .** If SQLITE_OK
1e570 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68   is returned, th
1e580 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73 20 73  en *pnTrunc is s
1e590 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
1e5a0 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74 68 65   of pages.** the
1e5b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73   database file s
1e5c0 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74  hould be truncat
1e5d0 65 64 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65  ed to during the
1e5e0 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e   commit process.
1e5f0 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64 61   .** i.e. the da
1e600 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20  tabase has been 
1e610 72 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20 74  reorganized so t
1e620 68 61 74 20 6f 6e 6c 79 20 74 68 65 20 66 69 72  hat only the fir
1e630 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70  st *pnTrunc.** p
1e640 61 67 65 73 20 61 72 65 20 69 6e 20 75 73 65 2e  ages are in use.
1e650 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
1e660 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28  utoVacuumCommit(
1e670 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
1e680 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1e690 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70  E_OK;.  Pager *p
1e6a0 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61  Pager = pBt->pPa
1e6b0 67 65 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28  ger;.  VVA_ONLY(
1e6c0 20 69 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c 69   int nRef = sqli
1e6d0 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
1e6e0 28 70 50 61 67 65 72 29 3b 20 29 0a 0a 20 20 61  (pPager); )..  a
1e6f0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1e700 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
1e710 75 74 65 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c  utex) );.  inval
1e720 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77  idateAllOverflow
1e730 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20 61 73  Cache(pBt);.  as
1e740 73 65 72 74 28 70 42 74 2d 3e 61 75 74 6f 56 61  sert(pBt->autoVa
1e750 63 75 75 6d 29 3b 0a 20 20 69 66 28 20 21 70 42  cuum);.  if( !pB
1e760 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 29 7b  t->incrVacuum ){
1e770 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20  .    Pgno nFin; 
1e780 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1e790 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61  r of pages in da
1e7a0 74 61 62 61 73 65 20 61 66 74 65 72 20 61 75 74  tabase after aut
1e7b0 6f 76 61 63 75 75 6d 69 6e 67 20 2a 2f 0a 20 20  ovacuuming */.  
1e7c0 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b 20 20 20    Pgno nFree;   
1e7d0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1e7e0 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  f pages on the f
1e7f0 72 65 65 6c 69 73 74 20 69 6e 69 74 69 61 6c 6c  reelist initiall
1e800 79 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 46  y */.    Pgno iF
1e810 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  ree;        /* T
1e820 68 65 20 6e 65 78 74 20 70 61 67 65 20 74 6f 20  he next page to 
1e830 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20  be freed */.    
1e840 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20  Pgno nOrig;     
1e850 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73     /* Database s
1e860 69 7a 65 20 62 65 66 6f 72 65 20 66 72 65 65 69  ize before freei
1e870 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69 67  ng */..    nOrig
1e880 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e   = btreePagecoun
1e890 74 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20  t(pBt);.    if( 
1e8a0 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
1e8b0 74 2c 20 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72  t, nOrig) || nOr
1e8c0 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ig==PENDING_BYTE
1e8d0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
1e8e0 20 20 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74      /* It is not
1e8f0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 72 65   possible to cre
1e900 61 74 65 20 61 20 64 61 74 61 62 61 73 65 20 66  ate a database f
1e910 6f 72 20 77 68 69 63 68 20 74 68 65 20 66 69 6e  or which the fin
1e920 61 6c 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  al page.      **
1e930 20 69 73 20 65 69 74 68 65 72 20 61 20 70 6f 69   is either a poi
1e940 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 6f 72  nter-map page or
1e950 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 62 79 74   the pending-byt
1e960 65 20 70 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20  e page. If one. 
1e970 20 20 20 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75       ** is encou
1e980 6e 74 65 72 65 64 2c 20 74 68 69 73 20 69 6e 64  ntered, this ind
1e990 69 63 61 74 65 73 20 63 6f 72 72 75 70 74 69 6f  icates corruptio
1e9a0 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
1e9b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e9c0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1e9d0 20 20 7d 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d    }..    nFree =
1e9e0 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
1e9f0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
1ea00 5d 29 3b 0a 20 20 20 20 6e 46 69 6e 20 3d 20 66  ]);.    nFin = f
1ea10 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c 20  inalDbSize(pBt, 
1ea20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a 20  nOrig, nFree);. 
1ea30 20 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72 69     if( nFin>nOri
1ea40 67 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  g ) return SQLIT
1ea50 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1ea60 20 20 20 20 69 66 28 20 6e 46 69 6e 3c 6e 4f 72      if( nFin<nOr
1ea70 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ig ){.      rc =
1ea80 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
1ea90 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  pBt, 0, 0);.    
1eaa0 7d 0a 20 20 20 20 66 6f 72 28 69 46 72 65 65 3d  }.    for(iFree=
1eab0 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e 46 69  nOrig; iFree>nFi
1eac0 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  n && rc==SQLITE_
1ead0 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20  OK; iFree--){.  
1eae0 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63      rc = incrVac
1eaf0 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69  uumStep(pBt, nFi
1eb00 6e 2c 20 69 46 72 65 65 2c 20 31 29 3b 0a 20 20  n, iFree, 1);.  
1eb10 20 20 7d 0a 20 20 20 20 69 66 28 20 28 72 63 3d    }.    if( (rc=
1eb20 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20  =SQLITE_DONE || 
1eb30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26  rc==SQLITE_OK) &
1eb40 26 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20  & nFree>0 ){.   
1eb50 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1eb60 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
1eb70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
1eb80 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
1eb90 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
1eba0 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20  ata[32], 0);.   
1ebb0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
1ebc0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
1ebd0 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  36], 0);.      p
1ebe0 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
1ebf0 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c  age1->aData[28],
1ec00 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20 70 42   nFin);.      pB
1ec10 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d  t->bDoTruncate =
1ec20 20 31 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e   1;.      pBt->n
1ec30 50 61 67 65 20 3d 20 6e 46 69 6e 3b 0a 20 20 20  Page = nFin;.   
1ec40 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
1ec50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ec60 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f    sqlite3PagerRo
1ec70 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
1ec80 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
1ec90 65 72 74 28 20 6e 52 65 66 3e 3d 73 71 6c 69 74  ert( nRef>=sqlit
1eca0 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
1ecb0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74  pPager) );.  ret
1ecc0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65  urn rc;.}..#else
1ecd0 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54   /* ifndef SQLIT
1ece0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1ecf0 4d 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 73 65  M */.# define se
1ed00 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 78 29  tChildPtrmaps(x)
1ed10 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69   SQLITE_OK.#endi
1ed20 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
1ed30 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66  utine does the f
1ed40 69 72 73 74 20 70 68 61 73 65 20 6f 66 20 61 20  irst phase of a 
1ed50 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74  two-phase commit
1ed60 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
1ed70 2a 2a 20 63 61 75 73 65 73 20 61 20 72 6f 6c 6c  ** causes a roll
1ed80 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20  back journal to 
1ed90 62 65 20 63 72 65 61 74 65 64 20 28 69 66 20 69  be created (if i
1eda0 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61  t does not alrea
1edb0 64 79 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64  dy exist).** and
1edc0 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
1edd0 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74 69  enough informati
1ede0 6f 6e 20 73 6f 20 74 68 61 74 20 69 66 20 61 20  on so that if a 
1edf0 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63 75 72  power loss occur
1ee00 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  s.** the databas
1ee10 65 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65  e can be restore
1ee20 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
1ee30 6c 20 73 74 61 74 65 20 62 79 20 70 6c 61 79 69  l state by playi
1ee40 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a  ng back.** the j
1ee50 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68  ournal.  Then th
1ee60 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
1ee70 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c  e journal are fl
1ee80 75 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20  ushed out to.** 
1ee90 74 68 65 20 64 69 73 6b 2e 20 20 41 66 74 65 72  the disk.  After
1eea0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
1eeb0 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c  safely on oxide,
1eec0 20 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20   the changes to 
1eed0 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
1eee0 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  are written into
1eef0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1ef00 6c 65 20 61 6e 64 20 66 6c 75 73 68 65 64 20 74  le and flushed t
1ef10 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74  o oxide..** At t
1ef20 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20 63  he end of this c
1ef30 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63  all, the rollbac
1ef40 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20  k journal still 
1ef50 65 78 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a  exists on the.**
1ef60 20 64 69 73 6b 20 61 6e 64 20 77 65 20 61 72 65   disk and we are
1ef70 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61   still holding a
1ef80 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65  ll locks, so the
1ef90 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
1efa0 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65   not.** committe
1efb0 64 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 42  d.  See sqlite3B
1efc0 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
1efd0 77 6f 28 29 20 66 6f 72 20 74 68 65 20 73 65 63  wo() for the sec
1efe0 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 74 68 65  ond phase of the
1eff0 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65  .** commit proce
1f000 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  ss..**.** This c
1f010 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  all is a no-op i
1f020 66 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73  f no write-trans
1f030 61 63 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e  action is curren
1f040 74 6c 79 20 61 63 74 69 76 65 20 6f 6e 20 70 42  tly active on pB
1f050 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  t..**.** Otherwi
1f060 73 65 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74  se, sync the dat
1f070 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74  abase file for t
1f080 68 65 20 62 74 72 65 65 20 70 42 74 2e 20 7a 4d  he btree pBt. zM
1f090 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a  aster points to.
1f0a0 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ** the name of a
1f0b0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1f0c0 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64  file that should
1f0d0 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
1f0e0 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75   the.** individu
1f0f0 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  al journal file,
1f100 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64   or is NULL, ind
1f110 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65  icating no maste
1f120 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a  r journal file .
1f130 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61 74 61 62  ** (single datab
1f140 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ase transaction)
1f150 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
1f160 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  s is called, the
1f170 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1f180 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 68  should already h
1f190 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61  ave been.** crea
1f1a0 74 65 64 2c 20 70 6f 70 75 6c 61 74 65 64 20 77  ted, populated w
1f1b0 69 74 68 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ith this journal
1f1c0 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 73 79 6e   pointer and syn
1f1d0 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ced to disk..**.
1f1e0 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 69 73 20  ** Once this is 
1f1f0 72 6f 75 74 69 6e 65 20 68 61 73 20 72 65 74 75  routine has retu
1f200 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74  rned, the only t
1f210 68 69 6e 67 20 72 65 71 75 69 72 65 64 20 74 6f  hing required to
1f220 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77   commit.** the w
1f230 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
1f240 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61   for this databa
1f250 73 65 20 66 69 6c 65 20 69 73 20 74 6f 20 64 65  se file is to de
1f260 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
1f270 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1f280 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
1f290 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c 20 63 6f  One(Btree *p, co
1f2a0 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
1f2b0 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
1f2c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
1f2d0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
1f2e0 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42  S_WRITE ){.    B
1f2f0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1f300 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74  ->pBt;.    sqlit
1f310 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
1f320 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1f330 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1f340 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
1f350 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
1f360 20 72 63 20 3d 20 61 75 74 6f 56 61 63 75 75 6d   rc = autoVacuum
1f370 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 20  Commit(pBt);.   
1f380 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1f390 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1f3a0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1f3b0 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65  e(p);.        re
1f3c0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1f3d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1f3e0 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20  Bt->bDoTruncate 
1f3f0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1f400 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61  PagerTruncateIma
1f410 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ge(pBt->pPager, 
1f420 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20  pBt->nPage);.   
1f430 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63   }.#endif.    rc
1f440 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43   = sqlite3PagerC
1f450 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42  ommitPhaseOne(pB
1f460 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73 74  t->pPager, zMast
1f470 65 72 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  er, 0);.    sqli
1f480 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1f490 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1f4a0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
1f4b0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1f4c0 6c 65 64 20 66 72 6f 6d 20 62 6f 74 68 20 42 74  led from both Bt
1f4d0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
1f4e0 6f 28 29 20 61 6e 64 20 42 74 72 65 65 52 6f 6c  o() and BtreeRol
1f4f0 6c 62 61 63 6b 28 29 0a 2a 2a 20 61 74 20 74 68  lback().** at th
1f500 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20  e conclusion of 
1f510 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  a transaction..*
1f520 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  /.static void bt
1f530 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f  reeEndTransactio
1f540 6e 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  n(Btree *p){.  B
1f550 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1f560 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33  ->pBt;.  sqlite3
1f570 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
1f580 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
1f590 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
1f5a0 29 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ) );..#ifndef SQ
1f5b0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1f5c0 43 55 55 4d 0a 20 20 70 42 74 2d 3e 62 44 6f 54  CUUM.  pBt->bDoT
1f5d0 72 75 6e 63 61 74 65 20 3d 20 30 3b 0a 23 65 6e  runcate = 0;.#en
1f5e0 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  dif.  if( p->inT
1f5f0 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20  rans>TRANS_NONE 
1f600 26 26 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64  && db->nVdbeRead
1f610 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  >1 ){.    /* If 
1f620 74 68 65 72 65 20 61 72 65 20 6f 74 68 65 72 20  there are other 
1f630 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74  active statement
1f640 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f  s that belong to
1f650 20 74 68 69 73 20 64 61 74 61 62 61 73 65 0a 20   this database. 
1f660 20 20 20 2a 2a 20 68 61 6e 64 6c 65 2c 20 64 6f     ** handle, do
1f670 77 6e 67 72 61 64 65 20 74 6f 20 61 20 72 65 61  wngrade to a rea
1f680 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69  d-only transacti
1f690 6f 6e 2e 20 54 68 65 20 6f 74 68 65 72 20 73 74  on. The other st
1f6a0 61 74 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20  atements.    ** 
1f6b0 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65 61  may still be rea
1f6c0 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 64 61  ding from the da
1f6d0 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20  tabase.  */.    
1f6e0 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61 72  downgradeAllShar
1f6f0 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
1f700 73 28 70 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 54  s(p);.    p->inT
1f710 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 52 45 41  rans = TRANS_REA
1f720 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  D;.  }else{.    
1f730 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65  /* If the handle
1f740 20 68 61 64 20 61 6e 79 20 6b 69 6e 64 20 6f 66   had any kind of
1f750 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
1f760 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74 68 65  n, decrement the
1f770 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63   .    ** transac
1f780 74 69 6f 6e 20 63 6f 75 6e 74 20 6f 66 20 74 68  tion count of th
1f790 65 20 73 68 61 72 65 64 20 62 74 72 65 65 2e 20  e shared btree. 
1f7a0 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  If the transacti
1f7b0 6f 6e 20 63 6f 75 6e 74 20 0a 20 20 20 20 2a 2a  on count .    **
1f7c0 20 72 65 61 63 68 65 73 20 30 2c 20 73 65 74 20   reaches 0, set 
1f7d0 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65  the shared state
1f7e0 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20   to TRANS_NONE. 
1f7f0 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  The unlockBtreeI
1f800 66 55 6e 75 73 65 64 28 29 0a 20 20 20 20 2a 2a  fUnused().    **
1f810 20 63 61 6c 6c 20 62 65 6c 6f 77 20 77 69 6c 6c   call below will
1f820 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65   unlock the page
1f830 72 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  r.  */.    if( p
1f840 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
1f850 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 63  _NONE ){.      c
1f860 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
1f870 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b  heTableLocks(p);
1f880 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  .      pBt->nTra
1f890 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20  nsaction--;.    
1f8a0 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54    if( 0==pBt->nT
1f8b0 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20  ransaction ){.  
1f8c0 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61        pBt->inTra
1f8d0 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
1f8e0 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20  _NONE;.      }. 
1f8f0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74     }..    /* Set
1f900 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
1f910 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20 74  nsaction state t
1f920 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64  o TRANS_NONE and
1f930 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 20 20 20   unlock the .   
1f940 20 2a 2a 20 70 61 67 65 72 20 69 66 20 74 68 69   ** pager if thi
1f950 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68  s call closed th
1f960 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20 77  e only read or w
1f970 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
1f980 2e 20 20 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e 54  .  */.    p->inT
1f990 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  rans = TRANS_NON
1f9a0 45 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  E;.    unlockBtr
1f9b0 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
1f9c0 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74  .  }..  btreeInt
1f9d0 65 67 72 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a  egrity(p);.}../*
1f9e0 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74  .** Commit the t
1f9f0 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65  ransaction curre
1fa00 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73  ntly in progress
1fa10 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1fa20 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  tine implements 
1fa30 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65  the second phase
1fa40 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63 6f   of a 2-phase co
1fa50 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71  mmit.  The.** sq
1fa60 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
1fa70 50 68 61 73 65 4f 6e 65 28 29 20 72 6f 75 74 69  PhaseOne() routi
1fa80 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73  ne does the firs
1fa90 74 20 70 68 61 73 65 20 61 6e 64 20 73 68 6f 75  t phase and shou
1faa0 6c 64 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64  ld.** be invoked
1fab0 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
1fac0 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
1fad0 20 54 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   The sqlite3Btre
1fae0 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
1faf0 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 69 64  ).** routine did
1fb00 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66   all the work of
1fb10 20 77 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61   writing informa
1fb20 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b  tion out to disk
1fb30 20 61 6e 64 20 66 6c 75 73 68 69 6e 67 20 74 68   and flushing th
1fb40 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f  e.** contents so
1fb50 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20 77   that they are w
1fb60 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20  ritten onto the 
1fb70 64 69 73 6b 20 70 6c 61 74 74 65 72 2e 20 20 41  disk platter.  A
1fb80 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  ll this.** routi
1fb90 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 69 73 20  ne has to do is 
1fba0 64 65 6c 65 74 65 20 6f 72 20 74 72 75 6e 63 61  delete or trunca
1fbb0 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 68  te or zero the h
1fbc0 65 61 64 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20  eader in the.** 
1fbd0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
1fbe0 72 6e 61 6c 20 28 77 68 69 63 68 20 63 61 75 73  rnal (which caus
1fbf0 65 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  es the transacti
1fc00 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e  on to commit) an
1fc10 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e  d.** drop locks.
1fc20 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  .**.** Normally,
1fc30 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
1fc40 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 70 61  urs while the pa
1fc50 67 65 72 20 6c 61 79 65 72 20 69 73 20 61 74 74  ger layer is att
1fc60 65 6d 70 74 69 6e 67 20 74 6f 20 0a 2a 2a 20 66  empting to .** f
1fc70 69 6e 61 6c 69 7a 65 20 74 68 65 20 75 6e 64 65  inalize the unde
1fc80 72 6c 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66  rlying journal f
1fc90 69 6c 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ile, this functi
1fca0 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72  on returns an er
1fcb0 72 6f 72 20 61 6e 64 0a 2a 2a 20 74 68 65 20 75  ror and.** the u
1fcc0 70 70 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20  pper layer will 
1fcd0 61 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61  attempt a rollba
1fce0 63 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20  ck. However, if 
1fcf0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
1fd00 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65  ent.** is non-ze
1fd10 72 6f 20 74 68 65 6e 20 74 68 69 73 20 62 2d 74  ro then this b-t
1fd20 72 65 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ree transaction 
1fd30 69 73 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c  is part of a mul
1fd40 74 69 2d 66 69 6c 65 20 0a 2a 2a 20 74 72 61 6e  ti-file .** tran
1fd50 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73  saction. In this
1fd60 20 63 61 73 65 2c 20 74 68 65 20 74 72 61 6e 73   case, the trans
1fd70 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  action has alrea
1fd80 64 79 20 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65  dy been committe
1fd90 64 20 0a 2a 2a 20 28 62 79 20 64 65 6c 65 74 69  d .** (by deleti
1fda0 6e 67 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  ng a master jour
1fdb0 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68  nal file) and th
1fdc0 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 69 67  e caller will ig
1fdd0 6e 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75  nore this .** fu
1fde0 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 63  nctions return c
1fdf0 6f 64 65 2e 20 53 6f 2c 20 65 76 65 6e 20 69 66  ode. So, even if
1fe00 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1fe10 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 6c 61   in the pager la
1fe20 79 65 72 2c 0a 2a 2a 20 72 65 73 65 74 20 74 68  yer,.** reset th
1fe30 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 73  e b-tree objects
1fe40 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20   internal state 
1fe50 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
1fe60 20 74 68 65 20 77 72 69 74 65 0a 2a 2a 20 74 72   the write.** tr
1fe70 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65  ansaction has be
1fe80 65 6e 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20  en closed. This 
1fe90 69 73 20 71 75 69 74 65 20 73 61 66 65 2c 20 61  is quite safe, a
1fea0 73 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c  s the pager will
1feb0 20 68 61 76 65 0a 2a 2a 20 74 72 61 6e 73 69 74   have.** transit
1fec0 69 6f 6e 65 64 20 74 6f 20 74 68 65 20 65 72 72  ioned to the err
1fed0 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  or state..**.** 
1fee0 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73  This will releas
1fef0 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
1ff00 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1ff10 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65   file.  If there
1ff20 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76  .** are no activ
1ff30 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c  e cursors, it al
1ff40 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20  so releases the 
1ff50 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e  read lock..*/.in
1ff60 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
1ff70 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 42 74 72  mmitPhaseTwo(Btr
1ff80 65 65 20 2a 70 2c 20 69 6e 74 20 62 43 6c 65 61  ee *p, int bClea
1ff90 6e 75 70 29 7b 0a 0a 20 20 69 66 28 20 70 2d 3e  nup){..  if( p->
1ffa0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e  inTrans==TRANS_N
1ffb0 4f 4e 45 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ONE ) return SQL
1ffc0 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65  ITE_OK;.  sqlite
1ffd0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1ffe0 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
1fff0 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
20000 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 20 77  e handle has a w
20010 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
20020 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68   open, commit th
20030 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 73 20  e shared-btrees 
20040 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
20050 6e 20 61 6e 64 20 73 65 74 20 74 68 65 20 73 68  n and set the sh
20060 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52  ared state to TR
20070 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20  ANS_READ..  */. 
20080 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
20090 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
200a0 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
200b0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
200c0 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65  p->pBt;.    asse
200d0 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
200e0 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
200f0 49 54 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ITE );.    asser
20100 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63  t( pBt->nTransac
20110 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63  tion>0 );.    rc
20120 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43   = sqlite3PagerC
20130 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
20140 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
20150 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
20160 4b 20 26 26 20 62 43 6c 65 61 6e 75 70 3d 3d 30  K && bCleanup==0
20170 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
20180 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
20190 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
201a0 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 44  .    }.    p->iD
201b0 61 74 61 56 65 72 73 69 6f 6e 2d 2d 3b 20 20 2f  ataVersion--;  /
201c0 2a 20 43 6f 6d 70 65 6e 73 61 74 65 20 66 6f 72  * Compensate for
201d0 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65   pPager->iDataVe
201e0 72 73 69 6f 6e 2b 2b 3b 20 2a 2f 0a 20 20 20 20  rsion++; */.    
201f0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
20200 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b  on = TRANS_READ;
20210 0a 20 20 20 20 62 74 72 65 65 43 6c 65 61 72 48  .    btreeClearH
20220 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a  asContent(pBt);.
20230 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54    }..  btreeEndT
20240 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20  ransaction(p);. 
20250 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
20260 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
20270 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
20280 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68 61 73  .** Do both phas
20290 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a  es of a commit..
202a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
202b0 72 65 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 20  reeCommit(Btree 
202c0 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
202d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
202e0 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 71  er(p);.  rc = sq
202f0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
20300 50 68 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a  PhaseOne(p, 0);.
20310 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
20320 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
20330 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
20340 69 74 50 68 61 73 65 54 77 6f 28 70 2c 20 30 29  itPhaseTwo(p, 0)
20350 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
20360 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
20370 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
20380 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
20390 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20   sets the state 
203a0 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  to CURSOR_FAULT 
203b0 61 6e 64 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a  and the error.**
203c0 20 63 6f 64 65 20 74 6f 20 65 72 72 43 6f 64 65   code to errCode
203d0 20 66 6f 72 20 65 76 65 72 79 20 63 75 72 73 6f   for every curso
203e0 72 20 6f 6e 20 61 6e 79 20 42 74 53 68 61 72 65  r on any BtShare
203f0 64 20 74 68 61 74 20 70 42 74 72 65 65 0a 2a 2a  d that pBtree.**
20400 20 72 65 66 65 72 65 6e 63 65 73 2e 20 20 4f 72   references.  Or
20410 20 69 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c   if the writeOnl
20420 79 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f  y flag is set to
20430 20 31 2c 20 74 68 65 6e 20 6f 6e 6c 79 0a 2a 2a   1, then only.**
20440 20 74 72 69 70 20 77 72 69 74 65 20 63 75 72 73   trip write curs
20450 6f 72 73 20 61 6e 64 20 6c 65 61 76 65 20 72 65  ors and leave re
20460 61 64 20 63 75 72 73 6f 72 73 20 75 6e 63 68 61  ad cursors uncha
20470 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72  nged..**.** Ever
20480 79 20 63 75 72 73 6f 72 20 69 73 20 61 20 63 61  y cursor is a ca
20490 6e 64 69 64 61 74 65 20 74 6f 20 62 65 20 74 72  ndidate to be tr
204a0 69 70 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67  ipped, including
204b0 20 63 75 72 73 6f 72 73 0a 2a 2a 20 74 68 61 74   cursors.** that
204c0 20 62 65 6c 6f 6e 67 20 74 6f 20 6f 74 68 65 72   belong to other
204d0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
204e0 74 69 6f 6e 73 20 74 68 61 74 20 68 61 70 70 65  tions that happe
204f0 6e 20 74 6f 20 62 65 0a 2a 2a 20 73 68 61 72 69  n to be.** shari
20500 6e 67 20 74 68 65 20 63 61 63 68 65 20 77 69 74  ng the cache wit
20510 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  h pBtree..**.** 
20520 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 74  This routine get
20530 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
20540 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e  rollback occurs.
20550 20 49 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c   If the writeOnl
20560 79 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75  y.** flag is tru
20570 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69  e, then only wri
20580 74 65 2d 63 75 72 73 6f 72 73 20 6e 65 65 64 20  te-cursors need 
20590 62 65 20 74 72 69 70 70 65 64 20 2d 20 72 65 61  be tripped - rea
205a0 64 2d 6f 6e 6c 79 0a 2a 2a 20 63 75 72 73 6f 72  d-only.** cursor
205b0 73 20 73 61 76 65 20 74 68 65 69 72 20 63 75 72  s save their cur
205c0 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 73 20 73  rent positions s
205d0 6f 20 74 68 61 74 20 74 68 65 79 20 6d 61 79 20  o that they may 
205e0 63 6f 6e 74 69 6e 75 65 20 0a 2a 2a 20 66 6f 6c  continue .** fol
205f0 6c 6f 77 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62  lowing the rollb
20600 61 63 6b 2e 20 4f 72 2c 20 69 66 20 77 72 69 74  ack. Or, if writ
20610 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 2c 20  eOnly is false, 
20620 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65 20  all cursors are 
20630 0a 2a 2a 20 74 72 69 70 70 65 64 2e 20 49 6e 20  .** tripped. In 
20640 67 65 6e 65 72 61 6c 2c 20 77 72 69 74 65 4f 6e  general, writeOn
20650 6c 79 20 69 73 20 66 61 6c 73 65 20 69 66 20 74  ly is false if t
20660 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62  he transaction b
20670 65 69 6e 67 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62  eing.** rolled b
20680 61 63 6b 20 6d 6f 64 69 66 69 65 64 20 74 68 65  ack modified the
20690 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
206a0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 62  . In this case b
206b0 2d 74 72 65 65 20 72 6f 6f 74 0a 2a 2a 20 70 61  -tree root.** pa
206c0 67 65 73 20 6d 61 79 20 62 65 20 6d 6f 76 65 64  ges may be moved
206d0 20 6f 72 20 64 65 6c 65 74 65 64 20 66 72 6f 6d   or deleted from
206e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6c   the database al
206f0 74 6f 67 65 74 68 65 72 2c 20 6d 61 6b 69 6e 67  together, making
20700 0a 2a 2a 20 69 74 20 75 6e 73 61 66 65 20 66 6f  .** it unsafe fo
20710 72 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 74  r read cursors t
20720 6f 20 63 6f 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a  o continue..**.*
20730 2a 20 49 66 20 74 68 65 20 77 72 69 74 65 4f 6e  * If the writeOn
20740 6c 79 20 66 6c 61 67 20 69 73 20 74 72 75 65 20  ly flag is true 
20750 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 69 73 20  and an error is 
20760 65 6e 63 6f 75 6e 74 65 72 65 64 20 77 68 69 6c  encountered whil
20770 65 20 0a 2a 2a 20 73 61 76 69 6e 67 20 74 68 65  e .** saving the
20780 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f   current positio
20790 6e 20 6f 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79  n of a read-only
207a0 20 63 75 72 73 6f 72 2c 20 61 6c 6c 20 63 75 72   cursor, all cur
207b0 73 6f 72 73 2c 20 0a 2a 2a 20 69 6e 63 6c 75 64  sors, .** includ
207c0 69 6e 67 20 61 6c 6c 20 72 65 61 64 2d 63 75 72  ing all read-cur
207d0 73 6f 72 73 20 61 72 65 20 74 72 69 70 70 65 64  sors are tripped
207e0 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
207f0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
20800 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
20810 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
20820 72 73 20 77 68 69 6c 65 0a 2a 2a 20 73 61 76 69  rs while.** savi
20830 6e 67 20 61 20 63 75 72 73 6f 72 20 70 6f 73 69  ng a cursor posi
20840 74 69 6f 6e 2c 20 61 6e 20 53 51 4c 69 74 65 20  tion, an SQLite 
20850 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69  error code..*/.i
20860 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 54  nt sqlite3BtreeT
20870 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 42 74  ripAllCursors(Bt
20880 72 65 65 20 2a 70 42 74 72 65 65 2c 20 69 6e 74  ree *pBtree, int
20890 20 65 72 72 43 6f 64 65 2c 20 69 6e 74 20 77 72   errCode, int wr
208a0 69 74 65 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75  iteOnly){.  BtCu
208b0 72 73 6f 72 20 2a 70 3b 0a 20 20 69 6e 74 20 72  rsor *p;.  int r
208c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
208d0 20 20 61 73 73 65 72 74 28 20 28 77 72 69 74 65    assert( (write
208e0 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 77 72 69 74 65  Only==0 || write
208f0 4f 6e 6c 79 3d 3d 31 29 20 26 26 20 42 54 43 46  Only==1) && BTCF
20900 5f 57 72 69 74 65 46 6c 61 67 3d 3d 31 20 29 3b  _WriteFlag==1 );
20910 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b  .  if( pBtree ){
20920 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
20930 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a  eEnter(pBtree);.
20940 20 20 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65      for(p=pBtree
20950 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  ->pBt->pCursor; 
20960 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
20970 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
20980 20 20 20 69 66 28 20 77 72 69 74 65 4f 6e 6c 79     if( writeOnly
20990 20 26 26 20 28 70 2d 3e 63 75 72 46 6c 61 67 73   && (p->curFlags
209a0 20 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61   & BTCF_WriteFla
209b0 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  g)==0 ){.       
209c0 20 69 66 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d   if( p->eState==
209d0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
209e0 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  p->eState==CURSO
209f0 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20  R_SKIPNEXT ){.  
20a00 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 61 76          rc = sav
20a10 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
20a20 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  p);.          if
20a30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
20a40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  ){.            (
20a50 76 6f 69 64 29 73 71 6c 69 74 65 33 42 74 72 65  void)sqlite3Btre
20a60 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28  eTripAllCursors(
20a70 70 42 74 72 65 65 2c 20 72 63 2c 20 30 29 3b 0a  pBtree, rc, 0);.
20a80 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
20a90 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
20aa0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
20ab0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
20ac0 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43  lite3BtreeClearC
20ad0 75 72 73 6f 72 28 70 29 3b 0a 20 20 20 20 20 20  ursor(p);.      
20ae0 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55    p->eState = CU
20af0 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20  RSOR_FAULT;.    
20b00 20 20 20 20 70 2d 3e 73 6b 69 70 4e 65 78 74 20      p->skipNext 
20b10 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20  = errCode;.     
20b20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30   }.      for(i=0
20b30 3b 20 69 3c 3d 70 2d 3e 69 50 61 67 65 3b 20 69  ; i<=p->iPage; i
20b40 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c  ++){.        rel
20b50 65 61 73 65 50 61 67 65 28 70 2d 3e 61 70 50 61  easePage(p->apPa
20b60 67 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  ge[i]);.        
20b70 70 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30  p->apPage[i] = 0
20b80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
20b90 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
20ba0 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20  Leave(pBtree);. 
20bb0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
20bc0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
20bd0 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  k the transactio
20be0 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a  n in progress..*
20bf0 2a 0a 2a 2a 20 49 66 20 74 72 69 70 43 6f 64 65  *.** If tripCode
20c00 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f   is not SQLITE_O
20c10 4b 20 74 68 65 6e 20 63 75 72 73 6f 72 73 20 77  K then cursors w
20c20 69 6c 6c 20 62 65 20 69 6e 76 61 6c 69 64 61 74  ill be invalidat
20c30 65 64 20 28 74 72 69 70 70 65 64 29 2e 0a 2a 2a  ed (tripped)..**
20c40 20 4f 6e 6c 79 20 77 72 69 74 65 20 63 75 72 73   Only write curs
20c50 6f 72 73 20 61 72 65 20 74 72 69 70 70 65 64 20  ors are tripped 
20c60 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20  if writeOnly is 
20c70 74 72 75 65 20 62 75 74 20 61 6c 6c 20 63 75 72  true but all cur
20c80 73 6f 72 73 20 61 72 65 0a 2a 2a 20 74 72 69 70  sors are.** trip
20c90 70 65 64 20 69 66 20 77 72 69 74 65 4f 6e 6c 79  ped if writeOnly
20ca0 20 69 73 20 66 61 6c 73 65 2e 20 20 41 6e 79 20   is false.  Any 
20cb0 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 0a 2a  attempt to use.*
20cc0 2a 20 61 20 74 72 69 70 70 65 64 20 63 75 72 73  * a tripped curs
20cd0 6f 72 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69  or will result i
20ce0 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a  n an error..**.*
20cf0 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65  * This will rele
20d00 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ase the write lo
20d10 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
20d20 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  se file.  If the
20d30 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74  re.** are no act
20d40 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20  ive cursors, it 
20d50 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68  also releases th
20d60 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a  e read lock..*/.
20d70 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
20d80 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20 2a  Rollback(Btree *
20d90 70 2c 20 69 6e 74 20 74 72 69 70 43 6f 64 65 2c  p, int tripCode,
20da0 20 69 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b   int writeOnly){
20db0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
20dc0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
20dd0 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  pBt;.  MemPage *
20de0 70 50 61 67 65 31 3b 0a 0a 20 20 61 73 73 65 72  pPage1;..  asser
20df0 74 28 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 20  t( writeOnly==1 
20e00 7c 7c 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20  || writeOnly==0 
20e10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 72 69  );.  assert( tri
20e20 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 41 42  pCode==SQLITE_AB
20e30 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20  ORT_ROLLBACK || 
20e40 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45  tripCode==SQLITE
20e50 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  _OK );.  sqlite3
20e60 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
20e70 20 69 66 28 20 74 72 69 70 43 6f 64 65 3d 3d 53   if( tripCode==S
20e80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20e90 72 63 20 3d 20 74 72 69 70 43 6f 64 65 20 3d 20  rc = tripCode = 
20ea0 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
20eb0 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69  Bt, 0, 0);.    i
20ec0 66 28 20 72 63 20 29 20 77 72 69 74 65 4f 6e 6c  f( rc ) writeOnl
20ed0 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  y = 0;.  }else{.
20ee0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
20ef0 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 72  OK;.  }.  if( tr
20f00 69 70 43 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e  ipCode ){.    in
20f10 74 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42  t rc2 = sqlite3B
20f20 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f  treeTripAllCurso
20f30 72 73 28 70 2c 20 74 72 69 70 43 6f 64 65 2c 20  rs(p, tripCode, 
20f40 77 72 69 74 65 4f 6e 6c 79 29 3b 0a 20 20 20 20  writeOnly);.    
20f50 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
20f60 54 45 5f 4f 4b 20 7c 7c 20 28 77 72 69 74 65 4f  TE_OK || (writeO
20f70 6e 6c 79 3d 3d 30 20 26 26 20 72 63 32 3d 3d 53  nly==0 && rc2==S
20f80 51 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a 20 20 20  QLITE_OK) );.   
20f90 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45   if( rc2!=SQLITE
20fa0 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a  _OK ) rc = rc2;.
20fb0 20 20 7d 0a 20 20 62 74 72 65 65 49 6e 74 65 67    }.  btreeInteg
20fc0 72 69 74 79 28 70 29 3b 0a 0a 20 20 69 66 28 20  rity(p);..  if( 
20fd0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
20fe0 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69  S_WRITE ){.    i
20ff0 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20 61 73 73  nt rc2;..    ass
21000 65 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54 45  ert( TRANS_WRITE
21010 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ==pBt->inTransac
21020 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32 20  tion );.    rc2 
21030 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  = sqlite3PagerRo
21040 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67  llback(pBt->pPag
21050 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32  er);.    if( rc2
21060 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
21070 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20       rc = rc2;. 
21080 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65     }..    /* The
21090 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61   rollback may ha
210a0 76 65 20 64 65 73 74 72 6f 79 65 64 20 74 68 65  ve destroyed the
210b0 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 76   pPage1->aData v
210c0 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a  alue.  So.    **
210d0 20 63 61 6c 6c 20 62 74 72 65 65 47 65 74 50 61   call btreeGetPa
210e0 67 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20 61  ge() on page 1 a
210f0 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20  gain to make.   
21100 20 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31 2d   ** sure pPage1-
21110 3e 61 44 61 74 61 20 69 73 20 73 65 74 20 63 6f  >aData is set co
21120 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20  rrectly. */.    
21130 69 66 28 20 62 74 72 65 65 47 65 74 50 61 67 65  if( btreeGetPage
21140 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31  (pBt, 1, &pPage1
21150 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  , 0)==SQLITE_OK 
21160 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61  ){.      int nPa
21170 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 32 38  ge = get4byte(28
21180 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44  +(u8*)pPage1->aD
21190 61 74 61 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ata);.      test
211a0 63 61 73 65 28 20 6e 50 61 67 65 3d 3d 30 20 29  case( nPage==0 )
211b0 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61 67  ;.      if( nPag
211c0 65 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 50 61  e==0 ) sqlite3Pa
211d0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
211e0 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  ->pPager, &nPage
211f0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
21200 65 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 6e  e( pBt->nPage!=n
21210 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 70 42  Page );.      pB
21220 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65  t->nPage = nPage
21230 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  ;.      releaseP
21240 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20  age(pPage1);.   
21250 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63   }.    assert( c
21260 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73  ountValidCursors
21270 28 70 42 74 2c 20 31 29 3d 3d 30 20 29 3b 0a 20  (pBt, 1)==0 );. 
21280 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
21290 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45  ction = TRANS_RE
212a0 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c 65  AD;.    btreeCle
212b0 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  arHasContent(pBt
212c0 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45  );.  }..  btreeE
212d0 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29  ndTransaction(p)
212e0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
212f0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
21300 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
21310 53 74 61 72 74 20 61 20 73 74 61 74 65 6d 65 6e  Start a statemen
21320 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  t subtransaction
21330 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63  . The subtransac
21340 74 69 6f 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c  tion can be roll
21350 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70  ed.** back indep
21360 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65 20  endently of the 
21370 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  main transaction
21380 2e 20 59 6f 75 20 6d 75 73 74 20 73 74 61 72 74  . You must start
21390 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a   a transaction .
213a0 2a 2a 20 62 65 66 6f 72 65 20 73 74 61 72 74 69  ** before starti
213b0 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61 63 74  ng a subtransact
213c0 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e  ion. The subtran
213d0 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64  saction is ended
213e0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a   automatically .
213f0 2a 2a 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74  ** if the main t
21400 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69  ransaction commi
21410 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b  ts or rolls back
21420 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e  ..**.** Statemen
21430 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  t subtransaction
21440 73 20 61 72 65 20 75 73 65 64 20 61 72 6f 75 6e  s are used aroun
21450 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51 4c  d individual SQL
21460 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74   statements.** t
21470 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e 65  hat are containe
21480 64 20 77 69 74 68 69 6e 20 61 20 42 45 47 49 4e  d within a BEGIN
21490 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e  ...COMMIT block.
214a0 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69 6e    If a constrain
214b0 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72  t.** error occur
214c0 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61  s within the sta
214d0 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66 65  tement, the effe
214e0 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20 73  ct of that one s
214f0 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20  tatement.** can 
21500 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77  be rolled back w
21510 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
21520 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e   rollback the en
21530 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
21540 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65 6d  ..**.** A statem
21550 65 6e 74 20 73 75 62 2d 74 72 61 6e 73 61 63 74  ent sub-transact
21560 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ion is implement
21570 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f  ed as an anonymo
21580 75 73 20 73 61 76 65 70 6f 69 6e 74 2e 20 54 68  us savepoint. Th
21590 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73 73 65  e.** value passe
215a0 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
215b0 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
215c0 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
215d0 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20   savepoints,.** 
215e0 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6e 65  including the ne
215f0 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65  w anonymous save
21600 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74  point, open on t
21610 68 65 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20  he B-Tree. i.e. 
21620 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  if there.** are 
21630 6e 6f 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  no active savepo
21640 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65  ints and no othe
21650 72 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e  r statement-tran
21660 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a  sactions open,.*
21670 2a 20 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20  * iStatement is 
21680 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f 75  1. This anonymou
21690 73 20 73 61 76 65 70 6f 69 6e 74 20 63 61 6e 20  s savepoint can 
216a0 62 65 20 72 65 6c 65 61 73 65 64 20 6f 72 20 72  be released or r
216b0 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75 73  olled back.** us
216c0 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 42  ing the sqlite3B
216d0 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 29 20  treeSavepoint() 
216e0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  function..*/.int
216f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
21700 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70 2c  inStmt(Btree *p,
21710 20 69 6e 74 20 69 53 74 61 74 65 6d 65 6e 74 29   int iStatement)
21720 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
21730 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
21740 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42  >pBt;.  sqlite3B
21750 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
21760 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61  assert( p->inTra
21770 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
21780 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 42  );.  assert( (pB
21790 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
217a0 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20  S_READ_ONLY)==0 
217b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  );.  assert( iSt
217c0 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61  atement>0 );.  a
217d0 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e  ssert( iStatemen
217e0 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f  t>p->db->nSavepo
217f0 69 6e 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  int );.  assert(
21800 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
21810 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
21820 20 29 3b 0a 20 20 2f 2a 20 41 74 20 74 68 65 20   );.  /* At the 
21830 70 61 67 65 72 20 6c 65 76 65 6c 2c 20 61 20 73  pager level, a s
21840 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
21850 74 69 6f 6e 20 69 73 20 61 20 73 61 76 65 70 6f  tion is a savepo
21860 69 6e 74 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e  int with.  ** an
21870 20 69 6e 64 65 78 20 67 72 65 61 74 65 72 20 74   index greater t
21880 68 61 6e 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e  han all savepoin
21890 74 73 20 63 72 65 61 74 65 64 20 65 78 70 6c 69  ts created expli
218a0 63 69 74 6c 79 20 75 73 69 6e 67 0a 20 20 2a 2a  citly using.  **
218b0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e   SQL statements.
218c0 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74   It is illegal t
218d0 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65 20  o open, release 
218e0 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a  or rollback any.
218f0 20 20 2a 2a 20 73 75 63 68 20 73 61 76 65 70 6f    ** such savepo
21900 69 6e 74 73 20 77 68 69 6c 65 20 74 68 65 20 73  ints while the s
21910 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
21920 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69  tion savepoint i
21930 73 20 61 63 74 69 76 65 2e 0a 20 20 2a 2f 0a 20  s active..  */. 
21940 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
21950 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28  erOpenSavepoint(
21960 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 53 74  pBt->pPager, iSt
21970 61 74 65 6d 65 6e 74 29 3b 0a 20 20 73 71 6c 69  atement);.  sqli
21980 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
21990 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
219a0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f  ../*.** The seco
219b0 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
219c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70  his function, op
219d0 2c 20 69 73 20 61 6c 77 61 79 73 20 53 41 56 45  , is always SAVE
219e0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a  POINT_ROLLBACK.*
219f0 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f 52  * or SAVEPOINT_R
21a00 45 4c 45 41 53 45 2e 20 54 68 69 73 20 66 75 6e  ELEASE. This fun
21a10 63 74 69 6f 6e 20 65 69 74 68 65 72 20 72 65 6c  ction either rel
21a20 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62  eases or rolls b
21a30 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76 65 70  ack the.** savep
21a40 6f 69 6e 74 20 69 64 65 6e 74 69 66 69 65 64 20  oint identified 
21a50 62 79 20 70 61 72 61 6d 65 74 65 72 20 69 53 61  by parameter iSa
21a60 76 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69  vepoint, dependi
21a70 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20  ng on the value 
21a80 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a  .** of op..**.**
21a90 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65   Normally, iSave
21aa0 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74 65 72  point is greater
21ab0 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
21ac0 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c  o zero. However,
21ad0 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56   if op is.** SAV
21ae0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c  EPOINT_ROLLBACK,
21af0 20 74 68 65 6e 20 69 53 61 76 65 70 6f 69 6e 74   then iSavepoint
21b00 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e   may also be -1.
21b10 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
21b20 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f  e .** contents o
21b30 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61  f the entire tra
21b40 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c  nsaction are rol
21b50 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20 69  led back. This i
21b60 73 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66  s different.** f
21b70 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61  rom a normal tra
21b80 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63  nsaction rollbac
21b90 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61  k, as no locks a
21ba0 72 65 20 72 65 6c 65 61 73 65 64 20 61 6e 64 20  re released and 
21bb0 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  the.** transacti
21bc0 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e  on remains open.
21bd0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
21be0 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 42 74  treeSavepoint(Bt
21bf0 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20  ree *p, int op, 
21c00 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29 7b  int iSavepoint){
21c10 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
21c20 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26  TE_OK;.  if( p &
21c30 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  & p->inTrans==TR
21c40 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
21c50 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
21c60 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73   p->pBt;.    ass
21c70 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49  ert( op==SAVEPOI
21c80 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70  NT_RELEASE || op
21c90 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
21ca0 42 41 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65  BACK );.    asse
21cb0 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d  rt( iSavepoint>=
21cc0 30 20 7c 7c 20 28 69 53 61 76 65 70 6f 69 6e 74  0 || (iSavepoint
21cd0 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56 45  ==-1 && op==SAVE
21ce0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20  POINT_ROLLBACK) 
21cf0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
21d00 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20  reeEnter(p);.   
21d10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
21d20 65 72 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d  erSavepoint(pBt-
21d30 3e 70 50 61 67 65 72 2c 20 6f 70 2c 20 69 53 61  >pPager, op, iSa
21d40 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 69 66  vepoint);.    if
21d50 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
21d60 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 53 61  ){.      if( iSa
21d70 76 65 70 6f 69 6e 74 3c 30 20 26 26 20 28 70 42  vepoint<0 && (pB
21d80 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
21d90 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54  S_INITIALLY_EMPT
21da0 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Y)!=0 ){.       
21db0 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b   pBt->nPage = 0;
21dc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
21dd0 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28  c = newDatabase(
21de0 70 42 74 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  pBt);.      pBt-
21df0 3e 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  >nPage = get4byt
21e00 65 28 32 38 20 2b 20 70 42 74 2d 3e 70 50 61 67  e(28 + pBt->pPag
21e10 65 31 2d 3e 61 44 61 74 61 29 3b 0a 0a 20 20 20  e1->aData);..   
21e20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
21e30 73 65 20 73 69 7a 65 20 77 61 73 20 77 72 69 74  se size was writ
21e40 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6f 66 66  ten into the off
21e50 73 65 74 20 32 38 20 6f 66 20 74 68 65 20 68 65  set 28 of the he
21e60 61 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 77 68  ader.      ** wh
21e70 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  en the transacti
21e80 6f 6e 20 73 74 61 72 74 65 64 2c 20 73 6f 20 77  on started, so w
21e90 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
21ea0 76 61 6c 75 65 20 61 74 20 6f 66 66 73 65 74 0a  value at offset.
21eb0 20 20 20 20 20 20 2a 2a 20 32 38 20 69 73 20 6e        ** 28 is n
21ec0 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20 20 20 20  onzero. */.     
21ed0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 50   assert( pBt->nP
21ee0 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 7d 0a 20  age>0 );.    }. 
21ef0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
21f00 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72  eave(p);.  }.  r
21f10 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
21f20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
21f30 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 42  cursor for the B
21f40 54 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74 20  Tree whose root 
21f50 69 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a  is on the page.*
21f60 2a 20 69 54 61 62 6c 65 2e 20 49 66 20 61 20 72  * iTable. If a r
21f70 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20  ead-only cursor 
21f80 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74  is requested, it
21f90 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
21fa0 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 61  .** the caller a
21fb0 6c 72 65 61 64 79 20 68 61 73 20 61 74 20 6c 65  lready has at le
21fc0 61 73 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  ast a read-only 
21fd0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
21fe0 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62  .** on the datab
21ff0 61 73 65 20 61 6c 72 65 61 64 79 2e 20 49 66 20  ase already. If 
22000 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20 69  a write-cursor i
22010 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 65  s requested, the
22020 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20  n.** the caller 
22030 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 68 61  is assumed to ha
22040 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  ve an open write
22050 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
22060 0a 2a 2a 20 49 66 20 74 68 65 20 42 54 52 45 45  .** If the BTREE
22070 5f 57 52 43 53 52 20 62 69 74 20 6f 66 20 77 72  _WRCSR bit of wr
22080 46 6c 61 67 20 69 73 20 63 6c 65 61 72 2c 20 74  Flag is clear, t
22090 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63  hen the cursor c
220a0 61 6e 20 6f 6e 6c 79 0a 2a 2a 20 62 65 20 75 73  an only.** be us
220b0 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 20  ed for reading. 
220c0 20 49 66 20 74 68 65 20 42 54 52 45 45 5f 57 52   If the BTREE_WR
220d0 43 53 52 20 62 69 74 20 69 73 20 73 65 74 2c 20  CSR bit is set, 
220e0 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 0a  then the cursor.
220f0 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20 66  ** can be used f
22100 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f  or reading or fo
22110 72 20 77 72 69 74 69 6e 67 20 69 66 20 6f 74 68  r writing if oth
22120 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f  er conditions fo
22130 72 20 77 72 69 74 69 6e 67 0a 2a 2a 20 61 72 65  r writing.** are
22140 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73   also met.  Thes
22150 65 20 61 72 65 20 74 68 65 20 63 6f 6e 64 69 74  e are the condit
22160 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20 62  ions that must b
22170 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72 0a 2a  e met in order.*
22180 2a 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f  * for writing to
22190 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a   be allowed:.**.
221a0 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72 73 6f  ** 1:  The curso
221b0 72 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  r must have been
221c0 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72 46   opened with wrF
221d0 6c 61 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 42  lag containing B
221e0 54 52 45 45 5f 57 52 43 53 52 0a 2a 2a 0a 2a 2a  TREE_WRCSR.**.**
221f0 20 32 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62   2:  Other datab
22200 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
22210 74 68 61 74 20 73 68 61 72 65 20 74 68 65 20 73  that share the s
22220 61 6d 65 20 70 61 67 65 72 20 63 61 63 68 65 0a  ame pager cache.
22230 2a 2a 20 20 20 20 20 62 75 74 20 77 68 69 63 68  **     but which
22240 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20   are not in the 
22250 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44  READ_UNCOMMITTED
22260 20 73 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68   state may not h
22270 61 76 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f  ave.**     curso
22280 72 73 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46  rs open with wrF
22290 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61  lag==0 on the sa
222a0 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72  me table.  Other
222b0 77 69 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20  wise.**     the 
222c0 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20  changes made by 
222d0 74 68 69 73 20 77 72 69 74 65 20 63 75 72 73 6f  this write curso
222e0 72 20 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62  r would be visib
222f0 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65  le to.**     the
22300 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e   read cursors in
22310 20 74 68 65 20 6f 74 68 65 72 20 64 61 74 61 62   the other datab
22320 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
22330 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61  **.** 3:  The da
22340 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 77  tabase must be w
22350 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20  ritable (not on 
22360 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29  read-only media)
22370 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65  .**.** 4:  There
22380 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63 74 69   must be an acti
22390 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ve transaction..
223a0 2a 2a 0a 2a 2a 20 54 68 65 20 42 54 52 45 45 5f  **.** The BTREE_
223b0 46 4f 52 44 45 4c 45 54 45 20 62 69 74 20 6f 66  FORDELETE bit of
223c0 20 77 72 46 6c 61 67 20 6d 61 79 20 6f 70 74 69   wrFlag may opti
223d0 6f 6e 61 6c 6c 79 20 62 65 20 73 65 74 20 69 66  onally be set if
223e0 20 42 54 52 45 45 5f 57 52 43 53 52 0a 2a 2a 20   BTREE_WRCSR.** 
223f0 69 73 20 73 65 74 2e 20 20 49 66 20 46 4f 52 44  is set.  If FORD
22400 45 4c 45 54 45 20 69 73 20 73 65 74 2c 20 74 68  ELETE is set, th
22410 61 74 20 69 73 20 61 20 68 69 6e 74 20 74 6f 20  at is a hint to 
22420 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
22430 6f 6e 20 74 68 61 74 0a 2a 2a 20 74 68 69 73 20  on that.** this 
22440 63 75 72 73 6f 72 20 77 69 6c 6c 20 6f 6e 6c 79  cursor will only
22450 20 62 65 20 75 73 65 64 20 74 6f 20 73 65 65 6b   be used to seek
22460 20 74 6f 20 61 6e 64 20 64 65 6c 65 74 65 20 65   to and delete e
22470 6e 74 72 69 65 73 20 6f 66 20 61 6e 20 69 6e 64  ntries of an ind
22480 65 78 0a 2a 2a 20 61 73 20 70 61 72 74 20 6f 66  ex.** as part of
22490 20 61 20 6c 61 72 67 65 72 20 44 45 4c 45 54 45   a larger DELETE
224a0 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
224b0 20 46 4f 52 44 45 4c 45 54 45 20 68 69 6e 74 20   FORDELETE hint 
224c0 69 73 20 6e 6f 74 20 75 73 65 64 20 62 79 0a 2a  is not used by.*
224d0 2a 20 74 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74  * this implement
224e0 61 74 69 6f 6e 2e 20 20 42 75 74 20 69 6e 20 61  ation.  But in a
224f0 20 68 79 70 6f 74 68 65 74 69 63 61 6c 20 61 6c   hypothetical al
22500 74 65 72 6e 61 74 69 76 65 20 73 74 6f 72 61 67  ternative storag
22510 65 20 65 6e 67 69 6e 65 20 0a 2a 2a 20 69 6e 20  e engine .** in 
22520 77 68 69 63 68 20 69 6e 64 65 78 20 65 6e 74 72  which index entr
22530 69 65 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69  ies are automati
22540 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 77 68  cally deleted wh
22550 65 6e 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  en corresponding
22560 20 74 61 62 6c 65 0a 2a 2a 20 72 6f 77 73 20 61   table.** rows a
22570 72 65 20 64 65 6c 65 74 65 64 2c 20 74 68 65 20  re deleted, the 
22580 46 4f 52 44 45 4c 45 54 45 20 66 6c 61 67 20 69  FORDELETE flag i
22590 73 20 61 20 68 69 6e 74 20 74 68 61 74 20 61 6c  s a hint that al
225a0 6c 20 53 45 45 4b 20 61 6e 64 20 44 45 4c 45 54  l SEEK and DELET
225b0 45 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20  E.** operations 
225c0 6f 6e 20 74 68 69 73 20 63 75 72 73 6f 72 20 63  on this cursor c
225d0 61 6e 20 62 65 20 6e 6f 2d 6f 70 73 20 61 6e 64  an be no-ops and
225e0 20 61 6c 6c 20 52 45 41 44 20 6f 70 65 72 61 74   all READ operat
225f0 69 6f 6e 73 20 63 61 6e 20 0a 2a 2a 20 72 65 74  ions can .** ret
22600 75 72 6e 20 61 20 6e 75 6c 6c 20 72 6f 77 20 28  urn a null row (
22610 32 2d 62 79 74 65 73 3a 20 30 78 30 31 20 30 78  2-bytes: 0x01 0x
22620 30 30 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68  00)..**.** No ch
22630 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20 74  ecking is done t
22640 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
22650 20 70 61 67 65 20 69 54 61 62 6c 65 20 72 65 61   page iTable rea
22660 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f  lly is the.** ro
22670 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74  ot page of a b-t
22680 72 65 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e  ree.  If it is n
22690 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  ot, then the cur
226a0 73 6f 72 20 61 63 71 75 69 72 65 64 0a 2a 2a 20  sor acquired.** 
226b0 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f  will not work co
226c0 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49  rrectly..**.** I
226d0 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
226e0 74 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72  t the sqlite3Btr
226f0 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 29 20 68  eeCursorZero() h
22700 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 0a 2a  as been called.*
22710 2a 20 6f 6e 20 70 43 75 72 20 74 6f 20 69 6e 69  * on pCur to ini
22720 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f  tialize the memo
22730 72 79 20 73 70 61 63 65 20 70 72 69 6f 72 20 74  ry space prior t
22740 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20  o invoking this 
22750 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74  routine..*/.stat
22760 69 63 20 69 6e 74 20 62 74 72 65 65 43 75 72 73  ic int btreeCurs
22770 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  or(.  Btree *p, 
22780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22790 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
227a0 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69  The btree */.  i
227b0 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
227c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227d0 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61        /* Root pa
227e0 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f  ge of table to o
227f0 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46  pen */.  int wrF
22800 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  lag,            
22810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22820 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30  /* 1 to write. 0
22830 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20   read-only */.  
22840 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a  struct KeyInfo *
22850 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20  pKeyInfo,       
22860 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
22870 61 72 67 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f  arg to compariso
22880 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  n function */.  
22890 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20  BtCursor *pCur  
228a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228b0 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
228c0 66 6f 72 20 6e 65 77 20 63 75 72 73 6f 72 20 2a  for new cursor *
228d0 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  /.){.  BtShared 
228e0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20  *pBt = p->pBt;  
228f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22900 20 53 68 61 72 65 64 20 62 2d 74 72 65 65 20 68   Shared b-tree h
22910 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 43 75 72  andle */.  BtCur
22920 73 6f 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20  sor *pX;        
22930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22940 20 20 2f 2a 20 4c 6f 6f 70 69 6e 67 20 6f 76 65    /* Looping ove
22950 72 20 6f 74 68 65 72 20 61 6c 6c 20 63 75 72 73  r other all curs
22960 6f 72 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ors */..  assert
22970 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
22980 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
22990 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d   assert( wrFlag=
229a0 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 77 72  =0 .       || wr
229b0 46 6c 61 67 3d 3d 42 54 52 45 45 5f 57 52 43 53  Flag==BTREE_WRCS
229c0 52 20 0a 20 20 20 20 20 20 20 7c 7c 20 77 72 46  R .       || wrF
229d0 6c 61 67 3d 3d 28 42 54 52 45 45 5f 57 52 43 53  lag==(BTREE_WRCS
229e0 52 7c 42 54 52 45 45 5f 46 4f 52 44 45 4c 45 54  R|BTREE_FORDELET
229f0 45 29 20 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 54  E) .  );..  /* T
22a00 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
22a10 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20 76  ert statements v
22a20 65 72 69 66 79 20 74 68 61 74 20 69 66 20 74 68  erify that if th
22a30 69 73 20 69 73 20 61 20 73 68 61 72 61 62 6c 65  is is a sharable
22a40 20 0a 20 20 2a 2a 20 62 2d 74 72 65 65 20 64 61   .  ** b-tree da
22a50 74 61 62 61 73 65 2c 20 74 68 65 20 63 6f 6e 6e  tabase, the conn
22a60 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e  ection is holdin
22a70 67 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74  g the required t
22a80 61 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a  able locks, .  *
22a90 2a 20 61 6e 64 20 74 68 61 74 20 6e 6f 20 6f 74  * and that no ot
22aa0 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  her connection h
22ab0 61 73 20 61 6e 79 20 6f 70 65 6e 20 63 75 72 73  as any open curs
22ac0 6f 72 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74  or that conflict
22ad0 73 20 77 69 74 68 20 0a 20 20 2a 2a 20 74 68 69  s with .  ** thi
22ae0 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73  s lock.  */.  as
22af0 73 65 72 74 28 20 68 61 73 53 68 61 72 65 64 43  sert( hasSharedC
22b00 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  acheTableLock(p,
22b10 20 69 54 61 62 6c 65 2c 20 70 4b 65 79 49 6e 66   iTable, pKeyInf
22b20 6f 21 3d 30 2c 20 28 77 72 46 6c 61 67 3f 32 3a  o!=0, (wrFlag?2:
22b30 31 29 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  1)) );.  assert(
22b40 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 21 68   wrFlag==0 || !h
22b50 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28  asReadConflicts(
22b60 70 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a 0a 20  p, iTable) );.. 
22b70 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20   /* Assert that 
22b80 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 6f  the caller has o
22b90 70 65 6e 65 64 20 74 68 65 20 72 65 71 75 69 72  pened the requir
22ba0 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ed transaction. 
22bb0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
22bc0 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f  inTrans>TRANS_NO
22bd0 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  NE );.  assert( 
22be0 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e  wrFlag==0 || p->
22bf0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
22c00 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74  RITE );.  assert
22c10 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26  ( pBt->pPage1 &&
22c20 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
22c30 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ata );.  assert(
22c40 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 28 70   wrFlag==0 || (p
22c50 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
22c60 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30  TS_READ_ONLY)==0
22c70 20 29 3b 0a 0a 20 20 69 66 28 20 77 72 46 6c 61   );..  if( wrFla
22c80 67 20 29 7b 0a 20 20 20 20 61 6c 6c 6f 63 61 74  g ){.    allocat
22c90 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
22ca0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 54  .    if( pBt->pT
22cb0 6d 70 53 70 61 63 65 3d 3d 30 20 29 20 72 65 74  mpSpace==0 ) ret
22cc0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
22cd0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28  _BKPT;.  }.  if(
22ce0 20 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 62 74   iTable==1 && bt
22cf0 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
22d00 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  )==0 ){.    asse
22d10 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 29 3b  rt( wrFlag==0 );
22d20 0a 20 20 20 20 69 54 61 62 6c 65 20 3d 20 30 3b  .    iTable = 0;
22d30 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74  .  }..  /* Now t
22d40 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 65 72 72  hat no other err
22d50 6f 72 73 20 63 61 6e 20 6f 63 63 75 72 2c 20 66  ors can occur, f
22d60 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e  inish filling in
22d70 20 74 68 65 20 42 74 43 75 72 73 6f 72 0a 20 20   the BtCursor.  
22d80 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 61 6e 64  ** variables and
22d90 20 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72   link the cursor
22da0 20 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72   into the BtShar
22db0 65 64 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 70  ed list.  */.  p
22dc0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20  Cur->pgnoRoot = 
22dd0 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20  (Pgno)iTable;.  
22de0 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31  pCur->iPage = -1
22df0 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e  ;.  pCur->pKeyIn
22e00 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20  fo = pKeyInfo;. 
22e10 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d 20   pCur->pBtree = 
22e20 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 20 3d  p;.  pCur->pBt =
22e30 20 70 42 74 3b 0a 20 20 70 43 75 72 2d 3e 63 75   pBt;.  pCur->cu
22e40 72 46 6c 61 67 73 20 3d 20 77 72 46 6c 61 67 20  rFlags = wrFlag 
22e50 3f 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67  ? BTCF_WriteFlag
22e60 20 3a 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75   : 0;.  pCur->cu
22e70 72 50 61 67 65 72 46 6c 61 67 73 20 3d 20 77 72  rPagerFlags = wr
22e80 46 6c 61 67 20 3f 20 30 20 3a 20 50 41 47 45 52  Flag ? 0 : PAGER
22e90 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  _GET_READONLY;. 
22ea0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
22eb0 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75 72   two or more cur
22ec0 73 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65  sors on the same
22ed0 20 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c 6c   btree, then all
22ee0 20 73 75 63 68 0a 20 20 2a 2a 20 63 75 72 73 6f   such.  ** curso
22ef0 72 73 20 2a 6d 75 73 74 2a 20 68 61 76 65 20 74  rs *must* have t
22f00 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65  he BTCF_Multiple
22f10 20 66 6c 61 67 20 73 65 74 2e 20 2a 2f 0a 20 20   flag set. */.  
22f20 66 6f 72 28 70 58 3d 70 42 74 2d 3e 70 43 75 72  for(pX=pBt->pCur
22f30 73 6f 72 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  sor; pX; pX=pX->
22f40 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
22f50 70 58 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 28 50  pX->pgnoRoot==(P
22f60 67 6e 6f 29 69 54 61 62 6c 65 20 29 7b 0a 20 20  gno)iTable ){.  
22f70 20 20 20 20 70 58 2d 3e 63 75 72 46 6c 61 67 73      pX->curFlags
22f80 20 7c 3d 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c   |= BTCF_Multipl
22f90 65 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 63  e;.      pCur->c
22fa0 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f  urFlags |= BTCF_
22fb0 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 20 20 7d 0a  Multiple;.    }.
22fc0 20 20 7d 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78    }.  pCur->pNex
22fd0 74 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  t = pBt->pCursor
22fe0 3b 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  ;.  pBt->pCursor
22ff0 20 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d   = pCur;.  pCur-
23000 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
23010 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 65 74 75  _INVALID;.  retu
23020 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
23030 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
23040 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20  Cursor(.  Btree 
23050 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
23060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23070 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
23080 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ee */.  int iTab
23090 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
230a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230b0 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
230c0 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65   of table to ope
230d0 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61  n */.  int wrFla
230e0 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
230f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23100 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65     /* 1 to write
23110 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f  . 0 read-only */
23120 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66  .  struct KeyInf
23130 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
23140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23150 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 78  * First arg to x
23160 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42  Compare() */.  B
23170 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20  tCursor *pCur   
23180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23190 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
231a0 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68  ite new cursor h
231b0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
231c0 72 63 3b 0a 20 20 69 66 28 20 69 54 61 62 6c 65  rc;.  if( iTable
231d0 3c 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  <1 ){.    rc = S
231e0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
231f0 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  PT;.  }else{.   
23200 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
23210 65 72 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20  er(p);.    rc = 
23220 62 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20 69  btreeCursor(p, i
23230 54 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70  Table, wrFlag, p
23240 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a  KeyInfo, pCur);.
23250 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
23260 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Leave(p);.  }.  
23270 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
23280 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
23290 69 7a 65 20 6f 66 20 61 20 42 74 43 75 72 73 6f  ize of a BtCurso
232a0 72 20 6f 62 6a 65 63 74 20 69 6e 20 62 79 74 65  r object in byte
232b0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e  s..**.** This in
232c0 74 65 72 66 61 63 65 73 20 69 73 20 6e 65 65 64  terfaces is need
232d0 65 64 20 73 6f 20 74 68 61 74 20 75 73 65 72 73  ed so that users
232e0 20 6f 66 20 63 75 72 73 6f 72 73 20 63 61 6e 20   of cursors can 
232f0 70 72 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73  preallocate.** s
23300 75 66 66 69 63 69 65 6e 74 20 73 74 6f 72 61 67  ufficient storag
23310 65 20 74 6f 20 68 6f 6c 64 20 61 20 63 75 72 73  e to hold a curs
23320 6f 72 2e 20 20 54 68 65 20 42 74 43 75 72 73 6f  or.  The BtCurso
23330 72 20 6f 62 6a 65 63 74 20 69 73 20 6f 70 61 71  r object is opaq
23340 75 65 0a 2a 2a 20 74 6f 20 75 73 65 72 73 20 73  ue.** to users s
23350 6f 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 64 6f  o they cannot do
23360 20 74 68 65 20 73 69 7a 65 6f 66 28 29 20 74 68   the sizeof() th
23370 65 6d 73 65 6c 76 65 73 20 2d 20 74 68 65 79 20  emselves - they 
23380 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a 20 74 68 69  must call.** thi
23390 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e  s routine..*/.in
233a0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
233b0 72 73 6f 72 53 69 7a 65 28 76 6f 69 64 29 7b 0a  rsorSize(void){.
233c0 20 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28    return ROUND8(
233d0 73 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72 29  sizeof(BtCursor)
233e0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  );.}../*.** Init
233f0 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 74 68  ialize memory th
23400 61 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65  at will be conve
23410 72 74 65 64 20 69 6e 74 6f 20 61 20 42 74 43 75  rted into a BtCu
23420 72 73 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a  rsor object..**.
23430 2a 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 61 70  ** The simple ap
23440 70 72 6f 61 63 68 20 68 65 72 65 20 77 6f 75 6c  proach here woul
23450 64 20 62 65 20 74 6f 20 6d 65 6d 73 65 74 28 29  d be to memset()
23460 20 74 68 65 20 65 6e 74 69 72 65 20 6f 62 6a 65   the entire obje
23470 63 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f 2e 20 20  ct.** to zero.  
23480 42 75 74 20 69 74 20 74 75 72 6e 73 20 6f 75 74  But it turns out
23490 20 74 68 61 74 20 74 68 65 20 61 70 50 61 67 65   that the apPage
234a0 5b 5d 20 61 6e 64 20 61 69 49 64 78 5b 5d 20 61  [] and aiIdx[] a
234b0 72 72 61 79 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20  rrays.** do not 
234c0 6e 65 65 64 20 74 6f 20 62 65 20 7a 65 72 6f 65  need to be zeroe
234d0 64 20 61 6e 64 20 74 68 65 79 20 61 72 65 20 6c  d and they are l
234e0 61 72 67 65 2c 20 73 6f 20 77 65 20 63 61 6e 20  arge, so we can 
234f0 73 61 76 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66  save a lot.** of
23500 20 72 75 6e 2d 74 69 6d 65 20 62 79 20 73 6b 69   run-time by ski
23510 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61  pping the initia
23520 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 6f 73  lization of thos
23530 65 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76  e elements..*/.v
23540 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
23550 43 75 72 73 6f 72 5a 65 72 6f 28 42 74 43 75 72  CursorZero(BtCur
23560 73 6f 72 20 2a 70 29 7b 0a 20 20 6d 65 6d 73 65  sor *p){.  memse
23570 74 28 70 2c 20 30 2c 20 6f 66 66 73 65 74 6f 66  t(p, 0, offsetof
23580 28 42 74 43 75 72 73 6f 72 2c 20 69 50 61 67 65  (BtCursor, iPage
23590 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  ));.}../*.** Clo
235a0 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68  se a cursor.  Th
235b0 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74  e read lock on t
235c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
235d0 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20   is released.** 
235e0 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75  when the last cu
235f0 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a  rsor is closed..
23600 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
23610 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42  reeCloseCursor(B
23620 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
23630 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 20    Btree *pBtree 
23640 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a  = pCur->pBtree;.
23650 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a    if( pBtree ){.
23660 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42      int i;.    B
23670 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
23680 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71  Cur->pBt;.    sq
23690 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
236a0 70 42 74 72 65 65 29 3b 0a 20 20 20 20 73 71 6c  pBtree);.    sql
236b0 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
236c0 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 20 20  rsor(pCur);.    
236d0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 43 75  assert( pBt->pCu
236e0 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20 69  rsor!=0 );.    i
236f0 66 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d  f( pBt->pCursor=
23700 3d 70 43 75 72 20 29 7b 0a 20 20 20 20 20 20 70  =pCur ){.      p
23710 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43  Bt->pCursor = pC
23720 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  ur->pNext;.    }
23730 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 74 43 75  else{.      BtCu
23740 72 73 6f 72 20 2a 70 50 72 65 76 20 3d 20 70 42  rsor *pPrev = pB
23750 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 20 20  t->pCursor;.    
23760 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 69 66    do{.        if
23770 28 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d  ( pPrev->pNext==
23780 70 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20  pCur ){.        
23790 20 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d    pPrev->pNext =
237a0 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20   pCur->pNext;.  
237b0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
237c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
237d0 20 70 50 72 65 76 20 3d 20 70 50 72 65 76 2d 3e   pPrev = pPrev->
237e0 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 77 68  pNext;.      }wh
237f0 69 6c 65 28 20 41 4c 57 41 59 53 28 70 50 72 65  ile( ALWAYS(pPre
23800 76 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  v) );.    }.    
23810 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72  for(i=0; i<=pCur
23820 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  ->iPage; i++){. 
23830 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
23840 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  (pCur->apPage[i]
23850 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 6c  );.    }.    unl
23860 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
23870 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  (pBt);.    sqlit
23880 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 61 4f  e3_free(pCur->aO
23890 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20 2f 2a  verflow);.    /*
238a0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
238b0 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ur); */.    sqli
238c0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42  te3BtreeLeave(pB
238d0 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  tree);.  }.  ret
238e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
238f0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
23900 65 20 74 68 65 20 42 74 43 75 72 73 6f 72 2a 20  e the BtCursor* 
23910 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67  given in the arg
23920 75 6d 65 6e 74 20 68 61 73 20 61 20 76 61 6c 69  ument has a vali
23930 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e  d.** BtCursor.in
23940 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 49  fo structure.  I
23950 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
23960 61 64 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a  ady valid, call.
23970 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  ** btreeParseCel
23980 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74 20 69  l() to fill it i
23990 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f  n..**.** BtCurso
239a0 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61 63 68  r.info is a cach
239b0 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61  e of the informa
239c0 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75 72 72  tion in the curr
239d0 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69  ent cell..** Usi
239e0 6e 67 20 74 68 69 73 20 63 61 63 68 65 20 72 65  ng this cache re
239f0 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72  duces the number
23a00 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 62 74 72   of calls to btr
23a10 65 65 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a  eeParseCell()..*
23a20 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
23a30 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 61  .  static void a
23a40 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74  ssertCellInfo(Bt
23a50 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
23a60 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
23a70 3b 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65 20  ;.    int iPage 
23a80 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20  = pCur->iPage;. 
23a90 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c     memset(&info,
23aa0 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29   0, sizeof(info)
23ab0 29 3b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73  );.    btreePars
23ac0 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61  eCell(pCur->apPa
23ad0 67 65 5b 69 50 61 67 65 5d 2c 20 70 43 75 72 2d  ge[iPage], pCur-
23ae0 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 20 26  >aiIdx[iPage], &
23af0 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72  info);.    asser
23b00 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
23b10 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26   memcmp(&info, &
23b20 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65  pCur->info, size
23b30 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a  of(info))==0 );.
23b40 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66    }.#else.  #def
23b50 69 6e 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e  ine assertCellIn
23b60 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a 73 74 61  fo(x).#endif.sta
23b70 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
23b80 49 4e 45 20 76 6f 69 64 20 67 65 74 43 65 6c 6c  INE void getCell
23b90 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Info(BtCursor *p
23ba0 43 75 72 29 7b 0a 20 20 69 66 28 20 70 43 75 72  Cur){.  if( pCur
23bb0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
23bc0 29 7b 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65  ){.    int iPage
23bd0 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a   = pCur->iPage;.
23be0 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
23bf0 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64  gs |= BTCF_Valid
23c00 4e 4b 65 79 3b 0a 20 20 20 20 62 74 72 65 65 50  NKey;.    btreeP
23c10 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61  arseCell(pCur->a
23c20 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75  pPage[iPage],pCu
23c30 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c  r->aiIdx[iPage],
23c40 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20  &pCur->info);.  
23c50 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
23c60 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
23c70 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
23c80 4e 44 45 42 55 47 20 20 2f 2a 20 54 68 65 20 6e  NDEBUG  /* The n
23c90 65 78 74 20 72 6f 75 74 69 6e 65 20 75 73 65 64  ext routine used
23ca0 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73   only within ass
23cb0 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
23cc0 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e   */./*.** Return
23cd0 20 74 72 75 65 20 69 66 20 74 68 65 20 67 69 76   true if the giv
23ce0 65 6e 20 42 74 43 75 72 73 6f 72 20 69 73 20 76  en BtCursor is v
23cf0 61 6c 69 64 2e 20 20 41 20 76 61 6c 69 64 20 63  alid.  A valid c
23d00 75 72 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20  ursor is one.** 
23d10 74 68 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c  that is currentl
23d20 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  y pointing to a 
23d30 72 6f 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d  row in a (non-em
23d40 70 74 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54  pty) table..** T
23d50 68 69 73 20 69 73 20 61 20 76 65 72 69 66 69 63  his is a verific
23d60 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73  ation routine is
23d70 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69   used only withi
23d80 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
23d90 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ments..*/.int sq
23da0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
23db0 49 73 56 61 6c 69 64 28 42 74 43 75 72 73 6f 72  IsValid(BtCursor
23dc0 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72   *pCur){.  retur
23dd0 6e 20 70 43 75 72 20 26 26 20 70 43 75 72 2d 3e  n pCur && pCur->
23de0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
23df0 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  ALID;.}.#endif /
23e00 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 69 6e 74 20  * NDEBUG */.int 
23e10 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
23e20 6f 72 49 73 56 61 6c 69 64 4e 4e 28 42 74 43 75  orIsValidNN(BtCu
23e30 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
23e40 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 29  ssert( pCur!=0 )
23e50 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d  ;.  return pCur-
23e60 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
23e70 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  VALID;.}../*.** 
23e80 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  Return the value
23e90 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20   of the integer 
23ea0 6b 65 79 20 6f 72 20 22 72 6f 77 69 64 22 20 66  key or "rowid" f
23eb0 6f 72 20 61 20 74 61 62 6c 65 20 62 74 72 65 65  or a table btree
23ec0 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
23ed0 65 20 69 73 20 6f 6e 6c 79 20 76 61 6c 69 64 20  e is only valid 
23ee0 66 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68 61  for a cursor tha
23ef0 74 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e  t is pointing in
23f00 74 6f 20 61 0a 2a 2a 20 6f 72 64 69 6e 61 72 79  to a.** ordinary
23f10 20 74 61 62 6c 65 20 62 74 72 65 65 2e 20 20 49   table btree.  I
23f20 66 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69  f the cursor poi
23f30 6e 74 73 20 74 6f 20 61 6e 20 69 6e 64 65 78 20  nts to an index 
23f40 62 74 72 65 65 20 6f 72 0a 2a 2a 20 69 73 20 69  btree or.** is i
23f50 6e 76 61 6c 69 64 2c 20 74 68 65 20 72 65 73 75  nvalid, the resu
23f60 6c 74 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  lt of this routi
23f70 6e 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e  ne is undefined.
23f80 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 42  .*/.i64 sqlite3B
23f90 74 72 65 65 49 6e 74 65 67 65 72 4b 65 79 28 42  treeIntegerKey(B
23fa0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
23fb0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
23fc0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
23fd0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
23fe0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
23ff0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
24000 73 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72 49  sert( pCur->curI
24010 6e 74 4b 65 79 20 29 3b 0a 20 20 67 65 74 43 65  ntKey );.  getCe
24020 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
24030 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 69 6e 66  return pCur->inf
24040 6f 2e 6e 4b 65 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  o.nKey;.}../*.**
24050 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
24060 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 70  er of bytes of p
24070 61 79 6c 6f 61 64 20 66 6f 72 20 74 68 65 20 65  ayload for the e
24080 6e 74 72 79 20 74 68 61 74 20 70 43 75 72 20 69  ntry that pCur i
24090 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70  s.** currently p
240a0 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 46 6f 72  ointing to.  For
240b0 20 74 61 62 6c 65 20 62 74 72 65 65 73 2c 20 74   table btrees, t
240c0 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20  his will be the 
240d0 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20 64 61 74  amount.** of dat
240e0 61 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 62 74  a.  For index bt
240f0 72 65 65 73 2c 20 74 68 69 73 20 77 69 6c 6c 20  rees, this will 
24100 62 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  be the size of t
24110 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  he key..**.** Th
24120 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 67 75  e caller must gu
24130 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65  arantee that the
24140 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
24150 69 6e 67 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c  ing to a non-NUL
24160 4c 0a 2a 2a 20 76 61 6c 69 64 20 65 6e 74 72 79  L.** valid entry
24170 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
24180 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70  s, the calling p
24190 72 6f 63 65 64 75 72 65 20 6d 75 73 74 20 67 75  rocedure must gu
241a0 61 72 61 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20  arantee.** that 
241b0 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 43  the cursor has C
241c0 75 72 73 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55  ursor.eState==CU
241d0 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2f 0a 75  RSOR_VALID..*/.u
241e0 33 32 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  32 sqlite3BtreeP
241f0 61 79 6c 6f 61 64 53 69 7a 65 28 42 74 43 75 72  ayloadSize(BtCur
24200 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
24210 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
24220 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
24230 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
24240 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
24250 41 4c 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c  ALID );.  getCel
24260 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 72  lInfo(pCur);.  r
24270 65 74 75 72 6e 20 70 43 75 72 2d 3e 69 6e 66 6f  eturn pCur->info
24280 2e 6e 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 2f 2a  .nPayload;.}../*
24290 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61  .** Given the pa
242a0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20  ge number of an 
242b0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
242c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28 70   the database (p
242d0 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c  arameter.** ovfl
242e0 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ), this function
242f0 20 66 69 6e 64 73 20 74 68 65 20 70 61 67 65 20   finds the page 
24300 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
24310 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a  xt page in the .
24320 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f  ** linked list o
24330 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  f overflow pages
24340 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69  . If possible, i
24350 74 20 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d  t uses the auto-
24360 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65  vacuum.** pointe
24370 72 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65  r-map data inste
24380 61 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68  ad of reading th
24390 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67  e content of pag
243a0 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e  e ovfl to do so.
243b0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72   .**.** If an er
243c0 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51  ror occurs an SQ
243d0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
243e0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
243f0 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68  erwise:.**.** Th
24400 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
24410 20 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c   the next overfl
24420 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  ow page in the l
24430 69 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 0a 2a  inked list is .*
24440 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50  * written to *pP
24450 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65  gnoNext. If page
24460 20 6f 76 66 6c 20 69 73 20 74 68 65 20 6c 61 73   ovfl is the las
24470 74 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69  t page in its li
24480 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a  nked .** list, *
24490 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74  pPgnoNext is set
244a0 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a   to zero. .**.**
244b0 20 49 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f   If ppPage is no
244c0 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65  t NULL, and a re
244d0 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 4d  ference to the M
244e0 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 63 6f  emPage object co
244f0 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74  rresponding.** t
24500 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 4f  o page number pO
24510 76 66 6c 20 77 61 73 20 6f 62 74 61 69 6e 65 64  vfl was obtained
24520 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69  , then *ppPage i
24530 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
24540 6f 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 65  o that.** refere
24550 6e 63 65 2e 20 49 74 20 69 73 20 74 68 65 20 72  nce. It is the r
24560 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
24570 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63   the caller to c
24580 61 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28  all releasePage(
24590 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20  ).** on *ppPage 
245a0 74 6f 20 66 72 65 65 20 74 68 65 20 72 65 66 65  to free the refe
245b0 72 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66  rence. In no ref
245c0 65 72 65 6e 63 65 20 77 61 73 20 6f 62 74 61 69  erence was obtai
245d0 6e 65 64 20 28 62 65 63 61 75 73 65 0a 2a 2a 20  ned (because.** 
245e0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
245f0 77 61 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61  was used to obta
24600 69 6e 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72  in the value for
24610 20 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68   *pPgnoNext), th
24620 65 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73  en.** *ppPage is
24630 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f   set to zero..*/
24640 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f  .static int getO
24650 76 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42  verflowPage(.  B
24660 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
24670 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
24680 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
24690 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c   */.  Pgno ovfl,
246a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
246b0 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76     /* Current ov
246c0 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62  erflow page numb
246d0 65 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  er */.  MemPage 
246e0 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20  **ppPage,       
246f0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d       /* OUT: Mem
24700 50 61 67 65 20 68 61 6e 64 6c 65 20 28 6d 61 79  Page handle (may
24710 20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50   be NULL) */.  P
24720 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20  gno *pPgnoNext  
24730 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
24740 55 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f  UT: Next overflo
24750 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  w page number */
24760 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20  .){.  Pgno next 
24770 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
24780 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74  pPage = 0;.  int
24790 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
247a0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
247b0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
247c0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
247d0 61 73 73 65 72 74 28 70 50 67 6e 6f 4e 65 78 74  assert(pPgnoNext
247e0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
247f0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
24800 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66  UM.  /* Try to f
24810 69 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61 67  ind the next pag
24820 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f  e in the overflo
24830 77 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65  w list using the
24840 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d  .  ** autovacuum
24850 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
24860 65 73 2e 20 47 75 65 73 73 20 74 68 61 74 20 74  es. Guess that t
24870 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
24880 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c  .  ** the overfl
24890 6f 77 20 6c 69 73 74 20 69 73 20 70 61 67 65 20  ow list is page 
248a0 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e  number (ovfl+1).
248b0 20 49 66 20 74 68 61 74 20 67 75 65 73 73 20 74   If that guess t
248c0 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74  urns .  ** out t
248d0 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c  o be wrong, fall
248e0 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67   back to loading
248f0 20 74 68 65 20 64 61 74 61 20 6f 66 20 70 61 67   the data of pag
24900 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f  e .  ** number o
24910 76 66 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  vfl to determine
24920 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e   the next page n
24930 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  umber..  */.  if
24940 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
24950 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67  m ){.    Pgno pg
24960 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75  no;.    Pgno iGu
24970 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20  ess = ovfl+1;.  
24980 20 20 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20    u8 eType;..   
24990 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49   while( PTRMAP_I
249a0 53 50 41 47 45 28 70 42 74 2c 20 69 47 75 65 73  SPAGE(pBt, iGues
249b0 73 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45  s) || iGuess==PE
249c0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
249d0 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47  pBt) ){.      iG
249e0 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20  uess++;.    }.. 
249f0 20 20 20 69 66 28 20 69 47 75 65 73 73 3c 3d 62     if( iGuess<=b
24a00 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
24a10 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  t) ){.      rc =
24a20 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
24a30 69 47 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20  iGuess, &eType, 
24a40 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66  &pgno);.      if
24a50 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
24a60 26 26 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  && eType==PTRMAP
24a70 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67  _OVERFLOW2 && pg
24a80 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20  no==ovfl ){.    
24a90 20 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73      next = iGues
24aa0 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  s;.        rc = 
24ab0 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
24ac0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
24ad0 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
24ae0 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d   next==0 || rc==
24af0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
24b00 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
24b10 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62  OK ){.    rc = b
24b20 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
24b30 20 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 28   ovfl, &pPage, (
24b40 70 70 50 61 67 65 3d 3d 30 29 20 3f 20 50 41 47  ppPage==0) ? PAG
24b50 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
24b60 3a 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  : 0);.    assert
24b70 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
24b80 7c 7c 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20  || pPage==0 );. 
24b90 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
24ba0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65  E_OK ){.      ne
24bb0 78 74 20 3d 20 67 65 74 34 62 79 74 65 28 70 50  xt = get4byte(pP
24bc0 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  age->aData);.   
24bd0 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f   }.  }..  *pPgno
24be0 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69  Next = next;.  i
24bf0 66 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20  f( ppPage ){.   
24c00 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65   *ppPage = pPage
24c10 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
24c20 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
24c30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
24c40 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45  (rc==SQLITE_DONE
24c50 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72   ? SQLITE_OK : r
24c60 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70  c);.}../*.** Cop
24c70 79 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75  y data from a bu
24c80 66 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20  ffer to a page, 
24c90 6f 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74  or from a page t
24ca0 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  o a buffer..**.*
24cb0 2a 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20  * pPayload is a 
24cc0 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20  pointer to data 
24cd0 73 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61  stored on databa
24ce0 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2e  se page pDbPage.
24cf0 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20  .** If argument 
24d00 65 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68  eOp is false, th
24d10 65 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f  en nByte bytes o
24d20 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65  f data are copie
24d30 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f  d.** from pPaylo
24d40 61 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72  ad to the buffer
24d50 20 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70   pointed at by p
24d60 42 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74  Buf. If eOp is t
24d70 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c  rue,.** then sql
24d80 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
24d90 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44   is called on pD
24da0 62 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20  bPage and nByte 
24db0 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61  bytes.** of data
24dc0 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d   are copied from
24dd0 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66   the buffer pBuf
24de0 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a   to pPayload..**
24df0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
24e00 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
24e10 63 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20  cess, otherwise 
24e20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  an error code..*
24e30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70  /.static int cop
24e40 79 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64  yPayload(.  void
24e50 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20   *pPayload,     
24e60 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
24e70 20 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f   to page data */
24e80 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20  .  void *pBuf,  
24e90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24ea0 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65  Pointer to buffe
24eb0 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  r */.  int nByte
24ec0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24ed0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
24ee0 74 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20  tes to copy */. 
24ef0 20 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20   int eOp,       
24f00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20             /* 0 
24f10 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67  -> copy from pag
24f20 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20  e, 1 -> copy to 
24f30 70 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65  page */.  DbPage
24f40 20 2a 70 44 62 50 61 67 65 20 20 20 20 20 20 20   *pDbPage       
24f50 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
24f60 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20  aining pPayload 
24f70 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20  */.){.  if( eOp 
24f80 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64  ){.    /* Copy d
24f90 61 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20  ata from buffer 
24fa0 74 6f 20 70 61 67 65 20 28 61 20 77 72 69 74 65  to page (a write
24fb0 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20   operation) */. 
24fc0 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
24fd0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44  te3PagerWrite(pD
24fe0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
24ff0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
25000 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
25010 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63  ;.    }.    memc
25020 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75  py(pPayload, pBu
25030 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c  f, nByte);.  }el
25040 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20  se{.    /* Copy 
25050 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74  data from page t
25060 6f 20 62 75 66 66 65 72 20 28 61 20 72 65 61 64  o buffer (a read
25070 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20   operation) */. 
25080 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20     memcpy(pBuf, 
25090 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29  pPayload, nByte)
250a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
250b0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
250c0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
250d0 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64   is used to read
250e0 20 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70 61   or overwrite pa
250f0 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f  yload informatio
25100 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74  n.** for the ent
25110 72 79 20 74 68 61 74 20 74 68 65 20 70 43 75 72  ry that the pCur
25120 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
25130 69 6e 67 20 74 6f 2e 20 54 68 65 20 65 4f 70 0a  ing to. The eOp.
25140 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69  ** argument is i
25150 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 66 6f  nterpreted as fo
25160 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 30  llows:.**.**   0
25170 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  : The operation 
25180 69 73 20 61 20 72 65 61 64 2e 20 50 6f 70 75 6c  is a read. Popul
25190 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ate the overflow
251a0 20 63 61 63 68 65 2e 0a 2a 2a 20 20 20 31 3a 20   cache..**   1: 
251b0 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  The operation is
251c0 20 61 20 77 72 69 74 65 2e 20 50 6f 70 75 6c 61   a write. Popula
251d0 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
251e0 63 61 63 68 65 2e 0a 2a 2a 20 20 20 32 3a 20 54  cache..**   2: T
251f0 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  he operation is 
25200 61 20 72 65 61 64 2e 20 44 6f 20 6e 6f 74 20 70  a read. Do not p
25210 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72  opulate the over
25220 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a  flow cache..**.*
25230 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d  * A total of "am
25240 74 22 20 62 79 74 65 73 20 61 72 65 20 72 65 61  t" bytes are rea
25250 64 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67  d or written beg
25260 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65  inning at "offse
25270 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72  t"..** Data is r
25280 65 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74  ead to or from t
25290 68 65 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a  he buffer pBuf..
252a0 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e  **.** The conten
252b0 74 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 20  t being read or 
252c0 77 72 69 74 74 65 6e 20 6d 69 67 68 74 20 61 70  written might ap
252d0 70 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e  pear on the main
252e0 20 70 61 67 65 0a 2a 2a 20 6f 72 20 62 65 20 73   page.** or be s
252f0 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20  cattered out on 
25300 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f  multiple overflo
25310 77 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  w pages..**.** I
25320 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  f the current cu
25330 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20  rsor entry uses 
25340 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72  one or more over
25350 66 6c 6f 77 20 70 61 67 65 73 20 61 6e 64 20 74  flow pages and t
25360 68 65 0a 2a 2a 20 65 4f 70 20 61 72 67 75 6d 65  he.** eOp argume
25370 6e 74 20 69 73 20 6e 6f 74 20 32 2c 20 74 68 69  nt is not 2, thi
25380 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61  s function may a
25390 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
253a0 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20 0a 2a 2a  r and lazily .**
253b0 20 70 6f 70 75 6c 61 74 65 73 20 74 68 65 20 6f   populates the o
253c0 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
253d0 74 20 63 61 63 68 65 20 61 72 72 61 79 20 28 42  t cache array (B
253e0 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f  tCursor.aOverflo
253f0 77 29 2e 20 0a 2a 2a 20 53 75 62 73 65 71 75 65  w). .** Subseque
25400 6e 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69  nt calls use thi
25410 73 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20  s cache to make 
25420 73 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73  seeking to the s
25430 75 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20 0a  upplied offset .
25440 2a 2a 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e  ** more efficien
25450 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e  t..**.** Once an
25460 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
25470 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65  ist cache has be
25480 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74  en allocated, it
25490 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c   may be.** inval
254a0 69 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f  idated if some o
254b0 74 68 65 72 20 63 75 72 73 6f 72 20 77 72 69 74  ther cursor writ
254c0 65 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74  es to the same t
254d0 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74  able, or if.** t
254e0 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76  he cursor is mov
254f0 65 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  ed to a differen
25500 74 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61  t row. Additiona
25510 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63  lly, in auto-vac
25520 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65  uum.** mode, the
25530 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74   following event
25540 73 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65  s may invalidate
25550 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
25560 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a  e-list cache..**
25570 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65  .**   * An incre
25580 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a  mental vacuum,.*
25590 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69  *   * A commit i
255a0 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66  n auto_vacuum="f
255b0 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20  ull" mode,.**   
255c0 2a 20 43 72 65 61 74 69 6e 67 20 61 20 74 61 62  * Creating a tab
255d0 6c 65 20 28 6d 61 79 20 72 65 71 75 69 72 65 20  le (may require 
255e0 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c  moving an overfl
255f0 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61  ow page)..*/.sta
25600 74 69 63 20 69 6e 74 20 61 63 63 65 73 73 50 61  tic int accessPa
25610 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f  yload(.  BtCurso
25620 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a  r *pCur,      /*
25630 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   Cursor pointing
25640 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61   to entry to rea
25650 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  d from */.  u32 
25660 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20  offset,         
25670 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e   /* Begin readin
25680 67 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20  g this far into 
25690 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32  payload */.  u32
256a0 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20   amt,           
256b0 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d    /* Read this m
256c0 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75  any bytes */.  u
256d0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42  nsigned char *pB
256e0 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65  uf, /* Write the
256f0 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73   bytes into this
25700 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e   buffer */ .  in
25710 74 20 65 4f 70 20 20 20 20 20 20 20 20 20 20 20  t eOp           
25720 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65     /* zero to re
25730 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20  ad. non-zero to 
25740 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75  write. */.){.  u
25750 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50  nsigned char *aP
25760 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63  ayload;.  int rc
25770 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
25780 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20  int iIdx = 0;.  
25790 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
257a0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
257b0 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 42  ur->iPage]; /* B
257c0 74 72 65 65 20 70 61 67 65 20 6f 66 20 63 75 72  tree page of cur
257d0 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20  rent entry */.  
257e0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
257f0 70 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20 20  pCur->pBt;      
25800 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
25810 74 72 65 65 20 74 68 69 73 20 63 75 72 73 6f 72  tree this cursor
25820 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 23   belongs to */.#
25830 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52  ifdef SQLITE_DIR
25840 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41  ECT_OVERFLOW_REA
25850 44 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  D.  unsigned cha
25860 72 20 2a 20 63 6f 6e 73 74 20 70 42 75 66 53 74  r * const pBufSt
25870 61 72 74 20 3d 20 70 42 75 66 3b 0a 20 20 69 6e  art = pBuf;.  in
25880 74 20 62 45 6e 64 3b 20 20 20 20 20 20 20 20 20  t bEnd;         
25890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
258a0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
258b0 69 66 20 72 65 61 64 69 6e 67 20 74 6f 20 65 6e  if reading to en
258c0 64 20 6f 66 20 64 61 74 61 20 2a 2f 0a 23 65 6e  d of data */.#en
258d0 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
258e0 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
258f0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
25900 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
25910 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
25920 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
25930 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  e]<pPage->nCell 
25940 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
25950 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
25960 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
25970 20 65 4f 70 21 3d 32 20 7c 7c 20 6f 66 66 73 65   eOp!=2 || offse
25980 74 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20 41 6c  t==0 );    /* Al
25990 77 61 79 73 20 73 74 61 72 74 20 66 72 6f 6d 20  ways start from 
259a0 62 65 67 69 6e 6e 69 6e 67 20 66 6f 72 20 65 4f  beginning for eO
259b0 70 3d 3d 32 20 2a 2f 0a 0a 20 20 67 65 74 43 65  p==2 */..  getCe
259c0 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
259d0 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d  aPayload = pCur-
259e0 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a  >info.pPayload;.
259f0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
25a00 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45  RECT_OVERFLOW_RE
25a10 41 44 0a 20 20 62 45 6e 64 20 3d 20 6f 66 66 73  AD.  bEnd = offs
25a20 65 74 2b 61 6d 74 3d 3d 70 43 75 72 2d 3e 69 6e  et+amt==pCur->in
25a30 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a 23 65 6e  fo.nPayload;.#en
25a40 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 6f 66  dif.  assert( of
25a50 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 43 75 72  fset+amt <= pCur
25a60 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20  ->info.nPayload 
25a70 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61 50  );..  assert( aP
25a80 61 79 6c 6f 61 64 20 3e 20 70 50 61 67 65 2d 3e  ayload > pPage->
25a90 61 44 61 74 61 20 29 3b 0a 20 20 69 66 28 20 28  aData );.  if( (
25aa0 75 70 74 72 29 28 61 50 61 79 6c 6f 61 64 20 2d  uptr)(aPayload -
25ab0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 29 20 3e   pPage->aData) >
25ac0 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a   (pBt->usableSiz
25ad0 65 20 2d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  e - pCur->info.n
25ae0 4c 6f 63 61 6c 29 20 29 7b 0a 20 20 20 20 2f 2a  Local) ){.    /*
25af0 20 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20   Trying to read 
25b00 6f 72 20 77 72 69 74 65 20 70 61 73 74 20 74 68  or write past th
25b10 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74  e end of the dat
25b20 61 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 20  a is an error.  
25b30 54 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 64 69  The.    ** condi
25b40 74 69 6f 6e 61 6c 20 61 62 6f 76 65 20 69 73 20  tional above is 
25b50 72 65 61 6c 6c 79 3a 0a 20 20 20 20 2a 2a 20 20  really:.    **  
25b60 20 20 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72    &aPayload[pCur
25b70 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e  ->info.nLocal] >
25b80 20 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70   &pPage->aData[p
25b90 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 0a  Bt->usableSize].
25ba0 20 20 20 20 2a 2a 20 62 75 74 20 69 73 20 72 65      ** but is re
25bb0 63 61 73 74 20 69 6e 74 6f 20 69 74 73 20 63 75  cast into its cu
25bc0 72 72 65 6e 74 20 66 6f 72 6d 20 74 6f 20 61 76  rrent form to av
25bd0 6f 69 64 20 69 6e 74 65 67 65 72 20 6f 76 65 72  oid integer over
25be0 66 6c 6f 77 20 70 72 6f 62 6c 65 6d 73 0a 20 20  flow problems.  
25bf0 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20    */.    return 
25c00 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
25c10 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  KPT;.  }..  /* C
25c20 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d 75 73  heck if data mus
25c30 74 20 62 65 20 72 65 61 64 2f 77 72 69 74 74 65  t be read/writte
25c40 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74  n to/from the bt
25c50 72 65 65 20 70 61 67 65 20 69 74 73 65 6c 66 2e  ree page itself.
25c60 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74   */.  if( offset
25c70 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  <pCur->info.nLoc
25c80 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 20  al ){.    int a 
25c90 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28 20 61  = amt;.    if( a
25ca0 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e  +offset>pCur->in
25cb0 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  fo.nLocal ){.   
25cc0 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66     a = pCur->inf
25cd0 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65  o.nLocal - offse
25ce0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  t;.    }.    rc 
25cf0 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61  = copyPayload(&a
25d00 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c  Payload[offset],
25d10 20 70 42 75 66 2c 20 61 2c 20 28 65 4f 70 20 26   pBuf, a, (eOp &
25d20 20 30 78 30 31 29 2c 20 70 50 61 67 65 2d 3e 70   0x01), pPage->p
25d30 44 62 50 61 67 65 29 3b 0a 20 20 20 20 6f 66 66  DbPage);.    off
25d40 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 42 75  set = 0;.    pBu
25d50 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20  f += a;.    amt 
25d60 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  -= a;.  }else{. 
25d70 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70 43 75     offset -= pCu
25d80 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a  r->info.nLocal;.
25d90 20 20 7d 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d    }...  if( rc==
25da0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74  SQLITE_OK && amt
25db0 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  >0 ){.    const 
25dc0 75 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70  u32 ovflSize = p
25dd0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
25de0 20 34 3b 20 20 2f 2a 20 42 79 74 65 73 20 63 6f   4;  /* Bytes co
25df0 6e 74 65 6e 74 20 70 65 72 20 6f 76 66 6c 20 70  ntent per ovfl p
25e00 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  age */.    Pgno 
25e10 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e  nextPage;..    n
25e20 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79  extPage = get4by
25e30 74 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43 75  te(&aPayload[pCu
25e40 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29  r->info.nLocal])
25e50 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
25e60 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66   BtCursor.aOverf
25e70 6c 6f 77 5b 5d 20 68 61 73 20 6e 6f 74 20 62 65  low[] has not be
25e80 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c  en allocated, al
25e90 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e 0a 20  locate it now.. 
25ea0 20 20 20 2a 2a 20 45 78 63 65 70 74 2c 20 64 6f     ** Except, do
25eb0 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20 61 4f   not allocate aO
25ec0 76 65 72 66 6c 6f 77 5b 5d 20 66 6f 72 20 65 4f  verflow[] for eO
25ed0 70 3d 3d 32 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  p==2..    **.   
25ee0 20 2a 2a 20 54 68 65 20 61 4f 76 65 72 66 6c 6f   ** The aOverflo
25ef0 77 5b 5d 20 61 72 72 61 79 20 69 73 20 73 69 7a  w[] array is siz
25f00 65 64 20 61 74 20 6f 6e 65 20 65 6e 74 72 79 20  ed at one entry 
25f10 66 6f 72 20 65 61 63 68 20 6f 76 65 72 66 6c 6f  for each overflo
25f20 77 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e  w page.    ** in
25f30 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68   the overflow ch
25f40 61 69 6e 2e 20 54 68 65 20 70 61 67 65 20 6e 75  ain. The page nu
25f50 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69 72 73  mber of the firs
25f60 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
25f70 69 73 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 64  is.    ** stored
25f80 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d   in aOverflow[0]
25f90 2c 20 65 74 63 2e 20 41 20 76 61 6c 75 65 20 6f  , etc. A value o
25fa0 66 20 30 20 69 6e 20 74 68 65 20 61 4f 76 65 72  f 0 in the aOver
25fb0 66 6c 6f 77 5b 5d 20 61 72 72 61 79 0a 20 20 20  flow[] array.   
25fc0 20 2a 2a 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79   ** means "not y
25fd0 65 74 20 6b 6e 6f 77 6e 22 20 28 74 68 65 20 63  et known" (the c
25fe0 61 63 68 65 20 69 73 20 6c 61 7a 69 6c 79 20 70  ache is lazily p
25ff0 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a  opulated)..    *
26000 2f 0a 20 20 20 20 69 66 28 20 65 4f 70 21 3d 32  /.    if( eOp!=2
26010 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c   && (pCur->curFl
26020 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
26030 4f 76 66 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Ovfl)==0 ){.    
26040 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70    int nOvfl = (p
26050 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f  Cur->info.nPaylo
26060 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  ad-pCur->info.nL
26070 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29  ocal+ovflSize-1)
26080 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20  /ovflSize;.     
26090 20 69 66 28 20 6e 4f 76 66 6c 3e 70 43 75 72 2d   if( nOvfl>pCur-
260a0 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20 29 7b 0a 20  >nOvflAlloc ){. 
260b0 20 20 20 20 20 20 20 50 67 6e 6f 20 2a 61 4e 65         Pgno *aNe
260c0 77 20 3d 20 28 50 67 6e 6f 2a 29 73 71 6c 69 74  w = (Pgno*)sqlit
260d0 65 33 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20  e3Realloc(.     
260e0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76         pCur->aOv
260f0 65 72 66 6c 6f 77 2c 20 6e 4f 76 66 6c 2a 32 2a  erflow, nOvfl*2*
26100 73 69 7a 65 6f 66 28 50 67 6e 6f 29 0a 20 20 20  sizeof(Pgno).   
26110 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
26120 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( aNew==0 ){. 
26130 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
26140 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
26150 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
26160 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
26170 6e 4f 76 66 6c 41 6c 6c 6f 63 20 3d 20 6e 4f 76  nOvflAlloc = nOv
26180 66 6c 2a 32 3b 0a 20 20 20 20 20 20 20 20 20 20  fl*2;.          
26190 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
261a0 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = aNew;.        
261b0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
261c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
261d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  K ){.        mem
261e0 73 65 74 28 70 43 75 72 2d 3e 61 4f 76 65 72 66  set(pCur->aOverf
261f0 6c 6f 77 2c 20 30 2c 20 6e 4f 76 66 6c 2a 73 69  low, 0, nOvfl*si
26200 7a 65 6f 66 28 50 67 6e 6f 29 29 3b 0a 20 20 20  zeof(Pgno));.   
26210 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c       pCur->curFl
26220 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69  ags |= BTCF_Vali
26230 64 4f 76 66 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  dOvfl;.      }. 
26240 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
26250 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
26260 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73  e-list cache has
26270 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
26280 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 65  and the.    ** e
26290 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 72  ntry for the fir
262a0 73 74 20 72 65 71 75 69 72 65 64 20 6f 76 65 72  st required over
262b0 66 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c  flow page is val
262c0 69 64 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20  id, skip.    ** 
262d0 64 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a  directly to it..
262e0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
262f0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
26300 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29   BTCF_ValidOvfl)
26310 21 3d 30 0a 20 20 20 20 20 26 26 20 70 43 75 72  !=0.     && pCur
26320 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73  ->aOverflow[offs
26330 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 0a 20 20 20  et/ovflSize].   
26340 20 29 7b 0a 20 20 20 20 20 20 69 49 64 78 20 3d   ){.      iIdx =
26350 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a   (offset/ovflSiz
26360 65 29 3b 0a 20 20 20 20 20 20 6e 65 78 74 50 61  e);.      nextPa
26370 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72  ge = pCur->aOver
26380 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20  flow[iIdx];.    
26390 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66 73    offset = (offs
263a0 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20  et%ovflSize);.  
263b0 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20    }..    for( ; 
263c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
263d0 20 61 6d 74 3e 30 20 26 26 20 6e 65 78 74 50 61   amt>0 && nextPa
263e0 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 20 20  ge; iIdx++){..  
263f0 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72      /* If requir
26400 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65  ed, populate the
26410 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
26420 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20  ist cache. */.  
26430 20 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63      if( (pCur->c
26440 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
26450 61 6c 69 64 4f 76 66 6c 29 21 3d 30 20 29 7b 0a  alidOvfl)!=0 ){.
26460 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
26470 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
26480 69 49 64 78 5d 3d 3d 30 0a 20 20 20 20 20 20 20  iIdx]==0.       
26490 20 20 20 20 20 20 20 20 20 7c 7c 20 70 43 75 72           || pCur
264a0 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
264b0 5d 3d 3d 6e 65 78 74 50 61 67 65 0a 20 20 20 20  ]==nextPage.    
264c0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 43              || C
264d0 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20  ORRUPT_DB );.   
264e0 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72       pCur->aOver
264f0 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78  flow[iIdx] = nex
26500 74 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a  tPage;.      }..
26510 20 20 20 20 20 20 69 66 28 20 6f 66 66 73 65 74        if( offset
26520 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20  >=ovflSize ){.  
26530 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c        /* The onl
26540 79 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64  y reason to read
26550 20 74 68 69 73 20 70 61 67 65 20 69 73 20 74 6f   this page is to
26560 20 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67 65   obtain the page
26570 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62  .        ** numb
26580 65 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  er for the next 
26590 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72  page in the over
265a0 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20  flow chain. The 
265b0 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
265c0 64 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75  data is not requ
265d0 69 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74  ired. So first t
265e0 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65  ry to lookup the
265f0 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20   overflow.      
26600 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63    ** page-list c
26610 61 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68  ache, if any, th
26620 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20  en fall back to 
26630 74 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  the getOverflowP
26640 61 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a  age().        **
26650 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20   function..     
26660 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
26670 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 61   Note that the a
26680 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79  Overflow[] array
26690 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74   must be allocat
266a0 65 64 20 62 65 63 61 75 73 65 20 65 4f 70 21 3d  ed because eOp!=
266b0 32 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 65 72  2.        ** her
266c0 65 2e 20 20 49 66 20 65 4f 70 3d 3d 32 2c 20 74  e.  If eOp==2, t
266d0 68 65 6e 20 6f 66 66 73 65 74 3d 3d 30 20 61 6e  hen offset==0 an
266e0 64 20 74 68 69 73 20 62 72 61 6e 63 68 20 69 73  d this branch is
266f0 20 6e 65 76 65 72 20 74 61 6b 65 6e 2e 0a 20 20   never taken..  
26700 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
26710 20 61 73 73 65 72 74 28 20 65 4f 70 21 3d 32 20   assert( eOp!=2 
26720 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
26730 74 28 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  t( pCur->curFlag
26740 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76  s & BTCF_ValidOv
26750 66 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  fl );.        as
26760 73 65 72 74 28 20 70 43 75 72 2d 3e 70 42 74 72  sert( pCur->pBtr
26770 65 65 2d 3e 64 62 3d 3d 70 42 74 2d 3e 64 62 20  ee->db==pBt->db 
26780 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
26790 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
267a0 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20  Idx+1] ){.      
267b0 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70      nextPage = p
267c0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
267d0 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20  Idx+1];.        
267e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
267f0 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f   rc = getOverflo
26800 77 50 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50  wPage(pBt, nextP
26810 61 67 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67  age, 0, &nextPag
26820 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
26830 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20        offset -= 
26840 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20  ovflSize;.      
26850 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
26860 2a 20 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74  * Need to read t
26870 68 69 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c  his page properl
26880 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73  y. It contains s
26890 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20  ome of the.     
268a0 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64     ** range of d
268b0 61 74 61 20 74 68 61 74 20 69 73 20 62 65 69 6e  ata that is bein
268c0 67 20 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20  g read (eOp==0) 
268d0 6f 72 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21  or written (eOp!
268e0 3d 30 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  =0)..        */.
268f0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
26900 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45  RECT_OVERFLOW_RE
26910 41 44 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  AD.        sqlit
26920 65 33 5f 66 69 6c 65 20 2a 66 64 3b 0a 23 65 6e  e3_file *fd;.#en
26930 64 69 66 0a 20 20 20 20 20 20 20 20 69 6e 74 20  dif.        int 
26940 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20 20  a = amt;.       
26950 20 69 66 28 20 61 20 2b 20 6f 66 66 73 65 74 20   if( a + offset 
26960 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20  > ovflSize ){.  
26970 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76 66 6c          a = ovfl
26980 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20  Size - offset;. 
26990 20 20 20 20 20 20 20 7d 0a 0a 23 69 66 64 65 66         }..#ifdef
269a0 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f   SQLITE_DIRECT_O
269b0 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20  VERFLOW_READ.   
269c0 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 74       /* If all t
269d0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
269e0 20 74 72 75 65 3a 0a 20 20 20 20 20 20 20 20 2a   true:.        *
269f0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 31  *.        **   1
26a00 29 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64  ) this is a read
26a10 20 6f 70 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20   operation, and 
26a20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 32 29  .        **   2)
26a30 20 64 61 74 61 20 69 73 20 72 65 71 75 69 72 65   data is require
26a40 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72 74  d from the start
26a50 20 6f 66 20 74 68 69 73 20 6f 76 65 72 66 6c 6f   of this overflo
26a60 77 20 70 61 67 65 2c 20 61 6e 64 0a 20 20 20 20  w page, and.    
26a70 20 20 20 20 2a 2a 20 20 20 33 29 20 74 68 65 20      **   3) the 
26a80 64 61 74 61 62 61 73 65 20 69 73 20 66 69 6c 65  database is file
26a90 2d 62 61 63 6b 65 64 2c 20 61 6e 64 0a 20 20 20  -backed, and.   
26aa0 20 20 20 20 20 2a 2a 20 20 20 34 29 20 74 68 65       **   4) the
26ab0 72 65 20 69 73 20 6e 6f 20 6f 70 65 6e 20 77 72  re is no open wr
26ac0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite-transaction,
26ad0 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   and.        ** 
26ae0 20 20 35 29 20 74 68 65 20 64 61 74 61 62 61 73    5) the databas
26af0 65 20 69 73 20 6e 6f 74 20 61 20 57 41 4c 20 64  e is not a WAL d
26b00 61 74 61 62 61 73 65 2c 0a 20 20 20 20 20 20 20  atabase,.       
26b10 20 2a 2a 20 20 20 36 29 20 61 6c 6c 20 64 61 74   **   6) all dat
26b20 61 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20  a from the page 
26b30 69 73 20 62 65 69 6e 67 20 72 65 61 64 2e 0a 20  is being read.. 
26b40 20 20 20 20 20 20 20 2a 2a 20 20 20 37 29 20 61         **   7) a
26b50 74 20 6c 65 61 73 74 20 34 20 62 79 74 65 73 20  t least 4 bytes 
26b60 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
26b70 6e 20 72 65 61 64 20 69 6e 74 6f 20 74 68 65 20  n read into the 
26b80 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 0a 20  output buffer . 
26b90 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
26ba0 20 20 2a 2a 20 74 68 65 6e 20 64 61 74 61 20 63    ** then data c
26bb0 61 6e 20 62 65 20 72 65 61 64 20 64 69 72 65 63  an be read direc
26bc0 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 64 61 74  tly from the dat
26bd0 61 62 61 73 65 20 66 69 6c 65 20 69 6e 74 6f 20  abase file into 
26be0 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  the.        ** o
26bf0 75 74 70 75 74 20 62 75 66 66 65 72 2c 20 62 79  utput buffer, by
26c00 70 61 73 73 69 6e 67 20 74 68 65 20 70 61 67 65  passing the page
26c10 2d 63 61 63 68 65 20 61 6c 74 6f 67 65 74 68 65  -cache altogethe
26c20 72 2e 20 54 68 69 73 20 73 70 65 65 64 73 0a 20  r. This speeds. 
26c30 20 20 20 20 20 20 20 2a 2a 20 75 70 20 6c 6f 61         ** up loa
26c40 64 69 6e 67 20 6c 61 72 67 65 20 72 65 63 6f 72  ding large recor
26c50 64 73 20 74 68 61 74 20 73 70 61 6e 20 6d 61 6e  ds that span man
26c60 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  y overflow pages
26c70 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
26c80 20 20 20 20 20 69 66 28 20 28 65 4f 70 26 30 78       if( (eOp&0x
26c90 30 31 29 3d 3d 30 20 20 20 20 20 20 20 20 20 20  01)==0          
26ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26cb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
26cc0 31 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26  1) */.         &
26cd0 26 20 6f 66 66 73 65 74 3d 3d 30 20 20 20 20 20  & offset==0     
26ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d00 20 20 20 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20       /* (2) */. 
26d10 20 20 20 20 20 20 20 20 26 26 20 28 62 45 6e 64          && (bEnd
26d20 20 7c 7c 20 61 3d 3d 6f 76 66 6c 53 69 7a 65 29   || a==ovflSize)
26d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26d50 20 28 36 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (6) */.        
26d60 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73   && pBt->inTrans
26d70 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 52 45  action==TRANS_RE
26d80 41 44 20 20 20 20 20 20 20 20 20 20 20 20 20 20  AD              
26d90 20 20 20 20 20 20 20 2f 2a 20 28 34 29 20 2a 2f         /* (4) */
26da0 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 66 64  .         && (fd
26db0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46   = sqlite3PagerF
26dc0 69 6c 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ile(pBt->pPager)
26dd0 29 2d 3e 70 4d 65 74 68 6f 64 73 20 20 20 20 20  )->pMethods     
26de0 2f 2a 20 28 33 29 20 2a 2f 0a 20 20 20 20 20 20  /* (3) */.      
26df0 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33     && 0==sqlite3
26e00 50 61 67 65 72 55 73 65 57 61 6c 28 70 42 74 2d  PagerUseWal(pBt-
26e10 3e 70 50 61 67 65 72 29 20 20 20 20 20 20 20 20  >pPager)        
26e20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 35 29 20           /* (5) 
26e30 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 26  */.         && &
26e40 70 42 75 66 5b 2d 34 5d 3e 3d 70 42 75 66 53 74  pBuf[-4]>=pBufSt
26e50 61 72 74 20 20 20 20 20 20 20 20 20 20 20 20 20  art             
26e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e70 20 20 2f 2a 20 28 37 29 20 2a 2f 0a 20 20 20 20    /* (7) */.    
26e80 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
26e90 20 75 38 20 61 53 61 76 65 5b 34 5d 3b 0a 20 20   u8 aSave[4];.  
26ea0 20 20 20 20 20 20 20 20 75 38 20 2a 61 57 72 69          u8 *aWri
26eb0 74 65 20 3d 20 26 70 42 75 66 5b 2d 34 5d 3b 0a  te = &pBuf[-4];.
26ec0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
26ed0 28 20 61 57 72 69 74 65 3e 3d 70 42 75 66 53 74  ( aWrite>=pBufSt
26ee0 61 72 74 20 29 3b 20 20 20 20 20 20 20 20 20 20  art );          
26ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26f00 2a 20 68 65 6e 63 65 20 28 37 29 20 2a 2f 0a 20  * hence (7) */. 
26f10 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
26f20 61 53 61 76 65 2c 20 61 57 72 69 74 65 2c 20 34  aSave, aWrite, 4
26f30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
26f40 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
26f50 66 64 2c 20 61 57 72 69 74 65 2c 20 61 2b 34 2c  fd, aWrite, a+4,
26f60 20 28 69 36 34 29 70 42 74 2d 3e 70 61 67 65 53   (i64)pBt->pageS
26f70 69 7a 65 2a 28 6e 65 78 74 50 61 67 65 2d 31 29  ize*(nextPage-1)
26f80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78  );.          nex
26f90 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  tPage = get4byte
26fa0 28 61 57 72 69 74 65 29 3b 0a 20 20 20 20 20 20  (aWrite);.      
26fb0 20 20 20 20 6d 65 6d 63 70 79 28 61 57 72 69 74      memcpy(aWrit
26fc0 65 2c 20 61 53 61 76 65 2c 20 34 29 3b 0a 20 20  e, aSave, 4);.  
26fd0 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
26fe0 69 66 0a 0a 20 20 20 20 20 20 20 20 7b 0a 20 20  if..        {.  
26ff0 20 20 20 20 20 20 20 20 44 62 50 61 67 65 20 2a          DbPage *
27000 70 44 62 50 61 67 65 3b 0a 20 20 20 20 20 20 20  pDbPage;.       
27010 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
27020 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61  agerGet(pBt->pPa
27030 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26  ger, nextPage, &
27040 70 44 62 50 61 67 65 2c 0a 20 20 20 20 20 20 20  pDbPage,.       
27050 20 20 20 20 20 20 20 28 28 65 4f 70 26 30 78 30         ((eOp&0x0
27060 31 29 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47 45  1)==0 ? PAGER_GE
27070 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 0a  T_READONLY : 0).
27080 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
27090 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
270a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
270b0 20 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64          aPayload
270c0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
270d0 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
270e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78  .            nex
270f0 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  tPage = get4byte
27100 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20  (aPayload);.    
27110 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70          rc = cop
27120 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f  yPayload(&aPaylo
27130 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42  ad[offset+4], pB
27140 75 66 2c 20 61 2c 20 28 65 4f 70 26 30 78 30 31  uf, a, (eOp&0x01
27150 29 2c 20 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ), pDbPage);.   
27160 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
27170 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
27180 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
27190 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20   offset = 0;.   
271a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
271b0 20 7d 0a 20 20 20 20 20 20 20 20 61 6d 74 20 2d   }.        amt -
271c0 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 70 42 75  = a;.        pBu
271d0 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a  f += a;.      }.
271e0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
271f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
27200 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72  & amt>0 ){.    r
27210 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
27220 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
27230 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
27240 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f  *.** Read part o
27250 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20 66 6f  f the payload fo
27260 72 20 74 68 65 20 72 6f 77 20 61 74 20 77 68 69  r the row at whi
27270 63 68 20 74 68 61 74 20 63 75 72 73 6f 72 20 70  ch that cursor p
27280 43 75 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79  Cur is currently
27290 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 22  .** pointing.  "
272a0 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20  amt" bytes will 
272b0 62 65 20 74 72 61 6e 73 66 65 72 72 65 64 20 69  be transferred i
272c0 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65  nto pBuf[].  The
272d0 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67   transfer.** beg
272e0 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e  ins at "offset".
272f0 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 63 61 6e 20  .**.** pCur can 
27300 62 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65  be pointing to e
27310 69 74 68 65 72 20 61 20 74 61 62 6c 65 20 6f 72  ither a table or
27320 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65   an index b-tree
27330 2e 0a 2a 2a 20 49 66 20 70 6f 69 6e 74 69 6e 67  ..** If pointing
27340 20 74 6f 20 61 20 74 61 62 6c 65 20 62 74 72 65   to a table btre
27350 65 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74  e, then the cont
27360 65 6e 74 20 73 65 63 74 69 6f 6e 20 69 73 20 72  ent section is r
27370 65 61 64 2e 20 20 49 66 0a 2a 2a 20 70 43 75 72  ead.  If.** pCur
27380 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20   is pointing to 
27390 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20  an index b-tree 
273a0 74 68 65 6e 20 74 68 65 20 6b 65 79 20 73 65 63  then the key sec
273b0 74 69 6f 6e 20 69 73 20 72 65 61 64 2e 0a 2a 2a  tion is read..**
273c0 0a 2a 2a 20 46 6f 72 20 73 71 6c 69 74 65 33 42  .** For sqlite3B
273d0 74 72 65 65 50 61 79 6c 6f 61 64 28 29 2c 20 74  treePayload(), t
273e0 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65  he caller must e
273f0 6e 73 75 72 65 20 74 68 61 74 20 70 43 75 72 20  nsure that pCur 
27400 69 73 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74  is pointing.** t
27410 6f 20 61 20 76 61 6c 69 64 20 72 6f 77 20 69 6e  o a valid row in
27420 20 74 68 65 20 74 61 62 6c 65 2e 20 20 46 6f 72   the table.  For
27430 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
27440 6c 6f 61 64 43 68 65 63 6b 65 64 28 29 2c 20 74  loadChecked(), t
27450 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 6d 69 67  he.** cursor mig
27460 68 74 20 62 65 20 69 6e 76 61 6c 69 64 20 6f 72  ht be invalid or
27470 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 62   might need to b
27480 65 20 72 65 73 74 6f 72 65 64 20 62 65 66 6f 72  e restored befor
27490 65 20 62 65 69 6e 67 20 72 65 61 64 2e 0a 2a 2a  e being read..**
274a0 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
274b0 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
274c0 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
274d0 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
274e0 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20  s.** wrong.  An 
274f0 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
27500 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74  d if "offset+amt
27510 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  " is larger than
27520 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c  .** the availabl
27530 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e  e payload..*/.in
27540 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  t sqlite3BtreePa
27550 79 6c 6f 61 64 28 42 74 43 75 72 73 6f 72 20 2a  yload(BtCursor *
27560 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74  pCur, u32 offset
27570 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20  , u32 amt, void 
27580 2a 70 42 75 66 29 7b 0a 20 20 61 73 73 65 72 74  *pBuf){.  assert
27590 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
275a0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
275b0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
275c0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
275d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
275e0 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20  ur->iPage>=0 && 
275f0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
27600 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61  r->iPage] );.  a
27610 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
27620 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
27630 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
27640 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
27650 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 63 63   );.  return acc
27660 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  essPayload(pCur,
27670 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75   offset, amt, (u
27680 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42  nsigned char*)pB
27690 75 66 2c 20 30 29 3b 0a 7d 0a 23 69 66 6e 64 65  uf, 0);.}.#ifnde
276a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
276b0 43 52 42 4c 4f 42 0a 69 6e 74 20 73 71 6c 69 74  CRBLOB.int sqlit
276c0 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 43 68  e3BtreePayloadCh
276d0 65 63 6b 65 64 28 42 74 43 75 72 73 6f 72 20 2a  ecked(BtCursor *
276e0 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74  pCur, u32 offset
276f0 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20  , u32 amt, void 
27700 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63  *pBuf){.  int rc
27710 3b 0a 20 20 69 66 20 28 20 70 43 75 72 2d 3e 65  ;.  if ( pCur->e
27720 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
27730 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74  VALID ){.    ret
27740 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  urn SQLITE_ABORT
27750 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
27760 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
27770 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63  ed(pCur) );.  rc
27780 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
27790 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
277a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
277b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
277c0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
277d0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
277e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
277f0 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70  r->iPage>=0 && p
27800 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
27810 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 20 20  ->iPage] );.    
27820 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
27830 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
27840 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  <pCur->apPage[pC
27850 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
27860 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 63  l );.    rc = ac
27870 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72  cessPayload(pCur
27880 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70  , offset, amt, p
27890 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  Buf, 0);.  }.  r
278a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
278b0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
278c0 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f  T_INCRBLOB */../
278d0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
278e0 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f 61 64  inter to payload
278f0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
27900 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  m the entry that
27910 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20 63 75   the .** pCur cu
27920 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
27930 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74 65   to.  The pointe
27940 72 20 69 73 20 74 6f 20 74 68 65 20 62 65 67 69  r is to the begi
27950 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20  nning of.** the 
27960 6b 65 79 20 69 66 20 69 6e 64 65 78 20 62 74 72  key if index btr
27970 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b  ees (pPage->intK
27980 65 79 3d 3d 30 29 20 61 6e 64 20 69 73 20 74 68  ey==0) and is th
27990 65 20 64 61 74 61 20 66 6f 72 0a 2a 2a 20 74 61  e data for.** ta
279a0 62 6c 65 20 62 74 72 65 65 73 20 28 70 50 61 67  ble btrees (pPag
279b0 65 2d 3e 69 6e 74 4b 65 79 3d 3d 31 29 2e 20 54  e->intKey==1). T
279c0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
279d0 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 0a  es of available.
279e0 2a 2a 20 6b 65 79 2f 64 61 74 61 20 69 73 20 77  ** key/data is w
279f0 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 41 6d  ritten into *pAm
27a00 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c  t.  If *pAmt==0,
27a10 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 0a   then the value.
27a20 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c  ** returned will
27a30 20 6e 6f 74 20 62 65 20 61 20 76 61 6c 69 64 20   not be a valid 
27a40 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  pointer..**.** T
27a50 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
27a60 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
27a70 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f   It is common fo
27a80 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79  r the entire key
27a90 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20  .** and data to 
27aa0 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  fit on the local
27ab0 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68   page and for th
27ac0 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65  ere to be no ove
27ad0 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20  rflow.** pages. 
27ae0 20 57 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f   When that is so
27af0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  , this routine c
27b00 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61 63  an be used to ac
27b10 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20  cess the.** key 
27b20 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f 75 74  and data without
27b30 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20   making a copy. 
27b40 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f   If the key and/
27b50 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a  or data spills.*
27b60 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20  * onto overflow 
27b70 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65  pages, then acce
27b80 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74  ssPayload() must
27b90 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 61 73   be used to reas
27ba0 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65  semble.** the ke
27bb0 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20  y/data and copy 
27bc0 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c  it into a preall
27bd0 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a  ocated buffer..*
27be0 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72  *.** The pointer
27bf0 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
27c00 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20  s routine looks 
27c10 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68  directly into th
27c20 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65  e cached.** page
27c30 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
27c40 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69 67 68  .  The data migh
27c50 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65  t change or move
27c60 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a   the next time.*
27c70 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74  * any btree rout
27c80 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
27c90 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 76  /.static const v
27ca0 6f 69 64 20 2a 66 65 74 63 68 50 61 79 6c 6f 61  oid *fetchPayloa
27cb0 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
27cc0 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72  Cur,      /* Cur
27cd0 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
27ce0 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72  entry to read fr
27cf0 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 2a 70 41 6d  om */.  u32 *pAm
27d00 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t            /* 
27d10 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
27d20 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79   of available by
27d30 74 65 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  tes here */.){. 
27d40 20 75 33 32 20 61 6d 74 3b 0a 20 20 61 73 73 65   u32 amt;.  asse
27d50 72 74 28 20 70 43 75 72 21 3d 30 20 26 26 20 70  rt( pCur!=0 && p
27d60 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26  Cur->iPage>=0 &&
27d70 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
27d80 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 61  ur->iPage]);.  a
27d90 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
27da0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
27db0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  D );.  assert( s
27dc0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
27dd0 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
27de0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
27df0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
27e00 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
27e10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
27e20 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
27e30 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50  iPage]<pCur->apP
27e40 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
27e50 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73  ->nCell );.  ass
27e60 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
27e70 6e 53 69 7a 65 3e 30 20 29 3b 0a 20 20 61 73 73  nSize>0 );.  ass
27e80 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
27e90 70 50 61 79 6c 6f 61 64 3e 70 43 75 72 2d 3e 61  pPayload>pCur->a
27ea0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
27eb0 65 5d 2d 3e 61 44 61 74 61 20 7c 7c 20 43 4f 52  e]->aData || COR
27ec0 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73  RUPT_DB );.  ass
27ed0 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
27ee0 70 50 61 79 6c 6f 61 64 3c 70 43 75 72 2d 3e 61  pPayload<pCur->a
27ef0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
27f00 65 5d 2d 3e 61 44 61 74 61 45 6e 64 20 7c 7c 43  e]->aDataEnd ||C
27f10 4f 52 52 55 50 54 5f 44 42 29 3b 0a 20 20 61 6d  ORRUPT_DB);.  am
27f20 74 20 3d 20 28 69 6e 74 29 28 70 43 75 72 2d 3e  t = (int)(pCur->
27f30 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
27f40 67 65 5d 2d 3e 61 44 61 74 61 45 6e 64 20 2d 20  ge]->aDataEnd - 
27f50 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c  pCur->info.pPayl
27f60 6f 61 64 29 3b 0a 20 20 69 66 28 20 70 43 75 72  oad);.  if( pCur
27f70 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 61 6d  ->info.nLocal<am
27f80 74 20 29 20 61 6d 74 20 3d 20 70 43 75 72 2d 3e  t ) amt = pCur->
27f90 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 2a  info.nLocal;.  *
27fa0 70 41 6d 74 20 3d 20 61 6d 74 3b 0a 20 20 72 65  pAmt = amt;.  re
27fb0 74 75 72 6e 20 28 76 6f 69 64 2a 29 70 43 75 72  turn (void*)pCur
27fc0 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b  ->info.pPayload;
27fd0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74  .}.../*.** For t
27fe0 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 63 75  he entry that cu
27ff0 72 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69  rsor pCur is poi
28000 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73  nt to, return as
28010 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f  .** many bytes o
28020 66 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74  f the key or dat
28030 61 20 61 73 20 61 72 65 20 61 76 61 69 6c 61 62  a as are availab
28040 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a  le on the local.
28050 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  ** b-tree page. 
28060 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65   Write the numbe
28070 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62  r of available b
28080 79 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e  ytes into *pAmt.
28090 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74  .**.** The point
280a0 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 65  er returned is e
280b0 70 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b  phemeral.  The k
280c0 65 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65  ey/data may move
280d0 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f  .** or be destro
280e0 79 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20  yed on the next 
280f0 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65  call to any Btre
28100 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e  e routine,.** in
28110 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66 72  cluding calls fr
28120 6f 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64 73  om other threads
28130 20 61 67 61 69 6e 73 74 20 74 68 65 20 73 61 6d   against the sam
28140 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63  e cache..** Henc
28150 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68  e, a mutex on th
28160 65 20 42 74 53 68 61 72 65 64 20 73 68 6f 75 6c  e BtShared shoul
28170 64 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72 20  d be held prior 
28180 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68  to calling.** th
28190 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
281a0 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73  * These routines
281b0 20 69 73 20 75 73 65 64 20 74 6f 20 67 65 74 20   is used to get 
281c0 71 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20  quick access to 
281d0 6b 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20  key and data.** 
281e0 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  in the common ca
281f0 73 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72  se where no over
28200 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20 75  flow pages are u
28210 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f  sed..*/.const vo
28220 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  id *sqlite3Btree
28230 50 61 79 6c 6f 61 64 46 65 74 63 68 28 42 74 43  PayloadFetch(BtC
28240 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
28250 20 2a 70 41 6d 74 29 7b 0a 20 20 72 65 74 75 72   *pAmt){.  retur
28260 6e 20 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70  n fetchPayload(p
28270 43 75 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a 0a 0a  Cur, pAmt);.}...
28280 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
28290 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20  ursor down to a 
282a0 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20  new child page. 
282b0 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67   The newPgno arg
282c0 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20  ument is the.** 
282d0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
282e0 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f  he child page to
282f0 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20   move to..**.** 
28300 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
28310 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52  turns SQLITE_COR
28320 52 55 50 54 20 69 66 20 74 68 65 20 70 61 67 65  RUPT if the page
28330 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20 66 69  -header flags fi
28340 65 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  eld of.** the ne
28350 77 20 63 68 69 6c 64 20 70 61 67 65 20 64 6f 65  w child page doe
28360 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
28370 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 20 74  flags field of t
28380 68 65 20 70 61 72 65 6e 74 20 28 69 2e 65 2e 0a  he parent (i.e..
28390 2a 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65 79 20  ** if an intkey 
283a0 70 61 67 65 20 61 70 70 65 61 72 73 20 74 6f 20  page appears to 
283b0 62 65 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66  be the parent of
283c0 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70 61   a non-intkey pa
283d0 67 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65 2d 76  ge, or.** vice-v
283e0 65 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ersa)..*/.static
283f0 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64   int moveToChild
28400 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
28410 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20   u32 newPgno){. 
28420 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
28430 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61   pCur->pBt;..  a
28440 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
28450 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
28460 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
28470 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
28480 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
28490 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
284a0 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45  <BTCURSOR_MAX_DE
284b0 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28  PTH );.  assert(
284c0 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
284d0 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69  );.  if( pCur->i
284e0 50 61 67 65 3e 3d 28 42 54 43 55 52 53 4f 52 5f  Page>=(BTCURSOR_
284f0 4d 41 58 5f 44 45 50 54 48 2d 31 29 20 29 7b 0a  MAX_DEPTH-1) ){.
28500 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
28510 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
28520 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f    }.  pCur->info
28530 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
28540 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
28550 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  ~(BTCF_ValidNKey
28560 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  |BTCF_ValidOvfl)
28570 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2b  ;.  pCur->iPage+
28580 2b 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78  +;.  pCur->aiIdx
28590 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
285a0 30 3b 0a 20 20 72 65 74 75 72 6e 20 67 65 74 41  0;.  return getA
285b0 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
285c0 6e 65 77 50 67 6e 6f 2c 20 26 70 43 75 72 2d 3e  newPgno, &pCur->
285d0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
285e0 67 65 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ge],.           
285f0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 75               pCu
28600 72 2c 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65  r, pCur->curPage
28610 72 46 6c 61 67 73 29 3b 0a 7d 0a 0a 23 69 66 20  rFlags);.}..#if 
28620 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
28630 2a 2a 20 50 61 67 65 20 70 50 61 72 65 6e 74 20  ** Page pParent 
28640 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28  is an internal (
28650 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65 20 70  non-leaf) tree p
28660 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  age. This functi
28670 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73 20 74  on .** asserts t
28680 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  hat page number 
28690 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 6c 65  iChild is the le
286a0 66 74 2d 63 68 69 6c 64 20 69 66 20 74 68 65 20  ft-child if the 
286b0 69 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20  iIdx'th.** cell 
286c0 69 6e 20 70 61 67 65 20 70 50 61 72 65 6e 74 2e  in page pParent.
286d0 20 4f 72 2c 20 69 66 20 69 49 64 78 20 69 73 20   Or, if iIdx is 
286e0 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 6f 74  equal to the tot
286f0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  al number of.** 
28700 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74  cells in pParent
28710 2c 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62  , that page numb
28720 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65  er iChild is the
28730 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a   right-child of.
28740 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  ** the page..*/.
28750 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
28760 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 4d 65  rtParentIndex(Me
28770 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20  mPage *pParent, 
28780 69 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f 20 69  int iIdx, Pgno i
28790 43 68 69 6c 64 29 7b 0a 20 20 69 66 28 20 43 4f  Child){.  if( CO
287a0 52 52 55 50 54 5f 44 42 20 29 20 72 65 74 75 72  RRUPT_DB ) retur
287b0 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6e 64 69  n;  /* The condi
287c0 74 69 6f 6e 73 20 74 65 73 74 65 64 20 62 65 6c  tions tested bel
287d0 6f 77 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20  ow might not be 
287e0 74 72 75 65 0a 20 20 20 20 20 20 20 20 20 20 20  true.           
287f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28800 20 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74   ** in a corrupt
28810 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 61   database */.  a
28820 73 73 65 72 74 28 20 69 49 64 78 3c 3d 70 50 61  ssert( iIdx<=pPa
28830 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  rent->nCell );. 
28840 20 69 66 28 20 69 49 64 78 3d 3d 70 50 61 72 65   if( iIdx==pPare
28850 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  nt->nCell ){.   
28860 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74   assert( get4byt
28870 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
28880 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
28890 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c 64  fset+8])==iChild
288a0 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
288b0 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74   assert( get4byt
288c0 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65  e(findCell(pPare
288d0 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69 43 68 69  nt, iIdx))==iChi
288e0 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73  ld );.  }.}.#els
288f0 65 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73 65  e.#  define asse
28900 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 78 2c  rtParentIndex(x,
28910 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a  y,z) .#endif../*
28920 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
28930 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70 61  sor up to the pa
28940 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  rent page..**.**
28950 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65   pCur->idx is se
28960 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e  t to the cell in
28970 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  dex that contain
28980 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a  s the pointer.**
28990 20 74 6f 20 74 68 65 20 70 61 67 65 20 77 65 20   to the page we 
289a0 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e  are coming from.
289b0 20 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d 69    If we are comi
289c0 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72  ng from the.** r
289d0 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20  ight-most child 
289e0 70 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d 3e  page then pCur->
289f0 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f 6e  idx is set to on
28a00 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74  e more than.** t
28a10 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c 20  he largest cell 
28a20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  index..*/.static
28a30 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72 65   void moveToPare
28a40 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  nt(BtCursor *pCu
28a50 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  r){.  assert( cu
28a60 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
28a70 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
28a80 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
28a90 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
28aa0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
28ab0 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20 61  ->iPage>0 );.  a
28ac0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
28ad0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
28ae0 20 29 3b 0a 20 20 61 73 73 65 72 74 50 61 72 65   );.  assertPare
28af0 6e 74 49 6e 64 65 78 28 0a 20 20 20 20 70 43 75  ntIndex(.    pCu
28b00 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
28b10 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70  iPage-1], .    p
28b20 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
28b30 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20  >iPage-1], .    
28b40 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
28b50 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a  r->iPage]->pgno.
28b60 20 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28    );.  testcase(
28b70 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
28b80 72 2d 3e 69 50 61 67 65 2d 31 5d 20 3e 20 70 43  r->iPage-1] > pC
28b90 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
28ba0 3e 69 50 61 67 65 2d 31 5d 2d 3e 6e 43 65 6c 6c  >iPage-1]->nCell
28bb0 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f   );.  pCur->info
28bc0 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
28bd0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
28be0 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  ~(BTCF_ValidNKey
28bf0 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  |BTCF_ValidOvfl)
28c00 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e  ;.  releasePageN
28c10 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 61 70 50  otNull(pCur->apP
28c20 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  age[pCur->iPage-
28c30 2d 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  -]);.}../*.** Mo
28c40 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
28c50 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f   point to the ro
28c60 6f 74 20 70 61 67 65 20 6f 66 20 69 74 73 20 62  ot page of its b
28c70 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e  -tree structure.
28c80 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 61  .**.** If the ta
28c90 62 6c 65 20 68 61 73 20 61 20 76 69 72 74 75 61  ble has a virtua
28ca0 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65  l root page, the
28cb0 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  n the cursor is 
28cc0 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74 0a 2a  moved to point.*
28cd0 2a 20 74 6f 20 74 68 65 20 76 69 72 74 75 61 6c  * to the virtual
28ce0 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 73 74 65   root page inste
28cf0 61 64 20 6f 66 20 74 68 65 20 61 63 74 75 61 6c  ad of the actual
28d00 20 72 6f 6f 74 20 70 61 67 65 2e 20 41 20 74 61   root page. A ta
28d10 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76 69 72  ble has a.** vir
28d20 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 77  tual root page w
28d30 68 65 6e 20 74 68 65 20 61 63 74 75 61 6c 20 72  hen the actual r
28d40 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  oot page contain
28d50 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64 20 61  s no cells and a
28d60 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68 69 6c   .** single chil
28d70 64 20 70 61 67 65 2e 20 54 68 69 73 20 63 61 6e  d page. This can
28d80 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77 69 74   only happen wit
28d90 68 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74  h the table root
28da0 65 64 20 61 74 20 70 61 67 65 20 31 2e 0a 2a 2a  ed at page 1..**
28db0 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d 74 72 65  .** If the b-tre
28dc0 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65  e structure is e
28dd0 6d 70 74 79 2c 20 74 68 65 20 63 75 72 73 6f 72  mpty, the cursor
28de0 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f   state is set to
28df0 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e 56 41   .** CURSOR_INVA
28e00 4c 49 44 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  LID. Otherwise, 
28e10 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 73 65  the cursor is se
28e20 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
28e30 65 20 66 69 72 73 74 0a 2a 2a 20 63 65 6c 6c 20  e first.** cell 
28e40 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20 72  located on the r
28e50 6f 6f 74 20 28 6f 72 20 76 69 72 74 75 61 6c 20  oot (or virtual 
28e60 72 6f 6f 74 29 20 70 61 67 65 20 61 6e 64 20 74  root) page and t
28e70 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 0a  he cursor state.
28e80 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 43 55 52  ** is set to CUR
28e90 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a  SOR_VALID..**.**
28ea0 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   If this functio
28eb0 6e 20 72 65 74 75 72 6e 73 20 73 75 63 63 65 73  n returns succes
28ec0 73 66 75 6c 6c 79 2c 20 69 74 20 6d 61 79 20 62  sfully, it may b
28ed0 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  e assumed that t
28ee0 68 65 0a 2a 2a 20 70 61 67 65 2d 68 65 61 64 65  he.** page-heade
28ef0 72 20 66 6c 61 67 73 20 69 6e 64 69 63 61 74 65  r flags indicate
28f00 20 74 68 61 74 20 74 68 65 20 5b 76 69 72 74 75   that the [virtu
28f10 61 6c 5d 20 72 6f 6f 74 2d 70 61 67 65 20 69 73  al] root-page is
28f20 20 74 68 65 20 65 78 70 65 63 74 65 64 20 0a 2a   the expected .*
28f30 2a 20 6b 69 6e 64 20 6f 66 20 62 2d 74 72 65 65  * kind of b-tree
28f40 20 70 61 67 65 20 28 69 2e 65 2e 20 69 66 20 77   page (i.e. if w
28f50 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65 20  hen opening the 
28f60 63 75 72 73 6f 72 20 74 68 65 20 63 61 6c 6c 65  cursor the calle
28f70 72 20 64 69 64 20 6e 6f 74 0a 2a 2a 20 73 70 65  r did not.** spe
28f80 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 73  cify a KeyInfo s
28f90 74 72 75 63 74 75 72 65 20 74 68 65 20 66 6c 61  tructure the fla
28fa0 67 73 20 62 79 74 65 20 69 73 20 73 65 74 20 74  gs byte is set t
28fb0 6f 20 30 78 30 35 20 6f 72 20 30 78 30 44 2c 0a  o 0x05 or 0x0D,.
28fc0 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 61 20  ** indicating a 
28fd0 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 20 6f 72  table b-tree, or
28fe0 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72 20 64   if the caller d
28ff0 69 64 20 73 70 65 63 69 66 79 20 61 20 4b 65 79  id specify a Key
29000 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74 75  Info .** structu
29010 72 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74  re the flags byt
29020 65 20 69 73 20 73 65 74 20 74 6f 20 30 78 30 32  e is set to 0x02
29030 20 6f 72 20 30 78 30 41 2c 20 69 6e 64 69 63 61   or 0x0A, indica
29040 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 0a 2a 2a  ting an index.**
29050 20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73 74 61   b-tree)..*/.sta
29060 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f  tic int moveToRo
29070 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ot(BtCursor *pCu
29080 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  r){.  MemPage *p
29090 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Root;.  int rc =
290a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
290b0 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
290c0 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
290d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
290e0 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55  SOR_INVALID < CU
290f0 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
29100 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
29110 52 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43  RSOR_VALID   < C
29120 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
29130 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  K );.  assert( C
29140 55 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20  URSOR_FAULT   > 
29150 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
29160 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  EK );.  if( pCur
29170 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52  ->eState>=CURSOR
29180 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a  _REQUIRESEEK ){.
29190 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53      if( pCur->eS
291a0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55  tate==CURSOR_FAU
291b0 4c 54 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  LT ){.      asse
291c0 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  rt( pCur->skipNe
291d0 78 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  xt!=SQLITE_OK );
291e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43  .      return pC
291f0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20  ur->skipNext;.  
29200 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
29210 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28  treeClearCursor(
29220 70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  pCur);.  }..  if
29230 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  ( pCur->iPage>=0
29240 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72   ){.    if( pCur
29250 2d 3e 69 50 61 67 65 20 29 7b 0a 20 20 20 20 20  ->iPage ){.     
29260 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 61 73 73   do{.        ass
29270 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
29280 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 21 3d  e[pCur->iPage]!=
29290 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  0 );.        rel
292a0 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28  easePageNotNull(
292b0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
292c0 72 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a 20 20  r->iPage--]);.  
292d0 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72      }while( pCur
292e0 2d 3e 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20  ->iPage);.      
292f0 67 6f 74 6f 20 73 6b 69 70 5f 69 6e 69 74 3b 0a  goto skip_init;.
29300 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
29310 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
29320 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  ==0 ){.    pCur-
29330 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
29340 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72 65  _INVALID;.    re
29350 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
29360 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
29370 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
29380 3d 3d 28 2d 31 29 20 29 3b 0a 20 20 20 20 72 63  ==(-1) );.    rc
29390 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
293a0 65 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  e(pCur->pBtree->
293b0 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  pBt, pCur->pgnoR
293c0 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70 50 61  oot, &pCur->apPa
293d0 67 65 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 20  ge[0],.         
293e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
293f0 2c 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72  , pCur->curPager
29400 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20  Flags);.    if( 
29410 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
29420 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74  .      pCur->eSt
29430 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
29440 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 72 65 74  ALID;.       ret
29450 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
29460 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20    pCur->iPage = 
29470 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 63 75 72  0;.    pCur->cur
29480 49 6e 74 4b 65 79 20 3d 20 70 43 75 72 2d 3e 61  IntKey = pCur->a
29490 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
294a0 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f 74 20 3d 20  ;.  }.  pRoot = 
294b0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b  pCur->apPage[0];
294c0 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74  .  assert( pRoot
294d0 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67  ->pgno==pCur->pg
294e0 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20 20 2f 2a 20  noRoot );..  /* 
294f0 49 66 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  If pCur->pKeyInf
29500 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  o is not NULL, t
29510 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 74  hen the caller t
29520 68 61 74 20 6f 70 65 6e 65 64 20 74 68 69 73 20  hat opened this 
29530 63 75 72 73 6f 72 0a 20 20 2a 2a 20 65 78 70 65  cursor.  ** expe
29540 63 74 65 64 20 74 6f 20 6f 70 65 6e 20 69 74 20  cted to open it 
29550 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72  on an index b-tr
29560 65 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ee. Otherwise, i
29570 66 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a 20 20  f pKeyInfo is.  
29580 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61 6c  ** NULL, the cal
29590 6c 65 72 20 65 78 70 65 63 74 73 20 61 20 74 61  ler expects a ta
295a0 62 6c 65 20 62 2d 74 72 65 65 2e 20 49 66 20 74  ble b-tree. If t
295b0 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63  his is not the c
295c0 61 73 65 2c 0a 20 20 2a 2a 20 72 65 74 75 72 6e  ase,.  ** return
295d0 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55   an SQLITE_CORRU
295e0 50 54 20 65 72 72 6f 72 2e 20 0a 20 20 2a 2a 0a  PT error. .  **.
295f0 20 20 2a 2a 20 45 61 72 6c 69 65 72 20 76 65 72    ** Earlier ver
29600 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
29610 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 69  assumed that thi
29620 73 20 74 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74  s test could not
29630 20 66 61 69 6c 0a 20 20 2a 2a 20 69 66 20 74 68   fail.  ** if th
29640 65 20 72 6f 6f 74 20 70 61 67 65 20 77 61 73 20  e root page was 
29650 61 6c 72 65 61 64 79 20 6c 6f 61 64 65 64 20 77  already loaded w
29660 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
29670 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 28 69 2e  n was called (i.
29680 65 2e 0a 20 20 2a 2a 20 69 66 20 70 43 75 72 2d  e..  ** if pCur-
29690 3e 69 50 61 67 65 3e 3d 30 29 2e 20 42 75 74 20  >iPage>=0). But 
296a0 74 68 69 73 20 69 73 20 6e 6f 74 20 73 6f 20 69  this is not so i
296b0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
296c0 73 20 63 6f 72 72 75 70 74 65 64 20 0a 20 20 2a  s corrupted .  *
296d0 2a 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20  * in such a way 
296e0 74 68 61 74 20 70 61 67 65 20 70 52 6f 6f 74 20  that page pRoot 
296f0 69 73 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 61  is linked into a
29700 20 73 65 63 6f 6e 64 20 62 2d 74 72 65 65 20 74   second b-tree t
29710 61 62 6c 65 20 0a 20 20 2a 2a 20 28 6f 72 20 74  able .  ** (or t
29720 68 65 20 66 72 65 65 6c 69 73 74 29 2e 20 20 2a  he freelist).  *
29730 2f 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f  /.  assert( pRoo
29740 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20  t->intKey==1 || 
29750 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 30  pRoot->intKey==0
29760 20 29 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d   );.  if( pRoot-
29770 3e 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 28 70  >isInit==0 || (p
29780 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30  Cur->pKeyInfo==0
29790 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79  )!=pRoot->intKey
297a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
297b0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
297c0 50 54 3b 0a 20 20 7d 0a 0a 73 6b 69 70 5f 69 6e  PT;.  }..skip_in
297d0 69 74 3a 20 20 0a 20 20 70 43 75 72 2d 3e 61 69  it:  .  pCur->ai
297e0 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 43  Idx[0] = 0;.  pC
297f0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
29800 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46   0;.  pCur->curF
29810 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 41  lags &= ~(BTCF_A
29820 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64  tLast|BTCF_Valid
29830 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f  NKey|BTCF_ValidO
29840 76 66 6c 29 3b 0a 0a 20 20 70 52 6f 6f 74 20 3d  vfl);..  pRoot =
29850 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
29860 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e  ;.  if( pRoot->n
29870 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 70 43  Cell>0 ){.    pC
29880 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
29890 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c  SOR_VALID;.  }el
298a0 73 65 20 69 66 28 20 21 70 52 6f 6f 74 2d 3e 6c  se if( !pRoot->l
298b0 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  eaf ){.    Pgno 
298c0 73 75 62 70 61 67 65 3b 0a 20 20 20 20 69 66 28  subpage;.    if(
298d0 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20   pRoot->pgno!=1 
298e0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
298f0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
29900 20 20 73 75 62 70 61 67 65 20 3d 20 67 65 74 34    subpage = get4
29910 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61  byte(&pRoot->aDa
29920 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66  ta[pRoot->hdrOff
29930 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75  set+8]);.    pCu
29940 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
29950 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72 63  OR_VALID;.    rc
29960 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
29970 43 75 72 2c 20 73 75 62 70 61 67 65 29 3b 0a 20  Cur, subpage);. 
29980 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72   }else{.    pCur
29990 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
299a0 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 7d 0a 20  R_INVALID;.  }. 
299b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
299c0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
299d0 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65  rsor down to the
299e0 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20   left-most leaf 
299f0 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
29a00 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77 68  e.** entry to wh
29a10 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e  ich it is curren
29a20 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a  tly pointing..**
29a30 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73  .** The left-mos
29a40 74 20 6c 65 61 66 20 69 73 20 74 68 65 20 6f 6e  t leaf is the on
29a50 65 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c  e with the small
29a60 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 66 69  est key - the fi
29a70 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64  rst.** in ascend
29a80 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74  ing order..*/.st
29a90 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c  atic int moveToL
29aa0 65 66 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72  eftmost(BtCursor
29ab0 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20   *pCur){.  Pgno 
29ac0 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pgno;.  int rc =
29ad0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65   SQLITE_OK;.  Me
29ae0 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
29af0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
29b00 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
29b10 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
29b20 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
29b30 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77  SOR_VALID );.  w
29b40 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
29b50 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d  _OK && !(pPage =
29b60 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
29b70 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61  ur->iPage])->lea
29b80 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  f ){.    assert(
29b90 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
29ba0 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d  r->iPage]<pPage-
29bb0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67  >nCell );.    pg
29bc0 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66 69  no = get4byte(fi
29bd0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  ndCell(pPage, pC
29be0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
29bf0 69 50 61 67 65 5d 29 29 3b 0a 20 20 20 20 72 63  iPage]));.    rc
29c00 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
29c10 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a  Cur, pgno);.  }.
29c20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
29c30 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
29c40 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68  ursor down to th
29c50 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61  e right-most lea
29c60 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  f entry beneath 
29c70 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77  the.** page to w
29c80 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65  hich it is curre
29c90 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20  ntly pointing.  
29ca0 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66 66 65  Notice the diffe
29cb0 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e  rence.** between
29cc0 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
29cd0 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68  ) and moveToRigh
29ce0 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f  tmost().  moveTo
29cf0 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69  Leftmost().** fi
29d00 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73  nds the left-mos
29d10 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  t entry beneath 
29d20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65 72  the *entry* wher
29d30 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  eas moveToRightm
29d40 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74  ost().** finds t
29d50 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
29d60 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20  try beneath the 
29d70 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68  *page*..**.** Th
29d80 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
29d90 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69  ry is the one wi
29da0 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b  th the largest k
29db0 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a  ey - the last.**
29dc0 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69 6e   key in ascendin
29dd0 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  g order..*/.stat
29de0 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67  ic int moveToRig
29df0 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20  htmost(BtCursor 
29e00 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70  *pCur){.  Pgno p
29e10 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  gno;.  int rc = 
29e20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d  SQLITE_OK;.  Mem
29e30 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b  Page *pPage = 0;
29e40 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
29e50 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
29e60 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
29e70 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
29e80 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
29e90 20 20 77 68 69 6c 65 28 20 21 28 70 50 61 67 65    while( !(pPage
29ea0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
29eb0 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c  pCur->iPage])->l
29ec0 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20  eaf ){.    pgno 
29ed0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
29ee0 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
29ef0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
29f00 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
29f10 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50  Cur->iPage] = pP
29f20 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20  age->nCell;.    
29f30 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
29f40 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  (pCur, pgno);.  
29f50 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
29f60 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72  n rc;.  }.  pCur
29f70 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
29f80 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43  age] = pPage->nC
29f90 65 6c 6c 2d 31 3b 0a 20 20 61 73 73 65 72 74 28  ell-1;.  assert(
29fa0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
29fb0 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e==0 );.  assert
29fc0 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
29fd0 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b  s & BTCF_ValidNK
29fe0 65 79 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  ey)==0 );.  retu
29ff0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2a000 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  ./* Move the cur
2a010 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73 74  sor to the first
2a020 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
2a030 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ble.  Return SQL
2a040 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63  ITE_OK.** on suc
2a050 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73  cess.  Set *pRes
2a060 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72   to 0 if the cur
2a070 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69  sor actually poi
2a080 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67  nts to something
2a090 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73  .** or set *pRes
2a0a0 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62   to 1 if the tab
2a0b0 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
2a0c0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2a0d0 46 69 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a  First(BtCursor *
2a0e0 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
2a0f0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
2a100 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
2a110 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
2a120 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
2a130 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2a140 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
2a150 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
2a160 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
2a170 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ur);.  if( rc==S
2a180 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2a190 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
2a1a0 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
2a1b0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2a1c0 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
2a1d0 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  ==0 || pCur->apP
2a1e0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2a1f0 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
2a200 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
2a210 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a220 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
2a230 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2a240 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20  ]->nCell>0 );.  
2a250 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
2a260 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f       rc = moveTo
2a270 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
2a280 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2a290 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76  rn rc;.}../* Mov
2a2a0 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
2a2b0 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
2a2c0 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  n the table.  Re
2a2d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
2a2e0 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53  * on success.  S
2a2f0 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66  et *pRes to 0 if
2a300 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75   the cursor actu
2a310 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73  ally points to s
2a320 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73  omething.** or s
2a330 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66  et *pRes to 1 if
2a340 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
2a350 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
2a360 74 65 33 42 74 72 65 65 4c 61 73 74 28 42 74 43  te3BtreeLast(BtC
2a370 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
2a380 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
2a390 63 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20 63  c;. .  assert( c
2a3a0 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
2a3b0 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
2a3c0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2a3d0 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
2a3e0 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
2a3f0 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
2a400 20 63 75 72 73 6f 72 20 61 6c 72 65 61 64 79 20   cursor already 
2a410 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c 61  points to the la
2a420 73 74 20 65 6e 74 72 79 2c 20 74 68 69 73 20 69  st entry, this i
2a430 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20  s a no-op. */.  
2a440 69 66 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  if( CURSOR_VALID
2a450 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 26  ==pCur->eState &
2a460 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  & (pCur->curFlag
2a470 73 20 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29  s & BTCF_AtLast)
2a480 21 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51  !=0 ){.#ifdef SQ
2a490 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f  LITE_DEBUG.    /
2a4a0 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72  * This block ser
2a4b0 76 65 73 20 74 6f 20 61 73 73 65 72 74 28 29 20  ves to assert() 
2a4c0 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
2a4d0 72 65 61 6c 6c 79 20 64 6f 65 73 20 70 6f 69 6e  really does poin
2a4e0 74 20 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  t .    ** to the
2a4f0 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
2a500 68 65 20 62 2d 74 72 65 65 2e 20 2a 2f 0a 20 20  he b-tree. */.  
2a510 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f    int ii;.    fo
2a520 72 28 69 69 3d 30 3b 20 69 69 3c 70 43 75 72 2d  r(ii=0; ii<pCur-
2a530 3e 69 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20  >iPage; ii++){. 
2a540 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
2a550 72 2d 3e 61 69 49 64 78 5b 69 69 5d 3d 3d 70 43  r->aiIdx[ii]==pC
2a560 75 72 2d 3e 61 70 50 61 67 65 5b 69 69 5d 2d 3e  ur->apPage[ii]->
2a570 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a 20  nCell );.    }. 
2a580 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2a590 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2a5a0 67 65 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67  ge]==pCur->apPag
2a5b0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
2a5c0 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20 20 20 20 61  nCell-1 );.    a
2a5d0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
2a5e0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2a5f0 2d 3e 6c 65 61 66 20 29 3b 0a 23 65 6e 64 69 66  ->leaf );.#endif
2a600 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2a610 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63  TE_OK;.  }..  rc
2a620 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
2a630 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ur);.  if( rc==S
2a640 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2a650 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  if( CURSOR_INVAL
2a660 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
2a670 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2a680 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
2a690 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  ==0 || pCur->apP
2a6a0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2a6b0 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
2a6c0 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
2a6d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a6e0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
2a6f0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
2a700 49 44 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  ID );.      *pRe
2a710 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  s = 0;.      rc 
2a720 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  = moveToRightmos
2a730 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 69  t(pCur);.      i
2a740 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2a750 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
2a760 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54  ->curFlags |= BT
2a770 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20 20  CF_AtLast;.     
2a780 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2a790 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2a7a0 3d 20 7e 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a  = ~BTCF_AtLast;.
2a7b0 20 20 20 20 20 20 7d 0a 20 20 20 0a 20 20 20 20        }.   .    
2a7c0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
2a7d0 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68  c;.}../* Move th
2a7e0 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61 74  e cursor so that
2a7f0 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e   it points to an
2a800 20 65 6e 74 72 79 20 6e 65 61 72 20 74 68 65 20   entry near the 
2a810 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69 66 69 65  key .** specifie
2a820 64 20 62 79 20 70 49 64 78 4b 65 79 20 6f 72 20  d by pIdxKey or 
2a830 69 6e 74 4b 65 79 2e 20 20 20 52 65 74 75 72 6e  intKey.   Return
2a840 20 61 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e   a success code.
2a850 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45  .**.** For INTKE
2a860 59 20 74 61 62 6c 65 73 2c 20 74 68 65 20 69 6e  Y tables, the in
2a870 74 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20 69  tKey parameter i
2a880 73 20 75 73 65 64 2e 20 20 70 49 64 78 4b 65 79  s used.  pIdxKey
2a890 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c   .** must be NUL
2a8a0 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 74 61  L.  For index ta
2a8b0 62 6c 65 73 2c 20 70 49 64 78 4b 65 79 20 69 73  bles, pIdxKey is
2a8c0 20 75 73 65 64 20 61 6e 64 20 69 6e 74 4b 65 79   used and intKey
2a8d0 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a  .** is ignored..
2a8e0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61 63  **.** If an exac
2a8f0 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20 66  t match is not f
2a900 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63  ound, then the c
2a910 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73 0a  ursor is always.
2a920 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  ** left pointing
2a930 20 61 74 20 61 20 6c 65 61 66 20 70 61 67 65 20   at a leaf page 
2a940 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64  which would hold
2a950 20 74 68 65 20 65 6e 74 72 79 20 69 66 20 69 74   the entry if it
2a960 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74  .** were present
2a970 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 69  .  The cursor mi
2a980 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20  ght point to an 
2a990 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65 73  entry that comes
2a9a0 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61 66  .** before or af
2a9b0 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a  ter the key..**.
2a9c0 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72 20 69 73  ** An integer is
2a9d0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70   written into *p
2a9e0 52 65 73 20 77 68 69 63 68 20 69 73 20 74 68 65  Res which is the
2a9f0 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f   result of.** co
2aa00 6d 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79 20  mparing the key 
2aa10 77 69 74 68 20 74 68 65 20 65 6e 74 72 79 20 74  with the entry t
2aa20 6f 20 77 68 69 63 68 20 74 68 65 20 63 75 72 73  o which the curs
2aa30 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69  or is .** pointi
2aa40 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67  ng.  The meaning
2aa50 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20   of the integer 
2aa60 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20  written into.** 
2aa70 2a 70 52 65 73 20 69 73 20 61 73 20 66 6f 6c 6c  *pRes is as foll
2aa80 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  ows:.**.**     *
2aa90 70 52 65 73 3c 30 20 20 20 20 20 20 54 68 65 20  pRes<0      The 
2aaa0 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70  cursor is left p
2aab0 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
2aac0 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  try that.**     
2aad0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20               is 
2aae0 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74  smaller than int
2aaf0 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f 72 20 69  Key/pIdxKey or i
2ab00 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
2ab10 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20 20  mpty.**         
2ab20 20 20 20 20 20 20 20 20 20 61 6e 64 20 74 68 65           and the
2ab30 20 63 75 72 73 6f 72 20 69 73 20 74 68 65 72 65   cursor is there
2ab40 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 20  fore left point 
2ab50 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a  to nothing..**.*
2ab60 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20 20  *     *pRes==0  
2ab70 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
2ab80 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
2ab90 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a  t an entry that.
2aba0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
2abb0 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74 63      exactly matc
2abc0 68 65 73 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b  hes intKey/pIdxK
2abd0 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70  ey..**.**     *p
2abe0 52 65 73 3e 30 20 20 20 20 20 20 54 68 65 20 63  Res>0      The c
2abf0 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
2ac00 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
2ac10 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ry that.**      
2ac20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 6c              is l
2ac30 61 72 67 65 72 20 74 68 61 6e 20 69 6e 74 4b 65  arger than intKe
2ac40 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a  y/pIdxKey..**.**
2ac50 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65   For index table
2ac60 73 2c 20 74 68 65 20 70 49 64 78 4b 65 79 2d 3e  s, the pIdxKey->
2ac70 65 71 53 65 65 6e 20 66 69 65 6c 64 20 69 73 20  eqSeen field is 
2ac80 73 65 74 20 74 6f 20 31 20 69 66 20 74 68 65 72  set to 1 if ther
2ac90 65 0a 2a 2a 20 65 78 69 73 74 73 20 61 6e 20 65  e.** exists an e
2aca0 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
2acb0 65 20 74 68 61 74 20 65 78 61 63 74 6c 79 20 6d  e that exactly m
2acc0 61 74 63 68 65 73 20 70 49 64 78 4b 65 79 2e 20  atches pIdxKey. 
2acd0 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33   .*/.int sqlite3
2ace0 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63  BtreeMovetoUnpac
2acf0 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20  ked(.  BtCursor 
2ad00 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20  *pCur,          
2ad10 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f  /* The cursor to
2ad20 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 55   be moved */.  U
2ad30 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
2ad40 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61 63  IdxKey, /* Unpac
2ad50 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f  ked index key */
2ad60 0a 20 20 69 36 34 20 69 6e 74 4b 65 79 2c 20 20  .  i64 intKey,  
2ad70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2ad80 68 65 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f 0a  he table key */.
2ad90 20 20 69 6e 74 20 62 69 61 73 52 69 67 68 74 2c    int biasRight,
2ada0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
2adb0 20 74 72 75 65 2c 20 62 69 61 73 20 74 68 65 20   true, bias the 
2adc0 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69  search to the hi
2add0 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  gh end */.  int 
2ade0 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20  *pRes           
2adf0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65       /* Write se
2ae00 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65 72  arch results her
2ae10 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
2ae20 3b 0a 20 20 52 65 63 6f 72 64 43 6f 6d 70 61 72  ;.  RecordCompar
2ae30 65 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  e xRecordCompare
2ae40 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
2ae50 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
2ae60 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2ae70 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2ae80 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
2ae90 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
2aea0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73  ;.  assert( pRes
2aeb0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
2aec0 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75  IdxKey==0)==(pCu
2aed0 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 20  r->pKeyInfo==0) 
2aee0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2aef0 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2af00 52 5f 56 41 4c 49 44 20 7c 7c 20 28 70 49 64 78  R_VALID || (pIdx
2af10 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e  Key==0)==(pCur->
2af20 63 75 72 49 6e 74 4b 65 79 21 3d 30 29 20 29 3b  curIntKey!=0) );
2af30 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75  ..  /* If the cu
2af40 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  rsor is already 
2af50 70 6f 73 69 74 69 6f 6e 65 64 20 61 74 20 74 68  positioned at th
2af60 65 20 70 6f 69 6e 74 20 77 65 20 61 72 65 20 74  e point we are t
2af70 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f  rying.  ** to mo
2af80 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74  ve to, then just
2af90 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   return without 
2afa0 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a  doing any work *
2afb0 2f 0a 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d  /.  if( pIdxKey=
2afc0 3d 30 0a 20 20 20 26 26 20 70 43 75 72 2d 3e 65  =0.   && pCur->e
2afd0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
2afe0 4c 49 44 20 26 26 20 28 70 43 75 72 2d 3e 63 75  LID && (pCur->cu
2aff0 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
2b000 6c 69 64 4e 4b 65 79 29 21 3d 30 0a 20 20 29 7b  lidNKey)!=0.  ){
2b010 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69  .    if( pCur->i
2b020 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79  nfo.nKey==intKey
2b030 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   ){.      *pRes 
2b040 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 0;.      retur
2b050 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
2b060 20 7d 0a 20 20 20 20 69 66 28 20 28 70 43 75 72   }.    if( (pCur
2b070 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
2b080 46 5f 41 74 4c 61 73 74 29 21 3d 30 20 26 26 20  F_AtLast)!=0 && 
2b090 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c  pCur->info.nKey<
2b0a0 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
2b0b0 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20  *pRes = -1;.    
2b0c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2b0d0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  OK;.    }.  }.. 
2b0e0 20 69 66 28 20 70 49 64 78 4b 65 79 20 29 7b 0a   if( pIdxKey ){.
2b0f0 20 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61      xRecordCompa
2b100 72 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  re = sqlite3Vdbe
2b110 46 69 6e 64 43 6f 6d 70 61 72 65 28 70 49 64 78  FindCompare(pIdx
2b120 4b 65 79 29 3b 0a 20 20 20 20 70 49 64 78 4b 65  Key);.    pIdxKe
2b130 79 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a  y->errCode = 0;.
2b140 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
2b150 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d  Key->default_rc=
2b160 3d 31 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  =1 .         || 
2b170 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74  pIdxKey->default
2b180 5f 72 63 3d 3d 30 20 0a 20 20 20 20 20 20 20 20  _rc==0 .        
2b190 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65 66   || pIdxKey->def
2b1a0 61 75 6c 74 5f 72 63 3d 3d 2d 31 0a 20 20 20 20  ault_rc==-1.    
2b1b0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2b1c0 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d  xRecordCompare =
2b1d0 20 30 3b 20 2f 2a 20 41 6c 6c 20 6b 65 79 73 20   0; /* All keys 
2b1e0 61 72 65 20 69 6e 74 65 67 65 72 73 20 2a 2f 0a  are integers */.
2b1f0 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65    }..  rc = move
2b200 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
2b210 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
2b220 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
2b230 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e  ssert( pCur->pgn
2b240 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72  oRoot==0 || pCur
2b250 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2b260 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72  Page] );.  asser
2b270 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t( pCur->pgnoRoo
2b280 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70  t==0 || pCur->ap
2b290 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2b2a0 5d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61  ]->isInit );.  a
2b2b0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
2b2c0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
2b2d0 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  LID || pCur->apP
2b2e0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2b2f0 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 69  ->nCell>0 );.  i
2b300 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
2b310 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
2b320 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 2d  ){.    *pRes = -
2b330 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  1;.    assert( p
2b340 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30  Cur->pgnoRoot==0
2b350 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65   || pCur->apPage
2b360 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
2b370 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72  Cell==0 );.    r
2b380 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2b390 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
2b3a0 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
2b3b0 69 6e 74 4b 65 79 3d 3d 70 43 75 72 2d 3e 63 75  intKey==pCur->cu
2b3c0 72 49 6e 74 4b 65 79 20 29 3b 0a 20 20 61 73 73  rIntKey );.  ass
2b3d0 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72 49 6e  ert( pCur->curIn
2b3e0 74 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65 79 20  tKey || pIdxKey 
2b3f0 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20  );.  for(;;){.  
2b400 20 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 2c 20    int lwr, upr, 
2b410 69 64 78 2c 20 63 3b 0a 20 20 20 20 50 67 6e 6f  idx, c;.    Pgno
2b420 20 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d   chldPg;.    Mem
2b430 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43  Page *pPage = pC
2b440 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2b450 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 75 38 20  >iPage];.    u8 
2b460 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20  *pCell;         
2b470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b480 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63   /* Pointer to c
2b490 75 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70  urrent cell in p
2b4a0 50 61 67 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  Page */..    /* 
2b4b0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73  pPage->nCell mus
2b4c0 74 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61  t be greater tha
2b4d0 6e 20 7a 65 72 6f 2e 20 49 66 20 74 68 69 73 20  n zero. If this 
2b4e0 69 73 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  is the root-page
2b4f0 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 73  .    ** the curs
2b500 6f 72 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65  or would have be
2b510 65 6e 20 49 4e 56 41 4c 49 44 20 61 62 6f 76 65  en INVALID above
2b520 20 61 6e 64 20 74 68 69 73 20 66 6f 72 28 3b 3b   and this for(;;
2b530 29 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f  ) loop.    ** no
2b540 74 20 72 75 6e 2e 20 49 66 20 74 68 69 73 20 69  t run. If this i
2b550 73 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d 70  s not the root-p
2b560 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 6d 6f  age, then the mo
2b570 76 65 54 6f 43 68 69 6c 64 28 29 20 72 6f 75 74  veToChild() rout
2b580 69 6e 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64  ine.    ** would
2b590 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 65   have already de
2b5a0 74 65 63 74 65 64 20 64 62 20 63 6f 72 72 75 70  tected db corrup
2b5b0 74 69 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c  tion. Similarly,
2b5c0 20 70 50 61 67 65 20 6d 75 73 74 0a 20 20 20 20   pPage must.    
2b5d0 2a 2a 20 62 65 20 74 68 65 20 72 69 67 68 74 20  ** be the right 
2b5e0 6b 69 6e 64 20 28 69 6e 64 65 78 20 6f 72 20 74  kind (index or t
2b5f0 61 62 6c 65 29 20 6f 66 20 62 2d 74 72 65 65 20  able) of b-tree 
2b600 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 0a  page. Otherwise.
2b610 20 20 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f 43      ** a moveToC
2b620 68 69 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54 6f  hild() or moveTo
2b630 52 6f 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75 6c  Root() call woul
2b640 64 20 68 61 76 65 20 64 65 74 65 63 74 65 64 20  d have detected 
2b650 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a  corruption.  */.
2b660 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2b670 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20  e->nCell>0 );.  
2b680 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2b690 3e 69 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b 65  >intKey==(pIdxKe
2b6a0 79 3d 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77 72  y==0) );.    lwr
2b6b0 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20   = 0;.    upr = 
2b6c0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a  pPage->nCell-1;.
2b6d0 20 20 20 20 61 73 73 65 72 74 28 20 62 69 61 73      assert( bias
2b6e0 52 69 67 68 74 3d 3d 30 20 7c 7c 20 62 69 61 73  Right==0 || bias
2b6f0 52 69 67 68 74 3d 3d 31 20 29 3b 0a 20 20 20 20  Right==1 );.    
2b700 69 64 78 20 3d 20 75 70 72 3e 3e 28 31 2d 62 69  idx = upr>>(1-bi
2b710 61 73 52 69 67 68 74 29 3b 20 2f 2a 20 69 64 78  asRight); /* idx
2b720 20 3d 20 62 69 61 73 52 69 67 68 74 20 3f 20 75   = biasRight ? u
2b730 70 72 20 3a 20 28 6c 77 72 2b 75 70 72 29 2f 32  pr : (lwr+upr)/2
2b740 3b 20 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e 61  ; */.    pCur->a
2b750 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2b760 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20  ] = (u16)idx;.  
2b770 20 20 69 66 28 20 78 52 65 63 6f 72 64 43 6f 6d    if( xRecordCom
2b780 70 61 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pare==0 ){.     
2b790 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20   for(;;){.      
2b7a0 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a    i64 nCellKey;.
2b7b0 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20          pCell = 
2b7c0 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28  findCellPastPtr(
2b7d0 70 50 61 67 65 2c 20 69 64 78 29 3b 0a 20 20 20  pPage, idx);.   
2b7e0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
2b7f0 69 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20  intKeyLeaf ){.  
2b800 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 30          while( 0
2b810 78 38 30 20 3c 3d 20 2a 28 70 43 65 6c 6c 2b 2b  x80 <= *(pCell++
2b820 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
2b830 20 69 66 28 20 70 43 65 6c 6c 3e 3d 70 50 61 67   if( pCell>=pPag
2b840 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 20 72 65  e->aDataEnd ) re
2b850 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
2b860 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
2b870 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2b880 20 20 20 20 20 20 20 20 67 65 74 56 61 72 69 6e          getVarin
2b890 74 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26  t(pCell, (u64*)&
2b8a0 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20  nCellKey);.     
2b8b0 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c     if( nCellKey<
2b8c0 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
2b8d0 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b      lwr = idx+1;
2b8e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c  .          if( l
2b8f0 77 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2d 31  wr>upr ){ c = -1
2b900 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20  ; break; }.     
2b910 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 65     }else if( nCe
2b920 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29 7b 0a  llKey>intKey ){.
2b930 20 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20            upr = 
2b940 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 20  idx-1;.         
2b950 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20   if( lwr>upr ){ 
2b960 63 20 3d 20 2b 31 3b 20 62 72 65 61 6b 3b 20 7d  c = +1; break; }
2b970 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2b980 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2b990 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b  ( nCellKey==intK
2b9a0 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ey );.          
2b9b0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2b9c0 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
2b9d0 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69  idx;.          i
2b9e0 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
2b9f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c  ){.            l
2ba00 77 72 20 3d 20 69 64 78 3b 0a 20 20 20 20 20 20  wr = idx;.      
2ba10 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
2ba20 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3b 0a 20 20  o_next_layer;.  
2ba30 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2ba40 20 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d             pCur-
2ba50 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
2ba60 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20  F_ValidNKey;.   
2ba70 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69           pCur->i
2ba80 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c  nfo.nKey = nCell
2ba90 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Key;.           
2baa0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
2bab0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
2bac0 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
2bad0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2bae0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2baf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2bb00 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
2bb10 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a  ( lwr+upr>=0 );.
2bb20 20 20 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c          idx = (l
2bb30 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20  wr+upr)>>1;  /* 
2bb40 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f  idx = (lwr+upr)/
2bb50 32 3b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  2; */.      }.  
2bb60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66    }else{.      f
2bb70 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20  or(;;){.        
2bb80 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 2f 2a 20 53  int nCell;  /* S
2bb90 69 7a 65 20 6f 66 20 74 68 65 20 70 43 65 6c 6c  ize of the pCell
2bba0 20 63 65 6c 6c 20 69 6e 20 62 79 74 65 73 20 2a   cell in bytes *
2bbb0 2f 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20  /.        pCell 
2bbc0 3d 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74  = findCellPastPt
2bbd0 72 28 70 50 61 67 65 2c 20 69 64 78 29 3b 0a 0a  r(pPage, idx);..
2bbe0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d          /* The m
2bbf0 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64  aximum supported
2bc00 20 70 61 67 65 2d 73 69 7a 65 20 69 73 20 36 35   page-size is 65
2bc10 35 33 36 20 62 79 74 65 73 2e 20 54 68 69 73 20  536 bytes. This 
2bc20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 20 20 20  means that.     
2bc30 20 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75     ** the maximu
2bc40 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  m number of reco
2bc50 72 64 20 62 79 74 65 73 20 73 74 6f 72 65 64 20  rd bytes stored 
2bc60 6f 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d 54 72  on an index B-Tr
2bc70 65 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  ee.        ** pa
2bc80 67 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ge is less than 
2bc90 31 36 33 38 34 20 62 79 74 65 73 20 61 6e 64 20  16384 bytes and 
2bca0 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20 61 73  may be stored as
2bcb0 20 61 20 32 2d 62 79 74 65 0a 20 20 20 20 20 20   a 2-byte.      
2bcc0 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68 69    ** varint. Thi
2bcd0 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
2bce0 20 75 73 65 64 20 74 6f 20 61 74 74 65 6d 70 74   used to attempt
2bcf0 20 74 6f 20 61 76 6f 69 64 20 70 61 72 73 69 6e   to avoid parsin
2bd00 67 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  g .        ** th
2bd10 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 62 79  e entire cell by
2bd20 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 74 68   checking for th
2bd30 65 20 63 61 73 65 73 20 77 68 65 72 65 20 74 68  e cases where th
2bd40 65 20 72 65 63 6f 72 64 20 69 73 20 0a 20 20 20  e record is .   
2bd50 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 65       ** stored e
2bd60 6e 74 69 72 65 6c 79 20 77 69 74 68 69 6e 20 74  ntirely within t
2bd70 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 62  he b-tree page b
2bd80 79 20 69 6e 73 70 65 63 74 69 6e 67 20 74 68 65  y inspecting the
2bd90 20 66 69 72 73 74 20 0a 20 20 20 20 20 20 20 20   first .        
2bda0 2a 2a 20 32 20 62 79 74 65 73 20 6f 66 20 74 68  ** 2 bytes of th
2bdb0 65 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20  e cell..        
2bdc0 2a 2f 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c  */.        nCell
2bdd0 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20   = pCell[0];.   
2bde0 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c 3d       if( nCell<=
2bdf0 70 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50  pPage->max1byteP
2be00 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 20 20  ayload ){.      
2be10 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
2be20 63 68 20 72 75 6e 73 20 69 66 20 74 68 65 20 72  ch runs if the r
2be30 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64  ecord-size field
2be40 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 73 20   of the cell is 
2be50 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  a.          ** s
2be60 69 6e 67 6c 65 20 62 79 74 65 20 76 61 72 69 6e  ingle byte varin
2be70 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64  t and the record
2be80 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f   fits entirely o
2be90 6e 20 74 68 65 20 6d 61 69 6e 0a 20 20 20 20 20  n the main.     
2bea0 20 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 70       ** b-tree p
2beb0 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  age.  */.       
2bec0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43 65     testcase( pCe
2bed0 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d 70 50 61 67  ll+nCell+1==pPag
2bee0 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20  e->aDataEnd );. 
2bef0 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65           c = xRe
2bf00 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c  cordCompare(nCel
2bf10 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c  l, (void*)&pCell
2bf20 5b 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20  [1], pIdxKey);. 
2bf30 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
2bf40 20 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78   !(pCell[1] & 0x
2bf50 38 30 29 20 0a 20 20 20 20 20 20 20 20 20 20 26  80) .          &
2bf60 26 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65  & (nCell = ((nCe
2bf70 6c 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b 20 70  ll&0x7f)<<7) + p
2bf80 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d  Cell[1])<=pPage-
2bf90 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20  >maxLocal.      
2bfa0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f    ){.          /
2bfb0 2a 20 54 68 65 20 72 65 63 6f 72 64 2d 73 69 7a  * The record-siz
2bfc0 65 20 66 69 65 6c 64 20 69 73 20 61 20 32 20 62  e field is a 2 b
2bfd0 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74  yte varint and t
2bfe0 68 65 20 72 65 63 6f 72 64 20 0a 20 20 20 20 20  he record .     
2bff0 20 20 20 20 20 2a 2a 20 66 69 74 73 20 65 6e 74       ** fits ent
2c000 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69  irely on the mai
2c010 6e 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20  n b-tree page.  
2c020 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  */.          tes
2c030 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65  tcase( pCell+nCe
2c040 6c 6c 2b 32 3d 3d 70 50 61 67 65 2d 3e 61 44 61  ll+2==pPage->aDa
2c050 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20  taEnd );.       
2c060 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f     c = xRecordCo
2c070 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f  mpare(nCell, (vo
2c080 69 64 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70  id*)&pCell[2], p
2c090 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  IdxKey);.       
2c0a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2c0b0 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20    /* The record 
2c0c0 66 6c 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20  flows over onto 
2c0d0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72  one or more over
2c0e0 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a 20  flow pages. In. 
2c0f0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73           ** this
2c100 20 63 61 73 65 20 74 68 65 20 77 68 6f 6c 65 20   case the whole 
2c110 63 65 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62 65  cell needs to be
2c120 20 70 61 72 73 65 64 2c 20 61 20 62 75 66 66 65   parsed, a buffe
2c130 72 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20  r allocated.    
2c140 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 61 63 63        ** and acc
2c150 65 73 73 50 61 79 6c 6f 61 64 28 29 20 75 73 65  essPayload() use
2c160 64 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68  d to retrieve th
2c170 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  e record into th
2c180 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  e.          ** b
2c190 75 66 66 65 72 20 62 65 66 6f 72 65 20 56 64 62  uffer before Vdb
2c1a0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29  eRecordCompare()
2c1b0 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20   can be called. 
2c1c0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  .          **.  
2c1d0 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68          ** If th
2c1e0 65 20 72 65 63 6f 72 64 20 69 73 20 63 6f 72 72  e record is corr
2c1f0 75 70 74 2c 20 74 68 65 20 78 52 65 63 6f 72 64  upt, the xRecord
2c200 43 6f 6d 70 61 72 65 20 72 6f 75 74 69 6e 65 20  Compare routine 
2c210 6d 61 79 20 72 65 61 64 0a 20 20 20 20 20 20 20  may read.       
2c220 20 20 20 2a 2a 20 75 70 20 74 6f 20 74 77 6f 20     ** up to two 
2c230 76 61 72 69 6e 74 73 20 70 61 73 74 20 74 68 65  varints past the
2c240 20 65 6e 64 20 6f 66 20 74 68 65 20 62 75 66 66   end of the buff
2c250 65 72 2e 20 41 6e 20 65 78 74 72 61 20 31 38 20  er. An extra 18 
2c260 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 79  .          ** by
2c270 74 65 73 20 6f 66 20 70 61 64 64 69 6e 67 20 69  tes of padding i
2c280 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 74 20 74  s allocated at t
2c290 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62 75  he end of the bu
2c2a0 66 66 65 72 20 69 6e 0a 20 20 20 20 20 20 20 20  ffer in.        
2c2b0 20 20 2a 2a 20 63 61 73 65 20 74 68 69 73 20 68    ** case this h
2c2c0 61 70 70 65 6e 73 2e 20 20 2a 2f 0a 20 20 20 20  appens.  */.    
2c2d0 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c        void *pCel
2c2e0 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20  lKey;.          
2c2f0 75 38 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c  u8 * const pCell
2c300 42 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70  Body = pCell - p
2c310 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
2c320 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  ze;.          pP
2c330 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
2c340 70 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79  pPage, pCellBody
2c350 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a  , &pCur->info);.
2c360 20 20 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20            nCell 
2c370 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66  = (int)pCur->inf
2c380 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  o.nKey;.        
2c390 20 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c    testcase( nCel
2c3a0 6c 3c 30 20 29 3b 20 20 20 2f 2a 20 54 72 75 65  l<0 );   /* True
2c3b0 20 69 66 20 6b 65 79 20 73 69 7a 65 20 69 73 20   if key size is 
2c3c0 32 5e 33 32 20 6f 72 20 6d 6f 72 65 20 2a 2f 0a  2^32 or more */.
2c3d0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2c3e0 73 65 28 20 6e 43 65 6c 6c 3d 3d 30 20 29 3b 20  se( nCell==0 ); 
2c3f0 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79 20   /* Invalid key 
2c400 73 69 7a 65 3a 20 20 30 78 38 30 20 30 78 38 30  size:  0x80 0x80
2c410 20 30 78 30 30 20 2a 2f 0a 20 20 20 20 20 20 20   0x00 */.       
2c420 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43 65     testcase( nCe
2c430 6c 6c 3d 3d 31 20 29 3b 20 20 2f 2a 20 49 6e 76  ll==1 );  /* Inv
2c440 61 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a 20 20  alid key size:  
2c450 30 78 38 30 20 30 78 38 30 20 30 78 30 31 20 2a  0x80 0x80 0x01 *
2c460 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  /.          test
2c470 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 32 20 29  case( nCell==2 )
2c480 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6c 65  ;  /* Minimum le
2c490 67 61 6c 20 69 6e 64 65 78 20 6b 65 79 20 73 69  gal index key si
2c4a0 7a 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ze */.          
2c4b0 69 66 28 20 6e 43 65 6c 6c 3c 32 20 29 7b 0a 20  if( nCell<2 ){. 
2c4c0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2c4d0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2c4e0 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  KPT;.           
2c4f0 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
2c500 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ish;.          }
2c510 0a 20 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c  .          pCell
2c520 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  Key = sqlite3Mal
2c530 6c 6f 63 28 20 6e 43 65 6c 6c 2b 31 38 20 29 3b  loc( nCell+18 );
2c540 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2c550 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20 20  CellKey==0 ){.  
2c560 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
2c570 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
2c580 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
2c590 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
2c5a0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2c5b0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69          pCur->ai
2c5c0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2c5d0 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20   = (u16)idx;.   
2c5e0 20 20 20 20 20 20 20 72 63 20 3d 20 61 63 63 65         rc = acce
2c5f0 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  ssPayload(pCur, 
2c600 30 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73 69 67  0, nCell, (unsig
2c610 6e 65 64 20 63 68 61 72 2a 29 70 43 65 6c 6c 4b  ned char*)pCellK
2c620 65 79 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20  ey, 2);.        
2c630 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2c640 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2c650 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a  free(pCellKey);.
2c660 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
2c670 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
2c680 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2c690 20 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72        c = xRecor
2c6a0 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20  dCompare(nCell, 
2c6b0 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65  pCellKey, pIdxKe
2c6c0 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  y);.          sq
2c6d0 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c  lite3_free(pCell
2c6e0 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Key);.        }.
2c6f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2c700 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 70 49  .            (pI
2c710 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d  dxKey->errCode!=
2c720 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 7c  SQLITE_CORRUPT |
2c730 7c 20 63 3d 3d 30 29 0a 20 20 20 20 20 20 20 20  | c==0).        
2c740 20 26 26 20 28 70 49 64 78 4b 65 79 2d 3e 65 72   && (pIdxKey->er
2c750 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4e 4f  rCode!=SQLITE_NO
2c760 4d 45 4d 20 7c 7c 20 70 43 75 72 2d 3e 70 42 74  MEM || pCur->pBt
2c770 72 65 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ree->db->mallocF
2c780 61 69 6c 65 64 29 0a 20 20 20 20 20 20 20 20 29  ailed).        )
2c790 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3c  ;.        if( c<
2c7a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c  0 ){.          l
2c7b0 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20  wr = idx+1;.    
2c7c0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3e      }else if( c>
2c7d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  0 ){.          u
2c7e0 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20  pr = idx-1;.    
2c7f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2c800 20 20 20 20 20 61 73 73 65 72 74 28 20 63 3d 3d       assert( c==
2c810 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a  0 );.          *
2c820 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
2c830 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2c840 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43  OK;.          pC
2c850 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2c860 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64  iPage] = (u16)id
2c870 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  x;.          if(
2c880 20 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64   pIdxKey->errCod
2c890 65 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  e ) rc = SQLITE_
2c8a0 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20  CORRUPT;.       
2c8b0 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
2c8c0 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d  inish;.        }
2c8d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 77 72  .        if( lwr
2c8e0 3e 75 70 72 20 29 20 62 72 65 61 6b 3b 0a 20 20  >upr ) break;.  
2c8f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 77        assert( lw
2c900 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20  r+upr>=0 );.    
2c910 20 20 20 20 69 64 78 20 3d 20 28 6c 77 72 2b 75      idx = (lwr+u
2c920 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20  pr)>>1;  /* idx 
2c930 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 20 2a 2f  = (lwr+upr)/2 */
2c940 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2c950 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 3d 3d     assert( lwr==
2c960 75 70 72 2b 31 20 7c 7c 20 28 70 50 61 67 65 2d  upr+1 || (pPage-
2c970 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67  >intKey && !pPag
2c980 65 2d 3e 6c 65 61 66 29 20 29 3b 0a 20 20 20 20  e->leaf) );.    
2c990 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
2c9a0 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 69 66 28  sInit );.    if(
2c9b0 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a   pPage->leaf ){.
2c9c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
2c9d0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2c9e0 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50  iPage]<pCur->apP
2c9f0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2ca00 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20  ->nCell );.     
2ca10 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2ca20 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36  r->iPage] = (u16
2ca30 29 69 64 78 3b 0a 20 20 20 20 20 20 2a 70 52 65  )idx;.      *pRe
2ca40 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 63 20  s = c;.      rc 
2ca50 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
2ca60 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
2ca70 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 6d 6f 76  inish;.    }.mov
2ca80 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3a 0a  eto_next_layer:.
2ca90 20 20 20 20 69 66 28 20 6c 77 72 3e 3d 70 50 61      if( lwr>=pPa
2caa0 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ge->nCell ){.   
2cab0 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34     chldPg = get4
2cac0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
2cad0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
2cae0 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c  set+8]);.    }el
2caf0 73 65 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67  se{.      chldPg
2cb00 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64   = get4byte(find
2cb10 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72 29  Cell(pPage, lwr)
2cb20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75  );.    }.    pCu
2cb30 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2cb40 50 61 67 65 5d 20 3d 20 28 75 31 36 29 6c 77 72  Page] = (u16)lwr
2cb50 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
2cb60 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 63 68 6c  oChild(pCur, chl
2cb70 64 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  dPg);.    if( rc
2cb80 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 6d 6f   ) break;.  }.mo
2cb90 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 70  veto_finish:.  p
2cba0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
2cbb0 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 28  = 0;.  assert( (
2cbc0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2cbd0 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29   BTCF_ValidOvfl)
2cbe0 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
2cbf0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  rc;.}.../*.** Re
2cc00 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
2cc10 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70   cursor is not p
2cc20 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
2cc30 74 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65  try of the table
2cc40 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c  ..**.** TRUE wil
2cc50 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 61 66  l be returned af
2cc60 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ter a call to sq
2cc70 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29  lite3BtreeNext()
2cc80 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20 74   moves.** past t
2cc90 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
2cca0 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 73 71   the table or sq
2ccb0 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 28 29  lite3BtreePrev()
2ccc0 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20 74   moves past.** t
2ccd0 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20  he first entry. 
2cce0 20 54 52 55 45 20 69 73 20 61 6c 73 6f 20 72 65   TRUE is also re
2ccf0 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 74 61  turned if the ta
2cd00 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
2cd10 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2cd20 65 45 6f 66 28 42 74 43 75 72 73 6f 72 20 2a 70  eEof(BtCursor *p
2cd30 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a  Cur){.  /* TODO:
2cd40 20 57 68 61 74 20 69 66 20 74 68 65 20 63 75 72   What if the cur
2cd50 73 6f 72 20 69 73 20 69 6e 20 43 55 52 53 4f 52  sor is in CURSOR
2cd60 5f 52 45 51 55 49 52 45 53 45 45 4b 20 62 75 74  _REQUIRESEEK but
2cd70 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72 69   all table entri
2cd80 65 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65  es.  ** have bee
2cd90 6e 20 64 65 6c 65 74 65 64 3f 20 54 68 69 73 20  n deleted? This 
2cda0 41 50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  API will need to
2cdb0 20 63 68 61 6e 67 65 20 74 6f 20 72 65 74 75 72   change to retur
2cdc0 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a  n an error code.
2cdd0 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73 20    ** as well as 
2cde0 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75  the boolean resu
2cdf0 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20  lt value..  */. 
2ce00 20 72 65 74 75 72 6e 20 28 43 55 52 53 4f 52 5f   return (CURSOR_
2ce10 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53 74  VALID!=pCur->eSt
2ce20 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ate);.}../*.** A
2ce30 64 76 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f  dvance the curso
2ce40 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e  r to the next en
2ce50 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
2ce60 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63  ase.  If.** succ
2ce70 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20  essful then set 
2ce80 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65  *pRes=0.  If the
2ce90 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61   cursor.** was a
2cea0 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20  lready pointing 
2ceb0 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
2cec0 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
2ced0 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73  e before.** this
2cee0 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c   routine was cal
2cef0 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70  led, then set *p
2cf00 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  Res=1..**.** The
2cf10 20 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e   main entry poin
2cf20 74 20 69 73 20 73 71 6c 69 74 65 33 42 74 72 65  t is sqlite3Btre
2cf30 65 4e 65 78 74 28 29 2e 20 20 54 68 61 74 20 72  eNext().  That r
2cf40 6f 75 74 69 6e 65 20 69 73 20 6f 70 74 69 6d 69  outine is optimi
2cf50 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63  zed.** for the c
2cf60 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65  ommon case of me
2cf70 72 65 6c 79 20 69 6e 63 72 65 6d 65 6e 74 69 6e  rely incrementin
2cf80 67 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74  g the cell count
2cf90 65 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64  er BtCursor.aiId
2cfa0 78 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 65 78 74  x.** to the next
2cfb0 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72   cell on the cur
2cfc0 72 65 6e 74 20 70 61 67 65 2e 20 20 54 68 65 20  rent page.  The 
2cfd0 28 73 6c 6f 77 65 72 29 20 62 74 72 65 65 4e 65  (slower) btreeNe
2cfe0 78 74 28 29 20 68 65 6c 70 65 72 0a 2a 2a 20 72  xt() helper.** r
2cff0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
2d000 20 77 68 65 6e 20 69 74 20 69 73 20 6e 65 63 65   when it is nece
2d010 73 73 61 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f  ssary to move to
2d020 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 61 67   a different pag
2d030 65 20 6f 72 0a 2a 2a 20 74 6f 20 72 65 73 74 6f  e or.** to resto
2d040 72 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a  re the cursor..*
2d050 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67  *.** The calling
2d060 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73   function will s
2d070 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 6f 72  et *pRes to 0 or
2d080 20 31 2e 20 20 54 68 65 20 69 6e 69 74 69 61 6c   1.  The initial
2d090 20 2a 70 52 65 73 20 76 61 6c 75 65 0a 2a 2a 20   *pRes value.** 
2d0a0 77 69 6c 6c 20 62 65 20 31 20 69 66 20 74 68 65  will be 1 if the
2d0b0 20 63 75 72 73 6f 72 20 62 65 69 6e 67 20 73 74   cursor being st
2d0c0 65 70 70 65 64 20 63 6f 72 72 65 73 70 6f 6e 64  epped correspond
2d0d0 73 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65  s to an SQL inde
2d0e0 78 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68 69 73  x and.** if this
2d0f0 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68   routine could h
2d100 61 76 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64  ave been skipped
2d110 20 69 66 20 74 68 61 74 20 53 51 4c 20 69 6e 64   if that SQL ind
2d120 65 78 20 68 61 64 20 62 65 65 6e 0a 2a 2a 20 61  ex had been.** a
2d130 20 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20   unique index.  
2d140 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 63 61  Otherwise the ca
2d150 6c 6c 65 72 20 77 69 6c 6c 20 68 61 76 65 20 73  ller will have s
2d160 65 74 20 2a 70 52 65 73 20 74 6f 20 7a 65 72 6f  et *pRes to zero
2d170 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 74 68 65  ..** Zero is the
2d180 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 20 54 68   common case. Th
2d190 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e  e btree implemen
2d1a0 74 61 74 69 6f 6e 20 69 73 20 66 72 65 65 20 74  tation is free t
2d1b0 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69  o use the.** ini
2d1c0 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65  tial *pRes value
2d1d0 20 61 73 20 61 20 68 69 6e 74 20 74 6f 20 69 6d   as a hint to im
2d1e0 70 72 6f 76 65 20 70 65 72 66 6f 72 6d 61 6e 63  prove performanc
2d1f0 65 2c 20 62 75 74 20 74 68 65 20 63 75 72 72 65  e, but the curre
2d200 6e 74 0a 2a 2a 20 53 51 4c 69 74 65 20 62 74 72  nt.** SQLite btr
2d210 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ee implementatio
2d220 6e 20 64 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f 74  n does not. (Not
2d230 65 20 74 68 61 74 20 74 68 65 20 63 6f 6d 64 62  e that the comdb
2d240 32 20 62 74 72 65 65 0a 2a 2a 20 69 6d 70 6c 65  2 btree.** imple
2d250 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 75  mentation does u
2d260 73 65 20 74 68 69 73 20 68 69 6e 74 2c 20 68 6f  se this hint, ho
2d270 77 65 76 65 72 2e 29 0a 2a 2f 0a 73 74 61 74 69  wever.).*/.stati
2d280 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
2d290 45 20 69 6e 74 20 62 74 72 65 65 4e 65 78 74 28  E int btreeNext(
2d2a0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
2d2b0 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
2d2c0 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b  t rc;.  int idx;
2d2d0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2d2e0 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
2d2f0 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2d300 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2d310 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  rt( pCur->skipNe
2d320 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65  xt==0 || pCur->e
2d330 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
2d340 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
2d350 20 2a 70 52 65 73 3d 3d 30 20 29 3b 0a 20 20 69   *pRes==0 );.  i
2d360 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  f( pCur->eState!
2d370 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
2d380 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 43  .    assert( (pC
2d390 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
2d3a0 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d  TCF_ValidOvfl)==
2d3b0 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 72 65  0 );.    rc = re
2d3c0 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
2d3d0 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 69  ion(pCur);.    i
2d3e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2d3f0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2d400 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
2d410 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  f( CURSOR_INVALI
2d420 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
2d430 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  ){.      *pRes =
2d440 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   1;.      return
2d450 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2d460 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  }.    if( pCur->
2d470 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  skipNext ){.    
2d480 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2d490 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
2d4a0 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53  ALID || pCur->eS
2d4b0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49  tate==CURSOR_SKI
2d4c0 50 4e 45 58 54 20 29 3b 0a 20 20 20 20 20 20 70  PNEXT );.      p
2d4d0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
2d4e0 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20  RSOR_VALID;.    
2d4f0 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
2d500 4e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20  Next>0 ){.      
2d510 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
2d520 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65   = 0;.        re
2d530 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2d540 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43        }.      pC
2d550 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30  ur->skipNext = 0
2d560 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
2d570 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
2d580 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2d590 3b 0a 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72  ;.  idx = ++pCur
2d5a0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2d5b0 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  age];.  assert( 
2d5c0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
2d5d0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61  ..  /* If the da
2d5e0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 63  tabase file is c
2d5f0 6f 72 72 75 70 74 2c 20 69 74 20 69 73 20 70 6f  orrupt, it is po
2d600 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20 76  ssible for the v
2d610 61 6c 75 65 20 6f 66 20 69 64 78 20 0a 20 20 2a  alue of idx .  *
2d620 2a 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 20  * to be invalid 
2d630 68 65 72 65 2e 20 54 68 69 73 20 63 61 6e 20 6f  here. This can o
2d640 6e 6c 79 20 6f 63 63 75 72 20 69 66 20 61 20 73  nly occur if a s
2d650 65 63 6f 6e 64 20 63 75 72 73 6f 72 20 6d 6f 64  econd cursor mod
2d660 69 66 69 65 73 0a 20 20 2a 2a 20 74 68 65 20 70  ifies.  ** the p
2d670 61 67 65 20 77 68 69 6c 65 20 63 75 72 73 6f 72  age while cursor
2d680 20 70 43 75 72 20 69 73 20 68 6f 6c 64 69 6e 67   pCur is holding
2d690 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
2d6a0 69 74 2e 20 57 68 69 63 68 20 63 61 6e 0a 20 20  it. Which can.  
2d6b0 2a 2a 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69  ** only happen i
2d6c0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
2d6d0 73 20 63 6f 72 72 75 70 74 20 69 6e 20 73 75 63  s corrupt in suc
2d6e0 68 20 61 20 77 61 79 20 61 73 20 74 6f 20 6c 69  h a way as to li
2d6f0 6e 6b 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65  nk the.  ** page
2d700 20 69 6e 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20   into more than 
2d710 6f 6e 65 20 62 2d 74 72 65 65 20 73 74 72 75 63  one b-tree struc
2d720 74 75 72 65 2e 20 2a 2f 0a 20 20 74 65 73 74 63  ture. */.  testc
2d730 61 73 65 28 20 69 64 78 3e 70 50 61 67 65 2d 3e  ase( idx>pPage->
2d740 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 69 66 28 20  nCell );..  if( 
2d750 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  idx>=pPage->nCel
2d760 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50  l ){.    if( !pP
2d770 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2d780 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
2d790 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79  ild(pCur, get4by
2d7a0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
2d7b0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
2d7c0 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66  t+8]));.      if
2d7d0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2d7e0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6d  ;.      return m
2d7f0 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
2d800 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  ur);.    }.    d
2d810 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  o{.      if( pCu
2d820 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20  r->iPage==0 ){. 
2d830 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31         *pRes = 1
2d840 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  ;.        pCur->
2d850 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
2d860 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20  INVALID;.       
2d870 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2d880 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
2d890 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43   moveToParent(pC
2d8a0 75 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ur);.      pPage
2d8b0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
2d8c0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
2d8d0 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e    }while( pCur->
2d8e0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2d8f0 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  e]>=pPage->nCell
2d900 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
2d910 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
2d920 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
2d930 33 42 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c  3BtreeNext(pCur,
2d940 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73   pRes);.    }els
2d950 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
2d960 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
2d970 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
2d980 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65  ->leaf ){.    re
2d990 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2d9a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
2d9b0 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  urn moveToLeftmo
2d9c0 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a  st(pCur);.  }.}.
2d9d0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2d9e0 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Next(BtCursor *p
2d9f0 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
2da00 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2da10 65 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  e;.  assert( cur
2da20 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
2da30 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2da40 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20  t( pRes!=0 );.  
2da50 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30  assert( *pRes==0
2da60 20 7c 7c 20 2a 70 52 65 73 3d 3d 31 20 29 3b 0a   || *pRes==1 );.
2da70 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2da80 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70  skipNext==0 || p
2da90 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
2daa0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 70  SOR_VALID );.  p
2dab0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
2dac0 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  = 0;.  pCur->cur
2dad0 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
2dae0 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
2daf0 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 2a 70 52  alidOvfl);.  *pR
2db00 65 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 43  es = 0;.  if( pC
2db10 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2db20 4f 52 5f 56 41 4c 49 44 20 29 20 72 65 74 75 72  OR_VALID ) retur
2db30 6e 20 62 74 72 65 65 4e 65 78 74 28 70 43 75 72  n btreeNext(pCur
2db40 2c 20 70 52 65 73 29 3b 0a 20 20 70 50 61 67 65  , pRes);.  pPage
2db50 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
2db60 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
2db70 69 66 28 20 28 2b 2b 70 43 75 72 2d 3e 61 69 49  if( (++pCur->aiI
2db80 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  dx[pCur->iPage])
2db90 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
2dba0 7b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  {.    pCur->aiId
2dbb0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d  x[pCur->iPage]--
2dbc0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72  ;.    return btr
2dbd0 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65  eeNext(pCur, pRe
2dbe0 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  s);.  }.  if( pP
2dbf0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2dc00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2dc10 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
2dc20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66  return moveToLef
2dc30 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d  tmost(pCur);.  }
2dc40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74  .}../*.** Step t
2dc50 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
2dc60 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65   back to the pre
2dc70 76 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74  vious entry in t
2dc80 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  he database.  If
2dc90 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74  .** successful t
2dca0 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e  hen set *pRes=0.
2dcb0 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a    If the cursor.
2dcc0 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70  ** was already p
2dcd0 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66  ointing to the f
2dce0 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  irst entry in th
2dcf0 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  e database befor
2dd00 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  e.** this routin
2dd10 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68  e was called, th
2dd20 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a  en set *pRes=1..
2dd30 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65  **.** The main e
2dd40 6e 74 72 79 20 70 6f 69 6e 74 20 69 73 20 73 71  ntry point is sq
2dd50 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
2dd60 75 73 28 29 2e 20 20 54 68 61 74 20 72 6f 75 74  us().  That rout
2dd70 69 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a 65 64  ine is optimized
2dd80 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d  .** for the comm
2dd90 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65 72 65 6c  on case of merel
2dda0 79 20 64 65 63 72 65 6d 65 6e 74 69 6e 67 20 74  y decrementing t
2ddb0 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20  he cell counter 
2ddc0 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a  BtCursor.aiIdx.*
2ddd0 2a 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75  * to the previou
2dde0 73 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75  s cell on the cu
2ddf0 72 72 65 6e 74 20 70 61 67 65 2e 20 20 54 68 65  rrent page.  The
2de00 20 28 73 6c 6f 77 65 72 29 20 62 74 72 65 65 50   (slower) btreeP
2de10 72 65 76 69 6f 75 73 28 29 0a 2a 2a 20 68 65 6c  revious().** hel
2de20 70 65 72 20 72 6f 75 74 69 6e 65 20 69 73 20 63  per routine is c
2de30 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 20 69 73  alled when it is
2de40 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 6d 6f   necessary to mo
2de50 76 65 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  ve to a differen
2de60 74 20 70 61 67 65 0a 2a 2a 20 6f 72 20 74 6f 20  t page.** or to 
2de70 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73  restore the curs
2de80 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  or..**.** The ca
2de90 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 77  lling function w
2dea0 69 6c 6c 20 73 65 74 20 2a 70 52 65 73 20 74 6f  ill set *pRes to
2deb0 20 30 20 6f 72 20 31 2e 20 20 54 68 65 20 69 6e   0 or 1.  The in
2dec0 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75  itial *pRes valu
2ded0 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 31 20 69  e.** will be 1 i
2dee0 66 20 74 68 65 20 63 75 72 73 6f 72 20 62 65 69  f the cursor bei
2def0 6e 67 20 73 74 65 70 70 65 64 20 63 6f 72 72 65  ng stepped corre
2df00 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c  sponds to an SQL
2df10 20 69 6e 64 65 78 20 61 6e 64 0a 2a 2a 20 69 66   index and.** if
2df20 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f   this routine co
2df30 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 73 6b  uld have been sk
2df40 69 70 70 65 64 20 69 66 20 74 68 61 74 20 53 51  ipped if that SQ
2df50 4c 20 69 6e 64 65 78 20 68 61 64 20 62 65 65 6e  L index had been
2df60 0a 2a 2a 20 61 20 75 6e 69 71 75 65 20 69 6e 64  .** a unique ind
2df70 65 78 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74  ex.  Otherwise t
2df80 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68  he caller will h
2df90 61 76 65 20 73 65 74 20 2a 70 52 65 73 20 74 6f  ave set *pRes to
2dfa0 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f 20 69   zero..** Zero i
2dfb0 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  s the common cas
2dfc0 65 2e 20 54 68 65 20 62 74 72 65 65 20 69 6d 70  e. The btree imp
2dfd0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 66  lementation is f
2dfe0 72 65 65 20 74 6f 20 75 73 65 20 74 68 65 0a 2a  ree to use the.*
2dff0 2a 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20  * initial *pRes 
2e000 76 61 6c 75 65 20 61 73 20 61 20 68 69 6e 74 20  value as a hint 
2e010 74 6f 20 69 6d 70 72 6f 76 65 20 70 65 72 66 6f  to improve perfo
2e020 72 6d 61 6e 63 65 2c 20 62 75 74 20 74 68 65 20  rmance, but the 
2e030 63 75 72 72 65 6e 74 0a 2a 2a 20 53 51 4c 69 74  current.** SQLit
2e040 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e  e btree implemen
2e050 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 2e  tation does not.
2e060 20 28 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20   (Note that the 
2e070 63 6f 6d 64 62 32 20 62 74 72 65 65 0a 2a 2a 20  comdb2 btree.** 
2e080 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64  implementation d
2e090 6f 65 73 20 75 73 65 20 74 68 69 73 20 68 69 6e  oes use this hin
2e0a0 74 2c 20 68 6f 77 65 76 65 72 2e 29 0a 2a 2f 0a  t, however.).*/.
2e0b0 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
2e0c0 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72 65 65  INLINE int btree
2e0d0 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f  Previous(BtCurso
2e0e0 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
2e0f0 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  es){.  int rc;. 
2e100 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
2e110 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
2e120 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
2e130 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2e140 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 61  ( pRes!=0 );.  a
2e150 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20  ssert( *pRes==0 
2e160 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2e170 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c  r->skipNext==0 |
2e180 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  | pCur->eState!=
2e190 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2e1a0 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d    assert( (pCur-
2e1b0 3e 63 75 72 46 6c 61 67 73 20 26 20 28 42 54 43  >curFlags & (BTC
2e1c0 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61  F_AtLast|BTCF_Va
2e1d0 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c  lidOvfl|BTCF_Val
2e1e0 69 64 4e 4b 65 79 29 29 3d 3d 30 20 29 3b 0a 20  idNKey))==0 );. 
2e1f0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2e200 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a  nfo.nSize==0 );.
2e210 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
2e220 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2e230 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 73   ){.    rc = res
2e240 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
2e250 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66  on(pCur);.    if
2e260 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2e270 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2e280 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
2e290 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
2e2a0 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
2e2b0 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  {.      *pRes = 
2e2c0 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
2e2d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
2e2e0 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73  .    if( pCur->s
2e2f0 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  kipNext ){.     
2e300 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
2e310 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
2e320 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  LID || pCur->eSt
2e330 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50  ate==CURSOR_SKIP
2e340 4e 45 58 54 20 29 3b 0a 20 20 20 20 20 20 70 43  NEXT );.      pC
2e350 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
2e360 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20  SOR_VALID;.     
2e370 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e   if( pCur->skipN
2e380 65 78 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ext<0 ){.       
2e390 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
2e3a0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
2e3b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2e3c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75       }.      pCu
2e3d0 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b  r->skipNext = 0;
2e3e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50  .    }.  }..  pP
2e3f0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
2e400 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
2e410 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2e420 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66  ->isInit );.  if
2e430 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
2e440 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20  {.    int idx = 
2e450 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2e460 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 72 63  ->iPage];.    rc
2e470 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
2e480 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 66 69  Cur, get4byte(fi
2e490 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  ndCell(pPage, id
2e4a0 78 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63  x)));.    if( rc
2e4b0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2e4c0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67    rc = moveToRig
2e4d0 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  htmost(pCur);.  
2e4e0 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65  }else{.    while
2e4f0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
2e500 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 20 29 7b  ur->iPage]==0 ){
2e510 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
2e520 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20  >iPage==0 ){.   
2e530 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
2e540 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
2e550 49 44 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65  ID;.        *pRe
2e560 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  s = 1;.        r
2e570 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2e580 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
2e590 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72  oveToParent(pCur
2e5a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
2e5b0 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
2e5c0 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20  nSize==0 );.    
2e5d0 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63  assert( (pCur->c
2e5e0 75 72 46 6c 61 67 73 20 26 20 28 42 54 43 46 5f  urFlags & (BTCF_
2e5f0 56 61 6c 69 64 4f 76 66 6c 29 29 3d 3d 30 20 29  ValidOvfl))==0 )
2e600 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49  ;..    pCur->aiI
2e610 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  dx[pCur->iPage]-
2e620 2d 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70  -;.    pPage = p
2e630 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2e640 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 66  ->iPage];.    if
2e650 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
2e660 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  && !pPage->leaf 
2e670 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
2e680 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
2e690 75 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a  us(pCur, pRes);.
2e6a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2e6b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2e6c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2e6d0 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71  urn rc;.}.int sq
2e6e0 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
2e6f0 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  us(BtCursor *pCu
2e700 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
2e710 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
2e720 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
2e730 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2e740 52 65 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  Res!=0 );.  asse
2e750 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 7c 7c 20  rt( *pRes==0 || 
2e760 2a 70 52 65 73 3d 3d 31 20 29 3b 0a 20 20 61 73  *pRes==1 );.  as
2e770 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70  sert( pCur->skip
2e780 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Next==0 || pCur-
2e790 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
2e7a0 56 41 4c 49 44 20 29 3b 0a 20 20 2a 70 52 65 73  VALID );.  *pRes
2e7b0 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75   = 0;.  pCur->cu
2e7c0 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
2e7d0 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c  _AtLast|BTCF_Val
2e7e0 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69  idOvfl|BTCF_Vali
2e7f0 64 4e 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e  dNKey);.  pCur->
2e800 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
2e810 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
2e820 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2e830 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61 69 49  .   || pCur->aiI
2e840 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d  dx[pCur->iPage]=
2e850 3d 30 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61  =0.   || pCur->a
2e860 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2e870 65 5d 2d 3e 6c 65 61 66 3d 3d 30 0a 20 20 29 7b  e]->leaf==0.  ){
2e880 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65  .    return btre
2e890 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20  ePrevious(pCur, 
2e8a0 70 52 65 73 29 3b 0a 20 20 7d 0a 20 20 70 43 75  pRes);.  }.  pCu
2e8b0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2e8c0 50 61 67 65 5d 2d 2d 3b 0a 20 20 72 65 74 75 72  Page]--;.  retur
2e8d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2e8e0 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
2e8f0 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20 74   new page from t
2e900 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2e910 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20  ..**.** The new 
2e920 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61  page is marked a
2e930 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f 74  s dirty.  (In ot
2e940 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69 74  her words, sqlit
2e950 65 33 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a  e3PagerWrite().*
2e960 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  * has already be
2e970 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65  en called on the
2e980 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68 65   new page.)  The
2e990 20 6e 65 77 20 70 61 67 65 20 68 61 73 20 61 6c   new page has al
2e9a0 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65 72  so.** been refer
2e9b0 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63 61  enced and the ca
2e9c0 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73  lling routine is
2e9d0 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
2e9e0 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69   calling.** sqli
2e9f0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20  te3PagerUnref() 
2ea00 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 20  on the new page 
2ea10 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e  when it is done.
2ea20 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
2ea30 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
2ea40 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f 74  success.  Any ot
2ea50 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65  her return value
2ea60 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e   indicates.** an
2ea70 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65   error.  *ppPage
2ea80 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   is set to NULL 
2ea90 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20  in the event of 
2eaa0 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  an error..**.** 
2eab0 49 66 20 74 68 65 20 22 6e 65 61 72 62 79 22 20  If the "nearby" 
2eac0 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74  parameter is not
2ead0 20 30 2c 20 74 68 65 6e 20 61 6e 20 65 66 66 6f   0, then an effo
2eae0 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a  rt is made to .*
2eaf0 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20  * locate a page 
2eb00 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67  close to the pag
2eb10 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79  e number "nearby
2eb20 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20  ".  This can be 
2eb30 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74  used in an.** at
2eb40 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65  tempt to keep re
2eb50 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73  lated pages clos
2eb60 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20  e to each other 
2eb70 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
2eb80 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69  file,.** which i
2eb90 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20  n turn can make 
2eba0 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20  database access 
2ebb0 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  faster..**.** If
2ebc0 20 74 68 65 20 65 4d 6f 64 65 20 70 61 72 61 6d   the eMode param
2ebd0 65 74 65 72 20 69 73 20 42 54 41 4c 4c 4f 43 5f  eter is BTALLOC_
2ebe0 45 58 41 43 54 20 61 6e 64 20 74 68 65 20 6e 65  EXACT and the ne
2ebf0 61 72 62 79 20 70 61 67 65 20 65 78 69 73 74 73  arby page exists
2ec00 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20  .** anywhere on 
2ec10 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74  the free-list, t
2ec20 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e  hen it is guaran
2ec30 74 65 65 64 20 74 6f 20 62 65 20 72 65 74 75 72  teed to be retur
2ec40 6e 65 64 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f 64  ned.  If.** eMod
2ec50 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 4c 54 20  e is BTALLOC_LT 
2ec60 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 72 65  then the page re
2ec70 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20 6c  turned will be l
2ec80 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
2ec90 6c 0a 2a 2a 20 74 6f 20 6e 65 61 72 62 79 20 69  l.** to nearby i
2eca0 66 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 20  f any such page 
2ecb0 65 78 69 73 74 73 2e 20 20 49 66 20 65 4d 6f 64  exists.  If eMod
2ecc0 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 41 4e 59  e is BTALLOC_ANY
2ecd0 20 74 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 61   then there.** a
2ece0 72 65 20 6e 6f 20 72 65 73 74 72 69 63 74 69 6f  re no restrictio
2ecf0 6e 73 20 6f 6e 20 77 68 69 63 68 20 70 61 67 65  ns on which page
2ed00 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
2ed10 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
2ed20 63 61 74 65 42 74 72 65 65 50 61 67 65 28 0a 20  cateBtreePage(. 
2ed30 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
2ed40 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
2ed50 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  tree */.  MemPag
2ed60 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20  e **ppPage,     
2ed70 20 2f 2a 20 53 74 6f 72 65 20 70 6f 69 6e 74 65   /* Store pointe
2ed80 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74  r to the allocat
2ed90 65 64 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a  ed page here */.
2eda0 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20    Pgno *pPgno,  
2edb0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72           /* Stor
2edc0 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  e the page numbe
2edd0 72 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f  r here */.  Pgno
2ede0 20 6e 65 61 72 62 79 2c 20 20 20 20 20 20 20 20   nearby,        
2edf0 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
2ee00 20 61 20 70 61 67 65 20 6e 65 61 72 20 74 68 69   a page near thi
2ee10 73 20 6f 6e 65 20 2a 2f 0a 20 20 75 38 20 65 4d  s one */.  u8 eM
2ee20 6f 64 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ode             
2ee30 20 20 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45 58 41    /* BTALLOC_EXA
2ee40 43 54 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20  CT, BTALLOC_LT, 
2ee50 6f 72 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a  or BTALLOC_ANY *
2ee60 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  /.){.  MemPage *
2ee70 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63  pPage1;.  int rc
2ee80 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20 20 20 2f  ;.  u32 n;     /
2ee90 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
2eea0 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
2eeb0 74 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20  t */.  u32 k;   
2eec0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
2eed0 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75  eaves on the tru
2eee0 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  nk of the freeli
2eef0 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  st */.  MemPage 
2ef00 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d  *pTrunk = 0;.  M
2ef10 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72 75  emPage *pPrevTru
2ef20 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d  nk = 0;.  Pgno m
2ef30 78 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f  xPage;     /* To
2ef40 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20  tal size of the 
2ef50 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
2ef60 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
2ef70 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2ef80 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
2ef90 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 42  assert( eMode==B
2efa0 54 41 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28 6e  TALLOC_ANY || (n
2efb0 65 61 72 62 79 3e 30 20 26 26 20 49 66 4e 6f 74  earby>0 && IfNot
2efc0 4f 6d 69 74 41 56 28 70 42 74 2d 3e 61 75 74 6f  OmitAV(pBt->auto
2efd0 56 61 63 75 75 6d 29 29 20 29 3b 0a 20 20 70 50  Vacuum)) );.  pP
2efe0 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
2eff0 65 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20 62  e1;.  mxPage = b
2f000 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
2f010 74 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43  t);.  /* EVIDENC
2f020 45 2d 4f 46 3a 20 52 2d 30 35 31 31 39 2d 30 32  E-OF: R-05119-02
2f030 36 33 37 20 54 68 65 20 34 2d 62 79 74 65 20 62  637 The 4-byte b
2f040 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
2f050 72 20 61 74 20 6f 66 66 73 65 74 20 33 36 0a 20  r at offset 36. 
2f060 20 2a 2a 20 73 74 6f 72 65 73 20 73 74 6f 72 65   ** stores store
2f070 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
2f080 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74  er of pages on t
2f090 68 65 20 66 72 65 65 6c 69 73 74 2e 20 2a 2f 0a  he freelist. */.
2f0a0 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26    n = get4byte(&
2f0b0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
2f0c0 5d 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  ]);.  testcase( 
2f0d0 6e 3d 3d 6d 78 50 61 67 65 2d 31 20 29 3b 0a 20  n==mxPage-1 );. 
2f0e0 20 69 66 28 20 6e 3e 3d 6d 78 50 61 67 65 20 29   if( n>=mxPage )
2f0f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2f100 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2f110 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30 20  ;.  }.  if( n>0 
2f120 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  ){.    /* There 
2f130 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74 68 65  are pages on the
2f140 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 75 73   freelist.  Reus
2f150 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70  e one of those p
2f160 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e  ages. */.    Pgn
2f170 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38  o iTrunk;.    u8
2f180 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
2f190 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65 65 2d   /* If the free-
2f1a0 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73 65 61  list must be sea
2f1b0 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61 72 62  rched for 'nearb
2f1c0 79 27 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 53  y' */.    u32 nS
2f1d0 65 61 72 63 68 20 3d 20 30 3b 20 20 20 2f 2a 20  earch = 0;   /* 
2f1e0 43 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d  Count of the num
2f1f0 62 65 72 20 6f 66 20 73 65 61 72 63 68 20 61 74  ber of search at
2f200 74 65 6d 70 74 73 20 2a 2f 0a 20 20 20 20 0a 20  tempts */.    . 
2f210 20 20 20 2f 2a 20 49 66 20 65 4d 6f 64 65 3d 3d     /* If eMode==
2f220 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e  BTALLOC_EXACT an
2f230 64 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65  d a query of the
2f240 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20   pointer-map.   
2f250 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74   ** shows that t
2f260 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27  he page 'nearby'
2f270 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e   is somewhere on
2f280 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
2f290 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  then.    ** the 
2f2a0 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c  entire-list will
2f2b0 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72   be searched for
2f2c0 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20   that page..    
2f2d0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
2f2e0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
2f2f0 4d 0a 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d  M.    if( eMode=
2f300 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 29  =BTALLOC_EXACT )
2f310 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 61 72  {.      if( near
2f320 62 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20  by<=mxPage ){.  
2f330 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a        u8 eType;.
2f340 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2f350 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20  nearby>0 );.    
2f360 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
2f370 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20  >autoVacuum );. 
2f380 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d         rc = ptrm
2f390 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62  apGet(pBt, nearb
2f3a0 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20  y, &eType, 0);. 
2f3b0 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20         if( rc ) 
2f3c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2f3d0 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
2f3e0 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b  RMAP_FREEPAGE ){
2f3f0 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63  .          searc
2f400 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20  hList = 1;.     
2f410 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2f420 20 7d 65 6c 73 65 20 69 66 28 20 65 4d 6f 64 65   }else if( eMode
2f430 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a  ==BTALLOC_LE ){.
2f440 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
2f450 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   = 1;.    }.#end
2f460 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65  if..    /* Decre
2f470 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69  ment the free-li
2f480 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53  st count by 1. S
2f490 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65  et iTrunk to the
2f4a0 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20   index of the.  
2f4b0 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d    ** first free-
2f4c0 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e  list trunk page.
2f4d0 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69   iPrevTrunk is i
2f4e0 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20  nitially 1..    
2f4f0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
2f500 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
2f510 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
2f520 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
2f530 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 75 74 34  urn rc;.    put4
2f540 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
2f550 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a  ata[36], n-1);..
2f560 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20      /* The code 
2f570 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70  within this loop
2f580 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63   is run only onc
2f590 65 20 69 66 20 74 68 65 20 27 73 65 61 72 63 68  e if the 'search
2f5a0 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20  List' variable. 
2f5b0 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75     ** is not tru
2f5c0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  e. Otherwise, it
2f5d0 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65   runs once for e
2f5e0 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f  ach trunk-page o
2f5f0 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65  n the.    ** fre
2f600 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65  e-list until the
2f610 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69   page 'nearby' i
2f620 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65  s located (eMode
2f630 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29  ==BTALLOC_EXACT)
2f640 0a 20 20 20 20 2a 2a 20 6f 72 20 75 6e 74 69 6c  .    ** or until
2f650 20 61 20 70 61 67 65 20 6c 65 73 73 20 74 68 61   a page less tha
2f660 6e 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f  n 'nearby' is lo
2f670 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54  cated (eMode==BT
2f680 41 4c 4c 4f 43 5f 4c 54 29 0a 20 20 20 20 2a 2f  ALLOC_LT).    */
2f690 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
2f6a0 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72  pPrevTrunk = pTr
2f6b0 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  unk;.      if( p
2f6c0 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20  PrevTrunk ){.   
2f6d0 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
2f6e0 2d 4f 46 3a 20 52 2d 30 31 35 30 36 2d 31 31 30  -OF: R-01506-110
2f6f0 35 33 20 54 68 65 20 66 69 72 73 74 20 69 6e 74  53 The first int
2f700 65 67 65 72 20 6f 6e 20 61 20 66 72 65 65 6c 69  eger on a freeli
2f710 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20  st trunk page.  
2f720 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20        ** is the 
2f730 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
2f740 68 65 20 6e 65 78 74 20 66 72 65 65 6c 69 73 74  he next freelist
2f750 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74   trunk page in t
2f760 68 65 20 6c 69 73 74 20 6f 72 0a 20 20 20 20 20  he list or.     
2f770 20 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20 74 68     ** zero if th
2f780 69 73 20 69 73 20 74 68 65 20 6c 61 73 74 20 66  is is the last f
2f790 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  reelist trunk pa
2f7a0 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ge. */.        i
2f7b0 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
2f7c0 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
2f7d0 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d  ata[0]);.      }
2f7e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
2f7f0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
2f800 35 39 38 34 31 2d 31 33 37 39 38 20 54 68 65 20  59841-13798 The 
2f810 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4-byte big-endia
2f820 6e 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66  n integer at off
2f830 73 65 74 20 33 32 0a 20 20 20 20 20 20 20 20 2a  set 32.        *
2f840 2a 20 73 74 6f 72 65 73 20 74 68 65 20 70 61 67  * stores the pag
2f850 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
2f860 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
2f870 65 20 66 72 65 65 6c 69 73 74 2c 20 6f 72 20 7a  e freelist, or z
2f880 65 72 6f 20 69 66 0a 20 20 20 20 20 20 20 20 2a  ero if.        *
2f890 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  * the freelist i
2f8a0 73 20 65 6d 70 74 79 2e 20 2a 2f 0a 20 20 20 20  s empty. */.    
2f8b0 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74      iTrunk = get
2f8c0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
2f8d0 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20  Data[32]);.     
2f8e0 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   }.      testcas
2f8f0 65 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61 67  e( iTrunk==mxPag
2f900 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  e );.      if( i
2f910 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 7c 7c 20  Trunk>mxPage || 
2f920 6e 53 65 61 72 63 68 2b 2b 20 3e 20 6e 20 29 7b  nSearch++ > n ){
2f930 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
2f940 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2f950 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  T;.      }else{.
2f960 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72          rc = btr
2f970 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28  eeGetUnusedPage(
2f980 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54  pBt, iTrunk, &pT
2f990 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20  runk, 0);.      
2f9a0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  }.      if( rc )
2f9b0 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  {.        pTrunk
2f9c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f   = 0;.        go
2f9d0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
2f9e0 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  page;.      }.  
2f9f0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72 75      assert( pTru
2fa00 6e 6b 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  nk!=0 );.      a
2fa10 73 73 65 72 74 28 20 70 54 72 75 6e 6b 2d 3e 61  ssert( pTrunk->a
2fa20 44 61 74 61 21 3d 30 20 29 3b 0a 20 20 20 20 20  Data!=0 );.     
2fa30 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
2fa40 20 52 2d 31 33 35 32 33 2d 30 34 33 39 34 20 54   R-13523-04394 T
2fa50 68 65 20 73 65 63 6f 6e 64 20 69 6e 74 65 67 65  he second intege
2fa60 72 20 6f 6e 20 61 20 66 72 65 65 6c 69 73 74 20  r on a freelist 
2fa70 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 20  trunk page.     
2fa80 20 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d 62 65   ** is the numbe
2fa90 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65 20 70  r of leaf page p
2faa0 6f 69 6e 74 65 72 73 20 74 6f 20 66 6f 6c 6c 6f  ointers to follo
2fab0 77 2e 20 2a 2f 0a 20 20 20 20 20 20 6b 20 3d 20  w. */.      k = 
2fac0 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  get4byte(&pTrunk
2fad0 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20  ->aData[4]);.   
2fae0 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26 20 21     if( k==0 && !
2faf0 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a 20 20  searchList ){.  
2fb00 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75        /* The tru
2fb10 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76 65 73  nk has no leaves
2fb20 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20 69 73   and the list is
2fb30 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61 72 63   not being searc
2fb40 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a  hed. .        **
2fb50 20 53 6f 20 65 78 74 72 61 63 74 20 74 68 65 20   So extract the 
2fb60 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73 65 6c  trunk page itsel
2fb70 66 20 61 6e 64 20 75 73 65 20 69 74 20 61 73 20  f and use it as 
2fb80 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20 20 20  the newly .     
2fb90 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20     ** allocated 
2fba0 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  page */.        
2fbb0 61 73 73 65 72 74 28 20 70 50 72 65 76 54 72 75  assert( pPrevTru
2fbc0 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  nk==0 );.       
2fbd0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2fbe0 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
2fbf0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
2fc00 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2fc10 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2fc20 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
2fc30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2fc40 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b  *pPgno = iTrunk;
2fc50 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
2fc60 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
2fc70 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  2], &pTrunk->aDa
2fc80 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[0], 4);.     
2fc90 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72     *ppPage = pTr
2fca0 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 72  unk;.        pTr
2fcb0 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  unk = 0;.       
2fcc0 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
2fcd0 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64  E: %d trunk - %d
2fce0 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74   free pages left
2fcf0 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31  \n", *pPgno, n-1
2fd00 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ));.      }else 
2fd10 69 66 28 20 6b 3e 28 75 33 32 29 28 70 42 74 2d  if( k>(u32)(pBt-
2fd20 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20  >usableSize/4 - 
2fd30 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  2) ){.        /*
2fd40 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f   Value of k is o
2fd50 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 44 61  ut of range.  Da
2fd60 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
2fd70 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20  n */.        rc 
2fd80 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
2fd90 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67  _BKPT;.        g
2fda0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
2fdb0 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66 20 53  _page;.#ifndef S
2fdc0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
2fdd0 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c 73  ACUUM.      }els
2fde0 65 20 69 66 28 20 73 65 61 72 63 68 4c 69 73 74  e if( searchList
2fdf0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26   .            &&
2fe00 20 28 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b   (nearby==iTrunk
2fe10 20 7c 7c 20 28 69 54 72 75 6e 6b 3c 6e 65 61 72   || (iTrunk<near
2fe20 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41  by && eMode==BTA
2fe30 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20 20  LLOC_LE)) .     
2fe40 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
2fe50 68 65 20 6c 69 73 74 20 69 73 20 62 65 69 6e 67  he list is being
2fe60 20 73 65 61 72 63 68 65 64 20 61 6e 64 20 74 68   searched and th
2fe70 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73  is trunk page is
2fe80 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   the page.      
2fe90 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65    ** to allocate
2fea0 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  , regardless of 
2feb0 77 68 65 74 68 65 72 20 69 74 20 68 61 73 20 6c  whether it has l
2fec0 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  eaves..        *
2fed0 2f 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f  /.        *pPgno
2fee0 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = iTrunk;.     
2fef0 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72     *ppPage = pTr
2ff00 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73 65 61  unk;.        sea
2ff10 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20  rchList = 0;.   
2ff20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2ff30 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
2ff40 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
2ff50 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
2ff60 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
2ff70 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
2ff80 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2ff90 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 29 7b 0a      if( k==0 ){.
2ffa0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
2ffb0 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20  PrevTrunk ){.   
2ffc0 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
2ffd0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
2ffe0 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  2], &pTrunk->aDa
2fff0 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[0], 4);.     
30000 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
30010 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
30020 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
30030 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61  PrevTrunk->pDbPa
30040 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
30050 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
30060 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
30070 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
30080 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
30090 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
300a0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
300b0 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  revTrunk->aData[
300c0 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  0], &pTrunk->aDa
300d0 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[0], 4);.     
300e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
300f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
30100 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70 61 67  /* The trunk pag
30110 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62 79  e is required by
30120 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75 74 20   the caller but 
30130 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20  it contains .   
30140 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65         ** pointe
30150 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73 74 20  rs to free-list 
30160 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69 72 73  leaves. The firs
30170 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73 20 61  t leaf becomes a
30180 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20 20 20   trunk.         
30190 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73   ** page in this
301a0 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20   case..         
301b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4d 65   */.          Me
301c0 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b  mPage *pNewTrunk
301d0 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f  ;.          Pgno
301e0 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65 74   iNewTrunk = get
301f0 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
30200 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20  Data[8]);.      
30210 20 20 20 20 69 66 28 20 69 4e 65 77 54 72 75 6e      if( iNewTrun
30220 6b 3e 6d 78 50 61 67 65 20 29 7b 20 0a 20 20 20  k>mxPage ){ .   
30230 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
30240 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
30250 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  T;.            g
30260 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
30270 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
30280 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 65 73   }.          tes
30290 74 63 61 73 65 28 20 69 4e 65 77 54 72 75 6e 6b  tcase( iNewTrunk
302a0 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20  ==mxPage );.    
302b0 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
302c0 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42  GetUnusedPage(pB
302d0 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70  t, iNewTrunk, &p
302e0 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20  NewTrunk, 0);.  
302f0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
30300 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30310 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
30320 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
30330 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
30340 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
30350 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e  te3PagerWrite(pN
30360 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  ewTrunk->pDbPage
30370 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
30380 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
30390 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
303a0 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72  leasePage(pNewTr
303b0 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
303c0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
303d0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
303e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
303f0 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e  memcpy(&pNewTrun
30400 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54  k->aData[0], &pT
30410 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
30420 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75  4);.          pu
30430 74 34 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e  t4byte(&pNewTrun
30440 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31  k->aData[4], k-1
30450 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  );.          mem
30460 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e  cpy(&pNewTrunk->
30470 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e  aData[8], &pTrun
30480 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b  k->aData[12], (k
30490 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20  -1)*4);.        
304a0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
304b0 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
304c0 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72      if( !pPrevTr
304d0 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  unk ){.         
304e0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
304f0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
30500 6c 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  le(pPage1->pDbPa
30510 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ge) );.         
30520 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
30530 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
30540 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  iNewTrunk);.    
30550 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
30560 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
30570 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
30580 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50  pPrevTrunk->pDbP
30590 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
305a0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
305b0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
305c0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
305d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
305e0 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34              put4
305f0 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b  byte(&pPrevTrunk
30600 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77  ->aData[0], iNew
30610 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
30620 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
30630 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30        pTrunk = 0
30640 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28  ;.        TRACE(
30650 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74  ("ALLOCATE: %d t
30660 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70  runk - %d free p
30670 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70  ages left\n", *p
30680 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e  Pgno, n-1));.#en
30690 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  dif.      }else 
306a0 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20  if( k>0 ){.     
306b0 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20     /* Extract a 
306c0 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72  leaf from the tr
306d0 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 75  unk */.        u
306e0 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20  32 closest;.    
306f0 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a      Pgno iPage;.
30700 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64          unsigned
30710 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70   char *aData = p
30720 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20  Trunk->aData;.  
30730 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62 79        if( nearby
30740 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
30750 75 33 32 20 69 3b 0a 20 20 20 20 20 20 20 20 20  u32 i;.         
30760 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20   closest = 0;.  
30770 20 20 20 20 20 20 20 20 69 66 28 20 65 4d 6f 64          if( eMod
30780 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b  e==BTALLOC_LE ){
30790 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
307a0 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b  (i=0; i<k; i++){
307b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
307c0 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
307d0 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a  &aData[8+i*4]);.
307e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
307f0 28 20 69 50 61 67 65 3c 3d 6e 65 61 72 62 79 20  ( iPage<=nearby 
30800 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
30810 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a     closest = i;.
30820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30830 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
30840 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
30850 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
30860 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
30870 20 20 69 6e 74 20 64 69 73 74 3b 0a 20 20 20 20    int dist;.    
30880 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 73          dist = s
30890 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28 67  qlite3AbsInt32(g
308a0 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
308b0 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20  ]) - nearby);.  
308c0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
308d0 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20  1; i<k; i++){.  
308e0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
308f0 64 32 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49  d2 = sqlite3AbsI
30900 6e 74 33 32 28 67 65 74 34 62 79 74 65 28 26 61  nt32(get4byte(&a
30910 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e  Data[8+i*4]) - n
30920 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20  earby);.        
30930 20 20 20 20 20 20 69 66 28 20 64 32 3c 64 69 73        if( d2<dis
30940 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
30950 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69       closest = i
30960 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
30970 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20    dist = d2;.   
30980 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
30990 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
309a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
309b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
309c0 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20  closest = 0;.   
309d0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
309e0 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  iPage = get4byte
309f0 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73  (&aData[8+closes
30a00 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 74  t*4]);.        t
30a10 65 73 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d  estcase( iPage==
30a20 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  mxPage );.      
30a30 20 20 69 66 28 20 69 50 61 67 65 3e 6d 78 50 61    if( iPage>mxPa
30a40 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ge ){.          
30a50 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
30a60 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
30a70 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
30a80 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
30a90 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65      }.        te
30aa0 73 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d  stcase( iPage==m
30ab0 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20  xPage );.       
30ac0 20 69 66 28 20 21 73 65 61 72 63 68 4c 69 73 74   if( !searchList
30ad0 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69   .         || (i
30ae0 50 61 67 65 3d 3d 6e 65 61 72 62 79 20 7c 7c 20  Page==nearby || 
30af0 28 69 50 61 67 65 3c 6e 65 61 72 62 79 20 26 26  (iPage<nearby &&
30b00 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
30b10 4c 45 29 29 20 0a 20 20 20 20 20 20 20 20 29 7b  LE)) .        ){
30b20 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
30b30 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20  oContent;.      
30b40 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61      *pPgno = iPa
30b50 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 54 52  ge;.          TR
30b60 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
30b70 25 64 20 77 61 73 20 6c 65 61 66 20 25 64 20 6f  %d was leaf %d o
30b80 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64  f %d on trunk %d
30b90 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
30ba0 20 20 20 22 3a 20 25 64 20 6d 6f 72 65 20 66 72     ": %d more fr
30bb0 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20  ee pages\n",.   
30bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70                *p
30bd0 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c  Pgno, closest+1,
30be0 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f   k, pTrunk->pgno
30bf0 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20  , n-1));.       
30c00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
30c10 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
30c20 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
30c30 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
30c40 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
30c50 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
30c60 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31   if( closest<k-1
30c70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
30c80 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b 38 2b  memcpy(&aData[8+
30c90 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44 61  closest*4], &aDa
30ca0 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20  ta[4+k*4], 4);. 
30cb0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
30cc0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 61       put4byte(&a
30cd0 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20  Data[4], k-1);. 
30ce0 20 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65           noConte
30cf0 6e 74 20 3d 20 21 62 74 72 65 65 47 65 74 48 61  nt = !btreeGetHa
30d00 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70  sContent(pBt, *p
30d10 50 67 6e 6f 29 3f 20 50 41 47 45 52 5f 47 45 54  Pgno)? PAGER_GET
30d20 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a 20 30 3b 0a  _NOCONTENT : 0;.
30d30 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62            rc = b
30d40 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67  treeGetUnusedPag
30d50 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70  e(pBt, *pPgno, p
30d60 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74  pPage, noContent
30d70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
30d80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
30d90 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
30da0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
30db0 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e  rite((*ppPage)->
30dc0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
30dd0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
30de0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
30df0 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
30e00 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
30e10 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 70               *pp
30e20 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Page = 0;.      
30e30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30e40 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 65    }.          se
30e50 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20  archList = 0;.  
30e60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
30e70 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
30e80 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20  e(pPrevTrunk);. 
30e90 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20       pPrevTrunk 
30ea0 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  = 0;.    }while(
30eb0 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b 0a 20   searchList );. 
30ec0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
30ed0 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61 67 65  here are no page
30ee0 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
30ef0 74 2c 20 73 6f 20 61 70 70 65 6e 64 20 61 20 6e  t, so append a n
30f00 65 77 20 70 61 67 65 20 74 6f 20 74 68 65 0a 20  ew page to the. 
30f10 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
30f20 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  mage..    **.   
30f30 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 65   ** Normally, ne
30f40 77 20 70 61 67 65 73 20 61 6c 6c 6f 63 61 74 65  w pages allocate
30f50 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63 6b 20  d by this block 
30f60 63 61 6e 20 62 65 20 72 65 71 75 65 73 74 65 64  can be requested
30f70 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a   from the.    **
30f80 20 70 61 67 65 72 20 6c 61 79 65 72 20 77 69 74   pager layer wit
30f90 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e  h the 'no-conten
30fa0 74 27 20 66 6c 61 67 20 73 65 74 2e 20 54 68 69  t' flag set. Thi
30fb0 73 20 70 72 65 76 65 6e 74 73 20 74 68 65 20 70  s prevents the p
30fc0 61 67 65 72 0a 20 20 20 20 2a 2a 20 66 72 6f 6d  ager.    ** from
30fd0 20 74 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20   trying to read 
30fe0 74 68 65 20 70 61 67 65 73 20 63 6f 6e 74 65 6e  the pages conten
30ff0 74 20 66 72 6f 6d 20 64 69 73 6b 2e 20 48 6f 77  t from disk. How
31000 65 76 65 72 2c 20 69 66 20 74 68 65 0a 20 20 20  ever, if the.   
31010 20 2a 2a 20 63 75 72 72 65 6e 74 20 74 72 61 6e   ** current tran
31020 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65  saction has alre
31030 61 64 79 20 72 75 6e 20 6f 6e 65 20 6f 72 20 6d  ady run one or m
31040 6f 72 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d  ore incremental-
31050 76 61 63 75 75 6d 0a 20 20 20 20 2a 2a 20 73 74  vacuum.    ** st
31060 65 70 73 2c 20 74 68 65 6e 20 74 68 65 20 70 61  eps, then the pa
31070 67 65 20 77 65 20 61 72 65 20 61 62 6f 75 74 20  ge we are about 
31080 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 61 79 20  to allocate may 
31090 63 6f 6e 74 61 69 6e 20 63 6f 6e 74 65 6e 74 0a  contain content.
310a0 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20 72      ** that is r
310b0 65 71 75 69 72 65 64 20 69 6e 20 74 68 65 20 65  equired in the e
310c0 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  vent of a rollba
310d0 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ck. In this case
310e0 2c 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74 20  , do.    ** not 
310f0 73 65 74 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65  set the no-conte
31100 6e 74 20 66 6c 61 67 2e 20 54 68 69 73 20 63 61  nt flag. This ca
31110 75 73 65 73 20 74 68 65 20 70 61 67 65 72 20 74  uses the pager t
31120 6f 20 6c 6f 61 64 20 61 6e 64 20 6a 6f 75 72 6e  o load and journ
31130 61 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75  al.    ** the cu
31140 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e 74 65  rrent page conte
31150 6e 74 20 62 65 66 6f 72 65 20 6f 76 65 72 77 72  nt before overwr
31160 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a  iting it..    **
31170 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  .    ** Note tha
31180 74 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c  t the pager will
31190 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 61 74   not actually at
311a0 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20 6f 72  tempt to load or
311b0 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a   journal .    **
311c0 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79   content for any
311d0 20 70 61 67 65 20 74 68 61 74 20 72 65 61 6c 6c   page that reall
311e0 79 20 64 6f 65 73 20 6c 69 65 20 70 61 73 74 20  y does lie past 
311f0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64  the end of the d
31200 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66  atabase.    ** f
31210 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 53 6f 20  ile on disk. So 
31220 74 68 65 20 65 66 66 65 63 74 73 20 6f 66 20 64  the effects of d
31230 69 73 61 62 6c 69 6e 67 20 74 68 65 20 6e 6f 2d  isabling the no-
31240 63 6f 6e 74 65 6e 74 20 6f 70 74 69 6d 69 7a 61  content optimiza
31250 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 65 72 65  tion.    ** here
31260 20 61 72 65 20 63 6f 6e 66 69 6e 65 64 20 74 6f   are confined to
31270 20 74 68 6f 73 65 20 70 61 67 65 73 20 74 68 61   those pages tha
31280 74 20 6c 69 65 20 62 65 74 77 65 65 6e 20 74 68  t lie between th
31290 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20  e end of the.   
312a0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61   ** database ima
312b0 67 65 20 61 6e 64 20 74 68 65 20 65 6e 64 20 6f  ge and the end o
312c0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
312d0 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
312e0 69 6e 74 20 62 4e 6f 43 6f 6e 74 65 6e 74 20 3d  int bNoContent =
312f0 20 28 30 3d 3d 49 66 4e 6f 74 4f 6d 69 74 41 56   (0==IfNotOmitAV
31300 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74  (pBt->bDoTruncat
31310 65 29 29 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e  e))? PAGER_GET_N
31320 4f 43 4f 4e 54 45 4e 54 3a 30 3b 0a 0a 20 20 20  OCONTENT:0;..   
31330 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
31340 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61  erWrite(pBt->pPa
31350 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
31360 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
31370 72 6e 20 72 63 3b 0a 20 20 20 20 70 42 74 2d 3e  rn rc;.    pBt->
31380 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 69 66 28  nPage++;.    if(
31390 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e   pBt->nPage==PEN
313a0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
313b0 42 74 29 20 29 20 70 42 74 2d 3e 6e 50 61 67 65  Bt) ) pBt->nPage
313c0 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ++;..#ifndef SQL
313d0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
313e0 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d  UUM.    if( pBt-
313f0 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50  >autoVacuum && P
31400 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
31410 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 20 29 7b  , pBt->nPage) ){
31420 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a 70 50  .      /* If *pP
31430 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20 61 20  gno refers to a 
31440 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
31450 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e  , allocate two n
31460 65 77 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a  ew pages.      *
31470 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * at the end of 
31480 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65 61 64  the file instead
31490 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66 69 72   of one. The fir
314a0 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  st allocated pag
314b0 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d  e.      ** becom
314c0 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72  es a new pointer
314d0 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65 20 73  -map page, the s
314e0 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20 62 79  econd is used by
314f0 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20   the caller..   
31500 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50     */.      MemP
31510 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20  age *pPg = 0;.  
31520 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
31530 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e  CATE: %d from en
31540 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e 74  d of file (point
31550 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c  er-map page)\n",
31560 20 70 42 74 2d 3e 6e 50 61 67 65 29 29 3b 0a 20   pBt->nPage));. 
31570 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
31580 2d 3e 6e 50 61 67 65 21 3d 50 45 4e 44 49 4e 47  ->nPage!=PENDING
31590 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
315a0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74  );.      rc = bt
315b0 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65  reeGetUnusedPage
315c0 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65  (pBt, pBt->nPage
315d0 2c 20 26 70 50 67 2c 20 62 4e 6f 43 6f 6e 74 65  , &pPg, bNoConte
315e0 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  nt);.      if( r
315f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
31600 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
31610 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
31620 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  Pg->pDbPage);.  
31630 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
31640 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a  e(pPg);.      }.
31650 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
31660 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
31670 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20  pBt->nPage++;.  
31680 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61      if( pBt->nPa
31690 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ge==PENDING_BYTE
316a0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 20 70 42  _PAGE(pBt) ){ pB
316b0 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a 20 20  t->nPage++; }.  
316c0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70    }.#endif.    p
316d0 75 74 34 62 79 74 65 28 32 38 20 2b 20 28 75 38  ut4byte(28 + (u8
316e0 2a 29 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  *)pBt->pPage1->a
316f0 44 61 74 61 2c 20 70 42 74 2d 3e 6e 50 61 67 65  Data, pBt->nPage
31700 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20  );.    *pPgno = 
31710 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20 20 20  pBt->nPage;..   
31720 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21   assert( *pPgno!
31730 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
31740 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 72  GE(pBt) );.    r
31750 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73  c = btreeGetUnus
31760 65 64 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67  edPage(pBt, *pPg
31770 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62 4e 6f 43  no, ppPage, bNoC
31780 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 69 66 28  ontent);.    if(
31790 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
317a0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
317b0 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70  3PagerWrite((*pp
317c0 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b  Page)->pDbPage);
317d0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
317e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
317f0 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
31800 61 67 65 29 3b 0a 20 20 20 20 20 20 2a 70 70 50  age);.      *ppP
31810 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  age = 0;.    }. 
31820 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
31830 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64  ATE: %d from end
31840 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50   of file\n", *pP
31850 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73  gno));.  }..  as
31860 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45  sert( *pPgno!=PE
31870 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
31880 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c  pBt) );..end_all
31890 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20 72 65  ocate_page:.  re
318a0 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b  leasePage(pTrunk
318b0 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  );.  releasePage
318c0 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20  (pPrevTrunk);.  
318d0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
318e0 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33  TE_OK || sqlite3
318f0 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
31900 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  t((*ppPage)->pDb
31910 50 61 67 65 29 3c 3d 31 20 29 3b 0a 20 20 61 73  Page)<=1 );.  as
31920 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
31930 5f 4f 4b 20 7c 7c 20 28 2a 70 70 50 61 67 65 29  _OK || (*ppPage)
31940 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b 0a 20  ->isInit==0 );. 
31950 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
31960 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
31970 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 64  on is used to ad
31980 64 20 70 61 67 65 20 69 50 61 67 65 20 74 6f 20  d page iPage to 
31990 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
319a0 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a  e free-list. .**
319b0 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
319c0 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
319d0 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20 70 61  not already a pa
319e0 72 74 20 6f 66 20 74 68 65 20 66 72 65 65 2d 6c  rt of the free-l
319f0 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76  ist..**.** The v
31a00 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74  alue passed as t
31a10 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
31a20 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
31a30 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e  ion is optional.
31a40 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65  .** If the calle
31a50 72 20 68 61 70 70 65 6e 73 20 74 6f 20 68 61 76  r happens to hav
31a60 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
31a70 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63  he MemPage objec
31a80 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  t .** correspond
31a90 69 6e 67 20 74 6f 20 70 61 67 65 20 69 50 61 67  ing to page iPag
31aa0 65 20 68 61 6e 64 79 2c 20 69 74 20 6d 61 79 20  e handy, it may 
31ab0 70 61 73 73 20 69 74 20 61 73 20 74 68 65 20 73  pass it as the s
31ac0 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a 2a 2a  econd value. .**
31ad0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 6d   Otherwise, it m
31ae0 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a  ay pass NULL..**
31af0 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74 65 72  .** If a pointer
31b00 20 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 6f 62   to a MemPage ob
31b10 6a 65 63 74 20 69 73 20 70 61 73 73 65 64 20 61  ject is passed a
31b20 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
31b30 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20 72 65  ument,.** its re
31b40 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73  ference count is
31b50 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62 79 20   not altered by 
31b60 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
31b70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65  /.static int fre
31b80 65 50 61 67 65 32 28 42 74 53 68 61 72 65 64 20  ePage2(BtShared 
31b90 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70  *pBt, MemPage *p
31ba0 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20 69 50  MemPage, Pgno iP
31bb0 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  age){.  MemPage 
31bc0 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20  *pTrunk = 0;    
31bd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
31be0 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
31bf0 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 54  age */.  Pgno iT
31c00 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20  runk = 0;       
31c10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31c20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  Page number of f
31c30 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
31c40 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50 61 67  age */ .  MemPag
31c50 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d  e *pPage1 = pBt-
31c60 3e 70 50 61 67 65 31 3b 20 20 20 20 20 20 2f 2a  >pPage1;      /*
31c70 20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e 63 65   Local reference
31c80 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20 20   to page 1 */.  
31c90 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20  MemPage *pPage; 
31ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31cb0 20 20 20 20 2f 2a 20 50 61 67 65 20 62 65 69 6e      /* Page bein
31cc0 67 20 66 72 65 65 64 2e 20 4d 61 79 20 62 65 20  g freed. May be 
31cd0 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20 72  NULL. */.  int r
31ce0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
31cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31d00 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  * Return Code */
31d10 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20  .  int nFree;   
31d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d30 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
31d40 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
31d50 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74 20 2a  s on free-list *
31d60 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
31d70 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
31d80 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
31d90 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54   assert( CORRUPT
31da0 5f 44 42 20 7c 7c 20 69 50 61 67 65 3e 31 20 29  _DB || iPage>1 )
31db0 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 4d 65  ;.  assert( !pMe
31dc0 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50 61 67  mPage || pMemPag
31dd0 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65 20 29  e->pgno==iPage )
31de0 3b 0a 0a 20 20 69 66 28 20 69 50 61 67 65 3c 32  ;..  if( iPage<2
31df0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
31e00 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
31e10 20 69 66 28 20 70 4d 65 6d 50 61 67 65 20 29 7b   if( pMemPage ){
31e20 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 4d 65  .    pPage = pMe
31e30 6d 50 61 67 65 3b 0a 20 20 20 20 73 71 6c 69 74  mPage;.    sqlit
31e40 65 33 50 61 67 65 72 52 65 66 28 70 50 61 67 65  e3PagerRef(pPage
31e50 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 65  ->pDbPage);.  }e
31e60 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 20 3d  lse{.    pPage =
31e70 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70   btreePageLookup
31e80 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20  (pBt, iPage);.  
31e90 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  }..  /* Incremen
31ea0 74 20 74 68 65 20 66 72 65 65 20 70 61 67 65 20  t the free page 
31eb0 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65 31 20  count on pPage1 
31ec0 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
31ed0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
31ee0 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
31ef0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72  if( rc ) goto fr
31f00 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 6e 46  eepage_out;.  nF
31f10 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  ree = get4byte(&
31f20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
31f30 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  ]);.  put4byte(&
31f40 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
31f50 5d 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a 20 20  ], nFree+1);..  
31f60 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  if( pBt->btsFlag
31f70 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44  s & BTS_SECURE_D
31f80 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20  ELETE ){.    /* 
31f90 49 66 20 74 68 65 20 73 65 63 75 72 65 5f 64 65  If the secure_de
31fa0 6c 65 74 65 20 6f 70 74 69 6f 6e 20 69 73 20 65  lete option is e
31fb0 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20  nabled, then.   
31fc0 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c 79   ** always fully
31fd0 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74   overwrite delet
31fe0 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  ed information w
31ff0 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20 20 2a  ith zeros..    *
32000 2f 0a 20 20 20 20 69 66 28 20 28 21 70 50 61 67  /.    if( (!pPag
32010 65 20 26 26 20 28 28 72 63 20 3d 20 62 74 72 65  e && ((rc = btre
32020 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50  eGetPage(pBt, iP
32030 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29  age, &pPage, 0))
32040 21 3d 30 29 20 29 0a 20 20 20 20 20 7c 7c 20 20  !=0) ).     ||  
32050 20 20 20 20 20 20 20 20 20 20 28 28 72 63 20 3d            ((rc =
32060 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
32070 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
32080 65 29 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20  e))!=0).    ){. 
32090 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
320a0 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
320b0 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e    memset(pPage->
320c0 61 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 2d  aData, 0, pPage-
320d0 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b  >pBt->pageSize);
320e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
320f0 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f  e database suppo
32100 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c  rts auto-vacuum,
32110 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20   write an entry 
32120 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  in the pointer-m
32130 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63  ap.  ** to indic
32140 61 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ate that the pag
32150 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a  e is free..  */.
32160 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
32170 55 4d 20 29 7b 0a 20 20 20 20 70 74 72 6d 61 70  UM ){.    ptrmap
32180 50 75 74 28 70 42 74 2c 20 69 50 61 67 65 2c 20  Put(pBt, iPage, 
32190 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c  PTRMAP_FREEPAGE,
321a0 20 30 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66   0, &rc);.    if
321b0 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65  ( rc ) goto free
321c0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  page_out;.  }.. 
321d0 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75 6c 61   /* Now manipula
321e0 74 65 20 74 68 65 20 61 63 74 75 61 6c 20 64 61  te the actual da
321f0 74 61 62 61 73 65 20 66 72 65 65 2d 6c 69 73 74  tabase free-list
32200 20 73 74 72 75 63 74 75 72 65 2e 20 54 68 65 72   structure. Ther
32210 65 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a 20 70  e are two.  ** p
32220 6f 73 73 69 62 69 6c 69 74 69 65 73 2e 20 49 66  ossibilities. If
32230 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
32240 73 20 63 75 72 72 65 6e 74 6c 79 20 65 6d 70 74  s currently empt
32250 79 2c 20 6f 72 20 69 66 20 74 68 65 20 66 69 72  y, or if the fir
32260 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61  st.  ** trunk pa
32270 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  ge in the free-l
32280 69 73 74 20 69 73 20 66 75 6c 6c 2c 20 74 68 65  ist is full, the
32290 6e 20 74 68 69 73 20 70 61 67 65 20 77 69 6c 6c  n this page will
322a0 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e   become a.  ** n
322b0 65 77 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  ew free-list tru
322c0 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69  nk page. Otherwi
322d0 73 65 2c 20 69 74 20 77 69 6c 6c 20 62 65 63 6f  se, it will beco
322e0 6d 65 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65  me a leaf of the
322f0 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e  .  ** first trun
32300 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 75  k page in the cu
32310 72 72 65 6e 74 20 66 72 65 65 2d 6c 69 73 74 2e  rrent free-list.
32320 20 54 68 69 73 20 62 6c 6f 63 6b 20 74 65 73 74   This block test
32330 73 20 69 66 20 69 74 0a 20 20 2a 2a 20 69 73 20  s if it.  ** is 
32340 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20  possible to add 
32350 74 68 65 20 70 61 67 65 20 61 73 20 61 20 6e 65  the page as a ne
32360 77 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  w free-list leaf
32370 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46 72  ..  */.  if( nFr
32380 65 65 21 3d 30 20 29 7b 0a 20 20 20 20 75 33 32  ee!=0 ){.    u32
32390 20 6e 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20   nLeaf;         
323a0 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
323b0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66  l number of leaf
323c0 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b 20   cells on trunk 
323d0 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69 54 72  page */..    iTr
323e0 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
323f0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
32400 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72  ]);.    rc = btr
32410 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
32420 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20  Trunk, &pTrunk, 
32430 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
32440 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
32450 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
32460 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _out;.    }..   
32470 20 6e 4c 65 61 66 20 3d 20 67 65 74 34 62 79 74   nLeaf = get4byt
32480 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
32490 5b 34 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  [4]);.    assert
324a0 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
324b0 65 3e 33 32 20 29 3b 0a 20 20 20 20 69 66 28 20  e>32 );.    if( 
324c0 6e 4c 65 61 66 20 3e 20 28 75 33 32 29 70 42 74  nLeaf > (u32)pBt
324d0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  ->usableSize/4 -
324e0 20 32 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d   2 ){.      rc =
324f0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
32500 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
32510 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
32520 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4c 65     }.    if( nLe
32530 61 66 20 3c 20 28 75 33 32 29 70 42 74 2d 3e 75  af < (u32)pBt->u
32540 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20  sableSize/4 - 8 
32550 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74  ){.      /* In t
32560 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20 69  his case there i
32570 73 20 72 6f 6f 6d 20 6f 6e 20 74 68 65 20 74 72  s room on the tr
32580 75 6e 6b 20 70 61 67 65 20 74 6f 20 69 6e 73 65  unk page to inse
32590 72 74 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  rt the page.    
325a0 20 20 2a 2a 20 62 65 69 6e 67 20 66 72 65 65 64    ** being freed
325b0 20 61 73 20 61 20 6e 65 77 20 6c 65 61 66 2e 0a   as a new leaf..
325c0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
325d0 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
325e0 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f  trunk page is no
325f0 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e  t really full un
32600 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a  til it contains.
32610 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53        ** usableS
32620 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72 69 65  ize/4 - 2 entrie
32630 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a  s, not usableSiz
32640 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20  e/4 - 8 entries 
32650 61 73 20 77 65 20 68 61 76 65 0a 20 20 20 20 20  as we have.     
32660 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75 74 20   ** coded.  But 
32670 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20  due to a coding 
32680 65 72 72 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e  error in version
32690 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f  s of SQLite prio
326a0 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e  r to.      ** 3.
326b0 36 2e 30 2c 20 64 61 74 61 62 61 73 65 73 20 77  6.0, databases w
326c0 69 74 68 20 66 72 65 65 6c 69 73 74 20 74 72 75  ith freelist tru
326d0 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64 69 6e 67  nk pages holding
326e0 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 20   more than.     
326f0 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34   ** usableSize/4
32700 20 2d 20 38 20 65 6e 74 72 69 65 73 20 77 69 6c   - 8 entries wil
32710 6c 20 62 65 20 72 65 70 6f 72 74 65 64 20 61 73  l be reported as
32720 20 63 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f 72   corrupt.  In or
32730 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  der.      ** to 
32740 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b 77 61 72  maintain backwar
32750 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  ds compatibility
32760 20 77 69 74 68 20 6f 6c 64 65 72 20 76 65 72 73   with older vers
32770 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a  ions of SQLite,.
32780 20 20 20 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c        ** we will
32790 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 72 65 73   continue to res
327a0 74 72 69 63 74 20 74 68 65 20 6e 75 6d 62 65 72  trict the number
327b0 20 6f 66 20 65 6e 74 72 69 65 73 20 74 6f 20 75   of entries to u
327c0 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a  sableSize/4 - 8.
327d0 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77        ** for now
327e0 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74  .  At some point
327f0 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 28   in the future (
32800 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65 20 68 61  once everyone ha
32810 73 20 75 70 67 72 61 64 65 64 0a 20 20 20 20 20  s upgraded.     
32820 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20   ** to 3.6.0 or 
32830 6c 61 74 65 72 29 20 77 65 20 73 68 6f 75 6c 64  later) we should
32840 20 63 6f 6e 73 69 64 65 72 20 66 69 78 69 6e 67   consider fixing
32850 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c   the conditional
32860 20 61 62 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20   above.      ** 
32870 74 6f 20 72 65 61 64 20 22 75 73 61 62 6c 65 53  to read "usableS
32880 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65 61 64  ize/4-2" instead
32890 20 6f 66 20 22 75 73 61 62 6c 65 53 69 7a 65 2f   of "usableSize/
328a0 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  4-8"..      **. 
328b0 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45       ** EVIDENCE
328c0 2d 4f 46 3a 20 52 2d 31 39 39 32 30 2d 31 31 35  -OF: R-19920-115
328d0 37 36 20 48 6f 77 65 76 65 72 2c 20 6e 65 77 65  76 However, newe
328e0 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
328f0 4c 69 74 65 20 73 74 69 6c 6c 0a 20 20 20 20 20  Lite still.     
32900 20 2a 2a 20 61 76 6f 69 64 20 75 73 69 6e 67 20   ** avoid using 
32910 74 68 65 20 6c 61 73 74 20 73 69 78 20 65 6e 74  the last six ent
32920 72 69 65 73 20 69 6e 20 74 68 65 20 66 72 65 65  ries in the free
32930 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  list trunk page 
32940 61 72 72 61 79 20 69 6e 0a 20 20 20 20 20 20 2a  array in.      *
32950 2a 20 6f 72 64 65 72 20 74 68 61 74 20 64 61 74  * order that dat
32960 61 62 61 73 65 20 66 69 6c 65 73 20 63 72 65 61  abase files crea
32970 74 65 64 20 62 79 20 6e 65 77 65 72 20 76 65 72  ted by newer ver
32980 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
32990 63 61 6e 20 62 65 0a 20 20 20 20 20 20 2a 2a 20  can be.      ** 
329a0 72 65 61 64 20 62 79 20 6f 6c 64 65 72 20 76 65  read by older ve
329b0 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
329c0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
329d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
329e0 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
329f0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
32a00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
32a10 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74  K ){.        put
32a20 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
32a30 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31  Data[4], nLeaf+1
32a40 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  );.        put4b
32a50 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
32a60 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69  ta[8+nLeaf*4], i
32a70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
32a80 66 28 20 70 50 61 67 65 20 26 26 20 28 70 42 74  f( pPage && (pBt
32a90 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
32aa0 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29 3d  _SECURE_DELETE)=
32ab0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
32ac0 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
32ad0 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
32ae0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Page);.        }
32af0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74  .        rc = bt
32b00 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74  reeSetHasContent
32b10 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20  (pBt, iPage);.  
32b20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43      }.      TRAC
32b30 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25  E(("FREE-PAGE: %
32b40 64 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20  d leaf on trunk 
32b50 70 61 67 65 20 25 64 5c 6e 22 2c 70 50 61 67 65  page %d\n",pPage
32b60 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70  ->pgno,pTrunk->p
32b70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 67 6f 74  gno));.      got
32b80 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
32b90 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
32ba0 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73  If control flows
32bb0 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   to this point, 
32bc0 74 68 65 6e 20 69 74 20 77 61 73 20 6e 6f 74 20  then it was not 
32bd0 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20  possible to add 
32be0 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  the.  ** the pag
32bf0 65 20 62 65 69 6e 67 20 66 72 65 65 64 20 61 73  e being freed as
32c00 20 61 20 6c 65 61 66 20 70 61 67 65 20 6f 66 20   a leaf page of 
32c10 74 68 65 20 66 69 72 73 74 20 74 72 75 6e 6b 20  the first trunk 
32c20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
32c30 2e 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20  ..  ** Possibly 
32c40 62 65 63 61 75 73 65 20 74 68 65 20 66 72 65 65  because the free
32c50 2d 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2c 20  -list is empty, 
32c60 6f 72 20 70 6f 73 73 69 62 6c 79 20 62 65 63 61  or possibly beca
32c70 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 66 69  use the .  ** fi
32c80 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65  rst trunk in the
32c90 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75   free-list is fu
32ca0 6c 6c 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20  ll. Either way, 
32cb0 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66  the page being f
32cc0 72 65 65 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 62  reed.  ** will b
32cd0 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 66 69  ecome the new fi
32ce0 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69  rst trunk page i
32cf0 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  n the free-list.
32d00 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
32d10 65 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f  e==0 && SQLITE_O
32d20 4b 21 3d 28 72 63 20 3d 20 62 74 72 65 65 47 65  K!=(rc = btreeGe
32d30 74 50 61 67 65 28 70 42 74 2c 20 69 50 61 67 65  tPage(pBt, iPage
32d40 2c 20 26 70 50 61 67 65 2c 20 30 29 29 20 29 7b  , &pPage, 0)) ){
32d50 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61  .    goto freepa
32d60 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 72 63  ge_out;.  }.  rc
32d70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
32d80 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
32d90 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
32da0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
32db0 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
32dc0 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62 79  ut;.  }.  put4by
32dd0 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  te(pPage->aData,
32de0 20 69 54 72 75 6e 6b 29 3b 0a 20 20 70 75 74 34   iTrunk);.  put4
32df0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
32e00 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 70 75 74  ta[4], 0);.  put
32e10 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
32e20 44 61 74 61 5b 33 32 5d 2c 20 69 50 61 67 65 29  Data[32], iPage)
32e30 3b 0a 20 20 54 52 41 43 45 28 28 22 46 52 45 45  ;.  TRACE(("FREE
32e40 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20 74 72  -PAGE: %d new tr
32e50 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61 63 69  unk page replaci
32e60 6e 67 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d  ng %d\n", pPage-
32e70 3e 70 67 6e 6f 2c 20 69 54 72 75 6e 6b 29 29 3b  >pgno, iTrunk));
32e80 0a 0a 66 72 65 65 70 61 67 65 5f 6f 75 74 3a 0a  ..freepage_out:.
32e90 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20    if( pPage ){. 
32ea0 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
32eb0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 6c 65   = 0;.  }.  rele
32ec0 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
32ed0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
32ee0 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20  runk);.  return 
32ef0 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  rc;.}.static voi
32f00 64 20 66 72 65 65 50 61 67 65 28 4d 65 6d 50 61  d freePage(MemPa
32f10 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 2a  ge *pPage, int *
32f20 70 52 43 29 7b 0a 20 20 69 66 28 20 28 2a 70 52  pRC){.  if( (*pR
32f30 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  C)==SQLITE_OK ){
32f40 0a 20 20 20 20 2a 70 52 43 20 3d 20 66 72 65 65  .    *pRC = free
32f50 50 61 67 65 32 28 70 50 61 67 65 2d 3e 70 42 74  Page2(pPage->pBt
32f60 2c 20 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e  , pPage, pPage->
32f70 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  pgno);.  }.}../*
32f80 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f 76 65  .** Free any ove
32f90 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f  rflow pages asso
32fa0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
32fb0 67 69 76 65 6e 20 43 65 6c 6c 2e 20 20 57 72 69  given Cell.  Wri
32fc0 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 61 6c 20  te the.** local 
32fd0 43 65 6c 6c 20 73 69 7a 65 20 28 74 68 65 20 6e  Cell size (the n
32fe0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
32ff0 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  n the original p
33000 61 67 65 2c 20 6f 6d 69 74 74 69 6e 67 0a 2a 2a  age, omitting.**
33010 20 6f 76 65 72 66 6c 6f 77 29 20 69 6e 74 6f 20   overflow) into 
33020 2a 70 6e 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  *pnSize..*/.stat
33030 69 63 20 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c  ic int clearCell
33040 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
33050 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ge,          /* 
33060 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f  The page that co
33070 6e 74 61 69 6e 73 20 74 68 65 20 43 65 6c 6c 20  ntains the Cell 
33080 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
33090 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 2f 2a  ar *pCell,    /*
330a0 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   First byte of t
330b0 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 43 65 6c  he Cell */.  Cel
330c0 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
330d0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 69 6e        /* Size in
330e0 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
330f0 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 29 7b 0a 20  the cell */.){. 
33100 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
33110 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50   pPage->pBt;.  P
33120 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20  gno ovflPgno;.  
33130 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f  int rc;.  int nO
33140 76 66 6c 3b 0a 20 20 75 33 32 20 6f 76 66 6c 50  vfl;.  u32 ovflP
33150 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65  ageSize;..  asse
33160 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
33170 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
33180 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
33190 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
331a0 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70  (pPage, pCell, p
331b0 49 6e 66 6f 29 3b 0a 20 20 69 66 28 20 70 49 6e  Info);.  if( pIn
331c0 66 6f 2d 3e 6e 4c 6f 63 61 6c 3d 3d 70 49 6e 66  fo->nLocal==pInf
331d0 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20  o->nPayload ){. 
331e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
331f0 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72  _OK;  /* No over
33200 66 6c 6f 77 20 70 61 67 65 73 2e 20 52 65 74 75  flow pages. Retu
33210 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  rn without doing
33220 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d   anything */.  }
33230 0a 20 20 69 66 28 20 70 43 65 6c 6c 2b 70 49 6e  .  if( pCell+pIn
33240 66 6f 2d 3e 6e 53 69 7a 65 2d 31 20 3e 20 70 50  fo->nSize-1 > pP
33250 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65  age->aData+pPage
33260 2d 3e 6d 61 73 6b 50 61 67 65 20 29 7b 0a 20 20  ->maskPage ){.  
33270 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
33280 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 20 2f  CORRUPT_BKPT;  /
33290 2a 20 43 65 6c 6c 20 65 78 74 65 6e 64 73 20 70  * Cell extends p
332a0 61 73 74 20 65 6e 64 20 6f 66 20 70 61 67 65 20  ast end of page 
332b0 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e  */.  }.  ovflPgn
332c0 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65  o = get4byte(pCe
332d0 6c 6c 20 2b 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a  ll + pInfo->nSiz
332e0 65 20 2d 20 34 29 3b 0a 20 20 61 73 73 65 72 74  e - 4);.  assert
332f0 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
33300 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50  e > 4 );.  ovflP
33310 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  ageSize = pBt->u
33320 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20  sableSize - 4;. 
33330 20 6e 4f 76 66 6c 20 3d 20 28 70 49 6e 66 6f 2d   nOvfl = (pInfo-
33340 3e 6e 50 61 79 6c 6f 61 64 20 2d 20 70 49 6e 66  >nPayload - pInf
33350 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c  o->nLocal + ovfl
33360 50 61 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76  PageSize - 1)/ov
33370 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73  flPageSize;.  as
33380 73 65 72 74 28 20 6e 4f 76 66 6c 3e 30 20 7c 7c  sert( nOvfl>0 ||
33390 20 0a 20 20 20 20 28 43 4f 52 52 55 50 54 5f 44   .    (CORRUPT_D
333a0 42 20 26 26 20 28 70 49 6e 66 6f 2d 3e 6e 50 61  B && (pInfo->nPa
333b0 79 6c 6f 61 64 20 2b 20 6f 76 66 6c 50 61 67 65  yload + ovflPage
333c0 53 69 7a 65 29 3c 6f 76 66 6c 50 61 67 65 53 69  Size)<ovflPageSi
333d0 7a 65 29 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65  ze).  );.  while
333e0 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20  ( nOvfl-- ){.   
333f0 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30 3b   Pgno iNext = 0;
33400 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f  .    MemPage *pO
33410 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  vfl = 0;.    if(
33420 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f   ovflPgno<2 || o
33430 76 66 6c 50 67 6e 6f 3e 62 74 72 65 65 50 61 67  vflPgno>btreePag
33440 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20  ecount(pBt) ){. 
33450 20 20 20 20 20 2f 2a 20 30 20 69 73 20 6e 6f 74       /* 0 is not
33460 20 61 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75   a legal page nu
33470 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20 31 20  mber and page 1 
33480 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 0a 20 20  cannot be an .  
33490 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20      ** overflow 
334a0 70 61 67 65 2e 20 54 68 65 72 65 66 6f 72 65 20  page. Therefore 
334b0 69 66 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f 72  if ovflPgno<2 or
334c0 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
334d0 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 66   the .      ** f
334e0 69 6c 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ile the database
334f0 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
33500 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  . */.      retur
33510 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
33520 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
33530 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a 20 20   if( nOvfl ){.  
33540 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72      rc = getOver
33550 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6f 76  flowPage(pBt, ov
33560 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20  flPgno, &pOvfl, 
33570 26 69 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 69  &iNext);.      i
33580 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
33590 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  c;.    }..    if
335a0 28 20 28 20 70 4f 76 66 6c 20 7c 7c 20 28 28 70  ( ( pOvfl || ((p
335b0 4f 76 66 6c 20 3d 20 62 74 72 65 65 50 61 67 65  Ovfl = btreePage
335c0 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 6f 76 66 6c  Lookup(pBt, ovfl
335d0 50 67 6e 6f 29 29 21 3d 30 29 20 29 0a 20 20 20  Pgno))!=0) ).   
335e0 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65    && sqlite3Page
335f0 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 4f  rPageRefcount(pO
33600 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 21 3d 31  vfl->pDbPage)!=1
33610 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
33620 20 54 68 65 72 65 20 69 73 20 6e 6f 20 72 65 61   There is no rea
33630 73 6f 6e 20 61 6e 79 20 63 75 72 73 6f 72 20 73  son any cursor s
33640 68 6f 75 6c 64 20 68 61 76 65 20 61 6e 20 6f 75  hould have an ou
33650 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
33660 6e 63 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f  nce .      ** to
33670 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
33680 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61  e belonging to a
33690 20 63 65 6c 6c 20 74 68 61 74 20 69 73 20 62 65   cell that is be
336a0 69 6e 67 20 64 65 6c 65 74 65 64 2f 75 70 64 61  ing deleted/upda
336b0 74 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 53 6f  ted..      ** So
336c0 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73   if there exists
336d0 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72   more than one r
336e0 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 69 73  eference to this
336f0 20 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20 0a   page, then it .
33700 20 20 20 20 20 20 2a 2a 20 6d 75 73 74 20 6e 6f        ** must no
33710 74 20 72 65 61 6c 6c 79 20 62 65 20 61 6e 20 6f  t really be an o
33720 76 65 72 66 6c 6f 77 20 70 61 67 65 20 61 6e 64  verflow page and
33730 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   the database mu
33740 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20 0a  st be corrupt. .
33750 20 20 20 20 20 20 2a 2a 20 49 74 20 69 73 20 68        ** It is h
33760 65 6c 70 66 75 6c 20 74 6f 20 64 65 74 65 63 74  elpful to detect
33770 20 74 68 69 73 20 62 65 66 6f 72 65 20 63 61 6c   this before cal
33780 6c 69 6e 67 20 66 72 65 65 50 61 67 65 32 28 29  ling freePage2()
33790 2c 20 61 73 20 0a 20 20 20 20 20 20 2a 2a 20 66  , as .      ** f
337a0 72 65 65 50 61 67 65 32 28 29 20 6d 61 79 20 7a  reePage2() may z
337b0 65 72 6f 20 74 68 65 20 70 61 67 65 20 63 6f 6e  ero the page con
337c0 74 65 6e 74 73 20 69 66 20 73 65 63 75 72 65 2d  tents if secure-
337d0 64 65 6c 65 74 65 20 6d 6f 64 65 20 69 73 0a 20  delete mode is. 
337e0 20 20 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64 2e       ** enabled.
337f0 20 49 66 20 74 68 69 73 20 27 6f 76 65 72 66 6c   If this 'overfl
33800 6f 77 27 20 70 61 67 65 20 68 61 70 70 65 6e 73  ow' page happens
33810 20 74 6f 20 62 65 20 61 20 70 61 67 65 20 74 68   to be a page th
33820 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  at the.      ** 
33830 63 61 6c 6c 65 72 20 69 73 20 69 74 65 72 61 74  caller is iterat
33840 69 6e 67 20 74 68 72 6f 75 67 68 20 6f 72 20 75  ing through or u
33850 73 69 6e 67 20 69 6e 20 73 6f 6d 65 20 6f 74 68  sing in some oth
33860 65 72 20 77 61 79 2c 20 74 68 69 73 0a 20 20 20  er way, this.   
33870 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 70 72 6f     ** can be pro
33880 62 6c 65 6d 61 74 69 63 2e 0a 20 20 20 20 20 20  blematic..      
33890 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  */.      rc = SQ
338a0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
338b0 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  T;.    }else{.  
338c0 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
338d0 65 32 28 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f  e2(pBt, pOvfl, o
338e0 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a  vflPgno);.    }.
338f0 0a 20 20 20 20 69 66 28 20 70 4f 76 66 6c 20 29  .    if( pOvfl )
33900 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
33910 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d  agerUnref(pOvfl-
33920 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d  >pDbPage);.    }
33930 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
33940 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6f 76 66  turn rc;.    ovf
33950 6c 50 67 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a 20  lPgno = iNext;. 
33960 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
33970 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
33980 43 72 65 61 74 65 20 74 68 65 20 62 79 74 65 20  Create the byte 
33990 73 65 71 75 65 6e 63 65 20 75 73 65 64 20 74 6f  sequence used to
339a0 20 72 65 70 72 65 73 65 6e 74 20 61 20 63 65 6c   represent a cel
339b0 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65 0a  l on page pPage.
339c0 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68 61  ** and write tha
339d0 74 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20  t byte sequence 
339e0 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f  into pCell[].  O
339f0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72  verflow pages ar
33a00 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61  e.** allocated a
33a10 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20  nd filled in as 
33a20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 20  necessary.  The 
33a30 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72  calling procedur
33a40 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69  e.** is responsi
33a50 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73  ble for making s
33a60 75 72 65 20 73 75 66 66 69 63 69 65 6e 74 20 73  ure sufficient s
33a70 70 61 63 65 20 68 61 73 20 62 65 65 6e 20 61 6c  pace has been al
33a80 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70  located.** for p
33a90 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  Cell[]..**.** No
33aa0 74 65 20 74 68 61 74 20 70 43 65 6c 6c 20 64 6f  te that pCell do
33ab0 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  es not necessary
33ac0 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74   need to point t
33ad0 6f 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61  o the pPage->aDa
33ae0 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43 65  ta.** area.  pCe
33af0 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74  ll might point t
33b00 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79  o some temporary
33b10 20 73 74 6f 72 61 67 65 2e 20 20 54 68 65 20 63   storage.  The c
33b20 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63  ell will.** be c
33b30 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74 68  onstructed in th
33b40 69 73 20 74 65 6d 70 6f 72 61 72 79 20 61 72 65  is temporary are
33b50 61 20 74 68 65 6e 20 63 6f 70 69 65 64 20 69 6e  a then copied in
33b60 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a  to pPage->aData.
33b70 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61  ** later..*/.sta
33b80 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65  tic int fillInCe
33b90 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ll(.  MemPage *p
33ba0 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
33bb0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
33bc0 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
33bd0 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73  he cell */.  uns
33be0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c  igned char *pCel
33bf0 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  l,          /* C
33c00 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20  omplete text of 
33c10 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f  the cell */.  co
33c20 6e 73 74 20 42 74 72 65 65 50 61 79 6c 6f 61 64  nst BtreePayload
33c30 20 2a 70 58 2c 20 20 20 20 20 20 20 20 2f 2a 20   *pX,        /* 
33c40 50 61 79 6c 6f 61 64 20 77 69 74 68 20 77 68 69  Payload with whi
33c50 63 68 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20  ch to construct 
33c60 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  the cell */.  in
33c70 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20  t *pnSize       
33c80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33c90 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20  Write cell size 
33ca0 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
33cb0 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e   nPayload;.  con
33cc0 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69  st u8 *pSrc;.  i
33cd0 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a  nt nSrc, n, rc;.
33ce0 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b    int spaceLeft;
33cf0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66  .  MemPage *pOvf
33d00 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  l = 0;.  MemPage
33d10 20 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30   *pToRelease = 0
33d20 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
33d30 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73  r *pPrior;.  uns
33d40 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 61 79  igned char *pPay
33d50 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72 65 64  load;.  BtShared
33d60 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
33d70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f  Bt;.  Pgno pgnoO
33d80 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  vfl = 0;.  int n
33d90 48 65 61 64 65 72 3b 0a 0a 20 20 61 73 73 65 72  Header;..  asser
33da0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
33db0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
33dc0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
33dd0 2a 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20 6e  * pPage is not n
33de0 65 63 65 73 73 61 72 69 6c 79 20 77 72 69 74 65  ecessarily write
33df0 61 62 6c 65 20 73 69 6e 63 65 20 70 43 65 6c 6c  able since pCell
33e00 20 6d 69 67 68 74 20 62 65 20 61 75 78 69 6c 69   might be auxili
33e10 61 72 79 0a 20 20 2a 2a 20 62 75 66 66 65 72 20  ary.  ** buffer 
33e20 73 70 61 63 65 20 74 68 61 74 20 69 73 20 73 65  space that is se
33e30 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68 65 20  parate from the 
33e40 70 50 61 67 65 20 62 75 66 66 65 72 20 61 72 65  pPage buffer are
33e50 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  a */.  assert( p
33e60 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61 74  Cell<pPage->aDat
33e70 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50 61  a || pCell>=&pPa
33e80 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70  ge->aData[pBt->p
33e90 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20  ageSize].       
33ea0 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50       || sqlite3P
33eb0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
33ec0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
33ed0 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  );..  /* Fill in
33ee0 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a   the header. */.
33ef0 20 20 6e 48 65 61 64 65 72 20 3d 20 70 50 61 67    nHeader = pPag
33f00 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
33f10 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e  .  if( pPage->in
33f20 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e 50 61 79  tKey ){.    nPay
33f30 6c 6f 61 64 20 3d 20 70 58 2d 3e 6e 44 61 74 61  load = pX->nData
33f40 20 2b 20 70 58 2d 3e 6e 5a 65 72 6f 3b 0a 20 20   + pX->nZero;.  
33f50 20 20 70 53 72 63 20 3d 20 70 58 2d 3e 70 44 61    pSrc = pX->pDa
33f60 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 70  ta;.    nSrc = p
33f70 58 2d 3e 6e 44 61 74 61 3b 0a 20 20 20 20 61 73  X->nData;.    as
33f80 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74  sert( pPage->int
33f90 4b 65 79 4c 65 61 66 20 29 3b 20 2f 2a 20 66 69  KeyLeaf ); /* fi
33fa0 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e 6c 79 20  llInCell() only 
33fb0 63 61 6c 6c 65 64 20 66 6f 72 20 6c 65 61 76 65  called for leave
33fc0 73 20 2a 2f 0a 20 20 20 20 6e 48 65 61 64 65 72  s */.    nHeader
33fd0 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 33 32 28   += putVarint32(
33fe0 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c  &pCell[nHeader],
33ff0 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20   nPayload);.    
34000 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61  nHeader += putVa
34010 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61  rint(&pCell[nHea
34020 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 70 58  der], *(u64*)&pX
34030 2d 3e 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65  ->nKey);.  }else
34040 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 58  {.    assert( pX
34050 2d 3e 6e 4b 65 79 3c 3d 30 78 37 66 66 66 66 66  ->nKey<=0x7fffff
34060 66 66 20 26 26 20 70 58 2d 3e 70 4b 65 79 21 3d  ff && pX->pKey!=
34070 30 20 29 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20  0 );.    nSrc = 
34080 6e 50 61 79 6c 6f 61 64 20 3d 20 28 69 6e 74 29  nPayload = (int)
34090 70 58 2d 3e 6e 4b 65 79 3b 0a 20 20 20 20 70 53  pX->nKey;.    pS
340a0 72 63 20 3d 20 70 58 2d 3e 70 4b 65 79 3b 0a 20  rc = pX->pKey;. 
340b0 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75     nHeader += pu
340c0 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c  tVarint32(&pCell
340d0 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 50 61 79 6c  [nHeader], nPayl
340e0 6f 61 64 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  oad);.  }.  .  /
340f0 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 61  * Fill in the pa
34100 79 6c 6f 61 64 20 2a 2f 0a 20 20 69 66 28 20 6e  yload */.  if( n
34110 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e  Payload<=pPage->
34120 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
34130 6e 20 3d 20 6e 48 65 61 64 65 72 20 2b 20 6e 50  n = nHeader + nP
34140 61 79 6c 6f 61 64 3b 0a 20 20 20 20 74 65 73 74  ayload;.    test
34150 63 61 73 65 28 20 6e 3d 3d 33 20 29 3b 0a 20 20  case( n==3 );.  
34160 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 34    testcase( n==4
34170 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c 34 20   );.    if( n<4 
34180 29 20 6e 20 3d 20 34 3b 0a 20 20 20 20 2a 70 6e  ) n = 4;.    *pn
34190 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 73 70  Size = n;.    sp
341a0 61 63 65 4c 65 66 74 20 3d 20 6e 50 61 79 6c 6f  aceLeft = nPaylo
341b0 61 64 3b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d  ad;.    pPrior =
341c0 20 70 43 65 6c 6c 3b 0a 20 20 7d 65 6c 73 65 7b   pCell;.  }else{
341d0 0a 20 20 20 20 69 6e 74 20 6d 6e 20 3d 20 70 50  .    int mn = pP
341e0 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  age->minLocal;. 
341f0 20 20 20 6e 20 3d 20 6d 6e 20 2b 20 28 6e 50 61     n = mn + (nPa
34200 79 6c 6f 61 64 20 2d 20 6d 6e 29 20 25 20 28 70  yload - mn) % (p
34210 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
34220 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20  eSize - 4);.    
34230 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 70 50 61  testcase( n==pPa
34240 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  ge->maxLocal );.
34250 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d      testcase( n=
34260 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
34270 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 20  +1 );.    if( n 
34280 3e 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  > pPage->maxLoca
34290 6c 20 29 20 6e 20 3d 20 6d 6e 3b 0a 20 20 20 20  l ) n = mn;.    
342a0 73 70 61 63 65 4c 65 66 74 20 3d 20 6e 3b 0a 20  spaceLeft = n;. 
342b0 20 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 20 2b     *pnSize = n +
342c0 20 6e 48 65 61 64 65 72 20 2b 20 34 3b 0a 20 20   nHeader + 4;.  
342d0 20 20 70 50 72 69 6f 72 20 3d 20 26 70 43 65 6c    pPrior = &pCel
342e0 6c 5b 6e 48 65 61 64 65 72 2b 6e 5d 3b 0a 20 20  l[nHeader+n];.  
342f0 7d 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26  }.  pPayload = &
34300 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a  pCell[nHeader];.
34310 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f  .  /* At this po
34320 69 6e 74 20 76 61 72 69 61 62 6c 65 73 20 73 68  int variables sh
34330 6f 75 6c 64 20 62 65 20 73 65 74 20 61 73 20 66  ould be set as f
34340 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a  ollows:.  **.  *
34350 2a 20 20 20 6e 50 61 79 6c 6f 61 64 20 20 20 20  *   nPayload    
34360 20 20 20 20 20 20 20 54 6f 74 61 6c 20 70 61 79         Total pay
34370 6c 6f 61 64 20 73 69 7a 65 20 69 6e 20 62 79 74  load size in byt
34380 65 73 0a 20 20 2a 2a 20 20 20 70 50 61 79 6c 6f  es.  **   pPaylo
34390 61 64 20 20 20 20 20 20 20 20 20 20 20 42 65 67  ad           Beg
343a0 69 6e 20 77 72 69 74 69 6e 67 20 70 61 79 6c 6f  in writing paylo
343b0 61 64 20 68 65 72 65 0a 20 20 2a 2a 20 20 20 73  ad here.  **   s
343c0 70 61 63 65 4c 65 66 74 20 20 20 20 20 20 20 20  paceLeft        
343d0 20 20 53 70 61 63 65 20 61 76 61 69 6c 61 62 6c    Space availabl
343e0 65 20 61 74 20 70 50 61 79 6c 6f 61 64 2e 20 20  e at pPayload.  
343f0 49 66 20 6e 50 61 79 6c 6f 61 64 3e 73 70 61 63  If nPayload>spac
34400 65 4c 65 66 74 2c 0a 20 20 2a 2a 20 20 20 20 20  eLeft,.  **     
34410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34420 20 74 68 61 74 20 6d 65 61 6e 73 20 63 6f 6e 74   that means cont
34430 65 6e 74 20 6d 75 73 74 20 73 70 69 6c 6c 20 69  ent must spill i
34440 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  nto overflow pag
34450 65 73 2e 0a 20 20 2a 2a 20 20 20 2a 70 6e 53 69  es..  **   *pnSi
34460 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 53 69  ze            Si
34470 7a 65 20 6f 66 20 74 68 65 20 6c 6f 63 61 6c 20  ze of the local 
34480 63 65 6c 6c 20 28 6e 6f 74 20 63 6f 75 6e 74 69  cell (not counti
34490 6e 67 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ng overflow page
344a0 73 29 0a 20 20 2a 2a 20 20 20 70 50 72 69 6f 72  s).  **   pPrior
344b0 20 20 20 20 20 20 20 20 20 20 20 20 20 57 68 65               Whe
344c0 72 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  re to write the 
344d0 70 67 6e 6f 20 6f 66 20 74 68 65 20 66 69 72 73  pgno of the firs
344e0 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a  t overflow page.
344f0 20 20 2a 2a 0a 20 20 2a 2a 20 55 73 65 20 61 20    **.  ** Use a 
34500 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 50 61 72  call to btreePar
34510 73 65 43 65 6c 6c 50 74 72 28 29 20 74 6f 20 76  seCellPtr() to v
34520 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 76  erify that the v
34530 61 6c 75 65 73 20 61 62 6f 76 65 0a 20 20 2a 2a  alues above.  **
34540 20 77 65 72 65 20 63 6f 6d 70 75 74 65 64 20 63   were computed c
34550 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 23  orrectly..  */.#
34560 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  if SQLITE_DEBUG.
34570 20 20 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f    {.    CellInfo
34580 20 69 6e 66 6f 3b 0a 20 20 20 20 70 50 61 67 65   info;.    pPage
34590 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61  ->xParseCell(pPa
345a0 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
345b0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  );.    assert( n
345c0 48 65 61 64 65 72 3d 3d 28 69 6e 74 29 28 69 6e  Header==(int)(in
345d0 66 6f 2e 70 50 61 79 6c 6f 61 64 20 2d 20 70 43  fo.pPayload - pC
345e0 65 6c 6c 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ell) );.    asse
345f0 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 70  rt( info.nKey==p
34600 58 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20 20 20 61  X->nKey );.    a
34610 73 73 65 72 74 28 20 2a 70 6e 53 69 7a 65 20 3d  ssert( *pnSize =
34620 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a  = info.nSize );.
34630 20 20 20 20 61 73 73 65 72 74 28 20 73 70 61 63      assert( spac
34640 65 4c 65 66 74 20 3d 3d 20 69 6e 66 6f 2e 6e 4c  eLeft == info.nL
34650 6f 63 61 6c 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  ocal );.  }.#end
34660 69 66 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74  if..  /* Write t
34670 68 65 20 70 61 79 6c 6f 61 64 20 69 6e 74 6f 20  he payload into 
34680 74 68 65 20 6c 6f 63 61 6c 20 43 65 6c 6c 20 61  the local Cell a
34690 6e 64 20 61 6e 79 20 65 78 74 72 61 20 69 6e 74  nd any extra int
346a0 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
346b0 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 6e 50 61   */.  while( nPa
346c0 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20 20 69  yload>0 ){.    i
346d0 66 28 20 73 70 61 63 65 4c 65 66 74 3d 3d 30 20  f( spaceLeft==0 
346e0 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
346f0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
34700 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e  M.      Pgno pgn
34710 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f 76  oPtrmap = pgnoOv
34720 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20  fl; /* Overflow 
34730 70 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70  page pointer-map
34740 20 65 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a 20   entry page */. 
34750 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75       if( pBt->au
34760 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
34770 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20      do{.        
34780 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20    pgnoOvfl++;.  
34790 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20 0a        } while( .
347a0 20 20 20 20 20 20 20 20 20 20 50 54 52 4d 41 50            PTRMAP
347b0 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 67 6e  _ISPAGE(pBt, pgn
347c0 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76  oOvfl) || pgnoOv
347d0 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  fl==PENDING_BYTE
347e0 5f 50 41 47 45 28 70 42 74 29 20 0a 20 20 20 20  _PAGE(pBt) .    
347f0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23      );.      }.#
34800 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d  endif.      rc =
34810 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
34820 67 65 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20  ge(pBt, &pOvfl, 
34830 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f  &pgnoOvfl, pgnoO
34840 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66  vfl, 0);.#ifndef
34850 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
34860 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a  OVACUUM.      /*
34870 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
34880 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76   supports auto-v
34890 61 63 75 75 6d 2c 20 61 6e 64 20 74 68 65 20 73  acuum, and the s
348a0 65 63 6f 6e 64 20 6f 72 20 73 75 62 73 65 71 75  econd or subsequ
348b0 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65  ent.      ** ove
348c0 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 62 65  rflow page is be
348d0 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61  ing allocated, a
348e0 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74  dd an entry to t
348f0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
34900 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 61 74       ** for that
34910 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20 20 20 20   page now. .    
34920 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
34930 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
34940 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  st overflow page
34950 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 70  , then write a p
34960 61 72 74 69 61 6c 20 65 6e 74 72 79 20 0a 20 20  artial entry .  
34970 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 6f      ** to the po
34980 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66 20 77 65  inter-map. If we
34990 20 77 72 69 74 65 20 6e 6f 74 68 69 6e 67 20 74   write nothing t
349a0 6f 20 74 68 69 73 20 70 6f 69 6e 74 65 72 2d 6d  o this pointer-m
349b0 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20 20 20 2a  ap slot,.      *
349c0 2a 20 74 68 65 6e 20 74 68 65 20 6f 70 74 69 6d  * then the optim
349d0 69 73 74 69 63 20 6f 76 65 72 66 6c 6f 77 20 63  istic overflow c
349e0 68 61 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  hain processing 
349f0 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28 29 0a 20  in clearCell(). 
34a00 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 69 73 69       ** may misi
34a10 6e 74 65 72 70 72 65 74 20 74 68 65 20 75 6e 69  nterpret the uni
34a20 6e 69 74 69 61 6c 69 7a 65 64 20 76 61 6c 75 65  nitialized value
34a30 73 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  s and delete the
34a40 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f 6e 67 20  .      ** wrong 
34a50 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20 64  pages from the d
34a60 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a  atabase..      *
34a70 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  /.      if( pBt-
34a80 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 72  >autoVacuum && r
34a90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
34aa0 20 20 20 20 20 20 20 20 75 38 20 65 54 79 70 65          u8 eType
34ab0 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61 70 3f 50   = (pgnoPtrmap?P
34ac0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a  TRMAP_OVERFLOW2:
34ad0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
34ae0 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61  );.        ptrma
34af0 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76  pPut(pBt, pgnoOv
34b00 66 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f 50  fl, eType, pgnoP
34b10 74 72 6d 61 70 2c 20 26 72 63 29 3b 0a 20 20 20  trmap, &rc);.   
34b20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
34b30 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
34b40 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20  Page(pOvfl);.   
34b50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
34b60 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
34b70 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  rc ){.        re
34b80 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c  leasePage(pToRel
34b90 65 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72  ease);.        r
34ba0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
34bb0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70  }..      /* If p
34bc0 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74  ToRelease is not
34bd0 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 72 69 6f   zero than pPrio
34be0 72 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68  r points into th
34bf0 65 20 64 61 74 61 20 61 72 65 61 0a 20 20 20 20  e data area.    
34c00 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61    ** of pToRelea
34c10 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70  se.  Make sure p
34c20 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74 69  ToRelease is sti
34c30 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f  ll writeable. */
34c40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
34c50 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20  ToRelease==0 || 
34c60 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
34c70 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61  iteable(pToRelea
34c80 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  se->pDbPage) );.
34c90 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 50 72  .      /* If pPr
34ca0 69 6f 72 20 69 73 20 70 61 72 74 20 6f 66 20 74  ior is part of t
34cb0 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 20  he data area of 
34cc0 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65  pPage, then make
34cd0 20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20 20   sure pPage.    
34ce0 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72    ** is still wr
34cf0 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  iteable */.     
34d00 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 3c   assert( pPrior<
34d10 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20  pPage->aData || 
34d20 70 50 72 69 6f 72 3e 3d 26 70 50 61 67 65 2d 3e  pPrior>=&pPage->
34d30 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53  aData[pBt->pageS
34d40 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20  ize].           
34d50 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
34d60 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
34d70 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
34d80 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
34d90 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29  Prior, pgnoOvfl)
34da0 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  ;.      releaseP
34db0 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b  age(pToRelease);
34dc0 0a 20 20 20 20 20 20 70 54 6f 52 65 6c 65 61 73  .      pToReleas
34dd0 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20 20  e = pOvfl;.     
34de0 20 70 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c 2d   pPrior = pOvfl-
34df0 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 70 75  >aData;.      pu
34e00 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 30  t4byte(pPrior, 0
34e10 29 3b 0a 20 20 20 20 20 20 70 50 61 79 6c 6f 61  );.      pPayloa
34e20 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61 74  d = &pOvfl->aDat
34e30 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70 61 63  a[4];.      spac
34e40 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75 73 61  eLeft = pBt->usa
34e50 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20  bleSize - 4;.   
34e60 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c   }.    n = nPayl
34e70 6f 61 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73  oad;.    if( n>s
34e80 70 61 63 65 4c 65 66 74 20 29 20 6e 20 3d 20 73  paceLeft ) n = s
34e90 70 61 63 65 4c 65 66 74 3b 0a 0a 20 20 20 20 2f  paceLeft;..    /
34ea0 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20  * If pToRelease 
34eb0 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e  is not zero than
34ec0 20 70 50 61 79 6c 6f 61 64 20 70 6f 69 6e 74 73   pPayload points
34ed0 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61   into the data a
34ee0 72 65 61 0a 20 20 20 20 2a 2a 20 6f 66 20 70 54  rea.    ** of pT
34ef0 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20  oRelease.  Make 
34f00 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20  sure pToRelease 
34f10 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
34f20 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  le. */.    asser
34f30 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30  t( pToRelease==0
34f40 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
34f50 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52  Iswriteable(pToR
34f60 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29  elease->pDbPage)
34f70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70   );..    /* If p
34f80 50 61 79 6c 6f 61 64 20 69 73 20 70 61 72 74 20  Payload is part 
34f90 6f 66 20 74 68 65 20 64 61 74 61 20 61 72 65 61  of the data area
34fa0 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20   of pPage, then 
34fb0 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a  make sure pPage.
34fc0 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20      ** is still 
34fd0 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20  writeable */.   
34fe0 20 61 73 73 65 72 74 28 20 70 50 61 79 6c 6f 61   assert( pPayloa
34ff0 64 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c  d<pPage->aData |
35000 7c 20 70 50 61 79 6c 6f 61 64 3e 3d 26 70 50 61  | pPayload>=&pPa
35010 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70  ge->aData[pBt->p
35020 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20  ageSize].       
35030 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50       || sqlite3P
35040 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
35050 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
35060 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53 72 63  );..    if( nSrc
35070 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  >0 ){.      if( 
35080 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20 6e 53 72  n>nSrc ) n = nSr
35090 63 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  c;.      assert(
350a0 20 70 53 72 63 20 29 3b 0a 20 20 20 20 20 20 6d   pSrc );.      m
350b0 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20  emcpy(pPayload, 
350c0 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65  pSrc, n);.    }e
350d0 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  lse{.      memse
350e0 74 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c 20 6e  t(pPayload, 0, n
350f0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61  );.    }.    nPa
35100 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20 20  yload -= n;.    
35110 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20  pPayload += n;. 
35120 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20 20     pSrc += n;.  
35130 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20 20    nSrc -= n;.   
35140 20 73 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e 3b   spaceLeft -= n;
35150 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61  .  }.  releasePa
35160 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a  ge(pToRelease);.
35170 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
35180 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d  OK;.}../*.** Rem
35190 6f 76 65 20 74 68 65 20 69 2d 74 68 20 63 65 6c  ove the i-th cel
351a0 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 20 20 54  l from pPage.  T
351b0 68 69 73 20 72 6f 75 74 69 6e 65 20 65 66 66 65  his routine effe
351c0 63 74 73 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a  cts pPage only..
351d0 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74  ** The cell cont
351e0 65 6e 74 20 69 73 20 6e 6f 74 20 66 72 65 65 64  ent is not freed
351f0 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e   or deallocated.
35200 20 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20    It is assumed 
35210 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c  that.** the cell
35220 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62 65 65   content has bee
35230 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61  n copied somepla
35240 63 65 20 65 6c 73 65 2e 20 20 54 68 69 73 20 72  ce else.  This r
35250 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72  outine just.** r
35260 65 6d 6f 76 65 73 20 74 68 65 20 72 65 66 65 72  emoves the refer
35270 65 6e 63 65 20 74 6f 20 74 68 65 20 63 65 6c 6c  ence to the cell
35280 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a   from pPage..**.
35290 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20 62 65 20  ** "sz" must be 
352a0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
352b0 74 65 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e  tes in the cell.
352c0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
352d0 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61 67 65  dropCell(MemPage
352e0 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 64 78   *pPage, int idx
352f0 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74 20 2a 70  , int sz, int *p
35300 52 43 29 7b 0a 20 20 75 33 32 20 70 63 3b 20 20  RC){.  u32 pc;  
35310 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
35320 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74   to cell content
35330 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67 20 64   of cell being d
35340 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a  eleted */.  u8 *
35350 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 70  data;       /* p
35360 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20  Page->aData */. 
35370 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20   u8 *ptr;       
35380 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76 65   /* Used to move
35390 20 62 79 74 65 73 20 61 72 6f 75 6e 64 20 77 69   bytes around wi
353a0 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  thin data[] */. 
353b0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
353c0 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63   /* The return c
353d0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72  ode */.  int hdr
353e0 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69  ;        /* Begi
353f0 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 68 65 61  nning of the hea
35400 64 65 72 2e 20 20 30 20 6d 6f 73 74 20 70 61 67  der.  0 most pag
35410 65 73 2e 20 20 31 30 30 20 70 61 67 65 20 31 20  es.  100 page 1 
35420 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29  */..  if( *pRC )
35430 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
35440 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78  t( idx>=0 && idx
35450 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
35460 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
35470 50 54 5f 44 42 20 7c 7c 20 73 7a 3d 3d 63 65 6c  PT_DB || sz==cel
35480 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78  lSize(pPage, idx
35490 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
354a0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
354b0 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
354c0 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
354d0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
354e0 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
354f0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64  t->mutex) );.  d
35500 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
35510 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 70 50 61  ta;.  ptr = &pPa
35520 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 69  ge->aCellIdx[2*i
35530 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32  dx];.  pc = get2
35540 62 79 74 65 28 70 74 72 29 3b 0a 20 20 68 64 72  byte(ptr);.  hdr
35550 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
35560 73 65 74 3b 0a 20 20 74 65 73 74 63 61 73 65 28  set;.  testcase(
35570 20 70 63 3d 3d 67 65 74 32 62 79 74 65 28 26 64   pc==get2byte(&d
35580 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20  ata[hdr+5]) );. 
35590 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a   testcase( pc+sz
355a0 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  ==pPage->pBt->us
355b0 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 69 66  ableSize );.  if
355c0 28 20 70 63 20 3c 20 28 75 33 32 29 67 65 74 32  ( pc < (u32)get2
355d0 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
355e0 5d 29 20 7c 7c 20 70 63 2b 73 7a 20 3e 20 70 50  ]) || pc+sz > pP
355f0 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
35600 53 69 7a 65 20 29 7b 0a 20 20 20 20 2a 70 52 43  Size ){.    *pRC
35610 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
35620 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  T_BKPT;.    retu
35630 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66  rn;.  }.  rc = f
35640 72 65 65 53 70 61 63 65 28 70 50 61 67 65 2c 20  reeSpace(pPage, 
35650 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20 72  pc, sz);.  if( r
35660 63 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  c ){.    *pRC = 
35670 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  rc;.    return;.
35680 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65    }.  pPage->nCe
35690 6c 6c 2d 2d 3b 0a 20 20 69 66 28 20 70 50 61 67  ll--;.  if( pPag
356a0 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20  e->nCell==0 ){. 
356b0 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b     memset(&data[
356c0 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20  hdr+1], 0, 4);. 
356d0 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d     data[hdr+7] =
356e0 20 30 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65   0;.    put2byte
356f0 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70  (&data[hdr+5], p
35700 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
35710 65 53 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67  eSize);.    pPag
35720 65 2d 3e 6e 46 72 65 65 20 3d 20 70 50 61 67 65  e->nFree = pPage
35730 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
35740 65 20 2d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  e - pPage->hdrOf
35750 66 73 65 74 0a 20 20 20 20 20 20 20 20 20 20 20  fset.           
35760 20 20 20 20 20 20 20 20 20 20 20 20 2d 20 70 50              - pP
35770 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
35780 65 20 2d 20 38 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e - 8;.  }else{.
35790 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 74 72 2c      memmove(ptr,
357a0 20 70 74 72 2b 32 2c 20 32 2a 28 70 50 61 67 65   ptr+2, 2*(pPage
357b0 2d 3e 6e 43 65 6c 6c 20 2d 20 69 64 78 29 29 3b  ->nCell - idx));
357c0 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
357d0 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67  ata[hdr+3], pPag
357e0 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 20 20 70  e->nCell);.    p
357f0 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32  Page->nFree += 2
35800 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
35810 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c  nsert a new cell
35820 20 6f 6e 20 70 50 61 67 65 20 61 74 20 63 65 6c   on pPage at cel
35830 6c 20 69 6e 64 65 78 20 22 69 22 2e 20 20 70 43  l index "i".  pC
35840 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ell points to th
35850 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20  e.** content of 
35860 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20  the cell..**.** 
35870 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  If the cell cont
35880 65 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20  ent will fit on 
35890 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 70  the page, then p
358a0 75 74 20 69 74 20 74 68 65 72 65 2e 20 20 49 66  ut it there.  If
358b0 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20   it.** will not 
358c0 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61  fit, then make a
358d0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 65 6c   copy of the cel
358e0 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70  l content into p
358f0 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70  Temp if.** pTemp
35900 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52   is not null.  R
35910 65 67 61 72 64 6c 65 73 73 20 6f 66 20 70 54 65  egardless of pTe
35920 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e  mp, allocate a n
35930 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70  ew entry.** in p
35940 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 5d 20 61  Page->apOvfl[] a
35950 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74  nd make it point
35960 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
35970 74 65 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a 20  tent (either.** 
35980 69 6e 20 70 54 65 6d 70 20 6f 72 20 74 68 65 20  in pTemp or the 
35990 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20  original pCell) 
359a0 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72 64 20  and also record 
359b0 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41  its index. .** A
359c0 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20  llocating a new 
359d0 65 6e 74 72 79 20 69 6e 20 70 50 61 67 65 2d 3e  entry in pPage->
359e0 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20  aCell[] implies 
359f0 74 68 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e  that .** pPage->
35a00 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20 69 6e 63  nOverflow is inc
35a10 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  remented..**.** 
35a20 2a 70 52 43 20 6d 75 73 74 20 62 65 20 53 51 4c  *pRC must be SQL
35a30 49 54 45 5f 4f 4b 20 77 68 65 6e 20 74 68 69 73  ITE_OK when this
35a40 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
35a50 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
35a60 69 64 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20  id insertCell(. 
35a70 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
35a80 20 20 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20     /* Page into 
35a90 77 68 69 63 68 20 77 65 20 61 72 65 20 63 6f 70  which we are cop
35aa0 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  ying */.  int i,
35ab0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
35ac0 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20  ew cell becomes 
35ad0 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66  the i-th cell of
35ae0 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75   the page */.  u
35af0 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  8 *pCell,       
35b00 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74   /* Content of t
35b10 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20  he new cell */. 
35b20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20 20 20 20   int sz,        
35b30 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 63     /* Bytes of c
35b40 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20  ontent in pCell 
35b50 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c 20  */.  u8 *pTemp, 
35b60 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73         /* Temp s
35b70 74 6f 72 61 67 65 20 73 70 61 63 65 20 66 6f 72  torage space for
35b80 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65   pCell, if neede
35b90 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69  d */.  Pgno iChi
35ba0 6c 64 2c 20 20 20 20 20 20 2f 2a 20 49 66 20 6e  ld,      /* If n
35bb0 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70 6c 61 63 65  on-zero, replace
35bc0 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 77   first 4 bytes w
35bd0 69 74 68 20 74 68 69 73 20 76 61 6c 75 65 20 2a  ith this value *
35be0 2f 0a 20 20 69 6e 74 20 2a 70 52 43 20 20 20 20  /.  int *pRC    
35bf0 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 61 6e        /* Read an
35c00 64 20 77 72 69 74 65 20 72 65 74 75 72 6e 20 63  d write return c
35c10 6f 64 65 20 66 72 6f 6d 20 68 65 72 65 20 2a 2f  ode from here */
35c20 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78 20 3d 20  .){.  int idx = 
35c30 30 3b 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65  0;      /* Where
35c40 20 74 6f 20 77 72 69 74 65 20 6e 65 77 20 63 65   to write new ce
35c50 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64 61  ll content in da
35c60 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b  ta[] */.  int j;
35c70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
35c80 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
35c90 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
35ca0 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e     /* The conten
35cb0 74 20 6f 66 20 74 68 65 20 77 68 6f 6c 65 20 70  t of the whole p
35cc0 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 49 6e  age */.  u8 *pIn
35cd0 73 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  s;         /* Th
35ce0 65 20 70 6f 69 6e 74 20 69 6e 20 70 50 61 67 65  e point in pPage
35cf0 2d 3e 61 43 65 6c 6c 49 64 78 5b 5d 20 77 68 65  ->aCellIdx[] whe
35d00 72 65 20 6e 6f 20 63 65 6c 6c 20 69 6e 73 65 72  re no cell inser
35d10 74 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ted */..  assert
35d20 28 20 2a 70 52 43 3d 3d 53 51 4c 49 54 45 5f 4f  ( *pRC==SQLITE_O
35d30 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  K );.  assert( i
35d40 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61 67 65 2d  >=0 && i<=pPage-
35d50 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f  >nCell+pPage->nO
35d60 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73  verflow );.  ass
35d70 65 72 74 28 20 4d 58 5f 43 45 4c 4c 28 70 50 61  ert( MX_CELL(pPa
35d80 67 65 2d 3e 70 42 74 29 3c 3d 31 30 39 32 31 20  ge->pBt)<=10921 
35d90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
35da0 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45  ge->nCell<=MX_CE
35db0 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 20 7c  LL(pPage->pBt) |
35dc0 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
35dd0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
35de0 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41 72 72 61  >nOverflow<=Arra
35df0 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f  ySize(pPage->apO
35e00 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74  vfl) );.  assert
35e10 28 20 41 72 72 61 79 53 69 7a 65 28 70 50 61 67  ( ArraySize(pPag
35e20 65 2d 3e 61 70 4f 76 66 6c 29 3d 3d 41 72 72 61  e->apOvfl)==Arra
35e30 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 69 4f  ySize(pPage->aiO
35e40 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74  vfl) );.  assert
35e50 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
35e60 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
35e70 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20  >mutex) );.  /* 
35e80 54 68 65 20 63 65 6c 6c 20 73 68 6f 75 6c 64 20  The cell should 
35e90 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 73 69 7a 65  normally be size
35ea0 64 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 48 6f  d correctly.  Ho
35eb0 77 65 76 65 72 2c 20 77 68 65 6e 20 6d 6f 76 69  wever, when movi
35ec0 6e 67 20 61 0a 20 20 2a 2a 20 6d 61 6c 66 6f 72  ng a.  ** malfor
35ed0 6d 65 64 20 63 65 6c 6c 20 66 72 6f 6d 20 61 20  med cell from a 
35ee0 6c 65 61 66 20 70 61 67 65 20 74 6f 20 61 6e 20  leaf page to an 
35ef0 69 6e 74 65 72 69 6f 72 20 70 61 67 65 2c 20 69  interior page, i
35f00 66 20 74 68 65 20 63 65 6c 6c 20 73 69 7a 65 0a  f the cell size.
35f10 20 20 2a 2a 20 77 61 6e 74 65 64 20 74 6f 20 62    ** wanted to b
35f20 65 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62 75  e less than 4 bu
35f30 74 20 67 6f 74 20 72 6f 75 6e 64 65 64 20 75 70  t got rounded up
35f40 20 74 6f 20 34 20 6f 6e 20 74 68 65 20 6c 65 61   to 4 on the lea
35f50 66 2c 20 74 68 65 6e 20 73 69 7a 65 0a 20 20 2a  f, then size.  *
35f60 2a 20 6d 69 67 68 74 20 62 65 20 6c 65 73 73 20  * might be less 
35f70 74 68 61 6e 20 38 20 28 6c 65 61 66 2d 73 69 7a  than 8 (leaf-siz
35f80 65 20 2b 20 70 6f 69 6e 74 65 72 29 20 6f 6e 20  e + pointer) on 
35f90 74 68 65 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64  the interior nod
35fa0 65 2e 20 20 48 65 6e 63 65 0a 20 20 2a 2a 20 74  e.  Hence.  ** t
35fb0 68 65 20 74 65 72 6d 20 61 66 74 65 72 20 74 68  he term after th
35fc0 65 20 7c 7c 20 69 6e 20 74 68 65 20 66 6f 6c 6c  e || in the foll
35fd0 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20  owing assert(). 
35fe0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d  */.  assert( sz=
35ff0 3d 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a  =pPage->xCellSiz
36000 65 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 20  e(pPage, pCell) 
36010 7c 7c 20 28 73 7a 3d 3d 38 20 26 26 20 69 43 68  || (sz==8 && iCh
36020 69 6c 64 3e 30 29 20 29 3b 0a 20 20 69 66 28 20  ild>0) );.  if( 
36030 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
36040 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e   || sz+2>pPage->
36050 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 69 66 28  nFree ){.    if(
36060 20 70 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20   pTemp ){.      
36070 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c 20 70 43  memcpy(pTemp, pC
36080 65 6c 6c 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20  ell, sz);.      
36090 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20  pCell = pTemp;. 
360a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 68     }.    if( iCh
360b0 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74  ild ){.      put
360c0 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 43 68  4byte(pCell, iCh
360d0 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ild);.    }.    
360e0 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  j = pPage->nOver
360f0 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 2f 2a 20 43  flow++;.    /* C
36100 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73  omparison agains
36110 74 20 41 72 72 61 79 53 69 7a 65 2d 31 20 73 69  t ArraySize-1 si
36120 6e 63 65 20 77 65 20 68 6f 6c 64 20 62 61 63 6b  nce we hold back
36130 20 6f 6e 65 20 65 78 74 72 61 20 73 6c 6f 74 0a   one extra slot.
36140 20 20 20 20 2a 2a 20 61 73 20 61 20 63 6f 6e 74      ** as a cont
36150 69 6e 67 65 6e 63 79 2e 20 20 49 6e 20 6f 74 68  ingency.  In oth
36160 65 72 20 77 6f 72 64 73 2c 20 6e 65 76 65 72 20  er words, never 
36170 6e 65 65 64 20 6d 6f 72 65 20 74 68 61 6e 20 33  need more than 3
36180 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 2a 2a   overflow.    **
36190 20 73 6c 6f 74 73 20 62 75 74 20 34 20 61 72 65   slots but 4 are
361a0 20 61 6c 6c 6f 63 61 74 65 64 2c 20 6a 75 73 74   allocated, just
361b0 20 74 6f 20 62 65 20 73 61 66 65 2e 20 2a 2f 0a   to be safe. */.
361c0 20 20 20 20 61 73 73 65 72 74 28 20 6a 20 3c 20      assert( j < 
361d0 41 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d  ArraySize(pPage-
361e0 3e 61 70 4f 76 66 6c 29 2d 31 20 29 3b 0a 20 20  >apOvfl)-1 );.  
361f0 20 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b    pPage->apOvfl[
36200 6a 5d 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20  j] = pCell;.    
36210 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 5d  pPage->aiOvfl[j]
36220 20 3d 20 28 75 31 36 29 69 3b 0a 0a 20 20 20 20   = (u16)i;..    
36230 2f 2a 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65  /* When multiple
36240 20 6f 76 65 72 66 6c 6f 77 73 20 6f 63 63 75 72   overflows occur
36250 2c 20 74 68 65 79 20 61 72 65 20 61 6c 77 61 79  , they are alway
36260 73 20 73 65 71 75 65 6e 74 69 61 6c 20 61 6e 64  s sequential and
36270 20 69 6e 0a 20 20 20 20 2a 2a 20 73 6f 72 74 65   in.    ** sorte
36280 64 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20 69  d order.  This i
36290 6e 76 61 72 69 61 6e 74 73 20 61 72 69 73 65 20  nvariants arise 
362a0 62 65 63 61 75 73 65 20 6d 75 6c 74 69 70 6c 65  because multiple
362b0 20 6f 76 65 72 66 6c 6f 77 73 20 63 61 6e 0a 20   overflows can. 
362c0 20 20 20 2a 2a 20 6f 6e 6c 79 20 6f 63 63 75 72     ** only occur
362d0 20 77 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 20   when inserting 
362e0 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e  divider cells in
362f0 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  to the parent pa
36300 67 65 20 64 75 72 69 6e 67 0a 20 20 20 20 2a 2a  ge during.    **
36310 20 62 61 6c 61 6e 63 69 6e 67 2c 20 61 6e 64 20   balancing, and 
36320 74 68 65 20 64 69 76 69 64 65 72 73 20 61 72 65  the dividers are
36330 20 61 64 6a 61 63 65 6e 74 20 61 6e 64 20 73 6f   adjacent and so
36340 72 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rted..    */.   
36350 20 61 73 73 65 72 74 28 20 6a 3d 3d 30 20 7c 7c   assert( j==0 ||
36360 20 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a   pPage->aiOvfl[j
36370 2d 31 5d 3c 28 75 31 36 29 69 20 29 3b 20 2f 2a  -1]<(u16)i ); /*
36380 20 4f 76 65 72 66 6c 6f 77 73 20 69 6e 20 73 6f   Overflows in so
36390 72 74 65 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20  rted order */.  
363a0 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 30 20 7c    assert( j==0 |
363b0 7c 20 69 3d 3d 70 50 61 67 65 2d 3e 61 69 4f 76  | i==pPage->aiOv
363c0 66 6c 5b 6a 2d 31 5d 2b 31 20 29 3b 20 20 20 2f  fl[j-1]+1 );   /
363d0 2a 20 4f 76 65 72 66 6c 6f 77 73 20 61 72 65 20  * Overflows are 
363e0 73 65 71 75 65 6e 74 69 61 6c 20 2a 2f 0a 20 20  sequential */.  
363f0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72  }else{.    int r
36400 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
36410 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
36420 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
36430 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
36440 20 20 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b        *pRC = rc;
36450 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
36460 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
36470 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
36480 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
36490 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20  pDbPage) );.    
364a0 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
364b0 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ata;.    assert(
364c0 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 65   &data[pPage->ce
364d0 6c 6c 4f 66 66 73 65 74 5d 3d 3d 70 50 61 67 65  llOffset]==pPage
364e0 2d 3e 61 43 65 6c 6c 49 64 78 20 29 3b 0a 20 20  ->aCellIdx );.  
364f0 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 53    rc = allocateS
36500 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a 2c 20  pace(pPage, sz, 
36510 26 69 64 78 29 3b 0a 20 20 20 20 69 66 28 20 72  &idx);.    if( r
36520 63 20 29 7b 20 2a 70 52 43 20 3d 20 72 63 3b 20  c ){ *pRC = rc; 
36530 72 65 74 75 72 6e 3b 20 7d 0a 20 20 20 20 2f 2a  return; }.    /*
36540 20 54 68 65 20 61 6c 6c 6f 63 61 74 65 53 70 61   The allocateSpa
36550 63 65 28 29 20 72 6f 75 74 69 6e 65 20 67 75 61  ce() routine gua
36560 72 61 6e 74 65 65 73 20 74 68 65 20 66 6f 6c 6c  rantees the foll
36570 6f 77 69 6e 67 20 70 72 6f 70 65 72 74 69 65 73  owing properties
36580 0a 20 20 20 20 2a 2a 20 69 66 20 69 74 20 72 65  .    ** if it re
36590 74 75 72 6e 73 20 73 75 63 63 65 73 73 66 75 6c  turns successful
365a0 6c 79 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ly */.    assert
365b0 28 20 69 64 78 20 3e 3d 20 30 20 29 3b 0a 20 20  ( idx >= 0 );.  
365c0 20 20 61 73 73 65 72 74 28 20 69 64 78 20 3e 3d    assert( idx >=
365d0 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
365e0 65 74 2b 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c  et+2*pPage->nCel
365f0 6c 2b 32 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  l+2 || CORRUPT_D
36600 42 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  B );.    assert(
36610 20 69 64 78 2b 73 7a 20 3c 3d 20 28 69 6e 74 29   idx+sz <= (int)
36620 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
36630 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 50  leSize );.    pP
36640 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 75  age->nFree -= (u
36650 31 36 29 28 32 20 2b 20 73 7a 29 3b 0a 20 20 20  16)(2 + sz);.   
36660 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 69 64   memcpy(&data[id
36670 78 5d 2c 20 70 43 65 6c 6c 2c 20 73 7a 29 3b 0a  x], pCell, sz);.
36680 20 20 20 20 69 66 28 20 69 43 68 69 6c 64 20 29      if( iChild )
36690 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  {.      put4byte
366a0 28 26 64 61 74 61 5b 69 64 78 5d 2c 20 69 43 68  (&data[idx], iCh
366b0 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ild);.    }.    
366c0 70 49 6e 73 20 3d 20 70 50 61 67 65 2d 3e 61 43  pIns = pPage->aC
366d0 65 6c 6c 49 64 78 20 2b 20 69 2a 32 3b 0a 20 20  ellIdx + i*2;.  
366e0 20 20 6d 65 6d 6d 6f 76 65 28 70 49 6e 73 2b 32    memmove(pIns+2
366f0 2c 20 70 49 6e 73 2c 20 32 2a 28 70 50 61 67 65  , pIns, 2*(pPage
36700 2d 3e 6e 43 65 6c 6c 20 2d 20 69 29 29 3b 0a 20  ->nCell - i));. 
36710 20 20 20 70 75 74 32 62 79 74 65 28 70 49 6e 73     put2byte(pIns
36720 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 50 61 67  , idx);.    pPag
36730 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20  e->nCell++;.    
36740 2f 2a 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  /* increment the
36750 20 63 65 6c 6c 20 63 6f 75 6e 74 20 2a 2f 0a 20   cell count */. 
36760 20 20 20 69 66 28 20 28 2b 2b 64 61 74 61 5b 70     if( (++data[p
36770 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
36780 34 5d 29 3d 3d 30 20 29 20 64 61 74 61 5b 70 50  4])==0 ) data[pP
36790 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33  age->hdrOffset+3
367a0 5d 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ]++;.    assert(
367b0 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
367c0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
367d0 2b 33 5d 29 3d 3d 70 50 61 67 65 2d 3e 6e 43 65  +3])==pPage->nCe
367e0 6c 6c 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ll );.#ifndef SQ
367f0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
36800 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61  CUUM.    if( pPa
36810 67 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63  ge->pBt->autoVac
36820 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  uum ){.      /* 
36830 54 68 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e  The cell may con
36840 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  tain a pointer t
36850 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
36860 67 65 2e 20 49 66 20 73 6f 2c 20 77 72 69 74 65  ge. If so, write
36870 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e  .      ** the en
36880 74 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72  try for the over
36890 66 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f 20 74  flow page into t
368a0 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a  he pointer map..
368b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
368c0 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
368d0 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 52  pPage, pCell, pR
368e0 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  C);.    }.#endif
368f0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20  .  }.}../*.** A 
36900 43 65 6c 6c 41 72 72 61 79 20 6f 62 6a 65 63 74  CellArray object
36910 20 63 6f 6e 74 61 69 6e 73 20 61 20 63 61 63 68   contains a cach
36920 65 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 61 6e  e of pointers an
36930 64 20 73 69 7a 65 73 20 66 6f 72 20 61 0a 2a 2a  d sizes for a.**
36940 20 63 6f 6e 73 65 63 75 74 69 76 65 20 73 65 71   consecutive seq
36950 75 65 6e 63 65 20 6f 66 20 63 65 6c 6c 73 20 74  uence of cells t
36960 68 61 74 20 6d 69 67 68 74 20 62 65 20 68 65 6c  hat might be hel
36970 64 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 70 61  d on multiple pa
36980 67 65 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ges..*/.typedef 
36990 73 74 72 75 63 74 20 43 65 6c 6c 41 72 72 61 79  struct CellArray
369a0 20 43 65 6c 6c 41 72 72 61 79 3b 0a 73 74 72 75   CellArray;.stru
369b0 63 74 20 43 65 6c 6c 41 72 72 61 79 20 7b 0a 20  ct CellArray {. 
369c0 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20   int nCell;     
369d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
369e0 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61  er of cells in a
369f0 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 4d 65 6d  pCell[] */.  Mem
36a00 50 61 67 65 20 2a 70 52 65 66 3b 20 20 20 20 20  Page *pRef;     
36a10 20 20 20 20 20 2f 2a 20 52 65 66 65 72 65 6e 63       /* Referenc
36a20 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  e page */.  u8 *
36a30 2a 61 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  *apCell;        
36a40 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73      /* All cells
36a50 20 62 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20   begin balanced 
36a60 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c  */.  u16 *szCell
36a70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
36a80 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c  Local size of al
36a90 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c  l cells in apCel
36aa0 6c 5b 5d 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  l[] */.};../*.**
36ab0 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63   Make sure the c
36ac0 65 6c 6c 20 73 69 7a 65 73 20 61 74 20 69 64 78  ell sizes at idx
36ad0 2c 20 69 64 78 2b 31 2c 20 2e 2e 2e 2c 20 69 64  , idx+1, ..., id
36ae0 78 2b 4e 2d 31 20 68 61 76 65 20 62 65 65 6e 0a  x+N-1 have been.
36af0 2a 2a 20 63 6f 6d 70 75 74 65 64 2e 0a 2a 2f 0a  ** computed..*/.
36b00 73 74 61 74 69 63 20 76 6f 69 64 20 70 6f 70 75  static void popu
36b10 6c 61 74 65 43 65 6c 6c 43 61 63 68 65 28 43 65  lateCellCache(Ce
36b20 6c 6c 41 72 72 61 79 20 2a 70 2c 20 69 6e 74 20  llArray *p, int 
36b30 69 64 78 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 61  idx, int N){.  a
36b40 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26  ssert( idx>=0 &&
36b50 20 69 64 78 2b 4e 3c 3d 70 2d 3e 6e 43 65 6c 6c   idx+N<=p->nCell
36b60 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 4e 3e 30   );.  while( N>0
36b70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
36b80 70 2d 3e 61 70 43 65 6c 6c 5b 69 64 78 5d 21 3d  p->apCell[idx]!=
36b90 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  0 );.    if( p->
36ba0 73 7a 43 65 6c 6c 5b 69 64 78 5d 3d 3d 30 20 29  szCell[idx]==0 )
36bb0 7b 0a 20 20 20 20 20 20 70 2d 3e 73 7a 43 65 6c  {.      p->szCel
36bc0 6c 5b 69 64 78 5d 20 3d 20 70 2d 3e 70 52 65 66  l[idx] = p->pRef
36bd0 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 2d 3e 70  ->xCellSize(p->p
36be0 52 65 66 2c 20 70 2d 3e 61 70 43 65 6c 6c 5b 69  Ref, p->apCell[i
36bf0 64 78 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  dx]);.    }else{
36c00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 43  .      assert( C
36c10 4f 52 52 55 50 54 5f 44 42 20 7c 7c 0a 20 20 20  ORRUPT_DB ||.   
36c20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 73 7a             p->sz
36c30 43 65 6c 6c 5b 69 64 78 5d 3d 3d 70 2d 3e 70 52  Cell[idx]==p->pR
36c40 65 66 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 2d  ef->xCellSize(p-
36c50 3e 70 52 65 66 2c 20 70 2d 3e 61 70 43 65 6c 6c  >pRef, p->apCell
36c60 5b 69 64 78 5d 29 20 29 3b 0a 20 20 20 20 7d 0a  [idx]) );.    }.
36c70 20 20 20 20 69 64 78 2b 2b 3b 0a 20 20 20 20 4e      idx++;.    N
36c80 2d 2d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  --;.  }.}../*.**
36c90 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   Return the size
36ca0 20 6f 66 20 74 68 65 20 4e 74 68 20 65 6c 65 6d   of the Nth elem
36cb0 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  ent of the cell 
36cc0 61 72 72 61 79 0a 2a 2f 0a 73 74 61 74 69 63 20  array.*/.static 
36cd0 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
36ce0 75 31 36 20 63 6f 6d 70 75 74 65 43 65 6c 6c 53  u16 computeCellS
36cf0 69 7a 65 28 43 65 6c 6c 41 72 72 61 79 20 2a 70  ize(CellArray *p
36d00 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 61 73 73 65  , int N){.  asse
36d10 72 74 28 20 4e 3e 3d 30 20 26 26 20 4e 3c 70 2d  rt( N>=0 && N<p-
36d20 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65  >nCell );.  asse
36d30 72 74 28 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d  rt( p->szCell[N]
36d40 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 73 7a 43 65  ==0 );.  p->szCe
36d50 6c 6c 5b 4e 5d 20 3d 20 70 2d 3e 70 52 65 66 2d  ll[N] = p->pRef-
36d60 3e 78 43 65 6c 6c 53 69 7a 65 28 70 2d 3e 70 52  >xCellSize(p->pR
36d70 65 66 2c 20 70 2d 3e 61 70 43 65 6c 6c 5b 4e 5d  ef, p->apCell[N]
36d80 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 73  );.  return p->s
36d90 7a 43 65 6c 6c 5b 4e 5d 3b 0a 7d 0a 73 74 61 74  zCell[N];.}.stat
36da0 69 63 20 75 31 36 20 63 61 63 68 65 64 43 65 6c  ic u16 cachedCel
36db0 6c 53 69 7a 65 28 43 65 6c 6c 41 72 72 61 79 20  lSize(CellArray 
36dc0 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 61 73  *p, int N){.  as
36dd0 73 65 72 74 28 20 4e 3e 3d 30 20 26 26 20 4e 3c  sert( N>=0 && N<
36de0 70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66  p->nCell );.  if
36df0 28 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 20 29  ( p->szCell[N] )
36e00 20 72 65 74 75 72 6e 20 70 2d 3e 73 7a 43 65 6c   return p->szCel
36e10 6c 5b 4e 5d 3b 0a 20 20 72 65 74 75 72 6e 20 63  l[N];.  return c
36e20 6f 6d 70 75 74 65 43 65 6c 6c 53 69 7a 65 28 70  omputeCellSize(p
36e30 2c 20 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  , N);.}../*.** A
36e40 72 72 61 79 20 61 70 43 65 6c 6c 5b 5d 20 63 6f  rray apCell[] co
36e50 6e 74 61 69 6e 73 20 70 6f 69 6e 74 65 72 73 20  ntains pointers 
36e60 74 6f 20 6e 43 65 6c 6c 20 62 2d 74 72 65 65 20  to nCell b-tree 
36e70 70 61 67 65 20 63 65 6c 6c 73 2e 20 54 68 65 20  page cells. The 
36e80 0a 2a 2a 20 73 7a 43 65 6c 6c 5b 5d 20 61 72 72  .** szCell[] arr
36e90 61 79 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ay contains the 
36ea0 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66  size in bytes of
36eb0 20 65 61 63 68 20 63 65 6c 6c 2e 20 54 68 69 73   each cell. This
36ec0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65 70   function.** rep
36ed0 6c 61 63 65 73 20 74 68 65 20 63 75 72 72 65 6e  laces the curren
36ee0 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 61  t contents of pa
36ef0 67 65 20 70 50 67 20 77 69 74 68 20 74 68 65 20  ge pPg with the 
36f00 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
36f10 63 65 6c 6c 0a 2a 2a 20 61 72 72 61 79 2e 0a 2a  cell.** array..*
36f20 2a 0a 2a 2a 20 53 6f 6d 65 20 6f 66 20 74 68 65  *.** Some of the
36f30 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
36f40 5b 5d 20 6d 61 79 20 63 75 72 72 65 6e 74 6c 79  [] may currently
36f50 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 70 50   be stored in pP
36f60 67 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  g. This.** funct
36f70 69 6f 6e 20 77 6f 72 6b 73 20 61 72 6f 75 6e 64  ion works around
36f80 20 70 72 6f 62 6c 65 6d 73 20 63 61 75 73 65 64   problems caused
36f90 20 62 79 20 74 68 69 73 20 62 79 20 6d 61 6b 69   by this by maki
36fa0 6e 67 20 61 20 63 6f 70 79 20 6f 66 20 61 6e 79  ng a copy of any
36fb0 20 0a 2a 2a 20 73 75 63 68 20 63 65 6c 6c 73 20   .** such cells 
36fc0 62 65 66 6f 72 65 20 6f 76 65 72 77 72 69 74 69  before overwriti
36fd0 6e 67 20 74 68 65 20 70 61 67 65 20 64 61 74 61  ng the page data
36fe0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4d 65 6d 50  ..**.** The MemP
36ff0 61 67 65 2e 6e 46 72 65 65 20 66 69 65 6c 64 20  age.nFree field 
37000 69 73 20 69 6e 76 61 6c 69 64 61 74 65 64 20 62  is invalidated b
37010 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
37020 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72   It is the .** r
37030 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
37040 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 73   the caller to s
37050 65 74 20 69 74 20 63 6f 72 72 65 63 74 6c 79 2e  et it correctly.
37060 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
37070 65 62 75 69 6c 64 50 61 67 65 28 0a 20 20 4d 65  ebuildPage(.  Me
37080 6d 50 61 67 65 20 2a 70 50 67 2c 20 20 20 20 20  mPage *pPg,     
37090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
370a0 20 45 64 69 74 20 74 68 69 73 20 70 61 67 65 20   Edit this page 
370b0 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20  */.  int nCell, 
370c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
370d0 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c 20 6e 75       /* Final nu
370e0 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e  mber of cells on
370f0 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a   page */.  u8 **
37100 61 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  apCell,         
37110 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
37120 72 61 79 20 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a  ray of cells */.
37130 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 20 20 20    u16 *szCell   
37140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37150 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65    /* Array of ce
37160 6c 6c 20 73 69 7a 65 73 20 2a 2f 0a 29 7b 0a 20  ll sizes */.){. 
37170 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d   const int hdr =
37180 20 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b   pPg->hdrOffset;
37190 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
371a0 73 65 74 20 6f 66 20 68 65 61 64 65 72 20 6f 6e  set of header on
371b0 20 70 50 67 20 2a 2f 0a 20 20 75 38 20 2a 20 63   pPg */.  u8 * c
371c0 6f 6e 73 74 20 61 44 61 74 61 20 3d 20 70 50 67  onst aData = pPg
371d0 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 20 20  ->aData;        
371e0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
371f0 20 64 61 74 61 20 66 6f 72 20 70 50 67 20 2a 2f   data for pPg */
37200 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 75 73 61  .  const int usa
37210 62 6c 65 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70  bleSize = pPg->p
37220 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
37230 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 45 6e    u8 * const pEn
37240 64 20 3d 20 26 61 44 61 74 61 5b 75 73 61 62 6c  d = &aData[usabl
37250 65 53 69 7a 65 5d 3b 0a 20 20 69 6e 74 20 69 3b  eSize];.  int i;
37260 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70 74 72 20  .  u8 *pCellptr 
37270 3d 20 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 3b  = pPg->aCellIdx;
37280 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d 20 73 71  .  u8 *pTmp = sq
37290 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70  lite3PagerTempSp
372a0 61 63 65 28 70 50 67 2d 3e 70 42 74 2d 3e 70 50  ace(pPg->pBt->pP
372b0 61 67 65 72 29 3b 0a 20 20 75 38 20 2a 70 44 61  ager);.  u8 *pDa
372c0 74 61 3b 0a 0a 20 20 69 20 3d 20 67 65 74 32 62  ta;..  i = get2b
372d0 79 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b 35  yte(&aData[hdr+5
372e0 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 54  ]);.  memcpy(&pT
372f0 6d 70 5b 69 5d 2c 20 26 61 44 61 74 61 5b 69 5d  mp[i], &aData[i]
37300 2c 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 69  , usableSize - i
37310 29 3b 0a 0a 20 20 70 44 61 74 61 20 3d 20 70 45  );..  pData = pE
37320 6e 64 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  nd;.  for(i=0; i
37330 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
37340 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 61 70    u8 *pCell = ap
37350 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28  Cell[i];.    if(
37360 20 53 51 4c 49 54 45 5f 57 49 54 48 49 4e 28 70   SQLITE_WITHIN(p
37370 43 65 6c 6c 2c 61 44 61 74 61 2c 70 45 6e 64 29  Cell,aData,pEnd)
37380 20 29 7b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20   ){.      pCell 
37390 3d 20 26 70 54 6d 70 5b 70 43 65 6c 6c 20 2d 20  = &pTmp[pCell - 
373a0 61 44 61 74 61 5d 3b 0a 20 20 20 20 7d 0a 20 20  aData];.    }.  
373b0 20 20 70 44 61 74 61 20 2d 3d 20 73 7a 43 65 6c    pData -= szCel
373c0 6c 5b 69 5d 3b 0a 20 20 20 20 70 75 74 32 62 79  l[i];.    put2by
373d0 74 65 28 70 43 65 6c 6c 70 74 72 2c 20 28 70 44  te(pCellptr, (pD
373e0 61 74 61 20 2d 20 61 44 61 74 61 29 29 3b 0a 20  ata - aData));. 
373f0 20 20 20 70 43 65 6c 6c 70 74 72 20 2b 3d 20 32     pCellptr += 2
37400 3b 0a 20 20 20 20 69 66 28 20 70 44 61 74 61 20  ;.    if( pData 
37410 3c 20 70 43 65 6c 6c 70 74 72 20 29 20 72 65 74  < pCellptr ) ret
37420 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
37430 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 6d 65 6d  PT_BKPT;.    mem
37440 63 70 79 28 70 44 61 74 61 2c 20 70 43 65 6c 6c  cpy(pData, pCell
37450 2c 20 73 7a 43 65 6c 6c 5b 69 5d 29 3b 0a 20 20  , szCell[i]);.  
37460 20 20 61 73 73 65 72 74 28 20 73 7a 43 65 6c 6c    assert( szCell
37470 5b 69 5d 3d 3d 70 50 67 2d 3e 78 43 65 6c 6c 53  [i]==pPg->xCellS
37480 69 7a 65 28 70 50 67 2c 20 70 43 65 6c 6c 29 20  ize(pPg, pCell) 
37490 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
374a0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73  .    testcase( s
374b0 7a 43 65 6c 6c 5b 69 5d 21 3d 70 50 67 2d 3e 78  zCell[i]!=pPg->x
374c0 43 65 6c 6c 53 69 7a 65 28 70 50 67 2c 70 43 65  CellSize(pPg,pCe
374d0 6c 6c 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ll) );.  }..  /*
374e0 20 54 68 65 20 70 50 67 2d 3e 6e 46 72 65 65 20   The pPg->nFree 
374f0 66 69 65 6c 64 20 69 73 20 6e 6f 77 20 73 65 74  field is now set
37500 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 20 54 68   incorrectly. Th
37510 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 66 69  e caller will fi
37520 78 20 69 74 2e 20 2a 2f 0a 20 20 70 50 67 2d 3e  x it. */.  pPg->
37530 6e 43 65 6c 6c 20 3d 20 6e 43 65 6c 6c 3b 0a 20  nCell = nCell;. 
37540 20 70 50 67 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20   pPg->nOverflow 
37550 3d 20 30 3b 0a 0a 20 20 70 75 74 32 62 79 74 65  = 0;..  put2byte
37560 28 26 61 44 61 74 61 5b 68 64 72 2b 31 5d 2c 20  (&aData[hdr+1], 
37570 30 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  0);.  put2byte(&
37580 61 44 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50  aData[hdr+3], pP
37590 67 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 75 74  g->nCell);.  put
375a0 32 62 79 74 65 28 26 61 44 61 74 61 5b 68 64 72  2byte(&aData[hdr
375b0 2b 35 5d 2c 20 70 44 61 74 61 20 2d 20 61 44 61  +5], pData - aDa
375c0 74 61 29 3b 0a 20 20 61 44 61 74 61 5b 68 64 72  ta);.  aData[hdr
375d0 2b 37 5d 20 3d 20 30 78 30 30 3b 0a 20 20 72 65  +7] = 0x00;.  re
375e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
375f0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79 20 61  }../*.** Array a
37600 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73  pCell[] contains
37610 20 6e 43 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20   nCell pointers 
37620 74 6f 20 62 2d 74 72 65 65 20 63 65 6c 6c 73 2e  to b-tree cells.
37630 20 41 72 72 61 79 20 73 7a 43 65 6c 6c 0a 2a 2a   Array szCell.**
37640 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 69   contains the si
37650 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 65  ze in bytes of e
37660 61 63 68 20 73 75 63 68 20 63 65 6c 6c 2e 20 54  ach such cell. T
37670 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74  his function att
37680 65 6d 70 74 73 20 74 6f 20 0a 2a 2a 20 61 64 64  empts to .** add
37690 20 74 68 65 20 63 65 6c 6c 73 20 73 74 6f 72 65   the cells store
376a0 64 20 69 6e 20 74 68 65 20 61 72 72 61 79 20 74  d in the array t
376b0 6f 20 70 61 67 65 20 70 50 67 2e 20 49 66 20 69  o page pPg. If i
376c0 74 20 63 61 6e 6e 6f 74 20 28 62 65 63 61 75 73  t cannot (becaus
376d0 65 20 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e  e .** the page n
376e0 65 65 64 73 20 74 6f 20 62 65 20 64 65 66 72 61  eeds to be defra
376f0 67 6d 65 6e 74 65 64 20 62 65 66 6f 72 65 20 74  gmented before t
37700 68 65 20 63 65 6c 6c 73 20 77 69 6c 6c 20 66 69  he cells will fi
37710 74 29 2c 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20  t), non-zero.** 
37720 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
37730 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 63  erwise, if the c
37740 65 6c 6c 73 20 61 72 65 20 61 64 64 65 64 20 73  ells are added s
37750 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 7a 65 72  uccessfully, zer
37760 6f 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  o is.** returned
37770 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ..**.** Argument
37780 20 70 43 65 6c 6c 70 74 72 20 70 6f 69 6e 74 73   pCellptr points
37790 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e   to the first en
377a0 74 72 79 20 69 6e 20 74 68 65 20 63 65 6c 6c 2d  try in the cell-
377b0 70 6f 69 6e 74 65 72 20 61 72 72 61 79 0a 2a 2a  pointer array.**
377c0 20 28 70 61 72 74 20 6f 66 20 70 61 67 65 20 70   (part of page p
377d0 50 67 29 20 74 6f 20 70 6f 70 75 6c 61 74 65 2e  Pg) to populate.
377e0 20 41 66 74 65 72 20 63 65 6c 6c 20 61 70 43 65   After cell apCe
377f0 6c 6c 5b 30 5d 20 69 73 20 77 72 69 74 74 65 6e  ll[0] is written
37800 20 74 6f 20 74 68 65 0a 2a 2a 20 70 61 67 65 20   to the.** page 
37810 62 6f 64 79 2c 20 61 20 31 36 2d 62 69 74 20 6f  body, a 16-bit o
37820 66 66 73 65 74 20 69 73 20 77 72 69 74 74 65 6e  ffset is written
37830 20 74 6f 20 70 43 65 6c 6c 70 74 72 2e 20 41 6e   to pCellptr. An
37840 64 20 73 6f 20 6f 6e 2c 20 66 6f 72 20 65 61 63  d so on, for eac
37850 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 74 68 65  h.** cell in the
37860 20 61 72 72 61 79 2e 20 49 74 20 69 73 20 74 68   array. It is th
37870 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
37880 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
37890 6f 20 65 6e 73 75 72 65 0a 2a 2a 20 74 68 61 74  o ensure.** that
378a0 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 6f   it is safe to o
378b0 76 65 72 77 72 69 74 65 20 74 68 69 73 20 70 61  verwrite this pa
378c0 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 70  rt of the cell-p
378d0 6f 69 6e 74 65 72 20 61 72 72 61 79 2e 0a 2a 2a  ointer array..**
378e0 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75  .** When this fu
378f0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
37900 2c 20 2a 70 70 44 61 74 61 20 70 6f 69 6e 74 73  , *ppData points
37910 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
37920 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74   the .** content
37930 20 61 72 65 61 20 6f 6e 20 70 61 67 65 20 70 50   area on page pP
37940 67 2e 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f  g. If the size o
37950 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 61 72  f the content ar
37960 65 61 20 69 73 20 65 78 74 65 6e 64 65 64 2c 0a  ea is extended,.
37970 2a 2a 20 2a 70 70 44 61 74 61 20 69 73 20 75 70  ** *ppData is up
37980 64 61 74 65 64 20 74 6f 20 70 6f 69 6e 74 20 74  dated to point t
37990 6f 20 74 68 65 20 6e 65 77 20 73 74 61 72 74 20  o the new start 
379a0 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 61  of the content a
379b0 72 65 61 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65  rea.** before re
379c0 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 46  turning..**.** F
379d0 69 6e 61 6c 6c 79 2c 20 61 72 67 75 6d 65 6e 74  inally, argument
379e0 20 70 42 65 67 69 6e 20 70 6f 69 6e 74 73 20 74   pBegin points t
379f0 6f 20 74 68 65 20 62 79 74 65 20 69 6d 6d 65 64  o the byte immed
37a00 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67  iately following
37a10 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74   the.** end of t
37a20 68 65 20 73 70 61 63 65 20 72 65 71 75 69 72 65  he space require
37a30 64 20 62 79 20 74 68 69 73 20 70 61 67 65 20 66  d by this page f
37a40 6f 72 20 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e  or the cell-poin
37a50 74 65 72 20 61 72 65 61 20 28 66 6f 72 0a 2a 2a  ter area (for.**
37a60 20 61 6c 6c 20 63 65 6c 6c 73 20 2d 20 6e 6f 74   all cells - not
37a70 20 6a 75 73 74 20 74 68 6f 73 65 20 69 6e 73 65   just those inse
37a80 72 74 65 64 20 62 79 20 74 68 65 20 63 75 72 72  rted by the curr
37a90 65 6e 74 20 63 61 6c 6c 29 2e 20 49 66 20 74 68  ent call). If th
37aa0 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 61 72 65  e content.** are
37ab0 61 20 6d 75 73 74 20 62 65 20 65 78 74 65 6e 64  a must be extend
37ac0 65 64 20 74 6f 20 62 65 66 6f 72 65 20 74 68 69  ed to before thi
37ad0 73 20 70 6f 69 6e 74 20 69 6e 20 6f 72 64 65 72  s point in order
37ae0 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20 61   to accomodate a
37af0 6c 6c 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 61  ll.** cells in a
37b00 70 43 65 6c 6c 5b 5d 2c 20 74 68 65 6e 20 74 68  pCell[], then th
37b10 65 20 63 65 6c 6c 73 20 64 6f 20 6e 6f 74 20 66  e cells do not f
37b20 69 74 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20  it and non-zero 
37b30 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
37b40 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 49  static int pageI
37b50 6e 73 65 72 74 41 72 72 61 79 28 0a 20 20 4d 65  nsertArray(.  Me
37b60 6d 50 61 67 65 20 2a 70 50 67 2c 20 20 20 20 20  mPage *pPg,     
37b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
37b80 20 50 61 67 65 20 74 6f 20 61 64 64 20 63 65 6c   Page to add cel
37b90 6c 73 20 74 6f 20 2a 2f 0a 20 20 75 38 20 2a 70  ls to */.  u8 *p
37ba0 42 65 67 69 6e 2c 20 20 20 20 20 20 20 20 20 20  Begin,          
37bb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e             /* En
37bc0 64 20 6f 66 20 63 65 6c 6c 2d 70 6f 69 6e 74 65  d of cell-pointe
37bd0 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 75 38 20  r array */.  u8 
37be0 2a 2a 70 70 44 61 74 61 2c 20 20 20 20 20 20 20  **ppData,       
37bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37c00 49 4e 2f 4f 55 54 3a 20 50 61 67 65 20 63 6f 6e  IN/OUT: Page con
37c10 74 65 6e 74 20 2d 61 72 65 61 20 70 6f 69 6e 74  tent -area point
37c20 65 72 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  er */.  u8 *pCel
37c30 6c 70 74 72 2c 20 20 20 20 20 20 20 20 20 20 20  lptr,           
37c40 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
37c50 65 72 20 74 6f 20 63 65 6c 6c 2d 70 6f 69 6e 74  er to cell-point
37c60 65 72 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74  er area */.  int
37c70 20 69 46 69 72 73 74 2c 20 20 20 20 20 20 20 20   iFirst,        
37c80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37c90 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20 63  Index of first c
37ca0 65 6c 6c 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20  ell to add */.  
37cb0 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20  int nCell,      
37cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37cd0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
37ce0 6c 73 20 74 6f 20 61 64 64 20 74 6f 20 70 50 67  ls to add to pPg
37cf0 20 2a 2f 0a 20 20 43 65 6c 6c 41 72 72 61 79 20   */.  CellArray 
37d00 2a 70 43 41 72 72 61 79 20 20 20 20 20 20 20 20  *pCArray        
37d10 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
37d20 66 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20  f cells */.){.  
37d30 69 6e 74 20 69 3b 0a 20 20 75 38 20 2a 61 44 61  int i;.  u8 *aDa
37d40 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b  ta = pPg->aData;
37d50 0a 20 20 75 38 20 2a 70 44 61 74 61 20 3d 20 2a  .  u8 *pData = *
37d60 70 70 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 45  ppData;.  int iE
37d70 6e 64 20 3d 20 69 46 69 72 73 74 20 2b 20 6e 43  nd = iFirst + nC
37d80 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 43  ell;.  assert( C
37d90 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 70 50 67  ORRUPT_DB || pPg
37da0 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 30 20 29  ->hdrOffset==0 )
37db0 3b 20 20 20 20 2f 2a 20 4e 65 76 65 72 20 63 61  ;    /* Never ca
37dc0 6c 6c 65 64 20 6f 6e 20 70 61 67 65 20 31 20 2a  lled on page 1 *
37dd0 2f 0a 20 20 66 6f 72 28 69 3d 69 46 69 72 73 74  /.  for(i=iFirst
37de0 3b 20 69 3c 69 45 6e 64 3b 20 69 2b 2b 29 7b 0a  ; i<iEnd; i++){.
37df0 20 20 20 20 69 6e 74 20 73 7a 2c 20 72 63 3b 0a      int sz, rc;.
37e00 20 20 20 20 75 38 20 2a 70 53 6c 6f 74 3b 0a 20      u8 *pSlot;. 
37e10 20 20 20 73 7a 20 3d 20 63 61 63 68 65 64 43 65     sz = cachedCe
37e20 6c 6c 53 69 7a 65 28 70 43 41 72 72 61 79 2c 20  llSize(pCArray, 
37e30 69 29 3b 0a 20 20 20 20 69 66 28 20 28 61 44 61  i);.    if( (aDa
37e40 74 61 5b 31 5d 3d 3d 30 20 26 26 20 61 44 61 74  ta[1]==0 && aDat
37e50 61 5b 32 5d 3d 3d 30 29 20 7c 7c 20 28 70 53 6c  a[2]==0) || (pSl
37e60 6f 74 20 3d 20 70 61 67 65 46 69 6e 64 53 6c 6f  ot = pageFindSlo
37e70 74 28 70 50 67 2c 73 7a 2c 26 72 63 29 29 3d 3d  t(pPg,sz,&rc))==
37e80 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  0 ){.      if( (
37e90 70 44 61 74 61 20 2d 20 70 42 65 67 69 6e 29 3c  pData - pBegin)<
37ea0 73 7a 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  sz ) return 1;. 
37eb0 20 20 20 20 20 70 44 61 74 61 20 2d 3d 20 73 7a       pData -= sz
37ec0 3b 0a 20 20 20 20 20 20 70 53 6c 6f 74 20 3d 20  ;.      pSlot = 
37ed0 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20  pData;.    }.   
37ee0 20 2f 2a 20 70 53 6c 6f 74 20 61 6e 64 20 70 43   /* pSlot and pC
37ef0 41 72 72 61 79 2d 3e 61 70 43 65 6c 6c 5b 69 5d  Array->apCell[i]
37f00 20 77 69 6c 6c 20 6e 65 76 65 72 20 6f 76 65 72   will never over
37f10 6c 61 70 20 6f 6e 20 61 20 77 65 6c 6c 2d 66 6f  lap on a well-fo
37f20 72 6d 65 64 0a 20 20 20 20 2a 2a 20 64 61 74 61  rmed.    ** data
37f30 62 61 73 65 2e 20 20 42 75 74 20 74 68 65 79 20  base.  But they 
37f40 6d 69 67 68 74 20 66 6f 72 20 61 20 63 6f 72 72  might for a corr
37f50 75 70 74 20 64 61 74 61 62 61 73 65 2e 20 20 48  upt database.  H
37f60 65 6e 63 65 20 75 73 65 20 6d 65 6d 6d 6f 76 65  ence use memmove
37f70 28 29 0a 20 20 20 20 2a 2a 20 73 69 6e 63 65 20  ().    ** since 
37f80 6d 65 6d 63 70 79 28 29 20 73 65 6e 64 73 20 53  memcpy() sends S
37f90 49 47 41 42 4f 52 54 20 77 69 74 68 20 6f 76 65  IGABORT with ove
37fa0 72 6c 61 70 70 69 6e 67 20 62 75 66 66 65 72 73  rlapping buffers
37fb0 20 6f 6e 20 4f 70 65 6e 42 53 44 20 2a 2f 0a 20   on OpenBSD */. 
37fc0 20 20 20 61 73 73 65 72 74 28 20 28 70 53 6c 6f     assert( (pSlo
37fd0 74 2b 73 7a 29 3c 3d 70 43 41 72 72 61 79 2d 3e  t+sz)<=pCArray->
37fe0 61 70 43 65 6c 6c 5b 69 5d 0a 20 20 20 20 20 20  apCell[i].      
37ff0 20 20 20 7c 7c 20 70 53 6c 6f 74 3e 3d 28 70 43     || pSlot>=(pC
38000 41 72 72 61 79 2d 3e 61 70 43 65 6c 6c 5b 69 5d  Array->apCell[i]
38010 2b 73 7a 29 0a 20 20 20 20 20 20 20 20 20 7c 7c  +sz).         ||
38020 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
38030 20 20 20 6d 65 6d 6d 6f 76 65 28 70 53 6c 6f 74     memmove(pSlot
38040 2c 20 70 43 41 72 72 61 79 2d 3e 61 70 43 65 6c  , pCArray->apCel
38050 6c 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 70  l[i], sz);.    p
38060 75 74 32 62 79 74 65 28 70 43 65 6c 6c 70 74 72  ut2byte(pCellptr
38070 2c 20 28 70 53 6c 6f 74 20 2d 20 61 44 61 74 61  , (pSlot - aData
38080 29 29 3b 0a 20 20 20 20 70 43 65 6c 6c 70 74 72  ));.    pCellptr
38090 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20 2a 70 70   += 2;.  }.  *pp
380a0 44 61 74 61 20 3d 20 70 44 61 74 61 3b 0a 20 20  Data = pData;.  
380b0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
380c0 2a 2a 20 41 72 72 61 79 20 61 70 43 65 6c 6c 5b  ** Array apCell[
380d0 5d 20 63 6f 6e 74 61 69 6e 73 20 6e 43 65 6c 6c  ] contains nCell
380e0 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 62 2d 74   pointers to b-t
380f0 72 65 65 20 63 65 6c 6c 73 2e 20 41 72 72 61 79  ree cells. Array
38100 20 73 7a 43 65 6c 6c 20 0a 2a 2a 20 63 6f 6e 74   szCell .** cont
38110 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 69 6e  ains the size in
38120 20 62 79 74 65 73 20 6f 66 20 65 61 63 68 20 73   bytes of each s
38130 75 63 68 20 63 65 6c 6c 2e 20 54 68 69 73 20 66  uch cell. This f
38140 75 6e 63 74 69 6f 6e 20 61 64 64 73 20 74 68 65  unction adds the
38150 0a 2a 2a 20 73 70 61 63 65 20 61 73 73 6f 63 69  .** space associ
38160 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20 63  ated with each c
38170 65 6c 6c 20 69 6e 20 74 68 65 20 61 72 72 61 79  ell in the array
38180 20 74 68 61 74 20 69 73 20 63 75 72 72 65 6e 74   that is current
38190 6c 79 20 73 74 6f 72 65 64 20 0a 2a 2a 20 77 69  ly stored .** wi
381a0 74 68 69 6e 20 74 68 65 20 62 6f 64 79 20 6f 66  thin the body of
381b0 20 70 50 67 20 74 6f 20 74 68 65 20 70 50 67 20   pPg to the pPg 
381c0 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 65 20 63  free-list. The c
381d0 65 6c 6c 2d 70 6f 69 6e 74 65 72 73 20 61 6e 64  ell-pointers and
381e0 20 6f 74 68 65 72 0a 2a 2a 20 66 69 65 6c 64 73   other.** fields
381f0 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 72 65   of the page are
38200 20 6e 6f 74 20 75 70 64 61 74 65 64 2e 0a 2a 2a   not updated..**
38210 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
38220 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 74 6f  n returns the to
38230 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63 65  tal number of ce
38240 6c 6c 73 20 61 64 64 65 64 20 74 6f 20 74 68 65  lls added to the
38250 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2f 0a 73   free-list..*/.s
38260 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 46 72  tatic int pageFr
38270 65 65 41 72 72 61 79 28 0a 20 20 4d 65 6d 50 61  eeArray(.  MemPa
38280 67 65 20 2a 70 50 67 2c 20 20 20 20 20 20 20 20  ge *pPg,        
38290 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
382a0 67 65 20 74 6f 20 65 64 69 74 20 2a 2f 0a 20 20  ge to edit */.  
382b0 69 6e 74 20 69 46 69 72 73 74 2c 20 20 20 20 20  int iFirst,     
382c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
382d0 2f 2a 20 46 69 72 73 74 20 63 65 6c 6c 20 74 6f  /* First cell to
382e0 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74   delete */.  int
382f0 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20   nCell,         
38300 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
38310 43 65 6c 6c 73 20 74 6f 20 64 65 6c 65 74 65 20  Cells to delete 
38320 2a 2f 0a 20 20 43 65 6c 6c 41 72 72 61 79 20 2a  */.  CellArray *
38330 70 43 41 72 72 61 79 20 20 20 20 20 20 20 20 20  pCArray         
38340 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
38350 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 75   cells */.){.  u
38360 38 20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61 20  8 * const aData 
38370 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20  = pPg->aData;.  
38380 75 38 20 2a 20 63 6f 6e 73 74 20 70 45 6e 64 20  u8 * const pEnd 
38390 3d 20 26 61 44 61 74 61 5b 70 50 67 2d 3e 70 42  = &aData[pPg->pB
383a0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a  t->usableSize];.
383b0 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 53 74    u8 * const pSt
383c0 61 72 74 20 3d 20 26 61 44 61 74 61 5b 70 50 67  art = &aData[pPg
383d0 2d 3e 68 64 72 4f 66 66 73 65 74 20 2b 20 38 20  ->hdrOffset + 8 
383e0 2b 20 70 50 67 2d 3e 63 68 69 6c 64 50 74 72 53  + pPg->childPtrS
383f0 69 7a 65 5d 3b 0a 20 20 69 6e 74 20 6e 52 65 74  ize];.  int nRet
38400 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
38410 20 69 6e 74 20 69 45 6e 64 20 3d 20 69 46 69 72   int iEnd = iFir
38420 73 74 20 2b 20 6e 43 65 6c 6c 3b 0a 20 20 75 38  st + nCell;.  u8
38430 20 2a 70 46 72 65 65 20 3d 20 30 3b 0a 20 20 69   *pFree = 0;.  i
38440 6e 74 20 73 7a 46 72 65 65 20 3d 20 30 3b 0a 0a  nt szFree = 0;..
38450 20 20 66 6f 72 28 69 3d 69 46 69 72 73 74 3b 20    for(i=iFirst; 
38460 69 3c 69 45 6e 64 3b