/ Hex Artifact Content
Login

Artifact e8325955bd7f6e9e55b695b8e56f541b7637e831:


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 54 61 62 20  ){.        iTab 
1920: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
1930: 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tnum;.      }.  
1940: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1950: 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a 20   iTab = iRoot;. 
1960: 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20   }..  /* Search 
1970: 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65 64  for the required
1980: 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61 20   lock. Either a 
1990: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72 6f  write-lock on ro
19a0: 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61 20  ot-page iTab, a 
19b0: 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b  .  ** write-lock
19c0: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
19d0: 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68 65  able, or (if the
19e0: 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64 69   client is readi
19f0: 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64 2d  ng) a.  ** read-
1a00: 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69 6c  lock on iTab wil
1a10: 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75 72  l suffice. Retur
1a20: 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74 68  n 1 if any of th
1a30: 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20 20  ese are found.  
1a40: 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70  */.  for(pLock=p
1a50: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f 63  Btree->pBt->pLoc
1a60: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
1a70: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
1a80: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42     if( pLock->pB
1a90: 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20 20  tree==pBtree .  
1aa0: 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69 54     && (pLock->iT
1ab0: 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28 70  able==iTab || (p
1ac0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Lock->eLock==WRI
1ad0: 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b  TE_LOCK && pLock
1ae0: 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20 20  ->iTable==1)).  
1af0: 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c 6f     && pLock->eLo
1b00: 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a 20  ck>=eLockType . 
1b10: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1b20: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1b30: 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20  .  /* Failed to 
1b40: 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72 65  find the require
1b50: 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65 74  d lock. */.  ret
1b60: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
1b70: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
1b80: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
1b90: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20  E_DEBUG./*.**** 
1ba0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
1bb0: 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61 72  y be used as par
1bc0: 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  t of assert() st
1bd0: 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20 2a  atements only. *
1be0: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ***.**.** Return
1bf0: 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75 6c   true if it woul
1c00: 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f 72  d be illegal for
1c10: 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74 65   pBtree to write
1c20: 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61 62   into the.** tab
1c30: 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f 74  le or index root
1c40: 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63 61  ed at iRoot beca
1c50: 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65 64  use other shared
1c60: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
1c70: 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  .** simultaneous
1c80: 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74 20  ly reading that 
1c90: 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69 6e  same table or in
1ca0: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  dex..**.** It is
1cb0: 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42 74   illegal for pBt
1cc0: 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66 20  ree to write if 
1cd0: 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65 65  some other Btree
1ce0: 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20   object that.** 
1cf0: 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65 20  shares the same 
1d00: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
1d10: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65 61  is currently rea
1d20: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 0a  ding or writing.
1d30: 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61 62  ** the iRoot tab
1d40: 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20  le.  Except, if 
1d50: 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65 20  the other Btree 
1d60: 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a 2a  object has the.*
1d70: 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  * read-uncommitt
1d80: 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68 65  ed flag set, the
1d90: 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74  n it is OK for t
1da0: 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74 20  he other object 
1db0: 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65 61  to.** have a rea
1dc0: 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  d cursor..**.** 
1dd0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65 66  For example, bef
1de0: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61  ore writing to a
1df0: 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  ny part of the t
1e00: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a 2a  able or index.**
1e10: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
1e20: 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75 6c  iRoot, one shoul
1e30: 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20  d call:.**.**   
1e40: 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65 61   assert( !hasRea
1e50: 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72 65  dConflicts(pBtre
1e60: 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f 0a  e, iRoot) );.*/.
1e70: 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52 65  static int hasRe
1e80: 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72 65  adConflicts(Btre
1e90: 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f 20  e *pBtree, Pgno 
1ea0: 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72 73  iRoot){.  BtCurs
1eb0: 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  or *p;.  for(p=p
1ec0: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
1ed0: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
1ee0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  xt){.    if( p->
1ef0: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 20  pgnoRoot==iRoot 
1f00: 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74 72  .     && p->pBtr
1f10: 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20 20  ee!=pBtree.     
1f20: 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65 65  && 0==(p->pBtree
1f30: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1f40: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1f50: 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20 20  tted).    ){.   
1f60: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1f70: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1f80: 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f  0;.}.#endif    /
1f90: 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  * #ifdef SQLITE_
1fa0: 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
1fb0: 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20  Query to see if 
1fc0: 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d  Btree handle p m
1fd0: 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  ay obtain a lock
1fe0: 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a   of type eLock .
1ff0: 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72  ** (READ_LOCK or
2000: 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20   WRITE_LOCK) on 
2010: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
2020: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52  oot-page iTab. R
2030: 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  eturn.** SQLITE_
2040: 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d  OK if the lock m
2050: 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28  ay be obtained (
2060: 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65  by calling.** se
2070: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2080: 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c  eLock()), or SQL
2090: 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f  ITE_LOCKED if no
20a0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
20b0: 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68   querySharedCach
20c0: 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  eTableLock(Btree
20d0: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20   *p, Pgno iTab, 
20e0: 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53  u8 eLock){.  BtS
20f0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2100: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  pBt;.  BtLock *p
2110: 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Iter;..  assert(
2120: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2130: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
2140: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
2150: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  EAD_LOCK || eLoc
2160: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
2170: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
2180: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
2190: 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26   !(p->db->flags&
21a0: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
21b0: 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d 3d  mitted)||eLock==
21c0: 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62  WRITE_LOCK||iTab
21d0: 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49  ==1 );.  .  /* I
21e0: 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 77  f requesting a w
21f0: 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20  rite-lock, then 
2200: 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20 68  the Btree must h
2210: 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
2220: 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  e.  ** transacti
2230: 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2e  on on this file.
2240: 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79 2c   And, obviously,
2250: 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65 20   for this to be 
2260: 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20 6d  so there .  ** m
2270: 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 77  ust be an open w
2280: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
2290: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74 73   on the file its
22a0: 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  elf..  */.  asse
22b0: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
22c0: 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74 2d  LOCK || (p==pBt-
22d0: 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e 69  >pWriter && p->i
22e0: 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
22f0: 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ITE) );.  assert
2300: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2310: 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61  CK || pBt->inTra
2320: 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
2330: 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f 2a  WRITE );.  .  /*
2340: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2350: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
2360: 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73 20  shared-cache is 
2370: 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20  not enabled */. 
2380: 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
2390: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
23a0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
23b0: 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74 68    /* If some oth
23c0: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  er connection is
23d0: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63 6c   holding an excl
23e0: 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65 0a  usive lock, the.
23f0: 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20 6c    ** requested l
2400: 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f  ock may not be o
2410: 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20  btained..  */.  
2420: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
2430: 21 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74 73  !=p && (pBt->bts
2440: 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43 4c  Flags & BTS_EXCL
2450: 55 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20 20  USIVE)!=0 ){.   
2460: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
2470: 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
2480: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
2490: 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  b);.    return S
24a0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
24b0: 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20  REDCACHE;.  }.. 
24c0: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
24d0: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
24e0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
24f0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ){.    /* The co
2500: 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d 3e  ndition (pIter->
2510: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e  eLock!=eLock) in
2520: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
2530: 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20 73  f(...) .    ** s
2540: 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73 69  tatement is a si
2550: 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66 3a  mplification of:
2560: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2570: 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c   (eLock==WRITE_L
2580: 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c  OCK || pIter->eL
2590: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 29  ock==WRITE_LOCK)
25a0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73  .    **.    ** s
25b0: 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61  ince we know tha
25c0: 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  t if eLock==WRIT
25d0: 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f 20  E_LOCK, then no 
25e0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
25f0: 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c 64  .    ** may hold
2600: 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e   a WRITE_LOCK on
2610: 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74 68   any table in th
2620: 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20 74  is file (since t
2630: 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a 20  here can.    ** 
2640: 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65  only be a single
2650: 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a 2f   writer)..    */
2660: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
2670: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  er->eLock==READ_
2680: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
2690: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
26a0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
26b0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26c0: 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72 65   || pIter->pBtre
26d0: 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e 65  e==p || pIter->e
26e0: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29  Lock==READ_LOCK)
26f0: 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
2700: 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49  >pBtree!=p && pI
2710: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
2720: 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f 63  b && pIter->eLoc
2730: 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k!=eLock ){.    
2740: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2750: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
2760: 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  , pIter->pBtree-
2770: 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
2780: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
2790: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
27a0: 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57 72  ert( p==pBt->pWr
27b0: 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20  iter );.        
27c0: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
27d0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20   BTS_PENDING;.  
27e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
27f0: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2800: 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
2810: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2820: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
2830: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
2840: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
2850: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
2860: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2870: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64  _CACHE./*.** Add
2880: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74   a lock on the t
2890: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
28a0: 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74 68  age iTable to th
28b0: 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 75  e shared-btree u
28c0: 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65 20  sed.** by Btree 
28d0: 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d 65  handle p. Parame
28e0: 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62  ter eLock must b
28f0: 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c 4f  e either READ_LO
2900: 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f  CK or .** WRITE_
2910: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  LOCK..**.** This
2920: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
2930: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
2940: 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68 65  .**.**   (a) The
2950: 20 73 70 65 63 69 66 69 65 64 20 42 74 72 65 65   specified Btree
2960: 20 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f 6e   object p is con
2970: 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68 61 72  nected to a shar
2980: 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64 61  able.**       da
2990: 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74 68  tabase (one with
29a0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73 68   the BtShared.sh
29b0: 61 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74 29  arable flag set)
29c0: 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62  , and.**.**   (b
29d0: 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65 65  ) No other Btree
29e0: 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61 20   objects hold a 
29f0: 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c 69  lock that confli
2a00: 63 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69 74  cts.**       wit
2a10: 68 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  h the requested 
2a20: 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72 79  lock (i.e. query
2a30: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2a40: 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20 20  Lock() has.**   
2a50: 20 20 20 20 61 6c 72 65 61 64 79 20 62 65 65 6e      already been
2a60: 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74 75   called and retu
2a70: 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29 2e  rned SQLITE_OK).
2a80: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
2a90: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2aa0: 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64 65  the lock is adde
2ab0: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20  d successfully. 
2ac0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a  SQLITE_NOMEM .**
2ad0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2ae0: 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70 74  a malloc attempt
2af0: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
2b00: 63 20 69 6e 74 20 73 65 74 53 68 61 72 65 64 43  c int setSharedC
2b10: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74  acheTableLock(Bt
2b20: 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61  ree *p, Pgno iTa
2b30: 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a  ble, u8 eLock){.
2b40: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2b50: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f  = p->pBt;.  BtLo
2b60: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20  ck *pLock = 0;. 
2b70: 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
2b80: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2b90: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
2ba0: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
2bb0: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2bc0: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49  CK || eLock==WRI
2bd0: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  TE_LOCK );.  ass
2be0: 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b  ert( p->db!=0 );
2bf0: 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74  ..  /* A connect
2c00: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65 61  ion with the rea
2c10: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
2c20: 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76 65  ag set will neve
2c30: 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f 62  r try to.  ** ob
2c40: 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b  tain a read-lock
2c50: 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63   using this func
2c60: 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 72  tion. The only r
2c70: 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65  ead-lock obtaine
2c80: 64 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e 6e  d.  ** by a conn
2c90: 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d 75  ection in read-u
2ca0: 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65 20  ncommitted mode 
2cb0: 69 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65  is on the sqlite
2cc0: 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74 61  _master .  ** ta
2cd0: 62 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c 6f  ble, and that lo
2ce0: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69  ck is obtained i
2cf0: 6e 20 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  n BtreeBeginTran
2d00: 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  s().  */.  asser
2d10: 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c  t( 0==(p->db->fl
2d20: 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55  ags&SQLITE_ReadU
2d30: 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 65  ncommitted) || e
2d40: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
2d50: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   );..  /* This f
2d60: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f  unction should o
2d70: 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  nly be called on
2d80: 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74 72   a sharable b-tr
2d90: 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20 2a  ee after it .  *
2da0: 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65 72  * has been deter
2db0: 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f 74  mined that no ot
2dc0: 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64 73  her b-tree holds
2dd0: 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c   a conflicting l
2de0: 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ock.  */.  asser
2df0: 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  t( p->sharable )
2e00: 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
2e10: 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72  TE_OK==queryShar
2e20: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e30: 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63  (p, iTable, eLoc
2e40: 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72 73  k) );..  /* Firs
2e50: 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69 73  t search the lis
2e60: 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  t for an existin
2e70: 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74  g lock on this t
2e80: 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70  able. */.  for(p
2e90: 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
2ea0: 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
2eb0: 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
2ec0: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61 62   if( pIter->iTab
2ed0: 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 49  le==iTable && pI
2ee0: 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ter->pBtree==p )
2ef0: 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20  {.      pLock = 
2f00: 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72 65  pIter;.      bre
2f10: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
2f20: 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65   /* If the above
2f30: 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74 20   search did not 
2f40: 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73 74  find a BtLock st
2f50: 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e 67  ruct associating
2f60: 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77 69   Btree p.  ** wi
2f70: 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2c  th table iTable,
2f80: 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e   allocate one an
2f90: 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74  d link it into t
2fa0: 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  he list..  */.  
2fb0: 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20  if( !pLock ){.  
2fc0: 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63    pLock = (BtLoc
2fd0: 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  k *)sqlite3Mallo
2fe0: 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c  cZero(sizeof(BtL
2ff0: 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20 21  ock));.    if( !
3000: 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72  pLock ){.      r
3010: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
3020: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  EM;.    }.    pL
3030: 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54  ock->iTable = iT
3040: 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d  able;.    pLock-
3050: 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20  >pBtree = p;.   
3060: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20   pLock->pNext = 
3070: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20  pBt->pLock;.    
3080: 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f  pBt->pLock = pLo
3090: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  ck;.  }..  /* Se
30a0: 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f  t the BtLock.eLo
30b0: 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74  ck variable to t
30c0: 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68  he maximum of th
30d0: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20  e current lock. 
30e0: 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 71 75   ** and the requ
30f0: 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73  ested lock. This
3100: 20 6d 65 61 6e 73 20 69 66 20 61 20 77 72 69 74   means if a writ
3110: 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65 61  e-lock was alrea
3120: 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64  dy held.  ** and
3130: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71   a read-lock req
3140: 75 65 73 74 65 64 2c 20 77 65 20 64 6f 6e 27 74  uested, we don't
3150: 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f 77   incorrectly dow
3160: 6e 67 72 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e  ngrade the lock.
3170: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
3180: 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f  WRITE_LOCK>READ_
3190: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c  LOCK );.  if( eL
31a0: 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b  ock>pLock->eLock
31b0: 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65   ){.    pLock->e
31c0: 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20  Lock = eLock;.  
31d0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
31e0: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
31f0: 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  /* !SQLITE_OMIT_
3200: 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a  SHARED_CACHE */.
3210: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
3220: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
3230: 45 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  E./*.** Release 
3240: 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f  all the table lo
3250: 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69  cks (locks obtai
3260: 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f  ned via calls to
3270: 0a 2a 2a 20 74 68 65 20 73 65 74 53 68 61 72 65  .** the setShare
3280: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
3290: 29 20 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c  ) procedure) hel
32a0: 64 20 62 79 20 42 74 72 65 65 20 6f 62 6a 65 63  d by Btree objec
32b0: 74 20 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  t p..**.** This 
32c0: 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73  function assumes
32d0: 20 74 68 61 74 20 42 74 72 65 65 20 70 20 68 61   that Btree p ha
32e0: 73 20 61 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f  s an open read o
32f0: 72 20 77 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e  r write .** tran
3300: 73 61 63 74 69 6f 6e 2e 20 49 66 20 69 74 20 64  saction. If it d
3310: 6f 65 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68  oes not, then th
3320: 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c  e BTS_PENDING fl
3330: 61 67 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63  ag.** may be inc
3340: 6f 72 72 65 63 74 6c 79 20 63 6c 65 61 72 65 64  orrectly cleared
3350: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3360: 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43   clearAllSharedC
3370: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42  acheTableLocks(B
3380: 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
3390: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
33a0: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70  Bt;.  BtLock **p
33b0: 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c  pIter = &pBt->pL
33c0: 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ock;..  assert( 
33d0: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
33e0: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
33f0: 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62  ssert( p->sharab
3400: 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72  le || 0==*ppIter
3410: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
3420: 3e 69 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20  >inTrans>0 );.. 
3430: 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20   while( *ppIter 
3440: 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70  ){.    BtLock *p
3450: 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a  Lock = *ppIter;.
3460: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42 74      assert( (pBt
3470: 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
3480: 5f 45 58 43 4c 55 53 49 56 45 29 3d 3d 30 20 7c  _EXCLUSIVE)==0 |
3490: 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d  | pBt->pWriter==
34a0: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b  pLock->pBtree );
34b0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f  .    assert( pLo
34c0: 63 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72  ck->pBtree->inTr
34d0: 61 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  ans>=pLock->eLoc
34e0: 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f  k );.    if( pLo
34f0: 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b  ck->pBtree==p ){
3500: 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d  .      *ppIter =
3510: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20   pLock->pNext;. 
3520: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
3530: 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c 7c  ck->iTable!=1 ||
3540: 20 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b   pLock==&p->lock
3550: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   );.      if( pL
3560: 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 29  ock->iTable!=1 )
3570: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3580: 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20  3_free(pLock);. 
3590: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
35a0: 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72 20 3d  {.      ppIter =
35b0: 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a   &pLock->pNext;.
35c0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
35d0: 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c  ert( (pBt->btsFl
35e0: 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e  ags & BTS_PENDIN
35f0: 47 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57  G)==0 || pBt->pW
3600: 72 69 74 65 72 20 29 3b 0a 20 20 69 66 28 20 70  riter );.  if( p
3610: 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29  Bt->pWriter==p )
3620: 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74  {.    pBt->pWrit
3630: 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  er = 0;.    pBt-
3640: 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42  >btsFlags &= ~(B
3650: 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53  TS_EXCLUSIVE|BTS
3660: 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65 6c  _PENDING);.  }el
3670: 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 61  se if( pBt->nTra
3680: 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20  nsaction==2 ){. 
3690: 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74     /* This funct
36a0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
36b0: 65 6e 20 42 74 72 65 65 20 70 20 69 73 20 63 6f  en Btree p is co
36c0: 6e 63 6c 75 64 69 6e 67 20 69 74 73 20 0a 20 20  ncluding its .  
36d0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
36e0: 2e 20 49 66 20 74 68 65 72 65 20 63 75 72 72 65  . If there curre
36f0: 6e 74 6c 79 20 65 78 69 73 74 73 20 61 20 77 72  ntly exists a wr
3700: 69 74 65 72 2c 20 61 6e 64 20 70 20 69 73 20 6e  iter, and p is n
3710: 6f 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77  ot.    ** that w
3720: 72 69 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20  riter, then the 
3730: 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20  number of locks 
3740: 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69  held by connecti
3750: 6f 6e 73 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a  ons other.    **
3760: 20 74 68 61 6e 20 74 68 65 20 77 72 69 74 65 72   than the writer
3770: 20 6d 75 73 74 20 62 65 20 61 62 6f 75 74 20 74   must be about t
3780: 6f 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20  o drop to zero. 
3790: 49 6e 20 74 68 69 73 20 63 61 73 65 0a 20 20 20  In this case.   
37a0: 20 2a 2a 20 73 65 74 20 74 68 65 20 42 54 53 5f   ** set the BTS_
37b0: 50 45 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f 20  PENDING flag to 
37c0: 30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  0..    **.    **
37d0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74   If there is not
37e0: 20 63 75 72 72 65 6e 74 6c 79 20 61 20 77 72 69   currently a wri
37f0: 74 65 72 2c 20 74 68 65 6e 20 42 54 53 5f 50 45  ter, then BTS_PE
3800: 4e 44 49 4e 47 20 6d 75 73 74 0a 20 20 20 20 2a  NDING must.    *
3810: 2a 20 62 65 20 7a 65 72 6f 20 61 6c 72 65 61 64  * be zero alread
3820: 79 2e 20 53 6f 20 74 68 69 73 20 6e 65 78 74 20  y. So this next 
3830: 6c 69 6e 65 20 69 73 20 68 61 72 6d 6c 65 73 73  line is harmless
3840: 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20   in that case.. 
3850: 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 62     */.    pBt->b
3860: 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f  tsFlags &= ~BTS_
3870: 50 45 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a 0a  PENDING;.  }.}..
3880: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
3890: 69 6f 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c 20  ion changes all 
38a0: 77 72 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c 64  write-locks held
38b0: 20 62 79 20 42 74 72 65 65 20 70 20 69 6e 74 6f   by Btree p into
38c0: 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a   read-locks..*/.
38d0: 73 74 61 74 69 63 20 76 6f 69 64 20 64 6f 77 6e  static void down
38e0: 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61  gradeAllSharedCa
38f0: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74  cheTableLocks(Bt
3900: 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
3910: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
3920: 74 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57  t;.  if( pBt->pW
3930: 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20  riter==p ){.    
3940: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20  BtLock *pLock;. 
3950: 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20     pBt->pWriter 
3960: 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74  = 0;.    pBt->bt
3970: 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53 5f  sFlags &= ~(BTS_
3980: 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50 45  EXCLUSIVE|BTS_PE
3990: 4e 44 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72 28  NDING);.    for(
39a0: 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pLock=pBt->pLock
39b0: 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70  ; pLock; pLock=p
39c0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Lock->pNext){.  
39d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63      assert( pLoc
39e0: 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  k->eLock==READ_L
39f0: 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70 42  OCK || pLock->pB
3a00: 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20 20  tree==p );.     
3a10: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20   pLock->eLock = 
3a20: 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  READ_LOCK;.    }
3a30: 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  .  }.}..#endif /
3a40: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  * SQLITE_OMIT_SH
3a50: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73  ARED_CACHE */..s
3a60: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
3a70: 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  sePage(MemPage *
3a80: 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72 77  pPage);  /* Forw
3a90: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
3aa0: 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69 73 20  ../*.***** This 
3ab0: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
3ac0: 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74  inside of assert
3ad0: 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a 2a 0a  () only ****.**.
3ae0: 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  ** Verify that t
3af0: 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64 73 20  he cursor holds 
3b00: 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 69 74 73  the mutex on its
3b10: 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69 66   BtShared.*/.#if
3b20: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
3b30: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75 72 73  .static int curs
3b40: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42 74 43  orHoldsMutex(BtC
3b50: 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65 74  ursor *p){.  ret
3b60: 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  urn sqlite3_mute
3b70: 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d  x_held(p->pBt->m
3b80: 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  utex);.}.#endif.
3b90: 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74  ./*.** Invalidat
3ba0: 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
3bb0: 61 63 68 65 20 6f 66 20 74 68 65 20 63 75 72 73  ache of the curs
3bc0: 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
3bd0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
3be0: 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65  .** on the share
3bf0: 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d btree structur
3c00: 65 20 70 42 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e  e pBt..*/.#defin
3c10: 65 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72  e invalidateOver
3c20: 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 20  flowCache(pCur) 
3c30: 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
3c40: 26 3d 20 7e 42 54 43 46 5f 56 61 6c 69 64 4f 76  &= ~BTCF_ValidOv
3c50: 66 6c 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c  fl)../*.** Inval
3c60: 69 64 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  idate the overfl
3c70: 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
3c80: 68 65 20 66 6f 72 20 61 6c 6c 20 63 75 72 73 6f  he for all curso
3c90: 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20  rs opened.** on 
3ca0: 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
3cb0: 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a   structure pBt..
3cc0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
3cd0: 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
3ce0: 66 6c 6f 77 43 61 63 68 65 28 42 74 53 68 61 72  flowCache(BtShar
3cf0: 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75  ed *pBt){.  BtCu
3d00: 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72  rsor *p;.  asser
3d10: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
3d20: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
3d30: 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74  ) );.  for(p=pBt
3d40: 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
3d50: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
3d60: 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f  nvalidateOverflo
3d70: 77 43 61 63 68 65 28 70 29 3b 0a 20 20 7d 0a 7d  wCache(p);.  }.}
3d80: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3d90: 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f  _OMIT_INCRBLOB./
3da0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
3db0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66  on is called bef
3dc0: 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  ore modifying th
3dd0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20  e contents of a 
3de0: 74 61 62 6c 65 0a 2a 2a 20 74 6f 20 69 6e 76 61  table.** to inva
3df0: 6c 69 64 61 74 65 20 61 6e 79 20 69 6e 63 72 62  lidate any incrb
3e00: 6c 6f 62 20 63 75 72 73 6f 72 73 20 74 68 61 74  lob cursors that
3e10: 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65   are open on the
3e20: 0a 2a 2a 20 72 6f 77 20 6f 72 20 6f 6e 65 20 6f  .** row or one o
3e30: 66 20 74 68 65 20 72 6f 77 73 20 62 65 69 6e 67  f the rows being
3e40: 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a   modified..**.**
3e50: 20 49 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43   If argument isC
3e60: 6c 65 61 72 54 61 62 6c 65 20 69 73 20 74 72 75  learTable is tru
3e70: 65 2c 20 74 68 65 6e 20 74 68 65 20 65 6e 74 69  e, then the enti
3e80: 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  re contents of t
3e90: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 61  he.** table is a
3ea0: 62 6f 75 74 20 74 6f 20 62 65 20 64 65 6c 65 74  bout to be delet
3eb0: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
3ec0: 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
3ed0: 69 6e 63 72 62 6c 6f 62 0a 2a 2a 20 63 75 72 73  incrblob.** curs
3ee0: 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 79 20  ors open on any 
3ef0: 72 6f 77 20 77 69 74 68 69 6e 20 74 68 65 20 74  row within the t
3f00: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
3f10: 61 67 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a  age pgnoRoot..**
3f20: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
3f30: 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65  f argument isCle
3f40: 61 72 54 61 62 6c 65 20 69 73 20 66 61 6c 73 65  arTable is false
3f50: 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 77 20 77  , then the row w
3f60: 69 74 68 0a 2a 2a 20 72 6f 77 69 64 20 69 52 6f  ith.** rowid iRo
3f70: 77 20 69 73 20 62 65 69 6e 67 20 72 65 70 6c 61  w is being repla
3f80: 63 65 64 20 6f 72 20 64 65 6c 65 74 65 64 2e 20  ced or deleted. 
3f90: 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e 76  In this case inv
3fa0: 61 6c 69 64 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20  alidate.** only 
3fb0: 74 68 6f 73 65 20 69 6e 63 72 62 6c 6f 62 20 63  those incrblob c
3fc0: 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  ursors open on t
3fd0: 68 61 74 20 73 70 65 63 69 66 69 63 20 72 6f 77  hat specific row
3fe0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3ff0: 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62   invalidateIncrb
4000: 6c 6f 62 43 75 72 73 6f 72 73 28 0a 20 20 42 74  lobCursors(.  Bt
4010: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 20 20 20  ree *pBtree,    
4020: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
4030: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 68  abase file to ch
4040: 65 63 6b 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f  eck */.  i64 iRo
4050: 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w,              
4060: 20 2f 2a 20 54 68 65 20 72 6f 77 69 64 20 74 68   /* The rowid th
4070: 61 74 20 6d 69 67 68 74 20 62 65 20 63 68 61 6e  at might be chan
4080: 67 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ging */.  int is
4090: 43 6c 65 61 72 54 61 62 6c 65 20 20 20 20 20 20  ClearTable      
40a0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6c 6c    /* True if all
40b0: 20 72 6f 77 73 20 61 72 65 20 62 65 69 6e 67 20   rows are being 
40c0: 64 65 6c 65 74 65 64 20 2a 2f 0a 29 7b 0a 20 20  deleted */.){.  
40d0: 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 42  BtCursor *p;.  B
40e0: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
40f0: 42 74 72 65 65 2d 3e 70 42 74 3b 0a 20 20 61 73  Btree->pBt;.  as
4100: 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
4110: 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 42 74  eeHoldsMutex(pBt
4120: 72 65 65 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d  ree) );.  for(p=
4130: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
4140: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
4150: 20 20 69 66 28 20 28 70 2d 3e 63 75 72 46 6c 61    if( (p->curFla
4160: 67 73 20 26 20 42 54 43 46 5f 49 6e 63 72 62 6c  gs & BTCF_Incrbl
4170: 6f 62 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28  ob)!=0.     && (
4180: 69 73 43 6c 65 61 72 54 61 62 6c 65 20 7c 7c 20  isClearTable || 
4190: 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 52  p->info.nKey==iR
41a0: 6f 77 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ow).    ){.     
41b0: 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52   p->eState = CUR
41c0: 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
41d0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a   }.  }.}..#else.
41e0: 20 20 2f 2a 20 53 74 75 62 20 66 75 6e 63 74 69    /* Stub functi
41f0: 6f 6e 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f 42  on when INCRBLOB
4200: 20 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a 20   is omitted */. 
4210: 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64   #define invalid
4220: 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f  ateIncrblobCurso
4230: 72 73 28 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66  rs(x,y,z).#endif
4240: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
4250: 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a  INCRBLOB */../*.
4260: 2a 2a 20 53 65 74 20 62 69 74 20 70 67 6e 6f 20  ** Set bit pgno 
4270: 6f 66 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  of the BtShared.
4280: 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76  pHasContent bitv
4290: 65 63 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c  ec. This is call
42a0: 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61 20 70 61  ed .** when a pa
42b0: 67 65 20 74 68 61 74 20 70 72 65 76 69 6f 75 73  ge that previous
42c0: 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 64 61 74  ly contained dat
42d0: 61 20 62 65 63 6f 6d 65 73 20 61 20 66 72 65 65  a becomes a free
42e0: 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a 2a 20 70  -list leaf .** p
42f0: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42  age..**.** The B
4300: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
4310: 65 6e 74 20 62 69 74 76 65 63 20 65 78 69 73 74  ent bitvec exist
4320: 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  s to work around
4330: 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a 2a 20 62   an obscure.** b
4340: 75 67 20 63 61 75 73 65 64 20 62 79 20 74 68 65  ug caused by the
4350: 20 69 6e 74 65 72 61 63 74 69 6f 6e 20 6f 66 20   interaction of 
4360: 74 77 6f 20 75 73 65 66 75 6c 20 49 4f 20 6f 70  two useful IO op
4370: 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73 75 72 72  timizations surr
4380: 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72 65 65 2d  ounding.** free-
4390: 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73 3a  list leaf pages:
43a0: 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57 68 65 6e  .**.**   1) When
43b0: 20 61 6c 6c 20 64 61 74 61 20 69 73 20 64 65 6c   all data is del
43c0: 65 74 65 64 20 66 72 6f 6d 20 61 20 70 61 67 65  eted from a page
43d0: 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 62 65   and the page be
43e0: 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20 20 61 20  comes.**      a 
43f0: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
4400: 61 67 65 2c 20 74 68 65 20 70 61 67 65 20 69 73  age, the page is
4410: 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20   not written to 
4420: 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
4430: 20 20 20 20 20 28 61 73 20 66 72 65 65 2d 6c 69       (as free-li
4440: 73 74 20 6c 65 61 66 20 70 61 67 65 73 20 63 6f  st leaf pages co
4450: 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67  ntain no meaning
4460: 66 75 6c 20 64 61 74 61 29 2e 20 53 6f 6d 65 74  ful data). Somet
4470: 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20 73 75 63  imes.**      suc
4480: 68 20 61 20 70 61 67 65 20 69 73 20 6e 6f 74 20  h a page is not 
4490: 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c 65 64 20  even journalled 
44a0: 28 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20  (as it will not 
44b0: 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a 20  be modified,.** 
44c0: 20 20 20 20 20 77 68 79 20 62 6f 74 68 65 72 20       why bother 
44d0: 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69 74 3f 29  journalling it?)
44e0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65  ..**.**   2) Whe
44f0: 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  n a free-list le
4500: 61 66 20 70 61 67 65 20 69 73 20 72 65 75 73 65  af page is reuse
4510: 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 69  d, its content i
4520: 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a 20 20 20  s not read.**   
4530: 20 20 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61     from the data
4540: 62 61 73 65 20 6f 72 20 77 72 69 74 74 65 6e 20  base or written 
4550: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
4560: 69 6c 65 20 28 77 68 79 20 73 68 6f 75 6c 64 20  ile (why should 
4570: 69 74 0a 2a 2a 20 20 20 20 20 20 62 65 2c 20 69  it.**      be, i
4580: 66 20 69 74 20 69 73 20 6e 6f 74 20 61 74 20 61  f it is not at a
4590: 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c 3f 29 2e  ll meaningful?).
45a0: 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65 6d 73 65  .**.** By themse
45b0: 6c 76 65 73 2c 20 74 68 65 73 65 20 6f 70 74 69  lves, these opti
45c0: 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72 6b 20 66  mizations work f
45d0: 69 6e 65 20 61 6e 64 20 70 72 6f 76 69 64 65 20  ine and provide 
45e0: 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65 72 66 6f  a handy.** perfo
45f0: 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20 74 6f 20  rmance boost to 
4600: 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f 72 20 69  bulk delete or i
4610: 6e 73 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73  nsert operations
4620: 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 0a 2a 2a  . However, if.**
4630: 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64   a page is moved
4640: 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73   to the free-lis
4650: 74 20 61 6e 64 20 74 68 65 6e 20 72 65 75 73 65  t and then reuse
4660: 64 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d  d within the sam
4670: 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
4680: 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63 6f 6d 65  , a problem come
4690: 73 20 75 70 2e 20 49 66 20 74 68 65 20 70 61 67  s up. If the pag
46a0: 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c  e is not journal
46b0: 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69 74 20 69  led when.** it i
46c0: 73 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66  s moved to the f
46d0: 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 69 74 20  ree-list and it 
46e0: 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72  is also not jour
46f0: 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 0a 2a  nalled when it.*
4700: 2a 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  * is extracted f
4710: 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73  rom the free-lis
4720: 74 20 61 6e 64 20 72 65 75 73 65 64 2c 20 74 68  t and reused, th
4730: 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  en the original 
4740: 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62 65 20 6c  data.** may be l
4750: 6f 73 74 2e 20 49 6e 20 74 68 65 20 65 76 65 6e  ost. In the even
4760: 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2c  t of a rollback,
4770: 20 69 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 70   it may not be p
4780: 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f 20 72 65  ossible.** to re
4790: 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
47a0: 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  se to its origin
47b0: 61 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  al configuration
47c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 6f 6c 75  ..**.** The solu
47d0: 74 69 6f 6e 20 69 73 20 74 68 65 20 42 74 53 68  tion is the BtSh
47e0: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
47f0: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
4800: 72 20 61 20 70 61 67 65 20 69 73 20 0a 2a 2a 20  r a page is .** 
4810: 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f 6d 65 20  moved to become 
4820: 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
4830: 20 70 61 67 65 2c 20 74 68 65 20 63 6f 72 72 65   page, the corre
4840: 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 0a  sponding bit is.
4850: 2a 2a 20 73 65 74 20 69 6e 20 74 68 65 20 62 69  ** set in the bi
4860: 74 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61  tvec. Whenever a
4870: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 65 78   leaf page is ex
4880: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
4890: 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f   free-list,.** o
48a0: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32 20 61 62  ptimization 2 ab
48b0: 6f 76 65 20 69 73 20 6f 6d 69 74 74 65 64 20 69  ove is omitted i
48c0: 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  f the correspond
48d0: 69 6e 67 20 62 69 74 20 69 73 20 61 6c 72 65 61  ing bit is alrea
48e0: 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20 42 74 53  dy.** set in BtS
48f0: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
4900: 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20  t. The contents 
4910: 6f 66 20 74 68 65 20 62 69 74 76 65 63 20 61 72  of the bitvec ar
4920: 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20 61 74 20  e cleared.** at 
4930: 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79  the end of every
4940: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f   transaction..*/
4950: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
4960: 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42  eSetHasContent(B
4970: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
4980: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  no pgno){.  int 
4990: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
49a0: 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73    if( !pBt->pHas
49b0: 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 61  Content ){.    a
49c0: 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d 70 42 74  ssert( pgno<=pBt
49d0: 2d 3e 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 70  ->nPage );.    p
49e0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
49f0: 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43  = sqlite3BitvecC
4a00: 72 65 61 74 65 28 70 42 74 2d 3e 6e 50 61 67 65  reate(pBt->nPage
4a10: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 42 74 2d  );.    if( !pBt-
4a20: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a  >pHasContent ){.
4a30: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
4a40: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
4a50: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
4a60: 49 54 45 5f 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d  ITE_OK && pgno<=
4a70: 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a  sqlite3BitvecSiz
4a80: 65 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65  e(pBt->pHasConte
4a90: 6e 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  nt) ){.    rc = 
4aa0: 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
4ab0: 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  (pBt->pHasConten
4ac0: 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  t, pgno);.  }.  
4ad0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
4ae0: 0a 2a 2a 20 51 75 65 72 79 20 74 68 65 20 42 74  .** Query the Bt
4af0: 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65  Shared.pHasConte
4b00: 6e 74 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a  nt vector..**.**
4b10: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
4b20: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
4b30: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
4b40: 61 67 65 20 69 73 20 72 65 6d 6f 76 65 64 20 66  age is removed f
4b50: 72 6f 6d 20 74 68 65 0a 2a 2a 20 66 72 65 65 2d  rom the.** free-
4b60: 6c 69 73 74 20 66 6f 72 20 72 65 75 73 65 2e 20  list for reuse. 
4b70: 49 74 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65  It returns false
4b80: 20 69 66 20 69 74 20 69 73 20 73 61 66 65 20 74   if it is safe t
4b90: 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 0a 2a  o retrieve the.*
4ba0: 2a 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  * page from the 
4bb0: 70 61 67 65 72 20 6c 61 79 65 72 20 77 69 74 68  pager layer with
4bc0: 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74   the 'no-content
4bd0: 27 20 66 6c 61 67 20 73 65 74 2e 20 54 72 75 65  ' flag set. True
4be0: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
4bf0: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47  tatic int btreeG
4c00: 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53  etHasContent(BtS
4c10: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
4c20: 20 70 67 6e 6f 29 7b 0a 20 20 42 69 74 76 65 63   pgno){.  Bitvec
4c30: 20 2a 70 20 3d 20 70 42 74 2d 3e 70 48 61 73 43   *p = pBt->pHasC
4c40: 6f 6e 74 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e  ontent;.  return
4c50: 20 28 70 20 26 26 20 28 70 67 6e 6f 3e 73 71 6c   (p && (pgno>sql
4c60: 69 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70  ite3BitvecSize(p
4c70: 29 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76  ) || sqlite3Bitv
4c80: 65 63 54 65 73 74 28 70 2c 20 70 67 6e 6f 29 29  ecTest(p, pgno))
4c90: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  );.}../*.** Clea
4ca0: 72 20 28 64 65 73 74 72 6f 79 29 20 74 68 65 20  r (destroy) the 
4cb0: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
4cc0: 74 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69  tent bitvec. Thi
4cd0: 73 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69  s should be.** i
4ce0: 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f  nvoked at the co
4cf0: 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 65 61 63 68  nclusion of each
4d00: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
4d10: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
4d20: 69 64 20 62 74 72 65 65 43 6c 65 61 72 48 61 73  id btreeClearHas
4d30: 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64  Content(BtShared
4d40: 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65   *pBt){.  sqlite
4d50: 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
4d60: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29  Bt->pHasContent)
4d70: 3b 0a 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e  ;.  pBt->pHasCon
4d80: 74 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  tent = 0;.}../*.
4d90: 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 6f  ** Release all o
4da0: 66 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20 70  f the apPage[] p
4db0: 61 67 65 73 20 66 6f 72 20 61 20 63 75 72 73 6f  ages for a curso
4dc0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
4dd0: 64 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c  d btreeReleaseAl
4de0: 6c 43 75 72 73 6f 72 50 61 67 65 73 28 42 74 43  lCursorPages(BtC
4df0: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
4e00: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
4e10: 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65  ; i<=pCur->iPage
4e20: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65  ; i++){.    rele
4e30: 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70  asePage(pCur->ap
4e40: 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 70 43  Page[i]);.    pC
4e50: 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20  ur->apPage[i] = 
4e60: 30 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69  0;.  }.  pCur->i
4e70: 50 61 67 65 20 3d 20 2d 31 3b 0a 7d 0a 0a 0a 2f  Page = -1;.}.../
4e80: 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75  *.** Save the cu
4e90: 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
4ea0: 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72  ition in the var
4eb0: 69 61 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e  iables BtCursor.
4ec0: 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43  nKey .** and BtC
4ed0: 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20  ursor.pKey. The 
4ee0: 63 75 72 73 6f 72 27 73 20 73 74 61 74 65 20 69  cursor's state i
4ef0: 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f  s set to CURSOR_
4f00: 52 45 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a  REQUIRESEEK..**.
4f10: 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
4f20: 73 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  st ensure that t
4f30: 68 65 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c  he cursor is val
4f40: 69 64 20 28 68 61 73 20 65 53 74 61 74 65 3d 3d  id (has eState==
4f50: 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a  CURSOR_VALID).**
4f60: 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
4f70: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
4f80: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
4f90: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
4fa0: 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  on(BtCursor *pCu
4fb0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  r){.  int rc;.. 
4fc0: 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
4fd0: 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
4fe0: 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ate );.  assert(
4ff0: 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29   0==pCur->pKey )
5000: 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
5010: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
5020: 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71  r) );..  rc = sq
5030: 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
5040: 65 28 70 43 75 72 2c 20 26 70 43 75 72 2d 3e 6e  e(pCur, &pCur->n
5050: 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Key);.  assert( 
5060: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
5070: 20 20 2f 2a 20 4b 65 79 53 69 7a 65 28 29 20 63    /* KeySize() c
5080: 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 0a 20  annot fail */.. 
5090: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
50a0: 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c 65 2c 20  n intKey table, 
50b0: 74 68 65 6e 20 74 68 65 20 61 62 6f 76 65 20 63  then the above c
50c0: 61 6c 6c 20 74 6f 20 42 74 72 65 65 4b 65 79 53  all to BtreeKeyS
50d0: 69 7a 65 28 29 0a 20 20 2a 2a 20 73 74 6f 72 65  ize().  ** store
50e0: 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65  s the integer ke
50f0: 79 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 2e  y in pCur->nKey.
5100: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
5110: 69 73 20 76 61 6c 75 65 20 69 73 0a 20 20 2a 2a  is value is.  **
5120: 20 61 6c 6c 20 74 68 61 74 20 69 73 20 72 65 71   all that is req
5130: 75 69 72 65 64 2e 20 4f 74 68 65 72 77 69 73 65  uired. Otherwise
5140: 2c 20 69 66 20 70 43 75 72 20 69 73 20 6e 6f 74  , if pCur is not
5150: 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 4b   open on an intK
5160: 65 79 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 74  ey.  ** table, t
5170: 68 65 6e 20 6d 61 6c 6c 6f 63 20 73 70 61 63 65  hen malloc space
5180: 20 66 6f 72 20 61 6e 64 20 73 74 6f 72 65 20 74   for and store t
5190: 68 65 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79  he pCur->nKey by
51a0: 74 65 73 20 6f 66 20 6b 65 79 20 0a 20 20 2a 2a  tes of key .  **
51b0: 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20 20 69 66   data..  */.  if
51c0: 28 20 30 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67  ( 0==pCur->apPag
51d0: 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  e[0]->intKey ){.
51e0: 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d      void *pKey =
51f0: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20   sqlite3Malloc( 
5200: 70 43 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20  pCur->nKey );.  
5210: 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20    if( pKey ){.  
5220: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
5230: 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30  BtreeKey(pCur, 0
5240: 2c 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65  , (int)pCur->nKe
5250: 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20  y, pKey);.      
5260: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
5270: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  K ){.        pCu
5280: 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a  r->pKey = pKey;.
5290: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
52a0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
52b0: 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d  e(pKey);.      }
52c0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
52d0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
52e0: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
52f0: 20 61 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e   assert( !pCur->
5300: 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65  apPage[0]->intKe
5310: 79 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79  y || !pCur->pKey
5320: 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53   );..  if( rc==S
5330: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5340: 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43  btreeReleaseAllC
5350: 75 72 73 6f 72 50 61 67 65 73 28 70 43 75 72 29  ursorPages(pCur)
5360: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  ;.    pCur->eSta
5370: 74 65 20 3d 20 43 55 52 53 4f 52 5f 52 45 51 55  te = CURSOR_REQU
5380: 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20  IRESEEK;.  }..  
5390: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
53a0: 6f 77 43 61 63 68 65 28 70 43 75 72 29 3b 0a 20  owCache(pCur);. 
53b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
53c0: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
53d0: 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nce */.static in
53e0: 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  t SQLITE_NOINLIN
53f0: 45 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c  E saveCursorsOnL
5400: 69 73 74 28 42 74 43 75 72 73 6f 72 2a 2c 50 67  ist(BtCursor*,Pg
5410: 6e 6f 2c 42 74 43 75 72 73 6f 72 2a 29 3b 0a 0a  no,BtCursor*);..
5420: 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 70  /*.** Save the p
5430: 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c 20  ositions of all 
5440: 63 75 72 73 6f 72 73 20 28 65 78 63 65 70 74 20  cursors (except 
5450: 70 45 78 63 65 70 74 29 20 74 68 61 74 20 61 72  pExcept) that ar
5460: 65 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65  e open on.** the
5470: 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74   table with root
5480: 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20 20 22 53  -page iRoot.  "S
5490: 61 76 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72  aving the cursor
54a0: 20 70 6f 73 69 74 69 6f 6e 22 20 6d 65 61 6e 73   position" means
54b0: 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6c 6f 63   that.** the loc
54c0: 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 62 74 72  ation in the btr
54d0: 65 65 20 69 73 20 72 65 6d 65 6d 62 65 72 65 64  ee is remembered
54e0: 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 74   in such a way t
54f0: 68 61 74 20 69 74 20 63 61 6e 20 62 65 0a 2a 2a  hat it can be.**
5500: 20 6d 6f 76 65 64 20 62 61 63 6b 20 74 6f 20 74   moved back to t
5510: 68 65 20 73 61 6d 65 20 73 70 6f 74 20 61 66 74  he same spot aft
5520: 65 72 20 74 68 65 20 62 74 72 65 65 20 68 61 73  er the btree has
5530: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20   been modified. 
5540: 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
5550: 20 69 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20   is called just 
5560: 62 65 66 6f 72 65 20 63 75 72 73 6f 72 20 70 45  before cursor pE
5570: 78 63 65 70 74 20 69 73 20 75 73 65 64 20 74 6f  xcept is used to
5580: 20 6d 6f 64 69 66 79 20 74 68 65 0a 2a 2a 20 74   modify the.** t
5590: 61 62 6c 65 2c 20 66 6f 72 20 65 78 61 6d 70 6c  able, for exampl
55a0: 65 20 69 6e 20 42 74 72 65 65 44 65 6c 65 74 65  e in BtreeDelete
55b0: 28 29 20 6f 72 20 42 74 72 65 65 49 6e 73 65 72  () or BtreeInser
55c0: 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65  t()..**.** Imple
55d0: 6d 65 6e 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20  mentation note: 
55e0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 65   This routine me
55f0: 72 65 6c 79 20 63 68 65 63 6b 73 20 74 6f 20 73  rely checks to s
5600: 65 65 20 69 66 20 61 6e 79 20 63 75 72 73 6f 72  ee if any cursor
5610: 73 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20  s.** need to be 
5620: 73 61 76 65 64 2e 20 20 49 74 20 63 61 6c 6c 73  saved.  It calls
5630: 20 6f 75 74 20 74 6f 20 73 61 76 65 43 75 72 73   out to saveCurs
5640: 6f 72 73 4f 6e 4c 69 73 74 28 29 20 69 6e 20 74  orsOnList() in t
5650: 68 65 20 28 75 6e 75 73 75 61 6c 29 0a 2a 2a 20  he (unusual).** 
5660: 65 76 65 6e 74 20 74 68 61 74 20 63 75 72 73 6f  event that curso
5670: 72 73 20 61 72 65 20 69 6e 20 6e 65 65 64 20 74  rs are in need t
5680: 6f 20 62 65 69 6e 67 20 73 61 76 65 64 2e 0a 2a  o being saved..*
5690: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  /.static int sav
56a0: 65 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 53 68  eAllCursors(BtSh
56b0: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
56c0: 69 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20  iRoot, BtCursor 
56d0: 2a 70 45 78 63 65 70 74 29 7b 0a 20 20 42 74 43  *pExcept){.  BtC
56e0: 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65  ursor *p;.  asse
56f0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
5700: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
5710: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
5720: 70 45 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45  pExcept==0 || pE
5730: 78 63 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20  xcept->pBt==pBt 
5740: 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e  );.  for(p=pBt->
5750: 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
5760: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
5770: 20 70 21 3d 70 45 78 63 65 70 74 20 26 26 20 28   p!=pExcept && (
5780: 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70  0==iRoot || p->p
5790: 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20  gnoRoot==iRoot) 
57a0: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ) break;.  }.  r
57b0: 65 74 75 72 6e 20 70 20 3f 20 73 61 76 65 43 75  eturn p ? saveCu
57c0: 72 73 6f 72 73 4f 6e 4c 69 73 74 28 70 2c 20 69  rsorsOnList(p, i
57d0: 52 6f 6f 74 2c 20 70 45 78 63 65 70 74 29 20 3a  Root, pExcept) :
57e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
57f0: 2a 20 54 68 69 73 20 68 65 6c 70 65 72 20 72 6f  * This helper ro
5800: 75 74 69 6e 65 20 74 6f 20 73 61 76 65 41 6c 6c  utine to saveAll
5810: 43 75 72 73 6f 72 73 20 64 6f 65 73 20 74 68 65  Cursors does the
5820: 20 61 63 74 75 61 6c 20 77 6f 72 6b 20 6f 66 20   actual work of 
5830: 73 61 76 69 6e 67 0a 2a 2a 20 74 68 65 20 63 75  saving.** the cu
5840: 72 73 6f 72 73 20 69 66 20 61 6e 64 20 77 68 65  rsors if and whe
5850: 6e 20 61 20 63 75 72 73 6f 72 20 69 73 20 66 6f  n a cursor is fo
5860: 75 6e 64 20 74 68 61 74 20 61 63 74 75 61 6c 6c  und that actuall
5870: 79 20 72 65 71 75 69 72 65 73 20 73 61 76 69 6e  y requires savin
5880: 67 2e 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e  g..** The common
5890: 20 63 61 73 65 20 69 73 20 74 68 61 74 20 6e 6f   case is that no
58a0: 20 63 75 72 73 6f 72 73 20 6e 65 65 64 20 74 6f   cursors need to
58b0: 20 62 65 20 73 61 76 65 64 2c 20 73 6f 20 74 68   be saved, so th
58c0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a  is routine is.**
58d0: 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d   broken out from
58e0: 20 69 74 73 20 63 61 6c 6c 65 72 20 74 6f 20 61   its caller to a
58f0: 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79  void unnecessary
5900: 20 73 74 61 63 6b 20 70 6f 69 6e 74 65 72 20 6d   stack pointer m
5910: 6f 76 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  ovement..*/.stat
5920: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f  ic int SQLITE_NO
5930: 49 4e 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f  INLINE saveCurso
5940: 72 73 4f 6e 4c 69 73 74 28 0a 20 20 42 74 43 75  rsOnList(.  BtCu
5950: 72 73 6f 72 20 2a 70 2c 20 20 20 20 20 20 20 20  rsor *p,        
5960: 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 63 75   /* The first cu
5970: 72 73 6f 72 20 74 68 61 74 20 6e 65 65 64 73 20  rsor that needs 
5980: 73 61 76 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f  saving */.  Pgno
5990: 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20   iRoot,         
59a0: 20 2f 2a 20 4f 6e 6c 79 20 73 61 76 65 20 63 75   /* Only save cu
59b0: 72 73 6f 72 20 77 69 74 68 20 74 68 69 73 20 69  rsor with this i
59c0: 52 6f 6f 74 2e 20 53 61 76 65 20 61 6c 6c 20 69  Root. Save all i
59d0: 66 20 7a 65 72 6f 20 2a 2f 0a 20 20 42 74 43 75  f zero */.  BtCu
59e0: 72 73 6f 72 20 2a 70 45 78 63 65 70 74 20 20 20  rsor *pExcept   
59f0: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 61 76 65 20   /* Do not save 
5a00: 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 29  this cursor */.)
5a10: 7b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20  {.  do{.    if( 
5a20: 70 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30  p!=pExcept && (0
5a30: 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67  ==iRoot || p->pg
5a40: 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29  noRoot==iRoot) )
5a50: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65  {.      if( p->e
5a60: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
5a70: 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 69  LID ){.        i
5a80: 6e 74 20 72 63 20 3d 20 73 61 76 65 43 75 72 73  nt rc = saveCurs
5a90: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20  orPosition(p);. 
5aa0: 20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54         if( SQLIT
5ab0: 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK!=rc ){.    
5ac0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
5ad0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5ae0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5af0: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 69 50 61  testcase( p->iPa
5b00: 67 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ge>0 );.        
5b10: 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43  btreeReleaseAllC
5b20: 75 72 73 6f 72 50 61 67 65 73 28 70 29 3b 0a 20  ursorPages(p);. 
5b30: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
5b40: 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20   p = p->pNext;. 
5b50: 20 7d 77 68 69 6c 65 28 20 70 20 29 3b 0a 20 20   }while( p );.  
5b60: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
5b70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
5b80: 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
5b90: 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f  sor position..*/
5ba0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
5bb0: 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 42 74  eeClearCursor(Bt
5bc0: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
5bd0: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
5be0: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
5bf0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
5c00: 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20  e(pCur->pKey);. 
5c10: 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b   pCur->pKey = 0;
5c20: 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20  .  pCur->eState 
5c30: 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
5c40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68  ;.}../*.** In th
5c50: 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 42 74  is version of Bt
5c60: 72 65 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20  reeMoveto, pKey 
5c70: 69 73 20 61 20 70 61 63 6b 65 64 20 69 6e 64 65  is a packed inde
5c80: 78 20 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68  x record.** such
5c90: 20 61 73 20 69 73 20 67 65 6e 65 72 61 74 65 64   as is generated
5ca0: 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52   by the OP_MakeR
5cb0: 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20 55  ecord opcode.  U
5cc0: 6e 70 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63  npack the.** rec
5cd0: 6f 72 64 20 61 6e 64 20 74 68 65 6e 20 63 61 6c  ord and then cal
5ce0: 6c 20 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  l BtreeMovetoUnp
5cf0: 61 63 6b 65 64 28 29 20 74 6f 20 64 6f 20 74 68  acked() to do th
5d00: 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69  e work..*/.stati
5d10: 63 20 69 6e 74 20 62 74 72 65 65 4d 6f 76 65 74  c int btreeMovet
5d20: 6f 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  o(.  BtCursor *p
5d30: 43 75 72 2c 20 20 20 20 20 2f 2a 20 43 75 72 73  Cur,     /* Curs
5d40: 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62  or open on the b
5d50: 74 72 65 65 20 74 6f 20 62 65 20 73 65 61 72 63  tree to be searc
5d60: 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  hed */.  const v
5d70: 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20  oid *pKey,   /* 
5d80: 50 61 63 6b 65 64 20 6b 65 79 20 69 66 20 74 68  Packed key if th
5d90: 65 20 62 74 72 65 65 20 69 73 20 61 6e 20 69 6e  e btree is an in
5da0: 64 65 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65  dex */.  i64 nKe
5db0: 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y,           /* 
5dc0: 49 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20  Integer key for 
5dd0: 74 61 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66  tables.  Size of
5de0: 20 70 4b 65 79 20 66 6f 72 20 69 6e 64 69 63 65   pKey for indice
5df0: 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c  s */.  int bias,
5e00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
5e10: 61 73 20 73 65 61 72 63 68 20 74 6f 20 74 68 65  as search to the
5e20: 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69   high end */.  i
5e30: 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20  nt *pRes        
5e40: 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72     /* Write sear
5e50: 63 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  ch results here 
5e60: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
5e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e80: 20 20 20 2f 2a 20 53 74 61 74 75 73 20 63 6f 64     /* Status cod
5e90: 65 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  e */.  UnpackedR
5ea0: 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b 20  ecord *pIdxKey; 
5eb0: 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e    /* Unpacked in
5ec0: 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 63 68 61  dex key */.  cha
5ed0: 72 20 61 53 70 61 63 65 5b 32 30 30 5d 3b 20 20  r aSpace[200];  
5ee0: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20          /* Temp 
5ef0: 73 70 61 63 65 20 66 6f 72 20 70 49 64 78 4b 65  space for pIdxKe
5f00: 79 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20 6d  y - to avoid a m
5f10: 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20  alloc */.  char 
5f20: 2a 70 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 69  *pFree = 0;..  i
5f30: 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61  f( pKey ){.    a
5f40: 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36  ssert( nKey==(i6
5f50: 34 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a 20  4)(int)nKey );. 
5f60: 20 20 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c     pIdxKey = sql
5f70: 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70  ite3VdbeAllocUnp
5f80: 61 63 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 20  ackedRecord(.   
5f90: 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 49       pCur->pKeyI
5fa0: 6e 66 6f 2c 20 61 53 70 61 63 65 2c 20 73 69 7a  nfo, aSpace, siz
5fb0: 65 6f 66 28 61 53 70 61 63 65 29 2c 20 26 70 46  eof(aSpace), &pF
5fc0: 72 65 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  ree.    );.    i
5fd0: 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20  f( pIdxKey==0 ) 
5fe0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
5ff0: 4d 45 4d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  MEM;.    sqlite3
6000: 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b  VdbeRecordUnpack
6010: 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c  (pCur->pKeyInfo,
6020: 20 28 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79   (int)nKey, pKey
6030: 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20  , pIdxKey);.    
6040: 69 66 28 20 70 49 64 78 4b 65 79 2d 3e 6e 46 69  if( pIdxKey->nFi
6050: 65 6c 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  eld==0 ){.      
6060: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 43  sqlite3DbFree(pC
6070: 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  ur->pKeyInfo->db
6080: 2c 20 70 46 72 65 65 29 3b 0a 20 20 20 20 20 20  , pFree);.      
6090: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
60a0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
60b0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  }.  }else{.    p
60c0: 49 64 78 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a  IdxKey = 0;.  }.
60d0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
60e0: 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
60f0: 64 28 70 43 75 72 2c 20 70 49 64 78 4b 65 79 2c  d(pCur, pIdxKey,
6100: 20 6e 4b 65 79 2c 20 62 69 61 73 2c 20 70 52 65   nKey, bias, pRe
6110: 73 29 3b 0a 20 20 69 66 28 20 70 46 72 65 65 20  s);.  if( pFree 
6120: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
6130: 46 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 49  Free(pCur->pKeyI
6140: 6e 66 6f 2d 3e 64 62 2c 20 70 46 72 65 65 29 3b  nfo->db, pFree);
6150: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
6160: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f  ;.}../*.** Resto
6170: 72 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  re the cursor to
6180: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74   the position it
6190: 20 77 61 73 20 69 6e 20 28 6f 72 20 61 73 20 63   was in (or as c
61a0: 6c 6f 73 65 20 74 6f 20 61 73 20 70 6f 73 73 69  lose to as possi
61b0: 62 6c 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76  ble).** when sav
61c0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
61d0: 29 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f  ) was called. No
61e0: 74 65 20 74 68 61 74 20 74 68 69 73 20 63 61 6c  te that this cal
61f0: 6c 20 64 65 6c 65 74 65 73 20 74 68 65 20 0a 2a  l deletes the .*
6200: 2a 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e  * saved position
6210: 20 69 6e 66 6f 20 73 74 6f 72 65 64 20 62 79 20   info stored by 
6220: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
6230: 6f 6e 28 29 2c 20 73 6f 20 74 68 65 72 65 20 63  on(), so there c
6240: 61 6e 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74  an be.** at most
6250: 20 6f 6e 65 20 65 66 66 65 63 74 69 76 65 20 72   one effective r
6260: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
6270: 74 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74 65  tion() call afte
6280: 72 20 65 61 63 68 20 0a 2a 2a 20 73 61 76 65 43  r each .** saveC
6290: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e  ursorPosition().
62a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
62b0: 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f  treeRestoreCurso
62c0: 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73  rPosition(BtCurs
62d0: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74  or *pCur){.  int
62e0: 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 63   rc;.  assert( c
62f0: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
6300: 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
6310: 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e  t( pCur->eState>
6320: 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53  =CURSOR_REQUIRES
6330: 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75  EEK );.  if( pCu
6340: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
6350: 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72  R_FAULT ){.    r
6360: 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70  eturn pCur->skip
6370: 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72  Next;.  }.  pCur
6380: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
6390: 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20  R_INVALID;.  rc 
63a0: 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 70 43  = btreeMoveto(pC
63b0: 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20  ur, pCur->pKey, 
63c0: 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26  pCur->nKey, 0, &
63d0: 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 29 3b  pCur->skipNext);
63e0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
63f0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
6400: 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70  te3_free(pCur->p
6410: 4b 65 79 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  Key);.    pCur->
6420: 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 61 73  pKey = 0;.    as
6430: 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
6440: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
6450: 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
6460: 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
6470: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72   );.    if( pCur
6480: 2d 3e 73 6b 69 70 4e 65 78 74 20 26 26 20 70 43  ->skipNext && pC
6490: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
64a0: 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
64b0: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
64c0: 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54   CURSOR_SKIPNEXT
64d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
64e0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66  turn rc;.}..#def
64f0: 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f  ine restoreCurso
6500: 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20  rPosition(p) \. 
6510: 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52   (p->eState>=CUR
6520: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
6530: 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 62 74 72  ? \.         btr
6540: 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50  eeRestoreCursorP
6550: 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20  osition(p) : \. 
6560: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
6570: 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  K)../*.** Determ
6580: 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
6590: 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61 73 20  ot a cursor has 
65a0: 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70  moved from the p
65b0: 6f 73 69 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a  osition where.**
65c0: 20 69 74 20 77 61 73 20 6c 61 73 74 20 70 6c 61   it was last pla
65d0: 63 65 64 2c 20 6f 72 20 68 61 73 20 62 65 65 6e  ced, or has been
65e0: 20 69 6e 76 61 6c 69 64 61 74 65 64 20 66 6f 72   invalidated for
65f0: 20 61 6e 79 20 6f 74 68 65 72 20 72 65 61 73 6f   any other reaso
6600: 6e 2e 0a 2a 2a 20 43 75 72 73 6f 72 73 20 63 61  n..** Cursors ca
6610: 6e 20 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20  n move when the 
6620: 72 6f 77 20 74 68 65 79 20 61 72 65 20 70 6f 69  row they are poi
6630: 6e 74 69 6e 67 20 61 74 20 69 73 20 64 65 6c 65  nting at is dele
6640: 74 65 64 20 6f 75 74 0a 2a 2a 20 66 72 6f 6d 20  ted out.** from 
6650: 75 6e 64 65 72 20 74 68 65 6d 2c 20 66 6f 72 20  under them, for 
6660: 65 78 61 6d 70 6c 65 2e 20 20 43 75 72 73 6f 72  example.  Cursor
6670: 20 6d 69 67 68 74 20 61 6c 73 6f 20 6d 6f 76 65   might also move
6680: 20 69 66 20 61 20 62 74 72 65 65 0a 2a 2a 20 69   if a btree.** i
6690: 73 20 72 65 62 61 6c 61 6e 63 65 64 2e 0a 2a 2a  s rebalanced..**
66a0: 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69 73  .** Calling this
66b0: 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 61 20   routine with a 
66c0: 4e 55 4c 4c 20 63 75 72 73 6f 72 20 70 6f 69 6e  NULL cursor poin
66d0: 74 65 72 20 72 65 74 75 72 6e 73 20 66 61 6c 73  ter returns fals
66e0: 65 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65  e..**.** Use the
66f0: 20 73 65 70 61 72 61 74 65 20 73 71 6c 69 74 65   separate sqlite
6700: 33 42 74 72 65 65 43 75 72 73 6f 72 52 65 73 74  3BtreeCursorRest
6710: 6f 72 65 28 29 20 72 6f 75 74 69 6e 65 20 74 6f  ore() routine to
6720: 20 72 65 73 74 6f 72 65 20 61 20 63 75 72 73 6f   restore a curso
6730: 72 0a 2a 2a 20 62 61 63 6b 20 74 6f 20 77 68 65  r.** back to whe
6740: 72 65 20 69 74 20 6f 75 67 68 74 20 74 6f 20 62  re it ought to b
6750: 65 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  e if this routin
6760: 65 20 72 65 74 75 72 6e 73 20 74 72 75 65 2e 0a  e returns true..
6770: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
6780: 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
6790: 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
67a0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72  ){.  return pCur
67b0: 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
67c0: 5f 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _VALID;.}../*.**
67d0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
67e0: 73 74 6f 72 65 73 20 61 20 63 75 72 73 6f 72 20  stores a cursor 
67f0: 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67  back to its orig
6800: 69 6e 61 6c 20 70 6f 73 69 74 69 6f 6e 20 61 66  inal position af
6810: 74 65 72 20 69 74 0a 2a 2a 20 68 61 73 20 62 65  ter it.** has be
6820: 65 6e 20 6d 6f 76 65 64 20 62 79 20 73 6f 6d 65  en moved by some
6830: 20 6f 75 74 73 69 64 65 20 61 63 74 69 76 69 74   outside activit
6840: 79 20 28 73 75 63 68 20 61 73 20 61 20 62 74 72  y (such as a btr
6850: 65 65 20 72 65 62 61 6c 61 6e 63 65 20 6f 72 0a  ee rebalance or.
6860: 2a 2a 20 61 20 72 6f 77 20 68 61 76 69 6e 67 20  ** a row having 
6870: 62 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74  been deleted out
6880: 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20   from under the 
6890: 63 75 72 73 6f 72 29 2e 20 20 0a 2a 2a 0a 2a 2a  cursor).  .**.**
68a0: 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 74 68 65   On success, the
68b0: 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20   *pDifferentRow 
68c0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 66 61 6c  parameter is fal
68d0: 73 65 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  se if the cursor
68e0: 20 69 73 20 6c 65 66 74 0a 2a 2a 20 70 6f 69 6e   is left.** poin
68f0: 74 69 6e 67 20 61 74 20 65 78 61 63 74 6c 79 20  ting at exactly 
6900: 74 68 65 20 73 61 6d 65 20 72 6f 77 2e 20 20 2a  the same row.  *
6910: 70 44 69 66 66 65 72 6e 74 52 6f 77 20 69 73 20  pDifferntRow is 
6920: 74 68 65 20 72 6f 77 20 74 68 65 20 63 75 72 73  the row the curs
6930: 6f 72 0a 2a 2a 20 77 61 73 20 70 6f 69 6e 74 69  or.** was pointi
6940: 6e 67 20 74 6f 20 68 61 73 20 62 65 65 6e 20 64  ng to has been d
6950: 65 6c 65 74 65 64 2c 20 66 6f 72 63 69 6e 67 20  eleted, forcing 
6960: 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f  the cursor to po
6970: 69 6e 74 20 74 6f 20 73 6f 6d 65 0a 2a 2a 20 6e  int to some.** n
6980: 65 61 72 62 79 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a  earby row..**.**
6990: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   This routine sh
69a0: 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c  ould only be cal
69b0: 6c 65 64 20 66 6f 72 20 61 20 63 75 72 73 6f 72  led for a cursor
69c0: 20 74 68 61 74 20 6a 75 73 74 20 72 65 74 75 72   that just retur
69d0: 6e 65 64 0a 2a 2a 20 54 52 55 45 20 66 72 6f 6d  ned.** TRUE from
69e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
69f0: 73 6f 72 48 61 73 4d 6f 76 65 64 28 29 2e 0a 2a  sorHasMoved()..*
6a00: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
6a10: 65 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28  eeCursorRestore(
6a20: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
6a30: 69 6e 74 20 2a 70 44 69 66 66 65 72 65 6e 74 52  int *pDifferentR
6a40: 6f 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ow){.  int rc;..
6a50: 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21 3d    assert( pCur!=
6a60: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
6a70: 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
6a80: 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 72  SOR_VALID );.  r
6a90: 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
6aa0: 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
6ab0: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
6ac0: 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20   *pDifferentRow 
6ad0: 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
6ae0: 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  rc;.  }.  if( pC
6af0: 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
6b00: 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 4e 45 56 45  OR_VALID || NEVE
6b10: 52 28 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  R(pCur->skipNext
6b20: 21 3d 30 29 20 29 7b 0a 20 20 20 20 2a 70 44 69  !=0) ){.    *pDi
6b30: 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a  fferentRow = 1;.
6b40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 44    }else{.    *pD
6b50: 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 30 3b  ifferentRow = 0;
6b60: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
6b70: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e  LITE_OK;.}..#ifn
6b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
6b90: 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  AUTOVACUUM./*.**
6ba0: 20 47 69 76 65 6e 20 61 20 70 61 67 65 20 6e 75   Given a page nu
6bb0: 6d 62 65 72 20 6f 66 20 61 20 72 65 67 75 6c 61  mber of a regula
6bc0: 72 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c  r database page,
6bd0: 20 72 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   return the page
6be0: 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  .** number for t
6bf0: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  he pointer-map p
6c00: 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
6c10: 73 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20  s the entry for 
6c20: 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67  the.** input pag
6c30: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20  e number..**.** 
6c40: 52 65 74 75 72 6e 20 30 20 28 6e 6f 74 20 61 20  Return 0 (not a 
6c50: 76 61 6c 69 64 20 70 61 67 65 29 20 66 6f 72 20  valid page) for 
6c60: 70 67 6e 6f 3d 3d 31 20 73 69 6e 63 65 20 74 68  pgno==1 since th
6c70: 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f 69  ere is.** no poi
6c80: 6e 74 65 72 20 6d 61 70 20 61 73 73 6f 63 69 61  nter map associa
6c90: 74 65 64 20 77 69 74 68 20 70 61 67 65 20 31 2e  ted with page 1.
6ca0: 20 20 54 68 65 20 69 6e 74 65 67 72 69 74 79 5f    The integrity_
6cb0: 63 68 65 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20 72  check logic.** r
6cc0: 65 71 75 69 72 65 73 20 74 68 61 74 20 70 74 72  equires that ptr
6cd0: 6d 61 70 50 61 67 65 6e 6f 28 2a 2c 31 29 21 3d  mapPageno(*,1)!=
6ce0: 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e  1..*/.static Pgn
6cf0: 6f 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 42  o ptrmapPageno(B
6d00: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
6d10: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  no pgno){.  int 
6d20: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
6d30: 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 4d 61 70  ;.  Pgno iPtrMap
6d40: 2c 20 72 65 74 3b 0a 20 20 61 73 73 65 72 74 28  , ret;.  assert(
6d50: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
6d60: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
6d70: 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3c 32 20  );.  if( pgno<2 
6d80: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 50  ) return 0;.  nP
6d90: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 20 3d  agesPerMapPage =
6da0: 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a   (pBt->usableSiz
6db0: 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61  e/5)+1;.  iPtrMa
6dc0: 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61  p = (pgno-2)/nPa
6dd0: 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20  gesPerMapPage;. 
6de0: 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70 2a   ret = (iPtrMap*
6df0: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
6e00: 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72 65  ) + 2; .  if( re
6e10: 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  t==PENDING_BYTE_
6e20: 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
6e30: 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65   ret++;.  }.  re
6e40: 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a  turn ret;.}../*.
6e50: 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74 72  ** Write an entr
6e60: 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  y into the point
6e70: 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  er map..**.** Th
6e80: 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61 74  is routine updat
6e90: 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  es the pointer m
6ea0: 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67  ap entry for pag
6eb0: 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a  e number 'key'.*
6ec0: 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61 70  * so that it map
6ed0: 73 20 74 6f 20 74 79 70 65 20 27 65 54 79 70 65  s to type 'eType
6ee0: 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67  ' and parent pag
6ef0: 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e  e number 'pgno'.
6f00: 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 43 20 69  .**.** If *pRC i
6f10: 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d  s initially non-
6f20: 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54 45  zero (non-SQLITE
6f30: 5f 4f 4b 29 20 74 68 65 6e 20 74 68 69 73 20 72  _OK) then this r
6f40: 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 61 20 6e  outine is.** a n
6f50: 6f 2d 6f 70 2e 20 20 49 66 20 61 6e 20 65 72 72  o-op.  If an err
6f60: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 61  or occurs, the a
6f70: 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
6f80: 20 63 6f 64 65 20 69 73 20 77 72 69 74 74 65 6e   code is written
6f90: 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52 43 2e 0a 2a  .** into *pRC..*
6fa0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 74  /.static void pt
6fb0: 72 6d 61 70 50 75 74 28 42 74 53 68 61 72 65 64  rmapPut(BtShared
6fc0: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c   *pBt, Pgno key,
6fd0: 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e 6f 20   u8 eType, Pgno 
6fe0: 70 61 72 65 6e 74 2c 20 69 6e 74 20 2a 70 52 43  parent, int *pRC
6ff0: 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  ){.  DbPage *pDb
7000: 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f  Page;  /* The po
7010: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
7020: 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b  /.  u8 *pPtrmap;
7030: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69        /* The poi
7040: 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a 2f  nter map data */
7050: 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b  .  Pgno iPtrmap;
7060: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e       /* The poin
7070: 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75 6d  ter map page num
7080: 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66  ber */.  int off
7090: 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66  set;       /* Of
70a0: 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72 20  fset in pointer 
70b0: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  map page */.  in
70c0: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
70d0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66  /* Return code f
70e0: 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73  rom subfunctions
70f0: 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20   */..  if( *pRC 
7100: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73  ) return;..  ass
7110: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
7120: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
7130: 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20  ex) );.  /* The 
7140: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70  master-journal p
7150: 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20  age number must 
7160: 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 61 73  never be used as
7170: 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70   a pointer map p
7180: 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  age */.  assert(
7190: 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41 47   0==PTRMAP_ISPAG
71a0: 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42  E(pBt, PENDING_B
71b0: 59 54 45 5f 50 41 47 45 28 70 42 74 29 29 20 29  YTE_PAGE(pBt)) )
71c0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  ;..  assert( pBt
71d0: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a  ->autoVacuum );.
71e0: 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a    if( key==0 ){.
71f0: 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54      *pRC = SQLIT
7200: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
7210: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
7220: 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d    iPtrmap = PTRM
7230: 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b  AP_PAGENO(pBt, k
7240: 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ey);.  rc = sqli
7250: 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d  te3PagerGet(pBt-
7260: 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70  >pPager, iPtrmap
7270: 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69  , &pDbPage);.  i
7280: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
7290: 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72   ){.    *pRC = r
72a0: 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  c;.    return;. 
72b0: 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54   }.  offset = PT
72c0: 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69  RMAP_PTROFFSET(i
72d0: 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20  Ptrmap, key);.  
72e0: 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a  if( offset<0 ){.
72f0: 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54      *pRC = SQLIT
7300: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
7310: 20 20 20 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f      goto ptrmap_
7320: 65 78 69 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65  exit;.  }.  asse
7330: 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69  rt( offset <= (i
7340: 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  nt)pBt->usableSi
7350: 7a 65 2d 35 20 29 3b 0a 20 20 70 50 74 72 6d 61  ze-5 );.  pPtrma
7360: 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  p = (u8 *)sqlite
7370: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
7380: 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28 20 65  bPage);..  if( e
7390: 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66  Type!=pPtrmap[of
73a0: 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62 79 74  fset] || get4byt
73b0: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
73c0: 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b  t+1])!=parent ){
73d0: 0a 20 20 20 20 54 52 41 43 45 28 28 22 50 54 52  .    TRACE(("PTR
73e0: 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e  MAP_UPDATE: %d->
73f0: 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c  (%d,%d)\n", key,
7400: 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74 29 29   eType, parent))
7410: 3b 0a 20 20 20 20 2a 70 52 43 3d 20 72 63 20 3d  ;.    *pRC= rc =
7420: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
7430: 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  te(pDbPage);.   
7440: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
7450: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 74 72  OK ){.      pPtr
7460: 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54  map[offset] = eT
7470: 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ype;.      put4b
7480: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
7490: 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b  set+1], parent);
74a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d  .    }.  }..ptrm
74b0: 61 70 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74  ap_exit:.  sqlit
74c0: 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
74d0: 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
74e0: 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20 66 72  Read an entry fr
74f0: 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  om the pointer m
7500: 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ap..**.** This r
7510: 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76 65 73  outine retrieves
7520: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
7530: 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20   entry for page 
7540: 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a  'key', writing.*
7550: 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 70  * the type and p
7560: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
7570: 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61 6e 64  r to *pEType and
7580: 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63 74 69   *pPgno respecti
7590: 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f  vely..** An erro
75a0: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
75b0: 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20  ed if something 
75c0: 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65  goes wrong, othe
75d0: 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e  rwise SQLITE_OK.
75e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
75f0: 74 72 6d 61 70 47 65 74 28 42 74 53 68 61 72 65  trmapGet(BtShare
7600: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79  d *pBt, Pgno key
7610: 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20 50 67  , u8 *pEType, Pg
7620: 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62  no *pPgno){.  Db
7630: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
7640: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
7650: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  map page */.  in
7660: 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 20  t iPtrmap;      
7670: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
7680: 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20  page index */.  
7690: 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20  u8 *pPtrmap;    
76a0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
76b0: 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  p page data */. 
76c0: 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20   int offset;    
76d0: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
76e0: 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74 65   entry in pointe
76f0: 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72  r map */.  int r
7700: 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  c;..  assert( sq
7710: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
7720: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
7730: 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52  .  iPtrmap = PTR
7740: 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
7750: 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  key);.  rc = sql
7760: 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
7770: 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61  ->pPager, iPtrma
7780: 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20  p, &pDbPage);.  
7790: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
77a0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
77b0: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
77c0: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
77d0: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
77e0: 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d  .  offset = PTRM
77f0: 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74  AP_PTROFFSET(iPt
7800: 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66  rmap, key);.  if
7810: 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20  ( offset<0 ){.  
7820: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
7830: 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
7840: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7850: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
7860: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
7870: 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  et <= (int)pBt->
7880: 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a  usableSize-5 );.
7890: 20 20 61 73 73 65 72 74 28 20 70 45 54 79 70 65    assert( pEType
78a0: 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79 70 65  !=0 );.  *pEType
78b0: 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65   = pPtrmap[offse
78c0: 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f 20  t];.  if( pPgno 
78d0: 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34 62  ) *pPgno = get4b
78e0: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
78f0: 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69  set+1]);..  sqli
7900: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
7910: 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 2a 70  bPage);.  if( *p
7920: 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79  EType<1 || *pETy
7930: 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51  pe>5 ) return SQ
7940: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
7950: 54 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  T;.  return SQLI
7960: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20  TE_OK;.}..#else 
7970: 2f 2a 20 69 66 20 64 65 66 69 6e 65 64 20 53 51  /* if defined SQ
7980: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
7990: 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66 69 6e  CUUM */.  #defin
79a0: 65 20 70 74 72 6d 61 70 50 75 74 28 77 2c 78 2c  e ptrmapPut(w,x,
79b0: 79 2c 7a 2c 72 63 29 0a 20 20 23 64 65 66 69 6e  y,z,rc).  #defin
79c0: 65 20 70 74 72 6d 61 70 47 65 74 28 77 2c 78 2c  e ptrmapGet(w,x,
79d0: 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20  y,z) SQLITE_OK. 
79e0: 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50   #define ptrmapP
79f0: 75 74 4f 76 66 6c 50 74 72 28 78 2c 20 79 2c 20  utOvflPtr(x, y, 
7a00: 72 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  rc).#endif../*.*
7a10: 2a 20 47 69 76 65 6e 20 61 20 62 74 72 65 65 20  * Given a btree 
7a20: 70 61 67 65 20 61 6e 64 20 61 20 63 65 6c 6c 20  page and a cell 
7a30: 69 6e 64 65 78 20 28 30 20 6d 65 61 6e 73 20 74  index (0 means t
7a40: 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e  he first cell on
7a50: 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20  .** the page, 1 
7a60: 6d 65 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64  means the second
7a70: 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f   cell, and so fo
7a80: 72 74 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f  rth) return a po
7a90: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  inter.** to the 
7aa0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a  cell content..**
7ab0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
7ac0: 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20   works only for 
7ad0: 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e 6f  pages that do no
7ae0: 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c  t contain overfl
7af0: 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65  ow cells..*/.#de
7b00: 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c  fine findCell(P,
7b10: 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61  I) \.  ((P)->aDa
7b20: 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50  ta + ((P)->maskP
7b30: 61 67 65 20 26 20 67 65 74 32 62 79 74 65 28 26  age & get2byte(&
7b40: 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a  (P)->aCellIdx[2*
7b50: 28 49 29 5d 29 29 29 0a 23 64 65 66 69 6e 65 20  (I)]))).#define 
7b60: 66 69 6e 64 43 65 6c 6c 76 32 28 44 2c 4d 2c 4f  findCellv2(D,M,O
7b70: 2c 49 29 20 28 44 2b 28 4d 26 67 65 74 32 62 79  ,I) (D+(M&get2by
7b80: 74 65 28 44 2b 28 4f 2b 32 2a 28 49 29 29 29 29  te(D+(O+2*(I))))
7b90: 29 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61  ).../*.** This a
7ba0: 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76 65   more complex ve
7bb0: 72 73 69 6f 6e 20 6f 66 20 66 69 6e 64 43 65 6c  rsion of findCel
7bc0: 6c 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66  l() that works f
7bd0: 6f 72 0a 2a 2a 20 70 61 67 65 73 20 74 68 61 74  or.** pages that
7be0: 20 64 6f 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72   do contain over
7bf0: 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73  flow cells..*/.s
7c00: 74 61 74 69 63 20 75 38 20 2a 66 69 6e 64 4f 76  tatic u8 *findOv
7c10: 65 72 66 6c 6f 77 43 65 6c 6c 28 4d 65 6d 50 61  erflowCell(MemPa
7c20: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69  ge *pPage, int i
7c30: 43 65 6c 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Cell){.  int i;.
7c40: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
7c50: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
7c60: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
7c70: 29 3b 0a 20 20 66 6f 72 28 69 3d 70 50 61 67 65  );.  for(i=pPage
7c80: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d 31 3b 20 69  ->nOverflow-1; i
7c90: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69  >=0; i--){.    i
7ca0: 6e 74 20 6b 3b 0a 20 20 20 20 6b 20 3d 20 70 50  nt k;.    k = pP
7cb0: 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 69 5d 3b 0a  age->aiOvfl[i];.
7cc0: 20 20 20 20 69 66 28 20 6b 3c 3d 69 43 65 6c 6c      if( k<=iCell
7cd0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d   ){.      if( k=
7ce0: 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  =iCell ){.      
7cf0: 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 2d 3e    return pPage->
7d00: 61 70 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 20  apOvfl[i];.     
7d10: 20 7d 0a 20 20 20 20 20 20 69 43 65 6c 6c 2d 2d   }.      iCell--
7d20: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
7d30: 74 75 72 6e 20 66 69 6e 64 43 65 6c 6c 28 70 50  turn findCell(pP
7d40: 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a 0a  age, iCell);.}..
7d50: 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20 63 65  /*.** Parse a ce
7d60: 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b  ll content block
7d70: 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68 65   and fill in the
7d80: 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74   CellInfo struct
7d90: 75 72 65 2e 20 20 54 68 65 72 65 0a 2a 2a 20 61  ure.  There.** a
7da0: 72 65 20 74 77 6f 20 76 65 72 73 69 6f 6e 73 20  re two versions 
7db0: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
7dc0: 2e 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  .  btreeParseCel
7dd0: 6c 28 29 20 74 61 6b 65 73 20 61 20 0a 2a 2a 20  l() takes a .** 
7de0: 63 65 6c 6c 20 69 6e 64 65 78 20 61 73 20 74 68  cell index as th
7df0: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
7e00: 74 20 61 6e 64 20 62 74 72 65 65 50 61 72 73 65  t and btreeParse
7e10: 43 65 6c 6c 50 74 72 28 29 20 0a 2a 2a 20 74 61  CellPtr() .** ta
7e20: 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  kes a pointer to
7e30: 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65   the body of the
7e40: 20 63 65 6c 6c 20 61 73 20 69 74 73 20 73 65 63   cell as its sec
7e50: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ond argument..*/
7e60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
7e70: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 0a  eeParseCellPtr(.
7e80: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
7e90: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67  ,         /* Pag
7ea0: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
7eb0: 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70   cell */.  u8 *p
7ec0: 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
7ed0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
7ee0: 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20   the cell text. 
7ef0: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
7f00: 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20  Info         /* 
7f10: 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72  Fill in this str
7f20: 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75  ucture */.){.  u
7f30: 38 20 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20  8 *pIter;       
7f40: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 63         /* For sc
7f50: 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 70  anning through p
7f60: 43 65 6c 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50  Cell */.  u32 nP
7f70: 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20  ayload;         
7f80: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
7f90: 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79  ytes of cell pay
7fa0: 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  load */..  asser
7fb0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
7fc0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
7fd0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
7fe0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61  sert( pPage->lea
7ff0: 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c  f==0 || pPage->l
8000: 65 61 66 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20  eaf==1 );.  if( 
8010: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61  pPage->intKeyLea
8020: 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  f ){.    assert(
8030: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
8040: 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70  Size==0 );.    p
8050: 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 67  Iter = pCell + g
8060: 65 74 56 61 72 69 6e 74 33 32 28 70 43 65 6c 6c  etVarint32(pCell
8070: 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20  , nPayload);.   
8080: 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72   pIter += getVar
8090: 69 6e 74 28 70 49 74 65 72 2c 20 28 75 36 34 2a  int(pIter, (u64*
80a0: 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a  )&pInfo->nKey);.
80b0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
80c0: 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64 20 29 7b 0a  e->noPayload ){.
80d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
80e0: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3d  e->childPtrSize=
80f0: 3d 34 20 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  =4 );.    pInfo-
8100: 3e 6e 53 69 7a 65 20 3d 20 34 20 2b 20 67 65 74  >nSize = 4 + get
8110: 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34 5d  Varint(&pCell[4]
8120: 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e  , (u64*)&pInfo->
8130: 6e 4b 65 79 29 3b 0a 20 20 20 20 70 49 6e 66 6f  nKey);.    pInfo
8140: 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a  ->nPayload = 0;.
8150: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
8160: 6c 20 3d 20 30 3b 0a 20 20 20 20 70 49 6e 66 6f  l = 0;.    pInfo
8170: 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->iOverflow = 0;
8180: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79  .    pInfo->pPay
8190: 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20 20 72 65  load = 0;.    re
81a0: 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  turn;.  }else{. 
81b0: 20 20 20 70 49 74 65 72 20 3d 20 70 43 65 6c 6c     pIter = pCell
81c0: 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   + pPage->childP
81d0: 74 72 53 69 7a 65 3b 0a 20 20 20 20 70 49 74 65  trSize;.    pIte
81e0: 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  r += getVarint32
81f0: 28 70 49 74 65 72 2c 20 6e 50 61 79 6c 6f 61 64  (pIter, nPayload
8200: 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b  );.    pInfo->nK
8210: 65 79 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  ey = nPayload;. 
8220: 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79   }.  pInfo->nPay
8230: 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b  load = nPayload;
8240: 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f  .  pInfo->pPaylo
8250: 61 64 20 3d 20 70 49 74 65 72 3b 0a 20 20 74 65  ad = pIter;.  te
8260: 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64  stcase( nPayload
8270: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
8280: 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  l );.  testcase(
8290: 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65   nPayload==pPage
82a0: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
82b0: 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d    if( nPayload<=
82c0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
82d0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  ){.    /* This i
82e0: 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d  s the (easy) com
82f0: 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74  mon case where t
8300: 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61  he entire payloa
8310: 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e  d fits.    ** on
8320: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e   the local page.
8330: 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73    No overflow is
8340: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
8350: 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69  /.    pInfo->nSi
8360: 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20  ze = nPayload + 
8370: 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43  (u16)(pIter - pC
8380: 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 70 49  ell);.    if( pI
8390: 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20 70  nfo->nSize<4 ) p
83a0: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b  Info->nSize = 4;
83b0: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  .    pInfo->nLoc
83c0: 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f  al = (u16)nPaylo
83d0: 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69  ad;.    pInfo->i
83e0: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
83f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
8400: 20 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c   the payload wil
8410: 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65  l not fit comple
8420: 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61  tely on the loca
8430: 6c 20 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a  l page, we have.
8440: 20 20 20 20 2a 2a 20 74 6f 20 64 65 63 69 64 65      ** to decide
8450: 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74 6f   how much to sto
8460: 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68  re locally and h
8470: 6f 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c  ow much to spill
8480: 20 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20 6f 76 65   onto.    ** ove
8490: 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54 68  rflow pages.  Th
84a0: 65 20 73 74 72 61 74 65 67 79 20 69 73 20 74 6f  e strategy is to
84b0: 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d   minimize the am
84c0: 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a 20  ount of unused. 
84d0: 20 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f     ** space on o
84e0: 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77 68  verflow pages wh
84f0: 69 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65 20  ile keeping the 
8500: 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20  amount of local 
8510: 73 74 6f 72 61 67 65 0a 20 20 20 20 2a 2a 20 69  storage.    ** i
8520: 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63  n between minLoc
8530: 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e  al and maxLocal.
8540: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57  .    **.    ** W
8550: 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e  arning:  changin
8560: 67 20 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c  g the way overfl
8570: 6f 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69  ow payload is di
8580: 73 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79  stributed in any
8590: 0a 20 20 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c  .    ** way will
85a0: 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e   result in an in
85b0: 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 20  compatible file 
85c0: 66 6f 72 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a 20  format..    */. 
85d0: 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b     int minLocal;
85e0: 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f    /* Minimum amo
85f0: 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68  unt of payload h
8600: 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20  eld locally */. 
8610: 20 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b     int maxLocal;
8620: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f    /* Maximum amo
8630: 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68  unt of payload h
8640: 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20  eld locally */. 
8650: 20 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b 20     int surplus; 
8660: 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61    /* Overflow pa
8670: 79 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65 20  yload available 
8680: 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67  for local storag
8690: 65 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63  e */..    minLoc
86a0: 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c  al = pPage->minL
86b0: 6f 63 61 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f 63  ocal;.    maxLoc
86c0: 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c  al = pPage->maxL
86d0: 6f 63 61 6c 3b 0a 20 20 20 20 73 75 72 70 6c 75  ocal;.    surplu
86e0: 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28  s = minLocal + (
86f0: 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f  nPayload - minLo
8700: 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70 42 74  cal)%(pPage->pBt
8710: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
8720: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
8730: 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63   surplus==maxLoc
8740: 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  al );.    testca
8750: 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78  se( surplus==max
8760: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69  Local+1 );.    i
8770: 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61  f( surplus <= ma
8780: 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  xLocal ){.      
8790: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
87a0: 28 75 31 36 29 73 75 72 70 6c 75 73 3b 0a 20 20  (u16)surplus;.  
87b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
87c0: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28  Info->nLocal = (
87d0: 75 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  u16)minLocal;.  
87e0: 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69    }.    pInfo->i
87f0: 4f 76 65 72 66 6c 6f 77 20 3d 20 28 75 31 36 29  Overflow = (u16)
8800: 28 26 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61  (&pInfo->pPayloa
8810: 64 5b 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 5d  d[pInfo->nLocal]
8820: 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 70   - pCell);.    p
8830: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70 49  Info->nSize = pI
8840: 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 2b  nfo->iOverflow +
8850: 20 34 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63   4;.  }.}.static
8860: 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65   void btreeParse
8870: 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
8880: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
8890: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
88a0: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
88b0: 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20 20   int iCell,     
88c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
88d0: 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69 72  cell index.  Fir
88e0: 73 74 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a  st cell is 0 */.
88f0: 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66    CellInfo *pInf
8900: 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  o         /* Fil
8910: 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  l in this struct
8920: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 62 74 72 65  ure */.){.  btre
8930: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
8940: 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50  age, findCell(pP
8950: 61 67 65 2c 20 69 43 65 6c 6c 29 2c 20 70 49 6e  age, iCell), pIn
8960: 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  fo);.}../*.** Co
8970: 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20  mpute the total 
8980: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
8990: 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64  that a Cell need
89a0: 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a  s in the cell.**
89b0: 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 74 68   data area of th
89c0: 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54  e btree-page.  T
89d0: 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72  he return number
89e0: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65   includes the ce
89f0: 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65  ll.** data heade
8a00: 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20  r and the local 
8a10: 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74  payload, but not
8a20: 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
8a30: 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61  ge or.** the spa
8a40: 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63  ce used by the c
8a50: 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a  ell pointer..*/.
8a60: 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53  static u16 cellS
8a70: 69 7a 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a  izePtr(MemPage *
8a80: 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c  pPage, u8 *pCell
8a90: 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d  ){.  u8 *pIter =
8aa0: 20 70 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e   pCell + pPage->
8ab0: 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 20 2f 2a  childPtrSize; /*
8ac0: 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
8ad0: 72 20 62 79 74 65 73 20 6f 66 20 70 43 65 6c 6c  r bytes of pCell
8ae0: 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20   */.  u8 *pEnd; 
8af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8b10: 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61  * End mark for a
8b20: 20 76 61 72 69 6e 74 20 2a 2f 0a 20 20 75 33 32   varint */.  u32
8b30: 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20   nSize;         
8b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b50: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 76 61        /* Size va
8b60: 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  lue to return */
8b70: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
8b80: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76  DEBUG.  /* The v
8b90: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
8ba0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   this function s
8bb0: 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20  hould always be 
8bc0: 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a  the same as.  **
8bd0: 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e   the (CellInfo.n
8be0: 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e  Size) value foun
8bf0: 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c  d by doing a ful
8c00: 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20  l parse of the. 
8c10: 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c   ** cell. If SQL
8c20: 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66  ITE_DEBUG is def
8c30: 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28  ined, an assert(
8c40: 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20  ) at the bottom 
8c50: 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e  of.  ** this fun
8c60: 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74  ction verifies t
8c70: 68 61 74 20 74 68 69 73 20 69 6e 76 61 72 69 61  hat this invaria
8c80: 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74  nt is not violat
8c90: 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  ed. */.  CellInf
8ca0: 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 62  o debuginfo;.  b
8cb0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
8cc0: 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
8cd0: 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64  debuginfo);.#end
8ce0: 69 66 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d  if..  if( pPage-
8cf0: 3e 6e 6f 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20  >noPayload ){.  
8d00: 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b    pEnd = &pIter[
8d10: 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  9];.    while( (
8d20: 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20 26  *pIter++)&0x80 &
8d30: 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a  & pIter<pEnd );.
8d40: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
8d50: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3d  e->childPtrSize=
8d60: 3d 34 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  =4 );.    return
8d70: 20 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70   (u16)(pIter - p
8d80: 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 6e 53 69  Cell);.  }.  nSi
8d90: 7a 65 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69  ze = *pIter;.  i
8da0: 66 28 20 6e 53 69 7a 65 3e 3d 30 78 38 30 20 29  f( nSize>=0x80 )
8db0: 7b 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49  {.    pEnd = &pI
8dc0: 74 65 72 5b 39 5d 3b 0a 20 20 20 20 6e 53 69 7a  ter[9];.    nSiz
8dd0: 65 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64  e &= 0x7f;.    d
8de0: 6f 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d  o{.      nSize =
8df0: 20 28 6e 53 69 7a 65 3c 3c 37 29 20 7c 20 28 2a   (nSize<<7) | (*
8e00: 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b  ++pIter & 0x7f);
8e10: 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 2a 28 70  .    }while( *(p
8e20: 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70  Iter)>=0x80 && p
8e30: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
8e40: 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20 69 66  .  pIter++;.  if
8e50: 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
8e60: 29 7b 0a 20 20 20 20 2f 2a 20 70 49 74 65 72 20  ){.    /* pIter 
8e70: 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74 20 74 68  now points at th
8e80: 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  e 64-bit integer
8e90: 20 6b 65 79 20 76 61 6c 75 65 2c 20 61 20 76 61   key value, a va
8ea0: 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20  riable length . 
8eb0: 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54     ** integer. T
8ec0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
8ed0: 63 6b 20 6d 6f 76 65 73 20 70 49 74 65 72 20 74  ck moves pIter t
8ee0: 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 66  o point at the f
8ef0: 69 72 73 74 20 62 79 74 65 0a 20 20 20 20 2a 2a  irst byte.    **
8f00: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
8f10: 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20   the key value. 
8f20: 2a 2f 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70  */.    pEnd = &p
8f30: 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69  Iter[9];.    whi
8f40: 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30  le( (*pIter++)&0
8f50: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
8f60: 64 20 29 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63  d );.  }.  testc
8f70: 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67  ase( nSize==pPag
8f80: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  e->maxLocal );. 
8f90: 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65   testcase( nSize
8fa0: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
8fb0: 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 53 69  l+1 );.  if( nSi
8fc0: 7a 65 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze<=pPage->maxLo
8fd0: 63 61 6c 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65  cal ){.    nSize
8fe0: 20 2b 3d 20 28 75 33 32 29 28 70 49 74 65 72 20   += (u32)(pIter 
8ff0: 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  - pCell);.    if
9000: 28 20 6e 53 69 7a 65 3c 34 20 29 20 6e 53 69 7a  ( nSize<4 ) nSiz
9010: 65 20 3d 20 34 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 4;.  }else{.
9020: 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c      int minLocal
9030: 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63   = pPage->minLoc
9040: 61 6c 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20  al;.    nSize = 
9050: 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a  minLocal + (nSiz
9060: 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20  e - minLocal) % 
9070: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
9080: 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20  bleSize - 4);.  
9090: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
90a0: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
90b0: 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  al );.    testca
90c0: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
90d0: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
90e0: 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50      if( nSize>pP
90f0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
9100: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d  .      nSize = m
9110: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20  inLocal;.    }. 
9120: 20 20 20 6e 53 69 7a 65 20 2b 3d 20 34 20 2b 20     nSize += 4 + 
9130: 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43  (u16)(pIter - pC
9140: 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ell);.  }.  asse
9150: 72 74 28 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67  rt( nSize==debug
9160: 69 6e 66 6f 2e 6e 53 69 7a 65 20 7c 7c 20 43 4f  info.nSize || CO
9170: 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 72 65  RRUPT_DB );.  re
9180: 74 75 72 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b  turn (u16)nSize;
9190: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
91a0: 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 20  E_DEBUG./* This 
91b0: 76 61 72 69 61 74 69 6f 6e 20 6f 6e 20 63 65 6c  variation on cel
91c0: 6c 53 69 7a 65 50 74 72 28 29 20 69 73 20 75 73  lSizePtr() is us
91d0: 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73  ed inside of ass
91e0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
91f0: 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61  .** only. */.sta
9200: 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65  tic u16 cellSize
9210: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
9220: 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72   int iCell){.  r
9230: 65 74 75 72 6e 20 63 65 6c 6c 53 69 7a 65 50 74  eturn cellSizePt
9240: 72 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c  r(pPage, findCel
9250: 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 29  l(pPage, iCell))
9260: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
9270: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9280: 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  AUTOVACUUM./*.**
9290: 20 49 66 20 74 68 65 20 63 65 6c 6c 20 70 43 65   If the cell pCe
92a0: 6c 6c 2c 20 70 61 72 74 20 6f 66 20 70 61 67 65  ll, part of page
92b0: 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20   pPage contains 
92c0: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
92d0: 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
92e0: 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72  , insert an entr
92f0: 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  y into the point
9300: 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68  er-map.** for th
9310: 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  e overflow page.
9320: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9330: 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
9340: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
9350: 20 75 38 20 2a 70 43 65 6c 6c 2c 20 69 6e 74 20   u8 *pCell, int 
9360: 2a 70 52 43 29 7b 0a 20 20 43 65 6c 6c 49 6e 66  *pRC){.  CellInf
9370: 6f 20 69 6e 66 6f 3b 0a 20 20 69 66 28 20 2a 70  o info;.  if( *p
9380: 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  RC ) return;.  a
9390: 73 73 65 72 74 28 20 70 43 65 6c 6c 21 3d 30 20  ssert( pCell!=0 
93a0: 29 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65 43  );.  btreeParseC
93b0: 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
93c0: 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69  ell, &info);.  i
93d0: 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  f( info.iOverflo
93e0: 77 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76  w ){.    Pgno ov
93f0: 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  fl = get4byte(&p
9400: 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
9410: 6c 6f 77 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61  low]);.    ptrma
9420: 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c  pPut(pPage->pBt,
9430: 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56   ovfl, PTRMAP_OV
9440: 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e  ERFLOW1, pPage->
9450: 70 67 6e 6f 2c 20 70 52 43 29 3b 0a 20 20 7d 0a  pgno, pRC);.  }.
9460: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
9470: 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20   Defragment the 
9480: 70 61 67 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c  page given.  All
9490: 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64   Cells are moved
94a0: 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f   to the.** end o
94b0: 66 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 61  f the page and a
94c0: 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20 69 73  ll free space is
94d0: 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20   collected into 
94e0: 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65 65 42  one.** big FreeB
94f0: 6c 6b 20 74 68 61 74 20 6f 63 63 75 72 73 20 69  lk that occurs i
9500: 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 68 65  n between the he
9510: 61 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a  ader and cell.**
9520: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 61   pointer array a
9530: 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  nd the cell cont
9540: 65 6e 74 20 61 72 65 61 2e 0a 2a 2a 0a 2a 2a 20  ent area..**.** 
9550: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
9560: 34 35 38 32 2d 36 30 31 33 38 20 53 51 4c 69 74  4582-60138 SQLit
9570: 65 20 6d 61 79 20 66 72 6f 6d 20 74 69 6d 65 20  e may from time 
9580: 74 6f 20 74 69 6d 65 20 72 65 6f 72 67 61 6e 69  to time reorgani
9590: 7a 65 20 61 0a 2a 2a 20 62 2d 74 72 65 65 20 70  ze a.** b-tree p
95a0: 61 67 65 20 73 6f 20 74 68 61 74 20 74 68 65 72  age so that ther
95b0: 65 20 61 72 65 20 6e 6f 20 66 72 65 65 62 6c 6f  e are no freeblo
95c0: 63 6b 73 20 6f 72 20 66 72 61 67 6d 65 6e 74 20  cks or fragment 
95d0: 62 79 74 65 73 2c 20 61 6c 6c 0a 2a 2a 20 75 6e  bytes, all.** un
95e0: 75 73 65 64 20 62 79 74 65 73 20 61 72 65 20 63  used bytes are c
95f0: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
9600: 75 6e 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63  unallocated spac
9610: 65 20 72 65 67 69 6f 6e 2c 20 61 6e 64 20 61 6c  e region, and al
9620: 6c 0a 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20 70  l.** cells are p
9630: 61 63 6b 65 64 20 74 69 67 68 74 6c 79 20 61 74  acked tightly at
9640: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
9650: 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
9660: 69 6e 74 20 64 65 66 72 61 67 6d 65 6e 74 50 61  int defragmentPa
9670: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
9680: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  e){.  int i;    
9690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96a0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
96b0: 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20   */.  int pc;   
96c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96d0: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
96e0: 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a  he i-th cell */.
96f0: 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20    int hdr;      
9700: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9710: 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 70 61  Offset to the pa
9720: 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  ge header */.  i
9730: 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20  nt size;        
9740: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
9750: 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20  e of a cell */. 
9760: 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b   int usableSize;
9770: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
9780: 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c 65 20  umber of usable 
9790: 62 79 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20  bytes on a page 
97a0: 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66  */.  int cellOff
97b0: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
97c0: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65  /* Offset to the
97d0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
97e0: 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72  ray */.  int cbr
97f0: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
9800: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
9810: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
9820: 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20  t area */.  int 
9830: 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  nCell;          
9840: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9850: 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65   of cells on the
9860: 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67   page */.  unsig
9870: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 20  ned char *data; 
9880: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
9890: 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69  e data */.  unsi
98a0: 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70 3b  gned char *temp;
98b0: 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 61         /* Temp a
98c0: 72 65 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e  rea for cell con
98d0: 74 65 6e 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  tent */.  unsign
98e0: 65 64 20 63 68 61 72 20 2a 73 72 63 3b 20 20 20  ed char *src;   
98f0: 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6f       /* Source o
9900: 66 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69  f content */.  i
9910: 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20  nt iCellFirst;  
9920: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
9930: 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c  st allowable cel
9940: 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  l index */.  int
9950: 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20   iCellLast;     
9960: 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20          /* Last 
9970: 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 69 6e  possible cell in
9980: 64 65 78 20 2a 2f 0a 0a 0a 20 20 61 73 73 65 72  dex */...  asser
9990: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
99a0: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
99b0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
99c0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
99d0: 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
99e0: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  t( pPage->pBt->u
99f0: 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c  sableSize <= SQL
9a00: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
9a10: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
9a20: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
9a30: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
9a40: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
9a50: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
9a60: 75 74 65 78 29 20 29 3b 0a 20 20 74 65 6d 70 20  utex) );.  temp 
9a70: 3d 20 30 3b 0a 20 20 73 72 63 20 3d 20 64 61 74  = 0;.  src = dat
9a80: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
9a90: 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  ;.  hdr = pPage-
9aa0: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 65  >hdrOffset;.  ce
9ab0: 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  llOffset = pPage
9ac0: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  ->cellOffset;.  
9ad0: 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e  nCell = pPage->n
9ae0: 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  Cell;.  assert( 
9af0: 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28  nCell==get2byte(
9b00: 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29 3b  &data[hdr+3]) );
9b10: 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  .  usableSize = 
9b20: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
9b30: 6c 65 53 69 7a 65 3b 0a 20 20 63 62 72 6b 20 3d  leSize;.  cbrk =
9b40: 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69   usableSize;.  i
9b50: 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c  CellFirst = cell
9b60: 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c  Offset + 2*nCell
9b70: 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20  ;.  iCellLast = 
9b80: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a  usableSize - 4;.
9b90: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
9ba0: 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  ll; i++){.    u8
9bb0: 20 2a 70 41 64 64 72 3b 20 20 20 20 20 2f 2a 20   *pAddr;     /* 
9bc0: 54 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f  The i-th cell po
9bd0: 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 41 64  inter */.    pAd
9be0: 64 72 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f  dr = &data[cellO
9bf0: 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20  ffset + i*2];.  
9c00: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
9c10: 70 41 64 64 72 29 3b 0a 20 20 20 20 74 65 73 74  pAddr);.    test
9c20: 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46  case( pc==iCellF
9c30: 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74  irst );.    test
9c40: 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c  case( pc==iCellL
9c50: 61 73 74 20 29 3b 0a 23 69 66 20 21 64 65 66 69  ast );.#if !defi
9c60: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
9c70: 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f  E_OVERSIZE_CELL_
9c80: 43 48 45 43 4b 29 0a 20 20 20 20 2f 2a 20 54 68  CHECK).    /* Th
9c90: 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 68  ese conditions h
9ca0: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
9cb0: 20 76 65 72 69 66 69 65 64 20 69 6e 20 62 74 72   verified in btr
9cc0: 65 65 49 6e 69 74 50 61 67 65 28 29 0a 20 20 20  eeInitPage().   
9cd0: 20 2a 2a 20 69 66 20 53 51 4c 49 54 45 5f 45 4e   ** if SQLITE_EN
9ce0: 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45  ABLE_OVERSIZE_CE
9cf0: 4c 4c 5f 43 48 45 43 4b 20 69 73 20 64 65 66 69  LL_CHECK is defi
9d00: 6e 65 64 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ned .    */.    
9d10: 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73  if( pc<iCellFirs
9d20: 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73  t || pc>iCellLas
9d30: 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  t ){.      retur
9d40: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
9d50: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6e  _BKPT;.    }.#en
9d60: 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20  dif.    assert( 
9d70: 70 63 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 26  pc>=iCellFirst &
9d80: 26 20 70 63 3c 3d 69 43 65 6c 6c 4c 61 73 74 20  & pc<=iCellLast 
9d90: 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 63 65  );.    size = ce
9da0: 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
9db0: 20 26 73 72 63 5b 70 63 5d 29 3b 0a 20 20 20 20   &src[pc]);.    
9dc0: 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 23 69  cbrk -= size;.#i
9dd0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
9de0: 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45  _ENABLE_OVERSIZE
9df0: 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20  _CELL_CHECK).   
9e00: 20 69 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46   if( cbrk<iCellF
9e10: 69 72 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65  irst ){.      re
9e20: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
9e30: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
9e40: 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 63 62  #else.    if( cb
9e50: 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c  rk<iCellFirst ||
9e60: 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53   pc+size>usableS
9e70: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ize ){.      ret
9e80: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
9e90: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 23  PT_BKPT;.    }.#
9ea0: 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 74  endif.    assert
9eb0: 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d 75 73 61  ( cbrk+size<=usa
9ec0: 62 6c 65 53 69 7a 65 20 26 26 20 63 62 72 6b 3e  bleSize && cbrk>
9ed0: 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20  =iCellFirst );. 
9ee0: 20 20 20 74 65 73 74 63 61 73 65 28 20 63 62 72     testcase( cbr
9ef0: 6b 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69  k+size==usableSi
9f00: 7a 65 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  ze );.    testca
9f10: 73 65 28 20 70 63 2b 73 69 7a 65 3d 3d 75 73 61  se( pc+size==usa
9f20: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 70  bleSize );.    p
9f30: 75 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 63  ut2byte(pAddr, c
9f40: 62 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 74 65  brk);.    if( te
9f50: 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  mp==0 ){.      i
9f60: 6e 74 20 78 3b 0a 20 20 20 20 20 20 69 66 28 20  nt x;.      if( 
9f70: 63 62 72 6b 3d 3d 70 63 20 29 20 63 6f 6e 74 69  cbrk==pc ) conti
9f80: 6e 75 65 3b 0a 20 20 20 20 20 20 74 65 6d 70 20  nue;.      temp 
9f90: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 65  = sqlite3PagerTe
9fa0: 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d 3e 70  mpSpace(pPage->p
9fb0: 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
9fc0: 20 20 20 78 20 3d 20 67 65 74 32 62 79 74 65 28     x = get2byte(
9fd0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
9fe0: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 74 65 6d       memcpy(&tem
9ff0: 70 5b 78 5d 2c 20 26 64 61 74 61 5b 78 5d 2c 20  p[x], &data[x], 
a000: 28 63 62 72 6b 2b 73 69 7a 65 29 20 2d 20 78 29  (cbrk+size) - x)
a010: 3b 0a 20 20 20 20 20 20 73 72 63 20 3d 20 74 65  ;.      src = te
a020: 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  mp;.    }.    me
a030: 6d 63 70 79 28 26 64 61 74 61 5b 63 62 72 6b 5d  mcpy(&data[cbrk]
a040: 2c 20 26 73 72 63 5b 70 63 5d 2c 20 73 69 7a 65  , &src[pc], size
a050: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
a060: 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73   cbrk>=iCellFirs
a070: 74 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  t );.  put2byte(
a080: 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 62  &data[hdr+5], cb
a090: 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b  rk);.  data[hdr+
a0a0: 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68  1] = 0;.  data[h
a0b0: 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64 61 74  dr+2] = 0;.  dat
a0c0: 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20  a[hdr+7] = 0;.  
a0d0: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69 43 65  memset(&data[iCe
a0e0: 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63 62 72  llFirst], 0, cbr
a0f0: 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20  k-iCellFirst);. 
a100: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a110: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
a120: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
a130: 20 29 3b 0a 20 20 69 66 28 20 63 62 72 6b 2d 69   );.  if( cbrk-i
a140: 43 65 6c 6c 46 69 72 73 74 21 3d 70 50 61 67 65  CellFirst!=pPage
a150: 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 72  ->nFree ){.    r
a160: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
a170: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
a180: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
a190: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72  K;.}../*.** Sear
a1a0: 63 68 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  ch the free-list
a1b0: 20 6f 6e 20 70 61 67 65 20 70 50 67 20 66 6f 72   on page pPg for
a1c0: 20 73 70 61 63 65 20 74 6f 20 73 74 6f 72 65 20   space to store 
a1d0: 61 20 63 65 6c 6c 20 6e 42 79 74 65 20 62 79 74  a cell nByte byt
a1e0: 65 73 20 69 6e 0a 2a 2a 20 73 69 7a 65 2e 20 49  es in.** size. I
a1f0: 66 20 6f 6e 65 20 63 61 6e 20 62 65 20 66 6f 75  f one can be fou
a200: 6e 64 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69  nd, return a poi
a210: 6e 74 65 72 20 74 6f 20 74 68 65 20 73 70 61 63  nter to the spac
a220: 65 20 61 6e 64 20 72 65 6d 6f 76 65 20 69 74 0a  e and remove it.
a230: 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ** from the free
a240: 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  -list..**.** If 
a250: 6e 6f 20 73 75 69 74 61 62 6c 65 20 73 70 61 63  no suitable spac
a260: 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 6f  e can be found o
a270: 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  n the free-list,
a280: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a   return NULL..**
a290: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
a2a0: 6e 20 6d 61 79 20 64 65 74 65 63 74 20 63 6f 72  n may detect cor
a2b0: 72 75 70 74 69 6f 6e 20 77 69 74 68 69 6e 20 70  ruption within p
a2c0: 50 67 2e 20 20 49 66 20 63 6f 72 72 75 70 74 69  Pg.  If corrupti
a2d0: 6f 6e 20 69 73 0a 2a 2a 20 64 65 74 65 63 74 65  on is.** detecte
a2e0: 64 20 74 68 65 6e 20 2a 70 52 63 20 69 73 20 73  d then *pRc is s
a2f0: 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f 52  et to SQLITE_COR
a300: 52 55 50 54 20 61 6e 64 20 4e 55 4c 4c 20 69 73  RUPT and NULL is
a310: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
a320: 20 49 66 20 61 20 73 6c 6f 74 20 6f 66 20 61 74   If a slot of at
a330: 20 6c 65 61 73 74 20 6e 42 79 74 65 20 62 79 74   least nByte byt
a340: 65 73 20 69 73 20 66 6f 75 6e 64 20 62 75 74 20  es is found but 
a350: 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 62  cannot be used b
a360: 65 63 61 75 73 65 20 0a 2a 2a 20 74 68 65 72 65  ecause .** there
a370: 20 61 72 65 20 61 6c 72 65 61 64 79 20 61 74 20   are already at 
a380: 6c 65 61 73 74 20 36 30 20 66 72 61 67 6d 65 6e  least 60 fragmen
a390: 74 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65  ted bytes on the
a3a0: 20 70 61 67 65 2c 20 72 65 74 75 72 6e 20 4e 55   page, return NU
a3b0: 4c 4c 2e 0a 2a 2a 20 49 6e 20 74 68 69 73 20 63  LL..** In this c
a3c0: 61 73 65 2c 20 69 66 20 70 62 44 65 66 72 61 67  ase, if pbDefrag
a3d0: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
a3e0: 74 20 4e 55 4c 4c 2c 20 73 65 74 20 2a 70 62 44  t NULL, set *pbD
a3f0: 65 66 72 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a  efrag to true..*
a400: 2f 0a 73 74 61 74 69 63 20 75 38 20 2a 70 61 67  /.static u8 *pag
a410: 65 46 69 6e 64 53 6c 6f 74 28 4d 65 6d 50 61 67  eFindSlot(MemPag
a420: 65 20 2a 70 50 67 2c 20 69 6e 74 20 6e 42 79 74  e *pPg, int nByt
a430: 65 2c 20 69 6e 74 20 2a 70 52 63 2c 20 69 6e 74  e, int *pRc, int
a440: 20 2a 70 62 44 65 66 72 61 67 29 7b 0a 20 20 63   *pbDefrag){.  c
a450: 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70  onst int hdr = p
a460: 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  Pg->hdrOffset;. 
a470: 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61 74   u8 * const aDat
a480: 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a  a = pPg->aData;.
a490: 20 20 69 6e 74 20 69 41 64 64 72 3b 0a 20 20 69    int iAddr;.  i
a4a0: 6e 74 20 70 63 3b 0a 20 20 69 6e 74 20 75 73 61  nt pc;.  int usa
a4b0: 62 6c 65 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70  bleSize = pPg->p
a4c0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
a4d0: 0a 20 20 66 6f 72 28 69 41 64 64 72 3d 68 64 72  .  for(iAddr=hdr
a4e0: 2b 31 3b 20 28 70 63 20 3d 20 67 65 74 32 62 79  +1; (pc = get2by
a4f0: 74 65 28 26 61 44 61 74 61 5b 69 41 64 64 72 5d  te(&aData[iAddr]
a500: 29 29 3e 30 3b 20 69 41 64 64 72 3d 70 63 29 7b  ))>0; iAddr=pc){
a510: 0a 20 20 20 20 69 6e 74 20 73 69 7a 65 3b 20 20  .    int size;  
a520: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
a530: 65 20 6f 66 20 74 68 65 20 66 72 65 65 20 73 6c  e of the free sl
a540: 6f 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 45 56 49  ot */.    /* EVI
a550: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 36 38 36  DENCE-OF: R-0686
a560: 36 2d 33 39 31 32 35 20 46 72 65 65 62 6c 6f 63  6-39125 Freebloc
a570: 6b 73 20 61 72 65 20 61 6c 77 61 79 73 20 63 6f  ks are always co
a580: 6e 6e 65 63 74 65 64 20 69 6e 20 6f 72 64 65 72  nnected in order
a590: 20 6f 66 0a 20 20 20 20 2a 2a 20 69 6e 63 72 65   of.    ** incre
a5a0: 61 73 69 6e 67 20 6f 66 66 73 65 74 2e 20 2a 2f  asing offset. */
a5b0: 0a 20 20 20 20 69 66 28 20 70 63 3e 75 73 61 62  .    if( pc>usab
a5c0: 6c 65 53 69 7a 65 2d 34 20 7c 7c 20 70 63 3c 69  leSize-4 || pc<i
a5d0: 41 64 64 72 2b 34 20 29 7b 0a 20 20 20 20 20 20  Addr+4 ){.      
a5e0: 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  *pRc = SQLITE_CO
a5f0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
a600: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
a610: 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  }.    /* EVIDENC
a620: 45 2d 4f 46 3a 20 52 2d 32 32 37 31 30 2d 35 33  E-OF: R-22710-53
a630: 33 32 38 20 54 68 65 20 74 68 69 72 64 20 61 6e  328 The third an
a640: 64 20 66 6f 75 72 74 68 20 62 79 74 65 73 20 6f  d fourth bytes o
a650: 66 20 65 61 63 68 0a 20 20 20 20 2a 2a 20 66 72  f each.    ** fr
a660: 65 65 62 6c 6f 63 6b 20 66 6f 72 6d 20 61 20 62  eeblock form a b
a670: 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
a680: 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73  r which is the s
a690: 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65 62  ize of the freeb
a6a0: 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 69 6e 20 62  lock.    ** in b
a6b0: 79 74 65 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20  ytes, including 
a6c0: 74 68 65 20 34 2d 62 79 74 65 20 68 65 61 64 65  the 4-byte heade
a6d0: 72 2e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 20 3d  r. */.    size =
a6e0: 20 67 65 74 32 62 79 74 65 28 26 61 44 61 74 61   get2byte(&aData
a6f0: 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28  [pc+2]);.    if(
a700: 20 73 69 7a 65 3e 3d 6e 42 79 74 65 20 29 7b 0a   size>=nByte ){.
a710: 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 73 69        int x = si
a720: 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20  ze - nByte;.    
a730: 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 34    testcase( x==4
a740: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
a750: 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20 20 20  se( x==3 );.    
a760: 20 20 69 66 28 20 78 3c 34 20 29 7b 0a 20 20 20    if( x<4 ){.   
a770: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
a780: 2d 4f 46 3a 20 52 2d 31 31 34 39 38 2d 35 38 30  -OF: R-11498-580
a790: 32 32 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72  22 In a well-for
a7a0: 6d 65 64 20 62 2d 74 72 65 65 20 70 61 67 65 2c  med b-tree page,
a7b0: 20 74 68 65 20 74 6f 74 61 6c 0a 20 20 20 20 20   the total.     
a7c0: 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20     ** number of 
a7d0: 62 79 74 65 73 20 69 6e 20 66 72 61 67 6d 65 6e  bytes in fragmen
a7e0: 74 73 20 6d 61 79 20 6e 6f 74 20 65 78 63 65 65  ts may not excee
a7f0: 64 20 36 30 2e 20 2a 2f 0a 20 20 20 20 20 20 20  d 60. */.       
a800: 20 69 66 28 20 61 44 61 74 61 5b 68 64 72 2b 37   if( aData[hdr+7
a810: 5d 3e 3d 36 30 20 29 7b 0a 20 20 20 20 20 20 20  ]>=60 ){.       
a820: 20 20 20 69 66 28 20 70 62 44 65 66 72 61 67 20     if( pbDefrag 
a830: 29 20 2a 70 62 44 65 66 72 61 67 20 3d 20 31 3b  ) *pbDefrag = 1;
a840: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
a850: 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n 0;.        }. 
a860: 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65         /* Remove
a870: 20 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74   the slot from t
a880: 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 55 70  he free-list. Up
a890: 64 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  date the number 
a8a0: 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 72  of.        ** fr
a8b0: 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20 77  agmented bytes w
a8c0: 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e 20  ithin the page. 
a8d0: 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  */.        memcp
a8e0: 79 28 26 61 44 61 74 61 5b 69 41 64 64 72 5d 2c  y(&aData[iAddr],
a8f0: 20 26 61 44 61 74 61 5b 70 63 5d 2c 20 32 29 3b   &aData[pc], 2);
a900: 0a 20 20 20 20 20 20 20 20 61 44 61 74 61 5b 68  .        aData[h
a910: 64 72 2b 37 5d 20 2b 3d 20 28 75 38 29 78 3b 0a  dr+7] += (u8)x;.
a920: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
a930: 73 69 7a 65 2b 70 63 20 3e 20 75 73 61 62 6c 65  size+pc > usable
a940: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
a950: 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  *pRc = SQLITE_CO
a960: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
a970: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
a980: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a990: 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20 72     /* The slot r
a9a0: 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20 66 72  emains on the fr
a9b0: 65 65 2d 6c 69 73 74 2e 20 52 65 64 75 63 65 20  ee-list. Reduce 
a9c0: 69 74 73 20 73 69 7a 65 20 74 6f 20 61 63 63 6f  its size to acco
a9d0: 75 6e 74 0a 20 20 20 20 20 20 20 20 20 2a 2a 20  unt.         ** 
a9e0: 66 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20  for the portion 
a9f0: 75 73 65 64 20 62 79 20 74 68 65 20 6e 65 77 20  used by the new 
aa00: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20  allocation. */. 
aa10: 20 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28         put2byte(
aa20: 26 61 44 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29  &aData[pc+2], x)
aa30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
aa40: 72 65 74 75 72 6e 20 26 61 44 61 74 61 5b 70 63  return &aData[pc
aa50: 20 2b 20 78 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d   + x];.    }.  }
aa60: 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ..  return 0;.}.
aa70: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
aa80: 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 73  nByte bytes of s
aa90: 70 61 63 65 20 66 72 6f 6d 20 77 69 74 68 69 6e  pace from within
aaa0: 20 74 68 65 20 42 2d 54 72 65 65 20 70 61 67 65   the B-Tree page
aab0: 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68   passed.** as th
aac0: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
aad0: 2e 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 49  . Write into *pI
aae0: 64 78 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74  dx the index int
aaf0: 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  o pPage->aData[]
ab00: 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74  .** of the first
ab10: 20 62 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74   byte of allocat
ab20: 65 64 20 73 70 61 63 65 2e 20 52 65 74 75 72 6e  ed space. Return
ab30: 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4f   either SQLITE_O
ab40: 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  K or.** an error
ab50: 20 63 6f 64 65 20 28 75 73 75 61 6c 6c 79 20 53   code (usually S
ab60: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a  QLITE_CORRUPT)..
ab70: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
ab80: 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74   guarantees that
ab90: 20 74 68 65 72 65 20 69 73 20 73 75 66 66 69 63   there is suffic
aba0: 69 65 6e 74 20 73 70 61 63 65 20 74 6f 20 6d 61  ient space to ma
abb0: 6b 65 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61  ke the.** alloca
abc0: 74 69 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74  tion.  This rout
abd0: 69 6e 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74  ine might need t
abe0: 6f 20 64 65 66 72 61 67 6d 65 6e 74 20 69 6e 20  o defragment in 
abf0: 6f 72 64 65 72 20 74 6f 20 62 72 69 6e 67 0a 2a  order to bring.*
ac00: 2a 20 61 6c 6c 20 74 68 65 20 73 70 61 63 65 20  * all the space 
ac10: 74 6f 67 65 74 68 65 72 2c 20 68 6f 77 65 76 65  together, howeve
ac20: 72 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  r.  This routine
ac30: 20 77 69 6c 6c 20 61 76 6f 69 64 20 75 73 69 6e   will avoid usin
ac40: 67 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74  g.** the first t
ac50: 77 6f 20 62 79 74 65 73 20 70 61 73 74 20 74 68  wo bytes past th
ac60: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
ac70: 72 65 61 20 73 69 6e 63 65 20 70 72 65 73 75 6d  rea since presum
ac80: 61 62 6c 79 20 74 68 69 73 0a 2a 2a 20 61 6c 6c  ably this.** all
ac90: 6f 63 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  ocation is being
aca0: 20 6d 61 64 65 20 69 6e 20 6f 72 64 65 72 20 74   made in order t
acb0: 6f 20 69 6e 73 65 72 74 20 61 20 6e 65 77 20 63  o insert a new c
acc0: 65 6c 6c 2c 20 73 6f 20 77 65 20 77 69 6c 6c 0a  ell, so we will.
acd0: 2a 2a 20 61 6c 73 6f 20 65 6e 64 20 75 70 20 6e  ** also end up n
ace0: 65 65 64 69 6e 67 20 61 20 6e 65 77 20 63 65 6c  eeding a new cel
acf0: 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74  l pointer..*/.st
ad00: 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
ad10: 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a  eSpace(MemPage *
ad20: 70 50 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65  pPage, int nByte
ad30: 2c 20 69 6e 74 20 2a 70 49 64 78 29 7b 0a 20 20  , int *pIdx){.  
ad40: 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20  const int hdr = 
ad50: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
ad60: 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61  ;    /* Local ca
ad70: 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 68 64  che of pPage->hd
ad80: 72 4f 66 66 73 65 74 20 2a 2f 0a 20 20 75 38 20  rOffset */.  u8 
ad90: 2a 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70  * const data = p
ada0: 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20  Page->aData;    
adb0: 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65    /* Local cache
adc0: 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61   of pPage->aData
add0: 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20   */.  int top;  
ade0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
adf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
ae00: 72 73 74 20 62 79 74 65 20 6f 66 20 63 65 6c 6c  rst byte of cell
ae10: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f   content area */
ae20: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
ae30: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
ae40: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67          /* Integ
ae50: 65 72 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  er return code *
ae60: 2f 0a 20 20 69 6e 74 20 67 61 70 3b 20 20 20 20  /.  int gap;    
ae70: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
ae80: 65 20 6f 66 20 67 61 70 20 62 65 74 77 65 65 6e  e of gap between
ae90: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61   cell pointers a
aea0: 6e 64 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  nd cell content 
aeb0: 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  */.  .  assert( 
aec0: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
aed0: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
aee0: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
aef0: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20  ert( pPage->pBt 
af00: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
af10: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
af20: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
af30: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
af40: 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a 20  nByte>=0 );  /* 
af50: 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a  Minimum cell siz
af60: 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65  e is 4 */.  asse
af70: 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  rt( pPage->nFree
af80: 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61 73 73  >=nByte );.  ass
af90: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
afa0: 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73  rflow==0 );.  as
afb0: 73 65 72 74 28 20 6e 42 79 74 65 20 3c 20 28 69  sert( nByte < (i
afc0: 6e 74 29 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  nt)(pPage->pBt->
afd0: 75 73 61 62 6c 65 53 69 7a 65 2d 38 29 20 29 3b  usableSize-8) );
afe0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
aff0: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 3d  e->cellOffset ==
b000: 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50   hdr + 12 - 4*pP
b010: 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 67  age->leaf );.  g
b020: 61 70 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c  ap = pPage->cell
b030: 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65  Offset + 2*pPage
b040: 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  ->nCell;.  asser
b050: 74 28 20 67 61 70 3c 3d 36 35 35 33 36 20 29 3b  t( gap<=65536 );
b060: 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
b070: 46 3a 20 52 2d 32 39 33 35 36 2d 30 32 33 39 31  F: R-29356-02391
b080: 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
b090: 20 75 73 65 73 20 61 20 36 35 35 33 36 2d 62 79   uses a 65536-by
b0a0: 74 65 20 70 61 67 65 20 73 69 7a 65 0a 20 20 2a  te page size.  *
b0b0: 2a 20 61 6e 64 20 74 68 65 20 72 65 73 65 72 76  * and the reserv
b0c0: 65 64 20 73 70 61 63 65 20 69 73 20 7a 65 72 6f  ed space is zero
b0d0: 20 28 74 68 65 20 75 73 75 61 6c 20 76 61 6c 75   (the usual valu
b0e0: 65 20 66 6f 72 20 72 65 73 65 72 76 65 64 20 73  e for reserved s
b0f0: 70 61 63 65 29 0a 20 20 2a 2a 20 74 68 65 6e 20  pace).  ** then 
b100: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
b110: 20 6f 66 66 73 65 74 20 6f 66 20 61 6e 20 65 6d   offset of an em
b120: 70 74 79 20 70 61 67 65 20 77 61 6e 74 73 20 74  pty page wants t
b130: 6f 20 62 65 20 36 35 35 33 36 2e 0a 20 20 2a 2a  o be 65536..  **
b140: 20 48 6f 77 65 76 65 72 2c 20 74 68 61 74 20 69   However, that i
b150: 6e 74 65 67 65 72 20 69 73 20 74 6f 6f 20 6c 61  nteger is too la
b160: 72 67 65 20 74 6f 20 62 65 20 73 74 6f 72 65 64  rge to be stored
b170: 20 69 6e 20 61 20 32 2d 62 79 74 65 20 75 6e 73   in a 2-byte uns
b180: 69 67 6e 65 64 0a 20 20 2a 2a 20 69 6e 74 65 67  igned.  ** integ
b190: 65 72 2c 20 73 6f 20 61 20 76 61 6c 75 65 20 6f  er, so a value o
b1a0: 66 20 30 20 69 73 20 75 73 65 64 20 69 6e 20 69  f 0 is used in i
b1b0: 74 73 20 70 6c 61 63 65 2e 20 2a 2f 0a 20 20 74  ts place. */.  t
b1c0: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74  op = get2byteNot
b1d0: 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35  Zero(&data[hdr+5
b1e0: 5d 29 3b 0a 20 20 69 66 28 20 67 61 70 3e 74 6f  ]);.  if( gap>to
b1f0: 70 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  p ) return SQLIT
b200: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
b210: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
b220: 73 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 62  s enough space b
b230: 65 74 77 65 65 6e 20 67 61 70 20 61 6e 64 20 74  etween gap and t
b240: 6f 70 20 66 6f 72 20 6f 6e 65 20 6d 6f 72 65 20  op for one more 
b250: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 0a 20 20 2a  cell pointer.  *
b260: 2a 20 61 72 72 61 79 20 65 6e 74 72 79 20 6f 66  * array entry of
b270: 66 73 65 74 2c 20 61 6e 64 20 69 66 20 74 68 65  fset, and if the
b280: 20 66 72 65 65 6c 69 73 74 20 69 73 20 6e 6f 74   freelist is not
b290: 20 65 6d 70 74 79 2c 20 74 68 65 6e 20 73 65 61   empty, then sea
b2a0: 72 63 68 20 74 68 65 0a 20 20 2a 2a 20 66 72 65  rch the.  ** fre
b2b0: 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f  elist looking fo
b2c0: 72 20 61 20 66 72 65 65 20 73 6c 6f 74 20 62 69  r a free slot bi
b2d0: 67 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69  g enough to sati
b2e0: 73 66 79 20 74 68 65 20 72 65 71 75 65 73 74 2e  sfy the request.
b2f0: 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  .  */.  testcase
b300: 28 20 67 61 70 2b 32 3d 3d 74 6f 70 20 29 3b 0a  ( gap+2==top );.
b310: 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b    testcase( gap+
b320: 31 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74  1==top );.  test
b330: 63 61 73 65 28 20 67 61 70 3d 3d 74 6f 70 20 29  case( gap==top )
b340: 3b 0a 20 20 69 66 28 20 67 61 70 2b 32 3c 3d 74  ;.  if( gap+2<=t
b350: 6f 70 20 26 26 20 28 64 61 74 61 5b 68 64 72 2b  op && (data[hdr+
b360: 31 5d 20 7c 7c 20 64 61 74 61 5b 68 64 72 2b 32  1] || data[hdr+2
b370: 5d 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 44  ]) ){.    int bD
b380: 65 66 72 61 67 20 3d 20 30 3b 0a 20 20 20 20 75  efrag = 0;.    u
b390: 38 20 2a 70 53 70 61 63 65 20 3d 20 70 61 67 65  8 *pSpace = page
b3a0: 46 69 6e 64 53 6c 6f 74 28 70 50 61 67 65 2c 20  FindSlot(pPage, 
b3b0: 6e 42 79 74 65 2c 20 26 72 63 2c 20 26 62 44 65  nByte, &rc, &bDe
b3c0: 66 72 61 67 29 3b 0a 20 20 20 20 69 66 28 20 72  frag);.    if( r
b3d0: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
b3e0: 20 20 20 69 66 28 20 62 44 65 66 72 61 67 20 29     if( bDefrag )
b3f0: 20 67 6f 74 6f 20 64 65 66 72 61 67 6d 65 6e 74   goto defragment
b400: 5f 70 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70  _page;.    if( p
b410: 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 61  Space ){.      a
b420: 73 73 65 72 74 28 20 70 53 70 61 63 65 3e 3d 64  ssert( pSpace>=d
b430: 61 74 61 20 26 26 20 28 70 53 70 61 63 65 20 2d  ata && (pSpace -
b440: 20 64 61 74 61 29 3c 36 35 35 33 36 20 29 3b 0a   data)<65536 );.
b450: 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20 28 69        *pIdx = (i
b460: 6e 74 29 28 70 53 70 61 63 65 20 2d 20 64 61 74  nt)(pSpace - dat
b470: 61 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  a);.      return
b480: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
b490: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
b4a0: 72 65 71 75 65 73 74 20 63 6f 75 6c 64 20 6e 6f  request could no
b4b0: 74 20 62 65 20 66 75 6c 66 69 6c 6c 65 64 20 75  t be fulfilled u
b4c0: 73 69 6e 67 20 61 20 66 72 65 65 6c 69 73 74 20  sing a freelist 
b4d0: 73 6c 6f 74 2e 20 20 43 68 65 63 6b 0a 20 20 2a  slot.  Check.  *
b4e0: 2a 20 74 6f 20 73 65 65 20 69 66 20 64 65 66 72  * to see if defr
b4f0: 61 67 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 6e  agmentation is n
b500: 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20  ecessary..  */. 
b510: 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32   testcase( gap+2
b520: 2b 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b 0a 20  +nByte==top );. 
b530: 20 69 66 28 20 67 61 70 2b 32 2b 6e 42 79 74 65   if( gap+2+nByte
b540: 3e 74 6f 70 20 29 7b 0a 20 64 65 66 72 61 67 6d  >top ){. defragm
b550: 65 6e 74 5f 70 61 67 65 3a 0a 20 20 20 20 61 73  ent_page:.    as
b560: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
b570: 6c 6c 3e 30 20 7c 7c 20 43 4f 52 52 55 50 54 5f  ll>0 || CORRUPT_
b580: 44 42 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 64  DB );.    rc = d
b590: 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50  efragmentPage(pP
b5a0: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
b5b0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
b5c0: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
b5d0: 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64  NotZero(&data[hd
b5e0: 72 2b 35 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  r+5]);.    asser
b5f0: 74 28 20 67 61 70 2b 6e 42 79 74 65 3c 3d 74 6f  t( gap+nByte<=to
b600: 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20  p );.  }...  /* 
b610: 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  Allocate memory 
b620: 66 72 6f 6d 20 74 68 65 20 67 61 70 20 69 6e 20  from the gap in 
b630: 62 65 74 77 65 65 6e 20 74 68 65 20 63 65 6c 6c  between the cell
b640: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 0a 20   pointer array. 
b650: 20 2a 2a 20 61 6e 64 20 74 68 65 20 63 65 6c 6c   ** and the cell
b660: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 20   content area.  
b670: 54 68 65 20 62 74 72 65 65 49 6e 69 74 50 61 67  The btreeInitPag
b680: 65 28 29 20 63 61 6c 6c 20 68 61 73 20 61 6c 72  e() call has alr
b690: 65 61 64 79 0a 20 20 2a 2a 20 76 61 6c 69 64 61  eady.  ** valida
b6a0: 74 65 64 20 74 68 65 20 66 72 65 65 6c 69 73 74  ted the freelist
b6b0: 2e 20 20 47 69 76 65 6e 20 74 68 61 74 20 74 68  .  Given that th
b6c0: 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 76 61  e freelist is va
b6d0: 6c 69 64 2c 20 74 68 65 72 65 0a 20 20 2a 2a 20  lid, there.  ** 
b6e0: 69 73 20 6e 6f 20 77 61 79 20 74 68 61 74 20 74  is no way that t
b6f0: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61  he allocation ca
b700: 6e 20 65 78 74 65 6e 64 20 6f 66 66 20 74 68 65  n extend off the
b710: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65   end of the page
b720: 2e 0a 20 20 2a 2a 20 54 68 65 20 61 73 73 65 72  ..  ** The asser
b730: 74 28 29 20 62 65 6c 6f 77 20 76 65 72 69 66 69  t() below verifi
b740: 65 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  es the previous 
b750: 73 65 6e 74 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20  sentence..  */. 
b760: 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20   top -= nByte;. 
b770: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
b780: 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20  hdr+5], top);.  
b790: 61 73 73 65 72 74 28 20 74 6f 70 2b 6e 42 79 74  assert( top+nByt
b7a0: 65 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d  e <= (int)pPage-
b7b0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
b7c0: 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 74 6f   );.  *pIdx = to
b7d0: 70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  p;.  return SQLI
b7e0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
b7f0: 52 65 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e  Return a section
b800: 20 6f 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61   of the pPage->a
b810: 44 61 74 61 20 74 6f 20 74 68 65 20 66 72 65 65  Data to the free
b820: 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72  list..** The fir
b830: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e  st byte of the n
b840: 65 77 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73  ew free block is
b850: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 69 53   pPage->aData[iS
b860: 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65  tart].** and the
b870: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f   size of the blo
b880: 63 6b 20 69 73 20 69 53 69 7a 65 20 62 79 74 65  ck is iSize byte
b890: 73 2e 0a 2a 2a 0a 2a 2a 20 41 64 6a 61 63 65 6e  s..**.** Adjacen
b8a0: 74 20 66 72 65 65 62 6c 6f 63 6b 73 20 61 72 65  t freeblocks are
b8b0: 20 63 6f 61 6c 65 73 63 65 64 2e 0a 2a 2a 0a 2a   coalesced..**.*
b8c0: 2a 20 4e 6f 74 65 20 74 68 61 74 20 65 76 65 6e  * Note that even
b8d0: 20 74 68 6f 75 67 68 20 74 68 65 20 66 72 65 65   though the free
b8e0: 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73 20 63  block list was c
b8f0: 68 65 63 6b 65 64 20 62 79 20 62 74 72 65 65 49  hecked by btreeI
b900: 6e 69 74 50 61 67 65 28 29 2c 0a 2a 2a 20 74 68  nitPage(),.** th
b910: 61 74 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  at routine will 
b920: 6e 6f 74 20 64 65 74 65 63 74 20 6f 76 65 72 6c  not detect overl
b930: 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 73  ap between cells
b940: 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20   or freeblocks. 
b950: 20 4e 6f 72 0a 2a 2a 20 64 6f 65 73 20 69 74 20   Nor.** does it 
b960: 64 65 74 65 63 74 20 63 65 6c 6c 73 20 6f 72 20  detect cells or 
b970: 66 72 65 65 62 6c 6f 63 6b 73 20 74 68 61 74 20  freeblocks that 
b980: 65 6e 63 72 6f 75 63 68 20 69 6e 74 6f 20 74 68  encrouch into th
b990: 65 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73  e reserved bytes
b9a0: 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f  .** at the end o
b9b0: 66 20 74 68 65 20 70 61 67 65 2e 20 20 53 6f 20  f the page.  So 
b9c0: 64 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  do additional co
b9d0: 72 72 75 70 74 69 6f 6e 20 63 68 65 63 6b 73 20  rruption checks 
b9e0: 69 6e 73 69 64 65 20 74 68 69 73 0a 2a 2a 20 72  inside this.** r
b9f0: 6f 75 74 69 6e 65 20 61 6e 64 20 72 65 74 75 72  outine and retur
ba00: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
ba10: 20 69 66 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73   if any problems
ba20: 20 61 72 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73   are found..*/.s
ba30: 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 53 70  tatic int freeSp
ba40: 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ace(MemPage *pPa
ba50: 67 65 2c 20 75 31 36 20 69 53 74 61 72 74 2c 20  ge, u16 iStart, 
ba60: 75 31 36 20 69 53 69 7a 65 29 7b 0a 20 20 75 31  u16 iSize){.  u1
ba70: 36 20 69 50 74 72 3b 20 20 20 20 20 20 20 20 20  6 iPtr;         
ba80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba90: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
baa0: 66 20 70 74 72 20 74 6f 20 6e 65 78 74 20 66 72  f ptr to next fr
bab0: 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 31 36  eeblock */.  u16
bac0: 20 69 46 72 65 65 42 6c 6b 3b 20 20 20 20 20 20   iFreeBlk;      
bad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bae0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
baf0: 20 74 68 65 20 6e 65 78 74 20 66 72 65 65 62 6c   the next freebl
bb00: 6f 63 6b 20 2a 2f 0a 20 20 75 38 20 68 64 72 3b  ock */.  u8 hdr;
bb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bb30: 2a 20 50 61 67 65 20 68 65 61 64 65 72 20 73 69  * Page header si
bb40: 7a 65 2e 20 20 30 20 6f 72 20 31 30 30 20 2a 2f  ze.  0 or 100 */
bb50: 0a 20 20 75 38 20 6e 46 72 61 67 20 3d 20 30 3b  .  u8 nFrag = 0;
bb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb70: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 64 75           /* Redu
bb80: 63 74 69 6f 6e 20 69 6e 20 66 72 61 67 6d 65 6e  ction in fragmen
bb90: 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 31 36 20  tation */.  u16 
bba0: 69 4f 72 69 67 53 69 7a 65 20 3d 20 69 53 69 7a  iOrigSize = iSiz
bbb0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
bbc0: 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
bbd0: 6c 75 65 20 6f 66 20 69 53 69 7a 65 20 2a 2f 0a  lue of iSize */.
bbe0: 20 20 75 33 32 20 69 4c 61 73 74 20 3d 20 70 50    u32 iLast = pP
bbf0: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
bc00: 53 69 7a 65 2d 34 3b 20 2f 2a 20 4c 61 72 67 65  Size-4; /* Large
bc10: 73 74 20 70 6f 73 73 69 62 6c 65 20 66 72 65 65  st possible free
bc20: 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a  block offset */.
bc30: 20 20 75 33 32 20 69 45 6e 64 20 3d 20 69 53 74    u32 iEnd = iSt
bc40: 61 72 74 20 2b 20 69 53 69 7a 65 3b 20 20 20 20  art + iSize;    
bc50: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
bc60: 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 69   byte past the i
bc70: 53 74 61 72 74 20 62 75 66 66 65 72 20 2a 2f 0a  Start buffer */.
bc80: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
bc90: 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61  *data = pPage->a
bca0: 44 61 74 61 3b 20 20 20 2f 2a 20 50 61 67 65 20  Data;   /* Page 
bcb0: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73  content */..  as
bcc0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
bcd0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
bce0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
bcf0: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
bd00: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
bd10: 73 65 72 74 28 20 69 53 74 61 72 74 3e 3d 70 50  sert( iStart>=pP
bd20: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36  age->hdrOffset+6
bd30: 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72  +pPage->childPtr
bd40: 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Size );.  assert
bd50: 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
bd60: 69 45 6e 64 20 3c 3d 20 70 50 61 67 65 2d 3e 70  iEnd <= pPage->p
bd70: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
bd80: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
bd90: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
bda0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
bdb0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ) );.  assert( i
bdc0: 53 69 7a 65 3e 3d 34 20 29 3b 20 20 20 2f 2a 20  Size>=4 );   /* 
bdd0: 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a  Minimum cell siz
bde0: 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65  e is 4 */.  asse
bdf0: 72 74 28 20 69 53 74 61 72 74 3c 3d 69 4c 61 73  rt( iStart<=iLas
be00: 74 20 29 3b 0a 0a 20 20 2f 2a 20 4f 76 65 72 77  t );..  /* Overw
be10: 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66  rite deleted inf
be20: 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65  ormation with ze
be30: 72 6f 73 20 77 68 65 6e 20 74 68 65 20 73 65 63  ros when the sec
be40: 75 72 65 5f 64 65 6c 65 74 65 0a 20 20 2a 2a 20  ure_delete.  ** 
be50: 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  option is enable
be60: 64 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65  d */.  if( pPage
be70: 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ->pBt->btsFlags 
be80: 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  & BTS_SECURE_DEL
be90: 45 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  ETE ){.    memse
bea0: 74 28 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c  t(&data[iStart],
beb0: 20 30 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a   0, iSize);.  }.
bec0: 0a 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 6f  .  /* The list o
bed0: 66 20 66 72 65 65 62 6c 6f 63 6b 73 20 6d 75 73  f freeblocks mus
bee0: 74 20 62 65 20 69 6e 20 61 73 63 65 6e 64 69 6e  t be in ascendin
bef0: 67 20 6f 72 64 65 72 2e 20 20 46 69 6e 64 20 74  g order.  Find t
bf00: 68 65 20 0a 20 20 2a 2a 20 73 70 6f 74 20 6f 6e  he .  ** spot on
bf10: 20 74 68 65 20 6c 69 73 74 20 77 68 65 72 65 20   the list where 
bf20: 69 53 74 61 72 74 20 73 68 6f 75 6c 64 20 62 65  iStart should be
bf30: 20 69 6e 73 65 72 74 65 64 2e 0a 20 20 2a 2f 0a   inserted..  */.
bf40: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
bf50: 64 72 4f 66 66 73 65 74 3b 0a 20 20 69 50 74 72  drOffset;.  iPtr
bf60: 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69 66   = hdr + 1;.  if
bf70: 28 20 64 61 74 61 5b 69 50 74 72 2b 31 5d 3d 3d  ( data[iPtr+1]==
bf80: 30 20 26 26 20 64 61 74 61 5b 69 50 74 72 5d 3d  0 && data[iPtr]=
bf90: 3d 30 20 29 7b 0a 20 20 20 20 69 46 72 65 65 42  =0 ){.    iFreeB
bfa0: 6c 6b 20 3d 20 30 3b 20 20 2f 2a 20 53 68 6f 72  lk = 0;  /* Shor
bfb0: 74 63 75 74 20 66 6f 72 20 74 68 65 20 63 61 73  tcut for the cas
bfc0: 65 20 77 68 65 6e 20 74 68 65 20 66 72 65 65 6c  e when the freel
bfd0: 69 73 74 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a  ist is empty */.
bfe0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69    }else{.    whi
bff0: 6c 65 28 20 28 69 46 72 65 65 42 6c 6b 20 3d 20  le( (iFreeBlk = 
c000: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
c010: 50 74 72 5d 29 29 3e 30 20 26 26 20 69 46 72 65  Ptr]))>0 && iFre
c020: 65 42 6c 6b 3c 69 53 74 61 72 74 20 29 7b 0a 20  eBlk<iStart ){. 
c030: 20 20 20 20 20 69 66 28 20 69 46 72 65 65 42 6c       if( iFreeBl
c040: 6b 3c 69 50 74 72 2b 34 20 29 20 72 65 74 75 72  k<iPtr+4 ) retur
c050: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
c060: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 69 50 74  _BKPT;.      iPt
c070: 72 20 3d 20 69 46 72 65 65 42 6c 6b 3b 0a 20 20  r = iFreeBlk;.  
c080: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 46 72 65    }.    if( iFre
c090: 65 42 6c 6b 3e 69 4c 61 73 74 20 29 20 72 65 74  eBlk>iLast ) ret
c0a0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
c0b0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73  PT_BKPT;.    ass
c0c0: 65 72 74 28 20 69 46 72 65 65 42 6c 6b 3e 69 50  ert( iFreeBlk>iP
c0d0: 74 72 20 7c 7c 20 69 46 72 65 65 42 6c 6b 3d 3d  tr || iFreeBlk==
c0e0: 30 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 41  0 );.  .    /* A
c0f0: 74 20 74 68 69 73 20 70 6f 69 6e 74 3a 0a 20 20  t this point:.  
c100: 20 20 2a 2a 20 20 20 20 69 46 72 65 65 42 6c 6b    **    iFreeBlk
c110: 3a 20 20 20 46 69 72 73 74 20 66 72 65 65 62 6c  :   First freebl
c120: 6f 63 6b 20 61 66 74 65 72 20 69 53 74 61 72 74  ock after iStart
c130: 2c 20 6f 72 20 7a 65 72 6f 20 69 66 20 6e 6f 6e  , or zero if non
c140: 65 0a 20 20 20 20 2a 2a 20 20 20 20 69 50 74 72  e.    **    iPtr
c150: 3a 20 20 20 20 20 20 20 54 68 65 20 61 64 64 72  :       The addr
c160: 65 73 73 20 6f 66 20 61 20 70 6f 69 6e 74 65 72  ess of a pointer
c170: 20 69 46 72 65 65 42 6c 6b 0a 20 20 20 20 2a 2a   iFreeBlk.    **
c180: 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f  .    ** Check to
c190: 20 73 65 65 20 69 66 20 69 46 72 65 65 42 6c 6b   see if iFreeBlk
c1a0: 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 61 6c 65   should be coale
c1b0: 73 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e  sced onto the en
c1c0: 64 20 6f 66 20 69 53 74 61 72 74 2e 0a 20 20 20  d of iStart..   
c1d0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 46 72 65   */.    if( iFre
c1e0: 65 42 6c 6b 20 26 26 20 69 45 6e 64 2b 33 3e 3d  eBlk && iEnd+3>=
c1f0: 69 46 72 65 65 42 6c 6b 20 29 7b 0a 20 20 20 20  iFreeBlk ){.    
c200: 20 20 6e 46 72 61 67 20 3d 20 69 46 72 65 65 42    nFrag = iFreeB
c210: 6c 6b 20 2d 20 69 45 6e 64 3b 0a 20 20 20 20 20  lk - iEnd;.     
c220: 20 69 66 28 20 69 45 6e 64 3e 69 46 72 65 65 42   if( iEnd>iFreeB
c230: 6c 6b 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  lk ) return SQLI
c240: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
c250: 0a 20 20 20 20 20 20 69 45 6e 64 20 3d 20 69 46  .      iEnd = iF
c260: 72 65 65 42 6c 6b 20 2b 20 67 65 74 32 62 79 74  reeBlk + get2byt
c270: 65 28 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b  e(&data[iFreeBlk
c280: 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 53 69 7a  +2]);.      iSiz
c290: 65 20 3d 20 69 45 6e 64 20 2d 20 69 53 74 61 72  e = iEnd - iStar
c2a0: 74 3b 0a 20 20 20 20 20 20 69 46 72 65 65 42 6c  t;.      iFreeBl
c2b0: 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  k = get2byte(&da
c2c0: 74 61 5b 69 46 72 65 65 42 6c 6b 5d 29 3b 0a 20  ta[iFreeBlk]);. 
c2d0: 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
c2e0: 66 20 69 50 74 72 20 69 73 20 61 6e 6f 74 68 65  f iPtr is anothe
c2f0: 72 20 66 72 65 65 62 6c 6f 63 6b 20 28 74 68 61  r freeblock (tha
c300: 74 20 69 73 2c 20 69 66 20 69 50 74 72 20 69 73  t is, if iPtr is
c310: 20 6e 6f 74 20 74 68 65 20 66 72 65 65 6c 69 73   not the freelis
c320: 74 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72  t.    ** pointer
c330: 20 69 6e 20 74 68 65 20 70 61 67 65 20 68 65 61   in the page hea
c340: 64 65 72 29 20 74 68 65 6e 20 63 68 65 63 6b 20  der) then check 
c350: 74 6f 20 73 65 65 20 69 66 20 69 53 74 61 72 74  to see if iStart
c360: 20 73 68 6f 75 6c 64 20 62 65 0a 20 20 20 20 2a   should be.    *
c370: 2a 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f  * coalesced onto
c380: 20 74 68 65 20 65 6e 64 20 6f 66 20 69 50 74 72   the end of iPtr
c390: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
c3a0: 20 69 50 74 72 3e 68 64 72 2b 31 20 29 7b 0a 20   iPtr>hdr+1 ){. 
c3b0: 20 20 20 20 20 69 6e 74 20 69 50 74 72 45 6e 64       int iPtrEnd
c3c0: 20 3d 20 69 50 74 72 20 2b 20 67 65 74 32 62 79   = iPtr + get2by
c3d0: 74 65 28 26 64 61 74 61 5b 69 50 74 72 2b 32 5d  te(&data[iPtr+2]
c3e0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 50 74  );.      if( iPt
c3f0: 72 45 6e 64 2b 33 3e 3d 69 53 74 61 72 74 20 29  rEnd+3>=iStart )
c400: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 50  {.        if( iP
c410: 74 72 45 6e 64 3e 69 53 74 61 72 74 20 29 20 72  trEnd>iStart ) r
c420: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
c430: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
c440: 20 20 20 6e 46 72 61 67 20 2b 3d 20 69 53 74 61     nFrag += iSta
c450: 72 74 20 2d 20 69 50 74 72 45 6e 64 3b 0a 20 20  rt - iPtrEnd;.  
c460: 20 20 20 20 20 20 69 53 69 7a 65 20 3d 20 69 45        iSize = iE
c470: 6e 64 20 2d 20 69 50 74 72 3b 0a 20 20 20 20 20  nd - iPtr;.     
c480: 20 20 20 69 53 74 61 72 74 20 3d 20 69 50 74 72     iStart = iPtr
c490: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c4a0: 20 20 20 20 69 66 28 20 6e 46 72 61 67 3e 64 61      if( nFrag>da
c4b0: 74 61 5b 68 64 72 2b 37 5d 20 29 20 72 65 74 75  ta[hdr+7] ) retu
c4c0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
c4d0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 64 61 74 61  T_BKPT;.    data
c4e0: 5b 68 64 72 2b 37 5d 20 2d 3d 20 6e 46 72 61 67  [hdr+7] -= nFrag
c4f0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 53 74 61  ;.  }.  if( iSta
c500: 72 74 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61  rt==get2byte(&da
c510: 74 61 5b 68 64 72 2b 35 5d 29 20 29 7b 0a 20 20  ta[hdr+5]) ){.  
c520: 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 66 72 65    /* The new fre
c530: 65 62 6c 6f 63 6b 20 69 73 20 61 74 20 74 68 65  eblock is at the
c540: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
c550: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
c560: 72 65 61 2c 0a 20 20 20 20 2a 2a 20 73 6f 20 6a  rea,.    ** so j
c570: 75 73 74 20 65 78 74 65 6e 64 20 74 68 65 20 63  ust extend the c
c580: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
c590: 20 72 61 74 68 65 72 20 74 68 61 6e 20 63 72 65   rather than cre
c5a0: 61 74 65 20 61 6e 6f 74 68 65 72 0a 20 20 20 20  ate another.    
c5b0: 2a 2a 20 66 72 65 65 6c 69 73 74 20 65 6e 74 72  ** freelist entr
c5c0: 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 74  y */.    if( iPt
c5d0: 72 21 3d 68 64 72 2b 31 20 29 20 72 65 74 75 72  r!=hdr+1 ) retur
c5e0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
c5f0: 5f 42 4b 50 54 3b 0a 20 20 20 20 70 75 74 32 62  _BKPT;.    put2b
c600: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  yte(&data[hdr+1]
c610: 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20 20  , iFreeBlk);.   
c620: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
c630: 68 64 72 2b 35 5d 2c 20 69 45 6e 64 29 3b 0a 20  hdr+5], iEnd);. 
c640: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
c650: 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 66 72  nsert the new fr
c660: 65 65 62 6c 6f 63 6b 20 69 6e 74 6f 20 74 68 65  eeblock into the
c670: 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 20   freelist */.   
c680: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
c690: 69 50 74 72 5d 2c 20 69 53 74 61 72 74 29 3b 0a  iPtr], iStart);.
c6a0: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
c6b0: 74 61 5b 69 53 74 61 72 74 5d 2c 20 69 46 72 65  ta[iStart], iFre
c6c0: 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74 32 62  eBlk);.    put2b
c6d0: 79 74 65 28 26 64 61 74 61 5b 69 53 74 61 72 74  yte(&data[iStart
c6e0: 2b 32 5d 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d  +2], iSize);.  }
c6f0: 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
c700: 2b 3d 20 69 4f 72 69 67 53 69 7a 65 3b 0a 20 20  += iOrigSize;.  
c710: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
c720: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64  ;.}../*.** Decod
c730: 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65  e the flags byte
c740: 20 28 74 68 65 20 66 69 72 73 74 20 62 79 74 65   (the first byte
c750: 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 29 20   of the header) 
c760: 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e  for a page.** an
c770: 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66 69 65  d initialize fie
c780: 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61  lds of the MemPa
c790: 67 65 20 73 74 72 75 63 74 75 72 65 20 61 63 63  ge structure acc
c7a0: 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20  ordingly..**.** 
c7b0: 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69  Only the followi
c7c0: 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20  ng combinations 
c7d0: 61 72 65 20 73 75 70 70 6f 72 74 65 64 2e 20 20  are supported.  
c7e0: 41 6e 79 74 68 69 6e 67 20 64 69 66 66 65 72 65  Anything differe
c7f0: 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73 20  nt.** indicates 
c800: 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
c810: 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20  se files:.**.** 
c820: 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f          PTF_ZERO
c830: 44 41 54 41 0a 2a 2a 20 20 20 20 20 20 20 20 20  DATA.**         
c840: 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20 50  PTF_ZERODATA | P
c850: 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20 20  TF_LEAF.**      
c860: 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20     PTF_LEAFDATA 
c870: 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20  | PTF_INTKEY.** 
c880: 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46          PTF_LEAF
c890: 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45  DATA | PTF_INTKE
c8a0: 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a  Y | PTF_LEAF.*/.
c8b0: 73 74 61 74 69 63 20 69 6e 74 20 64 65 63 6f 64  static int decod
c8c0: 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65 20 2a  eFlags(MemPage *
c8d0: 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 42  pPage, int flagB
c8e0: 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64  yte){.  BtShared
c8f0: 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41 20   *pBt;     /* A 
c900: 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e 70  copy of pPage->p
c910: 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  Bt */..  assert(
c920: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
c930: 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d  t==(pPage->pgno=
c940: 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29 3b  =1 ? 100 : 0) );
c950: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
c960: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
c970: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
c980: 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61   );.  pPage->lea
c990: 66 20 3d 20 28 75 38 29 28 66 6c 61 67 42 79 74  f = (u8)(flagByt
c9a0: 65 3e 3e 33 29 3b 20 20 61 73 73 65 72 74 28 20  e>>3);  assert( 
c9b0: 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c 33  PTF_LEAF == 1<<3
c9c0: 20 29 3b 0a 20 20 66 6c 61 67 42 79 74 65 20 26   );.  flagByte &
c9d0: 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20 20 70  = ~PTF_LEAF;.  p
c9e0: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
c9f0: 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67 65 2d 3e  ze = 4-4*pPage->
ca00: 6c 65 61 66 3b 0a 20 20 70 42 74 20 3d 20 70 50  leaf;.  pBt = pP
ca10: 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20  age->pBt;.  if( 
ca20: 66 6c 61 67 42 79 74 65 3d 3d 28 50 54 46 5f 4c  flagByte==(PTF_L
ca30: 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e  EAFDATA | PTF_IN
ca40: 54 4b 45 59 29 20 29 7b 0a 20 20 20 20 2f 2a 20  TKEY) ){.    /* 
ca50: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
ca60: 33 36 34 30 2d 31 33 34 31 35 20 41 20 76 61 6c  3640-13415 A val
ca70: 75 65 20 6f 66 20 35 20 6d 65 61 6e 73 20 74 68  ue of 5 means th
ca80: 65 20 70 61 67 65 20 69 73 20 61 6e 20 69 6e 74  e page is an int
ca90: 65 72 69 6f 72 0a 20 20 20 20 2a 2a 20 74 61 62  erior.    ** tab
caa0: 6c 65 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  le b-tree page. 
cab0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
cac0: 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46  PTF_LEAFDATA|PTF
cad0: 5f 49 4e 54 4b 45 59 29 3d 3d 35 20 29 3b 0a 20  _INTKEY)==5 );. 
cae0: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
caf0: 46 3a 20 52 2d 32 30 35 30 31 2d 36 31 37 39 36  F: R-20501-61796
cb00: 20 41 20 76 61 6c 75 65 20 6f 66 20 31 33 20 6d   A value of 13 m
cb10: 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73  eans the page is
cb20: 20 61 20 6c 65 61 66 0a 20 20 20 20 2a 2a 20 74   a leaf.    ** t
cb30: 61 62 6c 65 20 62 2d 74 72 65 65 20 70 61 67 65  able b-tree page
cb40: 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
cb50: 20 28 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50   (PTF_LEAFDATA|P
cb60: 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
cb70: 41 46 29 3d 3d 31 33 20 29 3b 0a 20 20 20 20 70  AF)==13 );.    p
cb80: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31  Page->intKey = 1
cb90: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74  ;.    pPage->int
cba0: 4b 65 79 4c 65 61 66 20 3d 20 70 50 61 67 65 2d  KeyLeaf = pPage-
cbb0: 3e 6c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65  >leaf;.    pPage
cbc0: 2d 3e 6e 6f 50 61 79 6c 6f 61 64 20 3d 20 21 70  ->noPayload = !p
cbd0: 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20  Page->leaf;.    
cbe0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
cbf0: 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a  = pBt->maxLeaf;.
cc00: 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f      pPage->minLo
cc10: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65  cal = pBt->minLe
cc20: 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  af;.  }else if( 
cc30: 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45  flagByte==PTF_ZE
cc40: 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20 2f 2a  RODATA ){.    /*
cc50: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
cc60: 32 37 32 32 35 2d 35 33 39 33 36 20 41 20 76 61  27225-53936 A va
cc70: 6c 75 65 20 6f 66 20 32 20 6d 65 61 6e 73 20 74  lue of 2 means t
cc80: 68 65 20 70 61 67 65 20 69 73 20 61 6e 20 69 6e  he page is an in
cc90: 74 65 72 69 6f 72 0a 20 20 20 20 2a 2a 20 69 6e  terior.    ** in
cca0: 64 65 78 20 62 2d 74 72 65 65 20 70 61 67 65 2e  dex b-tree page.
ccb0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
ccc0: 28 50 54 46 5f 5a 45 52 4f 44 41 54 41 29 3d 3d  (PTF_ZERODATA)==
ccd0: 32 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  2 );.    /* EVID
cce0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 36 35 37 31  ENCE-OF: R-16571
ccf0: 2d 31 31 36 31 35 20 41 20 76 61 6c 75 65 20 6f  -11615 A value o
cd00: 66 20 31 30 20 6d 65 61 6e 73 20 74 68 65 20 70  f 10 means the p
cd10: 61 67 65 20 69 73 20 61 20 6c 65 61 66 0a 20 20  age is a leaf.  
cd20: 20 20 2a 2a 20 69 6e 64 65 78 20 62 2d 74 72 65    ** index b-tre
cd30: 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61  e page. */.    a
cd40: 73 73 65 72 74 28 20 28 50 54 46 5f 5a 45 52 4f  ssert( (PTF_ZERO
cd50: 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 3d 3d  DATA|PTF_LEAF)==
cd60: 31 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  10 );.    pPage-
cd70: 3e 69 6e 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20  >intKey = 0;.   
cd80: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65   pPage->intKeyLe
cd90: 61 66 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  af = 0;.    pPag
cda0: 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64 20 3d 20 30  e->noPayload = 0
cdb0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78  ;.    pPage->max
cdc0: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78  Local = pBt->max
cdd0: 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67 65  Local;.    pPage
cde0: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
cdf0: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65  ->minLocal;.  }e
ce00: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44  lse{.    /* EVID
ce10: 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 37 36 30 38  ENCE-OF: R-47608
ce20: 2d 35 36 34 36 39 20 41 6e 79 20 6f 74 68 65 72  -56469 Any other
ce30: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 62   value for the b
ce40: 2d 74 72 65 65 20 70 61 67 65 20 74 79 70 65 20  -tree page type 
ce50: 69 73 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72  is.    ** an err
ce60: 6f 72 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  or. */.    retur
ce70: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
ce80: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61  _BKPT;.  }.  pPa
ce90: 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c  ge->max1bytePayl
cea0: 6f 61 64 20 3d 20 70 42 74 2d 3e 6d 61 78 31 62  oad = pBt->max1b
ceb0: 79 74 65 50 61 79 6c 6f 61 64 3b 0a 20 20 72 65  ytePayload;.  re
cec0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
ced0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
cee0: 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69 61 72  ize the auxiliar
cef0: 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  y information fo
cf00: 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a  r a disk block..
cf10: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
cf20: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
cf30: 73 2e 20 20 49 66 20 77 65 20 73 65 65 20 74 68  s.  If we see th
cf40: 61 74 20 74 68 65 20 70 61 67 65 20 64 6f 65 73  at the page does
cf50: 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  .** not contain 
cf60: 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  a well-formed da
cf70: 74 61 62 61 73 65 20 70 61 67 65 2c 20 74 68 65  tabase page, the
cf80: 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c  n return .** SQL
cf90: 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f  ITE_CORRUPT.  No
cfa0: 74 65 20 74 68 61 74 20 61 20 72 65 74 75 72 6e  te that a return
cfb0: 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f   of SQLITE_OK do
cfc0: 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e  es not.** guaran
cfd0: 74 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67  tee that the pag
cfe0: 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  e is well-formed
cff0: 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73  .  It only shows
d000: 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c   that.** we fail
d010: 65 64 20 74 6f 20 64 65 74 65 63 74 20 61 6e 79  ed to detect any
d020: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a   corruption..*/.
d030: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
d040: 49 6e 69 74 50 61 67 65 28 4d 65 6d 50 61 67 65  InitPage(MemPage
d050: 20 2a 70 50 61 67 65 29 7b 0a 0a 20 20 61 73 73   *pPage){..  ass
d060: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21  ert( pPage->pBt!
d070: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
d080: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
d090: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
d0a0: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
d0b0: 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d  t( pPage->pgno==
d0c0: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
d0d0: 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44  number(pPage->pD
d0e0: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
d0f0: 72 74 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c  rt( pPage == sql
d100: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
d110: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
d120: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
d130: 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73  Page->aData == s
d140: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
d150: 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
d160: 65 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50  e) );..  if( !pP
d170: 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20  age->isInit ){. 
d180: 20 20 20 75 31 36 20 70 63 3b 20 20 20 20 20 20     u16 pc;      
d190: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
d1a0: 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20   of a freeblock 
d1b0: 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44  within pPage->aD
d1c0: 61 74 61 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20  ata[] */.    u8 
d1d0: 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  hdr;            
d1e0: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67  /* Offset to beg
d1f0: 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68  inning of page h
d200: 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 38 20  eader */.    u8 
d210: 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  *data;          
d220: 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67  /* Equal to pPag
d230: 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 20 20  e->aData */.    
d240: 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
d250: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
d260: 6e 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  n btree structur
d270: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 73 61  e */.    int usa
d280: 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41  bleSize;    /* A
d290: 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c 65 20  mount of usable 
d2a0: 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61  space on each pa
d2b0: 67 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 63 65  ge */.    u16 ce
d2c0: 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20  llOffset;    /* 
d2d0: 4f 66 66 73 65 74 20 66 72 6f 6d 20 73 74 61 72  Offset from star
d2e0: 74 20 6f 66 20 70 61 67 65 20 74 6f 20 66 69 72  t of page to fir
d2f0: 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  st cell pointer 
d300: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 46 72 65 65  */.    int nFree
d310: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
d320: 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79  ber of unused by
d330: 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20  tes on the page 
d340: 2a 2f 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 20  */.    int top; 
d350: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
d360: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 63  st byte of the c
d370: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
d380: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c   */.    int iCel
d390: 6c 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 46 69  lFirst;    /* Fi
d3a0: 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65  rst allowable ce
d3b0: 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20  ll or freeblock 
d3c0: 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 69 6e  offset */.    in
d3d0: 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20  t iCellLast;    
d3e0: 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c   /* Last possibl
d3f0: 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c  e cell or freebl
d400: 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 0a 20  ock offset */.. 
d410: 20 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e     pBt = pPage->
d420: 70 42 74 3b 0a 0a 20 20 20 20 68 64 72 20 3d 20  pBt;..    hdr = 
d430: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
d440: 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50 61  ;.    data = pPa
d450: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 2f  ge->aData;.    /
d460: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
d470: 2d 32 38 35 39 34 2d 30 32 38 39 30 20 54 68 65  -28594-02890 The
d480: 20 6f 6e 65 2d 62 79 74 65 20 66 6c 61 67 20 61   one-byte flag a
d490: 74 20 6f 66 66 73 65 74 20 30 20 69 6e 64 69 63  t offset 0 indic
d4a0: 61 74 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65  ating.    ** the
d4b0: 20 62 2d 74 72 65 65 20 70 61 67 65 20 74 79 70   b-tree page typ
d4c0: 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 65  e. */.    if( de
d4d0: 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c  codeFlags(pPage,
d4e0: 20 64 61 74 61 5b 68 64 72 5d 29 20 29 20 72 65   data[hdr]) ) re
d4f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
d500: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73  UPT_BKPT;.    as
d510: 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53  sert( pBt->pageS
d520: 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d  ize>=512 && pBt-
d530: 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36  >pageSize<=65536
d540: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d   );.    pPage->m
d550: 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28  askPage = (u16)(
d560: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
d570: 31 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e  1);.    pPage->n
d580: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
d590: 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
d5a0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
d5b0: 20 20 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f      pPage->cellO
d5c0: 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73  ffset = cellOffs
d5d0: 65 74 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 70  et = hdr + 8 + p
d5e0: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
d5f0: 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61  ze;.    pPage->a
d600: 44 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b  DataEnd = &data[
d610: 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 20  usableSize];.   
d620: 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78   pPage->aCellIdx
d630: 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66   = &data[cellOff
d640: 73 65 74 5d 3b 0a 20 20 20 20 2f 2a 20 45 56 49  set];.    /* EVI
d650: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 38 30 31  DENCE-OF: R-5801
d660: 35 2d 34 38 31 37 35 20 54 68 65 20 74 77 6f 2d  5-48175 The two-
d670: 62 79 74 65 20 69 6e 74 65 67 65 72 20 61 74 20  byte integer at 
d680: 6f 66 66 73 65 74 20 35 20 64 65 73 69 67 6e 61  offset 5 designa
d690: 74 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  tes.    ** the s
d6a0: 74 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  tart of the cell
d6b0: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 41   content area. A
d6c0: 20 7a 65 72 6f 20 76 61 6c 75 65 20 66 6f 72 20   zero value for 
d6d0: 74 68 69 73 20 69 6e 74 65 67 65 72 20 69 73 0a  this integer is.
d6e0: 20 20 20 20 2a 2a 20 69 6e 74 65 72 70 72 65 74      ** interpret
d6f0: 65 64 20 61 73 20 36 35 35 33 36 2e 20 2a 2f 0a  ed as 65536. */.
d700: 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
d710: 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b  teNotZero(&data[
d720: 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 2f 2a 20  hdr+5]);.    /* 
d730: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
d740: 37 30 30 32 2d 33 32 37 37 34 20 54 68 65 20 74  7002-32774 The t
d750: 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20  wo-byte integer 
d760: 61 74 20 6f 66 66 73 65 74 20 33 20 67 69 76 65  at offset 3 give
d770: 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d  s the.    ** num
d780: 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20  ber of cells on 
d790: 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  the page. */.   
d7a0: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20   pPage->nCell = 
d7b0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
d7c0: 64 72 2b 33 5d 29 3b 0a 20 20 20 20 69 66 28 20  dr+3]);.    if( 
d7d0: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f  pPage->nCell>MX_
d7e0: 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20 20  CELL(pBt) ){.   
d7f0: 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65     /* To many ce
d800: 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  lls for a single
d810: 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65   page.  The page
d820: 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
d830: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
d840: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
d850: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
d860: 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65 2d  testcase( pPage-
d870: 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28  >nCell==MX_CELL(
d880: 70 42 74 29 20 29 3b 0a 20 20 20 20 2f 2a 20 45  pBt) );.    /* E
d890: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34  VIDENCE-OF: R-24
d8a0: 30 38 39 2d 35 37 39 37 39 20 49 66 20 61 20 70  089-57979 If a p
d8b0: 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  age contains no 
d8c0: 63 65 6c 6c 73 20 28 77 68 69 63 68 20 69 73 20  cells (which is 
d8d0: 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 70 6f 73 73  only.    ** poss
d8e0: 69 62 6c 65 20 66 6f 72 20 61 20 72 6f 6f 74 20  ible for a root 
d8f0: 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20  page of a table 
d900: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  that contains no
d910: 20 72 6f 77 73 29 20 74 68 65 6e 20 74 68 65 0a   rows) then the.
d920: 20 20 20 20 2a 2a 20 6f 66 66 73 65 74 20 74 6f      ** offset to
d930: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
d940: 74 20 61 72 65 61 20 77 69 6c 6c 20 65 71 75 61  t area will equa
d950: 6c 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  l the page size 
d960: 6d 69 6e 75 73 20 74 68 65 0a 20 20 20 20 2a 2a  minus the.    **
d970: 20 62 79 74 65 73 20 6f 66 20 72 65 73 65 72 76   bytes of reserv
d980: 65 64 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20  ed space. */.   
d990: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
d9a0: 6e 43 65 6c 6c 3e 30 20 7c 7c 20 74 6f 70 3d 3d  nCell>0 || top==
d9b0: 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20 43 4f  usableSize || CO
d9c0: 52 52 55 50 54 5f 44 42 20 29 3b 0a 0a 20 20 20  RRUPT_DB );..   
d9d0: 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20   /* A malformed 
d9e0: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 69  database page mi
d9f0: 67 68 74 20 63 61 75 73 65 20 75 73 20 74 6f 20  ght cause us to 
da00: 72 65 61 64 20 70 61 73 74 20 74 68 65 20 65 6e  read past the en
da10: 64 0a 20 20 20 20 2a 2a 20 6f 66 20 70 61 67 65  d.    ** of page
da20: 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 61 20   when parsing a 
da30: 63 65 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a 20  cell.  .    **. 
da40: 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     ** The follow
da50: 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64  ing block of cod
da60: 65 20 63 68 65 63 6b 73 20 65 61 72 6c 79 20 74  e checks early t
da70: 6f 20 73 65 65 20 69 66 20 61 20 63 65 6c 6c 20  o see if a cell 
da80: 65 78 74 65 6e 64 73 0a 20 20 20 20 2a 2a 20 70  extends.    ** p
da90: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61  ast the end of a
daa0: 20 70 61 67 65 20 62 6f 75 6e 64 61 72 79 20 61   page boundary a
dab0: 6e 64 20 63 61 75 73 65 73 20 53 51 4c 49 54 45  nd causes SQLITE
dac0: 5f 43 4f 52 52 55 50 54 20 74 6f 20 62 65 20 0a  _CORRUPT to be .
dad0: 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 65 64 20      ** returned 
dae0: 69 66 20 69 74 20 64 6f 65 73 2e 0a 20 20 20 20  if it does..    
daf0: 2a 2f 0a 20 20 20 20 69 43 65 6c 6c 46 69 72 73  */.    iCellFirs
db00: 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  t = cellOffset +
db10: 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   2*pPage->nCell;
db20: 0a 20 20 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d  .    iCellLast =
db30: 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b   usableSize - 4;
db40: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
db50: 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53  ITE_ENABLE_OVERS
db60: 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a  IZE_CELL_CHECK).
db70: 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20      {.      int 
db80: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
db90: 20 49 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20   Index into the 
dba0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
dbb0: 61 79 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ay */.      int 
dbc0: 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  sz;           /*
dbd0: 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20   Size of a cell 
dbe0: 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 21 70  */..      if( !p
dbf0: 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65  Page->leaf ) iCe
dc00: 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20  llLast--;.      
dc10: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65  for(i=0; i<pPage
dc20: 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  ->nCell; i++){. 
dc30: 20 20 20 20 20 20 20 70 63 20 3d 20 67 65 74 32         pc = get2
dc40: 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 4f  byte(&data[cellO
dc50: 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20  ffset+i*2]);.   
dc60: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
dc70: 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  c==iCellFirst );
dc80: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
dc90: 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74  e( pc==iCellLast
dca0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
dcb0: 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c  pc<iCellFirst ||
dcc0: 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b   pc>iCellLast ){
dcd0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
dce0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
dcf0: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d  _BKPT;.        }
dd00: 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65  .        sz = ce
dd10: 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
dd20: 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20   &data[pc]);.   
dd30: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
dd40: 63 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65  c+sz==usableSize
dd50: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
dd60: 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65  pc+sz>usableSize
dd70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
dd80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
dd90: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
dda0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
ddb0: 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
ddc0: 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b  af ) iCellLast++
ddd0: 3b 0a 20 20 20 20 7d 20 20 0a 23 65 6e 64 69 66  ;.    }  .#endif
dde0: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
ddf0: 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20   the total free 
de00: 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67  space on the pag
de10: 65 0a 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43  e.    ** EVIDENC
de20: 45 2d 4f 46 3a 20 52 2d 32 33 35 38 38 2d 33 34  E-OF: R-23588-34
de30: 34 35 30 20 54 68 65 20 74 77 6f 2d 62 79 74 65  450 The two-byte
de40: 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73   integer at offs
de50: 65 74 20 31 20 67 69 76 65 73 20 74 68 65 0a 20  et 1 gives the. 
de60: 20 20 20 2a 2a 20 73 74 61 72 74 20 6f 66 20 74     ** start of t
de70: 68 65 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f  he first freeblo
de80: 63 6b 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20  ck on the page, 
de90: 6f 72 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68  or is zero if th
dea0: 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 20 20 2a  ere are no.    *
deb0: 2a 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 2a 2f  * freeblocks. */
dec0: 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79  .    pc = get2by
ded0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29  te(&data[hdr+1])
dee0: 3b 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 64 61  ;.    nFree = da
def0: 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70 3b  ta[hdr+7] + top;
df00: 20 20 2f 2a 20 49 6e 69 74 20 6e 46 72 65 65 20    /* Init nFree 
df10: 74 6f 20 6e 6f 6e 2d 66 72 65 65 62 6c 6f 63 6b  to non-freeblock
df20: 20 66 72 65 65 20 73 70 61 63 65 20 2a 2f 0a 20   free space */. 
df30: 20 20 20 77 68 69 6c 65 28 20 70 63 3e 30 20 29     while( pc>0 )
df40: 7b 0a 20 20 20 20 20 20 75 31 36 20 6e 65 78 74  {.      u16 next
df50: 2c 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66  , size;.      if
df60: 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20  ( pc<iCellFirst 
df70: 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20  || pc>iCellLast 
df80: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56  ){.        /* EV
df90: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35  IDENCE-OF: R-555
dfa0: 33 30 2d 35 32 39 33 30 20 49 6e 20 61 20 77 65  30-52930 In a we
dfb0: 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65 65  ll-formed b-tree
dfc0: 20 70 61 67 65 2c 20 74 68 65 72 65 20 77 69 6c   page, there wil
dfd0: 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77  l.        ** alw
dfe0: 61 79 73 20 62 65 20 61 74 20 6c 65 61 73 74 20  ays be at least 
dff0: 6f 6e 65 20 63 65 6c 6c 20 62 65 66 6f 72 65 20  one cell before 
e000: 74 68 65 20 66 69 72 73 74 20 66 72 65 65 62 6c  the first freebl
e010: 6f 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ock..        **.
e020: 20 20 20 20 20 20 20 20 2a 2a 20 4f 72 2c 20 74          ** Or, t
e030: 68 65 20 66 72 65 65 62 6c 6f 63 6b 20 69 73 20  he freeblock is 
e040: 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74  off the end of t
e050: 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
e060: 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  */.        retur
e070: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
e080: 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a  _BKPT; .      }.
e090: 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74        next = get
e0a0: 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 5d 29  2byte(&data[pc])
e0b0: 3b 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67  ;.      size = g
e0c0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  et2byte(&data[pc
e0d0: 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  +2]);.      if( 
e0e0: 28 6e 65 78 74 3e 30 20 26 26 20 6e 65 78 74 3c  (next>0 && next<
e0f0: 3d 70 63 2b 73 69 7a 65 2b 33 29 20 7c 7c 20 70  =pc+size+3) || p
e100: 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a  c+size>usableSiz
e110: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
e120: 46 72 65 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74  Free blocks must
e130: 20 62 65 20 69 6e 20 61 73 63 65 6e 64 69 6e 67   be in ascending
e140: 20 6f 72 64 65 72 2e 20 41 6e 64 20 74 68 65 20   order. And the 
e150: 6c 61 73 74 20 62 79 74 65 20 6f 66 0a 20 20 20  last byte of.   
e160: 20 20 20 20 20 2a 2a 20 74 68 65 20 66 72 65 65       ** the free
e170: 2d 62 6c 6f 63 6b 20 6d 75 73 74 20 6c 69 65 20  -block must lie 
e180: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
e190: 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  page.  */.      
e1a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e1b0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20  CORRUPT_BKPT; . 
e1c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 72       }.      nFr
e1d0: 65 65 20 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a  ee = nFree + siz
e1e0: 65 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 6e 65  e;.      pc = ne
e1f0: 78 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  xt;.    }..    /
e200: 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
e210: 20 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e 73 20   nFree contains 
e220: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6f  the sum of the o
e230: 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61  ffset to the sta
e240: 72 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  rt.    ** of the
e250: 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72   cell-content ar
e260: 65 61 20 70 6c 75 73 20 74 68 65 20 6e 75 6d 62  ea plus the numb
e270: 65 72 20 6f 66 20 66 72 65 65 20 62 79 74 65 73  er of free bytes
e280: 20 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a 20 74   within.    ** t
e290: 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20  he cell-content 
e2a0: 61 72 65 61 2e 20 49 66 20 74 68 69 73 20 69 73  area. If this is
e2b0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
e2c0: 65 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20  e usable-size.  
e2d0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65    ** of the page
e2e0: 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  , then the page 
e2f0: 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 65  must be corrupte
e300: 64 2e 20 54 68 69 73 20 63 68 65 63 6b 20 61 6c  d. This check al
e310: 73 6f 0a 20 20 20 20 2a 2a 20 73 65 72 76 65 73  so.    ** serves
e320: 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
e330: 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68  the offset to th
e340: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63  e start of the c
e350: 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 20 20  ell-content.    
e360: 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64 69  ** area, accordi
e370: 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  ng to the page h
e380: 65 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74 68  eader, lies with
e390: 69 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20  in the page..   
e3a0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 46 72 65   */.    if( nFre
e3b0: 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  e>usableSize ){.
e3c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
e3d0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
e3e0: 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  ; .    }.    pPa
e3f0: 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36  ge->nFree = (u16
e400: 29 28 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c 46  )(nFree - iCellF
e410: 69 72 73 74 29 3b 0a 20 20 20 20 70 50 61 67 65  irst);.    pPage
e420: 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20  ->isInit = 1;.  
e430: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
e440: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
e450: 65 74 20 75 70 20 61 20 72 61 77 20 70 61 67 65  et up a raw page
e460: 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b   so that it look
e470: 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73  s like a databas
e480: 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a  e page holding.*
e490: 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f  * no entries..*/
e4a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72  .static void zer
e4b0: 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  oPage(MemPage *p
e4c0: 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29  Page, int flags)
e4d0: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
e4e0: 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d  r *data = pPage-
e4f0: 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72  >aData;.  BtShar
e500: 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
e510: 3e 70 42 74 3b 0a 20 20 75 38 20 68 64 72 20 3d  >pBt;.  u8 hdr =
e520: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
e530: 74 3b 0a 20 20 75 31 36 20 66 69 72 73 74 3b 0a  t;.  u16 first;.
e540: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
e550: 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65  e3PagerPagenumbe
e560: 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  r(pPage->pDbPage
e570: 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29  )==pPage->pgno )
e580: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
e590: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
e5a0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
e5b0: 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65   == (void*)pPage
e5c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
e5d0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
e5e0: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
e5f0: 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20 61  ) == data );.  a
e600: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
e610: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
e620: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
e630: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
e640: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
e650: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
e660: 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  if( pBt->btsFlag
e670: 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44  s & BTS_SECURE_D
e680: 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d  ELETE ){.    mem
e690: 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20  set(&data[hdr], 
e6a0: 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  0, pBt->usableSi
e6b0: 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d 0a 20  ze - hdr);.  }. 
e6c0: 20 64 61 74 61 5b 68 64 72 5d 20 3d 20 28 63 68   data[hdr] = (ch
e6d0: 61 72 29 66 6c 61 67 73 3b 0a 20 20 66 69 72 73  ar)flags;.  firs
e6e0: 74 20 3d 20 68 64 72 20 2b 20 28 28 66 6c 61 67  t = hdr + ((flag
e6f0: 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 3f  s&PTF_LEAF)==0 ?
e700: 20 31 32 20 3a 20 38 29 3b 0a 20 20 6d 65 6d 73   12 : 8);.  mems
e710: 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c  et(&data[hdr+1],
e720: 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68   0, 4);.  data[h
e730: 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74  dr+7] = 0;.  put
e740: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
e750: 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  5], pBt->usableS
e760: 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ize);.  pPage->n
e770: 46 72 65 65 20 3d 20 28 75 31 36 29 28 70 42 74  Free = (u16)(pBt
e780: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66  ->usableSize - f
e790: 69 72 73 74 29 3b 0a 20 20 64 65 63 6f 64 65 46  irst);.  decodeF
e7a0: 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67  lags(pPage, flag
e7b0: 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c  s);.  pPage->cel
e7c0: 6c 4f 66 66 73 65 74 20 3d 20 66 69 72 73 74 3b  lOffset = first;
e7d0: 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45  .  pPage->aDataE
e7e0: 6e 64 20 3d 20 26 64 61 74 61 5b 70 42 74 2d 3e  nd = &data[pBt->
e7f0: 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 70  usableSize];.  p
e800: 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d  Page->aCellIdx =
e810: 20 26 64 61 74 61 5b 66 69 72 73 74 5d 3b 0a 20   &data[first];. 
e820: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
e830: 77 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  w = 0;.  assert(
e840: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d   pBt->pageSize>=
e850: 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65  512 && pBt->page
e860: 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20  Size<=65536 );. 
e870: 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65   pPage->maskPage
e880: 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61   = (u16)(pBt->pa
e890: 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70  geSize - 1);.  p
e8a0: 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b  Page->nCell = 0;
e8b0: 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  .  pPage->isInit
e8c0: 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   = 1;.}.../*.** 
e8d0: 43 6f 6e 76 65 72 74 20 61 20 44 62 50 61 67 65  Convert a DbPage
e8e0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 74   obtained from t
e8f0: 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 61 20  he pager into a 
e900: 4d 65 6d 50 61 67 65 20 75 73 65 64 20 62 79 0a  MemPage used by.
e910: 2a 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61 79  ** the btree lay
e920: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65  er..*/.static Me
e930: 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65  mPage *btreePage
e940: 46 72 6f 6d 44 62 50 61 67 65 28 44 62 50 61 67  FromDbPage(DbPag
e950: 65 20 2a 70 44 62 50 61 67 65 2c 20 50 67 6e 6f  e *pDbPage, Pgno
e960: 20 70 67 6e 6f 2c 20 42 74 53 68 61 72 65 64 20   pgno, BtShared 
e970: 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65  *pBt){.  MemPage
e980: 20 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61   *pPage = (MemPa
e990: 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  ge*)sqlite3Pager
e9a0: 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65  GetExtra(pDbPage
e9b0: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74  );.  pPage->aDat
e9c0: 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  a = sqlite3Pager
e9d0: 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
e9e0: 3b 0a 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61  ;.  pPage->pDbPa
e9f0: 67 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20  ge = pDbPage;.  
ea00: 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74  pPage->pBt = pBt
ea10: 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20  ;.  pPage->pgno 
ea20: 3d 20 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d  = pgno;.  pPage-
ea30: 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61  >hdrOffset = pPa
ea40: 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30  ge->pgno==1 ? 10
ea50: 30 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  0 : 0;.  return 
ea60: 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  pPage; .}../*.**
ea70: 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d   Get a page from
ea80: 20 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69   the pager.  Ini
ea90: 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50  tialize the MemP
eaa0: 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d  age.pBt and.** M
eab0: 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65  emPage.aData ele
eac0: 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e  ments if needed.
ead0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f  .**.** If the no
eae0: 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20 69 73 20  Content flag is 
eaf0: 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  set, it means th
eb00: 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  at we do not car
eb10: 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63  e about.** the c
eb20: 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
eb30: 67 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e  ge at this time.
eb40: 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74    So do not go t
eb50: 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f  o the disk.** to
eb60: 20 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65   fetch the conte
eb70: 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69  nt.  Just fill i
eb80: 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69  n the content wi
eb90: 74 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77  th zeros for now
eba0: 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66  ..** If in the f
ebb0: 75 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71  uture we call sq
ebc0: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
ebd0: 29 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20  ) on this page, 
ebe0: 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65  that.** means we
ebf0: 20 68 61 76 65 20 73 74 61 72 74 65 64 20 74 6f   have started to
ec00: 20 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62   be concerned ab
ec10: 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20  out content and 
ec20: 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64  the disk.** read
ec30: 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74   should occur at
ec40: 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a   that point..*/.
ec50: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
ec60: 47 65 74 50 61 67 65 28 0a 20 20 42 74 53 68 61  GetPage(.  BtSha
ec70: 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
ec80: 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
ec90: 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
eca0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
ecb0: 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20   of the page to 
ecc0: 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61  fetch */.  MemPa
ecd0: 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
ece0: 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  /* Return the pa
ecf0: 67 65 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d  ge in this param
ed00: 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  eter */.  int fl
ed10: 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
ed20: 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f  * PAGER_GET_NOCO
ed30: 4e 54 45 4e 54 20 6f 72 20 50 41 47 45 52 5f 47  NTENT or PAGER_G
ed40: 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29  ET_READONLY */.)
ed50: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62  {.  int rc;.  Db
ed60: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a  Page *pDbPage;..
ed70: 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
ed80: 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47  =0 || flags==PAG
ed90: 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
eda0: 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45 52   || flags==PAGER
edb0: 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 29 3b  _GET_READONLY );
edc0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
edd0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
ede0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
edf0: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
ee00: 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61  Acquire(pBt->pPa
ee10: 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61  ger, pgno, (DbPa
ee20: 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 66  ge**)&pDbPage, f
ee30: 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63 20  lags);.  if( rc 
ee40: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a  ) return rc;.  *
ee50: 70 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61  ppPage = btreePa
ee60: 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62  geFromDbPage(pDb
ee70: 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29  Page, pgno, pBt)
ee80: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
ee90: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
eea0: 65 74 72 69 65 76 65 20 61 20 70 61 67 65 20 66  etrieve a page f
eeb0: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63 61  rom the pager ca
eec0: 63 68 65 2e 20 49 66 20 74 68 65 20 72 65 71 75  che. If the requ
eed0: 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f  ested page is no
eee0: 74 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20  t.** already in 
eef0: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
ef00: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69  return NULL. Ini
ef10: 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50  tialize the MemP
ef20: 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d  age.pBt and.** M
ef30: 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65  emPage.aData ele
ef40: 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e  ments if needed.
ef50: 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61  .*/.static MemPa
ef60: 67 65 20 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f  ge *btreePageLoo
ef70: 6b 75 70 28 42 74 53 68 61 72 65 64 20 2a 70 42  kup(BtShared *pB
ef80: 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  t, Pgno pgno){. 
ef90: 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
efa0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
efb0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
efc0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
efd0: 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65  pDbPage = sqlite
efe0: 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74  3PagerLookup(pBt
eff0: 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  ->pPager, pgno);
f000: 0a 20 20 69 66 28 20 70 44 62 50 61 67 65 20 29  .  if( pDbPage )
f010: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72  {.    return btr
f020: 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
f030: 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20  (pDbPage, pgno, 
f040: 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pBt);.  }.  retu
f050: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
f060: 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f  eturn the size o
f070: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
f080: 69 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 49 66  ile in pages. If
f090: 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69   there is any ki
f0a0: 6e 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20  nd of.** error, 
f0b0: 72 65 74 75 72 6e 20 28 28 75 6e 73 69 67 6e 65  return ((unsigne
f0c0: 64 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74  d int)-1)..*/.st
f0d0: 61 74 69 63 20 50 67 6e 6f 20 62 74 72 65 65 50  atic Pgno btreeP
f0e0: 61 67 65 63 6f 75 6e 74 28 42 74 53 68 61 72 65  agecount(BtShare
f0f0: 64 20 2a 70 42 74 29 7b 0a 20 20 72 65 74 75 72  d *pBt){.  retur
f100: 6e 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a  n pBt->nPage;.}.
f110: 75 33 32 20 73 71 6c 69 74 65 33 42 74 72 65 65  u32 sqlite3Btree
f120: 4c 61 73 74 50 61 67 65 28 42 74 72 65 65 20 2a  LastPage(Btree *
f130: 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  p){.  assert( sq
f140: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
f150: 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
f160: 65 72 74 28 20 28 28 70 2d 3e 70 42 74 2d 3e 6e  ert( ((p->pBt->n
f170: 50 61 67 65 29 26 30 78 38 30 30 30 30 30 30 29  Page)&0x8000000)
f180: 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
f190: 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
f1a0: 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ->pBt);.}../*.**
f1b0: 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d   Get a page from
f1c0: 20 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 69   the pager and i
f1d0: 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 20 20 54  nitialize it.  T
f1e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a  his routine is j
f1f0: 75 73 74 20 61 0a 2a 2a 20 63 6f 6e 76 65 6e 69  ust a.** conveni
f200: 65 6e 63 65 20 77 72 61 70 70 65 72 20 61 72 6f  ence wrapper aro
f210: 75 6e 64 20 73 65 70 61 72 61 74 65 20 63 61 6c  und separate cal
f220: 6c 73 20 74 6f 20 62 74 72 65 65 47 65 74 50 61  ls to btreeGetPa
f230: 67 65 28 29 20 61 6e 64 20 0a 2a 2a 20 62 74 72  ge() and .** btr
f240: 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a  eeInitPage()..**
f250: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
f260: 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65  occurs, then the
f270: 20 76 61 6c 75 65 20 2a 70 70 50 61 67 65 20 69   value *ppPage i
f280: 73 20 73 65 74 20 74 6f 20 69 73 20 75 6e 64 65  s set to is unde
f290: 66 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79  fined. It.** may
f2a0: 20 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65   remain unchange
f2b0: 64 2c 20 6f 72 20 69 74 20 6d 61 79 20 62 65 20  d, or it may be 
f2c0: 73 65 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69  set to an invali
f2d0: 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74  d value..*/.stat
f2e0: 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69  ic int getAndIni
f2f0: 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  tPage(.  BtShare
f300: 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
f310: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
f320: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
f330: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
f340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f350: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
f360: 74 68 65 20 70 61 67 65 20 74 6f 20 67 65 74 20  the page to get 
f370: 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  */.  MemPage **p
f380: 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
f390: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
f3a0: 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68  e page pointer h
f3b0: 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65  ere */.  int bRe
f3c0: 61 64 6f 6e 6c 79 20 20 20 20 20 20 20 20 20 20  adonly          
f3d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45           /* PAGE
f3e0: 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 6f  R_GET_READONLY o
f3f0: 72 20 30 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  r 0 */.){.  int 
f400: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  rc;.  assert( sq
f410: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
f420: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
f430: 20 20 61 73 73 65 72 74 28 20 62 52 65 61 64 6f    assert( bReado
f440: 6e 6c 79 3d 3d 50 41 47 45 52 5f 47 45 54 5f 52  nly==PAGER_GET_R
f450: 45 41 44 4f 4e 4c 59 20 7c 7c 20 62 52 65 61 64  EADONLY || bRead
f460: 6f 6e 6c 79 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  only==0 );..  if
f470: 28 20 70 67 6e 6f 3e 62 74 72 65 65 50 61 67 65  ( pgno>btreePage
f480: 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20  count(pBt) ){.  
f490: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
f4a0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 65  RRUPT_BKPT;.  }e
f4b0: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 62 74  lse{.    rc = bt
f4c0: 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
f4d0: 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62 52  pgno, ppPage, bR
f4e0: 65 61 64 6f 6e 6c 79 29 3b 0a 20 20 20 20 69 66  eadonly);.    if
f4f0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
f500: 26 26 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73  && (*ppPage)->is
f510: 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Init==0 ){.     
f520: 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50   rc = btreeInitP
f530: 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
f540: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
f550: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
f560: 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
f570: 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
f580: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 74 65 73 74     }.  }..  test
f590: 63 61 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b  case( pgno==0 );
f5a0: 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21  .  assert( pgno!
f5b0: 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
f5c0: 5f 43 4f 52 52 55 50 54 20 29 3b 0a 20 20 72 65  _CORRUPT );.  re
f5d0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
f5e0: 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50  * Release a MemP
f5f0: 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c  age.  This shoul
f600: 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65  d be called once
f610: 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a   for each prior.
f620: 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65  ** call to btree
f630: 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  GetPage..*/.stat
f640: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50  ic void releaseP
f650: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
f660: 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  ge){.  if( pPage
f670: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
f680: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a  pPage->aData );.
f690: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
f6a0: 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20 61 73  e->pBt );.    as
f6b0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 44 62  sert( pPage->pDb
f6c0: 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 20 20 61  Page!=0 );.    a
f6d0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
f6e0: 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
f6f0: 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28  e->pDbPage) == (
f700: 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20  void*)pPage );. 
f710: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
f720: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
f730: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d  Page->pDbPage)==
f740: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a  pPage->aData );.
f750: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
f760: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
f770: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
f780: 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
f790: 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c  PagerUnrefNotNul
f7a0: 6c 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  l(pPage->pDbPage
f7b0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
f7c0: 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  During a rollbac
f7d0: 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  k, when the page
f7e0: 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d  r reloads inform
f7f0: 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63  ation into the c
f800: 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20  ache.** so that 
f810: 74 68 65 20 63 61 63 68 65 20 69 73 20 72 65 73  the cache is res
f820: 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
f830: 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74  ginal state at t
f840: 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74  he start of.** t
f850: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
f860: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 72 65  for each page re
f870: 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74  stored this rout
f880: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
f890: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
f8a0: 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74  e needs to reset
f8b0: 20 74 68 65 20 65 78 74 72 61 20 64 61 74 61 20   the extra data 
f8c0: 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65  section at the e
f8d0: 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67  nd of the.** pag
f8e0: 65 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20  e to agree with 
f8f0: 74 68 65 20 72 65 73 74 6f 72 65 64 20 64 61 74  the restored dat
f900: 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  a..*/.static voi
f910: 64 20 70 61 67 65 52 65 69 6e 69 74 28 44 62 50  d pageReinit(DbP
f920: 61 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d  age *pData){.  M
f930: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
f940: 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67   pPage = (MemPag
f950: 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  e *)sqlite3Pager
f960: 47 65 74 45 78 74 72 61 28 70 44 61 74 61 29 3b  GetExtra(pData);
f970: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
f980: 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
f990: 75 6e 74 28 70 44 61 74 61 29 3e 30 20 29 3b 0a  unt(pData)>0 );.
f9a0: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49    if( pPage->isI
f9b0: 6e 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nit ){.    asser
f9c0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
f9d0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
f9e0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20  ->mutex) );.    
f9f0: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
fa00: 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  0;.    if( sqlit
fa10: 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
fa20: 75 6e 74 28 70 44 61 74 61 29 3e 31 20 29 7b 0a  unt(pData)>1 ){.
fa30: 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 6d        /* pPage m
fa40: 69 67 68 74 20 6e 6f 74 20 62 65 20 61 20 62 74  ight not be a bt
fa50: 72 65 65 20 70 61 67 65 3b 20 20 69 74 20 6d 69  ree page;  it mi
fa60: 67 68 74 20 62 65 20 61 6e 20 6f 76 65 72 66 6c  ght be an overfl
fa70: 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  ow page.      **
fa80: 20 6f 72 20 70 74 72 6d 61 70 20 70 61 67 65 20   or ptrmap page 
fa90: 6f 72 20 61 20 66 72 65 65 20 70 61 67 65 2e 20  or a free page. 
faa0: 20 49 6e 20 74 68 6f 73 65 20 63 61 73 65 73 2c   In those cases,
fab0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
fac0: 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20       ** call to 
fad0: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
fae0: 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75  will likely retu
faf0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
fb00: 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20  T..      ** But 
fb10: 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e 65 20  no harm is done 
fb20: 62 79 20 74 68 69 73 2e 20 20 41 6e 64 20 69 74  by this.  And it
fb30: 20 69 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61   is very importa
fb40: 6e 74 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  nt that.      **
fb50: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
fb60: 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76   be called on ev
fb70: 65 72 79 20 62 74 72 65 65 20 70 61 67 65 20 73  ery btree page s
fb80: 6f 20 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20  o we make.      
fb90: 2a 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20  ** the call for 
fba0: 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74 20  every page that 
fbb0: 63 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d  comes in for re-
fbc0: 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  initing. */.    
fbd0: 20 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28    btreeInitPage(
fbe0: 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
fbf0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  }.}../*.** Invok
fc00: 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
fc10: 65 72 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a  er for a btree..
fc20: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
fc30: 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
fc40: 64 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67 29  dler(void *pArg)
fc50: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
fc60: 74 20 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70  t = (BtShared*)p
fc70: 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Arg;.  assert( p
fc80: 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65  Bt->db );.  asse
fc90: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
fca0: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e  x_held(pBt->db->
fcb0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75  mutex) );.  retu
fcc0: 72 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65  rn sqlite3Invoke
fcd0: 42 75 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74  BusyHandler(&pBt
fce0: 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65  ->db->busyHandle
fcf0: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  r);.}../*.** Ope
fd00: 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  n a database fil
fd10: 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e  e..** .** zFilen
fd20: 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ame is the name 
fd30: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
fd40: 66 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e  file.  If zFilen
fd50: 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74  ame is NULL.** t
fd60: 68 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  hen an ephemeral
fd70: 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65   database is cre
fd80: 61 74 65 64 2e 20 20 54 68 65 20 65 70 68 65 6d  ated.  The ephem
fd90: 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 6d 69  eral database mi
fda0: 67 68 74 0a 2a 2a 20 62 65 20 65 78 63 6c 75 73  ght.** be exclus
fdb0: 69 76 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c  ively in memory,
fdc0: 20 6f 72 20 69 74 20 6d 69 67 68 74 20 75 73 65   or it might use
fdd0: 20 61 20 64 69 73 6b 2d 62 61 73 65 64 20 6d 65   a disk-based me
fde0: 6d 6f 72 79 20 63 61 63 68 65 2e 0a 2a 2a 20 45  mory cache..** E
fdf0: 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 65  ither way, the e
fe00: 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73  phemeral databas
fe10: 65 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61  e will be automa
fe20: 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20  tically deleted 
fe30: 0a 2a 2a 20 77 68 65 6e 20 73 71 6c 69 74 65 33  .** when sqlite3
fe40: 42 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20  BtreeClose() is 
fe50: 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  called..**.** If
fe60: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a   zFilename is ":
fe70: 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e  memory:" then an
fe80: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
fe90: 61 73 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ase is created.*
fea0: 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61  * that is automa
feb0: 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65  tically destroye
fec0: 64 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f  d when it is clo
fed0: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22  sed..**.** The "
fee0: 66 6c 61 67 73 22 20 70 61 72 61 6d 65 74 65 72  flags" parameter
fef0: 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 68   is a bitmask th
ff00: 61 74 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  at might contain
ff10: 20 62 69 74 73 20 6c 69 6b 65 0a 2a 2a 20 42 54   bits like.** BT
ff20: 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c  REE_OMIT_JOURNAL
ff30: 20 61 6e 64 2f 6f 72 20 42 54 52 45 45 5f 4d 45   and/or BTREE_ME
ff40: 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  MORY..**.** If t
ff50: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61  he database is a
ff60: 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69 6e  lready opened in
ff70: 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
ff80: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a  se connection.**
ff90: 20 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20 73   and we are in s
ffa0: 68 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64 65  hared cache mode
ffb0: 2c 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e 20  , then the open 
ffc0: 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 61  will fail with a
ffd0: 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53  n.** SQLITE_CONS
ffe0: 54 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20 57  TRAINT error.  W
fff0: 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74  e cannot allow t
10000 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68 61  wo or more BtSha
10010 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69  red.** objects i
10020 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
10030 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  ase connection s
10040 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77 69  ince doing so wi
10050 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72  ll lead.** to pr
10060 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b  oblems with lock
10070 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ing..*/.int sqli
10080 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20  te3BtreeOpen(.  
10090 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
100a0 73 2c 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74  s,      /* VFS t
100b0 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 62  o use for this b
100c0 2d 74 72 65 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  -tree */.  const
100d0 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
100e0 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ,  /* Name of th
100f0 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e  e file containin
10100 67 20 74 68 65 20 42 54 72 65 65 20 64 61 74 61  g the BTree data
10110 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  base */.  sqlite
10120 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
10130 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20    /* Associated 
10140 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
10150 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42  */.  Btree **ppB
10160 74 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  tree,        /* 
10170 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42  Pointer to new B
10180 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74  tree object writ
10190 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  ten here */.  in
101a0 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
101b0 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73        /* Options
101c0 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61   */.  int vfsFla
101d0 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
101e0 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68   Flags passed th
101f0 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33  rough to sqlite3
10200 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a  _vfs.xOpen() */.
10210 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
10220 42 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Bt = 0;         
10230 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61      /* Shared pa
10240 72 74 20 6f 66 20 62 74 72 65 65 20 73 74 72 75  rt of btree stru
10250 63 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65  cture */.  Btree
10260 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
10270 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
10280 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  dle to return */
10290 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
102a0 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b   *mutexOpen = 0;
102b0 20 20 2f 2a 20 50 72 65 76 65 6e 74 73 20 61 20    /* Prevents a 
102c0 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20  race condition. 
102d0 54 69 63 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a  Ticket #3537 */.
102e0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
102f0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
10300 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
10310 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69  from this functi
10320 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65  on */.  u8 nRese
10330 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rve;            
10340 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f         /* Byte o
10350 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 6f  f unused space o
10360 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20  n each page */. 
10370 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a   unsigned char z
10380 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 20 20  DbHeader[100];  
10390 2f 2a 20 44 61 74 61 62 61 73 65 20 68 65 61 64  /* Database head
103a0 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20  er content */.. 
103b0 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 70 65 6e   /* True if open
103c0 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ing an ephemeral
103d0 2c 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  , temporary data
103e0 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  base */.  const 
103f0 69 6e 74 20 69 73 54 65 6d 70 44 62 20 3d 20 7a  int isTempDb = z
10400 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a  Filename==0 || z
10410 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a  Filename[0]==0;.
10420 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61  .  /* Set the va
10430 72 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74  riable isMemdb t
10440 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e  o true for an in
10450 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
10460 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65  , or .  ** false
10470 20 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65   for a file-base
10480 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  d database..  */
10490 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
104a0 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 63  MIT_MEMORYDB.  c
104b0 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62  onst int isMemdb
104c0 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 63 6f   = 0;.#else.  co
104d0 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20  nst int isMemdb 
104e0 3d 20 28 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  = (zFilename && 
104f0 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65  strcmp(zFilename
10500 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30  , ":memory:")==0
10510 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
10520 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 73 54           || (isT
10530 65 6d 70 44 62 20 26 26 20 73 71 6c 69 74 65 33  empDb && sqlite3
10540 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64 62 29  TempInMemory(db)
10550 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
10560 20 20 20 20 20 20 20 20 20 7c 7c 20 28 76 66 73           || (vfs
10570 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  Flags & SQLITE_O
10580 50 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a  PEN_MEMORY)!=0;.
10590 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
105a0 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( db!=0 );.  ass
105b0 65 72 74 28 20 70 56 66 73 21 3d 30 20 29 3b 0a  ert( pVfs!=0 );.
105c0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
105d0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
105e0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
105f0 65 72 74 28 20 28 66 6c 61 67 73 26 30 78 66 66  ert( (flags&0xff
10600 29 3d 3d 66 6c 61 67 73 20 29 3b 20 20 20 2f 2a  )==flags );   /*
10610 20 66 6c 61 67 73 20 66 69 74 20 69 6e 20 38 20   flags fit in 8 
10620 62 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e  bits */..  /* On
10630 6c 79 20 61 20 42 54 52 45 45 5f 53 49 4e 47 4c  ly a BTREE_SINGL
10640 45 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62  E database can b
10650 65 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45  e BTREE_UNORDERE
10660 44 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  D */.  assert( (
10670 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 55 4e  flags & BTREE_UN
10680 4f 52 44 45 52 45 44 29 3d 3d 30 20 7c 7c 20 28  ORDERED)==0 || (
10690 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49  flags & BTREE_SI
106a0 4e 47 4c 45 29 21 3d 30 20 29 3b 0a 0a 20 20 2f  NGLE)!=0 );..  /
106b0 2a 20 41 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  * A BTREE_SINGLE
106c0 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 77   database is alw
106d0 61 79 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ays a temporary 
106e0 61 6e 64 2f 6f 72 20 65 70 68 65 6d 65 72 61 6c  and/or ephemeral
106f0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66   */.  assert( (f
10700 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e  lags & BTREE_SIN
10710 47 4c 45 29 3d 3d 30 20 7c 7c 20 69 73 54 65 6d  GLE)==0 || isTem
10720 70 44 62 20 29 3b 0a 0a 20 20 69 66 28 20 69 73  pDb );..  if( is
10730 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 66 6c 61  Memdb ){.    fla
10740 67 73 20 7c 3d 20 42 54 52 45 45 5f 4d 45 4d 4f  gs |= BTREE_MEMO
10750 52 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 76  RY;.  }.  if( (v
10760 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  fsFlags & SQLITE
10770 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d  _OPEN_MAIN_DB)!=
10780 30 20 26 26 20 28 69 73 4d 65 6d 64 62 20 7c 7c  0 && (isMemdb ||
10790 20 69 73 54 65 6d 70 44 62 29 20 29 7b 0a 20 20   isTempDb) ){.  
107a0 20 20 76 66 73 46 6c 61 67 73 20 3d 20 28 76 66    vfsFlags = (vf
107b0 73 46 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45  sFlags & ~SQLITE
107c0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c  _OPEN_MAIN_DB) |
107d0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d   SQLITE_OPEN_TEM
107e0 50 5f 44 42 3b 0a 20 20 7d 0a 20 20 70 20 3d 20  P_DB;.  }.  p = 
107f0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
10800 6f 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29  o(sizeof(Btree))
10810 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  ;.  if( !p ){.  
10820 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10830 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e  NOMEM;.  }.  p->
10840 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
10850 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  NONE;.  p->db = 
10860 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  db;.#ifndef SQLI
10870 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
10880 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70  ACHE.  p->lock.p
10890 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e  Btree = p;.  p->
108a0 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b  lock.iTable = 1;
108b0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
108c0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
108d0 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
108e0 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
108f0 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
10900 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69    /*.  ** If thi
10910 73 20 42 74 72 65 65 20 69 73 20 61 20 63 61 6e  s Btree is a can
10920 64 69 64 61 74 65 20 66 6f 72 20 73 68 61 72 65  didate for share
10930 64 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20  d cache, try to 
10940 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69  find an.  ** exi
10950 73 74 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f  sting BtShared o
10960 62 6a 65 63 74 20 74 68 61 74 20 77 65 20 63 61  bject that we ca
10970 6e 20 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a  n share with.  *
10980 2f 0a 20 20 69 66 28 20 69 73 54 65 6d 70 44 62  /.  if( isTempDb
10990 3d 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62 3d  ==0 && (isMemdb=
109a0 3d 30 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 26  =0 || (vfsFlags&
109b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29  SQLITE_OPEN_URI)
109c0 21 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28 20  !=0) ){.    if( 
109d0 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54  vfsFlags & SQLIT
109e0 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43  E_OPEN_SHAREDCAC
109f0 48 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  HE ){.      int 
10a00 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  nFullPathname = 
10a10 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
10a20 2b 31 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  +1;.      char *
10a30 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  zFullPathname = 
10a40 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 46  sqlite3Malloc(nF
10a50 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
10a60 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28      MUTEX_LOGIC(
10a70 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
10a80 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a 20  mutexShared; ). 
10a90 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65       p->sharable
10aa0 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   = 1;.      if( 
10ab0 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29  !zFullPathname )
10ac0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
10ad0 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
10ae0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10af0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
10b00 20 20 20 20 20 20 69 66 28 20 69 73 4d 65 6d 64        if( isMemd
10b10 62 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  b ){.        mem
10b20 63 70 79 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  cpy(zFullPathnam
10b30 65 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 73 71  e, zFilename, sq
10b40 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
10b50 69 6c 65 6e 61 6d 65 29 2b 31 29 3b 0a 20 20 20  ilename)+1);.   
10b60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10b70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
10b80 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66  FullPathname(pVf
10b90 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20  s, zFilename,.  
10ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10bc0 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20   nFullPathname, 
10bd0 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
10be0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
10bf0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
10c00 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61  te3_free(zFullPa
10c10 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  thname);.       
10c20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
10c30 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  p);.          re
10c40 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
10c50 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 53   }.      }.#if S
10c60 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
10c70 0a 20 20 20 20 20 20 6d 75 74 65 78 4f 70 65 6e  .      mutexOpen
10c80 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
10c90 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
10ca0 58 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a  X_STATIC_OPEN);.
10cb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
10cc0 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f  tex_enter(mutexO
10cd0 70 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74 65  pen);.      mute
10ce0 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65  xShared = sqlite
10cf0 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
10d00 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
10d10 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73  MASTER);.      s
10d20 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
10d30 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  er(mutexShared);
10d40 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66 6f  .#endif.      fo
10d50 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53  r(pBt=GLOBAL(BtS
10d60 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
10d70 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 20  aredCacheList); 
10d80 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e  pBt; pBt=pBt->pN
10d90 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ext){.        as
10da0 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e  sert( pBt->nRef>
10db0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
10dc0 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c   0==strcmp(zFull
10dd0 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65  Pathname, sqlite
10de0 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70  3PagerFilename(p
10df0 42 74 2d 3e 70 50 61 67 65 72 2c 20 30 29 29 0a  Bt->pPager, 0)).
10e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e10 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72   && sqlite3Pager
10e20 56 66 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29  Vfs(pBt->pPager)
10e30 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20  ==pVfs ){.      
10e40 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20      int iDb;.   
10e50 20 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 64         for(iDb=d
10e60 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d 30  b->nDb-1; iDb>=0
10e70 3b 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20  ; iDb--){.      
10e80 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 45 78        Btree *pEx
10e90 69 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44 62  isting = db->aDb
10ea0 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20  [iDb].pBt;.     
10eb0 20 20 20 20 20 20 20 69 66 28 20 70 45 78 69 73         if( pExis
10ec0 74 69 6e 67 20 26 26 20 70 45 78 69 73 74 69 6e  ting && pExistin
10ed0 67 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a 20  g->pBt==pBt ){. 
10ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
10ef0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
10f00 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
10f10 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
10f20 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
10f30 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20  (mutexOpen);.   
10f40 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
10f50 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74  e3_free(zFullPat
10f60 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  hname);.        
10f70 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
10f80 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  ee(p);.         
10f90 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
10fa0 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20  TE_CONSTRAINT;. 
10fb0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
10fc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10fd0 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b     p->pBt = pBt;
10fe0 0a 20 20 20 20 20 20 20 20 20 20 70 42 74 2d 3e  .          pBt->
10ff0 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nRef++;.        
11000 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
11010 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
11020 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
11030 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64  eave(mutexShared
11040 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11050 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  _free(zFullPathn
11060 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64  ame);.    }.#ifd
11070 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
11080 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20      else{.      
11090 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64 65  /* In debug mode
110a0 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65  , we mark all pe
110b0 72 73 69 73 74 65 6e 74 20 64 61 74 61 62 61 73  rsistent databas
110c0 65 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a 20  es as sharable. 
110d0 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65       ** even whe
110e0 6e 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 20  n they are not. 
110f0 20 54 68 69 73 20 65 78 65 72 63 69 73 65 73 20   This exercises 
11100 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65  the locking code
11110 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67 69   and.      ** gi
11120 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75  ves more opportu
11130 6e 69 74 79 20 66 6f 72 20 61 73 73 65 72 74 73  nity for asserts
11140 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68  (sqlite3_mutex_h
11150 65 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a 20  eld()).      ** 
11160 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66 69  statements to fi
11170 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c  nd locking probl
11180 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ems..      */.  
11190 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20      p->sharable 
111a0 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = 1;.    }.#endi
111b0 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  f.  }.#endif.  i
111c0 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20  f( pBt==0 ){.   
111d0 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66   /*.    ** The f
111e0 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73  ollowing asserts
111f0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
11200 73 74 72 75 63 74 75 72 65 73 20 75 73 65 64 20  structures used 
11210 62 79 20 74 68 65 20 62 74 72 65 65 20 61 72 65  by the btree are
11220 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68  .    ** the righ
11230 74 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73  t size.  This is
11240 20 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73   to guard agains
11250 74 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74  t size changes t
11260 68 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a  hat result.    *
11270 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67  * when compiling
11280 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20   on a different 
11290 61 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20  architecture..  
112a0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
112b0 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20   sizeof(i64)==8 
112c0 7c 7c 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d  || sizeof(i64)==
112d0 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  4 );.    assert(
112e0 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20   sizeof(u64)==8 
112f0 7c 7c 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d  || sizeof(u64)==
11300 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  4 );.    assert(
11310 20 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20   sizeof(u32)==4 
11320 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
11330 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b  izeof(u16)==2 );
11340 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
11350 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a  eof(Pgno)==4 );.
11360 20 20 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c    .    pBt = sql
11370 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
11380 73 69 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a  sizeof(*pBt) );.
11390 20 20 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29      if( pBt==0 )
113a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
113b0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
113c0 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
113d0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
113e0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
113f0 72 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42 74  rOpen(pVfs, &pBt
11400 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e  ->pPager, zFilen
11410 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
11420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
11430 58 54 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73  XTRA_SIZE, flags
11440 2c 20 76 66 73 46 6c 61 67 73 2c 20 70 61 67 65  , vfsFlags, page
11450 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 69 66 28  Reinit);.    if(
11460 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
11470 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
11480 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74  agerSetMmapLimit
11490 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 64 62  (pBt->pPager, db
114a0 2d 3e 73 7a 4d 6d 61 70 29 3b 0a 20 20 20 20 20  ->szMmap);.     
114b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
114c0 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72  erReadFileheader
114d0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a  (pBt->pPager,siz
114e0 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a  eof(zDbHeader),z
114f0 44 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20 7d  DbHeader);.    }
11500 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
11510 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11520 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
11530 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  out;.    }.    p
11540 42 74 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20  Bt->openFlags = 
11550 28 75 38 29 66 6c 61 67 73 3b 0a 20 20 20 20 70  (u8)flags;.    p
11560 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20  Bt->db = db;.   
11570 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
11580 42 75 73 79 68 61 6e 64 6c 65 72 28 70 42 74 2d  Busyhandler(pBt-
11590 3e 70 50 61 67 65 72 2c 20 62 74 72 65 65 49 6e  >pPager, btreeIn
115a0 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 2c  vokeBusyHandler,
115b0 20 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42   pBt);.    p->pB
115c0 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20 20  t = pBt;.  .    
115d0 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30  pBt->pCursor = 0
115e0 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65  ;.    pBt->pPage
115f0 31 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73  1 = 0;.    if( s
11600 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61  qlite3PagerIsrea
11610 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65  donly(pBt->pPage
11620 72 29 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61  r) ) pBt->btsFla
11630 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f  gs |= BTS_READ_O
11640 4e 4c 59 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  NLY;.#ifdef SQLI
11650 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TE_SECURE_DELETE
11660 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  .    pBt->btsFla
11670 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45  gs |= BTS_SECURE
11680 5f 44 45 4c 45 54 45 3b 0a 23 65 6e 64 69 66 0a  _DELETE;.#endif.
11690 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
116a0 4f 46 3a 20 52 2d 35 31 38 37 33 2d 33 39 36 31  OF: R-51873-3961
116b0 38 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  8 The page size 
116c0 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 66  for a database f
116d0 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 64 65  ile is.    ** de
116e0 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
116f0 32 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 6c  2-byte integer l
11700 6f 63 61 74 65 64 20 61 74 20 61 6e 20 6f 66 66  ocated at an off
11710 73 65 74 20 6f 66 20 31 36 20 62 79 74 65 73 20  set of 16 bytes 
11720 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20  from.    ** the 
11730 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
11740 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
11750 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65  */.    pBt->page
11760 53 69 7a 65 20 3d 20 28 7a 44 62 48 65 61 64 65  Size = (zDbHeade
11770 72 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 7a 44 62  r[16]<<8) | (zDb
11780 48 65 61 64 65 72 5b 31 37 5d 3c 3c 31 36 29 3b  Header[17]<<16);
11790 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 61  .    if( pBt->pa
117a0 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42  geSize<512 || pB
117b0 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c 49  t->pageSize>SQLI
117c0 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
117d0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 70  .         || ((p
117e0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 26  Bt->pageSize-1)&
117f0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d  pBt->pageSize)!=
11800 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  0 ){.      pBt->
11810 70 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a 23 69  pageSize = 0;.#i
11820 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11830 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
11840 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67     /* If the mag
11850 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79  ic name ":memory
11860 3a 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61  :" will create a
11870 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
11880 62 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 20  base, then.     
11890 20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61 75   ** leave the au
118a0 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61 74  toVacuum mode at
118b0 20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d   0 (do not auto-
118c0 76 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69 66  vacuum), even if
118d0 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  .      ** SQLITE
118e0 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
118f0 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e 20  UUM is true. On 
11900 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
11910 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49  if.      ** SQLI
11920 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
11930 20 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65   has been define
11940 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79  d, then ":memory
11950 3a 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20 20  :" is just a.   
11960 20 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66 69     ** regular fi
11970 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73  le-name. In this
11980 20 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d 76   case the auto-v
11990 61 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61 73  acuum applies as
119a0 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20   per normal..   
119b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
119c0 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73  zFilename && !is
119d0 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20  Memdb ){.       
119e0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
119f0 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55   = (SQLITE_DEFAU
11a00 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f 20  LT_AUTOVACUUM ? 
11a10 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20  1 : 0);.        
11a20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
11a30 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  = (SQLITE_DEFAUL
11a40 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20  T_AUTOVACUUM==2 
11a50 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  ? 1 : 0);.      
11a60 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e  }.#endif.      n
11a70 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 20  Reserve = 0;.   
11a80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
11a90 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
11aa0 33 37 34 39 37 2d 34 32 34 31 32 20 54 68 65 20  37497-42412 The 
11ab0 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65 73 65  size of the rese
11ac0 72 76 65 64 20 72 65 67 69 6f 6e 20 69 73 0a 20  rved region is. 
11ad0 20 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e       ** determin
11ae0 65 64 20 62 79 20 74 68 65 20 6f 6e 65 2d 62 79  ed by the one-by
11af0 74 65 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65  te unsigned inte
11b00 67 65 72 20 66 6f 75 6e 64 20 61 74 20 61 6e 20  ger found at an 
11b10 6f 66 66 73 65 74 20 6f 66 20 32 30 0a 20 20 20  offset of 20.   
11b20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64     ** into the d
11b30 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65 61  atabase file hea
11b40 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 6e 52  der. */.      nR
11b50 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64  eserve = zDbHead
11b60 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70 42  er[20];.      pB
11b70 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
11b80 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
11b90 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  D;.#ifndef SQLIT
11ba0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
11bb0 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74  M.      pBt->aut
11bc0 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  oVacuum = (get4b
11bd0 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33  yte(&zDbHeader[3
11be0 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 4*4])?1:0);.
11bf0 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56        pBt->incrV
11c00 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
11c10 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20  e(&zDbHeader[36 
11c20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65  + 7*4])?1:0);.#e
11c30 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 72  ndif.    }.    r
11c40 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
11c50 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
11c60 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
11c70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76  ageSize, nReserv
11c80 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
11c90 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
11ca0 5f 6f 75 74 3b 0a 20 20 20 20 70 42 74 2d 3e 75  _out;.    pBt->u
11cb0 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
11cc0 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73  >pageSize - nRes
11cd0 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74  erve;.    assert
11ce0 28 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ( (pBt->pageSize
11cf0 20 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20   & 7)==0 );  /* 
11d00 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74  8-byte alignment
11d10 20 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a   of pageSize */.
11d20 20 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64     .#if !defined
11d30 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
11d40 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
11d50 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
11d60 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f  IT_DISKIO).    /
11d70 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20 42 74  * Add the new Bt
11d80 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 6f  Shared object to
11d90 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
11da0 20 73 68 61 72 61 62 6c 65 20 42 74 53 68 61 72   sharable BtShar
11db0 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  eds..    */.    
11dc0 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  if( p->sharable 
11dd0 29 7b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c  ){.      MUTEX_L
11de0 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75  OGIC( sqlite3_mu
11df0 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64  tex *mutexShared
11e00 3b 20 29 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e  ; ).      pBt->n
11e10 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 4d  Ref = 1;.      M
11e20 55 54 45 58 5f 4c 4f 47 49 43 28 20 6d 75 74 65  UTEX_LOGIC( mute
11e30 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65  xShared = sqlite
11e40 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
11e50 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
11e60 4d 41 53 54 45 52 29 3b 29 0a 20 20 20 20 20 20  MASTER);).      
11e70 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41  if( SQLITE_THREA
11e80 44 53 41 46 45 20 26 26 20 73 71 6c 69 74 65 33  DSAFE && sqlite3
11e90 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
11ea0 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20  reMutex ){.     
11eb0 20 20 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20     pBt->mutex = 
11ec0 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
11ed0 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46  c(SQLITE_MUTEX_F
11ee0 41 53 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66  AST);.        if
11ef0 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20  ( pBt->mutex==0 
11f00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
11f10 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
11f20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6d 61            db->ma
11f30 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a  llocFailed = 0;.
11f40 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62            goto b
11f50 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20  tree_open_out;. 
11f60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
11f70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
11f80 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
11f90 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70  Shared);.      p
11fa0 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42  Bt->pNext = GLOB
11fb0 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
11fc0 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
11fd0 69 73 74 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42  ist);.      GLOB
11fe0 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
11ff0 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
12000 69 73 74 29 20 3d 20 70 42 74 3b 0a 20 20 20 20  ist) = pBt;.    
12010 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
12020 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65  leave(mutexShare
12030 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  d);.    }.#endif
12040 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  .  }..#if !defin
12050 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
12060 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
12070 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
12080 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f  OMIT_DISKIO).  /
12090 2a 20 49 66 20 74 68 65 20 6e 65 77 20 42 74 72  * If the new Btr
120a0 65 65 20 75 73 65 73 20 61 20 73 68 61 72 61 62  ee uses a sharab
120b0 6c 65 20 70 42 74 53 68 61 72 65 64 2c 20 74 68  le pBtShared, th
120c0 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a  en link the new.
120d0 20 20 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f 20    ** Btree into 
120e0 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  the list of all 
120f0 73 68 61 72 61 62 6c 65 20 42 74 72 65 65 73 20  sharable Btrees 
12100 66 6f 72 20 74 68 65 20 73 61 6d 65 20 63 6f 6e  for the same con
12110 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68  nection..  ** Th
12120 65 20 6c 69 73 74 20 69 73 20 6b 65 70 74 20 69  e list is kept i
12130 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
12140 72 20 62 79 20 70 42 74 20 61 64 64 72 65 73 73  r by pBt address
12150 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
12160 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
12170 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 72 65 65  int i;.    Btree
12180 20 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f 72 28   *pSib;.    for(
12190 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
121a0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
121b0 28 70 53 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b  (pSib = db->aDb[
121c0 69 5d 2e 70 42 74 29 21 3d 30 20 26 26 20 70 53  i].pBt)!=0 && pS
121d0 69 62 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a  ib->sharable ){.
121e0 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
121f0 53 69 62 2d 3e 70 50 72 65 76 20 29 7b 20 70 53  Sib->pPrev ){ pS
12200 69 62 20 3d 20 70 53 69 62 2d 3e 70 50 72 65 76  ib = pSib->pPrev
12210 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ; }.        if( 
12220 70 2d 3e 70 42 74 3c 70 53 69 62 2d 3e 70 42 74  p->pBt<pSib->pBt
12230 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
12240 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a 20  >pNext = pSib;. 
12250 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65           p->pPre
12260 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  v = 0;.         
12270 20 70 53 69 62 2d 3e 70 50 72 65 76 20 3d 20 70   pSib->pPrev = p
12280 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
12290 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
122a0 28 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 26 26  ( pSib->pNext &&
122b0 20 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42   pSib->pNext->pB
122c0 74 3c 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20  t<p->pBt ){.    
122d0 20 20 20 20 20 20 20 20 70 53 69 62 20 3d 20 70          pSib = p
122e0 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Sib->pNext;.    
122f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
12300 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69    p->pNext = pSi
12310 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  b->pNext;.      
12320 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 70      p->pPrev = p
12330 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Sib;.          i
12340 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  f( p->pNext ){. 
12350 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e             p->pN
12360 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a  ext->pPrev = p;.
12370 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
12380 20 20 20 20 20 20 70 53 69 62 2d 3e 70 4e 65 78        pSib->pNex
12390 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d  t = p;.        }
123a0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
123b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
123c0 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 42 74  }.#endif.  *ppBt
123d0 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f  ree = p;..btree_
123e0 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20  open_out:.  if( 
123f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
12400 0a 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20  .    if( pBt && 
12410 70 42 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20  pBt->pPager ){. 
12420 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
12430 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67  rClose(pBt->pPag
12440 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  er);.    }.    s
12450 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29  qlite3_free(pBt)
12460 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
12470 65 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 42 74  ee(p);.    *ppBt
12480 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ree = 0;.  }else
12490 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
124a0 42 2d 54 72 65 65 20 77 61 73 20 73 75 63 63 65  B-Tree was succe
124b0 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 2c 20  ssfully opened, 
124c0 73 65 74 20 74 68 65 20 70 61 67 65 72 2d 63 61  set the pager-ca
124d0 63 68 65 20 73 69 7a 65 20 74 6f 20 74 68 65 0a  che size to the.
124e0 20 20 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 76      ** default v
124f0 61 6c 75 65 2e 20 45 78 63 65 70 74 2c 20 77 68  alue. Except, wh
12500 65 6e 20 6f 70 65 6e 69 6e 67 20 6f 6e 20 61 6e  en opening on an
12510 20 65 78 69 73 74 69 6e 67 20 73 68 61 72 65 64   existing shared
12520 20 70 61 67 65 72 2d 63 61 63 68 65 2c 0a 20 20   pager-cache,.  
12530 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 63 68 61 6e    ** do not chan
12540 67 65 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  ge the pager-cac
12550 68 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a  he size..    */.
12560 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
12570 74 72 65 65 53 63 68 65 6d 61 28 70 2c 20 30 2c  treeSchema(p, 0,
12580 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   0)==0 ){.      
12590 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43  sqlite3PagerSetC
125a0 61 63 68 65 73 69 7a 65 28 70 2d 3e 70 42 74 2d  achesize(p->pBt-
125b0 3e 70 50 61 67 65 72 2c 20 53 51 4c 49 54 45 5f  >pPager, SQLITE_
125c0 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49  DEFAULT_CACHE_SI
125d0 5a 45 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ZE);.    }.  }. 
125e0 20 69 66 28 20 6d 75 74 65 78 4f 70 65 6e 20 29   if( mutexOpen )
125f0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
12600 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
12610 28 6d 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20  (mutexOpen) );. 
12620 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
12630 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e  _leave(mutexOpen
12640 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
12650 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  rc;.}../*.** Dec
12660 72 65 6d 65 6e 74 20 74 68 65 20 42 74 53 68 61  rement the BtSha
12670 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72  red.nRef counter
12680 2e 20 20 57 68 65 6e 20 69 74 20 72 65 61 63 68  .  When it reach
12690 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f  es zero,.** remo
126a0 76 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20  ve the BtShared 
126b0 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74  structure from t
126c0 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2e  he sharing list.
126d0 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65    Return.** true
126e0 20 69 66 20 74 68 65 20 42 74 53 68 61 72 65 64   if the BtShared
126f0 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 20 72 65  .nRef counter re
12700 61 63 68 65 73 20 7a 65 72 6f 20 61 6e 64 20 72  aches zero and r
12710 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69  eturn.** false i
12720 66 20 69 74 20 69 73 20 73 74 69 6c 6c 20 70 6f  f it is still po
12730 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69  sitive..*/.stati
12740 63 20 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d  c int removeFrom
12750 53 68 61 72 69 6e 67 4c 69 73 74 28 42 74 53 68  SharingList(BtSh
12760 61 72 65 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e  ared *pBt){.#ifn
12770 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12780 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 4d  SHARED_CACHE.  M
12790 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69  UTEX_LOGIC( sqli
127a0 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74  te3_mutex *pMast
127b0 65 72 3b 20 29 0a 20 20 42 74 53 68 61 72 65 64  er; ).  BtShared
127c0 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72   *pList;.  int r
127d0 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61  emoved = 0;..  a
127e0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
127f0 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74  utex_notheld(pBt
12800 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 4d 55  ->mutex) );.  MU
12810 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74  TEX_LOGIC( pMast
12820 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  er = sqlite3Mute
12830 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
12840 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
12850 52 29 3b 20 29 0a 20 20 73 71 6c 69 74 65 33 5f  R); ).  sqlite3_
12860 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73  mutex_enter(pMas
12870 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65  ter);.  pBt->nRe
12880 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  f--;.  if( pBt->
12890 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69  nRef<=0 ){.    i
128a0 66 28 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72  f( GLOBAL(BtShar
128b0 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
128c0 64 43 61 63 68 65 4c 69 73 74 29 3d 3d 70 42 74  dCacheList)==pBt
128d0 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c   ){.      GLOBAL
128e0 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
128f0 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
12900 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b  t) = pBt->pNext;
12910 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
12920 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c    pList = GLOBAL
12930 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
12940 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
12950 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  t);.      while(
12960 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 26   ALWAYS(pList) &
12970 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d  & pList->pNext!=
12980 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  pBt ){.        p
12990 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78  List=pList->pNex
129a0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
129b0 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c 69 73   if( ALWAYS(pLis
129c0 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  t) ){.        pL
129d0 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  ist->pNext = pBt
129e0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
129f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 53  .    }.    if( S
12a00 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
12a10 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
12a20 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 42 74  3_mutex_free(pBt
12a30 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a  ->mutex);.    }.
12a40 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b      removed = 1;
12a50 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
12a60 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74  utex_leave(pMast
12a70 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  er);.  return re
12a80 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72  moved;.#else.  r
12a90 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a  eturn 1;.#endif.
12aa0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
12ab0 72 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  re pBt->pTmpSpac
12ac0 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61  e points to an a
12ad0 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a  llocation of .**
12ae0 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
12af0 74 29 20 62 79 74 65 73 20 77 69 74 68 20 61 20  t) bytes with a 
12b00 34 2d 62 79 74 65 20 70 72 65 66 69 78 20 66 6f  4-byte prefix fo
12b10 72 20 61 20 6c 65 66 74 2d 63 68 69 6c 64 0a 2a  r a left-child.*
12b20 2a 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74  * pointer..*/.st
12b30 61 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61  atic void alloca
12b40 74 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68  teTempSpace(BtSh
12b50 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66  ared *pBt){.  if
12b60 28 20 21 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  ( !pBt->pTmpSpac
12b70 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54  e ){.    pBt->pT
12b80 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65  mpSpace = sqlite
12b90 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74  3PageMalloc( pBt
12ba0 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 0a 20  ->pageSize );.. 
12bb0 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
12bc0 20 75 73 65 73 20 6f 66 20 70 42 74 2d 3e 70 54   uses of pBt->pT
12bd0 6d 70 53 70 61 63 65 20 69 73 20 74 6f 20 66 6f  mpSpace is to fo
12be0 72 6d 61 74 20 63 65 6c 6c 73 20 62 65 66 6f 72  rmat cells befor
12bf0 65 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 69  e.    ** inserti
12c00 6e 67 20 74 68 65 6d 20 69 6e 74 6f 20 61 20 6c  ng them into a l
12c10 65 61 66 20 70 61 67 65 20 28 66 75 6e 63 74 69  eaf page (functi
12c20 6f 6e 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 29  on fillInCell())
12c30 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 20 63 65  . If.    ** a ce
12c40 6c 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ll is less than 
12c50 34 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  4 bytes in size,
12c60 20 69 74 20 69 73 20 72 6f 75 6e 64 65 64 20 75   it is rounded u
12c70 70 20 74 6f 20 34 20 62 79 74 65 73 0a 20 20 20  p to 4 bytes.   
12c80 20 2a 2a 20 62 79 20 74 68 65 20 76 61 72 69 6f   ** by the vario
12c90 75 73 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74  us routines that
12ca0 20 6d 61 6e 69 70 75 6c 61 74 65 20 62 69 6e 61   manipulate bina
12cb0 72 79 20 63 65 6c 6c 73 2e 20 57 68 69 63 68 0a  ry cells. Which.
12cc0 20 20 20 20 2a 2a 20 63 61 6e 20 6d 65 61 6e 20      ** can mean 
12cd0 74 68 61 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28  that fillInCell(
12ce0 29 20 6f 6e 6c 79 20 69 6e 69 74 69 61 6c 69 7a  ) only initializ
12cf0 65 73 20 74 68 65 20 66 69 72 73 74 20 32 20 6f  es the first 2 o
12d00 72 20 33 0a 20 20 20 20 2a 2a 20 62 79 74 65 73  r 3.    ** bytes
12d10 20 6f 66 20 70 54 6d 70 53 70 61 63 65 2c 20 62   of pTmpSpace, b
12d20 75 74 20 74 68 61 74 20 74 68 65 20 66 69 72 73  ut that the firs
12d30 74 20 34 20 62 79 74 65 73 20 61 72 65 20 63 6f  t 4 bytes are co
12d40 70 69 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  pied from.    **
12d50 20 69 74 20 69 6e 74 6f 20 61 20 64 61 74 61 62   it into a datab
12d60 61 73 65 20 70 61 67 65 2e 20 54 68 69 73 20 69  ase page. This i
12d70 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 61  s not actually a
12d80 20 70 72 6f 62 6c 65 6d 2c 20 62 75 74 20 69 74   problem, but it
12d90 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 63 61 75  .    ** does cau
12da0 73 65 20 61 20 76 61 6c 67 72 69 6e 64 20 65 72  se a valgrind er
12db0 72 6f 72 20 77 68 65 6e 20 74 68 65 20 31 20 6f  ror when the 1 o
12dc0 72 20 32 20 62 79 74 65 73 20 6f 66 20 75 6e 69  r 2 bytes of uni
12dd0 74 69 61 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a  tialized .    **
12de0 20 64 61 74 61 20 69 73 20 70 61 73 73 65 64 20   data is passed 
12df0 74 6f 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 77  to system call w
12e00 72 69 74 65 28 29 2e 20 53 6f 20 74 6f 20 61 76  rite(). So to av
12e10 6f 69 64 20 74 68 69 73 20 65 72 72 6f 72 2c 0a  oid this error,.
12e20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74 68 65 20      ** zero the 
12e30 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66  first 4 bytes of
12e40 20 74 65 6d 70 20 73 70 61 63 65 20 68 65 72 65   temp space here
12e50 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
12e60 41 6c 73 6f 3a 20 20 50 72 6f 76 69 64 65 20 66  Also:  Provide f
12e70 6f 75 72 20 62 79 74 65 73 20 6f 66 20 69 6e 69  our bytes of ini
12e80 74 69 61 6c 69 7a 65 64 20 73 70 61 63 65 20 62  tialized space b
12e90 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a  efore the.    **
12ea0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 54   beginning of pT
12eb0 6d 70 53 70 61 63 65 20 61 73 20 61 6e 20 61 72  mpSpace as an ar
12ec0 65 61 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  ea available to 
12ed0 70 72 65 70 65 6e 64 20 74 68 65 0a 20 20 20 20  prepend the.    
12ee0 2a 2a 20 6c 65 66 74 2d 63 68 69 6c 64 20 70 6f  ** left-child po
12ef0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62 65 67  inter to the beg
12f00 69 6e 6e 69 6e 67 20 6f 66 20 61 20 63 65 6c 6c  inning of a cell
12f10 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
12f20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
12f30 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
12f40 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 2c 20  pBt->pTmpSpace, 
12f50 30 2c 20 38 29 3b 0a 20 20 20 20 20 20 70 42 74  0, 8);.      pBt
12f60 2d 3e 70 54 6d 70 53 70 61 63 65 20 2b 3d 20 34  ->pTmpSpace += 4
12f70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
12f80 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70 42  *.** Free the pB
12f90 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 61 6c 6c  t->pTmpSpace all
12fa0 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  ocation.*/.stati
12fb0 63 20 76 6f 69 64 20 66 72 65 65 54 65 6d 70 53  c void freeTempS
12fc0 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70  pace(BtShared *p
12fd0 42 74 29 7b 0a 20 20 69 66 28 20 70 42 74 2d 3e  Bt){.  if( pBt->
12fe0 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20  pTmpSpace ){.   
12ff0 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
13000 2d 3d 20 34 3b 0a 20 20 20 20 73 71 6c 69 74 65  -= 4;.    sqlite
13010 33 50 61 67 65 46 72 65 65 28 70 42 74 2d 3e 70  3PageFree(pBt->p
13020 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 70  TmpSpace);.    p
13030 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  Bt->pTmpSpace = 
13040 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
13050 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64 61  Close an open da
13060 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61 6c  tabase and inval
13070 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72  idate all cursor
13080 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
13090 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72 65  3BtreeClose(Btre
130a0 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
130b0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
130c0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
130d0 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61  r;..  /* Close a
130e0 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65  ll cursors opene
130f0 64 20 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c  d via this handl
13100 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
13110 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
13120 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
13130 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
13140 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
13150 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73  Cur = pBt->pCurs
13160 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75  or;.  while( pCu
13170 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f  r ){.    BtCurso
13180 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a  r *pTmp = pCur;.
13190 20 20 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d      pCur = pCur-
131a0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20  >pNext;.    if( 
131b0 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20  pTmp->pBtree==p 
131c0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
131d0 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
131e0 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20  (pTmp);.    }.  
131f0 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b  }..  /* Rollback
13200 20 61 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e   any active tran
13210 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65  saction and free
13220 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75   the handle stru
13230 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20  cture..  ** The 
13240 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
13250 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64  treeRollback() d
13260 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c  rops any table-l
13270 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a  ocks held by.  *
13280 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20  * this handle.. 
13290 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72   */.  sqlite3Btr
132a0 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 53 51  eeRollback(p, SQ
132b0 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73  LITE_OK, 0);.  s
132c0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
132d0 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
132e0 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f 74  ere are still ot
132f0 68 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  her outstanding 
13300 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
13310 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a 20  e shared-btree. 
13320 20 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 72   ** structure, r
13330 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72  eturn now. The r
13340 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69 73  emainder of this
13350 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e   procedure clean
13360 73 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 73  s .  ** up the s
13370 68 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a  hared-btree..  *
13380 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77  /.  assert( p->w
13390 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20  antToLock==0 && 
133a0 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a  p->locked==0 );.
133b0 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62    if( !p->sharab
133c0 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d  le || removeFrom
133d0 53 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74 29  SharingList(pBt)
133e0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
133f0 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  Bt is no longer 
13400 6f 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c  on the sharing l
13410 69 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20 61  ist, so we can a
13420 63 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74 20  ccess.    ** it 
13430 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
13440 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78  o hold the mutex
13450 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
13460 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64 65  Clean out and de
13470 6c 65 74 65 20 74 68 65 20 42 74 53 68 61 72 65  lete the BtShare
13480 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f  d object..    */
13490 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42  .    assert( !pB
134a0 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20  t->pCursor );.  
134b0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c    sqlite3PagerCl
134c0 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ose(pBt->pPager)
134d0 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 78  ;.    if( pBt->x
134e0 46 72 65 65 53 63 68 65 6d 61 20 26 26 20 70 42  FreeSchema && pB
134f0 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  t->pSchema ){.  
13500 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63      pBt->xFreeSc
13510 68 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d  hema(pBt->pSchem
13520 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  a);.    }.    sq
13530 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 70  lite3DbFree(0, p
13540 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  Bt->pSchema);.  
13550 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28    freeTempSpace(
13560 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
13570 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 7d  3_free(pBt);.  }
13580 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
13590 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
135a0 48 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  HE.  assert( p->
135b0 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b  wantToLock==0 );
135c0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f  .  assert( p->lo
135d0 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28  cked==0 );.  if(
135e0 20 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70   p->pPrev ) p->p
135f0 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d  Prev->pNext = p-
13600 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 2d  >pNext;.  if( p-
13610 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78  >pNext ) p->pNex
13620 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50  t->pPrev = p->pP
13630 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73  rev;.#endif..  s
13640 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
13650 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13660 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  OK;.}../*.** Cha
13670 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e  nge the limit on
13680 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
13690 61 67 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20  ages allowed in 
136a0 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a  the cache..**.**
136b0 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   The maximum num
136c0 62 65 72 20 6f 66 20 63 61 63 68 65 20 70 61 67  ber of cache pag
136d0 65 73 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  es is set to the
136e0 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c   absolute.** val
136f0 75 65 20 6f 66 20 6d 78 50 61 67 65 2e 20 20 49  ue of mxPage.  I
13700 66 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61  f mxPage is nega
13710 74 69 76 65 2c 20 74 68 65 20 70 61 67 65 72 20  tive, the pager 
13720 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20  will.** operate 
13730 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d  asynchronously -
13740 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f   it will not sto
13750 70 20 74 6f 20 64 6f 20 66 73 79 6e 63 28 29 73  p to do fsync()s
13760 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20 64 61  .** to insure da
13770 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ta is written to
13780 20 74 68 65 20 64 69 73 6b 20 73 75 72 66 61 63   the disk surfac
13790 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74  e before.** cont
137a0 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73 61 63  inuing.  Transac
137b0 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b  tions still work
137c0 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20   if synchronous 
137d0 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74  is off,.** and t
137e0 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e  he database cann
137f0 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20  ot be corrupted 
13800 69 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d 0a  if this program.
13810 2a 2a 20 63 72 61 73 68 65 73 2e 20 20 42 75 74  ** crashes.  But
13820 20 69 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e   if the operatin
13830 67 20 73 79 73 74 65 6d 20 63 72 61 73 68 65 73  g system crashes
13840 20 6f 72 20 74 68 65 72 65 20 69 73 0a 2a 2a 20   or there is.** 
13850 61 6e 20 61 62 72 75 70 74 20 70 6f 77 65 72 20  an abrupt power 
13860 66 61 69 6c 75 72 65 20 77 68 65 6e 20 73 79 6e  failure when syn
13870 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c  chronous is off,
13880 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
13890 20 63 6f 75 6c 64 20 62 65 20 6c 65 66 74 20 69   could be left i
138a0 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e  n an inconsisten
138b0 74 20 61 6e 64 20 75 6e 72 65 63 6f 76 65 72 61  t and unrecovera
138c0 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79  ble state..** Sy
138d0 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20  nchronous is on 
138e0 62 79 20 64 65 66 61 75 6c 74 20 73 6f 20 64 61  by default so da
138f0 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
13900 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d  n is not.** norm
13910 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f  ally a worry..*/
13920 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
13930 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 42 74  eSetCacheSize(Bt
13940 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61  ree *p, int mxPa
13950 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ge){.  BtShared 
13960 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
13970 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
13980 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
13990 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
139a0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
139b0 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  (p);.  sqlite3Pa
139c0 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28  gerSetCachesize(
139d0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50  pBt->pPager, mxP
139e0 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  age);.  sqlite3B
139f0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
13a00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13a10 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
13a20 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
13a30 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
13a40 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 61 6d   limit on the am
13a50 6f 75 6e 74 20 6f 66 20 74 68 65 20 64 61 74 61  ount of the data
13a60 62 61 73 65 20 66 69 6c 65 20 74 68 61 74 20 6d  base file that m
13a70 61 79 20 62 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20  ay be.** memory 
13a80 6d 61 70 70 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  mapped..*/.int s
13a90 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 4d 6d  qlite3BtreeSetMm
13aa0 61 70 4c 69 6d 69 74 28 42 74 72 65 65 20 2a 70  apLimit(Btree *p
13ab0 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
13ac0 73 7a 4d 6d 61 70 29 7b 0a 20 20 42 74 53 68 61  szMmap){.  BtSha
13ad0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
13ae0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
13af0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
13b00 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
13b10 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
13b20 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74  nter(p);.  sqlit
13b30 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69  e3PagerSetMmapLi
13b40 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  mit(pBt->pPager,
13b50 20 73 7a 4d 6d 61 70 29 3b 0a 20 20 73 71 6c 69   szMmap);.  sqli
13b60 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
13b70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
13b80 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  E_OK;.}.#endif /
13b90 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  * SQLITE_MAX_MMA
13ba0 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a  P_SIZE>0 */../*.
13bb0 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77 61  ** Change the wa
13bc0 79 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64  y data is synced
13bd0 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64 65   to disk in orde
13be0 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f 72  r to increase or
13bf0 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77   decrease.** how
13c00 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62 61   well the databa
13c10 73 65 20 72 65 73 69 73 74 73 20 64 61 6d 61 67  se resists damag
13c20 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73  e due to OS cras
13c30 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a  hes and power.**
13c40 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76 65   failures.  Leve
13c50 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d 65 20  l 1 is the same 
13c60 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20  as asynchronous 
13c70 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63 75  (no syncs() occu
13c80 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69  r and.** there i
13c90 73 20 61 20 68 69 67 68 20 70 72 6f 62 61 62 69  s a high probabi
13ca0 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29 20  lity of damage) 
13cb0 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65 20   Level 2 is the 
13cc0 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65 0a  default.  There.
13cd0 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f 77  ** is a very low
13ce0 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72   but non-zero pr
13cf0 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
13d00 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72 65  age.  Level 3 re
13d10 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f  duces the.** pro
13d20 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61  bability of dama
13d30 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20  ge to near zero 
13d40 62 75 74 20 77 69 74 68 20 61 20 77 72 69 74 65  but with a write
13d50 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64   performance red
13d60 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64  uction..*/.#ifnd
13d70 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
13d80 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74  AGER_PRAGMAS.int
13d90 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
13da0 50 61 67 65 72 46 6c 61 67 73 28 0a 20 20 42 74  PagerFlags(.  Bt
13db0 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ree *p,         
13dc0 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
13dd0 65 20 74 6f 20 73 65 74 20 74 68 65 20 73 61 66  e to set the saf
13de0 65 74 79 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f 0a  ety level on */.
13df0 20 20 75 6e 73 69 67 6e 65 64 20 70 67 46 6c 61    unsigned pgFla
13e00 67 73 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69  gs       /* Vari
13e10 6f 75 73 20 50 41 47 45 52 5f 2a 20 66 6c 61 67  ous PAGER_* flag
13e20 73 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72  s */.){.  BtShar
13e30 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
13e40 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
13e50 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
13e60 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
13e70 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
13e80 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ter(p);.  sqlite
13e90 33 50 61 67 65 72 53 65 74 46 6c 61 67 73 28 70  3PagerSetFlags(p
13ea0 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 46 6c  Bt->pPager, pgFl
13eb0 61 67 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  ags);.  sqlite3B
13ec0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
13ed0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13ee0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
13ef0 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
13f00 20 74 68 65 20 67 69 76 65 6e 20 62 74 72 65 65   the given btree
13f10 20 69 73 20 73 65 74 20 74 6f 20 73 61 66 65 74   is set to safet
13f20 79 20 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f  y level 1.  In o
13f30 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72  ther.** words, r
13f40 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 6e 6f  eturn TRUE if no
13f50 20 73 79 6e 63 28 29 20 6f 63 63 75 72 73 20 6f   sync() occurs o
13f60 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 73  n the disk files
13f70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
13f80 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65  BtreeSyncDisable
13f90 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  d(Btree *p){.  B
13fa0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
13fb0 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b  ->pBt;.  int rc;
13fc0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
13fd0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
13fe0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20  >db->mutex) );  
13ff0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
14000 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72  nter(p);.  asser
14010 74 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70  t( pBt && pBt->p
14020 50 61 67 65 72 20 29 3b 0a 20 20 72 63 20 3d 20  Pager );.  rc = 
14030 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79  sqlite3PagerNosy
14040 6e 63 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  nc(pBt->pPager);
14050 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
14060 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
14070 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
14080 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c  hange the defaul
14090 74 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e 64  t pages size and
140a0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
140b0 65 73 65 72 76 65 64 20 62 79 74 65 73 20 70 65  eserved bytes pe
140c0 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69  r page..** Or, i
140d0 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  f the page size 
140e0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
140f0 20 66 69 78 65 64 2c 20 72 65 74 75 72 6e 20 53   fixed, return S
14100 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a  QLITE_READONLY .
14110 2a 2a 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67  ** without chang
14120 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a  ing anything..**
14130 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a  .** The page siz
14140 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65  e must be a powe
14150 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35  r of 2 between 5
14160 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20 49  12 and 65536.  I
14170 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73 69  f the page.** si
14180 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73  ze supplied does
14190 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63   not meet this c
141a0 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74  onstraint then t
141b0 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
141c0 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a  not.** changed..
141d0 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 73  **.** Page sizes
141e0 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 64   are constrained
141f0 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20 6f   to be a power o
14200 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74 68  f two so that th
14210 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74  e region.** of t
14220 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
14230 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e   used for lockin
14240 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  g (beginning at 
14250 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a  PENDING_BYTE,.**
14260 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
14270 70 61 73 74 20 74 68 65 20 31 47 42 20 62 6f 75  past the 1GB bou
14280 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30 30 30  ndary, 0x4000000
14290 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63 75  0) needs to occu
142a0 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69  r.** at the begi
142b0 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65 2e  nning of a page.
142c0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
142d0 74 65 72 20 6e 52 65 73 65 72 76 65 20 69 73 20  ter nReserve is 
142e0 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20  less than zero, 
142f0 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
14300 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20 62  of reserved.** b
14310 79 74 65 73 20 70 65 72 20 70 61 67 65 20 69 73  ytes per page is
14320 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e   left unchanged.
14330 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 46  .**.** If the iF
14340 69 78 21 3d 30 20 74 68 65 6e 20 74 68 65 20 42  ix!=0 then the B
14350 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
14360 44 20 66 6c 61 67 20 69 73 20 73 65 74 20 73 6f  D flag is set so
14370 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 73   that the page s
14380 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f 76  ize.** and autov
14390 61 63 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20 6e  acuum mode can n
143a0 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63 68 61 6e  o longer be chan
143b0 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ged..*/.int sqli
143c0 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53  te3BtreeSetPageS
143d0 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ize(Btree *p, in
143e0 74 20 70 61 67 65 53 69 7a 65 2c 20 69 6e 74 20  t pageSize, int 
143f0 6e 52 65 73 65 72 76 65 2c 20 69 6e 74 20 69 46  nReserve, int iF
14400 69 78 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ix){.  int rc = 
14410 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53  SQLITE_OK;.  BtS
14420 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
14430 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  pBt;.  assert( n
14440 52 65 73 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e  Reserve>=-1 && n
14450 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a  Reserve<=255 );.
14460 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
14470 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70 42  ter(p);.  if( pB
14480 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
14490 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44  S_PAGESIZE_FIXED
144a0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
144b0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
144c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
144d0 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20  READONLY;.  }.  
144e0 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29  if( nReserve<0 )
144f0 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d  {.    nReserve =
14500 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
14510 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
14520 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
14530 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e  nReserve>=0 && n
14540 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a  Reserve<=255 );.
14550 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d    if( pageSize>=
14560 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c  512 && pageSize<
14570 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  =SQLITE_MAX_PAGE
14580 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20  _SIZE &&.       
14590 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70   ((pageSize-1)&p
145a0 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20  ageSize)==0 ){. 
145b0 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65     assert( (page
145c0 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a  Size & 7)==0 );.
145d0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
145e0 2d 3e 70 50 61 67 65 31 20 26 26 20 21 70 42 74  ->pPage1 && !pBt
145f0 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20  ->pCursor );.   
14600 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
14610 20 28 75 33 32 29 70 61 67 65 53 69 7a 65 3b 0a   (u32)pageSize;.
14620 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63      freeTempSpac
14630 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 63  e(pBt);.  }.  rc
14640 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
14650 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
14660 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
14670 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65  geSize, nReserve
14680 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c 65  );.  pBt->usable
14690 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  Size = pBt->page
146a0 53 69 7a 65 20 2d 20 28 75 31 36 29 6e 52 65 73  Size - (u16)nRes
146b0 65 72 76 65 3b 0a 20 20 69 66 28 20 69 46 69 78  erve;.  if( iFix
146c0 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73   ) pBt->btsFlags
146d0 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45   |= BTS_PAGESIZE
146e0 5f 46 49 58 45 44 3b 0a 20 20 73 71 6c 69 74 65  _FIXED;.  sqlite
146f0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
14700 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
14710 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
14720 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e   currently defin
14730 65 64 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a  ed page size.*/.
14740 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
14750 47 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65  GetPageSize(Btre
14760 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  e *p){.  return 
14770 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  p->pBt->pageSize
14780 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  ;.}..#if defined
14790 28 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45  (SQLITE_HAS_CODE
147a0 43 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  C) || defined(SQ
147b0 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a  LITE_DEBUG)./*.*
147c0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
147d0 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71  is similar to sq
147e0 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73  lite3BtreeGetRes
147f0 65 72 76 65 28 29 2c 20 65 78 63 65 70 74 20 74  erve(), except t
14800 68 61 74 20 69 74 0a 2a 2a 20 6d 61 79 20 6f 6e  hat it.** may on
14810 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20  ly be called if 
14820 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
14830 20 74 68 61 74 20 74 68 65 20 62 2d 74 72 65 65   that the b-tree
14840 20 6d 75 74 65 78 20 69 73 20 61 6c 72 65 61 64   mutex is alread
14850 79 0a 2a 2a 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a  y.** held..**.**
14860 20 54 68 69 73 20 69 73 20 75 73 65 66 75 6c 20   This is useful 
14870 69 6e 20 6f 6e 65 20 73 70 65 63 69 61 6c 20 63  in one special c
14880 61 73 65 20 69 6e 20 74 68 65 20 62 61 63 6b 75  ase in the backu
14890 70 20 41 50 49 20 63 6f 64 65 20 77 68 65 72 65  p API code where
148a0 20 69 74 20 69 73 0a 2a 2a 20 6b 6e 6f 77 6e 20   it is.** known 
148b0 74 68 61 74 20 74 68 65 20 73 68 61 72 65 64 20  that the shared 
148c0 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73 20  b-tree mutex is 
148d0 68 65 6c 64 2c 20 62 75 74 20 74 68 65 20 6d 75  held, but the mu
148e0 74 65 78 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 64  tex on the .** d
148f0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74  atabase handle t
14900 68 61 74 20 6f 77 6e 73 20 2a 70 20 69 73 20 6e  hat owns *p is n
14910 6f 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ot. In this case
14920 20 69 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   if sqlite3Btree
14930 45 6e 74 65 72 28 29 0a 2a 2a 20 77 65 72 65 20  Enter().** were 
14940 74 6f 20 62 65 20 63 61 6c 6c 65 64 2c 20 69 74  to be called, it
14950 20 6d 69 67 68 74 20 63 6f 6c 6c 69 64 65 20 77   might collide w
14960 69 74 68 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f  ith some other o
14970 70 65 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65 0a  peration on the.
14980 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ** database hand
14990 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70 2c  le that owns *p,
149a0 20 63 61 75 73 69 6e 67 20 75 6e 64 65 66 69 6e   causing undefin
149b0 65 64 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a  ed behavior..*/.
149c0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
149d0 47 65 74 52 65 73 65 72 76 65 4e 6f 4d 75 74 65  GetReserveNoMute
149e0 78 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61  x(Btree *p){.  a
149f0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
14a00 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74  utex_held(p->pBt
14a10 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65  ->mutex) );.  re
14a20 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67  turn p->pBt->pag
14a30 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e  eSize - p->pBt->
14a40 75 73 61 62 6c 65 53 69 7a 65 3b 0a 7d 0a 23 65  usableSize;.}.#e
14a50 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 48  ndif /* SQLITE_H
14a60 41 53 5f 43 4f 44 45 43 20 7c 7c 20 53 51 4c 49  AS_CODEC || SQLI
14a70 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66  TE_DEBUG */..#if
14a80 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
14a90 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
14aa0 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  MAS) || !defined
14ab0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43  (SQLITE_OMIT_VAC
14ac0 55 55 4d 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  UUM)./*.** Retur
14ad0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
14ae0 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  bytes of space a
14af0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65  t the end of eve
14b00 72 79 20 70 61 67 65 20 74 68 61 74 0a 2a 2a 20  ry page that.** 
14b10 61 72 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20  are intentually 
14b20 6c 65 66 74 20 75 6e 75 73 65 64 2e 20 20 54 68  left unused.  Th
14b30 69 73 20 69 73 20 74 68 65 20 22 72 65 73 65 72  is is the "reser
14b40 76 65 64 22 20 73 70 61 63 65 20 74 68 61 74 20  ved" space that 
14b50 69 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20  is.** sometimes 
14b60 75 73 65 64 20 62 79 20 65 78 74 65 6e 73 69 6f  used by extensio
14b70 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ns..*/.int sqlit
14b80 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76  e3BtreeGetReserv
14b90 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  e(Btree *p){.  i
14ba0 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42  nt n;.  sqlite3B
14bb0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
14bc0 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65  n = p->pBt->page
14bd0 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75  Size - p->pBt->u
14be0 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 73 71 6c  sableSize;.  sql
14bf0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
14c00 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d  );.  return n;.}
14c10 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
14c20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
14c30 6e 74 20 66 6f 72 20 61 20 64 61 74 61 62 61 73  nt for a databas
14c40 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70  e if mxPage is p
14c50 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63  ositive..** No c
14c60 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
14c70 69 66 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f  if mxPage is 0 o
14c80 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52  r negative..** R
14c90 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65  egardless of the
14ca0 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65   value of mxPage
14cb0 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78  , return the max
14cc0 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e  imum page count.
14cd0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
14ce0 74 72 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74  treeMaxPageCount
14cf0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d  (Btree *p, int m
14d00 78 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b  xPage){.  int n;
14d10 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
14d20 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73  nter(p);.  n = s
14d30 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61  qlite3PagerMaxPa
14d40 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e  geCount(p->pBt->
14d50 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b  pPager, mxPage);
14d60 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
14d70 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
14d80 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n n;.}../*.** Se
14d90 74 20 74 68 65 20 42 54 53 5f 53 45 43 55 52 45  t the BTS_SECURE
14da0 5f 44 45 4c 45 54 45 20 66 6c 61 67 20 69 66 20  _DELETE flag if 
14db0 6e 65 77 46 6c 61 67 20 69 73 20 30 20 6f 72 20  newFlag is 0 or 
14dc0 31 2e 20 20 49 66 20 6e 65 77 46 6c 61 67 20 69  1.  If newFlag i
14dd0 73 20 2d 31 2c 0a 2a 2a 20 74 68 65 6e 20 6d 61  s -1,.** then ma
14de0 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 2e 20 20  ke no changes.  
14df0 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20 74 68  Always return th
14e00 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 42  e value of the B
14e10 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
14e20 0a 2a 2a 20 73 65 74 74 69 6e 67 20 61 66 74 65  .** setting afte
14e30 72 20 74 68 65 20 63 68 61 6e 67 65 2e 0a 2a 2f  r the change..*/
14e40 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
14e50 65 53 65 63 75 72 65 44 65 6c 65 74 65 28 42 74  eSecureDelete(Bt
14e60 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e 65 77 46  ree *p, int newF
14e70 6c 61 67 29 7b 0a 20 20 69 6e 74 20 62 3b 0a 20  lag){.  int b;. 
14e80 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
14e90 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 42  rn 0;.  sqlite3B
14ea0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
14eb0 69 66 28 20 6e 65 77 46 6c 61 67 3e 3d 30 20 29  if( newFlag>=0 )
14ec0 7b 0a 20 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74  {.    p->pBt->bt
14ed0 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 53  sFlags &= ~BTS_S
14ee0 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20  ECURE_DELETE;.  
14ef0 20 20 69 66 28 20 6e 65 77 46 6c 61 67 20 29 20    if( newFlag ) 
14f00 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  p->pBt->btsFlags
14f10 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44   |= BTS_SECURE_D
14f20 45 4c 45 54 45 3b 0a 20 20 7d 20 0a 20 20 62 20  ELETE;.  } .  b 
14f30 3d 20 28 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c  = (p->pBt->btsFl
14f40 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45  ags & BTS_SECURE
14f50 5f 44 45 4c 45 54 45 29 21 3d 30 3b 0a 20 20 73  _DELETE)!=0;.  s
14f60 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
14f70 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 3b  (p);.  return b;
14f80 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
14f90 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
14fa0 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29  T_PAGER_PRAGMAS)
14fb0 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
14fc0 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29  ITE_OMIT_VACUUM)
14fd0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67   */../*.** Chang
14fe0 65 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75  e the 'auto-vacu
14ff0 75 6d 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20  um' property of 
15000 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66  the database. If
15010 20 74 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d   the 'autoVacuum
15020 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  '.** parameter i
15030 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
15040 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64   auto-vacuum mod
15050 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66  e is enabled. If
15060 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20   zero, it.** is 
15070 64 69 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65  disabled. The de
15080 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20  fault value for 
15090 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  the auto-vacuum 
150a0 70 72 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20  property is .** 
150b0 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
150c0 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  e SQLITE_DEFAULT
150d0 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72  _AUTOVACUUM macr
150e0 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  o..*/.int sqlite
150f0 33 42 74 72 65 65 53 65 74 41 75 74 6f 56 61 63  3BtreeSetAutoVac
15100 75 75 6d 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  uum(Btree *p, in
15110 74 20 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23  t autoVacuum){.#
15120 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
15130 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72  T_AUTOVACUUM.  r
15140 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
15150 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42  DONLY;.#else.  B
15160 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
15170 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20  ->pBt;.  int rc 
15180 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
15190 38 20 61 76 20 3d 20 28 75 38 29 61 75 74 6f 56  8 av = (u8)autoV
151a0 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65  acuum;..  sqlite
151b0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
151c0 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46    if( (pBt->btsF
151d0 6c 61 67 73 20 26 20 42 54 53 5f 50 41 47 45 53  lags & BTS_PAGES
151e0 49 5a 45 5f 46 49 58 45 44 29 21 3d 30 20 26 26  IZE_FIXED)!=0 &&
151f0 20 28 61 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d   (av ?1:0)!=pBt-
15200 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
15210 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
15220 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65  EADONLY;.  }else
15230 7b 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56  {.    pBt->autoV
15240 61 63 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b  acuum = av ?1:0;
15250 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61  .    pBt->incrVa
15260 63 75 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a  cuum = av==2 ?1:
15270 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
15280 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
15290 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
152a0 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  if.}../*.** Retu
152b0 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  rn the value of 
152c0 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d  the 'auto-vacuum
152d0 27 20 70 72 6f 70 65 72 74 79 2e 20 49 66 20 61  ' property. If a
152e0 75 74 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a  uto-vacuum is .*
152f0 2a 20 65 6e 61 62 6c 65 64 20 31 20 69 73 20 72  * enabled 1 is r
15300 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
15310 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  se 0..*/.int sql
15320 69 74 65 33 42 74 72 65 65 47 65 74 41 75 74 6f  ite3BtreeGetAuto
15330 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29  Vacuum(Btree *p)
15340 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
15350 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
15360 20 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41    return BTREE_A
15370 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a  UTOVACUUM_NONE;.
15380 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a  #else.  int rc;.
15390 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
153a0 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 28  ter(p);.  rc = (
153b0 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61  .    (!p->pBt->a
153c0 75 74 6f 56 61 63 75 75 6d 29 3f 42 54 52 45 45  utoVacuum)?BTREE
153d0 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45  _AUTOVACUUM_NONE
153e0 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e  :.    (!p->pBt->
153f0 69 6e 63 72 56 61 63 75 75 6d 29 3f 42 54 52 45  incrVacuum)?BTRE
15400 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c  E_AUTOVACUUM_FUL
15410 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f 41 55 54  L:.    BTREE_AUT
15420 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29  OVACUUM_INCR.  )
15430 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
15440 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
15450 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a  rn rc;.#endif.}.
15460 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65  ../*.** Get a re
15470 66 65 72 65 6e 63 65 20 74 6f 20 70 50 61 67 65  ference to pPage
15480 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  1 of the databas
15490 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20 77 69  e file.  This wi
154a0 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69  ll.** also acqui
154b0 72 65 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e  re a readlock on
154c0 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a   that file..**.*
154d0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
154e0 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
154f0 73 73 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65  ss.  If the file
15500 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c   is not a.** wel
15510 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73  l-formed databas
15520 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c  e file, then SQL
15530 49 54 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72  ITE_CORRUPT is r
15540 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49  eturned..** SQLI
15550 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72  TE_BUSY is retur
15560 6e 65 64 20 69 66 20 74 68 65 20 64 61 74 61 62  ned if the datab
15570 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20  ase is locked.  
15580 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20  SQLITE_NOMEM.** 
15590 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 77  is returned if w
155a0 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d  e run out of mem
155b0 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ory. .*/.static 
155c0 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65 28 42 74  int lockBtree(Bt
155d0 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
155e0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
155f0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
15600 6f 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63  ode from subfunc
15610 74 69 6f 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50 61  tions */.  MemPa
15620 67 65 20 2a 70 50 61 67 65 31 3b 20 20 20 20 20  ge *pPage1;     
15630 2f 2a 20 50 61 67 65 20 31 20 6f 66 20 74 68 65  /* Page 1 of the
15640 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
15650 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20  /.  int nPage;  
15660 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
15670 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
15680 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
15690 20 69 6e 74 20 6e 50 61 67 65 46 69 6c 65 20 3d   int nPageFile =
156a0 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20   0;   /* Number 
156b0 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
156c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
156d0 0a 20 20 69 6e 74 20 6e 50 61 67 65 48 65 61 64  .  int nPageHead
156e0 65 72 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  er;     /* Numbe
156f0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
15700 65 20 64 61 74 61 62 61 73 65 20 61 63 63 6f 72  e database accor
15710 64 69 6e 67 20 74 6f 20 68 64 72 20 2a 2f 0a 0a  ding to hdr */..
15720 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
15730 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
15740 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
15750 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65  sert( pBt->pPage
15760 31 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73  1==0 );.  rc = s
15770 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65  qlite3PagerShare
15780 64 4c 6f 63 6b 28 70 42 74 2d 3e 70 50 61 67 65  dLock(pBt->pPage
15790 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  r);.  if( rc!=SQ
157a0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
157b0 20 72 63 3b 0a 20 20 72 63 20 3d 20 62 74 72 65   rc;.  rc = btre
157c0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c  eGetPage(pBt, 1,
157d0 20 26 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20   &pPage1, 0);.  
157e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
157f0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
15800 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65    /* Do some che
15810 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e  cking to help in
15820 73 75 72 65 20 74 68 65 20 66 69 6c 65 20 77 65  sure the file we
15830 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69   opened really i
15840 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64  s.  ** a valid d
15850 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20  atabase file. . 
15860 20 2a 2f 0a 20 20 6e 50 61 67 65 20 3d 20 6e 50   */.  nPage = nP
15870 61 67 65 48 65 61 64 65 72 20 3d 20 67 65 74 34  ageHeader = get4
15880 62 79 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61  byte(28+(u8*)pPa
15890 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 73  ge1->aData);.  s
158a0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
158b0 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
158c0 2c 20 26 6e 50 61 67 65 46 69 6c 65 29 3b 0a 20  , &nPageFile);. 
158d0 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 7c 7c   if( nPage==0 ||
158e0 20 6d 65 6d 63 6d 70 28 32 34 2b 28 75 38 2a 29   memcmp(24+(u8*)
158f0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 39  pPage1->aData, 9
15900 32 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61  2+(u8*)pPage1->a
15910 44 61 74 61 2c 34 29 21 3d 30 20 29 7b 0a 20 20  Data,4)!=0 ){.  
15920 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 46    nPage = nPageF
15930 69 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  ile;.  }.  if( n
15940 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 75 33  Page>0 ){.    u3
15950 32 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  2 pageSize;.    
15960 75 33 32 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  u32 usableSize;.
15970 20 20 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20      u8 *page1 = 
15980 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20  pPage1->aData;. 
15990 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
159a0 4f 54 41 44 42 3b 0a 20 20 20 20 2f 2a 20 45 56  OTADB;.    /* EV
159b0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 37  IDENCE-OF: R-437
159c0 33 37 2d 33 39 39 39 39 20 45 76 65 72 79 20 76  37-39999 Every v
159d0 61 6c 69 64 20 53 51 4c 69 74 65 20 64 61 74 61  alid SQLite data
159e0 62 61 73 65 20 66 69 6c 65 20 62 65 67 69 6e 73  base file begins
159f0 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65  .    ** with the
15a00 20 66 6f 6c 6c 6f 77 69 6e 67 20 31 36 20 62 79   following 16 by
15a10 74 65 73 20 28 69 6e 20 68 65 78 29 3a 20 35 33  tes (in hex): 53
15a20 20 35 31 20 34 63 20 36 39 20 37 34 20 36 35 20   51 4c 69 74 65 
15a30 32 30 20 36 36 20 36 66 20 37 32 20 36 64 0a 20  20 66 6f 72 6d. 
15a40 20 20 20 2a 2a 20 36 31 20 37 34 20 32 30 20 33     ** 61 74 20 3
15a50 33 20 30 30 2e 20 2a 2f 0a 20 20 20 20 69 66 28  3 00. */.    if(
15a60 20 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a   memcmp(page1, z
15a70 4d 61 67 69 63 48 65 61 64 65 72 2c 20 31 36 29  MagicHeader, 16)
15a80 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  !=0 ){.      got
15a90 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
15aa0 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64  led;.    }..#ifd
15ab0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
15ac0 41 4c 0a 20 20 20 20 69 66 28 20 70 61 67 65 31  AL.    if( page1
15ad0 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20  [18]>1 ){.      
15ae0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
15af0 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a   BTS_READ_ONLY;.
15b00 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61      }.    if( pa
15b10 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20  ge1[19]>1 ){.   
15b20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
15b30 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
15b40 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70  .#else.    if( p
15b50 61 67 65 31 5b 31 38 5d 3e 32 20 29 7b 0a 20 20  age1[18]>2 ){.  
15b60 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
15b70 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e  s |= BTS_READ_ON
15b80 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LY;.    }.    if
15b90 28 20 70 61 67 65 31 5b 31 39 5d 3e 32 20 29 7b  ( page1[19]>2 ){
15ba0 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
15bb0 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
15bc0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
15bd0 74 68 65 20 77 72 69 74 65 20 76 65 72 73 69 6f  the write versio
15be0 6e 20 69 73 20 73 65 74 20 74 6f 20 32 2c 20 74  n is set to 2, t
15bf0 68 69 73 20 64 61 74 61 62 61 73 65 20 73 68 6f  his database sho
15c00 75 6c 64 20 62 65 20 61 63 63 65 73 73 65 64 0a  uld be accessed.
15c10 20 20 20 20 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f      ** in WAL mo
15c20 64 65 2e 20 49 66 20 74 68 65 20 6c 6f 67 20 69  de. If the log i
15c30 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
15c40 65 6e 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e  en, open it now.
15c50 20 54 68 65 6e 20 0a 20 20 20 20 2a 2a 20 72 65   Then .    ** re
15c60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61  turn SQLITE_OK a
15c70 6e 64 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75  nd return withou
15c80 74 20 70 6f 70 75 6c 61 74 69 6e 67 20 42 74 53  t populating BtS
15c90 68 61 72 65 64 2e 70 50 61 67 65 31 2e 0a 20 20  hared.pPage1..  
15ca0 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20    ** The caller 
15cb0 64 65 74 65 63 74 73 20 74 68 69 73 20 61 6e 64  detects this and
15cc0 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63   calls this func
15cd0 74 69 6f 6e 20 61 67 61 69 6e 2e 20 54 68 69 73  tion again. This
15ce0 20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71 75 69   is.    ** requi
15cf0 72 65 64 20 61 73 20 74 68 65 20 76 65 72 73 69  red as the versi
15d00 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 63 75 72  on of page 1 cur
15d10 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61  rently in the pa
15d20 67 65 31 20 62 75 66 66 65 72 0a 20 20 20 20 2a  ge1 buffer.    *
15d30 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 68 65  * may not be the
15d40 20 6c 61 74 65 73 74 20 76 65 72 73 69 6f 6e 20   latest version 
15d50 2d 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 61  - there may be a
15d60 20 6e 65 77 65 72 20 6f 6e 65 20 69 6e 20 74 68   newer one in th
15d70 65 20 6c 6f 67 0a 20 20 20 20 2a 2a 20 66 69 6c  e log.    ** fil
15d80 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
15d90 28 20 70 61 67 65 31 5b 31 39 5d 3d 3d 32 20 26  ( page1[19]==2 &
15da0 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  & (pBt->btsFlags
15db0 20 26 20 42 54 53 5f 4e 4f 5f 57 41 4c 29 3d 3d   & BTS_NO_WAL)==
15dc0 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
15dd0 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20  sOpen = 0;.     
15de0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
15df0 65 72 4f 70 65 6e 57 61 6c 28 70 42 74 2d 3e 70  erOpenWal(pBt->p
15e00 50 61 67 65 72 2c 20 26 69 73 4f 70 65 6e 29 3b  Pager, &isOpen);
15e10 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
15e20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15e30 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
15e40 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
15e50 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4f 70    }else if( isOp
15e60 65 6e 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66 20  en==0 ){.#ifdef 
15e70 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57  SQLITE_DEFAULT_W
15e80 41 4c 5f 53 41 46 45 54 59 4c 45 56 45 4c 0a 20  AL_SAFETYLEVEL. 
15e90 20 20 20 20 20 20 20 2f 2a 20 44 65 66 61 75 6c         /* Defaul
15ea0 74 20 74 6f 20 73 70 65 63 69 66 69 65 64 20 73  t to specified s
15eb0 61 66 65 74 79 5f 6c 65 76 65 6c 20 66 6f 72 20  afety_level for 
15ec0 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20  WAL mode */.    
15ed0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 64 62 21      if( pBt->db!
15ee0 3d 30 20 26 26 20 70 42 74 2d 3e 64 62 2d 3e 61  =0 && pBt->db->a
15ef0 44 62 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Db!=0 ){.       
15f00 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20     int iDb;.    
15f10 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
15f20 62 20 3d 20 70 42 74 2d 3e 64 62 3b 0a 20 20 20  b = pBt->db;.   
15f30 20 20 20 20 20 20 20 44 62 20 2a 61 44 62 20 3d         Db *aDb =
15f40 20 64 62 2d 3e 61 44 62 3b 0a 20 20 20 20 20 20   db->aDb;.      
15f50 20 20 20 20 75 38 20 6c 65 76 65 6c 20 3d 20 30      u8 level = 0
15f60 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
15f70 69 44 62 3d 30 3b 20 69 44 62 3c 64 62 2d 3e 6e  iDb=0; iDb<db->n
15f80 44 62 3b 20 69 44 62 2b 2b 29 7b 0a 20 20 20 20  Db; iDb++){.    
15f90 20 20 20 20 20 20 20 20 69 66 28 20 61 44 62 5b          if( aDb[
15fa0 69 44 62 5d 2e 70 42 74 20 26 26 20 61 44 62 5b  iDb].pBt && aDb[
15fb0 69 44 62 5d 2e 70 42 74 2d 3e 70 42 74 3d 3d 70  iDb].pBt->pBt==p
15fc0 42 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  Bt ) break;.    
15fd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
15fe0 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 64 62    assert( iDb<db
15ff0 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 20 20 20  ->nDb );.       
16000 20 20 20 6c 65 76 65 6c 20 3d 20 64 62 2d 3e 61     level = db->a
16010 44 62 5b 69 44 62 5d 2e 73 61 66 65 74 79 5f 6c  Db[iDb].safety_l
16020 65 76 65 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  evel;.          
16030 69 66 28 20 21 53 51 4c 49 54 45 5f 44 62 53 61  if( !SQLITE_DbSa
16040 66 65 74 79 4c 65 76 65 6c 49 73 46 69 78 65 64  fetyLevelIsFixed
16050 28 6c 65 76 65 6c 29 20 26 26 20 0a 20 20 20 20  (level) && .    
16060 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45           (SQLITE
16070 5f 44 62 53 61 66 65 74 79 4c 65 76 65 6c 56 61  _DbSafetyLevelVa
16080 6c 75 65 28 6c 65 76 65 6c 29 20 21 3d 20 53 51  lue(level) != SQ
16090 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c  LITE_DEFAULT_WAL
160a0 5f 53 41 46 45 54 59 4c 45 56 45 4c 29 20 29 7b  _SAFETYLEVEL) ){
160b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 44 62  .            aDb
160c0 5b 69 44 62 5d 2e 73 61 66 65 74 79 5f 6c 65 76  [iDb].safety_lev
160d0 65 6c 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  el = SQLITE_DEFA
160e0 55 4c 54 5f 57 41 4c 5f 53 41 46 45 54 59 4c 45  ULT_WAL_SAFETYLE
160f0 56 45 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  VEL;.           
16100 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
16110 53 61 66 65 74 79 4c 65 76 65 6c 28 70 42 74 2d  SafetyLevel(pBt-
16120 3e 70 50 61 67 65 72 2c 20 53 51 4c 49 54 45 5f  >pPager, SQLITE_
16130 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53 41 46 45  DEFAULT_WAL_SAFE
16140 54 59 4c 45 56 45 4c 2c 20 0a 20 20 20 20 20 20  TYLEVEL, .      
16150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16170 20 28 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49   (db->flags&SQLI
16180 54 45 5f 46 75 6c 6c 46 53 79 6e 63 29 21 3d 30  TE_FullFSync)!=0
16190 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
161a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161b0 20 20 20 20 20 20 20 20 20 28 64 62 2d 3e 66 6c           (db->fl
161c0 61 67 73 26 53 51 4c 49 54 45 5f 43 6b 70 74 46  ags&SQLITE_CkptF
161d0 75 6c 6c 46 53 79 6e 63 29 21 3d 30 29 3b 0a 20  ullFSync)!=0);. 
161e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
161f0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
16200 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
16210 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20 20  pPage1);.       
16220 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16230 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
16240 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54   rc = SQLITE_NOT
16250 41 44 42 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ADB;.    }.#endi
16260 66 0a 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  f..    /* EVIDEN
16270 43 45 2d 4f 46 3a 20 52 2d 31 35 34 36 35 2d 32  CE-OF: R-15465-2
16280 30 38 31 33 20 54 68 65 20 6d 61 78 69 6d 75 6d  0813 The maximum
16290 20 61 6e 64 20 6d 69 6e 69 6d 75 6d 20 65 6d 62   and minimum emb
162a0 65 64 64 65 64 20 70 61 79 6c 6f 61 64 0a 20 20  edded payload.  
162b0 20 20 2a 2a 20 66 72 61 63 74 69 6f 6e 73 20 61    ** fractions a
162c0 6e 64 20 74 68 65 20 6c 65 61 66 20 70 61 79 6c  nd the leaf payl
162d0 6f 61 64 20 66 72 61 63 74 69 6f 6e 20 76 61 6c  oad fraction val
162e0 75 65 73 20 6d 75 73 74 20 62 65 20 36 34 2c 20  ues must be 64, 
162f0 33 32 2c 20 61 6e 64 20 33 32 2e 0a 20 20 20 20  32, and 32..    
16300 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 72  **.    ** The or
16310 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c  iginal design al
16320 6c 6f 77 65 64 20 74 68 65 73 65 20 61 6d 6f 75  lowed these amou
16330 6e 74 73 20 74 6f 20 76 61 72 79 2c 20 62 75 74  nts to vary, but
16340 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65   as of.    ** ve
16350 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20  rsion 3.6.0, we 
16360 72 65 71 75 69 72 65 20 74 68 65 6d 20 74 6f 20  require them to 
16370 62 65 20 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f  be fixed..    */
16380 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28  .    if( memcmp(
16390 26 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30  &page1[21], "\10
163a0 30 5c 30 34 30 5c 30 34 30 22 2c 33 29 21 3d 30  0\040\040",3)!=0
163b0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
163c0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
163d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45  ;.    }.    /* E
163e0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31  VIDENCE-OF: R-51
163f0 38 37 33 2d 33 39 36 31 38 20 54 68 65 20 70 61  873-39618 The pa
16400 67 65 20 73 69 7a 65 20 66 6f 72 20 61 20 64 61  ge size for a da
16410 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 20  tabase file is. 
16420 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64     ** determined
16430 20 62 79 20 74 68 65 20 32 2d 62 79 74 65 20 69   by the 2-byte i
16440 6e 74 65 67 65 72 20 6c 6f 63 61 74 65 64 20 61  nteger located a
16450 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 31  t an offset of 1
16460 36 20 62 79 74 65 73 20 66 72 6f 6d 0a 20 20 20  6 bytes from.   
16470 20 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   ** the beginnin
16480 67 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  g of the databas
16490 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70  e file. */.    p
164a0 61 67 65 53 69 7a 65 20 3d 20 28 70 61 67 65 31  ageSize = (page1
164b0 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 70 61 67 65  [16]<<8) | (page
164c0 31 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20  1[17]<<16);.    
164d0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
164e0 52 2d 32 35 30 30 38 2d 32 31 36 38 38 20 54 68  R-25008-21688 Th
164f0 65 20 73 69 7a 65 20 6f 66 20 61 20 70 61 67 65  e size of a page
16500 20 69 73 20 61 20 70 6f 77 65 72 20 6f 66 20 74   is a power of t
16510 77 6f 0a 20 20 20 20 2a 2a 20 62 65 74 77 65 65  wo.    ** betwee
16520 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33 36 20  n 512 and 65536 
16530 69 6e 63 6c 75 73 69 76 65 2e 20 2a 2f 0a 20 20  inclusive. */.  
16540 20 20 69 66 28 20 28 28 70 61 67 65 53 69 7a 65    if( ((pageSize
16550 2d 31 29 26 70 61 67 65 53 69 7a 65 29 21 3d 30  -1)&pageSize)!=0
16560 0a 20 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a  .     || pageSiz
16570 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  e>SQLITE_MAX_PAG
16580 45 5f 53 49 5a 45 20 0a 20 20 20 20 20 7c 7c 20  E_SIZE .     || 
16590 70 61 67 65 53 69 7a 65 3c 3d 32 35 36 20 0a 20  pageSize<=256 . 
165a0 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f     ){.      goto
165b0 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
165c0 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ed;.    }.    as
165d0 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20  sert( (pageSize 
165e0 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 2f  & 7)==0 );.    /
165f0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
16600 2d 35 39 33 31 30 2d 35 31 32 30 35 20 54 68 65  -59310-51205 The
16610 20 22 72 65 73 65 72 76 65 64 20 73 70 61 63 65   "reserved space
16620 22 20 73 69 7a 65 20 69 6e 20 74 68 65 20 31 2d  " size in the 1-
16630 62 79 74 65 0a 20 20 20 20 2a 2a 20 69 6e 74 65  byte.    ** inte
16640 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 32 30  ger at offset 20
16650 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
16660 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
16670 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 0a 20   at the end of. 
16680 20 20 20 2a 2a 20 65 61 63 68 20 70 61 67 65 20     ** each page 
16690 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20 65  to reserve for e
166a0 78 74 65 6e 73 69 6f 6e 73 2e 20 0a 20 20 20 20  xtensions. .    
166b0 2a 2a 0a 20 20 20 20 2a 2a 20 45 56 49 44 45 4e  **.    ** EVIDEN
166c0 43 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34  CE-OF: R-37497-4
166d0 32 34 31 32 20 54 68 65 20 73 69 7a 65 20 6f 66  2412 The size of
166e0 20 74 68 65 20 72 65 73 65 72 76 65 64 20 72 65   the reserved re
166f0 67 69 6f 6e 20 69 73 0a 20 20 20 20 2a 2a 20 64  gion is.    ** d
16700 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
16710 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69 67 6e   one-byte unsign
16720 65 64 20 69 6e 74 65 67 65 72 20 66 6f 75 6e 64  ed integer found
16730 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66   at an offset of
16740 20 32 30 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20   20.    ** into 
16750 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
16760 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20  e header. */.   
16770 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61   usableSize = pa
16780 67 65 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32  geSize - page1[2
16790 30 5d 3b 0a 20 20 20 20 69 66 28 20 28 75 33 32  0];.    if( (u32
167a0 29 70 61 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e  )pageSize!=pBt->
167b0 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  pageSize ){.    
167c0 20 20 2f 2a 20 41 66 74 65 72 20 72 65 61 64 69    /* After readi
167d0 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67  ng the first pag
167e0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
167f0 65 20 61 73 73 75 6d 69 6e 67 20 61 20 70 61 67  e assuming a pag
16800 65 20 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20  e size.      ** 
16810 6f 66 20 42 74 53 68 61 72 65 64 2e 70 61 67 65  of BtShared.page
16820 53 69 7a 65 2c 20 77 65 20 68 61 76 65 20 64 69  Size, we have di
16830 73 63 6f 76 65 72 65 64 20 74 68 61 74 20 74 68  scovered that th
16840 65 20 70 61 67 65 2d 73 69 7a 65 20 69 73 0a 20  e page-size is. 
16850 20 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79       ** actually
16860 20 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63   pageSize. Unloc
16870 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  k the database, 
16880 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65  leave pBt->pPage
16890 31 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65  1 at.      ** ze
168a0 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ro and return SQ
168b0 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c  LITE_OK. The cal
168c0 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68  ler will call th
168d0 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20  is function.    
168e0 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 20    ** again with 
168f0 74 68 65 20 63 6f 72 72 65 63 74 20 70 61 67 65  the correct page
16900 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  -size..      */.
16910 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
16920 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20  e(pPage1);.     
16930 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
16940 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20   = usableSize;. 
16950 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69       pBt->pageSi
16960 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20  ze = pageSize;. 
16970 20 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61       freeTempSpa
16980 63 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72  ce(pBt);.      r
16990 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
169a0 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
169b0 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
169c0 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20  ageSize,.       
169d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
169e0 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65              page
169f0 53 69 7a 65 2d 75 73 61 62 6c 65 53 69 7a 65 29  Size-usableSize)
16a00 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
16a10 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
16a20 20 28 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73   (pBt->db->flags
16a30 20 26 20 53 51 4c 49 54 45 5f 52 65 63 6f 76 65   & SQLITE_Recove
16a40 72 79 4d 6f 64 65 29 3d 3d 30 20 26 26 20 6e 50  ryMode)==0 && nP
16a50 61 67 65 3e 6e 50 61 67 65 46 69 6c 65 20 29 7b  age>nPageFile ){
16a60 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
16a70 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
16a80 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
16a90 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
16aa0 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44     }.    /* EVID
16ab0 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 33 31 32  ENCE-OF: R-28312
16ac0 2d 36 34 37 30 34 20 48 6f 77 65 76 65 72 2c 20  -64704 However, 
16ad0 74 68 65 20 75 73 61 62 6c 65 20 73 69 7a 65 20  the usable size 
16ae0 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74  is not allowed t
16af0 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6c 65 73 73  o.    ** be less
16b00 20 74 68 61 6e 20 34 38 30 2e 20 49 6e 20 6f 74   than 480. In ot
16b10 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68  her words, if th
16b20 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 35  e page size is 5
16b30 31 32 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20  12, then the.   
16b40 20 2a 2a 20 72 65 73 65 72 76 65 64 20 73 70 61   ** reserved spa
16b50 63 65 20 73 69 7a 65 20 63 61 6e 6e 6f 74 20 65  ce size cannot e
16b60 78 63 65 65 64 20 33 32 2e 20 2a 2f 0a 20 20 20  xceed 32. */.   
16b70 20 69 66 28 20 75 73 61 62 6c 65 53 69 7a 65 3c   if( usableSize<
16b80 34 38 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  480 ){.      got
16b90 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
16ba0 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  led;.    }.    p
16bb0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  Bt->pageSize = p
16bc0 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 42 74  ageSize;.    pBt
16bd0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75  ->usableSize = u
16be0 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64  sableSize;.#ifnd
16bf0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
16c00 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42  UTOVACUUM.    pB
16c10 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
16c20 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31  (get4byte(&page1
16c30 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29  [36 + 4*4])?1:0)
16c40 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56  ;.    pBt->incrV
16c50 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
16c60 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37 2a  e(&page1[36 + 7*
16c70 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66  4])?1:0);.#endif
16c80 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f  .  }..  /* maxLo
16c90 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69 6d  cal is the maxim
16ca0 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79  um amount of pay
16cb0 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f  load to store lo
16cc0 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61  cally for.  ** a
16cd0 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72   cell.  Make sur
16ce0 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e  e it is small en
16cf0 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61 74 20  ough so that at 
16d00 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a  least minFanout.
16d10 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77    ** cells can w
16d20 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70  ill fit on one p
16d30 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65 20  age.  We assume 
16d40 61 20 31 30 2d 62 79 74 65 20 70 61 67 65 20 68  a 10-byte page h
16d50 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69  eader..  ** Besi
16d60 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c  des the payload,
16d70 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73   the cell must s
16d80 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32  tore:.  **     2
16d90 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f  -byte pointer to
16da0 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20   the cell.  **  
16db0 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20     4-byte child 
16dc0 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20  pointer.  **    
16dd0 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 6c   9-byte nKey val
16de0 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79  ue.  **     4-by
16df0 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a 20  te nData value. 
16e00 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6f   **     4-byte o
16e10 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69  verflow page poi
16e20 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63  nter.  ** So a c
16e30 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ell consists of 
16e40 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72  a 2-byte pointer
16e50 2c 20 61 20 68 65 61 64 65 72 20 77 68 69 63 68  , a header which
16e60 20 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20   is as much as. 
16e70 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e   ** 17 bytes lon
16e80 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20  g, 0 to N bytes 
16e90 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20  of payload, and 
16ea0 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79  an optional 4 by
16eb0 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a  te overflow.  **
16ec0 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20   page pointer.. 
16ed0 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f   */.  pBt->maxLo
16ee0 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74  cal = (u16)((pBt
16ef0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
16f00 2a 36 34 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20  *64/255 - 23);. 
16f10 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d   pBt->minLocal =
16f20 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61   (u16)((pBt->usa
16f30 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32  bleSize-12)*32/2
16f40 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d  55 - 23);.  pBt-
16f50 3e 6d 61 78 4c 65 61 66 20 3d 20 28 75 31 36 29  >maxLeaf = (u16)
16f60 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
16f70 20 2d 20 33 35 29 3b 0a 20 20 70 42 74 2d 3e 6d   - 35);.  pBt->m
16f80 69 6e 4c 65 61 66 20 3d 20 28 75 31 36 29 28 28  inLeaf = (u16)((
16f90 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
16fa0 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29  12)*32/255 - 23)
16fb0 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6d 61 78  ;.  if( pBt->max
16fc0 4c 6f 63 61 6c 3e 31 32 37 20 29 7b 0a 20 20 20  Local>127 ){.   
16fd0 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61   pBt->max1bytePa
16fe0 79 6c 6f 61 64 20 3d 20 31 32 37 3b 0a 20 20 7d  yload = 127;.  }
16ff0 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 6d  else{.    pBt->m
17000 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d  ax1bytePayload =
17010 20 28 75 38 29 70 42 74 2d 3e 6d 61 78 4c 6f 63   (u8)pBt->maxLoc
17020 61 6c 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  al;.  }.  assert
17030 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b  ( pBt->maxLeaf +
17040 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53   23 <= MX_CELL_S
17050 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 70 42  IZE(pBt) );.  pB
17060 74 2d 3e 70 50 61 67 65 31 20 3d 20 70 50 61 67  t->pPage1 = pPag
17070 65 31 3b 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65  e1;.  pBt->nPage
17080 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75   = nPage;.  retu
17090 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70  rn SQLITE_OK;..p
170a0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
170b0 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  :.  releasePage(
170c0 70 50 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e  pPage1);.  pBt->
170d0 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65  pPage1 = 0;.  re
170e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
170f0 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a  def NDEBUG./*.**
17100 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
17110 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 6f 70  er of cursors op
17120 65 6e 20 6f 6e 20 70 42 74 2e 20 54 68 69 73 20  en on pBt. This 
17130 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e  is for use.** in
17140 20 61 73 73 65 72 74 28 29 20 65 78 70 72 65 73   assert() expres
17150 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20  sions, so it is 
17160 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66  only compiled if
17170 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a   NDEBUG is not.*
17180 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a  * defined..**.**
17190 20 4f 6e 6c 79 20 77 72 69 74 65 20 63 75 72 73   Only write curs
171a0 6f 72 73 20 61 72 65 20 63 6f 75 6e 74 65 64 20  ors are counted 
171b0 69 66 20 77 72 4f 6e 6c 79 20 69 73 20 74 72 75  if wrOnly is tru
171c0 65 2e 20 20 49 66 20 77 72 4f 6e 6c 79 20 69 73  e.  If wrOnly is
171d0 0a 2a 2a 20 66 61 6c 73 65 20 74 68 65 6e 20 61  .** false then a
171e0 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65 20 63  ll cursors are c
171f0 6f 75 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f  ounted..**.** Fo
17200 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f  r the purposes o
17210 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  f this routine, 
17220 61 20 63 75 72 73 6f 72 20 69 73 20 61 6e 79 20  a cursor is any 
17230 63 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69  cursor that.** i
17240 73 20 63 61 70 61 62 6c 65 20 6f 66 20 72 65 61  s capable of rea
17250 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
17260 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
17270 20 20 43 75 72 73 6f 72 73 20 74 68 61 74 0a 2a    Cursors that.*
17280 2a 20 68 61 76 65 20 62 65 65 6e 20 74 72 69 70  * have been trip
17290 70 65 64 20 69 6e 74 6f 20 74 68 65 20 43 55 52  ped into the CUR
172a0 53 4f 52 5f 46 41 55 4c 54 20 73 74 61 74 65 20  SOR_FAULT state 
172b0 61 72 65 20 6e 6f 74 20 63 6f 75 6e 74 65 64 2e  are not counted.
172c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
172d0 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73  ountValidCursors
172e0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
172f0 69 6e 74 20 77 72 4f 6e 6c 79 29 7b 0a 20 20 42  int wrOnly){.  B
17300 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20  tCursor *pCur;. 
17310 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f   int r = 0;.  fo
17320 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72  r(pCur=pBt->pCur
17330 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d  sor; pCur; pCur=
17340 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pCur->pNext){.  
17350 20 20 69 66 28 20 28 77 72 4f 6e 6c 79 3d 3d 30    if( (wrOnly==0
17360 20 7c 7c 20 28 70 43 75 72 2d 3e 63 75 72 46 6c   || (pCur->curFl
17370 61 67 73 20 26 20 42 54 43 46 5f 57 72 69 74 65  ags & BTCF_Write
17380 46 6c 61 67 29 21 3d 30 29 0a 20 20 20 20 20 26  Flag)!=0).     &
17390 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  & pCur->eState!=
173a0 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 20 72  CURSOR_FAULT ) r
173b0 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72  ++; .  }.  retur
173c0 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n r;.}.#endif../
173d0 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
173e0 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
173f0 20 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20   cursors and we 
17400 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d  are not in the m
17410 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72  iddle.** of a tr
17420 61 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68  ansaction but th
17430 65 72 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f  ere is a read lo
17440 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
17450 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73  se, then.** this
17460 20 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20   routine unrefs 
17470 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
17480 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
17490 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61  ile which .** ha
174a0 73 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20  s the effect of 
174b0 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65  releasing the re
174c0 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  ad lock..**.** I
174d0 66 20 74 68 65 72 65 20 69 73 20 61 20 74 72 61  f there is a tra
174e0 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67  nsaction in prog
174f0 72 65 73 73 2c 20 74 68 69 73 20 72 6f 75 74 69  ress, this routi
17500 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
17510 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
17520 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
17530 64 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  d(BtShared *pBt)
17540 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
17550 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
17560 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
17570 61 73 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c  assert( countVal
17580 69 64 43 75 72 73 6f 72 73 28 70 42 74 2c 30 29  idCursors(pBt,0)
17590 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72  ==0 || pBt->inTr
175a0 61 6e 73 61 63 74 69 6f 6e 3e 54 52 41 4e 53 5f  ansaction>TRANS_
175b0 4e 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 70 42  NONE );.  if( pB
175c0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
175d0 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20  ==TRANS_NONE && 
175e0 70 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29  pBt->pPage1!=0 )
175f0 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  {.    MemPage *p
17600 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
17610 67 65 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ge1;.    assert(
17620 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29   pPage1->aData )
17630 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
17640 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
17650 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d  nt(pBt->pPager)=
17660 3d 31 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70  =1 );.    pBt->p
17670 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 72  Page1 = 0;.    r
17680 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
17690 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  1);.  }.}../*.**
176a0 20 49 66 20 70 42 74 20 70 6f 69 6e 74 73 20 74   If pBt points t
176b0 6f 20 61 6e 20 65 6d 70 74 79 20 66 69 6c 65 20  o an empty file 
176c0 74 68 65 6e 20 63 6f 6e 76 65 72 74 20 74 68 61  then convert tha
176d0 74 20 65 6d 70 74 79 20 66 69 6c 65 0a 2a 2a 20  t empty file.** 
176e0 69 6e 74 6f 20 61 20 6e 65 77 20 65 6d 70 74 79  into a new empty
176f0 20 64 61 74 61 62 61 73 65 20 62 79 20 69 6e 69   database by ini
17700 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69  tializing the fi
17710 72 73 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74  rst page of.** t
17720 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  he database..*/.
17730 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77 44 61  static int newDa
17740 74 61 62 61 73 65 28 42 74 53 68 61 72 65 64 20  tabase(BtShared 
17750 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65  *pBt){.  MemPage
17760 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65   *pP1;.  unsigne
17770 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20  d char *data;.  
17780 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
17790 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
177a0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
177b0 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  ) );.  if( pBt->
177c0 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 72  nPage>0 ){.    r
177d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
177e0 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 70 42 74  .  }.  pP1 = pBt
177f0 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73 73 65  ->pPage1;.  asse
17800 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a 20 20  rt( pP1!=0 );.  
17810 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44 61 74  data = pP1->aDat
17820 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  a;.  rc = sqlite
17830 33 50 61 67 65 72 57 72 69 74 65 28 70 50 31 2d  3PagerWrite(pP1-
17840 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  >pDbPage);.  if(
17850 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
17860 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2c 20  .  memcpy(data, 
17870 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 73 69  zMagicHeader, si
17880 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65  zeof(zMagicHeade
17890 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  r));.  assert( s
178a0 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64  izeof(zMagicHead
178b0 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 64 61 74  er)==16 );.  dat
178c0 61 5b 31 36 5d 20 3d 20 28 75 38 29 28 28 70 42  a[16] = (u8)((pB
178d0 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 38 29 26  t->pageSize>>8)&
178e0 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 37  0xff);.  data[17
178f0 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70  ] = (u8)((pBt->p
17900 61 67 65 53 69 7a 65 3e 3e 31 36 29 26 30 78 66  ageSize>>16)&0xf
17910 66 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d  f);.  data[18] =
17920 20 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d   1;.  data[19] =
17930 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   1;.  assert( pB
17940 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70  t->usableSize<=p
17950 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 26 20  Bt->pageSize && 
17960 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b  pBt->usableSize+
17970 32 35 35 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69  255>=pBt->pageSi
17980 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20  ze);.  data[20] 
17990 3d 20 28 75 38 29 28 70 42 74 2d 3e 70 61 67 65  = (u8)(pBt->page
179a0 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62  Size - pBt->usab
179b0 6c 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b  leSize);.  data[
179c0 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74 61  21] = 64;.  data
179d0 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74  [22] = 32;.  dat
179e0 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65  a[23] = 32;.  me
179f0 6d 73 65 74 28 26 64 61 74 61 5b 32 34 5d 2c 20  mset(&data[24], 
17a00 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65  0, 100-24);.  ze
17a10 72 6f 50 61 67 65 28 70 50 31 2c 20 50 54 46 5f  roPage(pP1, PTF_
17a20 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c  INTKEY|PTF_LEAF|
17a30 50 54 46 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a  PTF_LEAFDATA );.
17a40 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
17a50 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f  |= BTS_PAGESIZE_
17a60 46 49 58 45 44 3b 0a 23 69 66 6e 64 65 66 20 53  FIXED;.#ifndef S
17a70 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
17a80 41 43 55 55 4d 0a 20 20 61 73 73 65 72 74 28 20  ACUUM.  assert( 
17a90 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d  pBt->autoVacuum=
17aa0 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56  =1 || pBt->autoV
17ab0 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73  acuum==0 );.  as
17ac0 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 63 72 56  sert( pBt->incrV
17ad0 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d  acuum==1 || pBt-
17ae0 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20 29  >incrVacuum==0 )
17af0 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61  ;.  put4byte(&da
17b00 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42  ta[36 + 4*4], pB
17b10 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a  t->autoVacuum);.
17b20 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61    put4byte(&data
17b30 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d  [36 + 7*4], pBt-
17b40 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23 65  >incrVacuum);.#e
17b50 6e 64 69 66 0a 20 20 70 42 74 2d 3e 6e 50 61 67  ndif.  pBt->nPag
17b60 65 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 33 31  e = 1;.  data[31
17b70 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  ] = 1;.  return 
17b80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
17b90 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
17ba0 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
17bb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
17bc0 6c 65 20 28 63 72 65 61 74 69 6e 67 20 61 20 64  le (creating a d
17bd0 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 73 69  atabase.** consi
17be0 73 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c  sting of a singl
17bf0 65 20 70 61 67 65 20 61 6e 64 20 6e 6f 20 73 63  e page and no sc
17c00 68 65 6d 61 20 6f 62 6a 65 63 74 73 29 2e 20 52  hema objects). R
17c10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
17c20 2a 2a 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  ** if successful
17c30 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65  , or an SQLite e
17c40 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77  rror code otherw
17c50 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ise..*/.int sqli
17c60 74 65 33 42 74 72 65 65 4e 65 77 44 62 28 42 74  te3BtreeNewDb(Bt
17c70 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
17c80 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
17c90 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e  eEnter(p);.  p->
17ca0 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a  pBt->nPage = 0;.
17cb0 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61    rc = newDataba
17cc0 73 65 28 70 2d 3e 70 42 74 29 3b 0a 20 20 73 71  se(p->pBt);.  sq
17cd0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
17ce0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
17cf0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  .}../*.** Attemp
17d00 74 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77  t to start a new
17d10 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20   transaction. A 
17d20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
17d30 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74 65 64 20  n.** is started 
17d40 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  if the second ar
17d50 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72  gument is nonzer
17d60 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 61 20 72  o, otherwise a r
17d70 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74  ead-.** transact
17d80 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63  ion.  If the sec
17d90 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
17da0 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65 78  2 or more and ex
17db0 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73  clusive.** trans
17dc0 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65  action is starte
17dd0 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  d, meaning that 
17de0 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  no other process
17df0 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74   is allowed.** t
17e00 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
17e10 61 62 61 73 65 2e 20 20 41 20 70 72 65 65 78 69  abase.  A preexi
17e20 73 74 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f  sting transactio
17e30 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20  n may not be.** 
17e40 75 70 67 72 61 64 65 64 20 74 6f 20 65 78 63 6c  upgraded to excl
17e50 75 73 69 76 65 20 62 79 20 63 61 6c 6c 69 6e 67  usive by calling
17e60 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 20   this routine a 
17e70 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68  second time - th
17e80 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69 74 79  e.** exclusivity
17e90 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73   flag only works
17ea0 20 66 6f 72 20 61 20 6e 65 77 20 74 72 61 6e 73   for a new trans
17eb0 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20  action..**.** A 
17ec0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
17ed0 6e 20 6d 75 73 74 20 62 65 20 73 74 61 72 74 65  n must be starte
17ee0 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74  d before attempt
17ef0 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e  ing any .** chan
17f00 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ges to the datab
17f10 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68  ase.  None of th
17f20 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74  e following rout
17f30 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f  ines .** will wo
17f40 72 6b 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e  rk unless a tran
17f50 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74  saction is start
17f60 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20  ed first:.**.** 
17f70 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
17f80 65 43 72 65 61 74 65 54 61 62 6c 65 28 29 0a 2a  eCreateTable().*
17f90 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
17fa0 72 65 65 43 72 65 61 74 65 49 6e 64 65 78 28 29  reeCreateIndex()
17fb0 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
17fc0 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28  BtreeClearTable(
17fd0 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
17fe0 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28  3BtreeDropTable(
17ff0 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
18000 33 42 74 72 65 65 49 6e 73 65 72 74 28 29 0a 2a  3BtreeInsert().*
18010 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
18020 72 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20  reeDelete().**  
18030 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
18040 55 70 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a  UpdateMeta().**.
18050 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74 69 61 6c  ** If an initial
18060 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63 71 75   attempt to acqu
18070 69 72 65 20 74 68 65 20 6c 6f 63 6b 20 66 61 69  ire the lock fai
18080 6c 73 20 62 65 63 61 75 73 65 20 6f 66 20 6c 6f  ls because of lo
18090 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a  ck contention.**
180a0 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
180b0 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  e was previously
180c0 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20   unlocked, then 
180d0 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  invoke the busy 
180e0 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68  handler.** if th
180f0 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 42 75 74  ere is one.  But
18100 20 69 66 20 74 68 65 72 65 20 77 61 73 20 70 72   if there was pr
18110 65 76 69 6f 75 73 6c 79 20 61 20 72 65 61 64 2d  eviously a read-
18120 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20  lock, do not.** 
18130 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  invoke the busy 
18140 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20 72  handler - just r
18150 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
18160 59 2e 20 20 53 51 4c 49 54 45 5f 42 55 53 59 20  Y.  SQLITE_BUSY 
18170 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  is .** returned 
18180 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 6c  when there is al
18190 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63  ready a read-loc
181a0 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76  k in order to av
181b0 6f 69 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a  oid a deadlock..
181c0 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68  **.** Suppose th
181d0 65 72 65 20 61 72 65 20 74 77 6f 20 70 72 6f 63  ere are two proc
181e0 65 73 73 65 73 20 41 20 61 6e 64 20 42 2e 20 20  esses A and B.  
181f0 41 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63  A has a read loc
18200 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61  k and B has.** a
18210 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20   reserved lock. 
18220 20 42 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d   B tries to prom
18230 6f 74 65 20 74 6f 20 65 78 63 6c 75 73 69 76 65  ote to exclusive
18240 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20   but is blocked 
18250 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27  because.** of A'
18260 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20  s read lock.  A 
18270 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65  tries to promote
18280 20 74 6f 20 72 65 73 65 72 76 65 64 20 62 75 74   to reserved but
18290 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 79 20 42   is blocked by B
182a0 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20  ..** One or the 
182b0 6f 74 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f  other of the two
182c0 20 70 72 6f 63 65 73 73 65 73 20 6d 75 73 74 20   processes must 
182d0 67 69 76 65 20 77 61 79 20 6f 72 20 74 68 65 72  give way or ther
182e0 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70  e can be.** no p
182f0 72 6f 67 72 65 73 73 2e 20 20 42 79 20 72 65 74  rogress.  By ret
18300 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42 55  urning SQLITE_BU
18310 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b  SY and not invok
18320 69 6e 67 20 74 68 65 20 62 75 73 79 20 63 61 6c  ing the busy cal
18330 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20  lback.** when A 
18340 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 72 65  already has a re
18350 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f  ad lock, we enco
18360 75 72 61 67 65 20 41 20 74 6f 20 67 69 76 65 20  urage A to give 
18370 75 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20  up and let B.** 
18380 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20  proceed..*/.int 
18390 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69  sqlite3BtreeBegi
183a0 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70 2c  nTrans(Btree *p,
183b0 20 69 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20 20   int wrflag){.  
183c0 73 71 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20  sqlite3 *pBlock 
183d0 3d 20 30 3b 0a 20 20 42 74 53 68 61 72 65 64 20  = 0;.  BtShared 
183e0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
183f0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
18400 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  _OK;..  sqlite3B
18410 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
18420 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
18430 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
18440 62 74 72 65 65 20 69 73 20 61 6c 72 65 61 64 79  btree is already
18450 20 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e   in a write-tran
18460 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20  saction, or it. 
18470 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69   ** is already i
18480 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  n a read-transac
18490 74 69 6f 6e 20 61 6e 64 20 61 20 72 65 61 64 2d  tion and a read-
184a0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a  transaction.  **
184b0 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74   is requested, t
184c0 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  his is a no-op..
184d0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e    */.  if( p->in
184e0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
184f0 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e  TE || (p->inTran
18500 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 26 26  s==TRANS_READ &&
18510 20 21 77 72 66 6c 61 67 29 20 29 7b 0a 20 20 20   !wrflag) ){.   
18520 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75   goto trans_begu
18530 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
18540 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
18550 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
18560 20 7c 7c 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28   || IfNotOmitAV(
18570 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65  pBt->bDoTruncate
18580 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 72  )==0 );..  /* Wr
18590 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ite transactions
185a0 20 61 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c   are not possibl
185b0 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79  e on a read-only
185c0 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
185d0 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  f( (pBt->btsFlag
185e0 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c  s & BTS_READ_ONL
185f0 59 29 21 3d 30 20 26 26 20 77 72 66 6c 61 67 20  Y)!=0 && wrflag 
18600 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
18610 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  TE_READONLY;.   
18620 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75   goto trans_begu
18630 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  n;.  }..#ifndef 
18640 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
18650 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a 20 49 66  ED_CACHE.  /* If
18660 20 61 6e 6f 74 68 65 72 20 64 61 74 61 62 61 73   another databas
18670 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6c 72  e handle has alr
18680 65 61 64 79 20 6f 70 65 6e 65 64 20 61 20 77 72  eady opened a wr
18690 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
186a0 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68  .  ** on this sh
186b0 61 72 65 64 2d 62 74 72 65 65 20 73 74 72 75 63  ared-btree struc
186c0 74 75 72 65 20 61 6e 64 20 61 20 73 65 63 6f 6e  ture and a secon
186d0 64 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  d write transact
186e0 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65 71 75  ion is.  ** requ
186f0 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51  ested, return SQ
18700 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20 2a  LITE_LOCKED..  *
18710 2f 0a 20 20 69 66 28 20 28 77 72 66 6c 61 67 20  /.  if( (wrflag 
18720 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  && pBt->inTransa
18730 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
18740 54 45 29 0a 20 20 20 7c 7c 20 28 70 42 74 2d 3e  TE).   || (pBt->
18750 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50  btsFlags & BTS_P
18760 45 4e 44 49 4e 47 29 21 3d 30 0a 20 20 29 7b 0a  ENDING)!=0.  ){.
18770 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 42 74      pBlock = pBt
18780 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 3b 0a 20  ->pWriter->db;. 
18790 20 7d 65 6c 73 65 20 69 66 28 20 77 72 66 6c 61   }else if( wrfla
187a0 67 3e 31 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63  g>1 ){.    BtLoc
187b0 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 66 6f  k *pIter;.    fo
187c0 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f  r(pIter=pBt->pLo
187d0 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72  ck; pIter; pIter
187e0 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a  =pIter->pNext){.
187f0 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
18800 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a 20 20  >pBtree!=p ){.  
18810 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70        pBlock = p
18820 49 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  Iter->pBtree->db
18830 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
18840 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18850 20 7d 0a 20 20 69 66 28 20 70 42 6c 6f 63 6b 20   }.  if( pBlock 
18860 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  ){.    sqlite3Co
18870 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28  nnectionBlocked(
18880 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a  p->db, pBlock);.
18890 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
188a0 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43  LOCKED_SHAREDCAC
188b0 48 45 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61  HE;.    goto tra
188c0 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 23 65  ns_begun;.  }.#e
188d0 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 79 20 72  ndif..  /* Any r
188e0 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 72 65 61 64  ead-only or read
188f0 2d 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69  -write transacti
18900 6f 6e 20 69 6d 70 6c 69 65 73 20 61 20 72 65 61  on implies a rea
18910 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20  d-lock on .  ** 
18920 70 61 67 65 20 31 2e 20 53 6f 20 69 66 20 73 6f  page 1. So if so
18930 6d 65 20 6f 74 68 65 72 20 73 68 61 72 65 64 2d  me other shared-
18940 63 61 63 68 65 20 63 6c 69 65 6e 74 20 61 6c 72  cache client alr
18950 65 61 64 79 20 68 61 73 20 61 20 77 72 69 74 65  eady has a write
18960 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70  -lock .  ** on p
18970 61 67 65 20 31 2c 20 74 68 65 20 74 72 61 6e 73  age 1, the trans
18980 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65  action cannot be
18990 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 72 63   opened. */.  rc
189a0 20 3d 20 71 75 65 72 79 53 68 61 72 65 64 43 61   = querySharedCa
189b0 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20  cheTableLock(p, 
189c0 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41  MASTER_ROOT, REA
189d0 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 53  D_LOCK);.  if( S
189e0 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 20 67  QLITE_OK!=rc ) g
189f0 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
18a00 0a 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  ..  pBt->btsFlag
18a10 73 20 26 3d 20 7e 42 54 53 5f 49 4e 49 54 49 41  s &= ~BTS_INITIA
18a20 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 69 66 28  LLY_EMPTY;.  if(
18a30 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 30 20 29   pBt->nPage==0 )
18a40 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
18a50 3d 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f  = BTS_INITIALLY_
18a60 45 4d 50 54 59 3b 0a 20 20 64 6f 20 7b 0a 20 20  EMPTY;.  do {.  
18a70 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63 6b 42 74    /* Call lockBt
18a80 72 65 65 28 29 20 75 6e 74 69 6c 20 65 69 74 68  ree() until eith
18a90 65 72 20 70 42 74 2d 3e 70 50 61 67 65 31 20 69  er pBt->pPage1 i
18aa0 73 20 70 6f 70 75 6c 61 74 65 64 20 6f 72 0a 20  s populated or. 
18ab0 20 20 20 2a 2a 20 6c 6f 63 6b 42 74 72 65 65 28     ** lockBtree(
18ac0 29 20 72 65 74 75 72 6e 73 20 73 6f 6d 65 74 68  ) returns someth
18ad0 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 53  ing other than S
18ae0 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74  QLITE_OK. lockBt
18af0 72 65 65 28 29 0a 20 20 20 20 2a 2a 20 6d 61 79  ree().    ** may
18b00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18b10 4b 20 62 75 74 20 6c 65 61 76 65 20 70 42 74 2d  K but leave pBt-
18b20 3e 70 50 61 67 65 31 20 73 65 74 20 74 6f 20 30  >pPage1 set to 0
18b30 20 69 66 20 61 66 74 65 72 0a 20 20 20 20 2a 2a   if after.    **
18b40 20 72 65 61 64 69 6e 67 20 70 61 67 65 20 31 20   reading page 1 
18b50 69 74 20 64 69 73 63 6f 76 65 72 73 20 74 68 61  it discovers tha
18b60 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  t the page-size 
18b70 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
18b80 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 69 73 20  .    ** file is 
18b90 6e 6f 74 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  not pBt->pageSiz
18ba0 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
18bb0 6c 6f 63 6b 42 74 72 65 65 28 29 20 77 69 6c 6c  lockBtree() will
18bc0 20 75 70 64 61 74 65 0a 20 20 20 20 2a 2a 20 70   update.    ** p
18bd0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 74 6f 20  Bt->pageSize to 
18be0 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66  the page-size of
18bf0 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
18c00 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 68  k..    */.    wh
18c10 69 6c 65 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ile( pBt->pPage1
18c20 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b  ==0 && SQLITE_OK
18c30 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65  ==(rc = lockBtre
18c40 65 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 20 20  e(pBt)) );..    
18c50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
18c60 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  K && wrflag ){. 
18c70 20 20 20 20 20 69 66 28 20 28 70 42 74 2d 3e 62       if( (pBt->b
18c80 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45  tsFlags & BTS_RE
18c90 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a 20  AD_ONLY)!=0 ){. 
18ca0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
18cb0 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  TE_READONLY;.   
18cc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18cd0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
18ce0 67 65 72 42 65 67 69 6e 28 70 42 74 2d 3e 70 50  gerBegin(pBt->pP
18cf0 61 67 65 72 2c 77 72 66 6c 61 67 3e 31 2c 73 71  ager,wrflag>1,sq
18d00 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72  lite3TempInMemor
18d10 79 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20  y(p->db));.     
18d20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
18d30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
18d40 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61    rc = newDataba
18d50 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20  se(pBt);.       
18d60 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
18d70 0a 20 20 0a 20 20 20 20 69 66 28 20 72 63 21 3d  .  .    if( rc!=
18d80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18d90 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66     unlockBtreeIf
18da0 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20  Unused(pBt);.   
18db0 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 28 72 63   }.  }while( (rc
18dc0 26 30 78 46 46 29 3d 3d 53 51 4c 49 54 45 5f 42  &0xFF)==SQLITE_B
18dd0 55 53 59 20 26 26 20 70 42 74 2d 3e 69 6e 54 72  USY && pBt->inTr
18de0 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
18df0 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20 20 20  _NONE &&.       
18e00 20 20 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75     btreeInvokeBu
18e10 73 79 48 61 6e 64 6c 65 72 28 70 42 74 29 20 29  syHandler(pBt) )
18e20 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
18e30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
18e40 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
18e50 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  ANS_NONE ){.    
18e60 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74    pBt->nTransact
18e70 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53  ion++;.#ifndef S
18e80 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
18e90 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20 69 66  D_CACHE.      if
18ea0 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b  ( p->sharable ){
18eb0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
18ec0 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 3d   p->lock.pBtree=
18ed0 3d 70 20 26 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54  =p && p->lock.iT
18ee0 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20  able==1 );.     
18ef0 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b     p->lock.eLock
18f00 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20   = READ_LOCK;.  
18f10 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e        p->lock.pN
18f20 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b  ext = pBt->pLock
18f30 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 70  ;.        pBt->p
18f40 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b  Lock = &p->lock;
18f50 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
18f60 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54      }.    p->inT
18f70 72 61 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f 54  rans = (wrflag?T
18f80 52 41 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e 53  RANS_WRITE:TRANS
18f90 5f 52 45 41 44 29 3b 0a 20 20 20 20 69 66 28 20  _READ);.    if( 
18fa0 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e  p->inTrans>pBt->
18fb0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b  inTransaction ){
18fc0 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  .      pBt->inTr
18fd0 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69  ansaction = p->i
18fe0 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 20 20  nTrans;.    }.  
18ff0 20 20 69 66 28 20 77 72 66 6c 61 67 20 29 7b 0a    if( wrflag ){.
19000 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
19010 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
19020 67 65 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ge1;.#ifndef SQL
19030 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
19040 43 41 43 48 45 0a 20 20 20 20 20 20 61 73 73 65  CACHE.      asse
19050 72 74 28 20 21 70 42 74 2d 3e 70 57 72 69 74 65  rt( !pBt->pWrite
19060 72 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  r );.      pBt->
19070 70 57 72 69 74 65 72 20 3d 20 70 3b 0a 20 20 20  pWriter = p;.   
19080 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
19090 20 26 3d 20 7e 42 54 53 5f 45 58 43 4c 55 53 49   &= ~BTS_EXCLUSI
190a0 56 45 3b 0a 20 20 20 20 20 20 69 66 28 20 77 72  VE;.      if( wr
190b0 66 6c 61 67 3e 31 20 29 20 70 42 74 2d 3e 62 74  flag>1 ) pBt->bt
190c0 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 45 58  sFlags |= BTS_EX
190d0 43 4c 55 53 49 56 45 3b 0a 23 65 6e 64 69 66 0a  CLUSIVE;.#endif.
190e0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
190f0 20 64 62 2d 73 69 7a 65 20 68 65 61 64 65 72 20   db-size header 
19100 66 69 65 6c 64 20 69 73 20 69 6e 63 6f 72 72 65  field is incorre
19110 63 74 20 28 61 73 20 69 74 20 6d 61 79 20 62 65  ct (as it may be
19120 20 69 66 20 61 6e 20 6f 6c 64 0a 20 20 20 20 20   if an old.     
19130 20 2a 2a 20 63 6c 69 65 6e 74 20 68 61 73 20 62   ** client has b
19140 65 65 6e 20 77 72 69 74 69 6e 67 20 74 68 65 20  een writing the 
19150 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20  database file), 
19160 75 70 64 61 74 65 20 69 74 20 6e 6f 77 2e 20 44  update it now. D
19170 6f 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68  oing.      ** th
19180 69 73 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72  is sooner rather
19190 20 74 68 61 6e 20 6c 61 74 65 72 20 6d 65 61 6e   than later mean
191a0 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  s the database s
191b0 69 7a 65 20 63 61 6e 20 73 61 66 65 6c 79 20 0a  ize can safely .
191c0 20 20 20 20 20 20 2a 2a 20 72 65 2d 72 65 61 64        ** re-read
191d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
191e0 7a 65 20 66 72 6f 6d 20 70 61 67 65 20 31 20 69  ze from page 1 i
191f0 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 6f 72  f a savepoint or
19200 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20   transaction.   
19210 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6f     ** rollback o
19220 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65  ccurs within the
19230 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
19240 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
19250 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 67 65 74   pBt->nPage!=get
19260 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
19270 44 61 74 61 5b 32 38 5d 29 20 29 7b 0a 20 20 20  Data[28]) ){.   
19280 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
19290 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
192a0 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
192b0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
192c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
192d0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
192e0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d  Page1->aData[28]
192f0 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20  , pBt->nPage);. 
19300 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
19310 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 74 72 61  .    }.  }...tra
19320 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 69 66 28 20  ns_begun:.  if( 
19330 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
19340 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 2f   wrflag ){.    /
19350 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 61 6b 65  * This call make
19360 73 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  s sure that the 
19370 70 61 67 65 72 20 68 61 73 20 74 68 65 20 63 6f  pager has the co
19380 72 72 65 63 74 20 6e 75 6d 62 65 72 20 6f 66 0a  rrect number of.
19390 20 20 20 20 2a 2a 20 6f 70 65 6e 20 73 61 76 65      ** open save
193a0 70 6f 69 6e 74 73 2e 20 49 66 20 74 68 65 20 73  points. If the s
193b0 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20  econd parameter 
193c0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
193d0 30 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74 68 65  0 and.    ** the
193e0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20   sub-journal is 
193f0 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  not already open
19400 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 62  , then it will b
19410 65 20 6f 70 65 6e 65 64 20 68 65 72 65 2e 0a 20  e opened here.. 
19420 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
19430 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53  qlite3PagerOpenS
19440 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50  avepoint(pBt->pP
19450 61 67 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61  ager, p->db->nSa
19460 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 0a 20  vepoint);.  }.. 
19470 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
19480 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
19490 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
194a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
194b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
194c0 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a  AUTOVACUUM../*.*
194d0 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65  * Set the pointe
194e0 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r-map entries fo
194f0 72 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f  r all children o
19500 66 20 70 61 67 65 20 70 50 61 67 65 2e 20 41 6c  f page pPage. Al
19510 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65 20  so, if.** pPage 
19520 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20 74  contains cells t
19530 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65  hat point to ove
19540 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 73 65 74  rflow pages, set
19550 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20   the pointer.** 
19560 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
19570 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
19580 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73  es as well..*/.s
19590 74 61 74 69 63 20 69 6e 74 20 73 65 74 43 68 69  tatic int setChi
195a0 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d 50 61 67  ldPtrmaps(MemPag
195b0 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74  e *pPage){.  int
195c0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
195d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
195e0 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61 72 69 61  /* Counter varia
195f0 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  ble */.  int nCe
19600 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
19610 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
19620 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69  umber of cells i
19630 6e 20 70 61 67 65 20 70 50 61 67 65 20 2a 2f 0a  n page pPage */.
19640 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
19650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19660 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
19670 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65  ode */.  BtShare
19680 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
19690 70 42 74 3b 0a 20 20 75 38 20 69 73 49 6e 69 74  pBt;.  u8 isInit
196a0 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73  Orig = pPage->is
196b0 49 6e 69 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e  Init;.  Pgno pgn
196c0 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b  o = pPage->pgno;
196d0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
196e0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
196f0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
19700 29 20 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65  ) );.  rc = btre
19710 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29  eInitPage(pPage)
19720 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
19730 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
19740 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d  o set_child_ptrm
19750 61 70 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e  aps_out;.  }.  n
19760 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43  Cell = pPage->nC
19770 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  ell;..  for(i=0;
19780 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
19790 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20      u8 *pCell = 
197a0 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
197b0 69 29 3b 0a 0a 20 20 20 20 70 74 72 6d 61 70 50  i);..    ptrmapP
197c0 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c  utOvflPtr(pPage,
197d0 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20   pCell, &rc);.. 
197e0 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
197f0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e  eaf ){.      Pgn
19800 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65  o childPgno = ge
19810 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20  t4byte(pCell);. 
19820 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
19830 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50  Bt, childPgno, P
19840 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e  TRMAP_BTREE, pgn
19850 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20  o, &rc);.    }. 
19860 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65   }..  if( !pPage
19870 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67  ->leaf ){.    Pg
19880 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67  no childPgno = g
19890 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
198a0 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
198b0 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
198c0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63  ptrmapPut(pBt, c
198d0 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50  hildPgno, PTRMAP
198e0 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72  _BTREE, pgno, &r
198f0 63 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63 68 69  c);.  }..set_chi
19900 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3a 0a  ld_ptrmaps_out:.
19910 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
19920 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20  = isInitOrig;.  
19930 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
19940 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e  .** Somewhere on
19950 20 70 50 61 67 65 20 69 73 20 61 20 70 6f 69 6e   pPage is a poin
19960 74 65 72 20 74 6f 20 70 61 67 65 20 69 46 72 6f  ter to page iFro
19970 6d 2e 20 20 4d 6f 64 69 66 79 20 74 68 69 73 20  m.  Modify this 
19980 70 6f 69 6e 74 65 72 20 73 6f 0a 2a 2a 20 74 68  pointer so.** th
19990 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  at it points to 
199a0 69 54 6f 2e 20 50 61 72 61 6d 65 74 65 72 20 65  iTo. Parameter e
199b0 54 79 70 65 20 64 65 73 63 72 69 62 65 73 20 74  Type describes t
199c0 68 65 20 74 79 70 65 20 6f 66 20 70 6f 69 6e 74  he type of point
199d0 65 72 20 74 6f 0a 2a 2a 20 62 65 20 6d 6f 64 69  er to.** be modi
199e0 66 69 65 64 2c 20 61 73 20 20 66 6f 6c 6c 6f 77  fied, as  follow
199f0 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f  s:.**.** PTRMAP_
19a00 42 54 52 45 45 3a 20 20 20 20 20 70 50 61 67 65  BTREE:     pPage
19a10 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65   is a btree-page
19a20 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f  . The pointer po
19a30 69 6e 74 73 20 61 74 20 61 20 63 68 69 6c 64 20  ints at a child 
19a40 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
19a50 20 20 20 20 20 20 70 61 67 65 20 6f 66 20 70 50        page of pP
19a60 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  age..**.** PTRMA
19a70 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50 61  P_OVERFLOW1: pPa
19a80 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61  ge is a btree-pa
19a90 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  ge. The pointer 
19aa0 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f 76 65  points at an ove
19ab0 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20  rflow.**        
19ac0 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20             page 
19ad0 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e  pointed to by on
19ae0 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f  e of the cells o
19af0 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50  n pPage..**.** P
19b00 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a  TRMAP_OVERFLOW2:
19b10 20 70 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65   pPage is an ove
19b20 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65 20  rflow-page. The 
19b30 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
19b40 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20  t the next.**   
19b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b60 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
19b70 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74   the list..*/.st
19b80 61 74 69 63 20 69 6e 74 20 6d 6f 64 69 66 79 50  atic int modifyP
19b90 61 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61  agePointer(MemPa
19ba0 67 65 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20  ge *pPage, Pgno 
19bb0 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c  iFrom, Pgno iTo,
19bc0 20 75 38 20 65 54 79 70 65 29 7b 0a 20 20 61 73   u8 eType){.  as
19bd0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
19be0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
19bf0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
19c00 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
19c10 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
19c20 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
19c30 20 29 3b 0a 20 20 69 66 28 20 65 54 79 70 65 3d   );.  if( eType=
19c40 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
19c50 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  2 ){.    /* The 
19c60 70 6f 69 6e 74 65 72 20 69 73 20 61 6c 77 61 79  pointer is alway
19c70 73 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79  s the first 4 by
19c80 74 65 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  tes of the page 
19c90 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a  in this case.  *
19ca0 2f 0a 20 20 20 20 69 66 28 20 67 65 74 34 62 79  /.    if( get4by
19cb0 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29  te(pPage->aData)
19cc0 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  !=iFrom ){.     
19cd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
19ce0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
19cf0 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74 65 28   }.    put4byte(
19d00 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54  pPage->aData, iT
19d10 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  o);.  }else{.   
19d20 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d   u8 isInitOrig =
19d30 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a   pPage->isInit;.
19d40 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
19d50 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 62  nt nCell;..    b
19d60 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
19d70 67 65 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d  ge);.    nCell =
19d80 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a   pPage->nCell;..
19d90 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
19da0 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
19db0 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69    u8 *pCell = fi
19dc0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29  ndCell(pPage, i)
19dd0 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  ;.      if( eTyp
19de0 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
19df0 4f 57 31 20 29 7b 0a 20 20 20 20 20 20 20 20 43  OW1 ){.        C
19e00 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
19e10 20 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65        btreeParse
19e20 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
19e30 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
19e40 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69        if( info.i
19e50 4f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20  Overflow.       
19e60 20 20 26 26 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e    && pCell+info.
19e70 69 4f 76 65 72 66 6c 6f 77 2b 33 3c 3d 70 50 61  iOverflow+3<=pPa
19e80 67 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d  ge->aData+pPage-
19e90 3e 6d 61 73 6b 50 61 67 65 0a 20 20 20 20 20 20  >maskPage.      
19ea0 20 20 20 26 26 20 69 46 72 6f 6d 3d 3d 67 65 74     && iFrom==get
19eb0 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
19ec0 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 0a 20 20  o.iOverflow]).  
19ed0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
19ee0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 43 65     put4byte(&pCe
19ef0 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
19f00 77 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20  w], iTo);.      
19f10 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
19f20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
19f30 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 65  {.        if( ge
19f40 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69  t4byte(pCell)==i
19f50 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  From ){.        
19f60 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c    put4byte(pCell
19f70 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20  , iTo);.        
19f80 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
19f90 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
19fa0 0a 20 20 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e  .  .    if( i==n
19fb0 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66  Cell ){.      if
19fc0 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f  ( eType!=PTRMAP_
19fd0 42 54 52 45 45 20 7c 7c 20 0a 20 20 20 20 20 20  BTREE || .      
19fe0 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70 50      get4byte(&pP
19ff0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
1a000 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 21  ->hdrOffset+8])!
1a010 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
1a020 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1a030 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1a040 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34      }.      put4
1a050 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
1a060 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
1a070 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20  set+8], iTo);.  
1a080 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e    }..    pPage->
1a090 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f  isInit = isInitO
1a0a0 72 69 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  rig;.  }.  retur
1a0b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1a0c0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
1a0d0 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 70 61  open database pa
1a0e0 67 65 20 70 44 62 50 61 67 65 20 74 6f 20 6c 6f  ge pDbPage to lo
1a0f0 63 61 74 69 6f 6e 20 69 46 72 65 65 50 61 67 65  cation iFreePage
1a100 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61   in the .** data
1a110 62 61 73 65 2e 20 54 68 65 20 70 44 62 50 61 67  base. The pDbPag
1a120 65 20 72 65 66 65 72 65 6e 63 65 20 72 65 6d 61  e reference rema
1a130 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a  ins valid..**.**
1a140 20 54 68 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c   The isCommit fl
1a150 61 67 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  ag indicates tha
1a160 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  t there is no ne
1a170 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74  ed to remember t
1a180 68 61 74 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  hat.** the journ
1a190 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73  al needs to be s
1a1a0 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 64  ync()ed before d
1a1b0 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
1a1c0 50 61 67 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63  Page->pgno .** c
1a1d0 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  an be written to
1a1e0 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 68 61 73  . The caller has
1a1f0 20 61 6c 72 65 61 64 79 20 70 72 6f 6d 69 73 65   already promise
1a200 64 20 6e 6f 74 20 74 6f 20 77 72 69 74 65 20 74  d not to write t
1a210 6f 20 74 68 61 74 0a 2a 2a 20 70 61 67 65 2e 0a  o that.** page..
1a220 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
1a230 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20 42 74  locatePage(.  Bt
1a240 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
1a250 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
1a260 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 44  */.  MemPage *pD
1a270 62 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a  bPage,        /*
1a280 20 4f 70 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f   Open page to mo
1a290 76 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65  ve */.  u8 eType
1a2a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1a2b0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
1a2c0 27 74 79 70 65 27 20 65 6e 74 72 79 20 66 6f 72  'type' entry for
1a2d0 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67   pDbPage */.  Pg
1a2e0 6e 6f 20 69 50 74 72 50 61 67 65 2c 20 20 20 20  no iPtrPage,    
1a2f0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
1a300 72 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27 20  r map 'page-no' 
1a310 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67  entry for pDbPag
1a320 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65  e */.  Pgno iFre
1a330 65 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  ePage,          
1a340 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20  /* The location 
1a350 74 6f 20 6d 6f 76 65 20 70 44 62 50 61 67 65 20  to move pDbPage 
1a360 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f  to */.  int isCo
1a370 6d 6d 69 74 20 20 20 20 20 20 20 20 20 20 20 20  mmit            
1a380 20 2f 2a 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61   /* isCommit fla
1a390 67 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  g passed to sqli
1a3a0 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
1a3b0 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65   */.){.  MemPage
1a3c0 20 2a 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a   *pPtrPage;   /*
1a3d0 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63   The page that c
1a3e0 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
1a3f0 72 20 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a  r to pDbPage */.
1a400 20 20 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d    Pgno iDbPage =
1a410 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a   pDbPage->pgno;.
1a420 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1a430 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20  = pBt->pPager;. 
1a440 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
1a450 72 74 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  rt( eType==PTRMA
1a460 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65  P_OVERFLOW2 || e
1a470 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
1a480 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20  RFLOW1 || .     
1a490 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42   eType==PTRMAP_B
1a4a0 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50  TREE || eType==P
1a4b0 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
1a4c0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
1a4d0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1a4e0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1a4f0 61 73 73 65 72 74 28 20 70 44 62 50 61 67 65 2d  assert( pDbPage-
1a500 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20  >pBt==pBt );..  
1a510 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20 69 44 62  /* Move page iDb
1a520 50 61 67 65 20 66 72 6f 6d 20 69 74 73 20 63 75  Page from its cu
1a530 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74  rrent location t
1a540 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 46  o page number iF
1a550 72 65 65 50 61 67 65 20 2a 2f 0a 20 20 54 52 41  reePage */.  TRA
1a560 43 45 28 28 22 41 55 54 4f 56 41 43 55 55 4d 3a  CE(("AUTOVACUUM:
1a570 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20 66 72   Moving %d to fr
1a580 65 65 20 70 61 67 65 20 25 64 20 28 70 74 72 20  ee page %d (ptr 
1a590 70 61 67 65 20 25 64 20 74 79 70 65 20 25 64 29  page %d type %d)
1a5a0 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69 44 62 50  \n", .      iDbP
1a5b0 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20  age, iFreePage, 
1a5c0 69 50 74 72 50 61 67 65 2c 20 65 54 79 70 65 29  iPtrPage, eType)
1a5d0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1a5e0 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 70  3PagerMovepage(p
1a5f0 50 61 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e  Pager, pDbPage->
1a600 70 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61  pDbPage, iFreePa
1a610 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20  ge, isCommit);. 
1a620 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1a630 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
1a640 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61   rc;.  }.  pDbPa
1a650 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65  ge->pgno = iFree
1a660 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  Page;..  /* If p
1a670 44 62 50 61 67 65 20 77 61 73 20 61 20 62 74 72  DbPage was a btr
1a680 65 65 2d 70 61 67 65 2c 20 74 68 65 6e 20 69 74  ee-page, then it
1a690 20 6d 61 79 20 68 61 76 65 20 63 68 69 6c 64 20   may have child 
1a6a0 70 61 67 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c  pages and/or cel
1a6b0 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f 69  ls.  ** that poi
1a6c0 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70  nt to overflow p
1a6d0 61 67 65 73 2e 20 54 68 65 20 70 6f 69 6e 74 65  ages. The pointe
1a6e0 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r map entries fo
1a6f0 72 20 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a  r all these.  **
1a700 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62   pages need to b
1a710 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a  e changed..  **.
1a720 20 20 2a 2a 20 49 66 20 70 44 62 50 61 67 65 20    ** If pDbPage 
1a730 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  is an overflow p
1a740 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69  age, then the fi
1a750 72 73 74 20 34 20 62 79 74 65 73 20 6d 61 79 20  rst 4 bytes may 
1a760 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69  store a.  ** poi
1a770 6e 74 65 72 20 74 6f 20 61 20 73 75 62 73 65 71  nter to a subseq
1a780 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  uent overflow pa
1a790 67 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  ge. If this is t
1a7a0 68 65 20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20  he case, then.  
1a7b0 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  ** the pointer m
1a7c0 61 70 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75  ap needs to be u
1a7d0 70 64 61 74 65 64 20 66 6f 72 20 74 68 65 20 73  pdated for the s
1a7e0 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c  ubsequent overfl
1a7f0 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  ow page..  */.  
1a800 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
1a810 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65  P_BTREE || eType
1a820 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
1a830 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65  E ){.    rc = se
1a840 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 44  tChildPtrmaps(pD
1a850 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
1a860 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1a870 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1a880 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
1a890 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76  .    Pgno nextOv
1a8a0 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 70 44  fl = get4byte(pD
1a8b0 62 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20  bPage->aData);. 
1a8c0 20 20 20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21     if( nextOvfl!
1a8d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d  =0 ){.      ptrm
1a8e0 61 70 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f  apPut(pBt, nextO
1a8f0 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52  vfl, PTRMAP_OVER
1a900 46 4c 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65  FLOW2, iFreePage
1a910 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66  , &rc);.      if
1a920 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1a930 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1a940 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
1a950 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69    }.  }..  /* Fi
1a960 78 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70  x the database p
1a970 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67 65 20 69  ointer on page i
1a980 50 74 72 50 61 67 65 20 74 68 61 74 20 70 6f 69  PtrPage that poi
1a990 6e 74 65 64 20 61 74 20 69 44 62 50 61 67 65 20  nted at iDbPage 
1a9a0 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69 74 20  so.  ** that it 
1a9b0 70 6f 69 6e 74 73 20 61 74 20 69 46 72 65 65 50  points at iFreeP
1a9c0 61 67 65 2e 20 41 6c 73 6f 20 66 69 78 20 74 68  age. Also fix th
1a9d0 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
1a9e0 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74  try for.  ** iPt
1a9f0 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  rPage..  */.  if
1aa00 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f  ( eType!=PTRMAP_
1aa10 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
1aa20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
1aa30 65 28 70 42 74 2c 20 69 50 74 72 50 61 67 65 2c  e(pBt, iPtrPage,
1aa40 20 26 70 50 74 72 50 61 67 65 2c 20 30 29 3b 0a   &pPtrPage, 0);.
1aa50 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1aa60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1aa70 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1aa80 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1aa90 50 61 67 65 72 57 72 69 74 65 28 70 50 74 72 50  PagerWrite(pPtrP
1aaa0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
1aab0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1aac0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1aad0 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61  leasePage(pPtrPa
1aae0 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ge);.      retur
1aaf0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1ab00 72 63 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50  rc = modifyPageP
1ab10 6f 69 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c  ointer(pPtrPage,
1ab20 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50   iDbPage, iFreeP
1ab30 61 67 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20  age, eType);.   
1ab40 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74   releasePage(pPt
1ab50 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  rPage);.    if( 
1ab60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1ab70 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
1ab80 28 70 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c  (pBt, iFreePage,
1ab90 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65   eType, iPtrPage
1aba0 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20  , &rc);.    }.  
1abb0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1abc0 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63  ../* Forward dec
1abd0 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65  laration require
1abe0 64 20 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53  d by incrVacuumS
1abf0 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63  tep(). */.static
1ac00 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72   int allocateBtr
1ac10 65 65 50 61 67 65 28 42 74 53 68 61 72 65 64 20  eePage(BtShared 
1ac20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50  *, MemPage **, P
1ac30 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29  gno *, Pgno, u8)
1ac40 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d  ;../*.** Perform
1ac50 20 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f   a single step o
1ac60 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  f an incremental
1ac70 2d 76 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63  -vacuum. If succ
1ac80 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a 2a  essful, return.*
1ac90 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20  * SQLITE_OK. If 
1aca0 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b  there is no work
1acb0 20 74 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72   to do (and ther
1acc0 65 66 6f 72 65 20 6e 6f 20 70 6f 69 6e 74 20 69  efore no point i
1acd0 6e 20 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68  n .** calling th
1ace0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69  is function agai
1acf0 6e 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  n), return SQLIT
1ad00 45 5f 44 4f 4e 45 2e 20 4f 72 2c 20 69 66 20 61  E_DONE. Or, if a
1ad10 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75  n error .** occu
1ad20 72 73 2c 20 72 65 74 75 72 6e 20 73 6f 6d 65 20  rs, return some 
1ad30 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65  other error code
1ad40 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65  ..**.** More spe
1ad50 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 69 73 20  cifically, this 
1ad60 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
1ad70 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65  s to re-organize
1ad80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6f   the database so
1ad90 20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6c 61   .** that the la
1ada0 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 66  st page of the f
1adb0 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ile currently in
1adc0 20 75 73 65 20 69 73 20 6e 6f 20 6c 6f 6e 67 65   use is no longe
1add0 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  r in use..**.** 
1ade0 50 61 72 61 6d 65 74 65 72 20 6e 46 69 6e 20 69  Parameter nFin i
1adf0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1ae00 70 61 67 65 73 20 74 68 61 74 20 74 68 69 73 20  pages that this 
1ae10 64 61 74 61 62 61 73 65 20 77 6f 75 6c 64 20 63  database would c
1ae20 6f 6e 74 61 69 6e 0a 2a 2a 20 77 65 72 65 20 74  ontain.** were t
1ae30 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  his function cal
1ae40 6c 65 64 20 75 6e 74 69 6c 20 69 74 20 72 65 74  led until it ret
1ae50 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45  urns SQLITE_DONE
1ae60 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62  ..**.** If the b
1ae70 43 6f 6d 6d 69 74 20 70 61 72 61 6d 65 74 65 72  Commit parameter
1ae80 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
1ae90 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75  is function assu
1aea0 6d 65 73 20 74 68 61 74 20 74 68 65 20 0a 2a 2a  mes that the .**
1aeb0 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65   caller will kee
1aec0 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61  p calling incrVa
1aed0 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c  cuumStep() until
1aee0 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49   it returns SQLI
1aef0 54 45 5f 44 4f 4e 45 20 0a 2a 2a 20 6f 72 20 61  TE_DONE .** or a
1af00 6e 20 65 72 72 6f 72 2e 20 62 43 6f 6d 6d 69 74  n error. bCommit
1af10 20 69 73 20 70 61 73 73 65 64 20 74 72 75 65 20   is passed true 
1af20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  for an auto-vacu
1af30 75 6d 2d 6f 6e 2d 63 6f 6d 6d 69 74 20 0a 2a 2a  um-on-commit .**
1af40 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6f 72 20 66   operation, or f
1af50 61 6c 73 65 20 66 6f 72 20 61 6e 20 69 6e 63 72  alse for an incr
1af60 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a  emental vacuum..
1af70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
1af80 63 72 56 61 63 75 75 6d 53 74 65 70 28 42 74 53  crVacuumStep(BtS
1af90 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
1afa0 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73   nFin, Pgno iLas
1afb0 74 50 67 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74  tPg, int bCommit
1afc0 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c  ){.  Pgno nFreeL
1afd0 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ist;           /
1afe0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
1aff0 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66  s still on the f
1b000 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69 6e  ree-list */.  in
1b010 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
1b020 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1b030 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
1b040 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c 61  );.  assert( iLa
1b050 73 74 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20  stPg>nFin );..  
1b060 69 66 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41  if( !PTRMAP_ISPA
1b070 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29  GE(pBt, iLastPg)
1b080 20 26 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e   && iLastPg!=PEN
1b090 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1b0a0 42 74 29 20 29 7b 0a 20 20 20 20 75 38 20 65 54  Bt) ){.    u8 eT
1b0b0 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50  ype;.    Pgno iP
1b0c0 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72  trPage;..    nFr
1b0d0 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74  eeList = get4byt
1b0e0 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
1b0f0 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20  aData[36]);.    
1b100 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30  if( nFreeList==0
1b110 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1b120 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
1b130 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70 74    }..    rc = pt
1b140 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c 61  rmapGet(pBt, iLa
1b150 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26 69  stPg, &eType, &i
1b160 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66  PtrPage);.    if
1b170 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1b180 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1b190 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
1b1a0 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
1b1b0 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
1b1c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b1d0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1b1e0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79    }..    if( eTy
1b1f0 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50  pe==PTRMAP_FREEP
1b200 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28  AGE ){.      if(
1b210 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20   bCommit==0 ){. 
1b220 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65         /* Remove
1b230 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74   the page from t
1b240 68 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69  he files free-li
1b250 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20  st. This is not 
1b260 72 65 71 75 69 72 65 64 0a 20 20 20 20 20 20 20  required.       
1b270 20 2a 2a 20 69 66 20 62 43 6f 6d 6d 69 74 20 69   ** if bCommit i
1b280 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74  s non-zero. In t
1b290 68 61 74 20 63 61 73 65 2c 20 74 68 65 20 66 72  hat case, the fr
1b2a0 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a  ee-list will be.
1b2b0 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63          ** trunc
1b2c0 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74  ated to zero aft
1b2d0 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
1b2e0 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20   returns, so it 
1b2f0 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20  doesn't .       
1b300 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74   ** matter if it
1b310 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20   still contains 
1b320 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74  some garbage ent
1b330 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ries..        */
1b340 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46  .        Pgno iF
1b350 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d  reePg;.        M
1b360 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b  emPage *pFreePg;
1b370 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c  .        rc = al
1b380 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
1b390 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26  pBt, &pFreePg, &
1b3a0 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67  iFreePg, iLastPg
1b3b0 2c 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29  , BTALLOC_EXACT)
1b3c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1b3d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1b3e0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1b3f0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
1b400 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46        assert( iF
1b410 72 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29  reePg==iLastPg )
1b420 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
1b430 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a  ePage(pFreePg);.
1b440 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c        }.    } el
1b450 73 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  se {.      Pgno 
1b460 69 46 72 65 65 50 67 3b 20 20 20 20 20 20 20 20  iFreePg;        
1b470 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1b480 20 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f   free page to mo
1b490 76 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f  ve pLastPg to */
1b4a0 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
1b4b0 70 4c 61 73 74 50 67 3b 0a 20 20 20 20 20 20 75  pLastPg;.      u
1b4c0 38 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f  8 eMode = BTALLO
1b4d0 43 5f 41 4e 59 3b 20 20 20 2f 2a 20 4d 6f 64 65  C_ANY;   /* Mode
1b4e0 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61   parameter for a
1b4f0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
1b500 28 29 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f  () */.      Pgno
1b510 20 69 4e 65 61 72 20 3d 20 30 3b 20 20 20 20 20   iNear = 0;     
1b520 20 20 20 20 20 20 2f 2a 20 6e 65 61 72 62 79 20        /* nearby 
1b530 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c  parameter for al
1b540 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
1b550 29 20 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d  ) */..      rc =
1b560 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
1b570 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c 61  t, iLastPg, &pLa
1b580 73 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  stPg, 0);.      
1b590 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1b5a0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
1b5b0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
1b5c0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 62 43 6f  .      /* If bCo
1b5d0 6d 6d 69 74 20 69 73 20 7a 65 72 6f 2c 20 74 68  mmit is zero, th
1b5e0 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61  is loop runs exa
1b5f0 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61  ctly once and pa
1b600 67 65 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20  ge pLastPg.     
1b610 20 2a 2a 20 69 73 20 73 77 61 70 70 65 64 20 77   ** is swapped w
1b620 69 74 68 20 74 68 65 20 66 69 72 73 74 20 66 72  ith the first fr
1b630 65 65 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f  ee page pulled o
1b640 66 66 20 74 68 65 20 66 72 65 65 20 6c 69 73 74  ff the free list
1b650 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
1b660 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72   ** On the other
1b670 20 68 61 6e 64 2c 20 69 66 20 62 43 6f 6d 6d 69   hand, if bCommi
1b680 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
1b690 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65  n zero, then kee
1b6a0 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69  p.      ** loopi
1b6b0 6e 67 20 75 6e 74 69 6c 20 61 20 66 72 65 65 2d  ng until a free-
1b6c0 70 61 67 65 20 6c 6f 63 61 74 65 64 20 77 69 74  page located wit
1b6d0 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e 46  hin the first nF
1b6e0 69 6e 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a  in pages.      *
1b6f0 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73  * of the file is
1b700 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f   found..      */
1b710 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d  .      if( bComm
1b720 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  it==0 ){.       
1b730 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43   eMode = BTALLOC
1b740 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20 69 4e 65  _LE;.        iNe
1b750 61 72 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 20  ar = nFin;.     
1b760 20 7d 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20   }.      do {.  
1b770 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
1b780 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20  FreePg;.        
1b790 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
1b7a0 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72  eePage(pBt, &pFr
1b7b0 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20  eePg, &iFreePg, 
1b7c0 69 4e 65 61 72 2c 20 65 4d 6f 64 65 29 3b 0a 20  iNear, eMode);. 
1b7d0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1b7e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b7f0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1b800 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20  e(pLastPg);.    
1b810 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1b820 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1b830 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1b840 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d  FreePg);.      }
1b850 77 68 69 6c 65 28 20 62 43 6f 6d 6d 69 74 20 26  while( bCommit &
1b860 26 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20 29  & iFreePg>nFin )
1b870 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1b880 69 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67 20  iFreePg<iLastPg 
1b890 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20  );.      .      
1b8a0 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67  rc = relocatePag
1b8b0 65 28 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20  e(pBt, pLastPg, 
1b8c0 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c  eType, iPtrPage,
1b8d0 20 69 46 72 65 65 50 67 2c 20 62 43 6f 6d 6d 69   iFreePg, bCommi
1b8e0 74 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  t);.      releas
1b8f0 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a  ePage(pLastPg);.
1b900 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1b910 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1b920 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1b930 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1b940 0a 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d  .  if( bCommit==
1b950 30 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  0 ){.    do {.  
1b960 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20      iLastPg--;. 
1b970 20 20 20 7d 77 68 69 6c 65 28 20 69 4c 61 73 74     }while( iLast
1b980 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  Pg==PENDING_BYTE
1b990 5f 50 41 47 45 28 70 42 74 29 20 7c 7c 20 50 54  _PAGE(pBt) || PT
1b9a0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
1b9b0 20 69 4c 61 73 74 50 67 29 20 29 3b 0a 20 20 20   iLastPg) );.   
1b9c0 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74   pBt->bDoTruncat
1b9d0 65 20 3d 20 31 3b 0a 20 20 20 20 70 42 74 2d 3e  e = 1;.    pBt->
1b9e0 6e 50 61 67 65 20 3d 20 69 4c 61 73 74 50 67 3b  nPage = iLastPg;
1b9f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1ba00 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1ba10 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6f  * The database o
1ba20 70 65 6e 65 64 20 62 79 20 74 68 65 20 66 69 72  pened by the fir
1ba30 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
1ba40 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
1ba50 74 61 62 61 73 65 0a 2a 2a 20 6e 4f 72 69 67 20  tabase.** nOrig 
1ba60 70 61 67 65 73 20 69 6e 20 73 69 7a 65 20 63 6f  pages in size co
1ba70 6e 74 61 69 6e 69 6e 67 20 6e 46 72 65 65 20 66  ntaining nFree f
1ba80 72 65 65 20 70 61 67 65 73 2e 20 52 65 74 75 72  ree pages. Retur
1ba90 6e 20 74 68 65 20 65 78 70 65 63 74 65 64 20 0a  n the expected .
1baa0 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  ** size of the d
1bab0 61 74 61 62 61 73 65 20 69 6e 20 70 61 67 65 73  atabase in pages
1bac0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 61 75   following an au
1bad0 74 6f 2d 76 61 63 75 75 6d 20 6f 70 65 72 61 74  to-vacuum operat
1bae0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  ion..*/.static P
1baf0 67 6e 6f 20 66 69 6e 61 6c 44 62 53 69 7a 65 28  gno finalDbSize(
1bb00 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
1bb10 67 6e 6f 20 6e 4f 72 69 67 2c 20 50 67 6e 6f 20  gno nOrig, Pgno 
1bb20 6e 46 72 65 65 29 7b 0a 20 20 69 6e 74 20 6e 45  nFree){.  int nE
1bb30 6e 74 72 79 3b 20 20 20 20 20 20 20 20 20 20 20  ntry;           
1bb40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1bb50 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 6f  ber of entries o
1bb60 6e 20 6f 6e 65 20 70 74 72 6d 61 70 20 70 61 67  n one ptrmap pag
1bb70 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 74 72  e */.  Pgno nPtr
1bb80 6d 61 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  map;            
1bb90 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1bba0 20 6f 66 20 50 74 72 4d 61 70 20 70 61 67 65 73   of PtrMap pages
1bbb0 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a   to be freed */.
1bbc0 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20    Pgno nFin;    
1bbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbe0 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
1bbf0 65 20 2a 2f 0a 0a 20 20 6e 45 6e 74 72 79 20 3d  e */..  nEntry =
1bc00 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
1bc10 2f 35 3b 0a 20 20 6e 50 74 72 6d 61 70 20 3d 20  /5;.  nPtrmap = 
1bc20 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52  (nFree-nOrig+PTR
1bc30 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
1bc40 6e 4f 72 69 67 29 2b 6e 45 6e 74 72 79 29 2f 6e  nOrig)+nEntry)/n
1bc50 45 6e 74 72 79 3b 0a 20 20 6e 46 69 6e 20 3d 20  Entry;.  nFin = 
1bc60 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d 20  nOrig - nFree - 
1bc70 6e 50 74 72 6d 61 70 3b 0a 20 20 69 66 28 20 6e  nPtrmap;.  if( n
1bc80 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54  Orig>PENDING_BYT
1bc90 45 5f 50 41 47 45 28 70 42 74 29 20 26 26 20 6e  E_PAGE(pBt) && n
1bca0 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54 45  Fin<PENDING_BYTE
1bcb0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
1bcc0 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 20 20    nFin--;.  }.  
1bcd0 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53  while( PTRMAP_IS
1bce0 50 41 47 45 28 70 42 74 2c 20 6e 46 69 6e 29 20  PAGE(pBt, nFin) 
1bcf0 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47  || nFin==PENDING
1bd00 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1bd10 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20  ){.    nFin--;. 
1bd20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 46 69   }..  return nFi
1bd30 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72  n;.}../*.** A wr
1bd40 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
1bd50 6d 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62  must be opened b
1bd60 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68  efore calling th
1bd70 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20  is function..** 
1bd80 49 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69  It performs a si
1bd90 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72  ngle unit of wor
1bda0 6b 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63  k towards an inc
1bdb0 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e  remental vacuum.
1bdc0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  .**.** If the in
1bdd0 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
1bde0 20 69 73 20 66 69 6e 69 73 68 65 64 20 61 66 74   is finished aft
1bdf0 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
1be00 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c   has run,.** SQL
1be10 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75  ITE_DONE is retu
1be20 72 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e  rned. If it is n
1be30 6f 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74  ot finished, but
1be40 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 72   no error occurr
1be50 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  ed,.** SQLITE_OK
1be60 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
1be70 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74  herwise an SQLit
1be80 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a  e error code. .*
1be90 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1bea0 65 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72  eeIncrVacuum(Btr
1beb0 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
1bec0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
1bed0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73  t = p->pBt;..  s
1bee0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1bef0 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
1bf00 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1bf10 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26  n==TRANS_WRITE &
1bf20 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  & p->inTrans==TR
1bf30 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69  ANS_WRITE );.  i
1bf40 66 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63  f( !pBt->autoVac
1bf50 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  uum ){.    rc = 
1bf60 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
1bf70 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  else{.    Pgno n
1bf80 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61 67 65  Orig = btreePage
1bf90 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20  count(pBt);.    
1bfa0 50 67 6e 6f 20 6e 46 72 65 65 20 3d 20 67 65 74  Pgno nFree = get
1bfb0 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
1bfc0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
1bfd0 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d 20      Pgno nFin = 
1bfe0 66 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c  finalDbSize(pBt,
1bff0 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a   nOrig, nFree);.
1c000 0a 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3c 6e  .    if( nOrig<n
1c010 46 69 6e 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Fin ){.      rc 
1c020 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
1c030 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _BKPT;.    }else
1c040 20 69 66 28 20 6e 46 72 65 65 3e 30 20 29 7b 0a   if( nFree>0 ){.
1c050 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 41        rc = saveA
1c060 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30  llCursors(pBt, 0
1c070 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
1c080 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1c090 0a 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64  .        invalid
1c0a0 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
1c0b0 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  che(pBt);.      
1c0c0 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75    rc = incrVacuu
1c0d0 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c  mStep(pBt, nFin,
1c0e0 20 6e 4f 72 69 67 2c 20 30 29 3b 0a 20 20 20 20   nOrig, 0);.    
1c0f0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
1c100 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1c110 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1c120 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42  te3PagerWrite(pB
1c130 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
1c140 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  ge);.        put
1c150 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
1c160 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70  e1->aData[28], p
1c170 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
1c180 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
1c190 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1c1a0 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _DONE;.    }.  }
1c1b0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1c1c0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
1c1d0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1c1e0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1c1f0 61 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73  alled prior to s
1c200 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
1c210 74 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63  t when a transac
1c220 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69  tion.** is commi
1c230 74 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f  tted for an auto
1c240 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
1c250 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ..**.** If SQLIT
1c260 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1c270 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20  , then *pnTrunc 
1c280 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
1c290 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a  mber of pages.**
1c2a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1c2b0 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75  le should be tru
1c2c0 6e 63 61 74 65 64 20 74 6f 20 64 75 72 69 6e 67  ncated to during
1c2d0 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63   the commit proc
1c2e0 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68  ess. .** i.e. th
1c2f0 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62  e database has b
1c300 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64 20  een reorganized 
1c310 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74 68 65  so that only the
1c320 20 66 69 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a   first *pnTrunc.
1c330 2a 2a 20 70 61 67 65 73 20 61 72 65 20 69 6e 20  ** pages are in 
1c340 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  use..*/.static i
1c350 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d  nt autoVacuumCom
1c360 6d 69 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  mit(BtShared *pB
1c370 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
1c380 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65  QLITE_OK;.  Page
1c390 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d  r *pPager = pBt-
1c3a0 3e 70 50 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f  >pPager;.  VVA_O
1c3b0 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66 20 3d 20  NLY( int nRef = 
1c3c0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
1c3d0 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a  ount(pPager) );.
1c3e0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1c3f0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
1c400 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
1c410 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
1c420 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a  flowCache(pBt);.
1c430 20 20 61 73 73 65 72 74 28 70 42 74 2d 3e 61 75    assert(pBt->au
1c440 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69 66 28  toVacuum);.  if(
1c450 20 21 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75   !pBt->incrVacuu
1c460 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46  m ){.    Pgno nF
1c470 69 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  in;         /* N
1c480 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
1c490 6e 20 64 61 74 61 62 61 73 65 20 61 66 74 65 72  n database after
1c4a0 20 61 75 74 6f 76 61 63 75 75 6d 69 6e 67 20 2a   autovacuuming *
1c4b0 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65  /.    Pgno nFree
1c4c0 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ;        /* Numb
1c4d0 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74  er of pages on t
1c4e0 68 65 20 66 72 65 65 6c 69 73 74 20 69 6e 69 74  he freelist init
1c4f0 69 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 50 67 6e  ially */.    Pgn
1c500 6f 20 69 46 72 65 65 3b 20 20 20 20 20 20 20 20  o iFree;        
1c510 2f 2a 20 54 68 65 20 6e 65 78 74 20 70 61 67 65  /* The next page
1c520 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a   to be freed */.
1c530 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20      Pgno nOrig; 
1c540 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
1c550 73 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20 66  se size before f
1c560 72 65 65 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e  reeing */..    n
1c570 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61 67 65  Orig = btreePage
1c580 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20  count(pBt);.    
1c590 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  if( PTRMAP_ISPAG
1c5a0 45 28 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c 7c  E(pBt, nOrig) ||
1c5b0 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f   nOrig==PENDING_
1c5c0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
1c5d0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73  {.      /* It is
1c5e0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
1c5f0 20 63 72 65 61 74 65 20 61 20 64 61 74 61 62 61   create a databa
1c600 73 65 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  se for which the
1c610 20 66 69 6e 61 6c 20 70 61 67 65 0a 20 20 20 20   final page.    
1c620 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20 61    ** is either a
1c630 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
1c640 65 20 6f 72 20 74 68 65 20 70 65 6e 64 69 6e 67  e or the pending
1c650 2d 62 79 74 65 20 70 61 67 65 2e 20 49 66 20 6f  -byte page. If o
1c660 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65  ne.      ** is e
1c670 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 69 73  ncountered, this
1c680 20 69 6e 64 69 63 61 74 65 73 20 63 6f 72 72 75   indicates corru
1c690 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ption..      */.
1c6a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1c6b0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1c6c0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46 72  ;.    }..    nFr
1c6d0 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ee = get4byte(&p
1c6e0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1c6f0 61 5b 33 36 5d 29 3b 0a 20 20 20 20 6e 46 69 6e  a[36]);.    nFin
1c700 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70   = finalDbSize(p
1c710 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65  Bt, nOrig, nFree
1c720 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3e  );.    if( nFin>
1c730 6e 4f 72 69 67 20 29 20 72 65 74 75 72 6e 20 53  nOrig ) return S
1c740 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1c750 50 54 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e  PT;.    if( nFin
1c760 3c 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20  <nOrig ){.      
1c770 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
1c780 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a  ors(pBt, 0, 0);.
1c790 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 46      }.    for(iF
1c7a0 72 65 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65  ree=nOrig; iFree
1c7b0 3e 6e 46 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c  >nFin && rc==SQL
1c7c0 49 54 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29  ITE_OK; iFree--)
1c7d0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63  {.      rc = inc
1c7e0 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c  rVacuumStep(pBt,
1c7f0 20 6e 46 69 6e 2c 20 69 46 72 65 65 2c 20 31 29   nFin, iFree, 1)
1c800 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1c810 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45  (rc==SQLITE_DONE
1c820 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   || rc==SQLITE_O
1c830 4b 29 20 26 26 20 6e 46 72 65 65 3e 30 20 29 7b  K) && nFree>0 ){
1c840 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1c850 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42  te3PagerWrite(pB
1c860 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
1c870 67 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ge);.      put4b
1c880 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
1c890 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b  ->aData[32], 0);
1c8a0 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
1c8b0 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
1c8c0 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20  ata[36], 0);.   
1c8d0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
1c8e0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
1c8f0 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20  28], nFin);.    
1c900 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61    pBt->bDoTrunca
1c910 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 42  te = 1;.      pB
1c920 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 46 69 6e 3b  t->nPage = nFin;
1c930 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
1c940 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1c950 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1c960 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  erRollback(pPage
1c970 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  r);.    }.  }.. 
1c980 20 61 73 73 65 72 74 28 20 6e 52 65 66 3e 3d 73   assert( nRef>=s
1c990 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
1c9a0 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20  unt(pPager) );. 
1c9b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
1c9c0 65 6c 73 65 20 2f 2a 20 69 66 6e 64 65 66 20 53  else /* ifndef S
1c9d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1c9e0 41 43 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e  ACUUM */.# defin
1c9f0 65 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  e setChildPtrmap
1ca00 73 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23  s(x) SQLITE_OK.#
1ca10 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
1ca20 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  s routine does t
1ca30 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20 6f  he first phase o
1ca40 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f  f a two-phase co
1ca50 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74  mmit.  This rout
1ca60 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61 20  ine.** causes a 
1ca70 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1ca80 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 28   to be created (
1ca90 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61  if it does not a
1caa0 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a 2a  lready exist).**
1cab0 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77   and populated w
1cac0 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72  ith enough infor
1cad0 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 69  mation so that i
1cae0 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f  f a power loss o
1caf0 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61 74  ccurs.** the dat
1cb00 61 62 61 73 65 20 63 61 6e 20 62 65 20 72 65 73  abase can be res
1cb10 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
1cb20 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20 70  ginal state by p
1cb30 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74  laying back.** t
1cb40 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  he journal.  The
1cb50 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  n the contents o
1cb60 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72  f the journal ar
1cb70 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74 6f  e flushed out to
1cb80 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20 41  .** the disk.  A
1cb90 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  fter the journal
1cba0 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78   is safely on ox
1cbb0 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65 73  ide, the changes
1cbc0 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   to the.** datab
1cbd0 61 73 65 20 61 72 65 20 77 72 69 74 74 65 6e 20  ase are written 
1cbe0 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
1cbf0 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73 68  e file and flush
1cc00 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20  ed to oxide..** 
1cc10 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  At the end of th
1cc20 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c  is call, the rol
1cc30 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74  lback journal st
1cc40 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74 68  ill exists on th
1cc50 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77 65  e.** disk and we
1cc60 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69   are still holdi
1cc70 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f  ng all locks, so
1cc80 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1cc90 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d   has not.** comm
1cca0 69 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c 69  itted.  See sqli
1ccb0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
1ccc0 61 73 65 54 77 6f 28 29 20 66 6f 72 20 74 68 65  aseTwo() for the
1ccd0 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66   second phase of
1cce0 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70   the.** commit p
1ccf0 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  rocess..**.** Th
1cd00 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  is call is a no-
1cd10 6f 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74  op if no write-t
1cd20 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75  ransaction is cu
1cd30 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f  rrently active o
1cd40 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  n pBt..**.** Oth
1cd50 65 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65  erwise, sync the
1cd60 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
1cd70 6f 72 20 74 68 65 20 62 74 72 65 65 20 70 42 74  or the btree pBt
1cd80 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73  . zMaster points
1cd90 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20   to.** the name 
1cda0 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
1cdb0 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68  nal file that sh
1cdc0 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20  ould be written 
1cdd0 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69  into the.** indi
1cde0 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66  vidual journal f
1cdf0 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c  ile, or is NULL,
1ce00 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d   indicating no m
1ce10 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1ce20 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64  le .** (single d
1ce30 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
1ce40 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ion)..**.** When
1ce50 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c   this is called,
1ce60 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
1ce70 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  nal should alrea
1ce80 64 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20  dy have been.** 
1ce90 63 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74  created, populat
1cea0 65 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75  ed with this jou
1ceb0 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64  rnal pointer and
1cec0 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
1ced0 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73  .**.** Once this
1cee0 20 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20   is routine has 
1cef0 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e  returned, the on
1cf00 6c 79 20 74 68 69 6e 67 20 72 65 71 75 69 72 65  ly thing require
1cf10 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74  d to commit.** t
1cf20 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  he write-transac
1cf30 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61  tion for this da
1cf40 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 74  tabase file is t
1cf50 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  o delete the jou
1cf60 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rnal..*/.int sql
1cf70 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
1cf80 68 61 73 65 4f 6e 65 28 42 74 72 65 65 20 2a 70  haseOne(Btree *p
1cf90 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
1cfa0 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
1cfb0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1cfc0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
1cfd0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
1cfe0 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
1cff0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73   = p->pBt;.    s
1d000 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1d010 28 70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  (p);.#ifndef SQL
1d020 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1d030 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d  UUM.    if( pBt-
1d040 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
1d050 20 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56 61       rc = autoVa
1d060 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b  cuumCommit(pBt);
1d070 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1d080 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d090 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1d0a0 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
1d0b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1d0c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
1d0d0 66 28 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  f( pBt->bDoTrunc
1d0e0 61 74 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ate ){.      sql
1d0f0 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
1d100 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50 61 67  eImage(pBt->pPag
1d110 65 72 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b  er, pBt->nPage);
1d120 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
1d130 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1d140 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
1d150 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a  e(pBt->pPager, z
1d160 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  Master, 0);.    
1d170 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1d180 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
1d190 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1d1a0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1d1b0 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 6f 74   called from bot
1d1c0 68 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  h BtreeCommitPha
1d1d0 73 65 54 77 6f 28 29 20 61 6e 64 20 42 74 72 65  seTwo() and Btre
1d1e0 65 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 61  eRollback().** a
1d1f0 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
1d200 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
1d210 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
1d220 64 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61  d btreeEndTransa
1d230 63 74 69 6f 6e 28 42 74 72 65 65 20 2a 70 29 7b  ction(Btree *p){
1d240 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1d250 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c   = p->pBt;.  sql
1d260 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
1d270 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
1d280 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
1d290 65 78 28 70 29 20 29 3b 0a 0a 23 69 66 6e 64 65  ex(p) );..#ifnde
1d2a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1d2b0 54 4f 56 41 43 55 55 4d 0a 20 20 70 42 74 2d 3e  TOVACUUM.  pBt->
1d2c0 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 30 3b  bDoTruncate = 0;
1d2d0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d  .#endif.  if( p-
1d2e0 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e  >inTrans>TRANS_N
1d2f0 4f 4e 45 20 26 26 20 64 62 2d 3e 6e 56 64 62 65  ONE && db->nVdbe
1d300 52 65 61 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a  Read>1 ){.    /*
1d310 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 74   If there are ot
1d320 68 65 72 20 61 63 74 69 76 65 20 73 74 61 74 65  her active state
1d330 6d 65 6e 74 73 20 74 68 61 74 20 62 65 6c 6f 6e  ments that belon
1d340 67 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61  g to this databa
1d350 73 65 0a 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65  se.    ** handle
1d360 2c 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 61  , downgrade to a
1d370 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73   read-only trans
1d380 61 63 74 69 6f 6e 2e 20 54 68 65 20 6f 74 68 65  action. The othe
1d390 72 20 73 74 61 74 65 6d 65 6e 74 73 0a 20 20 20  r statements.   
1d3a0 20 2a 2a 20 6d 61 79 20 73 74 69 6c 6c 20 62 65   ** may still be
1d3b0 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68   reading from th
1d3c0 65 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a  e database.  */.
1d3d0 20 20 20 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c      downgradeAll
1d3e0 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
1d3f0 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 70 2d  Locks(p);.    p-
1d400 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
1d410 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _READ;.  }else{.
1d420 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61      /* If the ha
1d430 6e 64 6c 65 20 68 61 64 20 61 6e 79 20 6b 69 6e  ndle had any kin
1d440 64 20 6f 66 20 74 72 61 6e 73 61 63 74 69 6f 6e  d of transaction
1d450 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74   open, decrement
1d460 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 74 72 61   the .    ** tra
1d470 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 6f  nsaction count o
1d480 66 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72  f the shared btr
1d490 65 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73  ee. If the trans
1d4a0 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 0a 20 20  action count .  
1d4b0 20 20 2a 2a 20 72 65 61 63 68 65 73 20 30 2c 20    ** reaches 0, 
1d4c0 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73  set the shared s
1d4d0 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f  tate to TRANS_NO
1d4e0 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74  NE. The unlockBt
1d4f0 72 65 65 49 66 55 6e 75 73 65 64 28 29 0a 20 20  reeIfUnused().  
1d500 20 20 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f 77 20    ** call below 
1d510 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20  will unlock the 
1d520 70 61 67 65 72 2e 20 20 2a 2f 0a 20 20 20 20 69  pager.  */.    i
1d530 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54  f( p->inTrans!=T
1d540 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  RANS_NONE ){.   
1d550 20 20 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65     clearAllShare
1d560 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73  dCacheTableLocks
1d570 28 70 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  (p);.      pBt->
1d580 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a  nTransaction--;.
1d590 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74        if( 0==pBt
1d5a0 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  ->nTransaction )
1d5b0 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69  {.        pBt->i
1d5c0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
1d5d0 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  RANS_NONE;.     
1d5e0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1d5f0 20 53 65 74 20 74 68 65 20 63 75 72 72 65 6e 74   Set the current
1d600 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61   transaction sta
1d610 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45  te to TRANS_NONE
1d620 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
1d630 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 69 66  .    ** pager if
1d640 20 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65   this call close
1d650 64 20 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20  d the only read 
1d660 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
1d670 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 70 2d  tion.  */.    p-
1d680 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
1d690 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f 63  _NONE;.    unloc
1d6a0 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
1d6b0 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65  Bt);.  }..  btre
1d6c0 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 7d  eIntegrity(p);.}
1d6d0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74  ../*.** Commit t
1d6e0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
1d6f0 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67  urrently in prog
1d700 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ress..**.** This
1d710 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65   routine impleme
1d720 6e 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70  nts the second p
1d730 68 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73  hase of a 2-phas
1d740 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a  e commit.  The.*
1d750 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  * sqlite3BtreeCo
1d760 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 72  mmitPhaseOne() r
1d770 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
1d780 66 69 72 73 74 20 70 68 61 73 65 20 61 6e 64 20  first phase and 
1d790 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e 76  should.** be inv
1d7a0 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f 20 63 61  oked prior to ca
1d7b0 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
1d7c0 6e 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  ne.  The sqlite3
1d7d0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
1d7e0 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  One().** routine
1d7f0 20 64 69 64 20 61 6c 6c 20 74 68 65 20 77 6f 72   did all the wor
1d800 6b 20 6f 66 20 77 72 69 74 69 6e 67 20 69 6e 66  k of writing inf
1d810 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20  ormation out to 
1d820 64 69 73 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e  disk and flushin
1d830 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  g the.** content
1d840 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 61  s so that they a
1d850 72 65 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20  re written onto 
1d860 74 68 65 20 64 69 73 6b 20 70 6c 61 74 74 65 72  the disk platter
1d870 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72  .  All this.** r
1d880 6f 75 74 69 6e 65 20 68 61 73 20 74 6f 20 64 6f  outine has to do
1d890 20 69 73 20 64 65 6c 65 74 65 20 6f 72 20 74 72   is delete or tr
1d8a0 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74  uncate or zero t
1d8b0 68 65 20 68 65 61 64 65 72 20 69 6e 20 74 68 65  he header in the
1d8c0 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
1d8d0 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63 68 20   journal (which 
1d8e0 63 61 75 73 65 73 20 74 68 65 20 74 72 61 6e 73  causes the trans
1d8f0 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74  action to commit
1d900 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f  ) and.** drop lo
1d910 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61  cks..**.** Norma
1d920 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72  lly, if an error
1d930 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68   occurs while th
1d940 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 69 73  e pager layer is
1d950 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 0a   attempting to .
1d960 2a 2a 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20  ** finalize the 
1d970 75 6e 64 65 72 6c 79 69 6e 67 20 6a 6f 75 72 6e  underlying journ
1d980 61 6c 20 66 69 6c 65 2c 20 74 68 69 73 20 66 75  al file, this fu
1d990 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61  nction returns a
1d9a0 6e 20 65 72 72 6f 72 20 61 6e 64 0a 2a 2a 20 74  n error and.** t
1d9b0 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 77  he upper layer w
1d9c0 69 6c 6c 20 61 74 74 65 6d 70 74 20 61 20 72 6f  ill attempt a ro
1d9d0 6c 6c 62 61 63 6b 2e 20 48 6f 77 65 76 65 72 2c  llback. However,
1d9e0 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   if the second a
1d9f0 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f  rgument.** is no
1da00 6e 2d 7a 65 72 6f 20 74 68 65 6e 20 74 68 69 73  n-zero then this
1da10 20 62 2d 74 72 65 65 20 74 72 61 6e 73 61 63 74   b-tree transact
1da20 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20 61  ion is part of a
1da30 20 6d 75 6c 74 69 2d 66 69 6c 65 20 0a 2a 2a 20   multi-file .** 
1da40 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20  transaction. In 
1da50 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 74  this case, the t
1da60 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61  ransaction has a
1da70 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6d 6d  lready been comm
1da80 69 74 74 65 64 20 0a 2a 2a 20 28 62 79 20 64 65  itted .** (by de
1da90 6c 65 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20  leting a master 
1daa0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e  journal file) an
1dab0 64 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  d the caller wil
1dac0 6c 20 69 67 6e 6f 72 65 20 74 68 69 73 20 0a 2a  l ignore this .*
1dad0 2a 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75  * functions retu
1dae0 72 6e 20 63 6f 64 65 2e 20 53 6f 2c 20 65 76 65  rn code. So, eve
1daf0 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  n if an error oc
1db00 63 75 72 73 20 69 6e 20 74 68 65 20 70 61 67 65  curs in the page
1db10 72 20 6c 61 79 65 72 2c 0a 2a 2a 20 72 65 73 65  r layer,.** rese
1db20 74 20 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a  t the b-tree obj
1db30 65 63 74 73 20 69 6e 74 65 72 6e 61 6c 20 73 74  ects internal st
1db40 61 74 65 20 74 6f 20 69 6e 64 69 63 61 74 65 20  ate to indicate 
1db50 74 68 61 74 20 74 68 65 20 77 72 69 74 65 0a 2a  that the write.*
1db60 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  * transaction ha
1db70 73 20 62 65 65 6e 20 63 6c 6f 73 65 64 2e 20 54  s been closed. T
1db80 68 69 73 20 69 73 20 71 75 69 74 65 20 73 61 66  his is quite saf
1db90 65 2c 20 61 73 20 74 68 65 20 70 61 67 65 72 20  e, as the pager 
1dba0 77 69 6c 6c 20 68 61 76 65 0a 2a 2a 20 74 72 61  will have.** tra
1dbb0 6e 73 69 74 69 6f 6e 65 64 20 74 6f 20 74 68 65  nsitioned to the
1dbc0 20 65 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a   error state..**
1dbd0 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65  .** This will re
1dbe0 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20  lease the write 
1dbf0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
1dc00 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74  base file.  If t
1dc10 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61  here.** are no a
1dc20 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69  ctive cursors, i
1dc30 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20  t also releases 
1dc40 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a  the read lock..*
1dc50 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1dc60 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
1dc70 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 62  (Btree *p, int b
1dc80 43 6c 65 61 6e 75 70 29 7b 0a 0a 20 20 69 66 28  Cleanup){..  if(
1dc90 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1dca0 4e 53 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72 6e  NS_NONE ) return
1dcb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71   SQLITE_OK;.  sq
1dcc0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1dcd0 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67  p);.  btreeInteg
1dce0 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  rity(p);..  /* I
1dcf0 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73  f the handle has
1dd00 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
1dd10 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69  tion open, commi
1dd20 74 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  t the shared-btr
1dd30 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61  ees .  ** transa
1dd40 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68  ction and set th
1dd50 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74  e shared state t
1dd60 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20  o TRANS_READ..  
1dd70 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  */.  if( p->inTr
1dd80 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1dd90 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
1dda0 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
1ddb0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20  t = p->pBt;.    
1ddc0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
1ddd0 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
1dde0 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61  S_WRITE );.    a
1ddf0 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61  ssert( pBt->nTra
1de00 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20  nsaction>0 );.  
1de10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1de20 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
1de30 6f 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  o(pBt->pPager);.
1de40 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1de50 54 45 5f 4f 4b 20 26 26 20 62 43 6c 65 61 6e 75  TE_OK && bCleanu
1de60 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  p==0 ){.      sq
1de70 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1de80 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  p);.      return
1de90 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
1dea0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1deb0 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a  n = TRANS_READ;.
1dec0 20 20 20 20 62 74 72 65 65 43 6c 65 61 72 48 61      btreeClearHa
1ded0 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20  sContent(pBt);. 
1dee0 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72   }..  btreeEndTr
1def0 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20  ansaction(p);.  
1df00 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1df10 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
1df20 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1df30 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68 61 73 65  ** Do both phase
1df40 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a  s of a commit..*
1df50 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1df60 65 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a  eeCommit(Btree *
1df70 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
1df80 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1df90 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  r(p);.  rc = sql
1dfa0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
1dfb0 68 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20  haseOne(p, 0);. 
1dfc0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1dfd0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
1dfe0 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
1dff0 74 50 68 61 73 65 54 77 6f 28 70 2c 20 30 29 3b  tPhaseTwo(p, 0);
1e000 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
1e010 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
1e020 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1e030 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1e040 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20 74  sets the state t
1e050 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 61  o CURSOR_FAULT a
1e060 6e 64 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20  nd the error.** 
1e070 63 6f 64 65 20 74 6f 20 65 72 72 43 6f 64 65 20  code to errCode 
1e080 66 6f 72 20 65 76 65 72 79 20 63 75 72 73 6f 72  for every cursor
1e090 20 6f 6e 20 61 6e 79 20 42 74 53 68 61 72 65 64   on any BtShared
1e0a0 20 74 68 61 74 20 70 42 74 72 65 65 0a 2a 2a 20   that pBtree.** 
1e0b0 72 65 66 65 72 65 6e 63 65 73 2e 20 20 4f 72 20  references.  Or 
1e0c0 69 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79  if the writeOnly
1e0d0 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20   flag is set to 
1e0e0 31 2c 20 74 68 65 6e 20 6f 6e 6c 79 0a 2a 2a 20  1, then only.** 
1e0f0 74 72 69 70 20 77 72 69 74 65 20 63 75 72 73 6f  trip write curso
1e100 72 73 20 61 6e 64 20 6c 65 61 76 65 20 72 65 61  rs and leave rea
1e110 64 20 63 75 72 73 6f 72 73 20 75 6e 63 68 61 6e  d cursors unchan
1e120 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79  ged..**.** Every
1e130 20 63 75 72 73 6f 72 20 69 73 20 61 20 63 61 6e   cursor is a can
1e140 64 69 64 61 74 65 20 74 6f 20 62 65 20 74 72 69  didate to be tri
1e150 70 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20  pped, including 
1e160 63 75 72 73 6f 72 73 0a 2a 2a 20 74 68 61 74 20  cursors.** that 
1e170 62 65 6c 6f 6e 67 20 74 6f 20 6f 74 68 65 72 20  belong to other 
1e180 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1e190 69 6f 6e 73 20 74 68 61 74 20 68 61 70 70 65 6e  ions that happen
1e1a0 20 74 6f 20 62 65 0a 2a 2a 20 73 68 61 72 69 6e   to be.** sharin
1e1b0 67 20 74 68 65 20 63 61 63 68 65 20 77 69 74 68  g the cache with
1e1c0 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54   pBtree..**.** T
1e1d0 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73  his routine gets
1e1e0 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72   called when a r
1e1f0 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 20  ollback occurs. 
1e200 49 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79  If the writeOnly
1e210 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75 65  .** flag is true
1e220 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74  , then only writ
1e230 65 2d 63 75 72 73 6f 72 73 20 6e 65 65 64 20 62  e-cursors need b
1e240 65 20 74 72 69 70 70 65 64 20 2d 20 72 65 61 64  e tripped - read
1e250 2d 6f 6e 6c 79 0a 2a 2a 20 63 75 72 73 6f 72 73  -only.** cursors
1e260 20 73 61 76 65 20 74 68 65 69 72 20 63 75 72 72   save their curr
1e270 65 6e 74 20 70 6f 73 69 74 69 6f 6e 73 20 73 6f  ent positions so
1e280 20 74 68 61 74 20 74 68 65 79 20 6d 61 79 20 63   that they may c
1e290 6f 6e 74 69 6e 75 65 20 0a 2a 2a 20 66 6f 6c 6c  ontinue .** foll
1e2a0 6f 77 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61  owing the rollba
1e2b0 63 6b 2e 20 4f 72 2c 20 69 66 20 77 72 69 74 65  ck. Or, if write
1e2c0 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 2c 20 61  Only is false, a
1e2d0 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65 20 0a  ll cursors are .
1e2e0 2a 2a 20 74 72 69 70 70 65 64 2e 20 49 6e 20 67  ** tripped. In g
1e2f0 65 6e 65 72 61 6c 2c 20 77 72 69 74 65 4f 6e 6c  eneral, writeOnl
1e300 79 20 69 73 20 66 61 6c 73 65 20 69 66 20 74 68  y is false if th
1e310 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65  e transaction be
1e320 69 6e 67 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61  ing.** rolled ba
1e330 63 6b 20 6d 6f 64 69 66 69 65 64 20 74 68 65 20  ck modified the 
1e340 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
1e350 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 62 2d   In this case b-
1e360 74 72 65 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67  tree root.** pag
1e370 65 73 20 6d 61 79 20 62 65 20 6d 6f 76 65 64 20  es may be moved 
1e380 6f 72 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20  or deleted from 
1e390 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6c 74  the database alt
1e3a0 6f 67 65 74 68 65 72 2c 20 6d 61 6b 69 6e 67 0a  ogether, making.
1e3b0 2a 2a 20 69 74 20 75 6e 73 61 66 65 20 66 6f 72  ** it unsafe for
1e3c0 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 74 6f   read cursors to
1e3d0 20 63 6f 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a   continue..**.**
1e3e0 20 49 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c   If the writeOnl
1e3f0 79 20 66 6c 61 67 20 69 73 20 74 72 75 65 20 61  y flag is true a
1e400 6e 64 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65  nd an error is e
1e410 6e 63 6f 75 6e 74 65 72 65 64 20 77 68 69 6c 65  ncountered while
1e420 20 0a 2a 2a 20 73 61 76 69 6e 67 20 74 68 65 20   .** saving the 
1e430 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e  current position
1e440 20 6f 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   of a read-only 
1e450 63 75 72 73 6f 72 2c 20 61 6c 6c 20 63 75 72 73  cursor, all curs
1e460 6f 72 73 2c 20 0a 2a 2a 20 69 6e 63 6c 75 64 69  ors, .** includi
1e470 6e 67 20 61 6c 6c 20 72 65 61 64 2d 63 75 72 73  ng all read-curs
1e480 6f 72 73 20 61 72 65 20 74 72 69 70 70 65 64 2e  ors are tripped.
1e490 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
1e4a0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
1e4b0 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 69  successful, or i
1e4c0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1e4d0 73 20 77 68 69 6c 65 0a 2a 2a 20 73 61 76 69 6e  s while.** savin
1e4e0 67 20 61 20 63 75 72 73 6f 72 20 70 6f 73 69 74  g a cursor posit
1e4f0 69 6f 6e 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  ion, an SQLite e
1e500 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e  rror code..*/.in
1e510 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72  t sqlite3BtreeTr
1e520 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 72  ipAllCursors(Btr
1e530 65 65 20 2a 70 42 74 72 65 65 2c 20 69 6e 74 20  ee *pBtree, int 
1e540 65 72 72 43 6f 64 65 2c 20 69 6e 74 20 77 72 69  errCode, int wri
1e550 74 65 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72  teOnly){.  BtCur
1e560 73 6f 72 20 2a 70 3b 0a 20 20 69 6e 74 20 72 63  sor *p;.  int rc
1e570 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
1e580 20 61 73 73 65 72 74 28 20 28 77 72 69 74 65 4f   assert( (writeO
1e590 6e 6c 79 3d 3d 30 20 7c 7c 20 77 72 69 74 65 4f  nly==0 || writeO
1e5a0 6e 6c 79 3d 3d 31 29 20 26 26 20 42 54 43 46 5f  nly==1) && BTCF_
1e5b0 57 72 69 74 65 46 6c 61 67 3d 3d 31 20 29 3b 0a  WriteFlag==1 );.
1e5c0 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a    if( pBtree ){.
1e5d0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1e5e0 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20  Enter(pBtree);. 
1e5f0 20 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d     for(p=pBtree-
1e600 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  >pBt->pCursor; p
1e610 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
1e620 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
1e630 20 20 69 66 28 20 77 72 69 74 65 4f 6e 6c 79 20    if( writeOnly 
1e640 26 26 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20  && (p->curFlags 
1e650 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67  & BTCF_WriteFlag
1e660 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1e670 69 66 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43  if( p->eState==C
1e680 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
1e690 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 61           rc = sa
1e6a0 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
1e6b0 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  (p);.          i
1e6c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1e6d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1e6e0 28 76 6f 69 64 29 73 71 6c 69 74 65 33 42 74 72  (void)sqlite3Btr
1e6f0 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
1e700 28 70 42 74 72 65 65 2c 20 72 63 2c 20 30 29 3b  (pBtree, rc, 0);
1e710 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
1e720 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
1e730 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e740 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
1e750 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
1e760 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20 20 20  Cursor(p);.     
1e770 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43     p->eState = C
1e780 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20  URSOR_FAULT;.   
1e790 20 20 20 20 20 70 2d 3e 73 6b 69 70 4e 65 78 74       p->skipNext
1e7a0 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20   = errCode;.    
1e7b0 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d    }.      for(i=
1e7c0 30 3b 20 69 3c 3d 70 2d 3e 69 50 61 67 65 3b 20  0; i<=p->iPage; 
1e7d0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 72 65  i++){.        re
1e7e0 6c 65 61 73 65 50 61 67 65 28 70 2d 3e 61 70 50  leasePage(p->apP
1e7f0 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  age[i]);.       
1e800 20 70 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20   p->apPage[i] = 
1e810 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
1e820 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1e830 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a  eLeave(pBtree);.
1e840 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1e850 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
1e860 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
1e870 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a  on in progress..
1e880 2a 2a 0a 2a 2a 20 49 66 20 74 72 69 70 43 6f 64  **.** If tripCod
1e890 65 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f  e is not SQLITE_
1e8a0 4f 4b 20 74 68 65 6e 20 63 75 72 73 6f 72 73 20  OK then cursors 
1e8b0 77 69 6c 6c 20 62 65 20 69 6e 76 61 6c 69 64 61  will be invalida
1e8c0 74 65 64 20 28 74 72 69 70 70 65 64 29 2e 0a 2a  ted (tripped)..*
1e8d0 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20 63 75 72  * Only write cur
1e8e0 73 6f 72 73 20 61 72 65 20 74 72 69 70 70 65 64  sors are tripped
1e8f0 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73   if writeOnly is
1e900 20 74 72 75 65 20 62 75 74 20 61 6c 6c 20 63 75   true but all cu
1e910 72 73 6f 72 73 20 61 72 65 0a 2a 2a 20 74 72 69  rsors are.** tri
1e920 70 70 65 64 20 69 66 20 77 72 69 74 65 4f 6e 6c  pped if writeOnl
1e930 79 20 69 73 20 66 61 6c 73 65 2e 20 20 41 6e 79  y is false.  Any
1e940 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 0a   attempt to use.
1e950 2a 2a 20 61 20 74 72 69 70 70 65 64 20 63 75 72  ** a tripped cur
1e960 73 6f 72 20 77 69 6c 6c 20 72 65 73 75 6c 74 20  sor will result 
1e970 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a  in an error..**.
1e980 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c  ** This will rel
1e990 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
1e9a0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
1e9b0 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ase file.  If th
1e9c0 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
1e9d0 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74  tive cursors, it
1e9e0 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74   also releases t
1e9f0 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f  he read lock..*/
1ea00 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1ea10 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20  eRollback(Btree 
1ea20 2a 70 2c 20 69 6e 74 20 74 72 69 70 43 6f 64 65  *p, int tripCode
1ea30 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29  , int writeOnly)
1ea40 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
1ea50 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1ea60 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20  >pBt;.  MemPage 
1ea70 2a 70 50 61 67 65 31 3b 0a 0a 20 20 61 73 73 65  *pPage1;..  asse
1ea80 72 74 28 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31  rt( writeOnly==1
1ea90 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 30   || writeOnly==0
1eaa0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 72   );.  assert( tr
1eab0 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 41  ipCode==SQLITE_A
1eac0 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c  BORT_ROLLBACK ||
1ead0 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54   tripCode==SQLIT
1eae0 45 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65  E_OK );.  sqlite
1eaf0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1eb00 20 20 69 66 28 20 74 72 69 70 43 6f 64 65 3d 3d    if( tripCode==
1eb10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1eb20 20 72 63 20 3d 20 74 72 69 70 43 6f 64 65 20 3d   rc = tripCode =
1eb30 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
1eb40 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  pBt, 0, 0);.    
1eb50 69 66 28 20 72 63 20 29 20 77 72 69 74 65 4f 6e  if( rc ) writeOn
1eb60 6c 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ly = 0;.  }else{
1eb70 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1eb80 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74  _OK;.  }.  if( t
1eb90 72 69 70 43 6f 64 65 20 29 7b 0a 20 20 20 20 69  ripCode ){.    i
1eba0 6e 74 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33  nt rc2 = sqlite3
1ebb0 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73  BtreeTripAllCurs
1ebc0 6f 72 73 28 70 2c 20 74 72 69 70 43 6f 64 65 2c  ors(p, tripCode,
1ebd0 20 77 72 69 74 65 4f 6e 6c 79 29 3b 0a 20 20 20   writeOnly);.   
1ebe0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
1ebf0 49 54 45 5f 4f 4b 20 7c 7c 20 28 77 72 69 74 65  ITE_OK || (write
1ec00 4f 6e 6c 79 3d 3d 30 20 26 26 20 72 63 32 3d 3d  Only==0 && rc2==
1ec10 53 51 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a 20 20  SQLITE_OK) );.  
1ec20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54    if( rc2!=SQLIT
1ec30 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b  E_OK ) rc = rc2;
1ec40 0a 20 20 7d 0a 20 20 62 74 72 65 65 49 6e 74 65  .  }.  btreeInte
1ec50 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 69 66 28  grity(p);..  if(
1ec60 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1ec70 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
1ec80 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20 61 73  int rc2;..    as
1ec90 73 65 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54  sert( TRANS_WRIT
1eca0 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  E==pBt->inTransa
1ecb0 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32  ction );.    rc2
1ecc0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
1ecd0 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61  ollback(pBt->pPa
1ece0 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
1ecf0 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  2!=SQLITE_OK ){.
1ed00 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
1ed10 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
1ed20 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68  e rollback may h
1ed30 61 76 65 20 64 65 73 74 72 6f 79 65 64 20 74 68  ave destroyed th
1ed40 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  e pPage1->aData 
1ed50 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a  value.  So.    *
1ed60 2a 20 63 61 6c 6c 20 62 74 72 65 65 47 65 74 50  * call btreeGetP
1ed70 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20  age() on page 1 
1ed80 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20  again to make.  
1ed90 20 20 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31    ** sure pPage1
1eda0 2d 3e 61 44 61 74 61 20 69 73 20 73 65 74 20 63  ->aData is set c
1edb0 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20  orrectly. */.   
1edc0 20 69 66 28 20 62 74 72 65 65 47 65 74 50 61 67   if( btreeGetPag
1edd0 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65  e(pBt, 1, &pPage
1ede0 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  1, 0)==SQLITE_OK
1edf0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50   ){.      int nP
1ee00 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 32  age = get4byte(2
1ee10 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61  8+(u8*)pPage1->a
1ee20 44 61 74 61 29 3b 0a 20 20 20 20 20 20 74 65 73  Data);.      tes
1ee30 74 63 61 73 65 28 20 6e 50 61 67 65 3d 3d 30 20  tcase( nPage==0 
1ee40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61  );.      if( nPa
1ee50 67 65 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 50  ge==0 ) sqlite3P
1ee60 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
1ee70 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67  t->pPager, &nPag
1ee80 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  e);.      testca
1ee90 73 65 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d  se( pBt->nPage!=
1eea0 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 70  nPage );.      p
1eeb0 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67  Bt->nPage = nPag
1eec0 65 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  e;.      release
1eed0 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
1eee0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
1eef0 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72  countValidCursor
1ef00 73 28 70 42 74 2c 20 31 29 3d 3d 30 20 29 3b 0a  s(pBt, 1)==0 );.
1ef10 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
1ef20 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52  action = TRANS_R
1ef30 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c  EAD;.    btreeCl
1ef40 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42  earHasContent(pB
1ef50 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  t);.  }..  btree
1ef60 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  EndTransaction(p
1ef70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
1ef80 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
1ef90 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1efa0 20 53 74 61 72 74 20 61 20 73 74 61 74 65 6d 65   Start a stateme
1efb0 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
1efc0 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61  n. The subtransa
1efd0 63 74 69 6f 6e 20 63 61 6e 20 62 65 20 72 6f 6c  ction can be rol
1efe0 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65  led.** back inde
1eff0 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65  pendently of the
1f000 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f   main transactio
1f010 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73 74 61 72  n. You must star
1f020 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  t a transaction 
1f030 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74 61 72 74  .** before start
1f040 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61 63  ing a subtransac
1f050 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61  tion. The subtra
1f060 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65  nsaction is ende
1f070 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
1f080 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61 69 6e 20  .** if the main 
1f090 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d  transaction comm
1f0a0 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63  its or rolls bac
1f0b0 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65  k..**.** Stateme
1f0c0 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
1f0d0 6e 73 20 61 72 65 20 75 73 65 64 20 61 72 6f 75  ns are used arou
1f0e0 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51  nd individual SQ
1f0f0 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20  L statements.** 
1f100 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e  that are contain
1f110 65 64 20 77 69 74 68 69 6e 20 61 20 42 45 47 49  ed within a BEGI
1f120 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b  N...COMMIT block
1f130 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69  .  If a constrai
1f140 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75  nt.** error occu
1f150 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 74  rs within the st
1f160 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66  atement, the eff
1f170 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20  ect of that one 
1f180 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e  statement.** can
1f190 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
1f1a0 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
1f1b0 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65  o rollback the e
1f1c0 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f  ntire transactio
1f1d0 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65  n..**.** A state
1f1e0 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e 73 61 63  ment sub-transac
1f1f0 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e  tion is implemen
1f200 74 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d  ted as an anonym
1f210 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2e 20 54  ous savepoint. T
1f220 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73 73  he.** value pass
1f230 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
1f240 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
1f250 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
1f260 66 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a  f savepoints,.**
1f270 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6e   including the n
1f280 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76  ew anonymous sav
1f290 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20  epoint, open on 
1f2a0 74 68 65 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e  the B-Tree. i.e.
1f2b0 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   if there.** are
1f2c0 20 6e 6f 20 61 63 74 69 76 65 20 73 61 76 65 70   no active savep
1f2d0 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68  oints and no oth
1f2e0 65 72 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61  er statement-tra
1f2f0 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a  nsactions open,.
1f300 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74 20 69 73  ** iStatement is
1f310 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f   1. This anonymo
1f320 75 73 20 73 61 76 65 70 6f 69 6e 74 20 63 61 6e  us savepoint can
1f330 20 62 65 20 72 65 6c 65 61 73 65 64 20 6f 72 20   be released or 
1f340 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75  rolled back.** u
1f350 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33  sing the sqlite3
1f360 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 29  BtreeSavepoint()
1f370 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e   function..*/.in
1f380 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  t sqlite3BtreeBe
1f390 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70  ginStmt(Btree *p
1f3a0 2c 20 69 6e 74 20 69 53 74 61 74 65 6d 65 6e 74  , int iStatement
1f3b0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
1f3c0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1f3d0 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33  ->pBt;.  sqlite3
1f3e0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
1f3f0 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72   assert( p->inTr
1f400 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1f410 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
1f420 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
1f430 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30  TS_READ_ONLY)==0
1f440 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53   );.  assert( iS
1f450 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20  tatement>0 );.  
1f460 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65  assert( iStateme
1f470 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70  nt>p->db->nSavep
1f480 6f 69 6e 74 20 29 3b 0a 20 20 61 73 73 65 72 74  oint );.  assert
1f490 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
1f4a0 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
1f4b0 45 20 29 3b 0a 20 20 2f 2a 20 41 74 20 74 68 65  E );.  /* At the
1f4c0 20 70 61 67 65 72 20 6c 65 76 65 6c 2c 20 61 20   pager level, a 
1f4d0 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
1f4e0 63 74 69 6f 6e 20 69 73 20 61 20 73 61 76 65 70  ction is a savep
1f4f0 6f 69 6e 74 20 77 69 74 68 0a 20 20 2a 2a 20 61  oint with.  ** a
1f500 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65 72 20  n index greater 
1f510 74 68 61 6e 20 61 6c 6c 20 73 61 76 65 70 6f 69  than all savepoi
1f520 6e 74 73 20 63 72 65 61 74 65 64 20 65 78 70 6c  nts created expl
1f530 69 63 69 74 6c 79 20 75 73 69 6e 67 0a 20 20 2a  icitly using.  *
1f540 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  * SQL statements
1f550 2e 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20  . It is illegal 
1f560 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65  to open, release
1f570 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79   or rollback any
1f580 0a 20 20 2a 2a 20 73 75 63 68 20 73 61 76 65 70  .  ** such savep
1f590 6f 69 6e 74 73 20 77 68 69 6c 65 20 74 68 65 20  oints while the 
1f5a0 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
1f5b0 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20  ction savepoint 
1f5c0 69 73 20 61 63 74 69 76 65 2e 0a 20 20 2a 2f 0a  is active..  */.
1f5d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1f5e0 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74  gerOpenSavepoint
1f5f0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 53  (pBt->pPager, iS
1f600 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 73 71 6c  tatement);.  sql
1f610 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1f620 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1f630 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63  }../*.** The sec
1f640 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
1f650 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f  this function, o
1f660 70 2c 20 69 73 20 61 6c 77 61 79 73 20 53 41 56  p, is always SAV
1f670 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a  EPOINT_ROLLBACK.
1f680 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f  ** or SAVEPOINT_
1f690 52 45 4c 45 41 53 45 2e 20 54 68 69 73 20 66 75  RELEASE. This fu
1f6a0 6e 63 74 69 6f 6e 20 65 69 74 68 65 72 20 72 65  nction either re
1f6b0 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73 20  leases or rolls 
1f6c0 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76 65  back the.** save
1f6d0 70 6f 69 6e 74 20 69 64 65 6e 74 69 66 69 65 64  point identified
1f6e0 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 69 53   by parameter iS
1f6f0 61 76 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e 64  avepoint, depend
1f700 69 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c 75 65  ing on the value
1f710 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a   .** of op..**.*
1f720 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61 76  * Normally, iSav
1f730 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74 65  epoint is greate
1f740 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
1f750 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65 72  to zero. However
1f760 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53 41  , if op is.** SA
1f770 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
1f780 2c 20 74 68 65 6e 20 69 53 61 76 65 70 6f 69 6e  , then iSavepoin
1f790 74 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d 31  t may also be -1
1f7a0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
1f7b0 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  he .** contents 
1f7c0 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 72  of the entire tr
1f7d0 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 72 6f  ansaction are ro
1f7e0 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20  lled back. This 
1f7f0 69 73 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  is different.** 
1f800 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72  from a normal tr
1f810 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61  ansaction rollba
1f820 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20  ck, as no locks 
1f830 61 72 65 20 72 65 6c 65 61 73 65 64 20 61 6e 64  are released and
1f840 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74   the.** transact
1f850 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e  ion remains open
1f860 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1f870 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 42  BtreeSavepoint(B
1f880 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c  tree *p, int op,
1f890 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29   int iSavepoint)
1f8a0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1f8b0 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20  ITE_OK;.  if( p 
1f8c0 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  && p->inTrans==T
1f8d0 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
1f8e0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1f8f0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73  = p->pBt;.    as
1f900 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f  sert( op==SAVEPO
1f910 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f  INT_RELEASE || o
1f920 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
1f930 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20 61 73 73  LBACK );.    ass
1f940 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e  ert( iSavepoint>
1f950 3d 30 20 7c 7c 20 28 69 53 61 76 65 70 6f 69 6e  =0 || (iSavepoin
1f960 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56  t==-1 && op==SAV
1f970 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29  EPOINT_ROLLBACK)
1f980 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   );.    sqlite3B
1f990 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1f9a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1f9b0 67 65 72 53 61 76 65 70 6f 69 6e 74 28 70 42 74  gerSavepoint(pBt
1f9c0 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c 20 69 53  ->pPager, op, iS
1f9d0 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 69  avepoint);.    i
1f9e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1f9f0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 53   ){.      if( iS
1fa00 61 76 65 70 6f 69 6e 74 3c 30 20 26 26 20 28 70  avepoint<0 && (p
1fa10 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
1fa20 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50  TS_INITIALLY_EMP
1fa30 54 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  TY)!=0 ){.      
1fa40 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30    pBt->nPage = 0
1fa50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1fa60 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65  rc = newDatabase
1fa70 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70 42 74  (pBt);.      pBt
1fa80 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79  ->nPage = get4by
1fa90 74 65 28 32 38 20 2b 20 70 42 74 2d 3e 70 50 61  te(28 + pBt->pPa
1faa0 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 0a 20 20  ge1->aData);..  
1fab0 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
1fac0 61 73 65 20 73 69 7a 65 20 77 61 73 20 77 72 69  ase size was wri
1fad0 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6f 66  tten into the of
1fae0 66 73 65 74 20 32 38 20 6f 66 20 74 68 65 20 68  fset 28 of the h
1faf0 65 61 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 77  eader.      ** w
1fb00 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74  hen the transact
1fb10 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 73 6f 20  ion started, so 
1fb20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
1fb30 20 76 61 6c 75 65 20 61 74 20 6f 66 66 73 65 74   value at offset
1fb40 0a 20 20 20 20 20 20 2a 2a 20 32 38 20 69 73 20  .      ** 28 is 
1fb50 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20 20 20  nonzero. */.    
1fb60 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
1fb70 50 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 7d 0a  Page>0 );.    }.
1fb80 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1fb90 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Leave(p);.  }.  
1fba0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1fbb0 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
1fbc0 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
1fbd0 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74  BTree whose root
1fbe0 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a   is on the page.
1fbf0 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66 20 61 20  ** iTable. If a 
1fc00 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72  read-only cursor
1fc10 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69   is requested, i
1fc20 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
1fc30 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20  t.** the caller 
1fc40 61 6c 72 65 61 64 79 20 68 61 73 20 61 74 20 6c  already has at l
1fc50 65 61 73 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79  east a read-only
1fc60 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
1fc70 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61  n.** on the data
1fc80 62 61 73 65 20 61 6c 72 65 61 64 79 2e 20 49 66  base already. If
1fc90 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20   a write-cursor 
1fca0 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68  is requested, th
1fcb0 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72  en.** the caller
1fcc0 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 68   is assumed to h
1fcd0 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
1fce0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
1fcf0 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d  *.** If wrFlag==
1fd00 30 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  0, then the curs
1fd10 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75  or can only be u
1fd20 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e  sed for reading.
1fd30 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 31  .** If wrFlag==1
1fd40 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
1fd50 72 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f  r can be used fo
1fd60 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72  r reading or for
1fd70 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69 66 20 6f  .** writing if o
1fd80 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20  ther conditions 
1fd90 66 6f 72 20 77 72 69 74 69 6e 67 20 61 72 65 20  for writing are 
1fda0 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65  also met.  These
1fdb0 0a 2a 2a 20 61 72 65 20 74 68 65 20 63 6f 6e 64  .** are the cond
1fdc0 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74  itions that must
1fdd0 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72   be met in order
1fde0 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 0a   for writing to.
1fdf0 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a  ** be allowed:.*
1fe00 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72  *.** 1:  The cur
1fe10 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62 65  sor must have be
1fe20 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77  en opened with w
1fe30 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32  rFlag==1.**.** 2
1fe40 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62 61 73  :  Other databas
1fe50 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68  e connections th
1fe60 61 74 20 73 68 61 72 65 20 74 68 65 20 73 61 6d  at share the sam
1fe70 65 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a  e pager cache.**
1fe80 20 20 20 20 20 62 75 74 20 77 68 69 63 68 20 61       but which a
1fe90 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45  re not in the RE
1fea0 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73  AD_UNCOMMITTED s
1feb0 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76  tate may not hav
1fec0 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73  e.**     cursors
1fed0 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61   open with wrFla
1fee0 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65  g==0 on the same
1fef0 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69   table.  Otherwi
1ff00 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68  se.**     the ch
1ff10 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68  anges made by th
1ff20 69 73 20 77 72 69 74 65 20 63 75 72 73 6f 72 20  is write cursor 
1ff30 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65  would be visible
1ff40 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72   to.**     the r
1ff50 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74  ead cursors in t
1ff60 68 65 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  he other databas
1ff70 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a  e connection..**
1ff80 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61  .** 3:  The data
1ff90 62 61 73 65 20 6d 75 73 74 20 62 65 20 77 72 69  base must be wri
1ffa0 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65  table (not on re
1ffb0 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a  ad-only media).*
1ffc0 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d  *.** 4:  There m
1ffd0 75 73 74 20 62 65 20 61 6e 20 61 63 74 69 76 65  ust be an active
1ffe0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
1fff0 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20  .** No checking 
20000 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20  is done to make 
20010 73 75 72 65 20 74 68 61 74 20 70 61 67 65 20 69  sure that page i
20020 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20  Table really is 
20030 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65  the.** root page
20040 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49   of a b-tree.  I
20050 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65  f it is not, the
20060 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 71  n the cursor acq
20070 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  uired.** will no
20080 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79  t work correctly
20090 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73  ..**.** It is as
200a0 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 73  sumed that the s
200b0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
200c0 72 5a 65 72 6f 28 29 20 68 61 73 20 62 65 65 6e  rZero() has been
200d0 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20 70 43   called.** on pC
200e0 75 72 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ur to initialize
200f0 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 70 61 63   the memory spac
20100 65 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b  e prior to invok
20110 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
20120 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
20130 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42  btreeCursor(.  B
20140 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
20150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20160 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
20170 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ee */.  int iTab
20180 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
20190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
201a0 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  * Root page of t
201b0 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  able to open */.
201c0 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20    int wrFlag,   
201d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201e0 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f           /* 1 to
201f0 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f   write. 0 read-o
20200 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  nly */.  struct 
20210 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
20220 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
20230 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20  /* First arg to 
20240 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
20250 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  ion */.  BtCurso
20260 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20  r *pCur         
20270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20280 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e 65 77  /* Space for new
20290 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20   cursor */.){.  
202a0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
202b0 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20  p->pBt;         
202c0 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64         /* Shared
202d0 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65 20 2a   b-tree handle *
202e0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
202f0 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
20300 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
20310 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c  rt( wrFlag==0 ||
20320 20 77 72 46 6c 61 67 3d 3d 31 20 29 3b 0a 0a 20   wrFlag==1 );.. 
20330 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
20340 67 20 61 73 73 65 72 74 20 73 74 61 74 65 6d 65  g assert stateme
20350 6e 74 73 20 76 65 72 69 66 79 20 74 68 61 74 20  nts verify that 
20360 69 66 20 74 68 69 73 20 69 73 20 61 20 73 68 61  if this is a sha
20370 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74 72  rable .  ** b-tr
20380 65 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ee database, the
20390 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68   connection is h
203a0 6f 6c 64 69 6e 67 20 74 68 65 20 72 65 71 75 69  olding the requi
203b0 72 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2c  red table locks,
203c0 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61 74 20   .  ** and that 
203d0 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  no other connect
203e0 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70 65 6e  ion has any open
203f0 20 63 75 72 73 6f 72 20 74 68 61 74 20 63 6f 6e   cursor that con
20400 66 6c 69 63 74 73 20 77 69 74 68 20 0a 20 20 2a  flicts with .  *
20410 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f  * this lock.  */
20420 0a 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68  .  assert( hasSh
20430 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
20440 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 4b  ck(p, iTable, pK
20450 65 79 49 6e 66 6f 21 3d 30 2c 20 77 72 46 6c 61  eyInfo!=0, wrFla
20460 67 2b 31 29 20 29 3b 0a 20 20 61 73 73 65 72 74  g+1) );.  assert
20470 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 21  ( wrFlag==0 || !
20480 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73  hasReadConflicts
20490 28 70 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a 0a  (p, iTable) );..
204a0 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74    /* Assert that
204b0 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
204c0 6f 70 65 6e 65 64 20 74 68 65 20 72 65 71 75 69  opened the requi
204d0 72 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  red transaction.
204e0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
204f0 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e  >inTrans>TRANS_N
20500 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ONE );.  assert(
20510 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d   wrFlag==0 || p-
20520 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
20530 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72  WRITE );.  asser
20540 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20 26  t( pBt->pPage1 &
20550 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  & pBt->pPage1->a
20560 44 61 74 61 20 29 3b 0a 0a 20 20 69 66 28 20 4e  Data );..  if( N
20570 45 56 45 52 28 77 72 46 6c 61 67 20 26 26 20 28  EVER(wrFlag && (
20580 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
20590 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d  BTS_READ_ONLY)!=
205a0 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
205b0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
205c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 77 72 46 6c  ;.  }.  if( wrFl
205d0 61 67 20 29 7b 0a 20 20 20 20 61 6c 6c 6f 63 61  ag ){.    alloca
205e0 74 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  teTempSpace(pBt)
205f0 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70  ;.    if( pBt->p
20600 54 6d 70 53 70 61 63 65 3d 3d 30 20 29 20 72 65  TmpSpace==0 ) re
20610 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
20620 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61  M;.  }.  if( iTa
20630 62 6c 65 3d 3d 31 20 26 26 20 62 74 72 65 65 50  ble==1 && btreeP
20640 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30  agecount(pBt)==0
20650 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
20660 77 72 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20  wrFlag==0 );.   
20670 20 69 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d   iTable = 0;.  }
20680 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20  ..  /* Now that 
20690 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20  no other errors 
206a0 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73  can occur, finis
206b0 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65  h filling in the
206c0 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76   BtCursor.  ** v
206d0 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e  ariables and lin
206e0 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74  k the cursor int
206f0 6f 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6c  o the BtShared l
20700 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d  ist.  */.  pCur-
20710 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e  >pgnoRoot = (Pgn
20720 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72  o)iTable;.  pCur
20730 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20  ->iPage = -1;.  
20740 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d  pCur->pKeyInfo =
20750 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75   pKeyInfo;.  pCu
20760 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20  r->pBtree = p;. 
20770 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74   pCur->pBt = pBt
20780 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c  ;.  assert( wrFl
20790 61 67 3d 3d 30 20 7c 7c 20 77 72 46 6c 61 67 3d  ag==0 || wrFlag=
207a0 3d 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 20  =BTCF_WriteFlag 
207b0 29 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  );.  pCur->curFl
207c0 61 67 73 20 3d 20 77 72 46 6c 61 67 3b 0a 20 20  ags = wrFlag;.  
207d0 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42  pCur->pNext = pB
207e0 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69 66  t->pCursor;.  if
207f0 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b  ( pCur->pNext ){
20800 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74  .    pCur->pNext
20810 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 3b 0a  ->pPrev = pCur;.
20820 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75 72 73    }.  pBt->pCurs
20830 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43 75  or = pCur;.  pCu
20840 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
20850 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 65  OR_INVALID;.  re
20860 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
20870 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  }.int sqlite3Btr
20880 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65  eeCursor(.  Btre
20890 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
208a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
208b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
208c0 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54  tree */.  int iT
208d0 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  able,           
208e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
208f0 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61        /* Root pa
20900 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f  ge of table to o
20910 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46  pen */.  int wrF
20920 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  lag,            
20930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20940 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69       /* 1 to wri
20950 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20  te. 0 read-only 
20960 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49  */.  struct KeyI
20970 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
20980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20990 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f   /* First arg to
209a0 20 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20   xCompare() */. 
209b0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20   BtCursor *pCur 
209c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
209e0 57 72 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72  Write new cursor
209f0 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
20a00 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
20a10 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
20a20 72 63 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72  rc = btreeCursor
20a30 28 70 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c  (p, iTable, wrFl
20a40 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43  ag, pKeyInfo, pC
20a50 75 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ur);.  sqlite3Bt
20a60 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
20a70 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
20a80 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69  ** Return the si
20a90 7a 65 20 6f 66 20 61 20 42 74 43 75 72 73 6f 72  ze of a BtCursor
20aa0 20 6f 62 6a 65 63 74 20 69 6e 20 62 79 74 65 73   object in bytes
20ab0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74  ..**.** This int
20ac0 65 72 66 61 63 65 73 20 69 73 20 6e 65 65 64 65  erfaces is neede
20ad0 64 20 73 6f 20 74 68 61 74 20 75 73 65 72 73 20  d so that users 
20ae0 6f 66 20 63 75 72 73 6f 72 73 20 63 61 6e 20 70  of cursors can p
20af0 72 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75  reallocate.** su
20b00 66 66 69 63 69 65 6e 74 20 73 74 6f 72 61 67 65  fficient storage
20b10 20 74 6f 20 68 6f 6c 64 20 61 20 63 75 72 73 6f   to hold a curso
20b20 72 2e 20 20 54 68 65 20 42 74 43 75 72 73 6f 72  r.  The BtCursor
20b30 20 6f 62 6a 65 63 74 20 69 73 20 6f 70 61 71 75   object is opaqu
20b40 65 0a 2a 2a 20 74 6f 20 75 73 65 72 73 20 73 6f  e.** to users so
20b50 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20   they cannot do 
20b60 74 68 65 20 73 69 7a 65 6f 66 28 29 20 74 68 65  the sizeof() the
20b70 6d 73 65 6c 76 65 73 20 2d 20 74 68 65 79 20 6d  mselves - they m
20b80 75 73 74 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73  ust call.** this
20b90 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74   routine..*/.int
20ba0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
20bb0 73 6f 72 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20  sorSize(void){. 
20bc0 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 73   return ROUND8(s
20bd0 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72 29 29  izeof(BtCursor))
20be0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
20bf0 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 74 68 61  alize memory tha
20c00 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72  t will be conver
20c10 74 65 64 20 69 6e 74 6f 20 61 20 42 74 43 75 72  ted into a BtCur
20c20 73 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  sor object..**.*
20c30 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 61 70 70  * The simple app
20c40 72 6f 61 63 68 20 68 65 72 65 20 77 6f 75 6c 64  roach here would
20c50 20 62 65 20 74 6f 20 6d 65 6d 73 65 74 28 29 20   be to memset() 
20c60 74 68 65 20 65 6e 74 69 72 65 20 6f 62 6a 65 63  the entire objec
20c70 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f 2e 20 20 42  t.** to zero.  B
20c80 75 74 20 69 74 20 74 75 72 6e 73 20 6f 75 74 20  ut it turns out 
20c90 74 68 61 74 20 74 68 65 20 61 70 50 61 67 65 5b  that the apPage[
20ca0 5d 20 61 6e 64 20 61 69 49 64 78 5b 5d 20 61 72  ] and aiIdx[] ar
20cb0 72 61 79 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e  rays.** do not n
20cc0 65 65 64 20 74 6f 20 62 65 20 7a 65 72 6f 65 64  eed to be zeroed
20cd0 20 61 6e 64 20 74 68 65 79 20 61 72 65 20 6c 61   and they are la
20ce0 72 67 65 2c 20 73 6f 20 77 65 20 63 61 6e 20 73  rge, so we can s
20cf0 61 76 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20  ave a lot.** of 
20d00 72 75 6e 2d 74 69 6d 65 20 62 79 20 73 6b 69 70  run-time by skip
20d10 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c  ping the initial
20d20 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 6f 73 65  ization of those
20d30 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f   elements..*/.vo
20d40 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
20d50 75 72 73 6f 72 5a 65 72 6f 28 42 74 43 75 72 73  ursorZero(BtCurs
20d60 6f 72 20 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74  or *p){.  memset
20d70 28 70 2c 20 30 2c 20 6f 66 66 73 65 74 6f 66 28  (p, 0, offsetof(
20d80 42 74 43 75 72 73 6f 72 2c 20 69 50 61 67 65 29  BtCursor, iPage)
20d90 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  );.}../*.** Clos
20da0 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65  e a cursor.  The
20db0 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
20dc0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
20dd0 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77  is released.** w
20de0 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72  hen the last cur
20df0 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a  sor is closed..*
20e00 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
20e10 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74  eeCloseCursor(Bt
20e20 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
20e30 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 20 3d   Btree *pBtree =
20e40 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20   pCur->pBtree;. 
20e50 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20   if( pBtree ){. 
20e60 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74     int i;.    Bt
20e70 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
20e80 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c  ur->pBt;.    sql
20e90 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
20ea0 42 74 72 65 65 29 3b 0a 20 20 20 20 73 71 6c 69  Btree);.    sqli
20eb0 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72  te3BtreeClearCur
20ec0 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 20 20 69  sor(pCur);.    i
20ed0 66 28 20 70 43 75 72 2d 3e 70 50 72 65 76 20 29  f( pCur->pPrev )
20ee0 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70 50  {.      pCur->pP
20ef0 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75  rev->pNext = pCu
20f00 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65  r->pNext;.    }e
20f10 6c 73 65 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  lse{.      pBt->
20f20 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e  pCursor = pCur->
20f30 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  pNext;.    }.   
20f40 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74   if( pCur->pNext
20f50 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
20f60 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
20f70 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20  Cur->pPrev;.    
20f80 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
20f90 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69  <=pCur->iPage; i
20fa0 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  ++){.      relea
20fb0 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50  sePage(pCur->apP
20fc0 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  age[i]);.    }. 
20fd0 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66     unlockBtreeIf
20fe0 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20  Unused(pBt);.   
20ff0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
21000 42 74 72 65 65 2d 3e 64 62 2c 20 70 43 75 72 2d  Btree->db, pCur-
21010 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20  >aOverflow);.   
21020 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65   /* sqlite3_free
21030 28 70 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73  (pCur); */.    s
21040 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
21050 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20  (pBtree);.  }.  
21060 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
21070 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
21080 73 75 72 65 20 74 68 65 20 42 74 43 75 72 73 6f  sure the BtCurso
21090 72 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  r* given in the 
210a0 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61 20 76  argument has a v
210b0 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72  alid.** BtCursor
210c0 2e 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  .info structure.
210d0 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61    If it is not a
210e0 6c 72 65 61 64 79 20 76 61 6c 69 64 2c 20 63 61  lready valid, ca
210f0 6c 6c 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65  ll.** btreeParse
21100 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69  Cell() to fill i
21110 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75  t in..**.** BtCu
21120 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20 63  rsor.info is a c
21130 61 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66 6f  ache of the info
21140 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 63  rmation in the c
21150 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20  urrent cell..** 
21160 55 73 69 6e 67 20 74 68 69 73 20 63 61 63 68 65  Using this cache
21170 20 72 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d   reduces the num
21180 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20  ber of calls to 
21190 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29  btreeParseCell()
211a0 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 37 2d 30 36 2d  ..**.** 2007-06-
211b0 32 35 3a 20 20 54 68 65 72 65 20 69 73 20 61 20  25:  There is a 
211c0 62 75 67 20 69 6e 20 73 6f 6d 65 20 76 65 72 73  bug in some vers
211d0 69 6f 6e 73 20 6f 66 20 4d 53 56 43 20 74 68 61  ions of MSVC tha
211e0 74 20 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 63  t cause the.** c
211f0 6f 6d 70 69 6c 65 72 20 74 6f 20 63 72 61 73 68  ompiler to crash
21200 20 77 68 65 6e 20 67 65 74 43 65 6c 6c 49 6e 66   when getCellInf
21210 6f 28 29 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  o() is implement
21220 65 64 20 61 73 20 61 20 6d 61 63 72 6f 2e 0a 2a  ed as a macro..*
21230 2a 20 42 75 74 20 74 68 65 72 65 20 69 73 20 61  * But there is a
21240 20 6d 65 61 73 75 72 65 61 62 6c 65 20 73 70 65   measureable spe
21250 65 64 20 61 64 76 61 6e 74 61 67 65 20 74 6f 20  ed advantage to 
21260 75 73 69 6e 67 20 74 68 65 20 6d 61 63 72 6f 20  using the macro 
21270 6f 6e 20 67 63 63 0a 2a 2a 20 28 77 68 65 6e 20  on gcc.** (when 
21280 6c 65 73 73 20 63 6f 6d 70 69 6c 65 72 20 6f 70  less compiler op
21290 74 69 6d 69 7a 61 74 69 6f 6e 73 20 6c 69 6b 65  timizations like
212a0 20 2d 4f 73 20 6f 72 20 2d 4f 30 20 61 72 65 20   -Os or -O0 are 
212b0 75 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  used and the.** 
212c0 63 6f 6d 70 69 6c 65 72 20 69 73 20 6e 6f 74 20  compiler is not 
212d0 64 6f 69 6e 67 20 61 67 67 72 65 73 73 69 76 65  doing aggressive
212e0 20 69 6e 6c 69 6e 69 6e 67 2e 29 20 20 53 6f 20   inlining.)  So 
212f0 77 65 20 75 73 65 20 61 20 72 65 61 6c 20 66 75  we use a real fu
21300 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 4d 53  nction.** for MS
21310 56 43 20 61 6e 64 20 61 20 6d 61 63 72 6f 20 66  VC and a macro f
21320 6f 72 20 65 76 65 72 79 74 68 69 6e 67 20 65 6c  or everything el
21330 73 65 2e 20 20 54 69 63 6b 65 74 20 23 32 34 35  se.  Ticket #245
21340 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  7..*/.#ifndef ND
21350 45 42 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f  EBUG.  static vo
21360 69 64 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66  id assertCellInf
21370 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  o(BtCursor *pCur
21380 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20  ){.    CellInfo 
21390 69 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20 69 50  info;.    int iP
213a0 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67  age = pCur->iPag
213b0 65 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69  e;.    memset(&i
213c0 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69  nfo, 0, sizeof(i
213d0 6e 66 6f 29 29 3b 0a 20 20 20 20 62 74 72 65 65  nfo));.    btree
213e0 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e  ParseCell(pCur->
213f0 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 20 70  apPage[iPage], p
21400 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65  Cur->aiIdx[iPage
21410 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61  ], &info);.    a
21420 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
21430 42 20 7c 7c 20 6d 65 6d 63 6d 70 28 26 69 6e 66  B || memcmp(&inf
21440 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20  o, &pCur->info, 
21450 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30  sizeof(info))==0
21460 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20   );.  }.#else.  
21470 23 64 65 66 69 6e 65 20 61 73 73 65 72 74 43 65  #define assertCe
21480 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66  llInfo(x).#endif
21490 0a 23 69 66 64 65 66 20 5f 4d 53 43 5f 56 45 52  .#ifdef _MSC_VER
214a0 0a 20 20 2f 2a 20 55 73 65 20 61 20 72 65 61 6c  .  /* Use a real
214b0 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 4d 53 56   function in MSV
214c0 43 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  C to work around
214d0 20 62 75 67 73 20 69 6e 20 74 68 61 74 20 63 6f   bugs in that co
214e0 6d 70 69 6c 65 72 2e 20 2a 2f 0a 20 20 73 74 61  mpiler. */.  sta
214f0 74 69 63 20 76 6f 69 64 20 67 65 74 43 65 6c 6c  tic void getCell
21500 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Info(BtCursor *p
21510 43 75 72 29 7b 0a 20 20 20 20 69 66 28 20 70 43  Cur){.    if( pC
21520 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
21530 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
21540 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61  Page = pCur->iPa
21550 67 65 3b 0a 20 20 20 20 20 20 62 74 72 65 65 50  ge;.      btreeP
21560 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61  arseCell(pCur->a
21570 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75  pPage[iPage],pCu
21580 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c  r->aiIdx[iPage],
21590 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20  &pCur->info);.  
215a0 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
215b0 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64  gs |= BTCF_Valid
215c0 4e 4b 65 79 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  NKey;.    }else{
215d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 43 65 6c  .      assertCel
215e0 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20  lInfo(pCur);.   
215f0 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 20 2f 2a 20   }.  }.#else /* 
21600 69 66 20 6e 6f 74 20 5f 4d 53 43 5f 56 45 52 20  if not _MSC_VER 
21610 2a 2f 0a 20 20 2f 2a 20 55 73 65 20 61 20 6d 61  */.  /* Use a ma
21620 63 72 6f 20 69 6e 20 61 6c 6c 20 6f 74 68 65 72  cro in all other
21630 20 63 6f 6d 70 69 6c 65 72 73 20 73 6f 20 74 68   compilers so th
21640 61 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  at the function 
21650 69 73 20 69 6e 6c 69 6e 65 64 20 2a 2f 0a 23 64  is inlined */.#d
21660 65 66 69 6e 65 20 67 65 74 43 65 6c 6c 49 6e 66  efine getCellInf
21670 6f 28 70 43 75 72 29 20 20 20 20 20 20 20 20 20  o(pCur)         
21680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
216a0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
216b0 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
216c0 6e 53 69 7a 65 3d 3d 30 20 29 7b 20 20 20 20 20  nSize==0 ){     
216d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
216e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
216f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
21700 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20      int iPage = 
21710 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 20 20 20  pCur->iPage;    
21720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
21750 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43  .    btreeParseC
21760 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65  ell(pCur->apPage
21770 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69  [iPage],pCur->ai
21780 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72  Idx[iPage],&pCur
21790 2d 3e 69 6e 66 6f 29 3b 20 20 20 20 20 20 20 20  ->info);        
217a0 5c 0a 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46  \.    pCur->curF
217b0 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c  lags |= BTCF_Val
217c0 69 64 4e 4b 65 79 3b 20 20 20 20 20 20 20 20 20  idNKey;         
217d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
217e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
217f0 20 5c 0a 20 20 7d 65 6c 73 65 7b 20 20 20 20 20   \.  }else{     
21800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21840 20 20 5c 0a 20 20 20 20 61 73 73 65 72 74 43 65    \.    assertCe
21850 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 20 20 20  llInfo(pCur);   
21860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21890 20 20 20 5c 0a 20 20 7d 0a 23 65 6e 64 69 66 20     \.  }.#endif 
218a0 2f 2a 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 0a  /* _MSC_VER */..
218b0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 20  #ifndef NDEBUG  
218c0 2f 2a 20 54 68 65 20 6e 65 78 74 20 72 6f 75 74  /* The next rout
218d0 69 6e 65 20 75 73 65 64 20 6f 6e 6c 79 20 77 69  ine used only wi
218e0 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 73 74  thin assert() st
218f0 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a  atements */./*.*
21900 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
21910 20 74 68 65 20 67 69 76 65 6e 20 42 74 43 75 72   the given BtCur
21920 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20 41  sor is valid.  A
21930 20 76 61 6c 69 64 20 63 75 72 73 6f 72 20 69 73   valid cursor is
21940 20 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 69 73 20   one.** that is 
21950 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
21960 6e 67 20 74 6f 20 61 20 72 6f 77 20 69 6e 20 61  ng to a row in a
21970 20 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74 61 62   (non-empty) tab
21980 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  le..** This is a
21990 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 72 6f   verification ro
219a0 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 6f 6e  utine is used on
219b0 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65 72 74  ly within assert
219c0 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  () statements..*
219d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
219e0 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28  eeCursorIsValid(
219f0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
21a00 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 20 26  .  return pCur &
21a10 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  & pCur->eState==
21a20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a  CURSOR_VALID;.}.
21a30 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42 55 47  #endif /* NDEBUG
21a40 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a   */../*.** Set *
21a50 70 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a  pSize to the siz
21a60 65 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  e of the buffer 
21a70 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 74  needed to hold t
21a80 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74  he value of.** t
21a90 68 65 20 6b 65 79 20 66 6f 72 20 74 68 65 20 63  he key for the c
21aa0 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 20 49  urrent entry.  I
21ab0 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
21ac0 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20  not pointing.** 
21ad0 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79  to a valid entry
21ae0 2c 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20  , *pSize is set 
21af0 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72  to 0. .**.** For
21b00 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 74 68   a table with th
21b10 65 20 49 4e 54 4b 45 59 20 66 6c 61 67 20 73 65  e INTKEY flag se
21b20 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  t, this routine 
21b30 72 65 74 75 72 6e 73 20 74 68 65 20 6b 65 79 0a  returns the key.
21b40 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74  ** itself, not t
21b50 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
21b60 65 73 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a  es in the key..*
21b70 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
21b80 6d 75 73 74 20 70 6f 73 69 74 69 6f 6e 20 74 68  must position th
21b90 65 20 63 75 72 73 6f 72 20 70 72 69 6f 72 20 74  e cursor prior t
21ba0 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20  o invoking this 
21bb0 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20  routine..** .** 
21bc0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  This routine can
21bd0 6e 6f 74 20 66 61 69 6c 2e 20 20 49 74 20 61 6c  not fail.  It al
21be0 77 61 79 73 20 72 65 74 75 72 6e 73 20 53 51 4c  ways returns SQL
21bf0 49 54 45 5f 4f 4b 2e 20 20 0a 2a 2f 0a 69 6e 74  ITE_OK.  .*/.int
21c00 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
21c10 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70  Size(BtCursor *p
21c20 43 75 72 2c 20 69 36 34 20 2a 70 53 69 7a 65 29  Cur, i64 *pSize)
21c30 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
21c40 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
21c50 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
21c60 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
21c70 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
21c80 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
21c90 29 3b 0a 20 20 2a 70 53 69 7a 65 20 3d 20 70 43  );.  *pSize = pC
21ca0 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20  ur->info.nKey;. 
21cb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
21cc0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  K;.}../*.** Set 
21cd0 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20 6e 75  *pSize to the nu
21ce0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
21cf0 20 64 61 74 61 20 69 6e 20 74 68 65 20 65 6e 74   data in the ent
21d00 72 79 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72  ry the.** cursor
21d10 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
21d20 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  s to..**.** The 
21d30 63 61 6c 6c 65 72 20 6d 75 73 74 20 67 75 61 72  caller must guar
21d40 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 63  antee that the c
21d50 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
21d60 67 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a  g to a non-NULL.
21d70 2a 2a 20 76 61 6c 69 64 20 65 6e 74 72 79 2e 20  ** valid entry. 
21d80 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
21d90 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f   the calling pro
21da0 63 65 64 75 72 65 20 6d 75 73 74 20 67 75 61 72  cedure must guar
21db0 61 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20 74 68  antee.** that th
21dc0 65 20 63 75 72 73 6f 72 20 68 61 73 20 43 75 72  e cursor has Cur
21dd0 73 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55 52 53  sor.eState==CURS
21de0 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20  OR_VALID..**.** 
21df0 46 61 69 6c 75 72 65 20 69 73 20 6e 6f 74 20 70  Failure is not p
21e00 6f 73 73 69 62 6c 65 2e 20 20 54 68 69 73 20 66  ossible.  This f
21e10 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 72  unction always r
21e20 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
21e30 2e 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20 6a 75  ..** It might ju
21e40 73 74 20 61 73 20 77 65 6c 6c 20 62 65 20 61 20  st as well be a 
21e50 70 72 6f 63 65 64 75 72 65 20 28 72 65 74 75 72  procedure (retur
21e60 6e 69 6e 67 20 76 6f 69 64 29 20 62 75 74 20 77  ning void) but w
21e70 65 20 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 74 6f  e continue.** to
21e80 20 72 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67   return an integ
21e90 65 72 20 72 65 73 75 6c 74 20 63 6f 64 65 20 66  er result code f
21ea0 6f 72 20 68 69 73 74 6f 72 69 63 61 6c 20 72 65  or historical re
21eb0 61 73 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  asons..*/.int sq
21ec0 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 53 69  lite3BtreeDataSi
21ed0 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ze(BtCursor *pCu
21ee0 72 2c 20 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a  r, u32 *pSize){.
21ef0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
21f00 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
21f10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
21f20 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
21f30 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
21f40 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
21f50 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
21f60 3e 69 6e 74 4b 65 79 4c 65 61 66 3d 3d 31 20 29  >intKeyLeaf==1 )
21f70 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ;.  getCellInfo(
21f80 70 43 75 72 29 3b 0a 20 20 2a 70 53 69 7a 65 20  pCur);.  *pSize 
21f90 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61  = pCur->info.nPa
21fa0 79 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e 20  yload;.  return 
21fb0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
21fc0 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61  .** Given the pa
21fd0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20  ge number of an 
21fe0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
21ff0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28 70   the database (p
22000 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c  arameter.** ovfl
22010 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ), this function
22020 20 66 69 6e 64 73 20 74 68 65 20 70 61 67 65 20   finds the page 
22030 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
22040 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a  xt page in the .
22050 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f  ** linked list o
22060 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  f overflow pages
22070 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69  . If possible, i
22080 74 20 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d  t uses the auto-
22090 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65  vacuum.** pointe
220a0 72 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65  r-map data inste
220b0 61 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68  ad of reading th
220c0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67  e content of pag
220d0 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e  e ovfl to do so.
220e0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72   .**.** If an er
220f0 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51  ror occurs an SQ
22100 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
22110 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
22120 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68  erwise:.**.** Th
22130 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
22140 20 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c   the next overfl
22150 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  ow page in the l
22160 69 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 0a 2a  inked list is .*
22170 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50  * written to *pP
22180 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65  gnoNext. If page
22190 20 6f 76 66 6c 20 69 73 20 74 68 65 20 6c 61 73   ovfl is the las
221a0 74 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69  t page in its li
221b0 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a  nked .** list, *
221c0 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74  pPgnoNext is set
221d0 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a   to zero. .**.**
221e0 20 49 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f   If ppPage is no
221f0 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65  t NULL, and a re
22200 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 4d  ference to the M
22210 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 63 6f  emPage object co
22220 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74  rresponding.** t
22230 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 4f  o page number pO
22240 76 66 6c 20 77 61 73 20 6f 62 74 61 69 6e 65 64  vfl was obtained
22250 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69  , then *ppPage i
22260 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
22270 6f 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 65  o that.** refere
22280 6e 63 65 2e 20 49 74 20 69 73 20 74 68 65 20 72  nce. It is the r
22290 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
222a0 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63   the caller to c
222b0 61 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28  all releasePage(
222c0 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20  ).** on *ppPage 
222d0 74 6f 20 66 72 65 65 20 74 68 65 20 72 65 66 65  to free the refe
222e0 72 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66  rence. In no ref
222f0 65 72 65 6e 63 65 20 77 61 73 20 6f 62 74 61 69  erence was obtai
22300 6e 65 64 20 28 62 65 63 61 75 73 65 0a 2a 2a 20  ned (because.** 
22310 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
22320 77 61 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61  was used to obta
22330 69 6e 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72  in the value for
22340 20 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68   *pPgnoNext), th
22350 65 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73  en.** *ppPage is
22360 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f   set to zero..*/
22370 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f  .static int getO
22380 76 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42  verflowPage(.  B
22390 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
223a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
223b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
223c0 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c   */.  Pgno ovfl,
223d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223e0 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76     /* Current ov
223f0 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62  erflow page numb
22400 65 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  er */.  MemPage 
22410 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20  **ppPage,       
22420 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d       /* OUT: Mem
22430 50 61 67 65 20 68 61 6e 64 6c 65 20 28 6d 61 79  Page handle (may
22440 20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50   be NULL) */.  P
22450 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20  gno *pPgnoNext  
22460 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
22470 55 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f  UT: Next overflo
22480 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  w page number */
22490 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20  .){.  Pgno next 
224a0 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
224b0 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74  pPage = 0;.  int
224c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
224d0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
224e0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
224f0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
22500 61 73 73 65 72 74 28 70 50 67 6e 6f 4e 65 78 74  assert(pPgnoNext
22510 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
22520 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
22530 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66  UM.  /* Try to f
22540 69 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61 67  ind the next pag
22550 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f  e in the overflo
22560 77 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65  w list using the
22570 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d  .  ** autovacuum
22580 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
22590 65 73 2e 20 47 75 65 73 73 20 74 68 61 74 20 74  es. Guess that t
225a0 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
225b0 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c  .  ** the overfl
225c0 6f 77 20 6c 69 73 74 20 69 73 20 70 61 67 65 20  ow list is page 
225d0 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e  number (ovfl+1).
225e0 20 49 66 20 74 68 61 74 20 67 75 65 73 73 20 74   If that guess t
225f0 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74  urns .  ** out t
22600 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c  o be wrong, fall
22610 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67   back to loading
22620 20 74 68 65 20 64 61 74 61 20 6f 66 20 70 61 67   the data of pag
22630 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f  e .  ** number o
22640 76 66 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  vfl to determine
22650 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e   the next page n
22660 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  umber..  */.  if
22670 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
22680 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67  m ){.    Pgno pg
22690 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75  no;.    Pgno iGu
226a0 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20  ess = ovfl+1;.  
226b0 20 20 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20    u8 eType;..   
226c0 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49   while( PTRMAP_I
226d0 53 50 41 47 45 28 70 42 74 2c 20 69 47 75 65 73  SPAGE(pBt, iGues
226e0 73 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45  s) || iGuess==PE
226f0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
22700 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47  pBt) ){.      iG
22710 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20  uess++;.    }.. 
22720 20 20 20 69 66 28 20 69 47 75 65 73 73 3c 3d 62     if( iGuess<=b
22730 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
22740 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  t) ){.      rc =
22750 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
22760 69 47 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20  iGuess, &eType, 
22770 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66  &pgno);.      if
22780 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22790 26 26 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  && eType==PTRMAP
227a0 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67  _OVERFLOW2 && pg
227b0 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20  no==ovfl ){.    
227c0 20 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73      next = iGues
227d0 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  s;.        rc = 
227e0 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
227f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
22800 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
22810 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d   next==0 || rc==
22820 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
22830 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
22840 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62  OK ){.    rc = b
22850 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
22860 20 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 28   ovfl, &pPage, (
22870 70 70 50 61 67 65 3d 3d 30 29 20 3f 20 50 41 47  ppPage==0) ? PAG
22880 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
22890 3a 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  : 0);.    assert
228a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
228b0 7c 7c 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20  || pPage==0 );. 
228c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
228d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65  E_OK ){.      ne
228e0 78 74 20 3d 20 67 65 74 34 62 79 74 65 28 70 50  xt = get4byte(pP
228f0 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  age->aData);.   
22900 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f   }.  }..  *pPgno
22910 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69  Next = next;.  i
22920 66 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20  f( ppPage ){.   
22930 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65   *ppPage = pPage
22940 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
22950 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
22960 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
22970 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45  (rc==SQLITE_DONE
22980 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72   ? SQLITE_OK : r
22990 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70  c);.}../*.** Cop
229a0 79 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75  y data from a bu
229b0 66 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20  ffer to a page, 
229c0 6f 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74  or from a page t
229d0 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  o a buffer..**.*
229e0 2a 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20  * pPayload is a 
229f0 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20  pointer to data 
22a00 73 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61  stored on databa
22a10 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2e  se page pDbPage.
22a20 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20  .** If argument 
22a30 65 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68  eOp is false, th
22a40 65 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f  en nByte bytes o
22a50 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65  f data are copie
22a60 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f  d.** from pPaylo
22a70 61 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72  ad to the buffer
22a80 20 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70   pointed at by p
22a90 42 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74  Buf. If eOp is t
22aa0 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c  rue,.** then sql
22ab0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
22ac0 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44   is called on pD
22ad0 62 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20  bPage and nByte 
22ae0 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61  bytes.** of data
22af0 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d   are copied from
22b00 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66   the buffer pBuf
22b10 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a   to pPayload..**
22b20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
22b30 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
22b40 63 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20  cess, otherwise 
22b50 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  an error code..*
22b60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70  /.static int cop
22b70 79 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64  yPayload(.  void
22b80 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20   *pPayload,     
22b90 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
22ba0 20 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f   to page data */
22bb0 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20  .  void *pBuf,  
22bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22bd0 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65  Pointer to buffe
22be0 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  r */.  int nByte
22bf0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
22c00 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
22c10 74 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20  tes to copy */. 
22c20 20 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20   int eOp,       
22c30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20             /* 0 
22c40 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67  -> copy from pag
22c50 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20  e, 1 -> copy to 
22c60 70 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65  page */.  DbPage
22c70 20 2a 70 44 62 50 61 67 65 20 20 20 20 20 20 20   *pDbPage       
22c80 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
22c90 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20  aining pPayload 
22ca0 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20  */.){.  if( eOp 
22cb0 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64  ){.    /* Copy d
22cc0 61 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20  ata from buffer 
22cd0 74 6f 20 70 61 67 65 20 28 61 20 77 72 69 74 65  to page (a write
22ce0 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20   operation) */. 
22cf0 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
22d00 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44  te3PagerWrite(pD
22d10 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
22d20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
22d30 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
22d40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63  ;.    }.    memc
22d50 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75  py(pPayload, pBu
22d60 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c  f, nByte);.  }el
22d70 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20  se{.    /* Copy 
22d80 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74  data from page t
22d90 6f 20 62 75 66 66 65 72 20 28 61 20 72 65 61 64  o buffer (a read
22da0 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20   operation) */. 
22db0 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20     memcpy(pBuf, 
22dc0 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29  pPayload, nByte)
22dd0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
22de0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
22df0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
22e00 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64   is used to read
22e10 20 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70 61   or overwrite pa
22e20 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f  yload informatio
22e30 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74  n.** for the ent
22e40 72 79 20 74 68 61 74 20 74 68 65 20 70 43 75 72  ry that the pCur
22e50 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
22e60 69 6e 67 20 74 6f 2e 20 54 68 65 20 65 4f 70 0a  ing to. The eOp.
22e70 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69  ** argument is i
22e80 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 66 6f  nterpreted as fo
22e90 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 30  llows:.**.**   0
22ea0 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  : The operation 
22eb0 69 73 20 61 20 72 65 61 64 2e 20 50 6f 70 75 6c  is a read. Popul
22ec0 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ate the overflow
22ed0 20 63 61 63 68 65 2e 0a 2a 2a 20 20 20 31 3a 20   cache..**   1: 
22ee0 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  The operation is
22ef0 20 61 20 77 72 69 74 65 2e 20 50 6f 70 75 6c 61   a write. Popula
22f00 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
22f10 63 61 63 68 65 2e 0a 2a 2a 20 20 20 32 3a 20 54  cache..**   2: T
22f20 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  he operation is 
22f30 61 20 72 65 61 64 2e 20 44 6f 20 6e 6f 74 20 70  a read. Do not p
22f40 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72  opulate the over
22f50 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a  flow cache..**.*
22f60 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d  * A total of "am
22f70 74 22 20 62 79 74 65 73 20 61 72 65 20 72 65 61  t" bytes are rea
22f80 64 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67  d or written beg
22f90 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65  inning at "offse
22fa0 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72  t"..** Data is r
22fb0 65 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74  ead to or from t
22fc0 68 65 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a  he buffer pBuf..
22fd0 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e  **.** The conten
22fe0 74 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 20  t being read or 
22ff0 77 72 69 74 74 65 6e 20 6d 69 67 68 74 20 61 70  written might ap
23000 70 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e  pear on the main
23010 20 70 61 67 65 0a 2a 2a 20 6f 72 20 62 65 20 73   page.** or be s
23020 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20  cattered out on 
23030 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f  multiple overflo
23040 77 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  w pages..**.** I
23050 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  f the current cu
23060 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20  rsor entry uses 
23070 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72  one or more over
23080 66 6c 6f 77 20 70 61 67 65 73 20 61 6e 64 20 74  flow pages and t
23090 68 65 0a 2a 2a 20 65 4f 70 20 61 72 67 75 6d 65  he.** eOp argume
230a0 6e 74 20 69 73 20 6e 6f 74 20 32 2c 20 74 68 69  nt is not 2, thi
230b0 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61  s function may a
230c0 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
230d0 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20 0a 2a 2a  r and lazily .**
230e0 20 70 6f 70 75 6c 61 74 65 73 20 74 68 65 20 6f   populates the o
230f0 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
23100 74 20 63 61 63 68 65 20 61 72 72 61 79 20 28 42  t cache array (B
23110 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f  tCursor.aOverflo
23120 77 29 2e 20 0a 2a 2a 20 53 75 62 73 65 71 75 65  w). .** Subseque
23130 6e 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69  nt calls use thi
23140 73 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20  s cache to make 
23150 73 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73  seeking to the s
23160 75 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20 0a  upplied offset .
23170 2a 2a 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e  ** more efficien
23180 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e  t..**.** Once an
23190 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
231a0 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65  ist cache has be
231b0 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74  en allocated, it
231c0 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c   may be.** inval
231d0 69 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f  idated if some o
231e0 74 68 65 72 20 63 75 72 73 6f 72 20 77 72 69 74  ther cursor writ
231f0 65 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74  es to the same t
23200 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74  able, or if.** t
23210 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76  he cursor is mov
23220 65 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  ed to a differen
23230 74 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61  t row. Additiona
23240 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63  lly, in auto-vac
23250 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65  uum.** mode, the
23260 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74   following event
23270 73 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65  s may invalidate
23280 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
23290 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a  e-list cache..**
232a0 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65  .**   * An incre
232b0 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a  mental vacuum,.*
232c0 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69  *   * A commit i
232d0 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66  n auto_vacuum="f
232e0 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20  ull" mode,.**   
232f0 2a 20 43 72 65 61 74 69 6e 67 20 61 20 74 61 62  * Creating a tab
23300 6c 65 20 28 6d 61 79 20 72 65 71 75 69 72 65 20  le (may require 
23310 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c  moving an overfl
23320 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61  ow page)..*/.sta
23330 74 69 63 20 69 6e 74 20 61 63 63 65 73 73 50 61  tic int accessPa
23340 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f  yload(.  BtCurso
23350 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a  r *pCur,      /*
23360 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   Cursor pointing
23370 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61   to entry to rea
23380 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  d from */.  u32 
23390 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20  offset,         
233a0 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e   /* Begin readin
233b0 67 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20  g this far into 
233c0 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32  payload */.  u32
233d0 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20   amt,           
233e0 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d    /* Read this m
233f0 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75  any bytes */.  u
23400 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42  nsigned char *pB
23410 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65  uf, /* Write the
23420 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73   bytes into this
23430 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e   buffer */ .  in
23440 74 20 65 4f 70 20 20 20 20 20 20 20 20 20 20 20  t eOp           
23450 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65     /* zero to re
23460 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20  ad. non-zero to 
23470 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75  write. */.){.  u
23480 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50  nsigned char *aP
23490 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63  ayload;.  int rc
234a0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
234b0 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20  int iIdx = 0;.  
234c0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
234d0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
234e0 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 42  ur->iPage]; /* B
234f0 74 72 65 65 20 70 61 67 65 20 6f 66 20 63 75 72  tree page of cur
23500 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20  rent entry */.  
23510 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
23520 70 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20 20  pCur->pBt;      
23530 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
23540 74 72 65 65 20 74 68 69 73 20 63 75 72 73 6f 72  tree this cursor
23550 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 23   belongs to */.#
23560 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52  ifdef SQLITE_DIR
23570 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41  ECT_OVERFLOW_REA
23580 44 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  D.  unsigned cha
23590 72 20 2a 20 63 6f 6e 73 74 20 70 42 75 66 53 74  r * const pBufSt
235a0 61 72 74 20 3d 20 70 42 75 66 3b 0a 20 20 69 6e  art = pBuf;.  in
235b0 74 20 62 45 6e 64 3b 20 20 20 20 20 20 20 20 20  t bEnd;         
235c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
235d0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
235e0 69 66 20 72 65 61 64 69 6e 67 20 74 6f 20 65 6e  if reading to en
235f0 64 20 6f 66 20 64 61 74 61 20 2a 2f 0a 23 65 6e  d of data */.#en
23600 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
23610 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
23620 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
23630 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
23640 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
23650 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
23660 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  e]<pPage->nCell 
23670 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
23680 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
23690 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
236a0 20 65 4f 70 21 3d 32 20 7c 7c 20 6f 66 66 73 65   eOp!=2 || offse
236b0 74 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20 41 6c  t==0 );    /* Al
236c0 77 61 79 73 20 73 74 61 72 74 20 66 72 6f 6d 20  ways start from 
236d0 62 65 67 69 6e 6e 69 6e 67 20 66 6f 72 20 65 4f  beginning for eO
236e0 70 3d 3d 32 20 2a 2f 0a 0a 20 20 67 65 74 43 65  p==2 */..  getCe
236f0 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
23700 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d  aPayload = pCur-
23710 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a  >info.pPayload;.
23720 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
23730 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45  RECT_OVERFLOW_RE
23740 41 44 0a 20 20 62 45 6e 64 20 3d 20 6f 66 66 73  AD.  bEnd = offs
23750 65 74 2b 61 6d 74 3d 3d 70 43 75 72 2d 3e 69 6e  et+amt==pCur->in
23760 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a 23 65 6e  fo.nPayload;.#en
23770 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 6f 66  dif.  assert( of
23780 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 43 75 72  fset+amt <= pCur
23790 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20  ->info.nPayload 
237a0 29 3b 0a 0a 20 20 69 66 28 20 26 61 50 61 79 6c  );..  if( &aPayl
237b0 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad[pCur->info.n
237c0 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d  Local] > &pPage-
237d0 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75 73 61 62  >aData[pBt->usab
237e0 6c 65 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 2f  leSize] ){.    /
237f0 2a 20 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64  * Trying to read
23800 20 6f 72 20 77 72 69 74 65 20 70 61 73 74 20 74   or write past t
23810 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61  he end of the da
23820 74 61 20 69 73 20 61 6e 20 65 72 72 6f 72 20 2a  ta is an error *
23830 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
23840 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
23850 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
23860 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74 20 62  k if data must b
23870 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74  e read/written t
23880 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65  o/from the btree
23890 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f   page itself. */
238a0 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43  .  if( offset<pC
238b0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
238c0 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61  ){.    int a = a
238d0 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66  mt;.    if( a+of
238e0 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e  fset>pCur->info.
238f0 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  nLocal ){.      
23900 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  a = pCur->info.n
23910 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a  Local - offset;.
23920 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63      }.    rc = c
23930 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79  opyPayload(&aPay
23940 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42  load[offset], pB
23950 75 66 2c 20 61 2c 20 28 65 4f 70 20 26 20 30 78  uf, a, (eOp & 0x
23960 30 31 29 2c 20 70 50 61 67 65 2d 3e 70 44 62 50  01), pPage->pDbP
23970 61 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74  age);.    offset
23980 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b   = 0;.    pBuf +
23990 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20  = a;.    amt -= 
239a0 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  a;.  }else{.    
239b0 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e  offset -= pCur->
239c0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d  info.nLocal;.  }
239d0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
239e0 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29  TE_OK && amt>0 )
239f0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32 20  {.    const u32 
23a00 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ovflSize = pBt->
23a10 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20  usableSize - 4; 
23a20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e   /* Bytes conten
23a30 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20  t per ovfl page 
23a40 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74  */.    Pgno next
23a50 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50  Page;..    nextP
23a60 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
23a70 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69  aPayload[pCur->i
23a80 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 20  nfo.nLocal]);.. 
23a90 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 74 43     /* If the BtC
23aa0 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b  ursor.aOverflow[
23ab0 5d 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61  ] has not been a
23ac0 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61  llocated, alloca
23ad0 74 65 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 2a  te it now..    *
23ae0 2a 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74  * Except, do not
23af0 20 61 6c 6c 6f 63 61 74 65 20 61 4f 76 65 72 66   allocate aOverf
23b00 6c 6f 77 5b 5d 20 66 6f 72 20 65 4f 70 3d 3d 32  low[] for eOp==2
23b10 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
23b20 54 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20  The aOverflow[] 
23b30 61 72 72 61 79 20 69 73 20 73 69 7a 65 64 20 61  array is sized a
23b40 74 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20  t one entry for 
23b50 65 61 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61  each overflow pa
23b60 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  ge.    ** in the
23b70 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e   overflow chain.
23b80 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
23b90 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 76   of the first ov
23ba0 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 0a 20  erflow page is. 
23bb0 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20     ** stored in 
23bc0 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 20 65 74  aOverflow[0], et
23bd0 63 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20  c. A value of 0 
23be0 69 6e 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77  in the aOverflow
23bf0 5b 5d 20 61 72 72 61 79 0a 20 20 20 20 2a 2a 20  [] array.    ** 
23c00 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b  means "not yet k
23c10 6e 6f 77 6e 22 20 28 74 68 65 20 63 61 63 68 65  nown" (the cache
23c20 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c   is lazily popul
23c30 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  ated)..    */.  
23c40 20 20 69 66 28 20 65 4f 70 21 3d 32 20 26 26 20    if( eOp!=2 && 
23c50 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
23c60 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  & BTCF_ValidOvfl
23c70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
23c80 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d  t nOvfl = (pCur-
23c90 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70  >info.nPayload-p
23ca0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
23cb0 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66  +ovflSize-1)/ovf
23cc0 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28  lSize;.      if(
23cd0 20 6e 4f 76 66 6c 3e 70 43 75 72 2d 3e 6e 4f 76   nOvfl>pCur->nOv
23ce0 66 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20  flAlloc ){.     
23cf0 20 20 20 50 67 6e 6f 20 2a 61 4e 65 77 20 3d 20     Pgno *aNew = 
23d00 28 50 67 6e 6f 2a 29 73 71 6c 69 74 65 33 44 62  (Pgno*)sqlite3Db
23d10 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20  Realloc(.       
23d20 20 20 20 20 20 70 43 75 72 2d 3e 70 42 74 72 65       pCur->pBtre
23d30 65 2d 3e 64 62 2c 20 70 43 75 72 2d 3e 61 4f 76  e->db, pCur->aOv
23d40 65 72 66 6c 6f 77 2c 20 6e 4f 76 66 6c 2a 32 2a  erflow, nOvfl*2*
23d50 73 69 7a 65 6f 66 28 50 67 6e 6f 29 0a 20 20 20  sizeof(Pgno).   
23d60 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
23d70 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( aNew==0 ){. 
23d80 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
23d90 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
23da0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23db0 20 20 20 20 20 70 43 75 72 2d 3e 6e 4f 76 66 6c       pCur->nOvfl
23dc0 41 6c 6c 6f 63 20 3d 20 6e 4f 76 66 6c 2a 32 3b  Alloc = nOvfl*2;
23dd0 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
23de0 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 61 4e 65  >aOverflow = aNe
23df0 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  w;.        }.   
23e00 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
23e10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
23e20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70          memset(p
23e30 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20  Cur->aOverflow, 
23e40 30 2c 20 6e 4f 76 66 6c 2a 73 69 7a 65 6f 66 28  0, nOvfl*sizeof(
23e50 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 20 20  Pgno));.        
23e60 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c  pCur->curFlags |
23e70 3d 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  = BTCF_ValidOvfl
23e80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
23e90 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  .    /* If the o
23ea0 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
23eb0 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e  t cache has been
23ec0 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74   allocated and t
23ed0 68 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20  he.    ** entry 
23ee0 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 72 65  for the first re
23ef0 71 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20  quired overflow 
23f00 70 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73  page is valid, s
23f10 6b 69 70 0a 20 20 20 20 2a 2a 20 64 69 72 65 63  kip.    ** direc
23f20 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a  tly to it..    *
23f30 2f 0a 20 20 20 20 69 66 28 20 28 70 43 75 72 2d  /.    if( (pCur-
23f40 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
23f50 5f 56 61 6c 69 64 4f 76 66 6c 29 21 3d 30 0a 20  _ValidOvfl)!=0. 
23f60 20 20 20 20 26 26 20 70 43 75 72 2d 3e 61 4f 76      && pCur->aOv
23f70 65 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76  erflow[offset/ov
23f80 66 6c 53 69 7a 65 5d 0a 20 20 20 20 29 7b 0a 20  flSize].    ){. 
23f90 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f 66 66       iIdx = (off
23fa0 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20  set/ovflSize);. 
23fb0 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
23fc0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
23fd0 69 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66  iIdx];.      off
23fe0 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76  set = (offset%ov
23ff0 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 0a  flSize);.    }..
24000 20 20 20 20 66 6f 72 28 20 3b 20 72 63 3d 3d 53      for( ; rc==S
24010 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e  QLITE_OK && amt>
24020 30 20 26 26 20 6e 65 78 74 50 61 67 65 3b 20 69  0 && nextPage; i
24030 49 64 78 2b 2b 29 7b 0a 0a 20 20 20 20 20 20 2f  Idx++){..      /
24040 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c 20 70  * If required, p
24050 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72  opulate the over
24060 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
24070 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69  ache. */.      i
24080 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  f( (pCur->curFla
24090 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f  gs & BTCF_ValidO
240a0 76 66 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  vfl)!=0 ){.     
240b0 20 20 20 61 73 73 65 72 74 28 21 70 43 75 72 2d     assert(!pCur-
240c0 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
240d0 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66   || pCur->aOverf
240e0 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50  low[iIdx]==nextP
240f0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 43  age);.        pC
24100 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
24110 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a  dx] = nextPage;.
24120 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
24130 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53  f( offset>=ovflS
24140 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ize ){.        /
24150 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f  * The only reaso
24160 6e 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70  n to read this p
24170 61 67 65 20 69 73 20 74 6f 20 6f 62 74 61 69 6e  age is to obtain
24180 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   the page.      
24190 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20    ** number for 
241a0 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
241b0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68   the overflow ch
241c0 61 69 6e 2e 20 54 68 65 20 70 61 67 65 0a 20 20  ain. The page.  
241d0 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73        ** data is
241e0 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 20 53   not required. S
241f0 6f 20 66 69 72 73 74 20 74 72 79 20 74 6f 20 6c  o first try to l
24200 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65 72 66 6c  ookup the overfl
24210 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  ow.        ** pa
24220 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2c 20 69  ge-list cache, i
24230 66 20 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c  f any, then fall
24240 20 62 61 63 6b 20 74 6f 20 74 68 65 20 67 65 74   back to the get
24250 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 29 0a 20  OverflowPage(). 
24260 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69         ** functi
24270 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  on..        **. 
24280 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74         ** Note t
24290 68 61 74 20 74 68 65 20 61 4f 76 65 72 66 6c 6f  hat the aOverflo
242a0 77 5b 5d 20 61 72 72 61 79 20 6d 75 73 74 20 62  w[] array must b
242b0 65 20 61 6c 6c 6f 63 61 74 65 64 20 62 65 63 61  e allocated beca
242c0 75 73 65 20 65 4f 70 21 3d 32 0a 20 20 20 20 20  use eOp!=2.     
242d0 20 20 20 2a 2a 20 68 65 72 65 2e 20 20 49 66 20     ** here.  If 
242e0 65 4f 70 3d 3d 32 2c 20 74 68 65 6e 20 6f 66 66  eOp==2, then off
242f0 73 65 74 3d 3d 30 20 61 6e 64 20 74 68 69 73 20  set==0 and this 
24300 62 72 61 6e 63 68 20 69 73 20 6e 65 76 65 72 20  branch is never 
24310 74 61 6b 65 6e 2e 0a 20 20 20 20 20 20 20 20 2a  taken..        *
24320 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
24330 28 20 65 4f 70 21 3d 32 20 29 3b 0a 20 20 20 20  ( eOp!=2 );.    
24340 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
24350 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
24360 46 5f 56 61 6c 69 64 4f 76 66 6c 20 29 3b 0a 20  F_ValidOvfl );. 
24370 20 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d         if( pCur-
24380 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b  >aOverflow[iIdx+
24390 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1] ){.          
243a0 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d  nextPage = pCur-
243b0 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b  >aOverflow[iIdx+
243c0 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  1];.        }els
243d0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  e{.          rc 
243e0 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  = getOverflowPag
243f0 65 28 70 42 74 2c 20 6e 65 78 74 50 61 67 65 2c  e(pBt, nextPage,
24400 20 30 2c 20 26 6e 65 78 74 50 61 67 65 29 3b 0a   0, &nextPage);.
24410 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24420 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c    offset -= ovfl
24430 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Size;.      }els
24440 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65  e{.        /* Ne
24450 65 64 20 74 6f 20 72 65 61 64 20 74 68 69 73 20  ed to read this 
24460 70 61 67 65 20 70 72 6f 70 65 72 6c 79 2e 20 49  page properly. I
24470 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20  t contains some 
24480 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  of the.        *
24490 2a 20 72 61 6e 67 65 20 6f 66 20 64 61 74 61 20  * range of data 
244a0 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 72 65  that is being re
244b0 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77  ad (eOp==0) or w
244c0 72 69 74 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e  ritten (eOp!=0).
244d0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 64  .        */.#ifd
244e0 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54  ef SQLITE_DIRECT
244f0 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20  _OVERFLOW_READ. 
24500 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
24510 69 6c 65 20 2a 66 64 3b 0a 23 65 6e 64 69 66 0a  ile *fd;.#endif.
24520 20 20 20 20 20 20 20 20 69 6e 74 20 61 20 3d 20          int a = 
24530 61 6d 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  amt;.        if(
24540 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76   a + offset > ov
24550 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  flSize ){.      
24560 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65      a = ovflSize
24570 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20   - offset;.     
24580 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c     }..#ifdef SQL
24590 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46  ITE_DIRECT_OVERF
245a0 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20  LOW_READ.       
245b0 20 2f 2a 20 49 66 20 61 6c 6c 20 74 68 65 20 66   /* If all the f
245c0 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
245d0 65 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  e:.        **.  
245e0 20 20 20 20 20 20 2a 2a 20 20 20 31 29 20 74 68        **   1) th
245f0 69 73 20 69 73 20 61 20 72 65 61 64 20 6f 70 65  is is a read ope
24600 72 61 74 69 6f 6e 2c 20 61 6e 64 20 0a 20 20 20  ration, and .   
24610 20 20 20 20 20 2a 2a 20 20 20 32 29 20 64 61 74       **   2) dat
24620 61 20 69 73 20 72 65 71 75 69 72 65 64 20 66 72  a is required fr
24630 6f 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  om the start of 
24640 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 70 61  this overflow pa
24650 67 65 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ge, and.        
24660 2a 2a 20 20 20 33 29 20 74 68 65 20 64 61 74 61  **   3) the data
24670 62 61 73 65 20 69 73 20 66 69 6c 65 2d 62 61 63  base is file-bac
24680 6b 65 64 2c 20 61 6e 64 0a 20 20 20 20 20 20 20  ked, and.       
24690 20 2a 2a 20 20 20 34 29 20 74 68 65 72 65 20 69   **   4) there i
246a0 73 20 6e 6f 20 6f 70 65 6e 20 77 72 69 74 65 2d  s no open write-
246b0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64  transaction, and
246c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 35 29  .        **   5)
246d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
246e0 20 6e 6f 74 20 61 20 57 41 4c 20 64 61 74 61 62   not a WAL datab
246f0 61 73 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  ase,.        ** 
24700 20 20 36 29 20 61 6c 6c 20 64 61 74 61 20 66 72    6) all data fr
24710 6f 6d 20 74 68 65 20 70 61 67 65 20 69 73 20 62  om the page is b
24720 65 69 6e 67 20 72 65 61 64 2e 0a 20 20 20 20 20  eing read..     
24730 20 20 20 2a 2a 20 20 20 37 29 20 61 74 20 6c 65     **   7) at le
24740 61 73 74 20 34 20 62 79 74 65 73 20 68 61 76 65  ast 4 bytes have
24750 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65   already been re
24760 61 64 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70  ad into the outp
24770 75 74 20 62 75 66 66 65 72 20 0a 20 20 20 20 20  ut buffer .     
24780 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
24790 20 74 68 65 6e 20 64 61 74 61 20 63 61 6e 20 62   then data can b
247a0 65 20 72 65 61 64 20 64 69 72 65 63 74 6c 79 20  e read directly 
247b0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
247c0 65 20 66 69 6c 65 20 69 6e 74 6f 20 74 68 65 0a  e file into the.
247d0 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70 75          ** outpu
247e0 74 20 62 75 66 66 65 72 2c 20 62 79 70 61 73 73  t buffer, bypass
247f0 69 6e 67 20 74 68 65 20 70 61 67 65 2d 63 61 63  ing the page-cac
24800 68 65 20 61 6c 74 6f 67 65 74 68 65 72 2e 20 54  he altogether. T
24810 68 69 73 20 73 70 65 65 64 73 0a 20 20 20 20 20  his speeds.     
24820 20 20 20 2a 2a 20 75 70 20 6c 6f 61 64 69 6e 67     ** up loading
24830 20 6c 61 72 67 65 20 72 65 63 6f 72 64 73 20 74   large records t
24840 68 61 74 20 73 70 61 6e 20 6d 61 6e 79 20 6f 76  hat span many ov
24850 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20  erflow pages..  
24860 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
24870 20 69 66 28 20 28 65 4f 70 26 30 78 30 31 29 3d   if( (eOp&0x01)=
24880 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =0              
24890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
248a0 20 20 20 20 20 20 20 20 2f 2a 20 28 31 29 20 2a          /* (1) *
248b0 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 6f 66  /.         && of
248c0 66 73 65 74 3d 3d 30 20 20 20 20 20 20 20 20 20  fset==0         
248d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
248e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
248f0 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20 20   /* (2) */.     
24900 20 20 20 20 26 26 20 28 62 45 6e 64 20 7c 7c 20      && (bEnd || 
24910 61 3d 3d 6f 76 66 6c 53 69 7a 65 29 20 20 20 20  a==ovflSize)    
24920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24930 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 36 29            /* (6)
24940 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20   */.         && 
24950 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
24960 6f 6e 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 20  on==TRANS_READ  
24970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24980 20 20 20 2f 2a 20 28 34 29 20 2a 2f 0a 20 20 20     /* (4) */.   
24990 20 20 20 20 20 20 26 26 20 28 66 64 20 3d 20 73        && (fd = s
249a0 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28  qlite3PagerFile(
249b0 70 42 74 2d 3e 70 50 61 67 65 72 29 29 2d 3e 70  pBt->pPager))->p
249c0 4d 65 74 68 6f 64 73 20 20 20 20 20 2f 2a 20 28  Methods     /* (
249d0 33 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26  3) */.         &
249e0 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  & pBt->pPage1->a
249f0 44 61 74 61 5b 31 39 5d 3d 3d 30 78 30 31 20 20  Data[19]==0x01  
24a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a10 20 20 20 20 20 2f 2a 20 28 35 29 20 2a 2f 0a 20       /* (5) */. 
24a20 20 20 20 20 20 20 20 20 26 26 20 26 70 42 75 66          && &pBuf
24a30 5b 2d 34 5d 3e 3d 70 42 75 66 53 74 61 72 74 20  [-4]>=pBufStart 
24a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24a60 20 28 37 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (7) */.        
24a70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  ){.          u8 
24a80 61 53 61 76 65 5b 34 5d 3b 0a 20 20 20 20 20 20  aSave[4];.      
24a90 20 20 20 20 75 38 20 2a 61 57 72 69 74 65 20 3d      u8 *aWrite =
24aa0 20 26 70 42 75 66 5b 2d 34 5d 3b 0a 20 20 20 20   &pBuf[-4];.    
24ab0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 61 57        assert( aW
24ac0 72 69 74 65 3e 3d 70 42 75 66 53 74 61 72 74 20  rite>=pBufStart 
24ad0 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
24ae0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 68 65             /* he
24af0 6e 63 65 20 28 37 29 20 2a 2f 0a 20 20 20 20 20  nce (7) */.     
24b00 20 20 20 20 20 6d 65 6d 63 70 79 28 61 53 61 76       memcpy(aSav
24b10 65 2c 20 61 57 72 69 74 65 2c 20 34 29 3b 0a 20  e, aWrite, 4);. 
24b20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
24b30 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20  lite3OsRead(fd, 
24b40 61 57 72 69 74 65 2c 20 61 2b 34 2c 20 28 69 36  aWrite, a+4, (i6
24b50 34 29 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a  4)pBt->pageSize*
24b60 28 6e 65 78 74 50 61 67 65 2d 31 29 29 3b 0a 20  (nextPage-1));. 
24b70 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67           nextPag
24b80 65 20 3d 20 67 65 74 34 62 79 74 65 28 61 57 72  e = get4byte(aWr
24b90 69 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ite);.          
24ba0 6d 65 6d 63 70 79 28 61 57 72 69 74 65 2c 20 61  memcpy(aWrite, a
24bb0 53 61 76 65 2c 20 34 29 3b 0a 20 20 20 20 20 20  Save, 4);.      
24bc0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a    }else.#endif..
24bd0 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
24be0 20 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50      DbPage *pDbP
24bf0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72  age;.          r
24c00 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
24c10 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61  Acquire(pBt->pPa
24c20 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26  ger, nextPage, &
24c30 70 44 62 50 61 67 65 2c 0a 20 20 20 20 20 20 20  pDbPage,.       
24c40 20 20 20 20 20 20 20 28 28 65 4f 70 26 30 78 30         ((eOp&0x0
24c50 31 29 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47 45  1)==0 ? PAGER_GE
24c60 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 0a  T_READONLY : 0).
24c70 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
24c80 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
24c90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
24ca0 20 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64          aPayload
24cb0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
24cc0 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
24cd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78  .            nex
24ce0 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  tPage = get4byte
24cf0 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20  (aPayload);.    
24d00 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70          rc = cop
24d10 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f  yPayload(&aPaylo
24d20 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42  ad[offset+4], pB
24d30 75 66 2c 20 61 2c 20 28 65 4f 70 26 30 78 30 31  uf, a, (eOp&0x01
24d40 29 2c 20 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ), pDbPage);.   
24d50 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
24d60 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
24d70 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
24d80 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20   offset = 0;.   
24d90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
24da0 20 7d 0a 20 20 20 20 20 20 20 20 61 6d 74 20 2d   }.        amt -
24db0 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 70 42 75  = a;.        pBu
24dc0 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a  f += a;.      }.
24dd0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
24de0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
24df0 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72  & amt>0 ){.    r
24e00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
24e10 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
24e20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
24e30 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f  *.** Read part o
24e40 66 20 74 68 65 20 6b 65 79 20 61 73 73 6f 63 69  f the key associ
24e50 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72  ated with cursor
24e60 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a   pCur.  Exactly.
24e70 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77  ** "amt" bytes w
24e80 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 72  ill be transferr
24e90 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20  ed into pBuf[]. 
24ea0 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a   The transfer.**
24eb0 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73   begins at "offs
24ec0 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  et"..**.** The c
24ed0 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72  aller must ensur
24ee0 65 20 74 68 61 74 20 70 43 75 72 20 69 73 20 70  e that pCur is p
24ef0 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 76 61 6c  ointing to a val
24f00 69 64 20 72 6f 77 0a 2a 2a 20 69 6e 20 74 68 65  id row.** in the
24f10 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52 65   table..**.** Re
24f20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
24f30 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20  n success or an 
24f40 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
24f50 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
24f60 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20  rong.  An error 
24f70 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22  is returned if "
24f80 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c  offset+amt" is l
24f90 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68  arger than.** th
24fa0 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c  e available payl
24fb0 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  oad..*/.int sqli
24fc0 74 65 33 42 74 72 65 65 4b 65 79 28 42 74 43 75  te3BtreeKey(BtCu
24fd0 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
24fe0 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c  offset, u32 amt,
24ff0 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20   void *pBuf){.  
25000 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
25010 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
25020 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
25030 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
25040 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
25050 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  rt( pCur->iPage>
25060 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61  =0 && pCur->apPa
25070 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
25080 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
25090 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
250a0 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61  Page]<pCur->apPa
250b0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
250c0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72 65 74 75  >nCell );.  retu
250d0 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  rn accessPayload
250e0 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61  (pCur, offset, a
250f0 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  mt, (unsigned ch
25100 61 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a 7d 0a  ar*)pBuf, 0);.}.
25110 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74  ./*.** Read part
25120 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 73 73   of the data ass
25130 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72  ociated with cur
25140 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63 74  sor pCur.  Exact
25150 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65  ly.** "amt" byte
25160 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66  s will be transf
25170 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d  ered into pBuf[]
25180 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a  .  The transfer.
25190 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66  ** begins at "of
251a0 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  fset"..**.** Ret
251b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
251c0 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
251d0 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79  rror code if any
251e0 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
251f0 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69  ong.  An error i
25200 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f  s returned if "o
25210 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61  ffset+amt" is la
25220 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65  rger than.** the
25230 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f   available paylo
25240 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ad..*/.int sqlit
25250 65 33 42 74 72 65 65 44 61 74 61 28 42 74 43 75  e3BtreeData(BtCu
25260 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
25270 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c  offset, u32 amt,
25280 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20   void *pBuf){.  
25290 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e 64 65 66  int rc;..#ifndef
252a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
252b0 52 42 4c 4f 42 0a 20 20 69 66 20 28 20 70 43 75  RBLOB.  if ( pCu
252c0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
252d0 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
252e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
252f0 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  BORT;.  }.#endif
25300 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
25310 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
25320 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  r) );.  rc = res
25330 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
25340 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
25350 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
25360 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
25370 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
25380 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61  R_VALID );.    a
25390 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
253a0 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61  ge>=0 && pCur->a
253b0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
253c0 65 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  e] );.    assert
253d0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
253e0 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d  ur->iPage]<pCur-
253f0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
25400 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  age]->nCell );. 
25410 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61     rc = accessPa
25420 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73  yload(pCur, offs
25430 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 30  et, amt, pBuf, 0
25440 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
25450 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
25460 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
25470 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61   payload informa
25480 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e  tion from the en
25490 74 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a  try that the .**
254a0 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20   pCur cursor is 
254b0 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68  pointing to.  Th
254c0 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20  e pointer is to 
254d0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
254e0 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20 69  .** the key if i
254f0 6e 64 65 78 20 62 74 72 65 65 73 20 28 70 50 61  ndex btrees (pPa
25500 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30 29 20 61  ge->intKey==0) a
25510 6e 64 20 69 73 20 74 68 65 20 64 61 74 61 20 66  nd is the data f
25520 6f 72 0a 2a 2a 20 74 61 62 6c 65 20 62 74 72 65  or.** table btre
25530 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65  es (pPage->intKe
25540 79 3d 3d 31 29 2e 20 54 68 65 20 6e 75 6d 62 65  y==1). The numbe
25550 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76  r of bytes of av
25560 61 69 6c 61 62 6c 65 0a 2a 2a 20 6b 65 79 2f 64  ailable.** key/d
25570 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 69  ata is written i
25580 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a  nto *pAmt.  If *
25590 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68  pAmt==0, then th
255a0 65 20 76 61 6c 75 65 0a 2a 2a 20 72 65 74 75 72  e value.** retur
255b0 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  ned will not be 
255c0 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e  a valid pointer.
255d0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
255e0 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  ine is an optimi
255f0 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63  zation.  It is c
25600 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e  ommon for the en
25610 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20  tire key.** and 
25620 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74  data to fit on t
25630 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e  he local page an
25640 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62  d for there to b
25650 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a  e no overflow.**
25660 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68   pages.  When th
25670 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72  at is so, this r
25680 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73  outine can be us
25690 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ed to access the
256a0 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61  .** key and data
256b0 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20   without making 
256c0 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65 20  a copy.  If the 
256d0 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 20  key and/or data 
256e0 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f  spills.** onto o
256f0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74  verflow pages, t
25700 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61  hen accessPayloa
25710 64 28 29 20 6d 75 73 74 20 62 65 20 75 73 65 64  d() must be used
25720 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a   to reassemble.*
25730 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61 20 61  * the key/data a
25740 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74 6f 20  nd copy it into 
25750 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62  a preallocated b
25760 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  uffer..**.** The
25770 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
25780 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  d by this routin
25790 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79  e looks directly
257a0 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 64   into the cached
257b0 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68 65 20  .** page of the 
257c0 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 64  database.  The d
257d0 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e 67 65  ata might change
257e0 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e 65 78   or move the nex
257f0 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74  t time.** any bt
25800 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73 20 63  ree routine is c
25810 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  alled..*/.static
25820 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 66 65 74   const void *fet
25830 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43  chPayload(.  BtC
25840 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
25850 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e    /* Cursor poin
25860 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f  ting to entry to
25870 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
25880 75 33 32 20 2a 70 41 6d 74 20 20 20 20 20 20 20  u32 *pAmt       
25890 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
258a0 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69  e number of avai
258b0 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65 72 65  lable bytes here
258c0 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
258d0 20 70 43 75 72 21 3d 30 20 26 26 20 70 43 75 72   pCur!=0 && pCur
258e0 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43  ->iPage>=0 && pC
258f0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
25900 3e 69 50 61 67 65 5d 29 3b 0a 20 20 61 73 73 65  >iPage]);.  asse
25910 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
25920 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
25930 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
25940 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
25950 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
25960 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
25970 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
25980 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
25990 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
259a0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
259b0 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ]<pCur->apPage[p
259c0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
259d0 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
259e0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
259f0 3e 30 20 29 3b 0a 20 20 2a 70 41 6d 74 20 3d 20  >0 );.  *pAmt = 
25a00 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
25a10 6c 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69  l;.  return (voi
25a20 64 2a 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50  d*)pCur->info.pP
25a30 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ayload;.}.../*.*
25a40 2a 20 46 6f 72 20 74 68 65 20 65 6e 74 72 79 20  * For the entry 
25a50 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 75 72  that cursor pCur
25a60 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65   is point to, re
25a70 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20  turn as.** many 
25a80 62 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65 79  bytes of the key
25a90 20 6f 72 20 64 61 74 61 20 61 73 20 61 72 65 20   or data as are 
25aa0 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65  available on the
25ab0 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65   local.** b-tree
25ac0 20 70 61 67 65 2e 20 20 57 72 69 74 65 20 74 68   page.  Write th
25ad0 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69  e number of avai
25ae0 6c 61 62 6c 65 20 62 79 74 65 73 20 69 6e 74 6f  lable bytes into
25af0 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68   *pAmt..**.** Th
25b00 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  e pointer return
25b10 65 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2e  ed is ephemeral.
25b20 20 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20 6d    The key/data m
25b30 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65  ay move.** or be
25b40 20 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74 68   destroyed on th
25b50 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61  e next call to a
25b60 6e 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e 65  ny Btree routine
25b70 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63  ,.** including c
25b80 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72 20  alls from other 
25b90 74 68 72 65 61 64 73 20 61 67 61 69 6e 73 74 20  threads against 
25ba0 74 68 65 20 73 61 6d 65 20 63 61 63 68 65 2e 0a  the same cache..
25bb0 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75 74 65  ** Hence, a mute
25bc0 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72 65  x on the BtShare
25bd0 64 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64  d should be held
25be0 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
25bf0 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  g.** this routin
25c00 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72  e..**.** These r
25c10 6f 75 74 69 6e 65 73 20 69 73 20 75 73 65 64 20  outines is used 
25c20 74 6f 20 67 65 74 20 71 75 69 63 6b 20 61 63 63  to get quick acc
25c30 65 73 73 20 74 6f 20 6b 65 79 20 61 6e 64 20 64  ess to key and d
25c40 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f  ata.** in the co
25c50 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
25c60 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  no overflow page
25c70 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63  s are used..*/.c
25c80 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74  onst void *sqlit
25c90 65 33 42 74 72 65 65 4b 65 79 46 65 74 63 68 28  e3BtreeKeyFetch(
25ca0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
25cb0 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20 72 65  u32 *pAmt){.  re
25cc0 74 75 72 6e 20 66 65 74 63 68 50 61 79 6c 6f 61  turn fetchPayloa
25cd0 64 28 70 43 75 72 2c 20 70 41 6d 74 29 3b 0a 7d  d(pCur, pAmt);.}
25ce0 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c  .const void *sql
25cf0 69 74 65 33 42 74 72 65 65 44 61 74 61 46 65 74  ite3BtreeDataFet
25d00 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ch(BtCursor *pCu
25d10 72 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20  r, u32 *pAmt){. 
25d20 20 72 65 74 75 72 6e 20 66 65 74 63 68 50 61 79   return fetchPay
25d30 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 29  load(pCur, pAmt)
25d40 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ;.}.../*.** Move
25d50 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
25d60 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20   to a new child 
25d70 70 61 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67  page.  The newPg
25d80 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  no argument is t
25d90 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65  he.** page numbe
25da0 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70  r of the child p
25db0 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a  age to move to..
25dc0 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
25dd0 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ion returns SQLI
25de0 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 74 68  TE_CORRUPT if th
25df0 65 20 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c  e page-header fl
25e00 61 67 73 20 66 69 65 6c 64 20 6f 66 0a 2a 2a 20  ags field of.** 
25e10 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61  the new child pa
25e20 67 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  ge does not matc
25e30 68 20 74 68 65 20 66 6c 61 67 73 20 66 69 65 6c  h the flags fiel
25e40 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20  d of the parent 
25e50 28 69 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e 20 69  (i.e..** if an i
25e60 6e 74 6b 65 79 20 70 61 67 65 20 61 70 70 65 61  ntkey page appea
25e70 72 73 20 74 6f 20 62 65 20 74 68 65 20 70 61 72  rs to be the par
25e80 65 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74  ent of a non-int
25e90 6b 65 79 20 70 61 67 65 2c 20 6f 72 0a 2a 2a 20  key page, or.** 
25ea0 76 69 63 65 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a  vice-versa)..*/.
25eb0 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
25ec0 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20  oChild(BtCursor 
25ed0 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67  *pCur, u32 newPg
25ee0 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  no){.  int rc;. 
25ef0 20 69 6e 74 20 69 20 3d 20 70 43 75 72 2d 3e 69   int i = pCur->i
25f00 50 61 67 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20  Page;.  MemPage 
25f10 2a 70 4e 65 77 50 61 67 65 3b 0a 20 20 42 74 53  *pNewPage;.  BtS
25f20 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75  hared *pBt = pCu
25f30 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72  r->pBt;..  asser
25f40 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
25f50 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
25f60 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
25f70 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
25f80 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
25f90 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43 55 52  Cur->iPage<BTCUR
25fa0 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b  SOR_MAX_DEPTH );
25fb0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
25fc0 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20 20 69  >iPage>=0 );.  i
25fd0 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  f( pCur->iPage>=
25fe0 28 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45  (BTCURSOR_MAX_DE
25ff0 50 54 48 2d 31 29 20 29 7b 0a 20 20 20 20 72 65  PTH-1) ){.    re
26000 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
26010 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
26020 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50  rc = getAndInitP
26030 61 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f  age(pBt, newPgno
26040 2c 20 26 70 4e 65 77 50 61 67 65 2c 0a 20 20 20  , &pNewPage,.   
26050 20 20 20 20 20 20 20 20 20 20 20 20 28 70 43 75              (pCu
26060 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
26070 43 46 5f 57 72 69 74 65 46 6c 61 67 29 3d 3d 30  CF_WriteFlag)==0
26080 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41   ? PAGER_GET_REA
26090 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 69 66  DONLY : 0);.  if
260a0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
260b0 3b 0a 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65  ;.  pCur->apPage
260c0 5b 69 2b 31 5d 20 3d 20 70 4e 65 77 50 61 67 65  [i+1] = pNewPage
260d0 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  ;.  pCur->aiIdx[
260e0 69 2b 31 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72  i+1] = 0;.  pCur
260f0 2d 3e 69 50 61 67 65 2b 2b 3b 0a 0a 20 20 70 43  ->iPage++;..  pC
26100 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
26110 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46   0;.  pCur->curF
26120 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56  lags &= ~(BTCF_V
26130 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61  alidNKey|BTCF_Va
26140 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 69 66 28 20  lidOvfl);.  if( 
26150 70 4e 65 77 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c  pNewPage->nCell<
26160 31 20 7c 7c 20 70 4e 65 77 50 61 67 65 2d 3e 69  1 || pNewPage->i
26170 6e 74 4b 65 79 21 3d 70 43 75 72 2d 3e 61 70 50  ntKey!=pCur->apP
26180 61 67 65 5b 69 5d 2d 3e 69 6e 74 4b 65 79 20 29  age[i]->intKey )
26190 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
261a0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
261b0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
261c0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
261d0 20 30 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50   0./*.** Page pP
261e0 61 72 65 6e 74 20 69 73 20 61 6e 20 69 6e 74 65  arent is an inte
261f0 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20  rnal (non-leaf) 
26200 74 72 65 65 20 70 61 67 65 2e 20 54 68 69 73 20  tree page. This 
26210 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73  function .** ass
26220 65 72 74 73 20 74 68 61 74 20 70 61 67 65 20 6e  erts that page n
26230 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20  umber iChild is 
26240 74 68 65 20 6c 65 66 74 2d 63 68 69 6c 64 20 69  the left-child i
26250 66 20 74 68 65 20 69 49 64 78 27 74 68 0a 2a 2a  f the iIdx'th.**
26260 20 63 65 6c 6c 20 69 6e 20 70 61 67 65 20 70 50   cell in page pP
26270 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49  arent. Or, if iI
26280 64 78 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74  dx is equal to t
26290 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
262a0 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70  of.** cells in p
262b0 50 61 72 65 6e 74 2c 20 74 68 61 74 20 70 61 67  Parent, that pag
262c0 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20  e number iChild 
262d0 69 73 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  is the right-chi
262e0 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67  ld of.** the pag
262f0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
26300 64 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e  d assertParentIn
26310 64 65 78 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  dex(MemPage *pPa
26320 72 65 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c 20  rent, int iIdx, 
26330 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20  Pgno iChild){.  
26340 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d 70 50  assert( iIdx<=pP
26350 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  arent->nCell );.
26360 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50 61 72    if( iIdx==pPar
26370 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  ent->nCell ){.  
26380 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79    assert( get4by
26390 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61  te(&pParent->aDa
263a0 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  ta[pParent->hdrO
263b0 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c  ffset+8])==iChil
263c0 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  d );.  }else{.  
263d0 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79    assert( get4by
263e0 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72  te(findCell(pPar
263f0 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69 43 68  ent, iIdx))==iCh
26400 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  ild );.  }.}.#el
26410 73 65 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73  se.#  define ass
26420 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 78  ertParentIndex(x
26430 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f  ,y,z) .#endif../
26440 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
26450 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70  rsor up to the p
26460 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a  arent page..**.*
26470 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73  * pCur->idx is s
26480 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69  et to the cell i
26490 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69  ndex that contai
264a0 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a  ns the pointer.*
264b0 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20 77 65  * to the page we
264c0 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d   are coming from
264d0 2e 20 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d  .  If we are com
264e0 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ing from the.** 
264f0 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64  right-most child
26500 20 70 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d   page then pCur-
26510 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f  >idx is set to o
26520 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20  ne more than.** 
26530 74 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c  the largest cell
26540 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69   index..*/.stati
26550 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72  c void moveToPar
26560 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ent(BtCursor *pC
26570 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ur){.  assert( c
26580 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
26590 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
265a0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
265b0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
265c0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
265d0 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20 61 73  >iPage>0 );.  as
265e0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
265f0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
26600 29 3b 0a 0a 20 20 2f 2a 20 55 50 44 41 54 45 3a  );..  /* UPDATE:
26610 20 49 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20   It is actually 
26620 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65  possible for the
26630 20 63 6f 6e 64 69 74 69 6f 6e 20 74 65 73 74 65   condition teste
26640 64 20 62 79 20 74 68 65 20 61 73 73 65 72 74 0a  d by the assert.
26650 20 20 2a 2a 20 62 65 6c 6f 77 20 74 6f 20 62 65    ** below to be
26660 20 75 6e 74 72 75 65 20 69 66 20 74 68 65 20 64   untrue if the d
26670 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
26680 63 6f 72 72 75 70 74 2e 20 54 68 69 73 20 63 61  corrupt. This ca
26690 6e 20 6f 63 63 75 72 20 69 66 0a 20 20 2a 2a 20  n occur if.  ** 
266a0 6f 6e 65 20 63 75 72 73 6f 72 20 68 61 73 20 6d  one cursor has m
266b0 6f 64 69 66 69 65 64 20 70 61 67 65 20 70 50 61  odified page pPa
266c0 72 65 6e 74 20 77 68 69 6c 65 20 61 20 72 65 66  rent while a ref
266d0 65 72 65 6e 63 65 20 74 6f 20 69 74 20 69 73 20  erence to it is 
266e0 68 65 6c 64 20 0a 20 20 2a 2a 20 62 79 20 61 20  held .  ** by a 
266f0 73 65 63 6f 6e 64 20 63 75 72 73 6f 72 2e 20 57  second cursor. W
26700 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61  hich can only ha
26710 70 70 65 6e 20 69 66 20 61 20 73 69 6e 67 6c 65  ppen if a single
26720 20 70 61 67 65 20 69 73 20 6c 69 6e 6b 65 64 0a   page is linked.
26730 20 20 2a 2a 20 69 6e 74 6f 20 6d 6f 72 65 20 74    ** into more t
26740 68 61 6e 20 6f 6e 65 20 62 2d 74 72 65 65 20 73  han one b-tree s
26750 74 72 75 63 74 75 72 65 20 69 6e 20 61 20 63 6f  tructure in a co
26760 72 72 75 70 74 20 64 61 74 61 62 61 73 65 2e 20  rrupt database. 
26770 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65   */.#if 0.  asse
26780 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 0a 20  rtParentIndex(. 
26790 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b     pCur->apPage[
267a0 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20  pCur->iPage-1], 
267b0 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
267c0 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c  [pCur->iPage-1],
267d0 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61   .    pCur->apPa
267e0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
267f0 3e 70 67 6e 6f 0a 20 20 29 3b 0a 23 65 6e 64 69  >pgno.  );.#endi
26800 66 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 43  f.  testcase( pC
26810 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
26820 69 50 61 67 65 2d 31 5d 20 3e 20 70 43 75 72 2d  iPage-1] > pCur-
26830 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
26840 61 67 65 2d 31 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  age-1]->nCell );
26850 0a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ..  releasePage(
26860 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
26870 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 70 43  r->iPage]);.  pC
26880 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 70  ur->iPage--;.  p
26890 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
268a0 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  = 0;.  pCur->cur
268b0 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
268c0 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
268d0 61 6c 69 64 4f 76 66 6c 29 3b 0a 7d 0a 0a 2f 2a  alidOvfl);.}../*
268e0 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
268f0 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  sor to point to 
26900 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
26910 20 69 74 73 20 62 2d 74 72 65 65 20 73 74 72 75   its b-tree stru
26920 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  cture..**.** If 
26930 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 20  the table has a 
26940 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67  virtual root pag
26950 65 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  e, then the curs
26960 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 70  or is moved to p
26970 6f 69 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20 76  oint.** to the v
26980 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  irtual root page
26990 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   instead of the 
269a0 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  actual root page
269b0 2e 20 41 20 74 61 62 6c 65 20 68 61 73 20 61 0a  . A table has a.
269c0 2a 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20  ** virtual root 
269d0 70 61 67 65 20 77 68 65 6e 20 74 68 65 20 61 63  page when the ac
269e0 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 63  tual root page c
269f0 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73  ontains no cells
26a00 20 61 6e 64 20 61 20 0a 2a 2a 20 73 69 6e 67 6c   and a .** singl
26a10 65 20 63 68 69 6c 64 20 70 61 67 65 2e 20 54 68  e child page. Th
26a20 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70  is can only happ
26a30 65 6e 20 77 69 74 68 20 74 68 65 20 74 61 62 6c  en with the tabl
26a40 65 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  e rooted at page
26a50 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65   1..**.** If the
26a60 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   b-tree structur
26a70 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20  e is empty, the 
26a80 63 75 72 73 6f 72 20 73 74 61 74 65 20 69 73 20  cursor state is 
26a90 73 65 74 20 74 6f 20 0a 2a 2a 20 43 55 52 53 4f  set to .** CURSO
26aa0 52 5f 49 4e 56 41 4c 49 44 2e 20 4f 74 68 65 72  R_INVALID. Other
26ab0 77 69 73 65 2c 20 74 68 65 20 63 75 72 73 6f 72  wise, the cursor
26ac0 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
26ad0 20 74 6f 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   to the first.**
26ae0 20 63 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e   cell located on
26af0 20 74 68 65 20 72 6f 6f 74 20 28 6f 72 20 76 69   the root (or vi
26b00 72 74 75 61 6c 20 72 6f 6f 74 29 20 70 61 67 65  rtual root) page
26b10 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20   and the cursor 
26b20 73 74 61 74 65 0a 2a 2a 20 69 73 20 73 65 74 20  state.** is set 
26b30 74 6f 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e  to CURSOR_VALID.
26b40 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66  .**.** If this f
26b50 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
26b60 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 69 74  successfully, it
26b70 20 6d 61 79 20 62 65 20 61 73 73 75 6d 65 64 20   may be assumed 
26b80 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 67 65  that the.** page
26b90 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20 69 6e  -header flags in
26ba0 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
26bb0 5b 76 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70  [virtual] root-p
26bc0 61 67 65 20 69 73 20 74 68 65 20 65 78 70 65 63  age is the expec
26bd0 74 65 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20  ted .** kind of 
26be0 62 2d 74 72 65 65 20 70 61 67 65 20 28 69 2e 65  b-tree page (i.e
26bf0 2e 20 69 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e  . if when openin
26c00 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 68 65  g the cursor the
26c10 20 63 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a   caller did not.
26c20 2a 2a 20 73 70 65 63 69 66 79 20 61 20 4b 65 79  ** specify a Key
26c30 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
26c40 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 69 73  he flags byte is
26c50 20 73 65 74 20 74 6f 20 30 78 30 35 20 6f 72 20   set to 0x05 or 
26c60 30 78 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74  0x0D,.** indicat
26c70 69 6e 67 20 61 20 74 61 62 6c 65 20 62 2d 74 72  ing a table b-tr
26c80 65 65 2c 20 6f 72 20 69 66 20 74 68 65 20 63 61  ee, or if the ca
26c90 6c 6c 65 72 20 64 69 64 20 73 70 65 63 69 66 79  ller did specify
26ca0 20 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73   a KeyInfo .** s
26cb0 74 72 75 63 74 75 72 65 20 74 68 65 20 66 6c 61  tructure the fla
26cc0 67 73 20 62 79 74 65 20 69 73 20 73 65 74 20 74  gs byte is set t
26cd0 6f 20 30 78 30 32 20 6f 72 20 30 78 30 41 2c 20  o 0x02 or 0x0A, 
26ce0 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e  indicating an in
26cf0 64 65 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a  dex.** b-tree)..
26d00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
26d10 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f  veToRoot(BtCurso
26d20 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50  r *pCur){.  MemP
26d30 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e  age *pRoot;.  in
26d40 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
26d50 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
26d60 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
26d70 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
26d80 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20   CURSOR_INVALID 
26d90 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  < CURSOR_REQUIRE
26da0 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  SEEK );.  assert
26db0 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 20  ( CURSOR_VALID  
26dc0 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   < CURSOR_REQUIR
26dd0 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72  ESEEK );.  asser
26de0 74 28 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  t( CURSOR_FAULT 
26df0 20 20 3e 20 43 55 52 53 4f 52 5f 52 45 51 55 49    > CURSOR_REQUI
26e00 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20  RESEEK );.  if( 
26e10 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55  pCur->eState>=CU
26e20 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
26e30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72   ){.    if( pCur
26e40 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
26e50 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 20 20  _FAULT ){.      
26e60 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b  assert( pCur->sk
26e70 69 70 4e 65 78 74 21 3d 53 51 4c 49 54 45 5f 4f  ipNext!=SQLITE_O
26e80 4b 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  K );.      retur
26e90 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  n pCur->skipNext
26ea0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
26eb0 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72  te3BtreeClearCur
26ec0 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 7d 0a 0a  sor(pCur);.  }..
26ed0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
26ee0 65 3e 3d 30 20 29 7b 0a 20 20 20 20 77 68 69 6c  e>=0 ){.    whil
26ef0 65 28 20 70 43 75 72 2d 3e 69 50 61 67 65 20 29  e( pCur->iPage )
26f00 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
26f10 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
26f20 69 50 61 67 65 2d 2d 5d 29 3b 0a 20 20 7d 65 6c  iPage--]);.  }el
26f30 73 65 20 69 66 28 20 70 43 75 72 2d 3e 70 67 6e  se if( pCur->pgn
26f40 6f 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20  oRoot==0 ){.    
26f50 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
26f60 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
26f70 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
26f80 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
26f90 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69    rc = getAndIni
26fa0 74 50 61 67 65 28 70 43 75 72 2d 3e 70 42 74 72  tPage(pCur->pBtr
26fb0 65 65 2d 3e 70 42 74 2c 20 70 43 75 72 2d 3e 70  ee->pBt, pCur->p
26fc0 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e  gnoRoot, &pCur->
26fd0 61 70 50 61 67 65 5b 30 5d 2c 0a 20 20 20 20 20  apPage[0],.     
26fe0 20 20 20 20 20 20 20 20 20 20 20 20 28 70 43 75              (pCu
26ff0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
27000 43 46 5f 57 72 69 74 65 46 6c 61 67 29 3d 3d 30  CF_WriteFlag)==0
27010 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41   ? PAGER_GET_REA
27020 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 20 20  DONLY : 0);.    
27030 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
27040 4b 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  K ){.      pCur-
27050 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
27060 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  _INVALID;.      
27070 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
27080 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65  .    pCur->iPage
27090 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f   = 0;.  }.  pRoo
270a0 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  t = pCur->apPage
270b0 5b 30 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  [0];.  assert( p
270c0 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72  Root->pgno==pCur
270d0 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20  ->pgnoRoot );.. 
270e0 20 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b 65   /* If pCur->pKe
270f0 79 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c  yInfo is not NUL
27100 4c 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c  L, then the call
27110 65 72 20 74 68 61 74 20 6f 70 65 6e 65 64 20 74  er that opened t
27120 68 69 73 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20  his cursor.  ** 
27130 65 78 70 65 63 74 65 64 20 74 6f 20 6f 70 65 6e  expected to open
27140 20 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20   it on an index 
27150 62 2d 74 72 65 65 2e 20 4f 74 68 65 72 77 69 73  b-tree. Otherwis
27160 65 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f 20 69  e, if pKeyInfo i
27170 73 0a 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65  s.  ** NULL, the
27180 20 63 61 6c 6c 65 72 20 65 78 70 65 63 74 73 20   caller expects 
27190 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2e 20  a table b-tree. 
271a0 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74  If this is not t
271b0 68 65 20 63 61 73 65 2c 0a 20 20 2a 2a 20 72 65  he case,.  ** re
271c0 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43  turn an SQLITE_C
271d0 4f 52 52 55 50 54 20 65 72 72 6f 72 2e 20 0a 20  ORRUPT error. . 
271e0 20 2a 2a 0a 20 20 2a 2a 20 45 61 72 6c 69 65 72   **.  ** Earlier
271f0 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
27200 69 74 65 20 61 73 73 75 6d 65 64 20 74 68 61 74  ite assumed that
27210 20 74 68 69 73 20 74 65 73 74 20 63 6f 75 6c 64   this test could
27220 20 6e 6f 74 20 66 61 69 6c 0a 20 20 2a 2a 20 69   not fail.  ** i
27230 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  f the root page 
27240 77 61 73 20 61 6c 72 65 61 64 79 20 6c 6f 61 64  was already load
27250 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
27260 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64  ction was called
27270 20 28 69 2e 65 2e 0a 20 20 2a 2a 20 69 66 20 70   (i.e..  ** if p
27280 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 29 2e 20  Cur->iPage>=0). 
27290 42 75 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20  But this is not 
272a0 73 6f 20 69 66 20 74 68 65 20 64 61 74 61 62 61  so if the databa
272b0 73 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 20  se is corrupted 
272c0 0a 20 20 2a 2a 20 69 6e 20 73 75 63 68 20 61 20  .  ** in such a 
272d0 77 61 79 20 74 68 61 74 20 70 61 67 65 20 70 52  way that page pR
272e0 6f 6f 74 20 69 73 20 6c 69 6e 6b 65 64 20 69 6e  oot is linked in
272f0 74 6f 20 61 20 73 65 63 6f 6e 64 20 62 2d 74 72  to a second b-tr
27300 65 65 20 74 61 62 6c 65 20 0a 20 20 2a 2a 20 28  ee table .  ** (
27310 6f 72 20 74 68 65 20 66 72 65 65 6c 69 73 74 29  or the freelist)
27320 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
27330 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31  pRoot->intKey==1
27340 20 7c 7c 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65   || pRoot->intKe
27350 79 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 52  y==0 );.  if( pR
27360 6f 6f 74 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 7c  oot->isInit==0 |
27370 7c 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  | (pCur->pKeyInf
27380 6f 3d 3d 30 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e  o==0)!=pRoot->in
27390 74 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75  tKey ){.    retu
273a0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
273b0 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 70  T_BKPT;.  }..  p
273c0 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20  Cur->aiIdx[0] = 
273d0 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  0;.  pCur->info.
273e0 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
273f0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
27400 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43  (BTCF_AtLast|BTC
27410 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46  F_ValidNKey|BTCF
27420 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 0a 20 20  _ValidOvfl);..  
27430 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c  if( pRoot->nCell
27440 3e 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  >0 ){.    pCur->
27450 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
27460 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73 65 20 69  VALID;.  }else i
27470 66 28 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20  f( !pRoot->leaf 
27480 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70  ){.    Pgno subp
27490 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70 52 6f  age;.    if( pRo
274a0 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72 65  ot->pgno!=1 ) re
274b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
274c0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 73 75  UPT_BKPT;.    su
274d0 62 70 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  bpage = get4byte
274e0 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70  (&pRoot->aData[p
274f0 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Root->hdrOffset+
27500 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65  8]);.    pCur->e
27510 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56  State = CURSOR_V
27520 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d  ALID;.    rc = m
27530 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
27540 20 73 75 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c   subpage);.  }el
27550 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53  se{.    pCur->eS
27560 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
27570 56 41 4c 49 44 3b 0a 20 20 7d 0a 20 20 72 65 74  VALID;.  }.  ret
27580 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
27590 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
275a0 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66   down to the lef
275b0 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72  t-most leaf entr
275c0 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a  y beneath the.**
275d0 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20   entry to which 
275e0 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  it is currently 
275f0 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  pointing..**.** 
27600 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65  The left-most le
27610 61 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69  af is the one wi
27620 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20  th the smallest 
27630 6b 65 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a  key - the first.
27640 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  ** in ascending 
27650 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  order..*/.static
27660 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d   int moveToLeftm
27670 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ost(BtCursor *pC
27680 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  ur){.  Pgno pgno
27690 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
276a0 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67  ITE_OK;.  MemPag
276b0 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73  e *pPage;..  ass
276c0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
276d0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
276e0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
276f0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
27700 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  LID );.  while( 
27710 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
27720 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d   !(pPage = pCur-
27730 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
27740 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20  age])->leaf ){. 
27750 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
27760 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
27770 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ge]<pPage->nCell
27780 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67   );.    pgno = g
27790 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
277a0 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 61 69  (pPage, pCur->ai
277b0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
277c0 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ));.    rc = mov
277d0 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70  eToChild(pCur, p
277e0 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  gno);.  }.  retu
277f0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
27800 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
27810 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68  down to the righ
27820 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72  t-most leaf entr
27830 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a  y beneath the.**
27840 20 70 61 67 65 20 74 6f 20 77 68 69 63 68 20 69   page to which i
27850 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
27860 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65  ointing.  Notice
27870 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a   the difference.
27880 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54  ** between moveT
27890 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20  oLeftmost() and 
278a0 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
278b0 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  ).  moveToLeftmo
278c0 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68  st().** finds th
278d0 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72  e left-most entr
278e0 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65  y beneath the *e
278f0 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f  ntry* whereas mo
27900 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a  veToRightmost().
27910 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69 67  ** finds the rig
27920 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65  ht-most entry be
27930 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a  neath the *page*
27940 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68  ..**.** The righ
27950 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73 20  t-most entry is 
27960 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65  the one with the
27970 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20 74   largest key - t
27980 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69  he last.** key i
27990 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
279a0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
279b0 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
279c0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
279d0 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20  {.  Pgno pgno;. 
279e0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
279f0 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  _OK;.  MemPage *
27a00 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73  pPage = 0;..  as
27a10 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
27a20 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
27a30 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
27a40 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
27a50 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28  ALID );.  while(
27a60 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d   !(pPage = pCur-
27a70 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
27a80 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20  age])->leaf ){. 
27a90 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79     pgno = get4by
27aa0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
27ab0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
27ac0 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d  t+8]);.    pCur-
27ad0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
27ae0 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ge] = pPage->nCe
27af0 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ll;.    rc = mov
27b00 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70  eToChild(pCur, p
27b10 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63  gno);.    if( rc
27b20 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
27b30 7d 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  }.  pCur->aiIdx[
27b40 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70  pCur->iPage] = p
27b50 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20  Page->nCell-1;. 
27b60 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
27b70 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a  nfo.nSize==0 );.
27b80 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d    assert( (pCur-
27b90 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
27ba0 5f 56 61 6c 69 64 4e 4b 65 79 29 3d 3d 30 20 29  _ValidNKey)==0 )
27bb0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
27bc0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  E_OK;.}../* Move
27bd0 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
27be0 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
27bf0 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  n the table.  Re
27c00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
27c10 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53  * on success.  S
27c20 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66  et *pRes to 0 if
27c30 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75   the cursor actu
27c40 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73  ally points to s
27c50 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73  omething.** or s
27c60 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66  et *pRes to 1 if
27c70 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
27c80 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
27c90 74 65 33 42 74 72 65 65 46 69 72 73 74 28 42 74  te3BtreeFirst(Bt
27ca0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
27cb0 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
27cc0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  rc;..  assert( c
27cd0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
27ce0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
27cf0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
27d00 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
27d10 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
27d20 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ;.  rc = moveToR
27d30 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
27d40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
27d50 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
27d60 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
27d70 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20  NVALID ){.      
27d80 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67  assert( pCur->pg
27d90 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75  noRoot==0 || pCu
27da0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
27db0 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30  iPage]->nCell==0
27dc0 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
27dd0 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
27de0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
27df0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
27e00 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30  >iPage]->nCell>0
27e10 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
27e20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
27e30 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
27e40 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Cur);.    }.  }.
27e50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
27e60 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
27e70 6f 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  or to the last e
27e80 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
27e90 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
27ea0 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  E_OK.** on succe
27eb0 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74  ss.  Set *pRes t
27ec0 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f  o 0 if the curso
27ed0 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74  r actually point
27ee0 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a  s to something.*
27ef0 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74  * or set *pRes t
27f00 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65  o 1 if the table
27f10 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e   is empty..*/.in
27f20 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61  t sqlite3BtreeLa
27f30 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
27f40 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
27f50 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73 73   int rc;. .  ass
27f60 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
27f70 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
27f80 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
27f90 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
27fa0 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
27fb0 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  tex) );..  /* If
27fc0 20 74 68 65 20 63 75 72 73 6f 72 20 61 6c 72 65   the cursor alre
27fd0 61 64 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ady points to th
27fe0 65 20 6c 61 73 74 20 65 6e 74 72 79 2c 20 74 68  e last entry, th
27ff0 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a  is is a no-op. *
28000 2f 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 56  /.  if( CURSOR_V
28010 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
28020 74 65 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72  te && (pCur->cur
28030 46 6c 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c  Flags & BTCF_AtL
28040 61 73 74 29 21 3d 30 20 29 7b 0a 23 69 66 64 65  ast)!=0 ){.#ifde
28050 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
28060 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b     /* This block
28070 20 73 65 72 76 65 73 20 74 6f 20 61 73 73 65 72   serves to asser
28080 74 28 29 20 74 68 61 74 20 74 68 65 20 63 75 72  t() that the cur
28090 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65 73 20  sor really does 
280a0 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a 20 74 6f  point .    ** to
280b0 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
280c0 69 6e 20 74 68 65 20 62 2d 74 72 65 65 2e 20 2a  in the b-tree. *
280d0 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20  /.    int ii;.  
280e0 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
280f0 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 69 2b 2b  Cur->iPage; ii++
28100 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
28110 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 69 5d   pCur->aiIdx[ii]
28120 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  ==pCur->apPage[i
28130 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  i]->nCell );.   
28140 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
28150 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
28160 3e 69 50 61 67 65 5d 3d 3d 70 43 75 72 2d 3e 61  >iPage]==pCur->a
28170 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
28180 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20  e]->nCell-1 );. 
28190 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
281a0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
281b0 61 67 65 5d 2d 3e 6c 65 61 66 20 29 3b 0a 23 65  age]->leaf );.#e
281c0 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
281d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
281e0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f    rc = moveToRoo
281f0 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  t(pCur);.  if( r
28200 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
28210 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49      if( CURSOR_I
28220 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  NVALID==pCur->eS
28230 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 61 73  tate ){.      as
28240 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
28250 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
28260 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
28270 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  age]->nCell==0 )
28280 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
28290 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
282a0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
282b0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
282c0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 20 20  _VALID );.      
282d0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
282e0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68   rc = moveToRigh
282f0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
28300 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
28310 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
28320 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c  pCur->curFlags |
28330 3d 20 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20  = BTCF_AtLast;. 
28340 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
28350 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
28360 67 73 20 26 3d 20 7e 42 54 43 46 5f 41 74 4c 61  gs &= ~BTCF_AtLa
28370 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 0a  st;.      }.   .
28380 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
28390 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76  rn rc;.}../* Mov
283a0 65 20 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20  e the cursor so 
283b0 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
283c0 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20  o an entry near 
283d0 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63  the key .** spec
283e0 69 66 69 65 64 20 62 79 20 70 49 64 78 4b 65 79  ified by pIdxKey
283f0 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20 52 65   or intKey.   Re
28400 74 75 72 6e 20 61 20 73 75 63 63 65 73 73 20 63  turn a success c
28410 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49  ode..**.** For I
28420 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 74 68  NTKEY tables, th
28430 65 20 69 6e 74 4b 65 79 20 70 61 72 61 6d 65 74  e intKey paramet
28440 65 72 20 69 73 20 75 73 65 64 2e 20 20 70 49 64  er is used.  pId
28450 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65  xKey .** must be
28460 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65   NULL.  For inde
28470 78 20 74 61 62 6c 65 73 2c 20 70 49 64 78 4b 65  x tables, pIdxKe
28480 79 20 69 73 20 75 73 65 64 20 61 6e 64 20 69 6e  y is used and in
28490 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72  tKey.** is ignor
284a0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
284b0 65 78 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e  exact match is n
284c0 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74  ot found, then t
284d0 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77  he cursor is alw
284e0 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e  ays.** left poin
284f0 74 69 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70  ting at a leaf p
28500 61 67 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20  age which would 
28510 68 6f 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69  hold the entry i
28520 66 20 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65  f it.** were pre
28530 73 65 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f  sent.  The curso
28540 72 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f  r might point to
28550 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63   an entry that c
28560 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f  omes.** before o
28570 72 20 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e  r after the key.
28580 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65  .**.** An intege
28590 72 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  r is written int
285a0 6f 20 2a 70 52 65 73 20 77 68 69 63 68 20 69 73  o *pRes which is
285b0 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a   the result of.*
285c0 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20  * comparing the 
285d0 6b 65 79 20 77 69 74 68 20 74 68 65 20 65 6e 74  key with the ent
285e0 72 79 20 74 6f 20 77 68 69 63 68 20 74 68 65 20  ry to which the 
285f0 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f  cursor is .** po
28600 69 6e 74 69 6e 67 2e 20 20 54 68 65 20 6d 65 61  inting.  The mea
28610 6e 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 74 65  ning of the inte
28620 67 65 72 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  ger written into
28630 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20 61 73 20  .** *pRes is as 
28640 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
28650 20 20 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20     *pRes<0      
28660 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
28670 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
28680 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
28690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286a0 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
286b0 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 20   intKey/pIdxKey 
286c0 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  or if the table 
286d0 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20  is empty.**     
286e0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 64               and
286f0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 74   the cursor is t
28700 68 65 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f  herefore left po
28710 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a  int to nothing..
28720 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d  **.**     *pRes=
28730 3d 30 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  =0     The curso
28740 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
28750 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
28760 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
28770 20 20 20 20 20 20 20 20 65 78 61 63 74 6c 79 20          exactly 
28780 6d 61 74 63 68 65 73 20 69 6e 74 4b 65 79 2f 70  matches intKey/p
28790 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20  IdxKey..**.**   
287a0 20 20 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54    *pRes>0      T
287b0 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
287c0 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
287d0 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
287e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287f0 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69  is larger than i
28800 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a  ntKey/pIdxKey..*
28810 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  *.*/.int sqlite3
28820 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63  BtreeMovetoUnpac
28830 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20  ked(.  BtCursor 
28840 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20  *pCur,          
28850 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f  /* The cursor to
28860 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 55   be moved */.  U
28870 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
28880 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61 63  IdxKey, /* Unpac
28890 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f  ked index key */
288a0 0a 20 20 69 36 34 20 69 6e 74 4b 65 79 2c 20 20  .  i64 intKey,  
288b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
288c0 68 65 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f 0a  he table key */.
288d0 20 20 69 6e 74 20 62 69 61 73 52 69 67 68 74 2c    int biasRight,
288e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
288f0 20 74 72 75 65 2c 20 62 69 61 73 20 74 68 65 20   true, bias the 
28900 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69  search to the hi
28910 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  gh end */.  int 
28920 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20  *pRes           
28930 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65       /* Write se
28940 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65 72  arch results her
28950 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
28960 3b 0a 20 20 52 65 63 6f 72 64 43 6f 6d 70 61 72  ;.  RecordCompar
28970 65 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  e xRecordCompare
28980 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
28990 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
289a0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
289b0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
289c0 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
289d0 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
289e0 20 20 61 73 73 65 72 74 28 20 70 52 65 73 20 29    assert( pRes )
289f0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 49 64  ;.  assert( (pId
28a00 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d  xKey==0)==(pCur-
28a10 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 20 29 3b  >pKeyInfo==0) );
28a20 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75  ..  /* If the cu
28a30 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  rsor is already 
28a40 70 6f 73 69 74 69 6f 6e 65 64 20 61 74 20 74 68  positioned at th
28a50 65 20 70 6f 69 6e 74 20 77 65 20 61 72 65 20 74  e point we are t
28a60 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f  rying.  ** to mo
28a70 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74  ve to, then just
28a80 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   return without 
28a90 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a  doing any work *
28aa0 2f 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  /.  if( pCur->eS
28ab0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
28ac0 49 44 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72  ID && (pCur->cur
28ad0 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c  Flags & BTCF_Val
28ae0 69 64 4e 4b 65 79 29 21 3d 30 0a 20 20 20 26 26  idNKey)!=0.   &&
28af0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
28b00 2d 3e 69 6e 74 4b 65 79 20 0a 20 20 29 7b 0a 20  ->intKey .  ){. 
28b10 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66     if( pCur->inf
28b20 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29  o.nKey==intKey )
28b30 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  {.      *pRes = 
28b40 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
28b50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
28b60 0a 20 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e  .    if( (pCur->
28b70 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
28b80 41 74 4c 61 73 74 29 21 3d 30 20 26 26 20 70 43  AtLast)!=0 && pC
28b90 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e  ur->info.nKey<in
28ba0 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70  tKey ){.      *p
28bb0 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Res = -1;.      
28bc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
28bd0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
28be0 66 28 20 70 49 64 78 4b 65 79 20 29 7b 0a 20 20  f( pIdxKey ){.  
28bf0 20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65    xRecordCompare
28c00 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 46 69   = sqlite3VdbeFi
28c10 6e 64 43 6f 6d 70 61 72 65 28 70 49 64 78 4b 65  ndCompare(pIdxKe
28c20 79 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 2d  y);.    pIdxKey-
28c30 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20  >errCode = 0;.  
28c40 20 20 61 73 73 65 72 74 28 20 70 49 64 78 4b 65    assert( pIdxKe
28c50 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 31  y->default_rc==1
28c60 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49   .         || pI
28c70 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72  dxKey->default_r
28c80 63 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 7c  c==0 .         |
28c90 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75  | pIdxKey->defau
28ca0 6c 74 5f 72 63 3d 3d 2d 31 0a 20 20 20 20 29 3b  lt_rc==-1.    );
28cb0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78 52  .  }else{.    xR
28cc0 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20 30  ecordCompare = 0
28cd0 3b 20 2f 2a 20 41 6c 6c 20 6b 65 79 73 20 61 72  ; /* All keys ar
28ce0 65 20 69 6e 74 65 67 65 72 73 20 2a 2f 0a 20 20  e integers */.  
28cf0 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  }..  rc = moveTo
28d00 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66  Root(pCur);.  if
28d10 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
28d20 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
28d30 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52  ert( pCur->pgnoR
28d40 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  oot==0 || pCur->
28d50 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
28d60 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge] );.  assert(
28d70 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
28d80 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  =0 || pCur->apPa
28d90 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
28da0 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73  >isInit );.  ass
28db0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
28dc0 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
28dd0 44 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67  D || pCur->apPag
28de0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
28df0 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 69 66 28  nCell>0 );.  if(
28e00 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
28e10 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b  URSOR_INVALID ){
28e20 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b  .    *pRes = -1;
28e30 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
28e40 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c  r->pgnoRoot==0 |
28e50 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  | pCur->apPage[p
28e60 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
28e70 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74  ll==0 );.    ret
28e80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
28e90 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75   }.  assert( pCu
28ea0 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
28eb0 74 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65 79 20  tKey || pIdxKey 
28ec0 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20  );.  for(;;){.  
28ed0 20 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 2c 20    int lwr, upr, 
28ee0 69 64 78 2c 20 63 3b 0a 20 20 20 20 50 67 6e 6f  idx, c;.    Pgno
28ef0 20 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d   chldPg;.    Mem
28f00 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43  Page *pPage = pC
28f10 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
28f20 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 75 38 20  >iPage];.    u8 
28f30 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20  *pCell;         
28f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f50 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63   /* Pointer to c
28f60 75 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70  urrent cell in p
28f70 50 61 67 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  Page */..    /* 
28f80 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73  pPage->nCell mus
28f90 74 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61  t be greater tha
28fa0 6e 20 7a 65 72 6f 2e 20 49 66 20 74 68 69 73 20  n zero. If this 
28fb0 69 73 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  is the root-page
28fc0 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 73  .    ** the curs
28fd0 6f 72 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65  or would have be
28fe0 65 6e 20 49 4e 56 41 4c 49 44 20 61 62 6f 76 65  en INVALID above
28ff0 20 61 6e 64 20 74 68 69 73 20 66 6f 72 28 3b 3b   and this for(;;
29000 29 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f  ) loop.    ** no
29010 74 20 72 75 6e 2e 20 49 66 20 74 68 69 73 20 69  t run. If this i
29020 73 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d 70  s not the root-p
29030 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 6d 6f  age, then the mo
29040 76 65 54 6f 43 68 69 6c 64 28 29 20 72 6f 75 74  veToChild() rout
29050 69 6e 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64  ine.    ** would
29060 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 65   have already de
29070 74 65 63 74 65 64 20 64 62 20 63 6f 72 72 75 70  tected db corrup
29080 74 69 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c  tion. Similarly,
29090 20 70 50 61 67 65 20 6d 75 73 74 0a 20 20 20 20   pPage must.    
290a0 2a 2a 20 62 65 20 74 68 65 20 72 69 67 68 74 20  ** be the right 
290b0 6b 69 6e 64 20 28 69 6e 64 65 78 20 6f 72 20 74  kind (index or t
290c0 61 62 6c 65 29 20 6f 66 20 62 2d 74 72 65 65 20  able) of b-tree 
290d0 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 0a  page. Otherwise.
290e0 20 20 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f 43      ** a moveToC
290f0 68 69 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54 6f  hild() or moveTo
29100 52 6f 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75 6c  Root() call woul
29110 64 20 68 61 76 65 20 64 65 74 65 63 74 65 64 20  d have detected 
29120 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a  corruption.  */.
29130 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
29140 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20  e->nCell>0 );.  
29150 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
29160 3e 69 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b 65  >intKey==(pIdxKe
29170 79 3d 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77 72  y==0) );.    lwr
29180 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20   = 0;.    upr = 
29190 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a  pPage->nCell-1;.
291a0 20 20 20 20 61 73 73 65 72 74 28 20 62 69 61 73      assert( bias
291b0 52 69 67 68 74 3d 3d 30 20 7c 7c 20 62 69 61 73  Right==0 || bias
291c0 52 69 67 68 74 3d 3d 31 20 29 3b 0a 20 20 20 20  Right==1 );.    
291d0 69 64 78 20 3d 20 75 70 72 3e 3e 28 31 2d 62 69  idx = upr>>(1-bi
291e0 61 73 52 69 67 68 74 29 3b 20 2f 2a 20 69 64 78  asRight); /* idx
291f0 20 3d 20 62 69 61 73 52 69 67 68 74 20 3f 20 75   = biasRight ? u
29200 70 72 20 3a 20 28 6c 77 72 2b 75 70 72 29 2f 32  pr : (lwr+upr)/2
29210 3b 20 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e 61  ; */.    pCur->a
29220 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
29230 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20  ] = (u16)idx;.  
29240 20 20 69 66 28 20 78 52 65 63 6f 72 64 43 6f 6d    if( xRecordCom
29250 70 61 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pare==0 ){.     
29260 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20   for(;;){.      
29270 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a    i64 nCellKey;.
29280 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20          pCell = 
29290 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
292a0 69 64 78 29 20 2b 20 70 50 61 67 65 2d 3e 63 68  idx) + pPage->ch
292b0 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20  ildPtrSize;.    
292c0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
292d0 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20 20  ntKeyLeaf ){.   
292e0 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 30 78         while( 0x
292f0 38 30 20 3c 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29  80 <= *(pCell++)
29300 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
29310 69 66 28 20 70 43 65 6c 6c 3e 3d 70 50 61 67 65  if( pCell>=pPage
29320 2d 3e 61 44 61 74 61 45 6e 64 20 29 20 72 65 74  ->aDataEnd ) ret
29330 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
29340 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
29350 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
29360 20 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74         getVarint
29370 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e  (pCell, (u64*)&n
29380 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
29390 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69    if( nCellKey<i
293a0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  ntKey ){.       
293b0 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a     lwr = idx+1;.
293c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 77            if( lw
293d0 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2d 31 3b  r>upr ){ c = -1;
293e0 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20   break; }.      
293f0 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c    }else if( nCel
29400 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  lKey>intKey ){. 
29410 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69           upr = i
29420 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  dx-1;.          
29430 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63  if( lwr>upr ){ c
29440 20 3d 20 2b 31 3b 20 62 72 65 61 6b 3b 20 7d 0a   = +1; break; }.
29450 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
29460 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
29470 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65   nCellKey==intKe
29480 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  y );.          p
29490 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d  Cur->curFlags |=
294a0 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b   BTCF_ValidNKey;
294b0 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
294c0 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65  >info.nKey = nCe
294d0 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20  llKey;.         
294e0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
294f0 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36  r->iPage] = (u16
29500 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20  )idx;.          
29510 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
29520 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
29530 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20 20 20 20  lwr = idx;.     
29540 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
29550 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3b 0a 20  to_next_layer;. 
29560 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
29570 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 52 65              *pRe
29580 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  s = 0;.         
29590 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
295a0 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  K;.            g
295b0 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
295c0 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  h;.          }. 
295d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
295e0 20 61 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72   assert( lwr+upr
295f0 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  >=0 );.        i
29600 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e  dx = (lwr+upr)>>
29610 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77  1;  /* idx = (lw
29620 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20  r+upr)/2; */.   
29630 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
29640 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20        for(;;){. 
29650 20 20 20 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c         int nCell
29660 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20  ;.        pCell 
29670 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
29680 2c 20 69 64 78 29 20 2b 20 70 50 61 67 65 2d 3e  , idx) + pPage->
29690 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 0a 20  childPtrSize;.. 
296a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
296b0 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20  ximum supported 
296c0 70 61 67 65 2d 73 69 7a 65 20 69 73 20 36 35 35  page-size is 655
296d0 33 36 20 62 79 74 65 73 2e 20 54 68 69 73 20 6d  36 bytes. This m
296e0 65 61 6e 73 20 74 68 61 74 0a 20 20 20 20 20 20  eans that.      
296f0 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d    ** the maximum
29700 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72   number of recor
29710 64 20 62 79 74 65 73 20 73 74 6f 72 65 64 20 6f  d bytes stored o
29720 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d 54 72 65  n an index B-Tre
29730 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67  e.        ** pag
29740 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31  e is less than 1
29750 36 33 38 34 20 62 79 74 65 73 20 61 6e 64 20 6d  6384 bytes and m
29760 61 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20  ay be stored as 
29770 61 20 32 2d 62 79 74 65 0a 20 20 20 20 20 20 20  a 2-byte.       
29780 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68 69 73   ** varint. This
29790 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
297a0 75 73 65 64 20 74 6f 20 61 74 74 65 6d 70 74 20  used to attempt 
297b0 74 6f 20 61 76 6f 69 64 20 70 61 72 73 69 6e 67  to avoid parsing
297c0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65   .        ** the
297d0 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 62 79 20   entire cell by 
297e0 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 74 68 65  checking for the
297f0 20 63 61 73 65 73 20 77 68 65 72 65 20 74 68 65   cases where the
29800 20 72 65 63 6f 72 64 20 69 73 20 0a 20 20 20 20   record is .    
29810 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 65 6e      ** stored en
29820 74 69 72 65 6c 79 20 77 69 74 68 69 6e 20 74 68  tirely within th
29830 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 62 79  e b-tree page by
29840 20 69 6e 73 70 65 63 74 69 6e 67 20 74 68 65 20   inspecting the 
29850 66 69 72 73 74 20 0a 20 20 20 20 20 20 20 20 2a  first .        *
29860 2a 20 32 20 62 79 74 65 73 20 6f 66 20 74 68 65  * 2 bytes of the
29870 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a   cell..        *
29880 2f 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20  /.        nCell 
29890 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20  = pCell[0];.    
298a0 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c 3d 70      if( nCell<=p
298b0 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61  Page->max1bytePa
298c0 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 20 20 20  yload ){.       
298d0 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
298e0 68 20 72 75 6e 73 20 69 66 20 74 68 65 20 72 65  h runs if the re
298f0 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20  cord-size field 
29900 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 73 20 61  of the cell is a
29910 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69  .          ** si
29920 6e 67 6c 65 20 62 79 74 65 20 76 61 72 69 6e 74  ngle byte varint
29930 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20   and the record 
29940 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e  fits entirely on
29950 20 74 68 65 20 6d 61 69 6e 0a 20 20 20 20 20 20   the main.      
29960 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 70 61      ** b-tree pa
29970 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ge.  */.        
29980 20 20 74 65 73 74 63 61 73 65 28 20 70 43 65 6c    testcase( pCel
29990 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d 70 50 61 67 65  l+nCell+1==pPage
299a0 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20  ->aDataEnd );.  
299b0 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63          c = xRec
299c0 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
299d0 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b  , (void*)&pCell[
299e0 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  1], pIdxKey);.  
299f0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
29a00 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78 38  !(pCell[1] & 0x8
29a10 30 29 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  0) .          &&
29a20 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65 6c   (nCell = ((nCel
29a30 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b 20 70 43  l&0x7f)<<7) + pC
29a40 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d 3e  ell[1])<=pPage->
29a50 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20  maxLocal.       
29a60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
29a70 20 54 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65   The record-size
29a80 20 66 69 65 6c 64 20 69 73 20 61 20 32 20 62 79   field is a 2 by
29a90 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68  te varint and th
29aa0 65 20 72 65 63 6f 72 64 20 0a 20 20 20 20 20 20  e record .      
29ab0 20 20 20 20 2a 2a 20 66 69 74 73 20 65 6e 74 69      ** fits enti
29ac0 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e  rely on the main
29ad0 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a   b-tree page.  *
29ae0 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  /.          test
29af0 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c  case( pCell+nCel
29b00 6c 2b 32 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74  l+2==pPage->aDat
29b10 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20  aEnd );.        
29b20 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d    c = xRecordCom
29b30 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69  pare(nCell, (voi
29b40 64 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49  d*)&pCell[2], pI
29b50 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  dxKey);.        
29b60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
29b70 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20 66   /* The record f
29b80 6c 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f  lows over onto o
29b90 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66  ne or more overf
29ba0 6c 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a 20 20  low pages. In.  
29bb0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20          ** this 
29bc0 63 61 73 65 20 74 68 65 20 77 68 6f 6c 65 20 63  case the whole c
29bd0 65 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ell needs to be 
29be0 70 61 72 73 65 64 2c 20 61 20 62 75 66 66 65 72  parsed, a buffer
29bf0 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20   allocated.     
29c00 20 20 20 20 20 2a 2a 20 61 6e 64 20 61 63 63 65       ** and acce
29c10 73 73 50 61 79 6c 6f 61 64 28 29 20 75 73 65 64  ssPayload() used
29c20 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68 65   to retrieve the
29c30 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
29c40 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75  .          ** bu
29c50 66 66 65 72 20 62 65 66 6f 72 65 20 56 64 62 65  ffer before Vdbe
29c60 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
29c70 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 2a  can be called. *
29c80 2f 0a 20 20 20 20 20 20 20 20 20 20 76 6f 69 64  /.          void
29c90 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20   *pCellKey;.    
29ca0 20 20 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74        u8 * const
29cb0 20 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65   pCellBody = pCe
29cc0 6c 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c  ll - pPage->chil
29cd0 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20  dPtrSize;.      
29ce0 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
29cf0 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
29d00 6c 6c 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e 69  llBody, &pCur->i
29d10 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nfo);.          
29d20 6e 43 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43 75  nCell = (int)pCu
29d30 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20  r->info.nKey;.  
29d40 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79          pCellKey
29d50 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
29d60 28 20 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20  ( nCell );.     
29d70 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65       if( pCellKe
29d80 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  y==0 ){.        
29d90 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
29da0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
29db0 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
29dc0 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20  inish;.         
29dd0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43 75   }.          pCu
29de0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
29df0 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78  Page] = (u16)idx
29e00 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
29e10 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
29e20 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28  Cur, 0, nCell, (
29e30 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70  unsigned char*)p
29e40 43 65 6c 6c 4b 65 79 2c 20 32 29 3b 0a 20 20 20  CellKey, 2);.   
29e50 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
29e60 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
29e70 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b  ite3_free(pCellK
29e80 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ey);.           
29e90 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
29ea0 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ish;.          }
29eb0 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78  .          c = x
29ec0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43  RecordCompare(nC
29ed0 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70  ell, pCellKey, p
29ee0 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  IdxKey);.       
29ef0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
29f00 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20  pCellKey);.     
29f10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
29f20 65 72 74 28 20 0a 20 20 20 20 20 20 20 20 20 20  ert( .          
29f30 20 20 28 70 49 64 78 4b 65 79 2d 3e 65 72 72 43    (pIdxKey->errC
29f40 6f 64 65 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52  ode!=SQLITE_CORR
29f50 55 50 54 20 7c 7c 20 63 3d 3d 30 29 0a 20 20 20  UPT || c==0).   
29f60 20 20 20 20 20 20 26 26 20 28 70 49 64 78 4b 65        && (pIdxKe
29f70 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  y->errCode!=SQLI
29f80 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 70 43 75 72  TE_NOMEM || pCur
29f90 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 61  ->pBtree->db->ma
29fa0 6c 6c 6f 63 46 61 69 6c 65 64 29 0a 20 20 20 20  llocFailed).    
29fb0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
29fc0 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( c<0 ){.      
29fd0 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b      lwr = idx+1;
29fe0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
29ff0 66 28 20 63 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( c>0 ){.      
2a000 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b      upr = idx-1;
2a010 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2a020 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2a030 28 20 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ( c==0 );.      
2a040 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
2a050 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
2a060 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
2a070 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
2a080 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75  Cur->iPage] = (u
2a090 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20  16)idx;.        
2a0a0 20 20 69 66 28 20 70 49 64 78 4b 65 79 2d 3e 65    if( pIdxKey->e
2a0b0 72 72 43 6f 64 65 20 29 20 72 63 20 3d 20 53 51  rrCode ) rc = SQ
2a0c0 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20  LITE_CORRUPT;.  
2a0d0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
2a0e0 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
2a0f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
2a100 28 20 6c 77 72 3e 75 70 72 20 29 20 62 72 65 61  ( lwr>upr ) brea
2a110 6b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  k;.        asser
2a120 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b  t( lwr+upr>=0 );
2a130 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d 20 28  .        idx = (
2a140 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a  lwr+upr)>>1;  /*
2a150 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29   idx = (lwr+upr)
2a160 2f 32 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  /2 */.      }.  
2a170 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
2a180 6c 77 72 3d 3d 75 70 72 2b 31 20 7c 7c 20 28 70  lwr==upr+1 || (p
2a190 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20  Page->intKey && 
2a1a0 21 70 50 61 67 65 2d 3e 6c 65 61 66 29 20 29 3b  !pPage->leaf) );
2a1b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2a1c0 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
2a1d0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
2a1e0 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  f ){.      asser
2a1f0 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
2a200 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72  Cur->iPage]<pCur
2a210 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2a220 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  Page]->nCell );.
2a230 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64        pCur->aiId
2a240 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
2a250 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20   (u16)idx;.     
2a260 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20   *pRes = c;.    
2a270 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
2a280 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76  ;.      goto mov
2a290 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
2a2a0 7d 0a 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61  }.moveto_next_la
2a2b0 79 65 72 3a 0a 20 20 20 20 69 66 28 20 6c 77 72  yer:.    if( lwr
2a2c0 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
2a2d0 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d  {.      chldPg =
2a2e0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
2a2f0 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
2a300 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
2a310 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
2a320 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65  hldPg = get4byte
2a330 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
2a340 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20   lwr));.    }.  
2a350 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
2a360 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
2a370 36 29 6c 77 72 3b 0a 20 20 20 20 72 63 20 3d 20  6)lwr;.    rc = 
2a380 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
2a390 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69  , chldPg);.    i
2a3a0 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20  f( rc ) break;. 
2a3b0 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68   }.moveto_finish
2a3c0 3a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  :.  pCur->info.n
2a3d0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
2a3e0 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28  ->curFlags &= ~(
2a3f0 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42  BTCF_ValidNKey|B
2a400 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a  TCF_ValidOvfl);.
2a410 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2a420 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
2a430 55 45 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  UE if the cursor
2a440 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67   is not pointing
2a450 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20   at an entry of 
2a460 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
2a470 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65   TRUE will be re
2a480 74 75 72 6e 65 64 20 61 66 74 65 72 20 61 20 63  turned after a c
2a490 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74  all to sqlite3Bt
2a4a0 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a  reeNext() moves.
2a4b0 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73 74  ** past the last
2a4c0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
2a4d0 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74  ble or sqlite3Bt
2a4e0 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20  reePrev() moves 
2a4f0 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73  past.** the firs
2a500 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69  t entry.  TRUE i
2a510 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20  s also returned 
2a520 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
2a530 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
2a540 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28 42 74  lite3BtreeEof(Bt
2a550 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
2a560 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69   /* TODO: What i
2a570 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
2a580 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  in CURSOR_REQUIR
2a590 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61  ESEEK but all ta
2a5a0 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a  ble entries.  **
2a5b0 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74   have been delet
2a5c0 65 64 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c  ed? This API wil
2a5d0 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65  l need to change
2a5e0 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72   to return an er
2a5f0 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73  ror code.  ** as
2a600 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f   well as the boo
2a610 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75  lean result valu
2a620 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  e..  */.  return
2a630 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d   (CURSOR_VALID!=
2a640 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d  pCur->eState);.}
2a650 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ../*.** Advance 
2a660 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
2a670 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20  e next entry in 
2a680 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
2a690 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20  f.** successful 
2a6a0 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30  then set *pRes=0
2a6b0 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  .  If the cursor
2a6c0 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20  .** was already 
2a6d0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
2a6e0 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
2a6f0 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  e database befor
2a700 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  e.** this routin
2a710 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68  e was called, th
2a720 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a  en set *pRes=1..
2a730 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65  **.** The main e
2a740 6e 74 72 79 20 70 6f 69 6e 74 20 69 73 20 73 71  ntry point is sq
2a750 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29  lite3BtreeNext()
2a760 2e 20 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20  .  That routine 
2a770 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20  is optimized.** 
2a780 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63  for the common c
2a790 61 73 65 20 6f 66 20 6d 65 72 65 6c 79 20 69 6e  ase of merely in
2a7a0 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63  crementing the c
2a7b0 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75  ell counter BtCu
2a7c0 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f  rsor.aiIdx.** to
2a7d0 20 74 68 65 20 6e 65 78 74 20 63 65 6c 6c 20 6f   the next cell o
2a7e0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  n the current pa
2a7f0 67 65 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72  ge.  The (slower
2a800 29 20 62 74 72 65 65 4e 65 78 74 28 29 20 68 65  ) btreeNext() he
2a810 6c 70 65 72 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  lper.** routine 
2a820 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69  is called when i
2a830 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  t is necessary t
2a840 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66  o move to a diff
2a850 65 72 65 6e 74 20 70 61 67 65 20 6f 72 0a 2a 2a  erent page or.**
2a860 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
2a870 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  cursor..**.** Th
2a880 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
2a890 6f 6e 20 77 69 6c 6c 20 73 65 74 20 2a 70 52 65  on will set *pRe
2a8a0 73 20 74 6f 20 30 20 6f 72 20 31 2e 20 20 54 68  s to 0 or 1.  Th
2a8b0 65 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20  e initial *pRes 
2a8c0 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65  value.** will be
2a8d0 20 31 20 69 66 20 74 68 65 20 63 75 72 73 6f 72   1 if the cursor
2a8e0 20 62 65 69 6e 67 20 73 74 65 70 70 65 64 20 63   being stepped c
2a8f0 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e  orresponds to an
2a900 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 0a 2a   SQL index and.*
2a910 2a 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  * if this routin
2a920 65 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65  e could have bee
2a930 6e 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 61  n skipped if tha
2a940 74 20 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20  t SQL index had 
2a950 62 65 65 6e 0a 2a 2a 20 61 20 75 6e 69 71 75 65  been.** a unique
2a960 20 69 6e 64 65 78 2e 20 20 4f 74 68 65 72 77 69   index.  Otherwi
2a970 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  se the caller wi
2a980 6c 6c 20 68 61 76 65 20 73 65 74 20 2a 70 52 65  ll have set *pRe
2a990 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65  s to zero..** Ze
2a9a0 72 6f 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e  ro is the common
2a9b0 20 63 61 73 65 2e 20 54 68 65 20 62 74 72 65 65   case. The btree
2a9c0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2a9d0 69 73 20 66 72 65 65 20 74 6f 20 75 73 65 20 74  is free to use t
2a9e0 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 2a 70  he.** initial *p
2a9f0 52 65 73 20 76 61 6c 75 65 20 61 73 20 61 20 68  Res value as a h
2aa00 69 6e 74 20 74 6f 20 69 6d 70 72 6f 76 65 20 70  int to improve p
2aa10 65 72 66 6f 72 6d 61 6e 63 65 2c 20 62 75 74 20  erformance, but 
2aa20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 53  the current.** S
2aa30 51 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c  QLite btree impl
2aa40 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20  ementation does 
2aa50 6e 6f 74 2e 20 28 4e 6f 74 65 20 74 68 61 74 20  not. (Note that 
2aa60 74 68 65 20 63 6f 6d 64 62 32 20 62 74 72 65 65  the comdb2 btree
2aa70 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  .** implementati
2aa80 6f 6e 20 64 6f 65 73 20 75 73 65 20 74 68 69 73  on does use this
2aa90 20 68 69 6e 74 2c 20 68 6f 77 65 76 65 72 2e 29   hint, however.)
2aaa0 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
2aab0 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62  E_NOINLINE int b
2aac0 74 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f  treeNext(BtCurso
2aad0 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
2aae0 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  es){.  int rc;. 
2aaf0 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50   int idx;.  MemP
2ab00 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
2ab10 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
2ab20 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
2ab30 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2ab40 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20  >skipNext==0 || 
2ab50 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
2ab60 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
2ab70 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30  assert( *pRes==0
2ab80 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
2ab90 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2aba0 41 4c 49 44 20 29 7b 0a 20 20 20 20 61 73 73 65  ALID ){.    asse
2abb0 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  rt( (pCur->curFl
2abc0 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
2abd0 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20  Ovfl)==0 );.    
2abe0 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
2abf0 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
2ac00 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2ac10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2ac20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2ac30 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52  }.    if( CURSOR
2ac40 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
2ac50 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20  eState ){.      
2ac60 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
2ac70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2ac80 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  K;.    }.    if(
2ac90 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
2aca0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2acb0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2acc0 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
2acd0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2ace0 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a  SOR_SKIPNEXT );.
2acf0 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
2ad00 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
2ad10 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  D;.      if( pCu
2ad20 72 2d 3e 73 6b 69 70 4e 65 78 74 3e 30 20 29 7b  r->skipNext>0 ){
2ad30 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 73  .        pCur->s
2ad40 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  kipNext = 0;.   
2ad50 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2ad60 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
2ad70 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e       pCur->skipN
2ad80 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ext = 0;.    }. 
2ad90 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43   }..  pPage = pC
2ada0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2adb0 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64 78 20 3d  >iPage];.  idx =
2adc0 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70   ++pCur->aiIdx[p
2add0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61  Cur->iPage];.  a
2ade0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
2adf0 49 6e 69 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  Init );..  /* If
2ae00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2ae10 6c 65 20 69 73 20 63 6f 72 72 75 70 74 2c 20 69  le is corrupt, i
2ae20 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f  t is possible fo
2ae30 72 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 69  r the value of i
2ae40 64 78 20 0a 20 20 2a 2a 20 74 6f 20 62 65 20 69  dx .  ** to be i
2ae50 6e 76 61 6c 69 64 20 68 65 72 65 2e 20 54 68 69  nvalid here. Thi
2ae60 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72  s can only occur
2ae70 20 69 66 20 61 20 73 65 63 6f 6e 64 20 63 75 72   if a second cur
2ae80 73 6f 72 20 6d 6f 64 69 66 69 65 73 0a 20 20 2a  sor modifies.  *
2ae90 2a 20 74 68 65 20 70 61 67 65 20 77 68 69 6c 65  * the page while
2aea0 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20   cursor pCur is 
2aeb0 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72 65  holding a refere
2aec0 6e 63 65 20 74 6f 20 69 74 2e 20 57 68 69 63 68  nce to it. Which
2aed0 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20 68   can.  ** only h
2aee0 61 70 70 65 6e 20 69 66 20 74 68 65 20 64 61 74  appen if the dat
2aef0 61 62 61 73 65 20 69 73 20 63 6f 72 72 75 70 74  abase is corrupt
2af00 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 61   in such a way a
2af10 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 0a 20 20  s to link the.  
2af20 2a 2a 20 70 61 67 65 20 69 6e 74 6f 20 6d 6f 72  ** page into mor
2af30 65 20 74 68 61 6e 20 6f 6e 65 20 62 2d 74 72 65  e than one b-tre
2af40 65 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a  e structure. */.
2af50 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 3e    testcase( idx>
2af60 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
2af70 0a 20 20 69 66 28 20 69 64 78 3e 3d 70 50 61 67  .  if( idx>=pPag
2af80 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  e->nCell ){.    
2af90 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
2afa0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d   ){.      rc = m
2afb0 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
2afc0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
2afd0 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
2afe0 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20  drOffset+8]));. 
2aff0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
2b000 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72  turn rc;.      r
2b010 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74  eturn moveToLeft
2b020 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20  most(pCur);.    
2b030 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  }.    do{.      
2b040 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d  if( pCur->iPage=
2b050 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  =0 ){.        *p
2b060 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Res = 1;.       
2b070 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
2b080 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
2b090 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2b0a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2b0b0 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61  }.      moveToPa
2b0c0 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20  rent(pCur);.    
2b0d0 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
2b0e0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2b0f0 67 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  ge];.    }while(
2b100 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2b110 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 50 61 67 65  r->iPage]>=pPage
2b120 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69  ->nCell );.    i
2b130 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
2b140 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2b150 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
2b160 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  t(pCur, pRes);. 
2b170 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2b180 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2b190 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
2b1a0 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
2b1b0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2b1c0 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
2b1d0 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54      return moveT
2b1e0 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
2b1f0 0a 20 20 7d 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  .  }.}.int sqlit
2b200 65 33 42 74 72 65 65 4e 65 78 74 28 42 74 43 75  e3BtreeNext(BtCu
2b210 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
2b220 2a 70 52 65 73 29 7b 0a 20 20 4d 65 6d 50 61 67  *pRes){.  MemPag
2b230 65 20 2a 70 50 61 67 65 3b 0a 20 20 61 73 73 65  e *pPage;.  asse
2b240 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
2b250 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
2b260 61 73 73 65 72 74 28 20 70 52 65 73 21 3d 30 20  assert( pRes!=0 
2b270 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52  );.  assert( *pR
2b280 65 73 3d 3d 30 20 7c 7c 20 2a 70 52 65 73 3d 3d  es==0 || *pRes==
2b290 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
2b2a0 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30  Cur->skipNext==0
2b2b0 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
2b2c0 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
2b2d0 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
2b2e0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
2b2f0 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28  ->curFlags &= ~(
2b300 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42  BTCF_ValidNKey|B
2b310 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a  TCF_ValidOvfl);.
2b320 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 69    *pRes = 0;.  i
2b330 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  f( pCur->eState!
2b340 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 20  =CURSOR_VALID ) 
2b350 72 65 74 75 72 6e 20 62 74 72 65 65 4e 65 78 74  return btreeNext
2b360 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20  (pCur, pRes);.  
2b370 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
2b380 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2b390 5d 3b 0a 20 20 69 66 28 20 28 2b 2b 70 43 75 72  ];.  if( (++pCur
2b3a0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2b3b0 61 67 65 5d 29 3e 3d 70 50 61 67 65 2d 3e 6e 43  age])>=pPage->nC
2b3c0 65 6c 6c 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  ell ){.    pCur-
2b3d0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2b3e0 67 65 5d 2d 2d 3b 0a 20 20 20 20 72 65 74 75 72  ge]--;.    retur
2b3f0 6e 20 62 74 72 65 65 4e 65 78 74 28 70 43 75 72  n btreeNext(pCur
2b400 2c 20 70 52 65 73 29 3b 0a 20 20 7d 0a 20 20 69  , pRes);.  }.  i
2b410 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
2b420 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2b430 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
2b440 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65  .    return move
2b450 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
2b460 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ;.  }.}../*.** S
2b470 74 65 70 20 74 68 65 20 63 75 72 73 6f 72 20 74  tep the cursor t
2b480 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68  o the back to th
2b490 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79  e previous entry
2b4a0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2b4b0 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73  .  If.** success
2b4c0 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ful then set *pR
2b4d0 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75  es=0.  If the cu
2b4e0 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65  rsor.** was alre
2b4f0 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ady pointing to 
2b500 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
2b510 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
2b520 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72  before.** this r
2b530 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
2b540 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  d, then set *pRe
2b550 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  s=1..**.** The m
2b560 61 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74 20  ain entry point 
2b570 69 73 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  is sqlite3BtreeP
2b580 72 65 76 69 6f 75 73 28 29 2e 20 20 54 68 61 74  revious().  That
2b590 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 70 74 69   routine is opti
2b5a0 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65  mized.** for the
2b5b0 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20   common case of 
2b5c0 6d 65 72 65 6c 79 20 64 65 63 72 65 6d 65 6e 74  merely decrement
2b5d0 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 63 6f 75  ing the cell cou
2b5e0 6e 74 65 72 20 42 74 43 75 72 73 6f 72 2e 61 69  nter BtCursor.ai
2b5f0 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20 70 72  Idx.** to the pr
2b600 65 76 69 6f 75 73 20 63 65 6c 6c 20 6f 6e 20 74  evious cell on t
2b610 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e  he current page.
2b620 20 20 54 68 65 20 28 73 6c 6f 77 65 72 29 20 62    The (slower) b
2b630 74 72 65 65 50 72 65 76 69 6f 75 73 28 29 0a 2a  treePrevious().*
2b640 2a 20 68 65 6c 70 65 72 20 72 6f 75 74 69 6e 65  * helper routine
2b650 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
2b660 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  it is necessary 
2b670 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64 69 66  to move to a dif
2b680 66 65 72 65 6e 74 20 70 61 67 65 0a 2a 2a 20 6f  ferent page.** o
2b690 72 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  r to restore the
2b6a0 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54   cursor..**.** T
2b6b0 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
2b6c0 69 6f 6e 20 77 69 6c 6c 20 73 65 74 20 2a 70 52  ion will set *pR
2b6d0 65 73 20 74 6f 20 30 20 6f 72 20 31 2e 20 20 54  es to 0 or 1.  T
2b6e0 68 65 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73  he initial *pRes
2b6f0 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62   value.** will b
2b700 65 20 31 20 69 66 20 74 68 65 20 63 75 72 73 6f  e 1 if the curso
2b710 72 20 62 65 69 6e 67 20 73 74 65 70 70 65 64 20  r being stepped 
2b720 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61  corresponds to a
2b730 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 0a  n SQL index and.
2b740 2a 2a 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  ** if this routi
2b750 6e 65 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65  ne could have be
2b760 65 6e 20 73 6b 69 70 70 65 64 20 69 66 20 74 68  en skipped if th
2b770 61 74 20 53 51 4c 20 69 6e 64 65 78 20 68 61 64  at SQL index had
2b780 20 62 65 65 6e 0a 2a 2a 20 61 20 75 6e 69 71 75   been.** a uniqu
2b790 65 20 69 6e 64 65 78 2e 20 20 4f 74 68 65 72 77  e index.  Otherw
2b7a0 69 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20 77  ise the caller w
2b7b0 69 6c 6c 20 68 61 76 65 20 73 65 74 20 2a 70 52  ill have set *pR
2b7c0 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a  es to zero..** Z
2b7d0 65 72 6f 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f  ero is the commo
2b7e0 6e 20 63 61 73 65 2e 20 54 68 65 20 62 74 72 65  n case. The btre
2b7f0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
2b800 20 69 73 20 66 72 65 65 20 74 6f 20 75 73 65 20   is free to use 
2b810 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 2a  the.** initial *
2b820 70 52 65 73 20 76 61 6c 75 65 20 61 73 20 61 20  pRes value as a 
2b830 68 69 6e 74 20 74 6f 20 69 6d 70 72 6f 76 65 20  hint to improve 
2b840 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20 62 75 74  performance, but
2b850 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
2b860 53 51 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70  SQLite btree imp
2b870 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73  lementation does
2b880 20 6e 6f 74 2e 20 28 4e 6f 74 65 20 74 68 61 74   not. (Note that
2b890 20 74 68 65 20 63 6f 6d 64 62 32 20 62 74 72 65   the comdb2 btre
2b8a0 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  e.** implementat
2b8b0 69 6f 6e 20 64 6f 65 73 20 75 73 65 20 74 68 69  ion does use thi
2b8c0 73 20 68 69 6e 74 2c 20 68 6f 77 65 76 65 72 2e  s hint, however.
2b8d0 29 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49  ).*/.static SQLI
2b8e0 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20  TE_NOINLINE int 
2b8f0 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 42 74  btreePrevious(Bt
2b900 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
2b910 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
2b920 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  rc;.  MemPage *p
2b930 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
2b940 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
2b950 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
2b960 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a  ert( pRes!=0 );.
2b970 20 20 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d    assert( *pRes=
2b980 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2b990 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d  pCur->skipNext==
2b9a0 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  0 || pCur->eStat
2b9b0 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
2b9c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 43  );.  assert( (pC
2b9d0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 28  ur->curFlags & (
2b9e0 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46  BTCF_AtLast|BTCF
2b9f0 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f  _ValidOvfl|BTCF_
2ba00 56 61 6c 69 64 4e 4b 65 79 29 29 3d 3d 30 20 29  ValidNKey))==0 )
2ba10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2ba20 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
2ba30 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
2ba40 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
2ba50 4c 49 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  LID ){.    rc = 
2ba60 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
2ba70 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20  ition(pCur);.   
2ba80 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2ba90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
2baa0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
2bab0 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41   if( CURSOR_INVA
2bac0 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
2bad0 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73  e ){.      *pRes
2bae0 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75   = 1;.      retu
2baf0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2bb00 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72    }.    if( pCur
2bb10 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20  ->skipNext ){.  
2bb20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2bb30 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2bb40 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  _VALID || pCur->
2bb50 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53  eState==CURSOR_S
2bb60 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20 20 20 20  KIPNEXT );.     
2bb70 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
2bb80 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20  CURSOR_VALID;.  
2bb90 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b      if( pCur->sk
2bba0 69 70 4e 65 78 74 3c 30 20 29 7b 0a 20 20 20 20  ipNext<0 ){.    
2bbb0 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65      pCur->skipNe
2bbc0 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  xt = 0;.        
2bbd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2bbe0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2bbf0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
2bc00 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
2bc10 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
2bc20 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2bc30 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e];.  assert( pP
2bc40 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
2bc50 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
2bc60 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78  f ){.    int idx
2bc70 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70   = pCur->aiIdx[p
2bc80 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20  Cur->iPage];.   
2bc90 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
2bca0 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65  d(pCur, get4byte
2bcb0 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
2bcc0 20 69 64 78 29 29 29 3b 0a 20 20 20 20 69 66 28   idx)));.    if(
2bcd0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2bce0 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
2bcf0 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b  Rightmost(pCur);
2bd00 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68  .  }else{.    wh
2bd10 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ile( pCur->aiIdx
2bd20 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30  [pCur->iPage]==0
2bd30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43   ){.      if( pC
2bd40 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a  ur->iPage==0 ){.
2bd50 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53          pCur->eS
2bd60 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
2bd70 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 2a  VALID;.        *
2bd80 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  pRes = 1;.      
2bd90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2bda0 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
2bdb0 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70    moveToParent(p
2bdc0 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Cur);.    }.    
2bdd0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e  assert( pCur->in
2bde0 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20  fo.nSize==0 );. 
2bdf0 20 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72     assert( (pCur
2be00 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 28 42 54  ->curFlags & (BT
2be10 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43  CF_ValidNKey|BTC
2be20 46 5f 56 61 6c 69 64 4f 76 66 6c 29 29 3d 3d 30  F_ValidOvfl))==0
2be30 20 29 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e 61   );..    pCur->a
2be40 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2be50 5d 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65 20 3d  ]--;.    pPage =
2be60 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2be70 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  ur->iPage];.    
2be80 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
2be90 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61  y && !pPage->lea
2bea0 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
2beb0 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
2bec0 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73 29  ious(pCur, pRes)
2bed0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2bee0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2bef0 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  K;.    }.  }.  r
2bf00 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20  eturn rc;.}.int 
2bf10 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
2bf20 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ious(BtCursor *p
2bf30 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
2bf40 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2bf50 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
2bf60 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2bf70 52 65 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  Res!=0 );.  asse
2bf80 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 7c 7c 20  rt( *pRes==0 || 
2bf90 2a 70 52 65 73 3d 3d 31 20 29 3b 0a 20 20 61 73  *pRes==1 );.  as
2bfa0 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70  sert( pCur->skip
2bfb0 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Next==0 || pCur-
2bfc0 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
2bfd0 56 41 4c 49 44 20 29 3b 0a 20 20 2a 70 52 65 73  VALID );.  *pRes
2bfe0 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75   = 0;.  pCur->cu
2bff0 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
2c000 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c  _AtLast|BTCF_Val
2c010 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69  idOvfl|BTCF_Vali
2c020 64 4e 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e  dNKey);.  pCur->
2c030 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
2c040 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
2c050 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2c060 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61 69 49  .   || pCur->aiI
2c070 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d  dx[pCur->iPage]=
2c080 3d 30 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61  =0.   || pCur->a
2c090 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2c0a0 65 5d 2d 3e 6c 65 61 66 3d 3d 30 0a 20 20 29 7b  e]->leaf==0.  ){
2c0b0 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65  .    return btre
2c0c0 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20  ePrevious(pCur, 
2c0d0 70 52 65 73 29 3b 0a 20 20 7d 0a 20 20 70 43 75  pRes);.  }.  pCu
2c0e0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2c0f0 50 61 67 65 5d 2d 2d 3b 0a 20 20 72 65 74 75 72  Page]--;.  retur
2c100 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2c110 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
2c120 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20 74   new page from t
2c130 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2c140 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20  ..**.** The new 
2c150 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61  page is marked a
2c160 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f 74  s dirty.  (In ot
2c170 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69 74  her words, sqlit
2c180 65 33 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a  e3PagerWrite().*
2c190 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  * has already be
2c1a0 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65  en called on the
2c1b0 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68 65   new page.)  The
2c1c0 20 6e 65 77 20 70 61 67 65 20 68 61 73 20 61 6c   new page has al
2c1d0 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65 72  so.** been refer
2c1e0 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63 61  enced and the ca
2c1f0 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73  lling routine is
2c200 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
2c210 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69   calling.** sqli
2c220 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20  te3PagerUnref() 
2c230 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 20  on the new page 
2c240 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e  when it is done.
2c250 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
2c260 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
2c270 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f 74  success.  Any ot
2c280 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65  her return value
2c290 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e   indicates.** an
2c2a0 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65   error.  *ppPage
2c2b0 20 61 6e 64 20 2a 70 50 67 6e 6f 20 61 72 65 20   and *pPgno are 
2c2c0 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65  undefined in the
2c2d0 20 65 76 65 6e 74 20 6f 66 20 61 6e 20 65 72 72   event of an err
2c2e0 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e  or..** Do not in
2c2f0 76 6f 6b 65 20 73 71 6c 69 74 65 33 50 61 67 65  voke sqlite3Page
2c300 72 55 6e 72 65 66 28 29 20 6f 6e 20 2a 70 70 50  rUnref() on *ppP
2c310 61 67 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20  age if an error 
2c320 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
2c330 2a 2a 20 49 66 20 74 68 65 20 22 6e 65 61 72 62  ** If the "nearb
2c340 79 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  y" parameter is 
2c350 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61 6e 20 65  not 0, then an e
2c360 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f  ffort is made to
2c370 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70 61   .** locate a pa
2c380 67 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20  ge close to the 
2c390 70 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65 61  page number "nea
2c3a0 72 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e 20  rby".  This can 
2c3b0 62 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a  be used in an.**
2c3c0 20 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65 70   attempt to keep
2c3d0 20 72 65 6c 61 74 65 64 20 70 61 67 65 73 20 63   related pages c
2c3e0 6c 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74 68  lose to each oth
2c3f0 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  er in the databa
2c400 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63  se file,.** whic
2c410 68 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61  h in turn can ma
2c420 6b 65 20 64 61 74 61 62 61 73 65 20 61 63 63 65  ke database acce
2c430 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a  ss faster..**.**
2c440 20 49 66 20 74 68 65 20 65 4d 6f 64 65 20 70 61   If the eMode pa
2c450 72 61 6d 65 74 65 72 20 69 73 20 42 54 41 4c 4c  rameter is BTALL
2c460 4f 43 5f 45 58 41 43 54 20 61 6e 64 20 74 68 65  OC_EXACT and the
2c470 20 6e 65 61 72 62 79 20 70 61 67 65 20 65 78 69   nearby page exi
2c480 73 74 73 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20  sts.** anywhere 
2c490 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
2c4a0 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67 75 61  , then it is gua
2c4b0 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 72 65  ranteed to be re
2c4c0 74 75 72 6e 65 64 2e 20 20 49 66 0a 2a 2a 20 65  turned.  If.** e
2c4d0 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f  Mode is BTALLOC_
2c4e0 4c 54 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  LT then the page
2c4f0 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62   returned will b
2c500 65 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  e less than or e
2c510 71 75 61 6c 0a 2a 2a 20 74 6f 20 6e 65 61 72 62  qual.** to nearb
2c520 79 20 69 66 20 61 6e 79 20 73 75 63 68 20 70 61  y if any such pa
2c530 67 65 20 65 78 69 73 74 73 2e 20 20 49 66 20 65  ge exists.  If e
2c540 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f  Mode is BTALLOC_
2c550 41 4e 59 20 74 68 65 6e 20 74 68 65 72 65 0a 2a  ANY then there.*
2c560 2a 20 61 72 65 20 6e 6f 20 72 65 73 74 72 69 63  * are no restric
2c570 74 69 6f 6e 73 20 6f 6e 20 77 68 69 63 68 20 70  tions on which p
2c580 61 67 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  age is returned.
2c590 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
2c5a0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
2c5b0 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
2c5c0 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  t,         /* Th
2c5d0 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d  e btree */.  Mem
2c5e0 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
2c5f0 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 70 6f 69      /* Store poi
2c600 6e 74 65 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f  nter to the allo
2c610 63 61 74 65 64 20 70 61 67 65 20 68 65 72 65 20  cated page here 
2c620 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f  */.  Pgno *pPgno
2c630 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ,           /* S
2c640 74 6f 72 65 20 74 68 65 20 70 61 67 65 20 6e 75  tore the page nu
2c650 6d 62 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 50  mber here */.  P
2c660 67 6e 6f 20 6e 65 61 72 62 79 2c 20 20 20 20 20  gno nearby,     
2c670 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20        /* Search 
2c680 66 6f 72 20 61 20 70 61 67 65 20 6e 65 61 72 20  for a page near 
2c690 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 75 38  this one */.  u8
2c6a0 20 65 4d 6f 64 65 20 20 20 20 20 20 20 20 20 20   eMode          
2c6b0 20 20 20 20 20 2f 2a 20 42 54 41 4c 4c 4f 43 5f       /* BTALLOC_
2c6c0 45 58 41 43 54 2c 20 42 54 41 4c 4c 4f 43 5f 4c  EXACT, BTALLOC_L
2c6d0 54 2c 20 6f 72 20 42 54 41 4c 4c 4f 43 5f 41 4e  T, or BTALLOC_AN
2c6e0 59 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67  Y */.){.  MemPag
2c6f0 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74  e *pPage1;.  int
2c700 20 72 63 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20   rc;.  u32 n;   
2c710 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
2c720 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
2c730 6c 69 73 74 20 2a 2f 0a 20 20 75 33 32 20 6b 3b  list */.  u32 k;
2c740 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2c750 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 65 20  f leaves on the 
2c760 74 72 75 6e 6b 20 6f 66 20 74 68 65 20 66 72 65  trunk of the fre
2c770 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61  elist */.  MemPa
2c780 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a  ge *pTrunk = 0;.
2c790 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 76    MemPage *pPrev
2c7a0 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e  Trunk = 0;.  Pgn
2c7b0 6f 20 6d 78 50 61 67 65 3b 20 20 20 20 20 2f 2a  o mxPage;     /*
2c7c0 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74   Total size of t
2c7d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2c7e0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
2c7f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2c800 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
2c810 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65  .  assert( eMode
2c820 3d 3d 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 7c 7c  ==BTALLOC_ANY ||
2c830 20 28 6e 65 61 72 62 79 3e 30 20 26 26 20 49 66   (nearby>0 && If
2c840 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 61  NotOmitAV(pBt->a
2c850 75 74 6f 56 61 63 75 75 6d 29 29 20 29 3b 0a 20  utoVacuum)) );. 
2c860 20 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70   pPage1 = pBt->p
2c870 50 61 67 65 31 3b 0a 20 20 6d 78 50 61 67 65 20  Page1;.  mxPage 
2c880 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  = btreePagecount
2c890 28 70 42 74 29 3b 0a 20 20 2f 2a 20 45 56 49 44  (pBt);.  /* EVID
2c8a0 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 35 31 31 39  ENCE-OF: R-05119
2c8b0 2d 30 32 36 33 37 20 54 68 65 20 34 2d 62 79 74  -02637 The 4-byt
2c8c0 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
2c8d0 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 33  eger at offset 3
2c8e0 36 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 73 74  6.  ** stores st
2c8f0 6f 72 65 73 20 74 68 65 20 74 6f 74 61 6c 20 6e  ores the total n
2c900 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f  umber of pages o
2c910 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  n the freelist. 
2c920 2a 2f 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74  */.  n = get4byt
2c930 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
2c940 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74 63 61 73  [36]);.  testcas
2c950 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20 29  e( n==mxPage-1 )
2c960 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61 67  ;.  if( n>=mxPag
2c970 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
2c980 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2c990 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  KPT;.  }.  if( n
2c9a0 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  >0 ){.    /* The
2c9b0 72 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20  re are pages on 
2c9c0 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52  the freelist.  R
2c9d0 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73  euse one of thos
2c9e0 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20  e pages. */.    
2c9f0 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20  Pgno iTrunk;.   
2ca00 20 75 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d   u8 searchList =
2ca10 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72   0; /* If the fr
2ca20 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20  ee-list must be 
2ca30 73 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65  searched for 'ne
2ca40 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a 20 20  arby' */.    .  
2ca50 20 20 2f 2a 20 49 66 20 65 4d 6f 64 65 3d 3d 42    /* If eMode==B
2ca60 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64  TALLOC_EXACT and
2ca70 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20   a query of the 
2ca80 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20  pointer-map.    
2ca90 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74 68  ** shows that th
2caa0 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20  e page 'nearby' 
2cab0 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20  is somewhere on 
2cac0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74  the free-list, t
2cad0 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 65  hen.    ** the e
2cae0 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20  ntire-list will 
2caf0 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  be searched for 
2cb00 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20 2a  that page..    *
2cb10 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
2cb20 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
2cb30 0a 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d  .    if( eMode==
2cb40 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 29 7b  BTALLOC_EXACT ){
2cb50 0a 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62  .      if( nearb
2cb60 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20  y<=mxPage ){.   
2cb70 20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20       u8 eType;. 
2cb80 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
2cb90 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20  earby>0 );.     
2cba0 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
2cbb0 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20  autoVacuum );.  
2cbc0 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
2cbd0 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79  pGet(pBt, nearby
2cbe0 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20  , &eType, 0);.  
2cbf0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
2cc00 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2cc10 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
2cc20 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a  MAP_FREEPAGE ){.
2cc30 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68            search
2cc40 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  List = 1;.      
2cc50 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2cc60 7d 65 6c 73 65 20 69 66 28 20 65 4d 6f 64 65 3d  }else if( eMode=
2cc70 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20  =BTALLOC_LE ){. 
2cc80 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
2cc90 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = 1;.    }.#endi
2cca0 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d  f..    /* Decrem
2ccb0 65 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69 73  ent the free-lis
2ccc0 74 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53 65  t count by 1. Se
2ccd0 74 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65 20  t iTrunk to the 
2cce0 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20 20  index of the.   
2ccf0 20 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d 6c   ** first free-l
2cd00 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20  ist trunk page. 
2cd10 69 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69 6e  iPrevTrunk is in
2cd20 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a  itially 1..    *
2cd30 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
2cd40 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
2cd50 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
2cd60 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
2cd70 72 6e 20 72 63 3b 0a 20 20 20 20 70 75 74 34 62  rn rc;.    put4b
2cd80 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
2cd90 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20  ta[36], n-1);.. 
2cda0 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77     /* The code w
2cdb0 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20  ithin this loop 
2cdc0 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65  is run only once
2cdd0 20 69 66 20 74 68 65 20 27 73 65 61 72 63 68 4c   if the 'searchL
2cde0 69 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20  ist' variable.  
2cdf0 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65    ** is not true
2ce00 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
2ce10 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61  runs once for ea
2ce20 63 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e  ch trunk-page on
2ce30 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65   the.    ** free
2ce40 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20  -list until the 
2ce50 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73  page 'nearby' is
2ce60 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65 3d   located (eMode=
2ce70 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 0a  =BTALLOC_EXACT).
2ce80 20 20 20 20 2a 2a 20 6f 72 20 75 6e 74 69 6c 20      ** or until 
2ce90 61 20 70 61 67 65 20 6c 65 73 73 20 74 68 61 6e  a page less than
2cea0 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63   'nearby' is loc
2ceb0 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41  ated (eMode==BTA
2cec0 4c 4c 4f 43 5f 4c 54 29 0a 20 20 20 20 2a 2f 0a  LLOC_LT).    */.
2ced0 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70      do {.      p
2cee0 50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75  PrevTrunk = pTru
2cef0 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  nk;.      if( pP
2cf00 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  revTrunk ){.    
2cf10 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
2cf20 4f 46 3a 20 52 2d 30 31 35 30 36 2d 31 31 30 35  OF: R-01506-1105
2cf30 33 20 54 68 65 20 66 69 72 73 74 20 69 6e 74 65  3 The first inte
2cf40 67 65 72 20 6f 6e 20 61 20 66 72 65 65 6c 69 73  ger on a freelis
2cf50 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20  t trunk page.   
2cf60 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 70       ** is the p
2cf70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
2cf80 65 20 6e 65 78 74 20 66 72 65 65 6c 69 73 74 20  e next freelist 
2cf90 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
2cfa0 65 20 6c 69 73 74 20 6f 72 0a 20 20 20 20 20 20  e list or.      
2cfb0 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20 74 68 69    ** zero if thi
2cfc0 73 20 69 73 20 74 68 65 20 6c 61 73 74 20 66 72  s is the last fr
2cfd0 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
2cfe0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 54  e. */.        iT
2cff0 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
2d000 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61  &pPrevTrunk->aDa
2d010 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65  ta[0]);.      }e
2d020 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
2d030 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
2d040 39 38 34 31 2d 31 33 37 39 38 20 54 68 65 20 34  9841-13798 The 4
2d050 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e  -byte big-endian
2d060 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73   integer at offs
2d070 65 74 20 33 32 0a 20 20 20 20 20 20 20 20 2a 2a  et 32.        **
2d080 20 73 74 6f 72 65 73 20 74 68 65 20 70 61 67 65   stores the page
2d090 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66   number of the f
2d0a0 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
2d0b0 20 66 72 65 65 6c 69 73 74 2c 20 6f 72 20 7a 65   freelist, or ze
2d0c0 72 6f 20 69 66 0a 20 20 20 20 20 20 20 20 2a 2a  ro if.        **
2d0d0 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73   the freelist is
2d0e0 20 65 6d 70 74 79 2e 20 2a 2f 0a 20 20 20 20 20   empty. */.     
2d0f0 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
2d100 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
2d110 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20  ata[32]);.      
2d120 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  }.      testcase
2d130 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65  ( iTrunk==mxPage
2d140 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54   );.      if( iT
2d150 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 0a 20  runk>mxPage ){. 
2d160 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2d170 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2d180 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2d190 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
2d1a0 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72  GetPage(pBt, iTr
2d1b0 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29  unk, &pTrunk, 0)
2d1c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2d1d0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
2d1e0 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
2d1f0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2d200 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
2d210 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
2d220 72 74 28 20 70 54 72 75 6e 6b 21 3d 30 20 29 3b  rt( pTrunk!=0 );
2d230 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2d240 54 72 75 6e 6b 2d 3e 61 44 61 74 61 21 3d 30 20  Trunk->aData!=0 
2d250 29 3b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44  );.      /* EVID
2d260 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 33 35 32 33  ENCE-OF: R-13523
2d270 2d 30 34 33 39 34 20 54 68 65 20 73 65 63 6f 6e  -04394 The secon
2d280 64 20 69 6e 74 65 67 65 72 20 6f 6e 20 61 20 66  d integer on a f
2d290 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  reelist trunk pa
2d2a0 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74  ge.      ** is t
2d2b0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61  he number of lea
2d2c0 66 20 70 61 67 65 20 70 6f 69 6e 74 65 72 73 20  f page pointers 
2d2d0 74 6f 20 66 6f 6c 6c 6f 77 2e 20 2a 2f 0a 20 20  to follow. */.  
2d2e0 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74 65      k = get4byte
2d2f0 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
2d300 34 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6b  4]);.      if( k
2d310 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68 4c 69  ==0 && !searchLi
2d320 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  st ){.        /*
2d330 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73 20 6e   The trunk has n
2d340 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74 68 65  o leaves and the
2d350 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62 65 69   list is not bei
2d360 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a 20 20  ng searched. .  
2d370 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78 74 72        ** So extr
2d380 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61  act the trunk pa
2d390 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20 75 73  ge itself and us
2d3a0 65 20 69 74 20 61 73 20 74 68 65 20 6e 65 77 6c  e it as the newl
2d3b0 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  y .        ** al
2d3c0 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a  located page */.
2d3d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2d3e0 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b  pPrevTrunk==0 );
2d3f0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
2d400 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2d410 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
2d420 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2d430 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
2d440 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
2d450 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
2d460 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d          *pPgno =
2d470 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   iTrunk;.       
2d480 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d   memcpy(&pPage1-
2d490 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72  >aData[32], &pTr
2d4a0 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
2d4b0 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61  );.        *ppPa
2d4c0 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  ge = pTrunk;.   
2d4d0 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b       pTrunk = 0;
2d4e0 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28  .        TRACE((
2d4f0 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72  "ALLOCATE: %d tr
2d500 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61  unk - %d free pa
2d510 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50  ges left\n", *pP
2d520 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20  gno, n-1));.    
2d530 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 28 75    }else if( k>(u
2d540 33 32 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  32)(pBt->usableS
2d550 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a 20 20  ize/4 - 2) ){.  
2d560 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
2d570 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72 61  f k is out of ra
2d580 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65 20 63  nge.  Database c
2d590 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  orruption */.   
2d5a0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2d5b0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2d5c0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
2d5d0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23  allocate_page;.#
2d5e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2d5f0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
2d600 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65      }else if( se
2d610 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20  archList .      
2d620 20 20 20 20 20 20 26 26 20 28 6e 65 61 72 62 79        && (nearby
2d630 3d 3d 69 54 72 75 6e 6b 20 7c 7c 20 28 69 54 72  ==iTrunk || (iTr
2d640 75 6e 6b 3c 6e 65 61 72 62 79 20 26 26 20 65 4d  unk<nearby && eM
2d650 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29  ode==BTALLOC_LE)
2d660 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  ) .      ){.    
2d670 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20      /* The list 
2d680 69 73 20 62 65 69 6e 67 20 73 65 61 72 63 68 65  is being searche
2d690 64 20 61 6e 64 20 74 68 69 73 20 74 72 75 6e 6b  d and this trunk
2d6a0 20 70 61 67 65 20 69 73 20 74 68 65 20 70 61 67   page is the pag
2d6b0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  e.        ** to 
2d6c0 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61 72 64  allocate, regard
2d6d0 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
2d6e0 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e 0a 20  it has leaves.. 
2d6f0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2d700 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e    *pPgno = iTrun
2d710 6b 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61  k;.        *ppPa
2d720 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  ge = pTrunk;.   
2d730 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
2d740 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 0;.        rc 
2d750 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2d760 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
2d770 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
2d780 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
2d790 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
2d7a0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
2d7b0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2d7c0 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
2d7d0 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e    if( !pPrevTrun
2d7e0 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  k ){.           
2d7f0 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d   memcpy(&pPage1-
2d800 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72  >aData[32], &pTr
2d810 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
2d820 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
2d830 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2d840 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2d850 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75 6e  rWrite(pPrevTrun
2d860 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
2d870 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
2d880 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2d890 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
2d8a0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
2d8b0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ge;.            
2d8c0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  }.            me
2d8d0 6d 63 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b  mcpy(&pPrevTrunk
2d8e0 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72  ->aData[0], &pTr
2d8f0 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
2d900 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
2d910 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2d920 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
2d930 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71  runk page is req
2d940 75 69 72 65 64 20 62 79 20 74 68 65 20 63 61 6c  uired by the cal
2d950 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61  ler but it conta
2d960 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ins .          *
2d970 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72  * pointers to fr
2d980 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20  ee-list leaves. 
2d990 54 68 65 20 66 69 72 73 74 20 6c 65 61 66 20 62  The first leaf b
2d9a0 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20  ecomes a trunk. 
2d9b0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65           ** page
2d9c0 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
2d9d0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
2d9e0 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
2d9f0 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  NewTrunk;.      
2da00 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75      Pgno iNewTru
2da10 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
2da20 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29  Trunk->aData[8])
2da30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2da40 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65  iNewTrunk>mxPage
2da50 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20   ){ .           
2da60 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
2da70 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
2da80 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
2da90 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
2daa0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2dab0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
2dac0 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65  NewTrunk==mxPage
2dad0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   );.          rc
2dae0 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
2daf0 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20  pBt, iNewTrunk, 
2db00 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a  &pNewTrunk, 0);.
2db10 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
2db20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2db30 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
2db40 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
2db50 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
2db60 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
2db70 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2db80 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61  pNewTrunk->pDbPa
2db90 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ge);.          i
2dba0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2dbb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2dbc0 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
2dbd0 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
2dbe0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
2dbf0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
2dc00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2dc10 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72    memcpy(&pNewTr
2dc20 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26  unk->aData[0], &
2dc30 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
2dc40 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
2dc50 70 75 74 34 62 79 74 65 28 26 70 4e 65 77 54 72  put4byte(&pNewTr
2dc60 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b  unk->aData[4], k
2dc70 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  -1);.          m
2dc80 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b  emcpy(&pNewTrunk
2dc90 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72  ->aData[8], &pTr
2dca0 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20  unk->aData[12], 
2dcb0 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20  (k-1)*4);.      
2dcc0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2dcd0 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  pNewTrunk);.    
2dce0 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76        if( !pPrev
2dcf0 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
2dd00 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
2dd10 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2dd20 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70 44 62  able(pPage1->pDb
2dd30 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20  Page) );.       
2dd40 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
2dd50 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
2dd60 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  , iNewTrunk);.  
2dd70 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2dd80 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2dd90 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2dda0 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44  e(pPrevTrunk->pD
2ddb0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
2ddc0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
2ddd0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
2dde0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
2ddf0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ge;.            
2de00 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  }.            pu
2de10 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75  t4byte(&pPrevTru
2de20 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e  nk->aData[0], iN
2de30 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
2de40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2de50 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
2de60 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43   0;.        TRAC
2de70 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
2de80 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65   trunk - %d free
2de90 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20   pages left\n", 
2dea0 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23  *pPgno, n-1));.#
2deb0 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73  endif.      }els
2dec0 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20  e if( k>0 ){.   
2ded0 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20       /* Extract 
2dee0 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20  a leaf from the 
2def0 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20  trunk */.       
2df00 20 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20   u32 closest;.  
2df10 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65        Pgno iPage
2df20 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e  ;.        unsign
2df30 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d  ed char *aData =
2df40 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a   pTrunk->aData;.
2df50 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 61 72          if( near
2df60 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  by>0 ){.        
2df70 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20 20 20    u32 i;.       
2df80 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a     closest = 0;.
2df90 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 4d            if( eM
2dfa0 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20  ode==BTALLOC_LE 
2dfb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ){.            f
2dfc0 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b  or(i=0; i<k; i++
2dfd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2dfe0 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74   iPage = get4byt
2dff0 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29  e(&aData[8+i*4])
2e000 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2e010 69 66 28 20 69 50 61 67 65 3c 3d 6e 65 61 72 62  if( iPage<=nearb
2e020 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  y ){.           
2e030 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69       closest = i
2e040 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2e050 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2e060 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e070 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2e080 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2e090 20 20 20 20 69 6e 74 20 64 69 73 74 3b 0a 20 20      int dist;.  
2e0a0 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d            dist =
2e0b0 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32   sqlite3AbsInt32
2e0c0 28 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61  (get4byte(&aData
2e0d0 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a  [8]) - nearby);.
2e0e0 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
2e0f0 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a  i=1; i<k; i++){.
2e100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
2e110 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 41 62  t d2 = sqlite3Ab
2e120 73 49 6e 74 33 32 28 67 65 74 34 62 79 74 65 28  sInt32(get4byte(
2e130 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d  &aData[8+i*4]) -
2e140 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20   nearby);.      
2e150 20 20 20 20 20 20 20 20 69 66 28 20 64 32 3c 64          if( d2<d
2e160 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ist ){.         
2e170 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
2e180 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   i;.            
2e190 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20      dist = d2;. 
2e1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
2e1b0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2e1c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e1d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2e1e0 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20    closest = 0;. 
2e1f0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
2e200 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79    iPage = get4by
2e210 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73  te(&aData[8+clos
2e220 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20  est*4]);.       
2e230 20 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65   testcase( iPage
2e240 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20  ==mxPage );.    
2e250 20 20 20 20 69 66 28 20 69 50 61 67 65 3e 6d 78      if( iPage>mx
2e260 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
2e270 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
2e280 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2e290 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2e2a0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
2e2b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2e2c0 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65 3d  testcase( iPage=
2e2d0 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20  =mxPage );.     
2e2e0 20 20 20 69 66 28 20 21 73 65 61 72 63 68 4c 69     if( !searchLi
2e2f0 73 74 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  st .         || 
2e300 28 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20 7c  (iPage==nearby |
2e310 7c 20 28 69 50 61 67 65 3c 6e 65 61 72 62 79 20  | (iPage<nearby 
2e320 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  && eMode==BTALLO
2e330 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20 20 20  C_LE)) .        
2e340 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
2e350 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20   noContent;.    
2e360 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69        *pPgno = i
2e370 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Page;.          
2e380 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
2e390 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20 25 64  : %d was leaf %d
2e3a0 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20   of %d on trunk 
2e3b0 25 64 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  %d".            
2e3c0 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65 20       ": %d more 
2e3d0 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20  free pages\n",. 
2e3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e3f0 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b  *pPgno, closest+
2e400 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67  1, k, pTrunk->pg
2e410 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20  no, n-1));.     
2e420 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2e430 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
2e440 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
2e450 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
2e460 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
2e470 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
2e480 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b     if( closest<k
2e490 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -1 ){.          
2e4a0 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b    memcpy(&aData[
2e4b0 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61  8+closest*4], &a
2e4c0 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b  Data[4+k*4], 4);
2e4d0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2e4e0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
2e4f0 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b  &aData[4], k-1);
2e500 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e  .          noCon
2e510 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47 65 74  tent = !btreeGet
2e520 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20  HasContent(pBt, 
2e530 2a 70 50 67 6e 6f 29 3f 20 50 41 47 45 52 5f 47  *pPgno)? PAGER_G
2e540 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a 20 30  ET_NOCONTENT : 0
2e550 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
2e560 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
2e570 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67  t, *pPgno, ppPag
2e580 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20  e, noContent);. 
2e590 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
2e5a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2e5b0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
2e5c0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2e5d0 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50  ((*ppPage)->pDbP
2e5e0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
2e5f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2e600 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2e610 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2e620 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  (*ppPage);.     
2e630 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e640 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
2e650 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20  earchList = 0;. 
2e660 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2e670 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
2e680 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a  ge(pPrevTrunk);.
2e690 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b        pPrevTrunk
2e6a0 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65   = 0;.    }while
2e6b0 28 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b 0a  ( searchList );.
2e6c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
2e6d0 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61 67  There are no pag
2e6e0 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
2e6f0 73 74 2c 20 73 6f 20 61 70 70 65 6e 64 20 61 20  st, so append a 
2e700 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65 0a  new page to the.
2e710 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
2e720 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  image..    **.  
2e730 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e    ** Normally, n
2e740 65 77 20 70 61 67 65 73 20 61 6c 6c 6f 63 61 74  ew pages allocat
2e750 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63 6b  ed by this block
2e760 20 63 61 6e 20 62 65 20 72 65 71 75 65 73 74 65   can be requeste
2e770 64 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a  d from the.    *
2e780 2a 20 70 61 67 65 72 20 6c 61 79 65 72 20 77 69  * pager layer wi
2e790 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65  th the 'no-conte
2e7a0 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20 54 68  nt' flag set. Th
2e7b0 69 73 20 70 72 65 76 65 6e 74 73 20 74 68 65 20  is prevents the 
2e7c0 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 66 72 6f  pager.    ** fro
2e7d0 6d 20 74 72 79 69 6e 67 20 74 6f 20 72 65 61 64  m trying to read
2e7e0 20 74 68 65 20 70 61 67 65 73 20 63 6f 6e 74 65   the pages conte
2e7f0 6e 74 20 66 72 6f 6d 20 64 69 73 6b 2e 20 48 6f  nt from disk. Ho
2e800 77 65 76 65 72 2c 20 69 66 20 74 68 65 0a 20 20  wever, if the.  
2e810 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 74 72 61    ** current tra
2e820 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72  nsaction has alr
2e830 65 61 64 79 20 72 75 6e 20 6f 6e 65 20 6f 72 20  eady run one or 
2e840 6d 6f 72 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c  more incremental
2e850 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a 2a 20 73  -vacuum.    ** s
2e860 74 65 70 73 2c 20 74 68 65 6e 20 74 68 65 20 70  teps, then the p
2e870 61 67 65 20 77 65 20 61 72 65 20 61 62 6f 75 74  age we are about
2e880 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 61 79   to allocate may
2e890 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74 65 6e 74   contain content
2e8a0 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20  .    ** that is 
2e8b0 72 65 71 75 69 72 65 64 20 69 6e 20 74 68 65 20  required in the 
2e8c0 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62  event of a rollb
2e8d0 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ack. In this cas
2e8e0 65 2c 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74  e, do.    ** not
2e8f0 20 73 65 74 20 74 68 65 20 6e 6f 2d 63 6f 6e 74   set the no-cont
2e900 65 6e 74 20 66 6c 61 67 2e 20 54 68 69 73 20 63  ent flag. This c
2e910 61 75 73 65 73 20 74 68 65 20 70 61 67 65 72 20  auses the pager 
2e920 74 6f 20 6c 6f 61 64 20 61 6e 64 20 6a 6f 75 72  to load and jour
2e930 6e 61 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 63  nal.    ** the c
2e940 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e 74  urrent page cont
2e950 65 6e 74 20 62 65 66 6f 72 65 20 6f 76 65 72 77  ent before overw
2e960 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a  riting it..    *
2e970 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68  *.    ** Note th
2e980 61 74 20 74 68 65 20 70 61 67 65 72 20 77 69 6c  at the pager wil
2e990 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 61  l not actually a
2e9a0 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20 6f  ttempt to load o
2e9b0 72 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a  r journal .    *
2e9c0 2a 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e  * content for an
2e9d0 79 20 70 61 67 65 20 74 68 61 74 20 72 65 61 6c  y page that real
2e9e0 6c 79 20 64 6f 65 73 20 6c 69 65 20 70 61 73 74  ly does lie past
2e9f0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
2ea00 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
2ea10 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 53 6f  file on disk. So
2ea20 20 74 68 65 20 65 66 66 65 63 74 73 20 6f 66 20   the effects of 
2ea30 64 69 73 61 62 6c 69 6e 67 20 74 68 65 20 6e 6f  disabling the no
2ea40 2d 63 6f 6e 74 65 6e 74 20 6f 70 74 69 6d 69 7a  -content optimiz
2ea50 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 65 72  ation.    ** her
2ea60 65 20 61 72 65 20 63 6f 6e 66 69 6e 65 64 20 74  e are confined t
2ea70 6f 20 74 68 6f 73 65 20 70 61 67 65 73 20 74 68  o those pages th
2ea80 61 74 20 6c 69 65 20 62 65 74 77 65 65 6e 20 74  at lie between t
2ea90 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20  he end of the.  
2eaa0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d    ** database im
2eab0 61 67 65 20 61 6e 64 20 74 68 65 20 65 6e 64 20  age and the end 
2eac0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2ead0 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
2eae0 20 69 6e 74 20 62 4e 6f 43 6f 6e 74 65 6e 74 20   int bNoContent 
2eaf0 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f 6d 69 74 41  = (0==IfNotOmitA
2eb00 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61  V(pBt->bDoTrunca
2eb10 74 65 29 29 3f 20 50 41 47 45 52 5f 47 45 54 5f  te))? PAGER_GET_
2eb20 4e 4f 43 4f 4e 54 45 4e 54 3a 30 3b 0a 0a 20 20  NOCONTENT:0;..  
2eb30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2eb40 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50  gerWrite(pBt->pP
2eb50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
2eb60 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
2eb70 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 42 74 2d  urn rc;.    pBt-
2eb80 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 69 66  >nPage++;.    if
2eb90 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45  ( pBt->nPage==PE
2eba0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
2ebb0 70 42 74 29 20 29 20 70 42 74 2d 3e 6e 50 61 67  pBt) ) pBt->nPag
2ebc0 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  e++;..#ifndef SQ
2ebd0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
2ebe0 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74  CUUM.    if( pBt
2ebf0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20  ->autoVacuum && 
2ec00 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
2ec10 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 20 29  t, pBt->nPage) )
2ec20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a 70  {.      /* If *p
2ec30 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20 61  Pgno refers to a
2ec40 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
2ec50 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20  e, allocate two 
2ec60 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20 20 20  new pages.      
2ec70 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ** at the end of
2ec80 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65 61   the file instea
2ec90 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66 69  d of one. The fi
2eca0 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70 61  rst allocated pa
2ecb0 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63 6f  ge.      ** beco
2ecc0 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74 65  mes a new pointe
2ecd0 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65 20  r-map page, the 
2ece0 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20 62  second is used b
2ecf0 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20  y the caller..  
2ed00 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d      */.      Mem
2ed10 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20  Page *pPg = 0;. 
2ed20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
2ed30 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65  OCATE: %d from e
2ed40 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e  nd of file (poin
2ed50 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22  ter-map page)\n"
2ed60 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 29 3b 0a  , pBt->nPage));.
2ed70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
2ed80 74 2d 3e 6e 50 61 67 65 21 3d 50 45 4e 44 49 4e  t->nPage!=PENDIN
2ed90 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
2eda0 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 62   );.      rc = b
2edb0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
2edc0 20 70 42 74 2d 3e 6e 50 61 67 65 2c 20 26 70 50   pBt->nPage, &pP
2edd0 67 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a  g, bNoContent);.
2ede0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2edf0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2ee00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2ee10 61 67 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70  agerWrite(pPg->p
2ee20 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
2ee30 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 67   releasePage(pPg
2ee40 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2ee50 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2ee60 20 72 63 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e   rc;.      pBt->
2ee70 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69  nPage++;.      i
2ee80 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50  f( pBt->nPage==P
2ee90 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
2eea0 28 70 42 74 29 20 29 7b 20 70 42 74 2d 3e 6e 50  (pBt) ){ pBt->nP
2eeb0 61 67 65 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23  age++; }.    }.#
2eec0 65 6e 64 69 66 0a 20 20 20 20 70 75 74 34 62 79  endif.    put4by
2eed0 74 65 28 32 38 20 2b 20 28 75 38 2a 29 70 42 74  te(28 + (u8*)pBt
2eee0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c  ->pPage1->aData,
2eef0 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20   pBt->nPage);.  
2ef00 20 20 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e    *pPgno = pBt->
2ef10 6e 50 61 67 65 3b 0a 0a 20 20 20 20 61 73 73 65  nPage;..    asse
2ef20 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44  rt( *pPgno!=PEND
2ef30 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
2ef40 74 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 62  t) );.    rc = b
2ef50 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
2ef60 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c   *pPgno, ppPage,
2ef70 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20   bNoContent);.  
2ef80 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2ef90 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73  n rc;.    rc = s
2efa0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2efb0 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50  ((*ppPage)->pDbP
2efc0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
2efd0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2efe0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2eff0 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  (*ppPage);.    }
2f000 0a 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c  .    TRACE(("ALL
2f010 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65  OCATE: %d from e
2f020 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a  nd of file\n", *
2f030 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20  pPgno));.  }..  
2f040 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d  assert( *pPgno!=
2f050 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
2f060 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61  E(pBt) );..end_a
2f070 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20  llocate_page:.  
2f080 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75  releasePage(pTru
2f090 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61  nk);.  releasePa
2f0a0 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a  ge(pPrevTrunk);.
2f0b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2f0c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 73  _OK ){.    if( s
2f0d0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
2f0e0 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65  efcount((*ppPage
2f0f0 29 2d 3e 70 44 62 50 61 67 65 29 3e 31 20 29 7b  )->pDbPage)>1 ){
2f100 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
2f110 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
2f120 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a     *ppPage = 0;.
2f130 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2f140 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2f150 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 2a 70 70  ;.    }.    (*pp
2f160 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20  Page)->isInit = 
2f170 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
2f180 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d  *ppPage = 0;.  }
2f190 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
2f1a0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69  QLITE_OK || sqli
2f1b0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2f1c0 62 6c 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  ble((*ppPage)->p
2f1d0 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74  DbPage) );.  ret
2f1e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2f1f0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2f200 73 20 75 73 65 64 20 74 6f 20 61 64 64 20 70 61  s used to add pa
2f210 67 65 20 69 50 61 67 65 20 74 6f 20 74 68 65 20  ge iPage to the 
2f220 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 72  database file fr
2f230 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49 74 20  ee-list. .** It 
2f240 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
2f250 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
2f260 61 6c 72 65 61 64 79 20 61 20 70 61 72 74 20 6f  already a part o
2f270 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  f the free-list.
2f280 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  .**.** The value
2f290 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
2f2a0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
2f2b0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
2f2c0 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20  is optional..** 
2f2d0 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  If the caller ha
2f2e0 70 70 65 6e 73 20 74 6f 20 68 61 76 65 20 61 20  ppens to have a 
2f2f0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4d  pointer to the M
2f300 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 0a 2a  emPage object .*
2f310 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  * corresponding 
2f320 74 6f 20 70 61 67 65 20 69 50 61 67 65 20 68 61  to page iPage ha
2f330 6e 64 79 2c 20 69 74 20 6d 61 79 20 70 61 73 73  ndy, it may pass
2f340 20 69 74 20 61 73 20 74 68 65 20 73 65 63 6f 6e   it as the secon
2f350 64 20 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68  d value. .** Oth
2f360 65 72 77 69 73 65 2c 20 69 74 20 6d 61 79 20 70  erwise, it may p
2f370 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  ass NULL..**.** 
2f380 49 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  If a pointer to 
2f390 61 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74  a MemPage object
2f3a0 20 69 73 20 70 61 73 73 65 64 20 61 73 20 74 68   is passed as th
2f3b0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
2f3c0 74 2c 0a 2a 2a 20 69 74 73 20 72 65 66 65 72 65  t,.** its refere
2f3d0 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 6e 6f 74  nce count is not
2f3e0 20 61 6c 74 65 72 65 64 20 62 79 20 74 68 69 73   altered by this
2f3f0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
2f400 61 74 69 63 20 69 6e 74 20 66 72 65 65 50 61 67  atic int freePag
2f410 65 32 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  e2(BtShared *pBt
2f420 2c 20 4d 65 6d 50 61 67 65 20 2a 70 4d 65 6d 50  , MemPage *pMemP
2f430 61 67 65 2c 20 50 67 6e 6f 20 69 50 61 67 65 29  age, Pgno iPage)
2f440 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72  {.  MemPage *pTr
2f450 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20  unk = 0;        
2f460 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 2d          /* Free-
2f470 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  list trunk page 
2f480 2a 2f 0a 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b  */.  Pgno iTrunk
2f490 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2f4a0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
2f4b0 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 2d   number of free-
2f4c0 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  list trunk page 
2f4d0 2a 2f 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  */ .  MemPage *p
2f4e0 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
2f4f0 67 65 31 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63  ge1;      /* Loc
2f500 61 6c 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  al reference to 
2f510 70 61 67 65 20 31 20 2a 2f 0a 20 20 4d 65 6d 50  page 1 */.  MemP
2f520 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20  age *pPage;     
2f530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f540 2f 2a 20 50 61 67 65 20 62 65 69 6e 67 20 66 72  /* Page being fr
2f550 65 65 64 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c  eed. May be NULL
2f560 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  . */.  int rc;  
2f570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f580 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2f590 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69  turn Code */.  i
2f5a0 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20  nt nFree;       
2f5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f5c0 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75     /* Initial nu
2f5d0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e  mber of pages on
2f5e0 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20   free-list */.. 
2f5f0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2f600 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
2f610 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
2f620 65 72 74 28 20 69 50 61 67 65 3e 31 20 29 3b 0a  ert( iPage>1 );.
2f630 20 20 61 73 73 65 72 74 28 20 21 70 4d 65 6d 50    assert( !pMemP
2f640 61 67 65 20 7c 7c 20 70 4d 65 6d 50 61 67 65 2d  age || pMemPage-
2f650 3e 70 67 6e 6f 3d 3d 69 50 61 67 65 20 29 3b 0a  >pgno==iPage );.
2f660 0a 20 20 69 66 28 20 70 4d 65 6d 50 61 67 65 20  .  if( pMemPage 
2f670 29 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70  ){.    pPage = p
2f680 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20 73 71 6c  MemPage;.    sql
2f690 69 74 65 33 50 61 67 65 72 52 65 66 28 70 50 61  ite3PagerRef(pPa
2f6a0 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
2f6b0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
2f6c0 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b   = btreePageLook
2f6d0 75 70 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a  up(pBt, iPage);.
2f6e0 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d    }..  /* Increm
2f6f0 65 6e 74 20 74 68 65 20 66 72 65 65 20 70 61 67  ent the free pag
2f700 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65  e count on pPage
2f710 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69  1 */.  rc = sqli
2f720 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
2f730 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
2f740 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2f750 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
2f760 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65  nFree = get4byte
2f770 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
2f780 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65  36]);.  put4byte
2f790 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
2f7a0 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a  36], nFree+1);..
2f7b0 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c    if( pBt->btsFl
2f7c0 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45  ags & BTS_SECURE
2f7d0 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 2f  _DELETE ){.    /
2f7e0 2a 20 49 66 20 74 68 65 20 73 65 63 75 72 65 5f  * If the secure_
2f7f0 64 65 6c 65 74 65 20 6f 70 74 69 6f 6e 20 69 73  delete option is
2f800 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20   enabled, then. 
2f810 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c     ** always ful
2f820 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c  ly overwrite del
2f830 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  eted information
2f840 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20   with zeros..   
2f850 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21 70 50   */.    if( (!pP
2f860 61 67 65 20 26 26 20 28 28 72 63 20 3d 20 62 74  age && ((rc = bt
2f870 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
2f880 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30  iPage, &pPage, 0
2f890 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20 7c 7c  ))!=0) ).     ||
2f8a0 20 20 20 20 20 20 20 20 20 20 20 20 28 28 72 63              ((rc
2f8b0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2f8c0 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
2f8d0 61 67 65 29 29 21 3d 30 29 0a 20 20 20 20 29 7b  age))!=0).    ){
2f8e0 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
2f8f0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
2f900 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65      memset(pPage
2f910 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50 61 67  ->aData, 0, pPag
2f920 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e->pBt->pageSize
2f930 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
2f940 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70  the database sup
2f950 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
2f960 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72  m, write an entr
2f970 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72  y in the pointer
2f980 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64  -map.  ** to ind
2f990 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 70  icate that the p
2f9a0 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a  age is free..  *
2f9b0 2f 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56 41  /.  if( ISAUTOVA
2f9c0 43 55 55 4d 20 29 7b 0a 20 20 20 20 70 74 72 6d  CUUM ){.    ptrm
2f9d0 61 70 50 75 74 28 70 42 74 2c 20 69 50 61 67 65  apPut(pBt, iPage
2f9e0 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  , PTRMAP_FREEPAG
2f9f0 45 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20 20 20  E, 0, &rc);.    
2fa00 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72  if( rc ) goto fr
2fa10 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  eepage_out;.  }.
2fa20 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75  .  /* Now manipu
2fa30 6c 61 74 65 20 74 68 65 20 61 63 74 75 61 6c 20  late the actual 
2fa40 64 61 74 61 62 61 73 65 20 66 72 65 65 2d 6c 69  database free-li
2fa50 73 74 20 73 74 72 75 63 74 75 72 65 2e 20 54 68  st structure. Th
2fa60 65 72 65 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a  ere are two.  **
2fa70 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73 2e 20   possibilities. 
2fa80 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  If the free-list
2fa90 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 65 6d   is currently em
2faa0 70 74 79 2c 20 6f 72 20 69 66 20 74 68 65 20 66  pty, or if the f
2fab0 69 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20  irst.  ** trunk 
2fac0 70 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65  page in the free
2fad0 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c 20 74  -list is full, t
2fae0 68 65 6e 20 74 68 69 73 20 70 61 67 65 20 77 69  hen this page wi
2faf0 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a  ll become a.  **
2fb00 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 74   new free-list t
2fb10 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65 72  runk page. Other
2fb20 77 69 73 65 2c 20 69 74 20 77 69 6c 6c 20 62 65  wise, it will be
2fb30 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66 20 74  come a leaf of t
2fb40 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72  he.  ** first tr
2fb50 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
2fb60 63 75 72 72 65 6e 74 20 66 72 65 65 2d 6c 69 73  current free-lis
2fb70 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 74 65  t. This block te
2fb80 73 74 73 20 69 66 20 69 74 0a 20 20 2a 2a 20 69  sts if it.  ** i
2fb90 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64  s possible to ad
2fba0 64 20 74 68 65 20 70 61 67 65 20 61 73 20 61 20  d the page as a 
2fbb0 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  new free-list le
2fbc0 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  af..  */.  if( n
2fbd0 46 72 65 65 21 3d 30 20 29 7b 0a 20 20 20 20 75  Free!=0 ){.    u
2fbe0 33 32 20 6e 4c 65 61 66 3b 20 20 20 20 20 20 20  32 nLeaf;       
2fbf0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
2fc00 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65  ial number of le
2fc10 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e  af cells on trun
2fc20 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69  k page */..    i
2fc30 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
2fc40 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
2fc50 33 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 62  32]);.    rc = b
2fc60 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
2fc70 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b   iTrunk, &pTrunk
2fc80 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
2fc90 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2fca0 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
2fcb0 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20  ge_out;.    }.. 
2fcc0 20 20 20 6e 4c 65 61 66 20 3d 20 67 65 74 34 62     nLeaf = get4b
2fcd0 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
2fce0 74 61 5b 34 5d 29 3b 0a 20 20 20 20 61 73 73 65  ta[4]);.    asse
2fcf0 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  rt( pBt->usableS
2fd00 69 7a 65 3e 33 32 20 29 3b 0a 20 20 20 20 69 66  ize>32 );.    if
2fd10 28 20 6e 4c 65 61 66 20 3e 20 28 75 33 32 29 70  ( nLeaf > (u32)p
2fd20 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34  Bt->usableSize/4
2fd30 20 2d 20 32 20 29 7b 0a 20 20 20 20 20 20 72 63   - 2 ){.      rc
2fd40 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
2fd50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  T_BKPT;.      go
2fd60 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
2fd70 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
2fd80 4c 65 61 66 20 3c 20 28 75 33 32 29 70 42 74 2d  Leaf < (u32)pBt-
2fd90 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20  >usableSize/4 - 
2fda0 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  8 ){.      /* In
2fdb0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65   this case there
2fdc0 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68 65 20   is room on the 
2fdd0 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20 69 6e  trunk page to in
2fde0 73 65 72 74 20 74 68 65 20 70 61 67 65 0a 20 20  sert the page.  
2fdf0 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 66 72 65      ** being fre
2fe00 65 64 20 61 73 20 61 20 6e 65 77 20 6c 65 61 66  ed as a new leaf
2fe10 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
2fe20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
2fe30 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20  e trunk page is 
2fe40 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20  not really full 
2fe50 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e  until it contain
2fe60 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c  s.      ** usabl
2fe70 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72  eSize/4 - 2 entr
2fe80 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53  ies, not usableS
2fe90 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65  ize/4 - 8 entrie
2fea0 73 20 61 73 20 77 65 20 68 61 76 65 0a 20 20 20  s as we have.   
2feb0 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75     ** coded.  Bu
2fec0 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e  t due to a codin
2fed0 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72 73 69  g error in versi
2fee0 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72  ons of SQLite pr
2fef0 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ior to.      ** 
2ff00 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73 65 73  3.6.0, databases
2ff10 20 77 69 74 68 20 66 72 65 65 6c 69 73 74 20 74   with freelist t
2ff20 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64 69  runk pages holdi
2ff30 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20  ng more than.   
2ff40 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65     ** usableSize
2ff50 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 77  /4 - 8 entries w
2ff60 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65 64 20  ill be reported 
2ff70 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49 6e 20  as corrupt.  In 
2ff80 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 74  order.      ** t
2ff90 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b 77  o maintain backw
2ffa0 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69  ards compatibili
2ffb0 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20 76 65  ty with older ve
2ffc0 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
2ffd0 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 77 69  ,.      ** we wi
2ffe0 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 72  ll continue to r
2fff0 65 73 74 72 69 63 74 20 74 68 65 20 6e 75 6d 62  estrict the numb
30000 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 74 6f  er of entries to
30010 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
30020 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e  8.      ** for n
30030 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f 69  ow.  At some poi
30040 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  nt in the future
30050 20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65 20   (once everyone 
30060 68 61 73 20 75 70 67 72 61 64 65 64 0a 20 20 20  has upgraded.   
30070 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f     ** to 3.6.0 o
30080 72 20 6c 61 74 65 72 29 20 77 65 20 73 68 6f 75  r later) we shou
30090 6c 64 20 63 6f 6e 73 69 64 65 72 20 66 69 78 69  ld consider fixi
300a0 6e 67 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  ng the condition
300b0 61 6c 20 61 62 6f 76 65 0a 20 20 20 20 20 20 2a  al above.      *
300c0 2a 20 74 6f 20 72 65 61 64 20 22 75 73 61 62 6c  * to read "usabl
300d0 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65  eSize/4-2" inste
300e0 61 64 20 6f 66 20 22 75 73 61 62 6c 65 53 69 7a  ad of "usableSiz
300f0 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2a  e/4-8"..      **
30100 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e  .      ** EVIDEN
30110 43 45 2d 4f 46 3a 20 52 2d 31 39 39 32 30 2d 31  CE-OF: R-19920-1
30120 31 35 37 36 20 48 6f 77 65 76 65 72 2c 20 6e 65  1576 However, ne
30130 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  wer versions of 
30140 53 51 4c 69 74 65 20 73 74 69 6c 6c 0a 20 20 20  SQLite still.   
30150 20 20 20 2a 2a 20 61 76 6f 69 64 20 75 73 69 6e     ** avoid usin
30160 67 20 74 68 65 20 6c 61 73 74 20 73 69 78 20 65  g the last six e
30170 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 66 72  ntries in the fr
30180 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
30190 65 20 61 72 72 61 79 20 69 6e 0a 20 20 20 20 20  e array in.     
301a0 20 2a 2a 20 6f 72 64 65 72 20 74 68 61 74 20 64   ** order that d
301b0 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 63 72  atabase files cr
301c0 65 61 74 65 64 20 62 79 20 6e 65 77 65 72 20 76  eated by newer v
301d0 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
301e0 65 20 63 61 6e 20 62 65 0a 20 20 20 20 20 20 2a  e can be.      *
301f0 2a 20 72 65 61 64 20 62 79 20 6f 6c 64 65 72 20  * read by older 
30200 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
30210 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  te..      */.   
30220 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
30230 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
30240 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
30250 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
30260 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
30270 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  ut4byte(&pTrunk-
30280 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66  >aData[4], nLeaf
30290 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  +1);.        put
302a0 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
302b0 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c  Data[8+nLeaf*4],
302c0 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20   iPage);.       
302d0 20 69 66 28 20 70 50 61 67 65 20 26 26 20 28 70   if( pPage && (p
302e0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
302f0 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
30300 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
30310 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f    sqlite3PagerDo
30320 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  ntWrite(pPage->p
30330 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
30340 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
30350 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65  btreeSetHasConte
30360 6e 74 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a  nt(pBt, iPage);.
30370 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52        }.      TR
30380 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a  ACE(("FREE-PAGE:
30390 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e   %d leaf on trun
303a0 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70 50 61  k page %d\n",pPa
303b0 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d  ge->pgno,pTrunk-
303c0 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 67  >pgno));.      g
303d0 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
303e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
303f0 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f  * If control flo
30400 77 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ws to this point
30410 2c 20 74 68 65 6e 20 69 74 20 77 61 73 20 6e 6f  , then it was no
30420 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64  t possible to ad
30430 64 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 70  d the.  ** the p
30440 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 20  age being freed 
30450 61 73 20 61 20 6c 65 61 66 20 70 61 67 65 20 6f  as a leaf page o
30460 66 20 74 68 65 20 66 69 72 73 74 20 74 72 75 6e  f the first trun
30470 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  k in the free-li
30480 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c  st..  ** Possibl
30490 79 20 62 65 63 61 75 73 65 20 74 68 65 20 66 72  y because the fr
304a0 65 65 2d 6c 69 73 74 20 69 73 20 65 6d 70 74 79  ee-list is empty
304b0 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79 20 62 65  , or possibly be
304c0 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20  cause the .  ** 
304d0 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74  first trunk in t
304e0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20  he free-list is 
304f0 66 75 6c 6c 2e 20 45 69 74 68 65 72 20 77 61 79  full. Either way
30500 2c 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67  , the page being
30510 20 66 72 65 65 64 0a 20 20 2a 2a 20 77 69 6c 6c   freed.  ** will
30520 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20   become the new 
30530 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65  first trunk page
30540 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   in the free-lis
30550 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  t..  */.  if( pP
30560 61 67 65 3d 3d 30 20 26 26 20 53 51 4c 49 54 45  age==0 && SQLITE
30570 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72 65 65  _OK!=(rc = btree
30580 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 61  GetPage(pBt, iPa
30590 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 20  ge, &pPage, 0)) 
305a0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65  ){.    goto free
305b0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  page_out;.  }.  
305c0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
305d0 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
305e0 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
305f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
30600 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
30610 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74 34  _out;.  }.  put4
30620 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
30630 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20 70 75  a, iTrunk);.  pu
30640 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
30650 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 70  Data[4], 0);.  p
30660 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
30670 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 50 61 67  >aData[32], iPag
30680 65 29 3b 0a 20 20 54 52 41 43 45 28 28 22 46 52  e);.  TRACE(("FR
30690 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20  EE-PAGE: %d new 
306a0 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61  trunk page repla
306b0 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50 61 67  cing %d\n", pPag
306c0 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e 6b 29  e->pgno, iTrunk)
306d0 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f 75 74  );..freepage_out
306e0 3a 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 7b  :.  if( pPage ){
306f0 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
30700 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  it = 0;.  }.  re
30710 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
30720 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
30730 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72  pTrunk);.  retur
30740 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 76  n rc;.}.static v
30750 6f 69 64 20 66 72 65 65 50 61 67 65 28 4d 65 6d  oid freePage(Mem
30760 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
30770 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20 28 2a   *pRC){.  if( (*
30780 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  pRC)==SQLITE_OK 
30790 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 66 72  ){.    *pRC = fr
307a0 65 65 50 61 67 65 32 28 70 50 61 67 65 2d 3e 70  eePage2(pPage->p
307b0 42 74 2c 20 70 50 61 67 65 2c 20 70 50 61 67 65  Bt, pPage, pPage
307c0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a  ->pgno);.  }.}..
307d0 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f  /*.** Free any o
307e0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73  verflow pages as
307f0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
30800 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 20 20 57  e given Cell.  W
30810 72 69 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 61  rite the.** loca
30820 6c 20 43 65 6c 6c 20 73 69 7a 65 20 28 74 68 65  l Cell size (the
30830 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
30840 20 6f 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   on the original
30850 20 70 61 67 65 2c 20 6f 6d 69 74 74 69 6e 67 0a   page, omitting.
30860 2a 2a 20 6f 76 65 72 66 6c 6f 77 29 20 69 6e 74  ** overflow) int
30870 6f 20 2a 70 6e 53 69 7a 65 2e 0a 2a 2f 0a 73 74  o *pnSize..*/.st
30880 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72 43 65  atic int clearCe
30890 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ll(.  MemPage *p
308a0 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f  Page,          /
308b0 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
308c0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 43 65 6c  contains the Cel
308d0 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  l */.  unsigned 
308e0 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20  char *pCell,    
308f0 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
30900 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 75   the Cell */.  u
30910 31 36 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20  16 *pnSize      
30920 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
30930 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
30940 20 43 65 6c 6c 20 68 65 72 65 20 2a 2f 0a 29 7b   Cell here */.){
30950 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
30960 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
30970 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
30980 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b    Pgno ovflPgno;
30990 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
309a0 20 6e 4f 76 66 6c 3b 0a 20 20 75 33 32 20 6f 76   nOvfl;.  u32 ov
309b0 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61  flPageSize;..  a
309c0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
309d0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
309e0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
309f0 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
30a00 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
30a10 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 2a 70 6e 53  , &info);.  *pnS
30a20 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65  ize = info.nSize
30a30 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76  ;.  if( info.iOv
30a40 65 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20  erflow==0 ){.   
30a50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
30a60 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c  K;  /* No overfl
30a70 6f 77 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e  ow pages. Return
30a80 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
30a90 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20  nything */.  }. 
30aa0 20 69 66 28 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e   if( pCell+info.
30ab0 69 4f 76 65 72 66 6c 6f 77 2b 33 20 3e 20 70 50  iOverflow+3 > pP
30ac0 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65  age->aData+pPage
30ad0 2d 3e 6d 61 73 6b 50 61 67 65 20 29 7b 0a 20 20  ->maskPage ){.  
30ae0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
30af0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 20 2f  CORRUPT_BKPT;  /
30b00 2a 20 43 65 6c 6c 20 65 78 74 65 6e 64 73 20 70  * Cell extends p
30b10 61 73 74 20 65 6e 64 20 6f 66 20 70 61 67 65 20  ast end of page 
30b20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e  */.  }.  ovflPgn
30b30 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43  o = get4byte(&pC
30b40 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
30b50 6f 77 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ow]);.  assert( 
30b60 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
30b70 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67  > 4 );.  ovflPag
30b80 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  eSize = pBt->usa
30b90 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e  bleSize - 4;.  n
30ba0 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61  Ovfl = (info.nPa
30bb0 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f  yload - info.nLo
30bc0 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69  cal + ovflPageSi
30bd0 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65  ze - 1)/ovflPage
30be0 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Size;.  assert( 
30bf0 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6e  ovflPgno==0 || n
30c00 4f 76 66 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c  Ovfl>0 );.  whil
30c10 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20  e( nOvfl-- ){.  
30c20 20 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30    Pgno iNext = 0
30c30 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
30c40 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66  Ovfl = 0;.    if
30c50 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20  ( ovflPgno<2 || 
30c60 6f 76 66 6c 50 67 6e 6f 3e 62 74 72 65 65 50 61  ovflPgno>btreePa
30c70 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a  gecount(pBt) ){.
30c80 20 20 20 20 20 20 2f 2a 20 30 20 69 73 20 6e 6f        /* 0 is no
30c90 74 20 61 20 6c 65 67 61 6c 20 70 61 67 65 20 6e  t a legal page n
30ca0 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20 31  umber and page 1
30cb0 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 0a 20   cannot be an . 
30cc0 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77       ** overflow
30cd0 20 70 61 67 65 2e 20 54 68 65 72 65 66 6f 72 65   page. Therefore
30ce0 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f   if ovflPgno<2 o
30cf0 72 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  r past the end o
30d00 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  f the .      ** 
30d10 66 69 6c 65 20 74 68 65 20 64 61 74 61 62 61 73  file the databas
30d20 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
30d30 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  t. */.      retu
30d40 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
30d50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
30d60 20 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a 20    if( nOvfl ){. 
30d70 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65       rc = getOve
30d80 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6f  rflowPage(pBt, o
30d90 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c  vflPgno, &pOvfl,
30da0 20 26 69 4e 65 78 74 29 3b 0a 20 20 20 20 20 20   &iNext);.      
30db0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
30dc0 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  rc;.    }..    i
30dd0 66 28 20 28 20 70 4f 76 66 6c 20 7c 7c 20 28 28  f( ( pOvfl || ((
30de0 70 4f 76 66 6c 20 3d 20 62 74 72 65 65 50 61 67  pOvfl = btreePag
30df0 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 6f 76 66  eLookup(pBt, ovf
30e00 6c 50 67 6e 6f 29 29 21 3d 30 29 20 29 0a 20 20  lPgno))!=0) ).  
30e10 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67     && sqlite3Pag
30e20 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  erPageRefcount(p
30e30 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 21 3d  Ovfl->pDbPage)!=
30e40 31 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f  1.    ){.      /
30e50 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 72 65  * There is no re
30e60 61 73 6f 6e 20 61 6e 79 20 63 75 72 73 6f 72 20  ason any cursor 
30e70 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6e 20 6f  should have an o
30e80 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
30e90 65 6e 63 65 20 0a 20 20 20 20 20 20 2a 2a 20 74  ence .      ** t
30ea0 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
30eb0 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20  ge belonging to 
30ec0 61 20 63 65 6c 6c 20 74 68 61 74 20 69 73 20 62  a cell that is b
30ed0 65 69 6e 67 20 64 65 6c 65 74 65 64 2f 75 70 64  eing deleted/upd
30ee0 61 74 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 53  ated..      ** S
30ef0 6f 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74  o if there exist
30f00 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
30f10 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 69  reference to thi
30f20 73 20 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20  s page, then it 
30f30 0a 20 20 20 20 20 20 2a 2a 20 6d 75 73 74 20 6e  .      ** must n
30f40 6f 74 20 72 65 61 6c 6c 79 20 62 65 20 61 6e 20  ot really be an 
30f50 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 61 6e  overflow page an
30f60 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  d the database m
30f70 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20  ust be corrupt. 
30f80 0a 20 20 20 20 20 20 2a 2a 20 49 74 20 69 73 20  .      ** It is 
30f90 68 65 6c 70 66 75 6c 20 74 6f 20 64 65 74 65 63  helpful to detec
30fa0 74 20 74 68 69 73 20 62 65 66 6f 72 65 20 63 61  t this before ca
30fb0 6c 6c 69 6e 67 20 66 72 65 65 50 61 67 65 32 28  lling freePage2(
30fc0 29 2c 20 61 73 20 0a 20 20 20 20 20 20 2a 2a 20  ), as .      ** 
30fd0 66 72 65 65 50 61 67 65 32 28 29 20 6d 61 79 20  freePage2() may 
30fe0 7a 65 72 6f 20 74 68 65 20 70 61 67 65 20 63 6f  zero the page co
30ff0 6e 74 65 6e 74 73 20 69 66 20 73 65 63 75 72 65  ntents if secure
31000 2d 64 65 6c 65 74 65 20 6d 6f 64 65 20 69 73 0a  -delete mode is.
31010 20 20 20 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64        ** enabled
31020 2e 20 49 66 20 74 68 69 73 20 27 6f 76 65 72 66  . If this 'overf
31030 6c 6f 77 27 20 70 61 67 65 20 68 61 70 70 65 6e  low' page happen
31040 73 20 74 6f 20 62 65 20 61 20 70 61 67 65 20 74  s to be a page t
31050 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  hat the.      **
31060 20 63 61 6c 6c 65 72 20 69 73 20 69 74 65 72 61   caller is itera
31070 74 69 6e 67 20 74 68 72 6f 75 67 68 20 6f 72 20  ting through or 
31080 75 73 69 6e 67 20 69 6e 20 73 6f 6d 65 20 6f 74  using in some ot
31090 68 65 72 20 77 61 79 2c 20 74 68 69 73 0a 20 20  her way, this.  
310a0 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 70 72      ** can be pr
310b0 6f 62 6c 65 6d 61 74 69 63 2e 0a 20 20 20 20 20  oblematic..     
310c0 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53   */.      rc = S
310d0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
310e0 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  PT;.    }else{. 
310f0 20 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61       rc = freePa
31100 67 65 32 28 70 42 74 2c 20 70 4f 76 66 6c 2c 20  ge2(pBt, pOvfl, 
31110 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 7d  ovflPgno);.    }
31120 0a 0a 20 20 20 20 69 66 28 20 70 4f 76 66 6c 20  ..    if( pOvfl 
31130 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
31140 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c  PagerUnref(pOvfl
31150 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
31160 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  }.    if( rc ) r
31170 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6f 76  eturn rc;.    ov
31180 66 6c 50 67 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a  flPgno = iNext;.
31190 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
311a0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
311b0 20 43 72 65 61 74 65 20 74 68 65 20 62 79 74 65   Create the byte
311c0 20 73 65 71 75 65 6e 63 65 20 75 73 65 64 20 74   sequence used t
311d0 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20 63 65  o represent a ce
311e0 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65  ll on page pPage
311f0 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68  .** and write th
31200 61 74 20 62 79 74 65 20 73 65 71 75 65 6e 63 65  at byte sequence
31210 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20   into pCell[].  
31220 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  Overflow pages a
31230 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  re.** allocated 
31240 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20 61 73  and filled in as
31250 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65   necessary.  The
31260 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75   calling procedu
31270 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73  re.** is respons
31280 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20  ible for making 
31290 73 75 72 65 20 73 75 66 66 69 63 69 65 6e 74 20  sure sufficient 
312a0 73 70 61 63 65 20 68 61 73 20 62 65 65 6e 20 61  space has been a
312b0 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20  llocated.** for 
312c0 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e  pCell[]..**.** N
312d0 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c 20 64  ote that pCell d
312e0 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72  oes not necessar
312f0 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74 20  y need to point 
31300 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44  to the pPage->aD
31310 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43  ata.** area.  pC
31320 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  ell might point 
31330 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72  to some temporar
31340 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68 65 20  y storage.  The 
31350 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  cell will.** be 
31360 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74  constructed in t
31370 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 61 72  his temporary ar
31380 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64 20 69  ea then copied i
31390 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61  nto pPage->aData
313a0 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74  .** later..*/.st
313b0 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43  atic int fillInC
313c0 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
313d0 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
313e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
313f0 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
31400 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e  the cell */.  un
31410 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
31420 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ll,          /* 
31430 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66  Complete text of
31440 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63   the cell */.  c
31450 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c  onst void *pKey,
31460 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a   i64 nKey,    /*
31470 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f   The key */.  co
31480 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c  nst void *pData,
31490 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20  int nData,   /* 
314a0 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  The data */.  in
314b0 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20  t nZero,        
314c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
314d0 45 78 74 72 61 20 7a 65 72 6f 20 62 79 74 65 73  Extra zero bytes
314e0 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 70 44   to append to pD
314f0 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ata */.  int *pn
31500 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20  Size            
31510 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
31520 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65 20   cell size here 
31530 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79  */.){.  int nPay
31540 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38  load;.  const u8
31550 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53   *pSrc;.  int nS
31560 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74  rc, n, rc;.  int
31570 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65   spaceLeft;.  Me
31580 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30  mPage *pOvfl = 0
31590 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f  ;.  MemPage *pTo
315a0 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20 75  Release = 0;.  u
315b0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50  nsigned char *pP
315c0 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64  rior;.  unsigned
315d0 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b   char *pPayload;
315e0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
315f0 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
31600 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d   Pgno pgnoOvfl =
31610 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65   0;.  int nHeade
31620 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  r;..  assert( sq
31630 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
31640 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
31650 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 70 50 61  ex) );..  /* pPa
31660 67 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  ge is not necess
31670 61 72 69 6c 79 20 77 72 69 74 65 61 62 6c 65 20  arily writeable 
31680 73 69 6e 63 65 20 70 43 65 6c 6c 20 6d 69 67 68  since pCell migh
31690 74 20 62 65 20 61 75 78 69 6c 69 61 72 79 0a 20  t be auxiliary. 
316a0 20 2a 2a 20 62 75 66 66 65 72 20 73 70 61 63 65   ** buffer space
316b0 20 74 68 61 74 20 69 73 20 73 65 70 61 72 61 74   that is separat
316c0 65 20 66 72 6f 6d 20 74 68 65 20 70 50 61 67 65  e from the pPage
316d0 20 62 75 66 66 65 72 20 61 72 65 61 20 2a 2f 0a   buffer area */.
316e0 20 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c 3c    assert( pCell<
316f0 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20  pPage->aData || 
31700 70 43 65 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e 61  pCell>=&pPage->a
31710 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69  Data[pBt->pageSi
31720 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze].            
31730 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
31740 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
31750 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
31760 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20   /* Fill in the 
31770 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65  header. */.  nHe
31780 61 64 65 72 20 3d 20 70 50 61 67 65 2d 3e 63 68  ader = pPage->ch
31790 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 6e 50  ildPtrSize;.  nP
317a0 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b  ayload = nData +
317b0 20 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20 70 50   nZero;.  if( pP
317c0 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20  age->intKeyLeaf 
317d0 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b  ){.    nHeader +
317e0 3d 20 70 75 74 56 61 72 69 6e 74 33 32 28 26 70  = putVarint32(&p
317f0 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e  Cell[nHeader], n
31800 50 61 79 6c 6f 61 64 29 3b 0a 20 20 7d 65 6c 73  Payload);.  }els
31810 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  e{.    assert( n
31820 44 61 74 61 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Data==0 );.    a
31830 73 73 65 72 74 28 20 6e 5a 65 72 6f 3d 3d 30 20  ssert( nZero==0 
31840 29 3b 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65 72  );.  }.  nHeader
31850 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70   += putVarint(&p
31860 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a  Cell[nHeader], *
31870 28 75 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20  (u64*)&nKey);.  
31880 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68  .  /* Fill in th
31890 65 20 70 61 79 6c 6f 61 64 20 73 69 7a 65 20 2a  e payload size *
318a0 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  /.  if( pPage->i
318b0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 70 53 72  ntKey ){.    pSr
318c0 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 6e  c = pData;.    n
318d0 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20  Src = nData;.   
318e0 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65   nData = 0;.  }e
318f0 6c 73 65 7b 20 0a 20 20 20 20 69 66 28 20 4e 45  lse{ .    if( NE
31900 56 45 52 28 6e 4b 65 79 3e 30 78 37 66 66 66 66  VER(nKey>0x7ffff
31910 66 66 66 20 7c 7c 20 70 4b 65 79 3d 3d 30 29 20  fff || pKey==0) 
31920 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
31930 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
31940 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  KPT;.    }.    n
31950 50 61 79 6c 6f 61 64 20 3d 20 28 69 6e 74 29 6e  Payload = (int)n
31960 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d 20  Key;.    pSrc = 
31970 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63 20 3d  pKey;.    nSrc =
31980 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 7d 0a   (int)nKey;.  }.
31990 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d    if( nPayload<=
319a0 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
319b0 29 7b 0a 20 20 20 20 6e 20 3d 20 6e 48 65 61 64  ){.    n = nHead
319c0 65 72 20 2b 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  er + nPayload;. 
319d0 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d     testcase( n==
319e0 33 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  3 );.    testcas
319f0 65 28 20 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 69  e( n==4 );.    i
31a00 66 28 20 6e 3c 34 20 29 20 6e 20 3d 20 34 3b 0a  f( n<4 ) n = 4;.
31a10 20 20 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 3b      *pnSize = n;
31a20 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d  .    spaceLeft =
31a30 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 70   nPayload;.    p
31a40 50 72 69 6f 72 20 3d 20 70 43 65 6c 6c 3b 0a 20  Prior = pCell;. 
31a50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
31a60 6d 6e 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c  mn = pPage->minL
31a70 6f 63 61 6c 3b 0a 20 20 20 20 6e 20 3d 20 6d 6e  ocal;.    n = mn
31a80 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d   + (nPayload - m
31a90 6e 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74  n) % (pPage->pBt
31aa0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
31ab0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
31ac0 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f   n==pPage->maxLo
31ad0 63 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63  cal );.    testc
31ae0 61 73 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d  ase( n==pPage->m
31af0 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20  axLocal+1 );.   
31b00 20 69 66 28 20 6e 20 3e 20 70 50 61 67 65 2d 3e   if( n > pPage->
31b10 6d 61 78 4c 6f 63 61 6c 20 29 20 6e 20 3d 20 6d  maxLocal ) n = m
31b20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74  n;.    spaceLeft
31b30 20 3d 20 6e 3b 0a 20 20 20 20 2a 70 6e 53 69 7a   = n;.    *pnSiz
31b40 65 20 3d 20 6e 20 2b 20 6e 48 65 61 64 65 72 20  e = n + nHeader 
31b50 2b 20 34 3b 0a 20 20 20 20 70 50 72 69 6f 72 20  + 4;.    pPrior 
31b60 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  = &pCell[nHeader
31b70 2b 6e 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 79 6c  +n];.  }.  pPayl
31b80 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65  oad = &pCell[nHe
31b90 61 64 65 72 5d 3b 0a 0a 20 20 2f 2a 20 41 74 20  ader];..  /* At 
31ba0 74 68 69 73 20 70 6f 69 6e 74 20 76 61 72 69 61  this point varia
31bb0 62 6c 65 73 20 73 68 6f 75 6c 64 20 62 65 20 73  bles should be s
31bc0 65 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  et as follows:. 
31bd0 20 2a 2a 0a 20 20 2a 2a 20 20 20 6e 50 61 79 6c   **.  **   nPayl
31be0 6f 61 64 20 20 20 20 20 20 20 20 20 20 20 54 6f  oad           To
31bf0 74 61 6c 20 70 61 79 6c 6f 61 64 20 73 69 7a 65  tal payload size
31c00 20 69 6e 20 62 79 74 65 73 0a 20 20 2a 2a 20 20   in bytes.  **  
31c10 20 70 50 61 79 6c 6f 61 64 20 20 20 20 20 20 20   pPayload       
31c20 20 20 20 20 42 65 67 69 6e 20 77 72 69 74 69 6e      Begin writin
31c30 67 20 70 61 79 6c 6f 61 64 20 68 65 72 65 0a 20  g payload here. 
31c40 20 2a 2a 20 20 20 73 70 61 63 65 4c 65 66 74 20   **   spaceLeft 
31c50 20 20 20 20 20 20 20 20 20 53 70 61 63 65 20 61           Space a
31c60 76 61 69 6c 61 62 6c 65 20 61 74 20 70 50 61 79  vailable at pPay
31c70 6c 6f 61 64 2e 20 20 49 66 20 6e 50 61 79 6c 6f  load.  If nPaylo
31c80 61 64 3e 73 70 61 63 65 4c 65 66 74 2c 0a 20 20  ad>spaceLeft,.  
31c90 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
31ca0 20 20 20 20 20 20 20 20 74 68 61 74 20 6d 65 61          that mea
31cb0 6e 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20  ns content must 
31cc0 73 70 69 6c 6c 20 69 6e 74 6f 20 6f 76 65 72 66  spill into overf
31cd0 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20  low pages..  ** 
31ce0 20 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20    *pnSize       
31cf0 20 20 20 20 20 53 69 7a 65 20 6f 66 20 74 68 65       Size of the
31d00 20 6c 6f 63 61 6c 20 63 65 6c 6c 20 28 6e 6f 74   local cell (not
31d10 20 63 6f 75 6e 74 69 6e 67 20 6f 76 65 72 66 6c   counting overfl
31d20 6f 77 20 70 61 67 65 73 29 0a 20 20 2a 2a 20 20  ow pages).  **  
31d30 20 70 50 72 69 6f 72 20 20 20 20 20 20 20 20 20   pPrior         
31d40 20 20 20 20 57 68 65 72 65 20 74 6f 20 77 72 69      Where to wri
31d50 74 65 20 74 68 65 20 70 67 6e 6f 20 6f 66 20 74  te the pgno of t
31d60 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f  he first overflo
31d70 77 20 70 61 67 65 0a 20 20 2a 2a 0a 20 20 2a 2a  w page.  **.  **
31d80 20 55 73 65 20 61 20 63 61 6c 6c 20 74 6f 20 62   Use a call to b
31d90 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
31da0 28 29 20 74 6f 20 76 65 72 69 66 79 20 74 68 61  () to verify tha
31db0 74 20 74 68 65 20 76 61 6c 75 65 73 20 61 62 6f  t the values abo
31dc0 76 65 0a 20 20 2a 2a 20 77 65 72 65 20 63 6f 6d  ve.  ** were com
31dd0 70 75 74 65 64 20 63 6f 72 72 65 63 74 6c 79 2e  puted correctly.
31de0 0a 20 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  .  */.#if SQLITE
31df0 5f 44 45 42 55 47 0a 20 20 7b 0a 20 20 20 20 43  _DEBUG.  {.    C
31e00 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
31e10 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
31e20 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
31e30 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73  , &info);.    as
31e40 73 65 72 74 28 20 6e 48 65 61 64 65 72 3d 28 69  sert( nHeader=(i
31e50 6e 74 29 28 69 6e 66 6f 2e 70 50 61 79 6c 6f 61  nt)(info.pPayloa
31e60 64 20 2d 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20  d - pCell) );.  
31e70 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e    assert( info.n
31e80 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 20  Key==nKey );.   
31e90 20 61 73 73 65 72 74 28 20 2a 70 6e 53 69 7a 65   assert( *pnSize
31ea0 20 3d 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 20 29   == info.nSize )
31eb0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 70  ;.    assert( sp
31ec0 61 63 65 4c 65 66 74 20 3d 3d 20 69 6e 66 6f 2e  aceLeft == info.
31ed0 6e 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 61 73  nLocal );.    as
31ee0 73 65 72 74 28 20 70 50 72 69 6f 72 20 3d 3d 20  sert( pPrior == 
31ef0 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
31f00 72 66 6c 6f 77 5d 20 29 3b 0a 20 20 7d 0a 23 65  rflow] );.  }.#e
31f10 6e 64 69 66 0a 0a 20 20 2f 2a 20 57 72 69 74 65  ndif..  /* Write
31f20 20 74 68 65 20 70 61 79 6c 6f 61 64 20 69 6e 74   the payload int
31f30 6f 20 74 68 65 20 6c 6f 63 61 6c 20 43 65 6c 6c  o the local Cell
31f40 20 61 6e 64 20 61 6e 79 20 65 78 74 72 61 20 69   and any extra i
31f50 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  nto overflow pag
31f60 65 73 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 6e  es */.  while( n
31f70 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20  Payload>0 ){.   
31f80 20 69 66 28 20 73 70 61 63 65 4c 65 66 74 3d 3d   if( spaceLeft==
31f90 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 ){.#ifndef SQL
31fa0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
31fb0 55 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20 70  UUM.      Pgno p
31fc0 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f  gnoPtrmap = pgno
31fd0 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f  Ovfl; /* Overflo
31fe0 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d  w page pointer-m
31ff0 61 70 20 65 6e 74 72 79 20 70 61 67 65 20 2a 2f  ap entry page */
32000 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
32010 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
32020 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20        do{.      
32030 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a      pgnoOvfl++;.
32040 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28          } while(
32050 20 0a 20 20 20 20 20 20 20 20 20 20 50 54 52 4d   .          PTRM
32060 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70  AP_ISPAGE(pBt, p
32070 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f  gnoOvfl) || pgno
32080 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Ovfl==PENDING_BY
32090 54 45 5f 50 41 47 45 28 70 42 74 29 20 0a 20 20  TE_PAGE(pBt) .  
320a0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
320b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63  .#endif.      rc
320c0 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
320d0 50 61 67 65 28 70 42 74 2c 20 26 70 4f 76 66 6c  Page(pBt, &pOvfl
320e0 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e  , &pgnoOvfl, pgn
320f0 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e 64  oOvfl, 0);.#ifnd
32100 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
32110 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
32120 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
32130 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f  se supports auto
32140 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20 74 68 65  -vacuum, and the
32150 20 73 65 63 6f 6e 64 20 6f 72 20 73 75 62 73 65   second or subse
32160 71 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f  quent.      ** o
32170 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20  verflow page is 
32180 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c  being allocated,
32190 20 61 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f   add an entry to
321a0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
321b0 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68  .      ** for th
321c0 61 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20 20  at page now. .  
321d0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
321e0 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
321f0 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  irst overflow pa
32200 67 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61  ge, then write a
32210 20 70 61 72 74 69 61 6c 20 65 6e 74 72 79 20 0a   partial entry .
32220 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20        ** to the 
32230 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66 20  pointer-map. If 
32240 77 65 20 77 72 69 74 65 20 6e 6f 74 68 69 6e 67  we write nothing
32250 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 65 72   to this pointer
32260 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20 20  -map slot,.     
32270 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f 70 74   ** then the opt
32280 69 6d 69 73 74 69 63 20 6f 76 65 72 66 6c 6f 77  imistic overflow
32290 20 63 68 61 69 6e 20 70 72 6f 63 65 73 73 69 6e   chain processin
322a0 67 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28 29  g in clearCell()
322b0 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 69  .      ** may mi
322c0 73 69 6e 74 65 72 70 72 65 74 20 74 68 65 20 75  sinterpret the u
322d0 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 76 61 6c  ninitialized val
322e0 75 65 73 20 61 6e 64 20 64 65 6c 65 74 65 20 74  ues and delete t
322f0 68 65 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f 6e  he.      ** wron
32300 67 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65  g pages from the
32310 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20   database..     
32320 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42   */.      if( pB
32330 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
32340 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
32350 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65 54 79  {.        u8 eTy
32360 70 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61 70  pe = (pgnoPtrmap
32370 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  ?PTRMAP_OVERFLOW
32380 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  2:PTRMAP_OVERFLO
32390 57 31 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72  W1);.        ptr
323a0 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
323b0 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e  Ovfl, eType, pgn
323c0 6f 50 74 72 6d 61 70 2c 20 26 72 63 29 3b 0a 20  oPtrmap, &rc);. 
323d0 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
323e0 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61  .          relea
323f0 73 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20  sePage(pOvfl);. 
32400 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
32410 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
32420 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
32430 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52  releasePage(pToR
32440 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 20  elease);.       
32450 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
32460 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
32470 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e   pToRelease is n
32480 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 72  ot zero than pPr
32490 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20  ior points into 
324a0 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20  the data area.  
324b0 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c      ** of pToRel
324c0 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65  ease.  Make sure
324d0 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73   pToRelease is s
324e0 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20  till writeable. 
324f0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
32500 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c   pToRelease==0 |
32510 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
32520 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c  writeable(pToRel
32530 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29  ease->pDbPage) )
32540 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70  ;..      /* If p
32550 50 72 69 6f 72 20 69 73 20 70 61 72 74 20 6f 66  Prior is part of
32560 20 74 68 65 20 64 61 74 61 20 61 72 65 61 20 6f   the data area o
32570 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61  f pPage, then ma
32580 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a 20 20  ke sure pPage.  
32590 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20      ** is still 
325a0 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20  writeable */.   
325b0 20 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f     assert( pPrio
325c0 72 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c  r<pPage->aData |
325d0 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50 61 67 65  | pPrior>=&pPage
325e0 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67  ->aData[pBt->pag
325f0 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20  eSize].         
32600 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67     || sqlite3Pag
32610 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
32620 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
32630 0a 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ..      put4byte
32640 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66  (pPrior, pgnoOvf
32650 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  l);.      releas
32660 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
32670 29 3b 0a 20 20 20 20 20 20 70 54 6f 52 65 6c 65  );.      pToRele
32680 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20  ase = pOvfl;.   
32690 20 20 20 70 50 72 69 6f 72 20 3d 20 70 4f 76 66     pPrior = pOvf
326a0 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20  l->aData;.      
326b0 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c  put4byte(pPrior,
326c0 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 79 6c   0);.      pPayl
326d0 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44  oad = &pOvfl->aD
326e0 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70  ata[4];.      sp
326f0 61 63 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75  aceLeft = pBt->u
32700 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20  sableSize - 4;. 
32710 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61     }.    n = nPa
32720 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28 20 6e  yload;.    if( n
32730 3e 73 70 61 63 65 4c 65 66 74 20 29 20 6e 20 3d  >spaceLeft ) n =
32740 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a 20 20 20   spaceLeft;..   
32750 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73   /* If pToReleas
32760 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68  e is not zero th
32770 61 6e 20 70 50 61 79 6c 6f 61 64 20 70 6f 69 6e  an pPayload poin
32780 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ts into the data
32790 20 61 72 65 61 0a 20 20 20 20 2a 2a 20 6f 66 20   area.    ** of 
327a0 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b  pToRelease.  Mak
327b0 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73  e sure pToReleas
327c0 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  e is still write
327d0 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  able. */.    ass
327e0 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d  ert( pToRelease=
327f0 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67  =0 || sqlite3Pag
32800 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54  erIswriteable(pT
32810 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67  oRelease->pDbPag
32820 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  e) );..    /* If
32830 20 70 50 61 79 6c 6f 61 64 20 69 73 20 70 61 72   pPayload is par
32840 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72  t of the data ar
32850 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65  ea of pPage, the
32860 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67  n make sure pPag
32870 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c  e.    ** is stil
32880 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20  l writeable */. 
32890 20 20 20 61 73 73 65 72 74 28 20 70 50 61 79 6c     assert( pPayl
328a0 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44 61 74 61  oad<pPage->aData
328b0 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e 3d 26 70   || pPayload>=&p
328c0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d  Page->aData[pBt-
328d0 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20  >pageSize].     
328e0 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
328f0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
32900 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
32910 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53  ) );..    if( nS
32920 72 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66  rc>0 ){.      if
32930 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20 6e  ( n>nSrc ) n = n
32940 53 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Src;.      asser
32950 74 28 20 70 53 72 63 20 29 3b 0a 20 20 20 20 20  t( pSrc );.     
32960 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64   memcpy(pPayload
32970 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20  , pSrc, n);.    
32980 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d  }else{.      mem
32990 73 65 74 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c  set(pPayload, 0,
329a0 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e   n);.    }.    n
329b0 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20  Payload -= n;.  
329c0 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b    pPayload += n;
329d0 0a 20 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a  .    pSrc += n;.
329e0 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20      nSrc -= n;. 
329f0 20 20 20 73 70 61 63 65 4c 65 66 74 20 2d 3d 20     spaceLeft -= 
32a00 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3d  n;.    if( nSrc=
32a10 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 53 72 63  =0 ){.      nSrc
32a20 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 20 20   = nData;.      
32a30 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20  pSrc = pData;.  
32a40 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73    }.  }.  releas
32a50 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
32a60 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
32a70 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
32a80 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68 20  Remove the i-th 
32a90 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e  cell from pPage.
32aa0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65    This routine e
32ab0 66 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e 6c  ffects pPage onl
32ac0 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63  y..** The cell c
32ad0 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66 72  ontent is not fr
32ae0 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74  eed or deallocat
32af0 65 64 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d  ed.  It is assum
32b00 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63  ed that.** the c
32b10 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20  ell content has 
32b20 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65  been copied some
32b30 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68 69  place else.  Thi
32b40 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a  s routine just.*
32b50 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72 65  * removes the re
32b60 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63  ference to the c
32b70 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a  ell from pPage..
32b80 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20  **.** "sz" must 
32b90 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  be the number of
32ba0 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 63 65   bytes in the ce
32bb0 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ll..*/.static vo
32bc0 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50  id dropCell(MemP
32bd0 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
32be0 69 64 78 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74  idx, int sz, int
32bf0 20 2a 70 52 43 29 7b 0a 20 20 75 33 32 20 70 63   *pRC){.  u32 pc
32c00 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66  ;         /* Off
32c10 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74  set to cell cont
32c20 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e  ent of cell bein
32c30 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75  g deleted */.  u
32c40 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f  8 *data;       /
32c50 2a 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  * pPage->aData *
32c60 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20  /.  u8 *ptr;    
32c70 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d      /* Used to m
32c80 6f 76 65 20 62 79 74 65 73 20 61 72 6f 75 6e 64  ove bytes around
32c90 20 77 69 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a   within data[] *
32ca0 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
32cb0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72      /* The retur
32cc0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
32cd0 68 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 42  hdr;        /* B
32ce0 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
32cf0 68 65 61 64 65 72 2e 20 20 30 20 6d 6f 73 74 20  header.  0 most 
32d00 70 61 67 65 73 2e 20 20 31 30 30 20 70 61 67 65  pages.  100 page
32d10 20 31 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52   1 */..  if( *pR
32d20 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61  C ) return;..  a
32d30 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26  ssert( idx>=0 &&
32d40 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c   idx<pPage->nCel
32d50 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  l );.  assert( s
32d60 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61 67  z==cellSize(pPag
32d70 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61 73 73  e, idx) );.  ass
32d80 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
32d90 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
32da0 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
32db0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
32dc0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
32dd0 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
32de0 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67  );.  data = pPag
32df0 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74 72 20  e->aData;.  ptr 
32e00 3d 20 26 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49  = &pPage->aCellI
32e10 64 78 5b 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20  dx[2*idx];.  pc 
32e20 3d 20 67 65 74 32 62 79 74 65 28 70 74 72 29 3b  = get2byte(ptr);
32e30 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
32e40 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 74 65 73  hdrOffset;.  tes
32e50 74 63 61 73 65 28 20 70 63 3d 3d 67 65 74 32 62  tcase( pc==get2b
32e60 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
32e70 29 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  ) );.  testcase(
32e80 20 70 63 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e 70   pc+sz==pPage->p
32e90 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
32ea0 3b 0a 20 20 69 66 28 20 70 63 20 3c 20 28 75 33  ;.  if( pc < (u3
32eb0 32 29 67 65 74 32 62 79 74 65 28 26 64 61 74 61  2)get2byte(&data
32ec0 5b 68 64 72 2b 35 5d 29 20 7c 7c 20 70 63 2b 73  [hdr+5]) || pc+s
32ed0 7a 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  z > pPage->pBt->
32ee0 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
32ef0 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f    *pRC = SQLITE_
32f00 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
32f10 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
32f20 72 63 20 3d 20 66 72 65 65 53 70 61 63 65 28 70  rc = freeSpace(p
32f30 50 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20  Page, pc, sz);. 
32f40 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a   if( rc ){.    *
32f50 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65  pRC = rc;.    re
32f60 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 50 61 67  turn;.  }.  pPag
32f70 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 69 66  e->nCell--;.  if
32f80 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  ( pPage->nCell==
32f90 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  0 ){.    memset(
32fa0 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c  &data[hdr+1], 0,
32fb0 20 34 29 3b 0a 20 20 20 20 64 61 74 61 5b 68 64   4);.    data[hd
32fc0 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 20 20 70 75  r+7] = 0;.    pu
32fd0 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
32fe0 2b 35 5d 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d  +5], pPage->pBt-
32ff0 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  >usableSize);.  
33000 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d    pPage->nFree =
33010 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
33020 62 6c 65 53 69 7a 65 20 2d 20 70 50 61 67 65 2d  bleSize - pPage-
33030 3e 68 64 72 4f 66 66 73 65 74 0a 20 20 20 20 20  >hdrOffset.     
33040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33050 20 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64    - pPage->child
33060 50 74 72 53 69 7a 65 20 2d 20 38 3b 0a 20 20 7d  PtrSize - 8;.  }
33070 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 6d 6f 76  else{.    memmov
33080 65 28 70 74 72 2c 20 70 74 72 2b 32 2c 20 32 2a  e(ptr, ptr+2, 2*
33090 28 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20  (pPage->nCell - 
330a0 69 64 78 29 29 3b 0a 20 20 20 20 70 75 74 32 62  idx));.    put2b
330b0 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
330c0 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b  , pPage->nCell);
330d0 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
330e0 65 20 2b 3d 20 32 3b 0a 20 20 7d 0a 7d 0a 0a 2f  e += 2;.  }.}../
330f0 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65  *.** Insert a ne
33100 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20  w cell on pPage 
33110 61 74 20 63 65 6c 6c 20 69 6e 64 65 78 20 22 69  at cell index "i
33120 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73  ".  pCell points
33130 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65   to the.** conte
33140 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a  nt of the cell..
33150 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c  **.** If the cel
33160 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66  l content will f
33170 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20  it on the page, 
33180 74 68 65 6e 20 70 75 74 20 69 74 20 74 68 65 72  then put it ther
33190 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c  e.  If it.** wil
331a0 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e 20  l not fit, then 
331b0 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74  make a copy of t
331c0 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
331d0 69 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a  into pTemp if.**
331e0 20 70 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75   pTemp is not nu
331f0 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65 73 73 20  ll.  Regardless 
33200 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61  of pTemp, alloca
33210 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a  te a new entry.*
33220 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61 70 4f 76  * in pPage->apOv
33230 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74  fl[] and make it
33240 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 63 65   point to the ce
33250 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69 74 68  ll content (eith
33260 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f  er.** in pTemp o
33270 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  r the original p
33280 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72  Cell) and also r
33290 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65 78 2e  ecord its index.
332a0 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20   .** Allocating 
332b0 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70  a new entry in p
332c0 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d  Page->aCell[] im
332d0 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a 20 70  plies that .** p
332e0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
332f0 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a  is incremented..
33300 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
33310 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d  nsertCell(.  Mem
33320 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f  Page *pPage,   /
33330 2a 20 50 61 67 65 20 69 6e 74 6f 20 77 68 69 63  * Page into whic
33340 68 20 77 65 20 61 72 65 20 63 6f 70 79 69 6e 67  h we are copying
33350 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20 20   */.  int i,    
33360 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63          /* New c
33370 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68 65 20  ell becomes the 
33380 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74 68 65  i-th cell of the
33390 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70   page */.  u8 *p
333a0 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20  Cell,        /* 
333b0 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e  Content of the n
333c0 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74  ew cell */.  int
333d0 20 73 7a 2c 20 20 20 20 20 20 20 20 20 20 20 2f   sz,           /
333e0 2a 20 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 65  * Bytes of conte
333f0 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20  nt in pCell */. 
33400 20 75 38 20 2a 70 54 65 6d 70 2c 20 20 20 20 20   u8 *pTemp,     
33410 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61     /* Temp stora
33420 67 65 20 73 70 61 63 65 20 66 6f 72 20 70 43 65  ge space for pCe
33430 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f  ll, if needed */
33440 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20  .  Pgno iChild, 
33450 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a       /* If non-z
33460 65 72 6f 2c 20 72 65 70 6c 61 63 65 20 66 69 72  ero, replace fir
33470 73 74 20 34 20 62 79 74 65 73 20 77 69 74 68 20  st 4 bytes with 
33480 74 68 69 73 20 76 61 6c 75 65 20 2a 2f 0a 20 20  this value */.  
33490 69 6e 74 20 2a 70 52 43 20 20 20 20 20 20 20 20  int *pRC        
334a0 20 20 2f 2a 20 52 65 61 64 20 61 6e 64 20 77 72    /* Read and wr
334b0 69 74 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ite return code 
334c0 66 72 6f 6d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  from here */.){.
334d0 20 20 69 6e 74 20 69 64 78 20 3d 20 30 3b 20 20    int idx = 0;  
334e0 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20      /* Where to 
334f0 77 72 69 74 65 20 6e 65 77 20 63 65 6c 6c 20 63  write new cell c
33500 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d  ontent in data[]
33510 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20   */.  int j;    
33520 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
33530 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
33540 20 65 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f   end;          /
33550 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73  * First byte pas
33560 74 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20  t the last cell 
33570 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b  pointer in data[
33580 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 73 3b 20  ] */.  int ins; 
33590 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
335a0 78 20 69 6e 20 64 61 74 61 5b 5d 20 77 68 65 72  x in data[] wher
335b0 65 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74  e new cell point
335c0 65 72 20 69 73 20 69 6e 73 65 72 74 65 64 20 2a  er is inserted *
335d0 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73  /.  int cellOffs
335e0 65 74 3b 20 20 20 2f 2a 20 41 64 64 72 65 73 73  et;   /* Address
335f0 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 70   of first cell p
33600 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d  ointer in data[]
33610 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20   */.  u8 *data; 
33620 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
33630 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 77 68  ontent of the wh
33640 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 0a 20 20 69  ole page */..  i
33650 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e  f( *pRC ) return
33660 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d  ;..  assert( i>=
33670 30 20 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e  0 && i<=pPage->n
33680 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65  Cell+pPage->nOve
33690 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65 72  rflow );.  asser
336a0 74 28 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65  t( MX_CELL(pPage
336b0 2d 3e 70 42 74 29 3c 3d 31 30 39 32 31 20 29 3b  ->pBt)<=10921 );
336c0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
336d0 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c  ->nCell<=MX_CELL
336e0 28 70 50 61 67 65 2d 3e 70 42 74 29 20 7c 7c 20  (pPage->pBt) || 
336f0 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
33700 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
33710 4f 76 65 72 66 6c 6f 77 3c 3d 41 72 72 61 79 53  Overflow<=ArrayS
33720 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f 76 66  ize(pPage->apOvf
33730 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  l) );.  assert( 
33740 41 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d  ArraySize(pPage-
33750 3e 61 70 4f 76 66 6c 29 3d 3d 41 72 72 61 79 53  >apOvfl)==ArrayS
33760 69 7a 65 28 70 50 61 67 65 2d 3e 61 69 4f 76 66  ize(pPage->aiOvf
33770 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  l) );.  assert( 
33780 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
33790 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
337a0 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68  utex) );.  /* Th
337b0 65 20 63 65 6c 6c 20 73 68 6f 75 6c 64 20 6e 6f  e cell should no
337c0 72 6d 61 6c 6c 79 20 62 65 20 73 69 7a 65 64 20  rmally be sized 
337d0 63 6f 72 72 65 63 74 6c 79 2e 20 20 48 6f 77 65  correctly.  Howe
337e0 76 65 72 2c 20 77 68 65 6e 20 6d 6f 76 69 6e 67  ver, when moving
337f0 20 61 0a 20 20 2a 2a 20 6d 61 6c 66 6f 72 6d 65   a.  ** malforme
33800 64 20 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65  d cell from a le
33810 61 66 20 70 61 67 65 20 74 6f 20 61 6e 20 69 6e  af page to an in
33820 74 65 72 69 6f 72 20 70 61 67 65 2c 20 69 66 20  terior page, if 
33830 74 68 65 20 63 65 6c 6c 20 73 69 7a 65 0a 20 20  the cell size.  
33840 2a 2a 20 77 61 6e 74 65 64 20 74 6f 20 62 65 20  ** wanted to be 
33850 6c 65 73 73 20 74 68 61 6e 20 34 20 62 75 74 20  less than 4 but 
33860 67 6f 74 20 72 6f 75 6e 64 65 64 20 75 70 20 74  got rounded up t
33870 6f 20 34 20 6f 6e 20 74 68 65 20 6c 65 61 66 2c  o 4 on the leaf,
33880 20 74 68 65 6e 20 73 69 7a 65 0a 20 20 2a 2a 20   then size.  ** 
33890 6d 69 67 68 74 20 62 65 20 6c 65 73 73 20 74 68  might be less th
338a0 61 6e 20 38 20 28 6c 65 61 66 2d 73 69 7a 65 20  an 8 (leaf-size 
338b0 2b 20 70 6f 69 6e 74 65 72 29 20 6f 6e 20 74 68  + pointer) on th
338c0 65 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 2e  e interior node.
338d0 20 20 48 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65    Hence.  ** the
338e0 20 74 65 72 6d 20 61 66 74 65 72 20 74 68 65 20   term after the 
338f0 7c 7c 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  || in the follow
33900 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20 2a 2f  ing assert(). */
33910 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63  .  assert( sz==c
33920 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
33930 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 28 73 7a 3d  , pCell) || (sz=
33940 3d 38 20 26 26 20 69 43 68 69 6c 64 3e 30 29 20  =8 && iChild>0) 
33950 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
33960 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b  nOverflow || sz+
33970 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29  2>pPage->nFree )
33980 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70 20  {.    if( pTemp 
33990 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
339a0 70 54 65 6d 70 2c 20 70 43 65 6c 6c 2c 20 73 7a  pTemp, pCell, sz
339b0 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  );.      pCell =
339c0 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20   pTemp;.    }.  
339d0 20 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a    if( iChild ){.
339e0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
339f0 43 65 6c 6c 2c 20 69 43 68 69 6c 64 29 3b 0a 20  Cell, iChild);. 
33a00 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50 61     }.    j = pPa
33a10 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b  ge->nOverflow++;
33a20 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 28  .    assert( j<(
33a30 69 6e 74 29 28 73 69 7a 65 6f 66 28 70 50 61 67  int)(sizeof(pPag
33a40 65 2d 3e 61 70 4f 76 66 6c 29 2f 73 69 7a 65 6f  e->apOvfl)/sizeo
33a50 66 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b  f(pPage->apOvfl[
33a60 30 5d 29 29 20 29 3b 0a 20 20 20 20 70 50 61 67  0])) );.    pPag
33a70 65 2d 3e 61 70 4f 76 66 6c 5b 6a 5d 20 3d 20 70  e->apOvfl[j] = p
33a80 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d  Cell;.    pPage-
33a90 3e 61 69 4f 76 66 6c 5b 6a 5d 20 3d 20 28 75 31  >aiOvfl[j] = (u1
33aa0 36 29 69 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  6)i;.  }else{.  
33ab0 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
33ac0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
33ad0 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
33ae0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
33af0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  _OK ){.      *pR
33b00 43 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65  C = rc;.      re
33b10 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
33b20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
33b30 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
33b40 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
33b50 29 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50  );.    data = pP
33b60 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  age->aData;.    
33b70 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61  cellOffset = pPa
33b80 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a  ge->cellOffset;.
33b90 20 20 20 20 65 6e 64 20 3d 20 63 65 6c 6c 4f 66      end = cellOf
33ba0 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e  fset + 2*pPage->
33bb0 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 73 20 3d  nCell;.    ins =
33bc0 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
33bd0 69 3b 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f  i;.    rc = allo
33be0 63 61 74 65 53 70 61 63 65 28 70 50 61 67 65 2c  cateSpace(pPage,
33bf0 20 73 7a 2c 20 26 69 64 78 29 3b 0a 20 20 20 20   sz, &idx);.    
33c00 69 66 28 20 72 63 20 29 7b 20 2a 70 52 43 20 3d  if( rc ){ *pRC =
33c10 20 72 63 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 20   rc; return; }. 
33c20 20 20 20 2f 2a 20 54 68 65 20 61 6c 6c 6f 63 61     /* The alloca
33c30 74 65 53 70 61 63 65 28 29 20 72 6f 75 74 69 6e  teSpace() routin
33c40 65 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 65  e guarantees the
33c50 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 70   following two p
33c60 72 6f 70 65 72 74 69 65 73 0a 20 20 20 20 2a 2a  roperties.    **
33c70 20 69 66 20 69 74 20 72 65 74 75 72 6e 73 20 73   if it returns s
33c80 75 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 61 73  uccess */.    as
33c90 73 65 72 74 28 20 69 64 78 20 3e 3d 20 65 6e 64  sert( idx >= end
33ca0 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +2 );.    assert
33cb0 28 20 69 64 78 2b 73 7a 20 3c 3d 20 28 69 6e 74  ( idx+sz <= (int
33cc0 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  )pPage->pBt->usa
33cd0 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 70  bleSize );.    p
33ce0 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20  Page->nCell++;. 
33cf0 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20     pPage->nFree 
33d00 2d 3d 20 28 75 31 36 29 28 32 20 2b 20 73 7a 29  -= (u16)(2 + sz)
33d10 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  ;.    memcpy(&da
33d20 74 61 5b 69 64 78 5d 2c 20 70 43 65 6c 6c 2c 20  ta[idx], pCell, 
33d30 73 7a 29 3b 0a 20 20 20 20 69 66 28 20 69 43 68  sz);.    if( iCh
33d40 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74  ild ){.      put
33d50 34 62 79 74 65 28 26 64 61 74 61 5b 69 64 78 5d  4byte(&data[idx]
33d60 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d  , iChild);.    }
33d70 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 64 61  .    memmove(&da
33d80 74 61 5b 69 6e 73 2b 32 5d 2c 20 26 64 61 74 61  ta[ins+2], &data
33d90 5b 69 6e 73 5d 2c 20 65 6e 64 2d 69 6e 73 29 3b  [ins], end-ins);
33da0 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
33db0 61 74 61 5b 69 6e 73 5d 2c 20 69 64 78 29 3b 0a  ata[ins], idx);.
33dc0 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
33dd0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
33de0 73 65 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e  set+3], pPage->n
33df0 43 65 6c 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53  Cell);.#ifndef S
33e00 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
33e10 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50  ACUUM.    if( pP
33e20 61 67 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61  age->pBt->autoVa
33e30 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a  cuum ){.      /*
33e40 20 54 68 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f   The cell may co
33e50 6e 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20  ntain a pointer 
33e60 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  to an overflow p
33e70 61 67 65 2e 20 49 66 20 73 6f 2c 20 77 72 69 74  age. If so, writ
33e80 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65  e.      ** the e
33e90 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65  ntry for the ove
33ea0 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f 20  rflow page into 
33eb0 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
33ec0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
33ed0 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
33ee0 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70  (pPage, pCell, p
33ef0 52 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  RC);.    }.#endi
33f00 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  f.  }.}../*.** A
33f10 72 72 61 79 20 61 70 43 65 6c 6c 5b 5d 20 63 6f  rray apCell[] co
33f20 6e 74 61 69 6e 73 20 70 6f 69 6e 74 65 72 73 20  ntains pointers 
33f30 74 6f 20 6e 43 65 6c 6c 20 62 2d 74 72 65 65 20  to nCell b-tree 
33f40 70 61 67 65 20 63 65 6c 6c 73 2e 20 54 68 65 20  page cells. The 
33f50 0a 2a 2a 20 73 7a 43 65 6c 6c 5b 5d 20 61 72 72  .** szCell[] arr
33f60 61 79 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ay contains the 
33f70 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66  size in bytes of
33f80 20 65 61 63 68 20 63 65 6c 6c 2e 20 54 68 69 73   each cell. This
33f90 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65 70   function.** rep
33fa0 6c 61 63 65 73 20 74 68 65 20 63 75 72 72 65 6e  laces the curren
33fb0 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 61  t contents of pa
33fc0 67 65 20 70 50 67 20 77 69 74 68 20 74 68 65 20  ge pPg with the 
33fd0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
33fe0 63 65 6c 6c 0a 2a 2a 20 61 72 72 61 79 2e 0a 2a  cell.** array..*
33ff0 2a 0a 2a 2a 20 53 6f 6d 65 20 6f 66 20 74 68 65  *.** Some of the
34000 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
34010 5b 5d 20 6d 61 79 20 63 75 72 72 65 6e 74 6c 79  [] may currently
34020 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 70 50   be stored in pP
34030 67 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  g. This.** funct
34040 69 6f 6e 20 77 6f 72 6b 73 20 61 72 6f 75 6e 64  ion works around
34050 20 70 72 6f 62 6c 65 6d 73 20 63 61 75 73 65 64   problems caused
34060 20 62 79 20 74 68 69 73 20 62 79 20 6d 61 6b 69   by this by maki
34070 6e 67 20 61 20 63 6f 70 79 20 6f 66 20 61 6e 79  ng a copy of any
34080 20 0a 2a 2a 20 73 75 63 68 20 63 65 6c 6c 73 20   .** such cells 
34090 62 65 66 6f 72 65 20 6f 76 65 72 77 72 69 74 69  before overwriti
340a0 6e 67 20 74 68 65 20 70 61 67 65 20 64 61 74 61  ng the page data
340b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4d 65 6d 50  ..**.** The MemP
340c0 61 67 65 2e 6e 46 72 65 65 20 66 69 65 6c 64 20  age.nFree field 
340d0 69 73 20 69 6e 76 61 6c 69 64 61 74 65 64 20 62  is invalidated b
340e0 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
340f0 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72   It is the .** r
34100 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
34110 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 73   the caller to s
34120 65 74 20 69 74 20 63 6f 72 72 65 63 74 6c 79 2e  et it correctly.
34130 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
34140 72 65 62 75 69 6c 64 50 61 67 65 28 0a 20 20 4d  rebuildPage(.  M
34150 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 20 20 20  emPage *pPg,    
34160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
34170 2a 20 45 64 69 74 20 74 68 69 73 20 70 61 67 65  * Edit this page
34180 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c   */.  int nCell,
34190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
341a0 20 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c 20 6e        /* Final n
341b0 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f  umber of cells o
341c0 6e 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  n page */.  u8 *
341d0 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20  *apCell,        
341e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
341f0 72 72 61 79 20 6f 66 20 63 65 6c 6c 73 20 2a 2f  rray of cells */
34200 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 20 20  .  u16 *szCell  
34210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34220 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63     /* Array of c
34230 65 6c 6c 20 73 69 7a 65 73 20 2a 2f 0a 29 7b 0a  ell sizes */.){.
34240 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20    const int hdr 
34250 3d 20 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74  = pPg->hdrOffset
34260 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  ;          /* Of
34270 66 73 65 74 20 6f 66 20 68 65 61 64 65 72 20 6f  fset of header o
34280 6e 20 70 50 67 20 2a 2f 0a 20 20 75 38 20 2a 20  n pPg */.  u8 * 
34290 63 6f 6e 73 74 20 61 44 61 74 61 20 3d 20 70 50  const aData = pP
342a0 67 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 20  g->aData;       
342b0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
342c0 6f 20 64 61 74 61 20 66 6f 72 20 70 50 67 20 2a  o data for pPg *
342d0 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 75 73  /.  const int us
342e0 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 67 2d 3e  ableSize = pPg->
342f0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
34300 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 45  .  u8 * const pE
34310 6e 64 20 3d 20 26 61 44 61 74 61 5b 75 73 61 62  nd = &aData[usab
34320 6c 65 53 69 7a 65 5d 3b 0a 20 20 69 6e 74 20 69  leSize];.  int i
34330 3b 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70 74 72  ;.  u8 *pCellptr
34340 20 3d 20 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78   = pPg->aCellIdx
34350 3b 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d 20 73  ;.  u8 *pTmp = s
34360 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53  qlite3PagerTempS
34370 70 61 63 65 28 70 50 67 2d 3e 70 42 74 2d 3e 70  pace(pPg->pBt->p
34380 50 61 67 65 72 29 3b 0a 20 20 75 38 20 2a 70 44  Pager);.  u8 *pD
34390 61 74 61 3b 0a 0a 20 20 69 20 3d 20 67 65 74 32  ata;..  i = get2
343a0 62 79 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b  byte(&aData[hdr+
343b0 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70  5]);.  memcpy(&p
343c0 54 6d 70 5b 69 5d 2c 20 26 61 44 61 74 61 5b 69  Tmp[i], &aData[i
343d0 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  ], usableSize - 
343e0 69 29 3b 0a 0a 20 20 70 44 61 74 61 20 3d 20 70  i);..  pData = p
343f0 45 6e 64 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  End;.  for(i=0; 
34400 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
34410 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 61     u8 *pCell = a
34420 70 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 69 66  pCell[i];.    if
34430 28 20 70 43 65 6c 6c 3e 61 44 61 74 61 20 26 26  ( pCell>aData &&
34440 20 70 43 65 6c 6c 3c 70 45 6e 64 20 29 7b 0a 20   pCell<pEnd ){. 
34450 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 26 70 54       pCell = &pT
34460 6d 70 5b 70 43 65 6c 6c 20 2d 20 61 44 61 74 61  mp[pCell - aData
34470 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 61  ];.    }.    pDa
34480 74 61 20 2d 3d 20 73 7a 43 65 6c 6c 5b 69 5d 3b  ta -= szCell[i];
34490 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74  .    memcpy(pDat
344a0 61 2c 20 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c  a, pCell, szCell
344b0 5b 69 5d 29 3b 0a 20 20 20 20 70 75 74 32 62 79  [i]);.    put2by
344c0 74 65 28 70 43 65 6c 6c 70 74 72 2c 20 28 70 44  te(pCellptr, (pD
344d0 61 74 61 20 2d 20 61 44 61 74 61 29 29 3b 0a 20  ata - aData));. 
344e0 20 20 20 70 43 65 6c 6c 70 74 72 20 2b 3d 20 32     pCellptr += 2
344f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 7a  ;.    assert( sz
34500 43 65 6c 6c 5b 69 5d 3d 3d 63 65 6c 6c 53 69 7a  Cell[i]==cellSiz
34510 65 50 74 72 28 70 50 67 2c 20 70 43 65 6c 6c 29  ePtr(pPg, pCell)
34520 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68   );.  }..  /* Th
34530 65 20 70 50 67 2d 3e 6e 46 72 65 65 20 66 69 65  e pPg->nFree fie
34540 6c 64 20 69 73 20 6e 6f 77 20 73 65 74 20 69 6e  ld is now set in
34550 63 6f 72 72 65 63 74 6c 79 2e 20 54 68 65 20 63  correctly. The c
34560 61 6c 6c 65 72 20 77 69 6c 6c 20 66 69 78 20 69  aller will fix i
34570 74 2e 20 2a 2f 0a 20 20 70 50 67 2d 3e 6e 43 65  t. */.  pPg->nCe
34580 6c 6c 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 70 50  ll = nCell;.  pP
34590 67 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  g->nOverflow = 0
345a0 3b 0a 0a 20 20 70 75 74 32 62 79 74 65 28 26 61  ;..  put2byte(&a
345b0 44 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 29 3b  Data[hdr+1], 0);
345c0 0a 20 20 70 75 74 32 62 79 74 65 28 26 61 44 61  .  put2byte(&aDa
345d0 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 67 2d 3e  ta[hdr+3], pPg->
345e0 6e 43 65 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79  nCell);.  put2by
345f0 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b 35 5d  te(&aData[hdr+5]
34600 2c 20 70 44 61 74 61 20 2d 20 61 44 61 74 61 29  , pData - aData)
34610 3b 0a 20 20 61 44 61 74 61 5b 68 64 72 2b 37 5d  ;.  aData[hdr+7]
34620 20 3d 20 30 78 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a   = 0x00;.}../*.*
34630 2a 20 41 72 72 61 79 20 61 70 43 65 6c 6c 5b 5d  * Array apCell[]
34640 20 63 6f 6e 74 61 69 6e 73 20 6e 43 65 6c 6c 20   contains nCell 
34650 70 6f 69 6e 74 65 72 73 20 74 6f 20 62 2d 74 72  pointers to b-tr
34660 65 65 20 63 65 6c 6c 73 2e 20 41 72 72 61 79 20  ee cells. Array 
34670 73 7a 43 65 6c 6c 0a 2a 2a 20 63 6f 6e 74 61 69  szCell.** contai
34680 6e 73 20 74 68 65 20 73 69 7a 65 20 69 6e 20 62  ns the size in b
34690 79 74 65 73 20 6f 66 20 65 61 63 68 20 73 75 63  ytes of each suc
346a0 68 20 63 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e  h cell. This fun
346b0 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
346c0 6f 20 0a 2a 2a 20 61 64 64 20 74 68 65 20 63 65  o .** add the ce
346d0 6c 6c 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68  lls stored in th
346e0 65 20 61 72 72 61 79 20 74 6f 20 70 61 67 65 20  e array to page 
346f0 70 50 67 2e 20 49 66 20 69 74 20 63 61 6e 6e 6f  pPg. If it canno
34700 74 20 28 62 65 63 61 75 73 65 20 0a 2a 2a 20 74  t (because .** t
34710 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f  he page needs to
34720 20 62 65 20 64 65 66 72 61 67 6d 65 6e 74 65 64   be defragmented
34730 20 62 65 66 6f 72 65 20 74 68 65 20 63 65 6c 6c   before the cell
34740 73 20 77 69 6c 6c 20 66 69 74 29 2c 20 6e 6f 6e  s will fit), non
34750 2d 7a 65 72 6f 0a 2a 2a 20 69 73 20 72 65 74 75  -zero.** is retu
34760 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
34770 20 69 66 20 74 68 65 20 63 65 6c 6c 73 20 61 72   if the cells ar
34780 65 20 61 64 64 65 64 20 73 75 63 63 65 73 73 66  e added successf
34790 75 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 0a 2a 2a  ully, zero is.**
347a0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
347b0 20 41 72 67 75 6d 65 6e 74 20 70 43 65 6c 6c 70   Argument pCellp
347c0 74 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  tr points to the
347d0 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
347e0 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72  the cell-pointer
347f0 20 61 72 72 61 79 0a 2a 2a 20 28 70 61 72 74 20   array.** (part 
34800 6f 66 20 70 61 67 65 20 70 50 67 29 20 74 6f 20  of page pPg) to 
34810 70 6f 70 75 6c 61 74 65 2e 20 41 66 74 65 72 20  populate. After 
34820 63 65 6c 6c 20 61 70 43 65 6c 6c 5b 30 5d 20 69  cell apCell[0] i
34830 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
34840 0a 2a 2a 20 70 61 67 65 20 62 6f 64 79 2c 20 61  .** page body, a
34850 20 31 36 2d 62 69 74 20 6f 66 66 73 65 74 20 69   16-bit offset i
34860 73 20 77 72 69 74 74 65 6e 20 74 6f 20 70 43 65  s written to pCe
34870 6c 6c 70 74 72 2e 20 41 6e 64 20 73 6f 20 6f 6e  llptr. And so on
34880 2c 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 65  , for each.** ce
34890 6c 6c 20 69 6e 20 74 68 65 20 61 72 72 61 79 2e  ll in the array.
348a0 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   It is the respo
348b0 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
348c0 20 63 61 6c 6c 65 72 20 74 6f 20 65 6e 73 75 72   caller to ensur
348d0 65 0a 2a 2a 20 74 68 61 74 20 69 74 20 69 73 20  e.** that it is 
348e0 73 61 66 65 20 74 6f 20 6f 76 65 72 77 72 69 74  safe to overwrit
348f0 65 20 74 68 69 73 20 70 61 72 74 20 6f 66 20 74  e this part of t
34900 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20  he cell-pointer 
34910 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  array..**.** Whe
34920 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
34930 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70 70 44 61  is called, *ppDa
34940 74 61 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ta points to the
34950 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 0a 2a   start of the .*
34960 2a 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 6f  * content area o
34970 6e 20 70 61 67 65 20 70 50 67 2e 20 49 66 20 74  n page pPg. If t
34980 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 63  he size of the c
34990 6f 6e 74 65 6e 74 20 61 72 65 61 20 69 73 20 65  ontent area is e
349a0 78 74 65 6e 64 65 64 2c 0a 2a 2a 20 2a 70 70 44  xtended,.** *ppD
349b0 61 74 61 20 69 73 20 75 70 64 61 74 65 64 20 74  ata is updated t
349c0 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e  o point to the n
349d0 65 77 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  ew start of the 
349e0 63 6f 6e 74 65 6e 74 20 61 72 65 61 0a 2a 2a 20  content area.** 
349f0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
34a00 2e 0a 2a 2a 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c  ..**.** Finally,
34a10 20 61 72 67 75 6d 65 6e 74 20 70 42 65 67 69 6e   argument pBegin
34a20 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 62   points to the b
34a30 79 74 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  yte immediately 
34a40 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 0a 2a 2a  following the.**
34a50 20 65 6e 64 20 6f 66 20 74 68 65 20 73 70 61 63   end of the spac
34a60 65 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68  e required by th
34a70 69 73 20 70 61 67 65 20 66 6f 72 20 74 68 65 20  is page for the 
34a80 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 65  cell-pointer are
34a90 61 20 28 66 6f 72 0a 2a 2a 20 61 6c 6c 20 63 65  a (for.** all ce
34aa0 6c 6c 73 20 2d 20 6e 6f 74 20 6a 75 73 74 20 74  lls - not just t
34ab0 68 6f 73 65 20 69 6e 73 65 72 74 65 64 20 62 79  hose inserted by
34ac0 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 61 6c   the current cal
34ad0 6c 29 2e 20 49 66 20 74 68 65 20 63 6f 6e 74 65  l). If the conte
34ae0 6e 74 0a 2a 2a 20 61 72 65 61 20 6d 75 73 74 20  nt.** area must 
34af0 62 65 20 65 78 74 65 6e 64 65 64 20 74 6f 20 62  be extended to b
34b00 65 66 6f 72 65 20 74 68 69 73 20 70 6f 69 6e 74  efore this point
34b10 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 63 63   in order to acc
34b20 6f 6d 6f 64 61 74 65 20 61 6c 6c 0a 2a 2a 20 63  omodate all.** c
34b30 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ells in apCell[]
34b40 2c 20 74 68 65 6e 20 74 68 65 20 63 65 6c 6c 73  , then the cells
34b50 20 64 6f 20 6e 6f 74 20 66 69 74 20 61 6e 64 20   do not fit and 
34b60 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75  non-zero is retu
34b70 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
34b80 69 6e 74 20 70 61 67 65 49 6e 73 65 72 74 41 72  int pageInsertAr
34b90 72 61 79 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ray(.  MemPage *
34ba0 70 50 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  pPg,            
34bb0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74         /* Page t
34bc0 6f 20 61 64 64 20 63 65 6c 6c 73 20 74 6f 20 2a  o add cells to *
34bd0 2f 0a 20 20 75 38 20 2a 70 42 65 67 69 6e 2c 20  /.  u8 *pBegin, 
34be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34bf0 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 63 65      /* End of ce
34c00 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll-pointer array
34c10 20 2a 2f 0a 20 20 75 38 20 2a 2a 70 70 44 61 74   */.  u8 **ppDat
34c20 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a,              
34c30 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
34c40 20 50 61 67 65 20 63 6f 6e 74 65 6e 74 20 2d 61   Page content -a
34c50 72 65 61 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  rea pointer */. 
34c60 20 75 38 20 2a 70 43 65 6c 6c 70 74 72 2c 20 20   u8 *pCellptr,  
34c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34c80 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63   /* Pointer to c
34c90 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 65 61  ell-pointer area
34ca0 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c   */.  int nCell,
34cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34cc0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
34cd0 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 64 64 20  of cells to add 
34ce0 74 6f 20 70 50 67 20 2a 2f 0a 20 20 75 38 20 2a  to pPg */.  u8 *
34cf0 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20  *apCell,        
34d00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
34d10 72 72 61 79 20 6f 66 20 63 65 6c 6c 73 20 2a 2f  rray of cells */
34d20 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 20 20  .  u16 *szCell  
34d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34d40 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63     /* Array of c
34d50 65 6c 6c 20 73 69 7a 65 73 20 2a 2f 0a 29 7b 0a  ell sizes */.){.
34d60 20 20 69 6e 74 20 69 3b 0a 20 20 75 38 20 2a 61    int i;.  u8 *a
34d70 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74  Data = pPg->aDat
34d80 61 3b 0a 20 20 75 38 20 2a 70 44 61 74 61 20 3d  a;.  u8 *pData =
34d90 20 2a 70 70 44 61 74 61 3b 0a 20 20 63 6f 6e 73   *ppData;.  cons
34da0 74 20 69 6e 74 20 62 46 72 65 65 6c 69 73 74 20  t int bFreelist 
34db0 3d 20 61 44 61 74 61 5b 31 5d 20 7c 7c 20 61 44  = aData[1] || aD
34dc0 61 74 61 5b 32 5d 3b 0a 20 20 61 73 73 65 72 74  ata[2];.  assert
34dd0 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
34de0 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d  pPg->hdrOffset==
34df0 30 20 29 3b 20 20 20 20 2f 2a 20 4e 65 76 65 72  0 );    /* Never
34e00 20 63 61 6c 6c 65 64 20 6f 6e 20 70 61 67 65 20   called on page 
34e10 31 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  1 */.  for(i=0; 
34e20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
34e30 20 20 20 69 6e 74 20 73 7a 20 3d 20 73 7a 43 65     int sz = szCe
34e40 6c 6c 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 72  ll[i];.    int r
34e50 63 3b 0a 20 20 20 20 75 38 20 2a 70 53 6c 6f 74  c;.    u8 *pSlot
34e60 3b 0a 20 20 20 20 69 66 28 20 62 46 72 65 65 6c  ;.    if( bFreel
34e70 69 73 74 3d 3d 30 20 7c 7c 20 28 70 53 6c 6f 74  ist==0 || (pSlot
34e80 20 3d 20 70 61 67 65 46 69 6e 64 53 6c 6f 74 28   = pageFindSlot(
34e90 70 50 67 2c 20 73 7a 2c 20 26 72 63 2c 20 30 29  pPg, sz, &rc, 0)
34ea0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 44  )==0 ){.      pD
34eb0 61 74 61 20 2d 3d 20 73 7a 3b 0a 20 20 20 20 20  ata -= sz;.     
34ec0 20 69 66 28 20 70 44 61 74 61 3c 70 42 65 67 69   if( pData<pBegi
34ed0 6e 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  n ) return 1;.  
34ee0 20 20 20 20 70 53 6c 6f 74 20 3d 20 70 44 61 74      pSlot = pDat
34ef0 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  a;.    }.    mem
34f00 63 70 79 28 70 53 6c 6f 74 2c 20 61 70 43 65 6c  cpy(pSlot, apCel
34f10 6c 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 70  l[i], sz);.    p
34f20 75 74 32 62 79 74 65 28 70 43 65 6c 6c 70 74 72  ut2byte(pCellptr
34f30 2c 20 28 70 53 6c 6f 74 20 2d 20 61 44 61 74 61  , (pSlot - aData
34f40 29 29 3b 0a 20 20 20 20 70 43 65 6c 6c 70 74 72  ));.    pCellptr
34f50 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20 2a 70 70   += 2;.  }.  *pp
34f60 44 61 74 61 20 3d 20 70 44 61 74 61 3b 0a 20 20  Data = pData;.  
34f70 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
34f80 2a 2a 20 41 72 72 61 79 20 61 70 43 65 6c 6c 5b  ** Array apCell[
34f90 5d 20 63 6f 6e 74 61 69 6e 73 20 6e 43 65 6c 6c  ] contains nCell
34fa0 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 62 2d 74   pointers to b-t
34fb0 72 65 65 20 63 65 6c 6c 73 2e 20 41 72 72 61 79  ree cells. Array
34fc0 20 73 7a 43 65 6c 6c 20 0a 2a 2a 20 63 6f 6e 74   szCell .** cont
34fd0 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 69 6e  ains the size in
34fe0 20 62 79 74 65 73 20 6f 66 20 65 61 63 68 20 73   bytes of each s
34ff0 75 63 68 20 63 65 6c 6c 2e 20 54 68 69 73 20 66  uch cell. This f
35000 75 6e 63 74 69 6f 6e 20 61 64 64 73 20 74 68 65  unction adds the
35010 0a 2a 2a 20 73 70 61 63 65 20 61 73 73 6f 63 69  .** space associ
35020 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20 63  ated with each c
35030 65 6c 6c 20 69 6e 20 74 68 65 20 61 72 72 61 79  ell in the array
35040 20 74 68 61 74 20 69 73 20 63 75 72 72 65 6e 74   that is current
35050 6c 79 20 73 74 6f 72 65 64 20 0a 2a 2a 20 77 69  ly stored .** wi
35060 74 68 69 6e 20 74 68 65 20 62 6f 64 79 20 6f 66  thin the body of
35070 20 70 50 67 20 74 6f 20 74 68 65 20 70 50 67 20   pPg to the pPg 
35080 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 65 20 63  free-list. The c
35090 65 6c 6c 2d 70 6f 69 6e 74 65 72 73 20 61 6e 64  ell-pointers and
350a0 20 6f 74 68 65 72 0a 2a 2a 20 66 69 65 6c 64 73   other.** fields
350b0 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 72 65   of the page are
350c0 20 6e 6f 74 20 75 70 64 61 74 65 64 2e 0a 2a 2a   not updated..**
350d0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
350e0 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 74 6f  n returns the to
350f0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63 65  tal number of ce
35100 6c 6c 73 20 61 64 64 65 64 20 74 6f 20 74 68 65  lls added to the
35110 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2f 0a 73   free-list..*/.s
35120 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 46 72  tatic int pageFr
35130 65 65 41 72 72 61 79 28 0a 20 20 4d 65 6d 50 61  eeArray(.  MemPa
35140 67 65 20 2a 70 50 67 2c 20 20 20 20 20 20 20 20  ge *pPg,        
35150 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
35160 67 65 20 74 6f 20 65 64 69 74 20 2a 2f 0a 20 20  ge to edit */.  
35170 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20  int nCell,      
35180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35190 2f 2a 20 43 65 6c 6c 73 20 74 6f 20 64 65 6c 65  /* Cells to dele
351a0 74 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43  te */.  u8 **apC
351b0 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
351c0 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
351d0 20 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 75   of cells */.  u
351e0 31 36 20 2a 73 7a 43 65 6c 6c 20 20 20 20 20 20  16 *szCell      
351f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
35200 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 20  * Array of cell 
35210 73 69 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38  sizes */.){.  u8
35220 20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61 20 3d   * const aData =
35230 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20 75   pPg->aData;.  u
35240 38 20 2a 20 63 6f 6e 73 74 20 70 45 6e 64 20 3d  8 * const pEnd =
35250 20 26 61 44 61 74 61 5b 70 50 67 2d 3e 70 42 74   &aData[pPg->pBt
35260 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20  ->usableSize];. 
35270 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 53 74 61   u8 * const pSta
35280 72 74 20 3d 20 26 61 44 61 74 61 5b 70 50 67 2d  rt = &aData[pPg-
35290 3e 68 64 72 4f 66 66 73 65 74 20 2b 20 38 20 2b  >hdrOffset + 8 +
352a0 20 70 50 67 2d 3e 63 68 69 6c 64 50 74 72 53 69   pPg->childPtrSi
352b0 7a 65 5d 3b 0a 20 20 69 6e 74 20 6e 52 65 74 20  ze];.  int nRet 
352c0 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  = 0;.  int i;.  
352d0 75 38 20 2a 70 46 72 65 65 20 3d 20 30 3b 0a 20  u8 *pFree = 0;. 
352e0 20 69 6e 74 20 73 7a 46 72 65 65 20 3d 20 30 3b   int szFree = 0;
352f0 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ..  for(i=0; i<n
35300 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
35310 75 38 20 2a 70 43 65 6c 6c 20 3d 20 61 70 43 65  u8 *pCell = apCe
35320 6c 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  ll[i];.    if( p
35330 43 65 6c 6c 3e 3d 70 53 74 61 72 74 20 26 26 20  Cell>=pStart && 
35340 70 43 65 6c 6c 3c 70 45 6e 64 20 29 7b 0a 20 20  pCell<pEnd ){.  
35350 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 73 7a 43      int sz = szC
35360 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  ell[i];.      if
35370 28 20 70 46 72 65 65 21 3d 28 70 43 65 6c 6c 20  ( pFree!=(pCell 
35380 2b 20 73 7a 29 20 29 7b 0a 20 20 20 20 20 20 20  + sz) ){.       
35390 20 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20 20   if( pFree ){.  
353a0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
353b0 70 46 72 65 65 3e 61 44 61 74 61 20 26 26 20 28  pFree>aData && (
353c0 70 46 72 65 65 20 2d 20 61 44 61 74 61 29 3c 36  pFree - aData)<6
353d0 35 35 33 36 20 29 3b 0a 20 20 20 20 20 20 20 20  5536 );.        
353e0 20 20 66 72 65 65 53 70 61 63 65 28 70 50 67 2c    freeSpace(pPg,
353f0 20 28 75 31 36 29 28 70 46 72 65 65 20 2d 20 61   (u16)(pFree - a
35400 44 61 74 61 29 2c 20 73 7a 46 72 65 65 29 3b 0a  Data), szFree);.
35410 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35420 20 20 70 46 72 65 65 20 3d 20 70 43 65 6c 6c 3b    pFree = pCell;
35430 0a 20 20 20 20 20 20 20 20 73 7a 46 72 65 65 20  .        szFree 
35440 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 69 66  = sz;.        if
35450 28 20 70 46 72 65 65 2b 73 7a 3e 70 45 6e 64 20  ( pFree+sz>pEnd 
35460 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
35470 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
35480 20 70 46 72 65 65 20 3d 20 70 43 65 6c 6c 3b 0a   pFree = pCell;.
35490 20 20 20 20 20 20 20 20 73 7a 46 72 65 65 20 2b          szFree +
354a0 3d 20 73 7a 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = sz;.      }.  
354b0 20 20 20 20 6e 52 65 74 2b 2b 3b 0a 20 20 20 20      nRet++;.    
354c0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 72 65  }.  }.  if( pFre
354d0 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
354e0 20 70 46 72 65 65 3e 61 44 61 74 61 20 26 26 20   pFree>aData && 
354f0 28 70 46 72 65 65 20 2d 20 61 44 61 74 61 29 3c  (pFree - aData)<
35500 36 35 35 33 36 20 29 3b 0a 20 20 20 20 66 72 65  65536 );.    fre
35510 65 53 70 61 63 65 28 70 50 67 2c 20 28 75 31 36  eSpace(pPg, (u16
35520 29 28 70 46 72 65 65 20 2d 20 61 44 61 74 61 29  )(pFree - aData)
35530 2c 20 73 7a 46 72 65 65 29 3b 0a 20 20 7d 0a 20  , szFree);.  }. 
35540 20 72 65 74 75 72 6e 20 6e 52 65 74 3b 0a 7d 0a   return nRet;.}.
35550 0a 2f 2a 0a 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20  ./*.** apCell[] 
35560 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 63 6f 6e  and szCell[] con
35570 74 61 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74  tains pointers t
35580 6f 20 61 6e 64 20 73 69 7a 65 73 20 6f 66 20 61  o and sizes of a
35590 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 74 68 65 0a  ll cells in the.
355a0 2a 2a 20 70 61 67 65 73 20 62 65 69 6e 67 20 62  ** pages being b
355b0 61 6c 61 6e 63 65 64 2e 20 20 54 68 65 20 63 75  alanced.  The cu
355c0 72 72 65 6e 74 20 70 61 67 65 2c 20 70 50 67 2c  rrent page, pPg,
355d0 20 68 61 73 20 70 50 67 2d 3e 6e 43 65 6c 6c 20   has pPg->nCell 
355e0 63 65 6c 6c 73 20 73 74 61 72 74 69 6e 67 0a 2a  cells starting.*
355f0 2a 20 77 69 74 68 20 61 70 43 65 6c 6c 5b 69 4f  * with apCell[iO
35600 6c 64 5d 2e 20 20 41 66 74 65 72 20 62 61 6c 61  ld].  After bala
35610 6e 63 69 6e 67 2c 20 74 68 69 73 20 70 61 67 65  ncing, this page
35620 20 73 68 6f 75 6c 64 20 68 6f 6c 64 20 6e 4e 65   should hold nNe
35630 77 20 63 65 6c 6c 73 0a 2a 2a 20 73 74 61 72 74  w cells.** start
35640 69 6e 67 20 61 74 20 61 70 43 65 6c 6c 5b 69 4e  ing at apCell[iN
35650 65 77 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ew]..**.** This 
35660 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 74 68  routine makes th
35670 65 20 6e 65 63 65 73 73 61 72 79 20 61 64 6a 75  e necessary adju
35680 73 74 6d 65 6e 74 73 20 74 6f 20 70 50 67 20 73  stments to pPg s
35690 6f 20 74 68 61 74 20 69 74 20 63 6f 6e 74 61 69  o that it contai
356a0 6e 73 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63  ns.** the correc
356b0 74 20 63 65 6c 6c 73 20 61 66 74 65 72 20 62 65  t cells after be
356c0 69 6e 67 20 62 61 6c 61 6e 63 65 64 2e 0a 2a 2a  ing balanced..**
356d0 0a 2a 2a 20 54 68 65 20 70 50 67 2d 3e 6e 46 72  .** The pPg->nFr
356e0 65 65 20 66 69 65 6c 64 20 69 73 20 69 6e 76 61  ee field is inva
356f0 6c 69 64 20 77 68 65 6e 20 74 68 69 73 20 66 75  lid when this fu
35700 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20  nction returns. 
35710 49 74 20 69 73 20 74 68 65 0a 2a 2a 20 72 65 73  It is the.** res
35720 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
35730 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 73 65 74  he caller to set
35740 20 69 74 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a   it correctly..*
35750 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 64  /.static void ed
35760 69 74 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67  itPage(.  MemPag
35770 65 20 2a 70 50 67 2c 20 20 20 20 20 20 20 20 20  e *pPg,         
35780 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 64 69            /* Edi
35790 74 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  t this page */. 
357a0 20 69 6e 74 20 69 4f 6c 64 2c 20 20 20 20 20 20   int iOld,      
357b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
357c0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72   /* Index of fir
357d0 73 74 20 63 65 6c 6c 20 63 75 72 72 65 6e 74 6c  st cell currentl
357e0 79 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20 69  y on page */.  i
357f0 6e 74 20 69 4e 65 77 2c 20 20 20 20 20 20 20 20  nt iNew,        
35800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
35810 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65 77 20 66  * Index of new f
35820 69 72 73 74 20 63 65 6c 6c 20 6f 6e 20 70 61 67  irst cell on pag
35830 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 2c  e */.  int nNew,
35840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35850 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c 20         /* Final 
35860 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  number of cells 
35870 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  on page */.  u8 
35880 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  **apCell,       
35890 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
358a0 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 73 20 2a  Array of cells *
358b0 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 20  /.  u16 *szCell 
358c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
358d0 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
358e0 63 65 6c 6c 20 73 69 7a 65 73 20 2a 2f 0a 29 7b  cell sizes */.){
358f0 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44  .  u8 * const aD
35900 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61  ata = pPg->aData
35910 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64  ;.  const int hd
35920 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f 66 66 73  r = pPg->hdrOffs
35930 65 74 3b 0a 20 20 75 38 20 2a 70 42 65 67 69 6e  et;.  u8 *pBegin
35940 20 3d 20 26 70 50 67 2d 3e 61 43 65 6c 6c 49 64   = &pPg->aCellId
35950 78 5b 6e 4e 65 77 20 2a 20 32 5d 3b 0a 20 20 69  x[nNew * 2];.  i
35960 6e 74 20 6e 43 65 6c 6c 20 3d 20 70 50 67 2d 3e  nt nCell = pPg->
35970 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 2f 2a 20  nCell;       /* 
35980 43 65 6c 6c 73 20 73 74 6f 72 65 64 20 6f 6e 20  Cells stored on 
35990 70 50 67 20 2a 2f 0a 20 20 75 38 20 2a 70 44 61  pPg */.  u8 *pDa
359a0 74 61 3b 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70  ta;.  u8 *pCellp
359b0 74 72 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  tr;.  int i;.  i
359c0 6e 74 20 69 4f 6c 64 45 6e 64 20 3d 20 69 4f 6c  nt iOldEnd = iOl
359d0 64 20 2b 20 70 50 67 2d 3e 6e 43 65 6c 6c 20 2b  d + pPg->nCell +
359e0 20 70 50 67 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b   pPg->nOverflow;
359f0 0a 20 20 69 6e 74 20 69 4e 65 77 45 6e 64 20 3d  .  int iNewEnd =
35a00 20 69 4e 65 77 20 2b 20 6e 4e 65 77 3b 0a 0a 23   iNew + nNew;..#
35a10 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
35a20 55 47 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d 20  UG.  u8 *pTmp = 
35a30 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70  sqlite3PagerTemp
35a40 53 70 61 63 65 28 70 50 67 2d 3e 70 42 74 2d 3e  Space(pPg->pBt->
35a50 70 50 61 67 65 72 29 3b 0a 20 20 6d 65 6d 63 70  pPager);.  memcp
35a60 79 28 70 54 6d 70 2c 20 61 44 61 74 61 2c 20 70  y(pTmp, aData, p
35a70 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  Pg->pBt->usableS
35a80 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  ize);.#endif..  
35a90 2f 2a 20 52 65 6d 6f 76 65 20 63 65 6c 6c 73 20  /* Remove cells 
35aa0 66 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20 61  from the start a
35ab0 6e 64 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  nd end of the pa
35ac0 67 65 20 2a 2f 0a 20 20 69 66 28 20 69 4f 6c 64  ge */.  if( iOld
35ad0 3c 69 4e 65 77 20 29 7b 0a 20 20 20 20 69 6e 74  <iNew ){.    int
35ae0 20 6e 53 68 69 66 74 20 3d 20 70 61 67 65 46 72   nShift = pageFr
35af0 65 65 41 72 72 61 79 28 0a 20 20 20 20 20 20 20  eeArray(.       
35b00 20 70 50 67 2c 20 69 4e 65 77 2d 69 4f 6c 64 2c   pPg, iNew-iOld,
35b10 20 26 61 70 43 65 6c 6c 5b 69 4f 6c 64 5d 2c 20   &apCell[iOld], 
35b20 26 73 7a 43 65 6c 6c 5b 69 4f 6c 64 5d 0a 20 20  &szCell[iOld].  
35b30 20 20 29 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65    );.    memmove
35b40 28 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 2c 20  (pPg->aCellIdx, 
35b50 26 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 5b 6e  &pPg->aCellIdx[n
35b60 53 68 69 66 74 2a 32 5d 2c 20 6e 43 65 6c 6c 2a  Shift*2], nCell*
35b70 32 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 2d 3d  2);.    nCell -=
35b80 20 6e 53 68 69 66 74 3b 0a 20 20 7d 0a 20 20 69   nShift;.  }.  i
35b90 66 28 20 69 4e 65 77 45 6e 64 20 3c 20 69 4f 6c  f( iNewEnd < iOl
35ba0 64 45 6e 64 20 29 7b 0a 20 20 20 20 6e 43 65 6c  dEnd ){.    nCel
35bb0 6c 20 2d 3d 20 70 61 67 65 46 72 65 65 41 72 72  l -= pageFreeArr
35bc0 61 79 28 0a 20 20 20 20 20 20 20 20 70 50 67 2c  ay(.        pPg,
35bd0 20 69 4f 6c 64 45 6e 64 2d 69 4e 65 77 45 6e 64   iOldEnd-iNewEnd
35be0 2c 20 26 61 70 43 65 6c 6c 5b 69 4e 65 77 45 6e  , &apCell[iNewEn
35bf0 64 5d 2c 20 26 73 7a 43 65 6c 6c 5b 69 4e 65 77  d], &szCell[iNew
35c00 45 6e 64 5d 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  End].    );.  }.
35c10 0a 20 20 70 44 61 74 61 20 3d 20 26 61 44 61 74  .  pData = &aDat
35c20 61 5b 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  a[get2byteNotZer
35c30 6f 28 26 61 44 61 74 61 5b 68 64 72 2b 35 5d 29  o(&aData[hdr+5])
35c40 5d 3b 0a 20 20 69 66 28 20 70 44 61 74 61 3c 70  ];.  if( pData<p
35c50 42 65 67 69 6e 20 29 20 67 6f 74 6f 20 65 64 69  Begin ) goto edi
35c60 74 70 61 67 65 5f 66 61 69 6c 3b 0a 0a 20 20 2f  tpage_fail;..  /
35c70 2a 20 41 64 64 20 63 65 6c 6c 73 20 74 6f 20 74  * Add cells to t
35c80 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
35c90 70 61 67 65 20 2a 2f 0a 20 20 69 66 28 20 69 4e  page */.  if( iN
35ca0 65 77 3c 69 4f 6c 64 20 29 7b 0a 20 20 20 20 69  ew<iOld ){.    i
35cb0 6e 74 20 6e 41 64 64 20 3d 20 4d 49 4e 28 6e 4e  nt nAdd = MIN(nN
35cc0 65 77 2c 69 4f 6c 64 2d 69 4e 65 77 29 3b 0a 20  ew,iOld-iNew);. 
35cd0 20 20 20 61 73 73 65 72 74 28 20 28 69 4f 6c 64     assert( (iOld
35ce0 2d 69 4e 65 77 29 3c 6e 4e 65 77 20 7c 7c 20 6e  -iNew)<nNew || n
35cf0 43 65 6c 6c 3d 3d 30 20 7c 7c 20 43 4f 52 52 55  Cell==0 || CORRU
35d00 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 70 43 65  PT_DB );.    pCe
35d10 6c 6c 70 74 72 20 3d 20 70 50 67 2d 3e 61 43 65  llptr = pPg->aCe
35d20 6c 6c 49 64 78 3b 0a 20 20 20 20 6d 65 6d 6d 6f  llIdx;.    memmo
35d30 76 65 28 26 70 43 65 6c 6c 70 74 72 5b 6e 41 64  ve(&pCellptr[nAd
35d40 64 2a 32 5d 2c 20 70 43 65 6c 6c 70 74 72 2c 20  d*2], pCellptr, 
35d50 6e 43 65 6c 6c 2a 32 29 3b 0a 20 20 20 20 69 66  nCell*2);.    if
35d60 28 20 70 61 67 65 49 6e 73 65 72 74 41 72 72 61  ( pageInsertArra
35d70 79 28 0a 20 20 20 20 20 20 20 20 20 20 70 50 67  y(.          pPg
35d80 2c 20 70 42 65 67 69 6e 2c 20 26 70 44 61 74 61  , pBegin, &pData
35d90 2c 20 70 43 65 6c 6c 70 74 72 2c 0a 20 20 20 20  , pCellptr,.    
35da0 20 20 20 20 20 20 6e 41 64 64 2c 20 26 61 70 43        nAdd, &apC
35db0 65 6c 6c 5b 69 4e 65 77 5d 2c 20 26 73 7a 43 65  ell[iNew], &szCe
35dc0 6c 6c 5b 69 4e 65 77 5d 0a 20 20 20 20 29 20 29  ll[iNew].    ) )
35dd0 20 67 6f 74 6f 20 65 64 69 74 70 61 67 65 5f 66   goto editpage_f
35de0 61 69 6c 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 2b  ail;.    nCell +
35df0 3d 20 6e 41 64 64 3b 0a 20 20 7d 0a 0a 20 20 2f  = nAdd;.  }..  /
35e00 2a 20 41 64 64 20 61 6e 79 20 6f 76 65 72 66 6c  * Add any overfl
35e10 6f 77 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 66 6f  ow cells */.  fo
35e20 72 28 69 3d 30 3b 20 69 3c 70 50 67 2d 3e 6e 4f  r(i=0; i<pPg->nO
35e30 76 65 72 66 6c 6f 77 3b 20 69 2b 2b 29 7b 0a 20  verflow; i++){. 
35e40 20 20 20 69 6e 74 20 69 43 65 6c 6c 20 3d 20 28     int iCell = (
35e50 69 4f 6c 64 20 2b 20 70 50 67 2d 3e 61 69 4f 76  iOld + pPg->aiOv
35e60 66 6c 5b 69 5d 29 20 2d 20 69 4e 65 77 3b 0a 20  fl[i]) - iNew;. 
35e70 20 20 20 69 66 28 20 69 43 65 6c 6c 3e 3d 30 20     if( iCell>=0 
35e80 26 26 20 69 43 65 6c 6c 3c 6e 4e 65 77 20 29 7b  && iCell<nNew ){
35e90 0a 20 20 20 20 20 20 70 43 65 6c 6c 70 74 72 20  .      pCellptr 
35ea0 3d 20 26 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78  = &pPg->aCellIdx
35eb0 5b 69 43 65 6c 6c 20 2a 20 32 5d 3b 0a 20 20 20  [iCell * 2];.   
35ec0 20 20 20 6d 65 6d 6d 6f 76 65 28 26 70 43 65 6c     memmove(&pCel
35ed0 6c 70 74 72 5b 32 5d 2c 20 70 43 65 6c 6c 70 74  lptr[2], pCellpt
35ee0 72 2c 20 28 6e 43 65 6c 6c 20 2d 20 69 43 65 6c  r, (nCell - iCel
35ef0 6c 29 20 2a 20 32 29 3b 0a 20 20 20 20 20 20 6e  l) * 2);.      n
35f00 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20 69 66  Cell++;.      if
35f10 28 20 70 61 67 65 49 6e 73 65 72 74 41 72 72 61  ( pageInsertArra
35f20 79 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  y(.            p
35f30 50 67 2c 20 70 42 65 67 69 6e 2c 20 26 70 44 61  Pg, pBegin, &pDa
35f40 74 61 2c 20 70 43 65 6c 6c 70 74 72 2c 0a 20 20  ta, pCellptr,.  
35f50 20 20 20 20 20 20 20 20 20 20 31 2c 20 26 61 70            1, &ap
35f60 43 65 6c 6c 5b 69 43 65 6c 6c 20 2b 20 69 4e 65  Cell[iCell + iNe
35f70 77 5d 2c 20 26 73 7a 43 65 6c 6c 5b 69 43 65 6c  w], &szCell[iCel
35f80 6c 20 2b 20 69 4e 65 77 5d 0a 20 20 20 20 20 20  l + iNew].      
35f90 29 20 29 20 67 6f 74 6f 20 65 64 69 74 70 61 67  ) ) goto editpag
35fa0 65 5f 66 61 69 6c 3b 0a 20 20 20 20 7d 0a 20 20  e_fail;.    }.  
35fb0 7d 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 63  }..  /* Append c
35fc0 65 6c 6c 73 20 74 6f 20 74 68 65 20 65 6e 64 20  ells to the end 
35fd0 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  of the page */. 
35fe0 20 70 43 65 6c 6c 70 74 72 20 3d 20 26 70 50 67   pCellptr = &pPg
35ff0 2d 3e 61 43 65 6c 6c 49 64 78 5b 6e 43 65 6c 6c  ->aCellIdx[nCell
36000 2a 32 5d 3b 0a 20 20 69 66 28 20 70 61 67 65 49  *2];.  if( pageI
36010 6e 73 65 72 74 41 72 72 61 79 28 0a 20 20 20 20  nsertArray(.    
36020 20 20 20 20 70 50 67 2c 20 70 42 65 67 69 6e 2c      pPg, pBegin,
36030 20 26 70 44 61 74 61 2c 20 70 43 65 6c 6c 70 74   &pData, pCellpt
36040 72 2c 0a 20 20 20 20 20 20 20 20 6e 4e 65 77 2d  r,.        nNew-
36050 6e 43 65 6c 6c 2c 20 26 61 70 43 65 6c 6c 5b 69  nCell, &apCell[i
36060 4e 65 77 2b 6e 43 65 6c 6c 5d 2c 20 26 73 7a 43  New+nCell], &szC
36070 65 6c 6c 5b 69 4e 65 77 2b 6e 43 65 6c 6c 5d 0a  ell[iNew+nCell].
36080 20 20 29 20 29 20 67 6f 74 6f 20 65 64 69 74 70    ) ) goto editp
36090 61 67 65 5f 66 61 69 6c 3b 0a 0a 20 20 70 50 67  age_fail;..  pPg
360a0 2d 3e 6e 43 65 6c 6c 20 3d 20 6e 4e 65 77 3b 0a  ->nCell = nNew;.
360b0 20 20 70 50 67 2d 3e 6e 4f 76 65 72 66 6c 6f 77    pPg->nOverflow
360c0 20 3d 20 30 3b 0a 0a 20 20 70 75 74 32 62 79 74   = 0;..  put2byt
360d0 65 28 26 61 44 61 74 61 5b 68 64 72 2b 33 5d 2c  e(&aData[hdr+3],
360e0 20 70 50 67 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20   pPg->nCell);.  
360f0 70 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b  put2byte(&aData[
36100 68 64 72 2b 35 5d 2c 20 70 44 61 74 61 20 2d 20  hdr+5], pData - 
36110 61 44 61 74 61 29 3b 0a 0a 23 69 66 64 65 66 20  aData);..#ifdef 
36120 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66  SQLITE_DEBUG.  f
36130 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 20 26  or(i=0; i<nNew &
36140 26 20 21 43 4f 52 52 55 50 54 5f 44 42 3b 20 69  & !CORRUPT_DB; i
36150 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65  ++){.    u8 *pCe
36160 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 69 2b 69 4e  ll = apCell[i+iN
36170 65 77 5d 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66  ew];.    int iOf
36180 66 20 3d 20 67 65 74 32 62 79 74 65 28 26 70 50  f = get2byte(&pP
36190 67 2d 3e 61 43 65 6c 6c 49 64 78 5b 69 2a 32 5d  g->aCellIdx[i*2]
361a0 29 3b 0a 20 20 20 20 69 66 28 20 70 43 65 6c 6c  );.    if( pCell
361b0 3e 3d 61 44 61 74 61 20 26 26 20 70 43 65 6c 6c  >=aData && pCell
361c0 3c 26 61 44 61 74 61 5b 70 50 67 2d 3e 70 42 74  <&aData[pPg->pBt
361d0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 20 29 7b  ->usableSize] ){
361e0 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 26  .      pCell = &
361f0 70 54 6d 70 5b 70 43 65 6c 6c 20 2d 20 61 44 61  pTmp[pCell - aDa
36200 74 61 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ta];.    }.    a
36210 73 73 65 72 74 28 20 30 3d 3d 6d 65 6d 63 6d 70  ssert( 0==memcmp
36220 28 70 43 65 6c 6c 2c 20 26 61 44 61 74 61 5b 69  (pCell, &aData[i
36230 4f 66 66 5d 2c 20 73 7a 43 65 6c 6c 5b 69 2b 69  Off], szCell[i+i
36240 4e 65 77 5d 29 20 29 3b 0a 20 20 7d 0a 23 65 6e  New]) );.  }.#en
36250 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 3b 0a 20  dif..  return;. 
36260 65 64 69 74 70 61 67 65 5f 66 61 69 6c 3a 0a 20  editpage_fail:. 
36270 20 2f 2a 20 55 6e 61 62 6c 65 20 74 6f 20 65 64   /* Unable to ed
36280 69 74 20 74 68 69 73 20 70 61 67 65 2e 20 52 65  it this page. Re
36290 62 75 69 6c 64 20 69 74 20 66 72 6f 6d 20 73 63  build it from sc
362a0 72 61 74 63 68 20 69 6e 73 74 65 61 64 2e 20 2a  ratch instead. *
362b0 2f 0a 20 20 72 65 62 75 69 6c 64 50 61 67 65 28  /.  rebuildPage(
362c0 70 50 67 2c 20 6e 4e 65 77 2c 20 26 61 70 43 65  pPg, nNew, &apCe
362d0 6c 6c 5b 69 4e 65 77 5d 2c 20 26 73 7a 43 65 6c  ll[iNew], &szCel
362e0 6c 5b 69 4e 65 77 5d 29 3b 0a 7d 0a 0a 2f 2a 0a  l[iNew]);.}../*.
362f0 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
36300 20 70 61 72 61 6d 65 74 65 72 73 20 64 65 74 65   parameters dete
36310 72 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61  rmine how many a
36320 64 6a 61 63 65 6e 74 20 70 61 67 65 73 20 67 65  djacent pages ge
36330 74 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e  t involved.** in
36340 20 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65   a balancing ope
36350 72 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74  ration.  NN is t
36360 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69  he number of nei
36370 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72  ghbors on either
36380 20 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20   side.** of the 
36390 70 61 67 65 20 74 68 61 74 20 70 61 72 74 69 63  page that partic
363a0 69 70 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c  ipate in the bal
363b0 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ancing operation
363c0 2e 20 20 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20  .  NB is the.** 
363d0 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
363e0 70 61 67 65 73 20 74 68 61 74 20 70 61 72 74 69  pages that parti
363f0 63 69 70 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e  cipate, includin
36400 67 20 74 68 65 20 74 61 72 67 65 74 20 70 61 67  g the target pag
36410 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67  e and.** NN neig
36420 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20  hbors on either 
36430 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  side..**.** The 
36440 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66  minimum value of
36450 20 4e 4e 20 69 73 20 31 20 28 6f 66 20 63 6f 75   NN is 1 (of cou
36460 72 73 65 29 2e 20 20 49 6e 63 72 65 61 73 69 6e  rse).  Increasin
36470 67 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20  g NN above 1.** 
36480 28 74 6f 20 32 20 6f 72 20 33 29 20 67 69 76 65  (to 2 or 3) give
36490 73 20 61 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f  s a modest impro
364a0 76 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45 43 54  vement in SELECT
364b0 20 61 6e 64 20 44 45 4c 45 54 45 20 70 65 72 66   and DELETE perf
364c0 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78  ormance.** in ex
364d0 63 68 61 6e 67 65 20 66 6f 72 20 61 20 6c 61 72  change for a lar
364e0 67 65 72 20 64 65 67 72 61 64 61 74 69 6f 6e 20  ger degradation 
364f0 69 6e 20 49 4e 53 45 52 54 20 61 6e 64 20 55 50  in INSERT and UP
36500 44 41 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65  DATE performance
36510 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f  ..** The value o
36520 66 20 4e 4e 20 61 70 70 65 61 72 73 20 74 6f 20  f NN appears to 
36530 67 69 76 65 20 74 68 65 20 62 65 73 74 20 72 65  give the best re
36540 73 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a  sults overall..*
36550 2f 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31 20 20  /.#define NN 1  
36560 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
36570 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72  mber of neighbor
36580 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65  s on either side
36590 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23 64 65   of pPage */.#de
365a0 66 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29  fine NB (NN*2+1)
365b0 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70        /* Total p
365c0 61 67 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e  ages involved in
365d0 20 74 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a   the balance */.
365e0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
365f0 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e  _OMIT_QUICKBALAN
36600 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65  CE./*.** This ve
36610 72 73 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63 65  rsion of balance
36620 28 29 20 68 61 6e 64 6c 65 73 20 74 68 65 20 63  () handles the c
36630 6f 6d 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63 61  ommon special ca
36640 73 65 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e 65  se where.** a ne
36650 77 20 65 6e 74 72 79 20 69 73 20 62 65 69 6e 67  w entry is being
36660 20 69 6e 73 65 72 74 65 64 20 6f 6e 20 74 68 65   inserted on the
36670 20 65 78 74 72 65 6d 65 20 72 69 67 68 74 2d 65   extreme right-e
36680 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72 65  nd of the.** tre
36690 65 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64  e, in other word
366a0 73 2c 20 77 68 65 6e 20 74 68 65 20 6e 65 77 20  s, when the new 
366b0 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 63 6f 6d  entry will becom
366c0 65 20 74 68 65 20 6c 61 72 67 65 73 74 0a 2a 2a  e the largest.**
366d0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72   entry in the tr
366e0 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61  ee..**.** Instea
366f0 64 20 6f 66 20 74 72 79 69 6e 67 20 74 6f 20 62  d of trying to b
36700 61 6c 61 6e 63 65 20 74 68 65 20 33 20 72 69 67  alance the 3 rig
36710 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61 67  ht-most leaf pag
36720 65 73 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a 20  es, just add.** 
36730 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68  a new page to th
36740 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
36750 65 20 61 6e 64 20 70 75 74 20 74 68 65 20 6f 6e  e and put the on
36760 65 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a 2a  e new entry in.*
36770 2a 20 74 68 61 74 20 70 61 67 65 2e 20 20 54 68  * that page.  Th
36780 69 73 20 6c 65 61 76 65 73 20 74 68 65 20 72 69  is leaves the ri
36790 67 68 74 20 73 69 64 65 20 6f 66 20 74 68 65 20  ght side of the 
367a0 74 72 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a 2a  tree somewhat.**
367b0 20 75 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42 75   unbalanced.  Bu
367c0 74 20 6f 64 64 73 20 61 72 65 20 74 68 61 74 20  t odds are that 
367d0 77 65 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72  we will be inser
367e0 74 69 6e 67 20 6e 65 77 20 65 6e 74 72 69 65 73  ting new entries
367f0 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 73  .** at the end s
36800 6f 6f 6e 20 61 66 74 65 72 77 61 72 64 73 20 73  oon afterwards s
36810 6f 20 74 68 65 20 6e 65 61 72 6c 79 20 65 6d 70  o the nearly emp
36820 74 79 20 70 61 67 65 20 77 69 6c 6c 20 71 75 69  ty page will qui
36830 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e  ckly.** fill up.
36840 20 20 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a 2a    On average..**
36850 0a 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68 65  .** pPage is the
36860 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68   leaf page which
36870 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   is the right-mo
36880 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 74  st page in the t
36890 72 65 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74 20  ree..** pParent 
368a0 69 73 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20  is its parent.  
368b0 70 50 61 67 65 20 6d 75 73 74 20 68 61 76 65 20  pPage must have 
368c0 61 20 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c 6f  a single overflo
368d0 77 20 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63 68  w entry.** which
368e0 20 69 73 20 61 6c 73 6f 20 74 68 65 20 72 69 67   is also the rig
368f0 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f 6e  ht-most entry on
36900 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a   the page..**.**
36910 20 54 68 65 20 70 53 70 61 63 65 20 62 75 66 66   The pSpace buff
36920 65 72 20 69 73 20 75 73 65 64 20 74 6f 20 73 74  er is used to st
36930 6f 72 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ore a temporary 
36940 63 6f 70 79 20 6f 66 20 74 68 65 20 64 69 76 69  copy of the divi
36950 64 65 72 0a 2a 2a 20 63 65 6c 6c 20 74 68 61 74  der.** cell that
36960 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65   will be inserte
36970 64 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20  d into pParent. 
36980 53 75 63 68 20 61 20 63 65 6c 6c 20 63 6f 6e 73  Such a cell cons
36990 69 73 74 73 20 6f 66 20 61 20 34 0a 2a 2a 20 62  ists of a 4.** b
369a0 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  yte page number 
369b0 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 76 61  followed by a va
369c0 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e  riable length in
369d0 74 65 67 65 72 2e 20 49 6e 20 6f 74 68 65 72 0a  teger. In other.
369e0 2a 2a 20 77 6f 72 64 73 2c 20 61 74 20 6d 6f 73  ** words, at mos
369f0 74 20 31 33 20 62 79 74 65 73 2e 20 48 65 6e 63  t 13 bytes. Henc
36a00 65 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66  e the pSpace buf
36a10 66 65 72 20 6d 75 73 74 20 62 65 20 61 74 0a 2a  fer must be at.*
36a20 2a 20 6c 65 61 73 74 20 31 33 20 62 79 74 65 73  * least 13 bytes
36a30 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61   in size..*/.sta
36a40 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f  tic int balance_
36a50 71 75 69 63 6b 28 4d 65 6d 50 61 67 65 20 2a 70  quick(MemPage *p
36a60 50 61 72 65 6e 74 2c 20 4d 65 6d 50 61 67 65 20  Parent, MemPage 
36a70 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 53 70 61  *pPage, u8 *pSpa
36a80 63 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ce){.  BtShared 
36a90 2a 63 6f 6e 73 74 20 70 42 74 20 3d 20 70 50 61  *const pBt = pPa
36aa0 67 65 2d 3e 70 42 74 3b 20 20 20 20 2f 2a 20 42  ge->pBt;    /* B
36ab0 2d 54 72 65 65 20 44 61 74 61 62 61 73 65 20 2a  -Tree Database *
36ac0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65  /.  MemPage *pNe
36ad0 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
36ae0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c           /* Newl
36af0 79 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  y allocated page
36b00 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
36b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36b20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
36b30 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50  turn Code */.  P
36b40 67 6e 6f 20 70 67 6e 6f 4e 65 77 3b 20 20 20 20  gno pgnoNew;    
36b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36b60 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
36b70 65 72 20 6f 66 20 70 4e 65 77 20 2a 2f 0a 0a 20  er of pNew */.. 
36b80 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
36b90 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
36ba0 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
36bb0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
36bc0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
36bd0 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62  ble(pParent->pDb
36be0 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
36bf0 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
36c00 6c 6f 77 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20  low==1 );..  /* 
36c10 54 68 69 73 20 65 72 72 6f 72 20 63 6f 6e 64 69  This error condi
36c20 74 69 6f 6e 20 69 73 20 6e 6f 77 20 63 61 75 67  tion is now caug
36c30 68 74 20 70 72 69 6f 72 20 74 6f 20 72 65 61 63  ht prior to reac
36c40 68 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  hing this functi
36c50 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  on */.  if( NEVE
36c60 52 28 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  R(pPage->nCell==
36c70 30 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  0) ) return SQLI
36c80 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
36c90 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
36ca0 61 20 6e 65 77 20 70 61 67 65 2e 20 54 68 69 73  a new page. This
36cb0 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d   page will becom
36cc0 65 20 74 68 65 20 72 69 67 68 74 2d 73 69 62 6c  e the right-sibl
36cd0 69 6e 67 20 6f 66 20 0a 20 20 2a 2a 20 70 50 61  ing of .  ** pPa
36ce0 67 65 2e 20 4d 61 6b 65 20 74 68 65 20 70 61 72  ge. Make the par
36cf0 65 6e 74 20 70 61 67 65 20 77 72 69 74 61 62 6c  ent page writabl
36d00 65 2c 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e  e, so that the n
36d10 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 0a  ew divider cell.
36d20 20 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e 73 65    ** may be inse
36d30 72 74 65 64 2e 20 49 66 20 62 6f 74 68 20 74 68  rted. If both th
36d40 65 73 65 20 6f 70 65 72 61 74 69 6f 6e 73 20 61  ese operations a
36d50 72 65 20 73 75 63 63 65 73 73 66 75 6c 2c 20 70  re successful, p
36d60 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 72  roceed..  */.  r
36d70 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
36d80 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77  ePage(pBt, &pNew
36d90 2c 20 26 70 67 6e 6f 4e 65 77 2c 20 30 2c 20 30  , &pgnoNew, 0, 0
36da0 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
36db0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20  LITE_OK ){..    
36dc0 75 38 20 2a 70 4f 75 74 20 3d 20 26 70 53 70 61  u8 *pOut = &pSpa
36dd0 63 65 5b 34 5d 3b 0a 20 20 20 20 75 38 20 2a 70  ce[4];.    u8 *p
36de0 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 61 70  Cell = pPage->ap
36df0 4f 76 66 6c 5b 30 5d 3b 0a 20 20 20 20 75 31 36  Ovfl[0];.    u16
36e00 20 73 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c 53 69   szCell = cellSi
36e10 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  zePtr(pPage, pCe
36e20 6c 6c 29 3b 0a 20 20 20 20 75 38 20 2a 70 53 74  ll);.    u8 *pSt
36e30 6f 70 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  op;..    assert(
36e40 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
36e50 72 69 74 65 61 62 6c 65 28 70 4e 65 77 2d 3e 70  riteable(pNew->p
36e60 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 61  DbPage) );.    a
36e70 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44  ssert( pPage->aD
36e80 61 74 61 5b 30 5d 3d 3d 28 50 54 46 5f 49 4e 54  ata[0]==(PTF_INT
36e90 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41 54 41  KEY|PTF_LEAFDATA
36ea0 7c 50 54 46 5f 4c 45 41 46 29 20 29 3b 0a 20 20  |PTF_LEAF) );.  
36eb0 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c    zeroPage(pNew,
36ec0 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f   PTF_INTKEY|PTF_
36ed0 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 4c 45 41  LEAFDATA|PTF_LEA
36ee0 46 29 3b 0a 20 20 20 20 72 65 62 75 69 6c 64 50  F);.    rebuildP
36ef0 61 67 65 28 70 4e 65 77 2c 20 31 2c 20 26 70 43  age(pNew, 1, &pC
36f00 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a 20  ell, &szCell);. 
36f10 20 20 20 70 4e 65 77 2d 3e 6e 46 72 65 65 20 3d     pNew->nFree =
36f20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
36f30 20 2d 20 70 4e 65 77 2d 3e 63 65 6c 6c 4f 66 66   - pNew->cellOff
36f40 73 65 74 20 2d 20 32 20 2d 20 73 7a 43 65 6c 6c  set - 2 - szCell
36f50 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ;..    /* If thi
36f60 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63  s is an auto-vac
36f70 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70  uum database, up
36f80 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72  date the pointer
36f90 20 6d 61 70 0a 20 20 20 20 2a 2a 20 77 69 74 68   map.    ** with
36fa0 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65   entries for the
36fb0 20 6e 65 77 20 70 61 67 65 2c 20 61 6e 64 20 61   new page, and a
36fc0 6e 79 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20  ny pointer from 
36fd0 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c  the .    ** cell
36fe0 20 6f 6e 20 74 68 65 20 70 61 67 65 20 74 6f 20   on the page to 
36ff0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
37000 2e 20 49 66 20 65 69 74 68 65 72 20 6f 66 20 74  . If either of t
37010 68 65 73 65 0a 20 20 20 20 2a 2a 20 6f 70 65 72  hese.    ** oper
37020 61 74 69 6f 6e 73 20 66 61 69 6c 73 2c 20 74 68  ations fails, th
37030 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73  e return code is
37040 20 73 65 74 2c 20 62 75 74 20 74 68 65 20 63 6f   set, but the co
37050 6e 74 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66  ntents.    ** of
37060 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
37070 20 61 72 65 20 73 74 69 6c 6c 20 6d 61 6e 69 70   are still manip
37080 75 6c 61 74 65 64 20 62 79 20 74 68 68 20 63 6f  ulated by thh co
37090 64 65 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a  de below..    **
370a0 20 54 68 61 74 20 69 73 20 4f 6b 2c 20 61 74 20   That is Ok, at 
370b0 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 70  this point the p
370c0 61 72 65 6e 74 20 70 61 67 65 20 69 73 20 67 75  arent page is gu
370d0 61 72 61 6e 74 65 65 64 20 74 6f 0a 20 20 20 20  aranteed to.    
370e0 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ** be marked as 
370f0 64 69 72 74 79 2e 20 52 65 74 75 72 6e 69 6e 67  dirty. Returning
37100 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77   an error code w
37110 69 6c 6c 20 63 61 75 73 65 20 61 0a 20 20 20 20  ill cause a.    
37120 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 75 6e 64  ** rollback, und
37130 6f 69 6e 67 20 61 6e 79 20 63 68 61 6e 67 65 73  oing any changes
37140 20 6d 61 64 65 20 74 6f 20 74 68 65 20 70 61 72   made to the par
37150 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  ent page..    */
37160 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56  .    if( ISAUTOV
37170 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 70  ACUUM ){.      p
37180 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67  trmapPut(pBt, pg
37190 6e 6f 4e 65 77 2c 20 50 54 52 4d 41 50 5f 42 54  noNew, PTRMAP_BT
371a0 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67  REE, pParent->pg
371b0 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  no, &rc);.      
371c0 69 66 28 20 73 7a 43 65 6c 6c 3e 70 4e 65 77 2d  if( szCell>pNew-
371d0 3e 6d 69 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >minLocal ){.   
371e0 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76       ptrmapPutOv
371f0 66 6c 50 74 72 28 70 4e 65 77 2c 20 70 43 65 6c  flPtr(pNew, pCel
37200 6c 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 7d  l, &rc);.      }
37210 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
37220 20 43 72 65 61 74 65 20 61 20 64 69 76 69 64 65   Create a divide
37230 72 20 63 65 6c 6c 20 74 6f 20 69 6e 73 65 72 74  r cell to insert
37240 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 54   into pParent. T
37250 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 0a  he divider cell.
37260 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 73 20      ** consists 
37270 6f 66 20 61 20 34 2d 62 79 74 65 20 70 61 67 65  of a 4-byte page
37280 20 6e 75 6d 62 65 72 20 28 74 68 65 20 70 61 67   number (the pag
37290 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 50 61 67  e number of pPag
372a0 65 29 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61 20  e) and.    ** a 
372b0 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20  variable length 
372c0 6b 65 79 20 76 61 6c 75 65 20 28 77 68 69 63 68  key value (which
372d0 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d   must be the sam
372e0 65 20 76 61 6c 75 65 20 61 73 20 74 68 65 0a 20  e value as the. 
372f0 20 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 6b 65     ** largest ke
37300 79 20 6f 6e 20 70 50 61 67 65 29 2e 0a 20 20 20  y on pPage)..   
37310 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 6f 20 66 69   **.    ** To fi
37320 6e 64 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b  nd the largest k
37330 65 79 20 76 61 6c 75 65 20 6f 6e 20 70 50 61 67  ey value on pPag
37340 65 2c 20 66 69 72 73 74 20 66 69 6e 64 20 74 68  e, first find th
37350 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 0a 20 20  e right-most .  
37360 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61    ** cell on pPa
37370 67 65 2e 20 54 68 65 20 66 69 72 73 74 20 74 77  ge. The first tw
37380 6f 20 66 69 65 6c 64 73 20 6f 66 20 74 68 69 73  o fields of this
37390 20 63 65 6c 6c 20 61 72 65 20 74 68 65 20 0a 20   cell are the . 
373a0 20 20 20 2a 2a 20 72 65 63 6f 72 64 2d 6c 65 6e     ** record-len
373b0 67 74 68 20 28 61 20 76 61 72 69 61 62 6c 65 20  gth (a variable 
373c0 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 20 61  length integer a
373d0 74 20 6d 6f 73 74 20 33 32 2d 62 69 74 73 20 69  t most 32-bits i
373e0 6e 20 73 69 7a 65 29 0a 20 20 20 20 2a 2a 20 61  n size).    ** a
373f0 6e 64 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65  nd the key value
37400 20 28 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e   (a variable len
37410 67 74 68 20 69 6e 74 65 67 65 72 2c 20 6d 61 79  gth integer, may
37420 20 68 61 76 65 20 61 6e 79 20 76 61 6c 75 65 29   have any value)
37430 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 69 72  ..    ** The fir
37440 73 74 20 6f 66 20 74 68 65 20 77 68 69 6c 65 28  st of the while(
37450 2e 2e 2e 29 20 6c 6f 6f 70 73 20 62 65 6c 6f 77  ...) loops below
37460 20 73 6b 69 70 73 20 6f 76 65 72 20 74 68 65 20   skips over the 
37470 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68 0a 20 20  record-length.  
37480 20 20 2a 2a 20 66 69 65 6c 64 2e 20 54 68 65 20    ** field. The 
37490 73 65 63 6f 6e 64 20 77 68 69 6c 65 28 2e 2e 2e  second while(...
374a0 29 20 6c 6f 6f 70 20 63 6f 70 69 65 73 20 74 68  ) loop copies th
374b0 65 20 6b 65 79 20 76 61 6c 75 65 20 66 72 6f 6d  e key value from
374c0 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 65 6c 6c   the.    ** cell
374d0 20 6f 6e 20 70 50 61 67 65 20 69 6e 74 6f 20 74   on pPage into t
374e0 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72  he pSpace buffer
374f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 43 65  ..    */.    pCe
37500 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
37510 61 67 65 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c  age, pPage->nCel
37520 6c 2d 31 29 3b 0a 20 20 20 20 70 53 74 6f 70 20  l-1);.    pStop 
37530 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20  = &pCell[9];.   
37540 20 77 68 69 6c 65 28 20 28 2a 28 70 43 65 6c 6c   while( (*(pCell
37550 2b 2b 29 26 30 78 38 30 29 20 26 26 20 70 43 65  ++)&0x80) && pCe
37560 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a 20 20 20 20  ll<pStop );.    
37570 70 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c 5b 39  pStop = &pCell[9
37580 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 28  ];.    while( ((
37590 2a 28 70 4f 75 74 2b 2b 29 20 3d 20 2a 28 70 43  *(pOut++) = *(pC
375a0 65 6c 6c 2b 2b 29 29 26 30 78 38 30 29 20 26 26  ell++))&0x80) &&
375b0 20 70 43 65 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a   pCell<pStop );.
375c0 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74  .    /* Insert t
375d0 68 65 20 6e 65 77 20 64 69 76 69 64 65 72 20 63  he new divider c
375e0 65 6c 6c 20 69 6e 74 6f 20 70 50 61 72 65 6e 74  ell into pParent
375f0 2e 20 2a 2f 0a 20 20 20 20 69 6e 73 65 72 74 43  . */.    insertC
37600 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 50 61  ell(pParent, pPa
37610 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2c 20 70 53 70  rent->nCell, pSp
37620 61 63 65 2c 20 28 69 6e 74 29 28 70 4f 75 74 2d  ace, (int)(pOut-
37630 70 53 70 61 63 65 29 2c 0a 20 20 20 20 20 20 20  pSpace),.       
37640 20 20 20 20 20 20 20 20 30 2c 20 70 50 61 67 65          0, pPage
37650 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 0a 20  ->pgno, &rc);.. 
37660 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 72 69     /* Set the ri
37670 67 68 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65  ght-child pointe
37680 72 20 6f 66 20 70 50 61 72 65 6e 74 20 74 6f 20  r of pParent to 
37690 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77  point to the new
376a0 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 70 75   page. */.    pu
376b0 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d  t4byte(&pParent-
376c0 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
376d0 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67  hdrOffset+8], pg
376e0 6e 6f 4e 65 77 29 3b 0a 20 20 0a 20 20 20 20 2f  noNew);.  .    /
376f0 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 72 65  * Release the re
37700 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6e  ference to the n
37710 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ew page. */.    
37720 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
37730 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
37740 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
37750 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49   SQLITE_OMIT_QUI
37760 43 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a 23 69  CKBALANCE */..#i
37770 66 20 30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  f 0./*.** This f
37780 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
37790 20 63 6f 6e 74 72 69 62 75 74 65 20 61 6e 79 74   contribute anyt
377a0 68 69 6e 67 20 74 6f 20 74 68 65 20 6f 70 65 72  hing to the oper
377b0 61 74 69 6f 6e 20 6f 66 20 53 51 4c 69 74 65 2e  ation of SQLite.
377c0 0a 2a 2a 20 69 74 20 69 73 20 73 6f 6d 65 74 69  .** it is someti
377d0 6d 65 73 20 61 63 74 69 76 61 74 65 64 20 74 65  mes activated te
377e0 6d 70 6f 72 61 72 69 6c 79 20 77 68 69 6c 65 20  mporarily while 
377f0 64 65 62 75 67 67 69 6e 67 20 63 6f 64 65 20 72  debugging code r
37800 65 73 70 6f 6e 73 69 62 6c 65 20 0a 2a 2a 20 66  esponsible .** f
37810 6f 72 20 73 65 74 74 69 6e 67 20 70 6f 69 6e 74  or setting point
37820 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 2e 0a  er-map entries..
37830 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74  */.static int pt
37840 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28 4d  rmapCheckPages(M
37850 65 6d 50 61 67 65 20 2a 2a 61 70 50 61 67 65 2c  emPage **apPage,
37860 20 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20 69   int nPage){.  i
37870 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69  nt i, j;.  for(i
37880 3d 30 3b 20 69 3c 6e 50 61 67 65 3b 20 69 2b 2b  =0; i<nPage; i++
37890 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 3b 0a 20  ){.    Pgno n;. 
378a0 20 20 20 75 38 20 65 3b 0a 20 20 20 20 4d 65 6d     u8 e;.    Mem
378b0 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 61 70  Page *pPage = ap
378c0 50 61 67 65 5b 69 5d 3b 0a 20 20 20 20 42 74 53  Page[i];.    BtS
378d0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
378e0 67 65 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73  ge->pBt;.    ass
378f0 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
37900 69 74 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 6a  it );..    for(j
37910 3d 30 3b 20 6a 3c 70 50 61 67 65 2d 3e 6e 43 65  =0; j<pPage->nCe
37920 6c 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; j++){.      
37930 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
37940 20 20 20 20 20 75 38 20 2a 7a 3b 0a 20 20 20 20       u8 *z;.    
37950 20 0a 20 20 20 20 20 20 7a 20 3d 20 66 69 6e 64   .      z = find
37960 43 65 6c 6c 28 70 50 61 67 65 2c 20 6a 29 3b 0a  Cell(pPage, j);.
37970 20 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65        btreeParse
37980 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 7a  CellPtr(pPage, z
37990 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  , &info);.      
379a0 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  if( info.iOverfl
379b0 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67  ow ){.        Pg
379c0 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79  no ovfl = get4by
379d0 74 65 28 26 7a 5b 69 6e 66 6f 2e 69 4f 76 65 72  te(&z[info.iOver
379e0 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20 20 20 20  flow]);.        
379f0 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6f  ptrmapGet(pBt, o
37a00 76 66 6c 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20  vfl, &e, &n);.  
37a10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d        assert( n=
37a20 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20  =pPage->pgno && 
37a30 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
37a40 4f 57 31 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  OW1 );.      }. 
37a50 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d       if( !pPage-
37a60 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  >leaf ){.       
37a70 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65   Pgno child = ge
37a80 74 34 62 79 74 65 28 7a 29 3b 0a 20 20 20 20 20  t4byte(z);.     
37a90 20 20 20 70 74 72 6d 61 70 47 65 74 28 70 42 74     ptrmapGet(pBt
37aa0 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29  , child, &e, &n)
37ab0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
37ac0 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f  ( n==pPage->pgno
37ad0 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54   && e==PTRMAP_BT
37ae0 52 45 45 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  REE );.      }. 
37af0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70 50     }.    if( !pP
37b00 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
37b10 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20     Pgno child = 
37b20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
37b30 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
37b40 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
37b50 20 20 20 70 74 72 6d 61 70 47 65 74 28 70 42 74     ptrmapGet(pBt
37b60 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29  , child, &e, &n)
37b70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
37b80 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26  n==pPage->pgno &
37b90 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45  & e==PTRMAP_BTRE
37ba0 45 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  E );.    }.  }. 
37bb0 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
37bc0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
37bd0 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
37be0 20 74 6f 20 63 6f 70 79 20 74 68 65 20 63 6f 6e   to copy the con
37bf0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 62 2d 74  tents of the b-t
37c00 72 65 65 20 6e 6f 64 65 20 73 74 6f 72 65 64 20  ree node stored 
37c10 0a 2a 2a 20 6f 6e 20 70 61 67 65 20 70 46 72 6f  .** on page pFro
37c20 6d 20 74 6f 20 70 61 67 65 20 70 54 6f 2e 20 49  m to page pTo. I
37c30 66 20 70 61 67 65 20 70 46 72 6f 6d 20 77 61 73  f page pFrom was
37c40 20 6e 6f 74 20 61 20 6c 65 61 66 20 70 61 67 65   not a leaf page
37c50 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 70 6f  , then.** the po
37c60 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
37c70 73 20 66 6f 72 20 65 61 63 68 20 63 68 69 6c 64  s for each child
37c80 20 70 61 67 65 20 61 72 65 20 75 70 64 61 74 65   page are update
37c90 64 20 73 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a  d so that the.**
37ca0 20 70 61 72 65 6e 74 20 70 61 67 65 20 73 74 6f   parent page sto
37cb0 72 65 64 20 69 6e 20 74 68 65 20 70 6f 69 6e 74  red in the point
37cc0 65 72 20 6d 61 70 20 69 73 20 70 61 67 65 20 70  er map is page p
37cd0 54 6f 2e 20 49 66 20 70 46 72 6f 6d 20 63 6f 6e  To. If pFrom con
37ce0 74 61 69 6e 65 64 0a 2a 2a 20 61 6e 79 20 63 65  tained.** any ce
37cf0 6c 6c 73 20 77 69 74 68 20 6f 76 65 72 66 6c 6f  lls with overflo
37d00 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 73 2c  w page pointers,
37d10 20 74 68 65 6e 20 74 68 65 20 63 6f 72 72 65 73   then the corres
37d20 70 6f 6e 64 69 6e 67 20 70 6f 69 6e 74 65 72 0a  ponding pointer.
37d30 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20 61  ** map entries a
37d40 72 65 20 61 6c 73 6f 20 75 70 64 61 74 65 64 20  re also updated 
37d50 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 72 65  so that the pare
37d60 6e 74 20 70 61 67 65 20 69 73 20 70 61 67 65 20  nt page is page 
37d70 70 54 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46  pTo..**.** If pF
37d80 72 6f 6d 20 69 73 20 63 75 72 72 65 6e 74 6c 79  rom is currently
37d90 20 63 61 72 72 79 69 6e 67 20 61 6e 79 20 6f 76   carrying any ov
37da0 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 28 65 6e  erflow cells (en
37db0 74 72 69 65 73 20 69 6e 20 74 68 65 0a 2a 2a 20  tries in the.** 
37dc0 4d 65 6d 50 61 67 65 2e 61 70 4f 76 66 6c 5b 5d  MemPage.apOvfl[]
37dd0 20 61 72 72 61 79 29 2c 20 74 68 65 79 20 61 72   array), they ar
37de0 65 20 6e 6f 74 20 63 6f 70 69 65 64 20 74 6f 20  e not copied to 
37df0 70 54 6f 2e 20 0a 2a 2a 0a 2a 2a 20 42 65 66 6f  pTo. .**.** Befo
37e00 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 70 61  re returning, pa
37e10 67 65 20 70 54 6f 20 69 73 20 72 65 69 6e 69 74  ge pTo is reinit
37e20 69 61 6c 69 7a 65 64 20 75 73 69 6e 67 20 62 74  ialized using bt
37e30 72 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a  reeInitPage()..*
37e40 2a 0a 2a 2a 20 54 68 65 20 70 65 72 66 6f 72 6d  *.** The perform
37e50 61 6e 63 65 20 6f 66 20 74 68 69 73 20 66 75 6e  ance of this fun
37e60 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63 72 69  ction is not cri
37e70 74 69 63 61 6c 2e 20 49 74 20 69 73 20 6f 6e 6c  tical. It is onl
37e80 79 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 74 68  y used by .** th
37e90 65 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f  e balance_shallo
37ea0 77 65 72 28 29 20 61 6e 64 20 62 61 6c 61 6e 63  wer() and balanc
37eb0 65 5f 64 65 65 70 65 72 28 29 20 70 72 6f 63 65  e_deeper() proce
37ec0 64 75 72 65 73 2c 20 6e 65 69 74 68 65 72 20 6f  dures, neither o
37ed0 66 0a 2a 2a 20 77 68 69 63 68 20 61 72 65 20 63  f.** which are c
37ee0 61 6c 6c 65 64 20 6f 66 74 65 6e 20 75 6e 64 65  alled often unde
37ef0 72 20 6e 6f 72 6d 61 6c 20 63 69 72 63 75 6d 73  r normal circums
37f00 74 61 6e 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  tances..*/.stati
37f10 63 20 76 6f 69 64 20 63 6f 70 79 4e 6f 64 65 43  c void copyNodeC
37f20 6f 6e 74 65 6e 74 28 4d 65 6d 50 61 67 65 20 2a  ontent(MemPage *
37f30 70 46 72 6f 6d 2c 20 4d 65 6d 50 61 67 65 20 2a  pFrom, MemPage *
37f40 70 54 6f 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  pTo, int *pRC){.
37f50 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51    if( (*pRC)==SQ
37f60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 42  LITE_OK ){.    B
37f70 74 53 68 61 72 65 64 20 2a 20 63 6f 6e 73 74 20  tShared * const 
37f80 70 42 74 20 3d 20 70 46 72 6f 6d 2d 3e 70 42 74  pBt = pFrom->pBt
37f90 3b 0a 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74  ;.    u8 * const
37fa0 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 2d 3e   aFrom = pFrom->
37fb0 61 44 61 74 61 3b 0a 20 20 20 20 75 38 20 2a 20  aData;.    u8 * 
37fc0 63 6f 6e 73 74 20 61 54 6f 20 3d 20 70 54 6f 2d  const aTo = pTo-
37fd0 3e 61 44 61 74 61 3b 0a 20 20 20 20 69 6e 74 20  >aData;.    int 
37fe0 63 6f 6e 73 74 20 69 46 72 6f 6d 48 64 72 20 3d  const iFromHdr =
37ff0 20 70 46 72 6f 6d 2d 3e 68 64 72 4f 66 66 73 65   pFrom->hdrOffse
38000 74 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6e 73 74  t;.    int const
38010 20 69 54 6f 48 64 72 20 3d 20 28 28 70 54 6f 2d   iToHdr = ((pTo-
38020 3e 70 67 6e 6f 3d 3d 31 29 20 3f 20 31 30 30 20  >pgno==1) ? 100 
38030 3a 20 30 29 3b 0a 20 20 20 20 69 6e 74 20 72 63  : 0);.    int rc
38040 3b 0a 20 20 20 20 69 6e 74 20 69 44 61 74 61 3b  ;.    int iData;
38050 0a 20 20 0a 20 20 0a 20 20 20 20 61 73 73 65 72  .  .  .    asser
38060 74 28 20 70 46 72 6f 6d 2d 3e 69 73 49 6e 69 74  t( pFrom->isInit
38070 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
38080 70 46 72 6f 6d 2d 3e 6e 46 72 65 65 3e 3d 69 54  pFrom->nFree>=iT
38090 6f 48 64 72 20 29 3b 0a 20 20 20 20 61 73 73 65  oHdr );.    asse
380a0 72 74 28 20 67 65 74 32 62 79 74 65 28 26 61 46  rt( get2byte(&aF
380b0 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b 35 5d 29  rom[iFromHdr+5])
380c0 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75 73   <= (int)pBt->us
380d0 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 0a 20  ableSize );.  . 
380e0 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 62     /* Copy the b
380f0 2d 74 72 65 65 20 6e 6f 64 65 20 63 6f 6e 74 65  -tree node conte
38100 6e 74 20 66 72 6f 6d 20 70 61 67 65 20 70 46 72  nt from page pFr
38110 6f 6d 20 74 6f 20 70 61 67 65 20 70 54 6f 2e 20  om to page pTo. 
38120 2a 2f 0a 20 20 20 20 69 44 61 74 61 20 3d 20 67  */.    iData = g
38130 65 74 32 62 79 74 65 28 26 61 46 72 6f 6d 5b 69  et2byte(&aFrom[i
38140 46 72 6f 6d 48 64 72 2b 35 5d 29 3b 0a 20 20 20  FromHdr+5]);.   
38150 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69 44 61   memcpy(&aTo[iDa
38160 74 61 5d 2c 20 26 61 46 72 6f 6d 5b 69 44 61 74  ta], &aFrom[iDat
38170 61 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  a], pBt->usableS
38180 69 7a 65 2d 69 44 61 74 61 29 3b 0a 20 20 20 20  ize-iData);.    
38190 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69 54 6f 48  memcpy(&aTo[iToH
381a0 64 72 5d 2c 20 26 61 46 72 6f 6d 5b 69 46 72 6f  dr], &aFrom[iFro
381b0 6d 48 64 72 5d 2c 20 70 46 72 6f 6d 2d 3e 63 65  mHdr], pFrom->ce
381c0 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 46 72  llOffset + 2*pFr
381d0 6f 6d 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 0a 20  om->nCell);.  . 
381e0 20 20 20 2f 2a 20 52 65 69 6e 69 74 69 61 6c 69     /* Reinitiali
381f0 7a 65 20 70 61 67 65 20 70 54 6f 20 73 6f 20 74  ze page pTo so t
38200 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  hat the contents
38210 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20   of the MemPage 
38220 73 74 72 75 63 74 75 72 65 0a 20 20 20 20 2a 2a  structure.    **
38230 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20 64   match the new d
38240 61 74 61 2e 20 54 68 65 20 69 6e 69 74 69 61 6c  ata. The initial
38250 69 7a 61 74 69 6f 6e 20 6f 66 20 70 54 6f 20 63  ization of pTo c
38260 61 6e 20 61 63 74 75 61 6c 6c 79 20 66 61 69 6c  an actually fail
38270 20 75 6e 64 65 72 0a 20 20 20 20 2a 2a 20 66 61   under.    ** fa
38280 69 72 6c 79 20 6f 62 73 63 75 72 65 20 63 69 72  irly obscure cir
38290 63 75 6d 73 74 61 6e 63 65 73 2c 20 65 76 65 6e  cumstances, even
382a0 20 74 68 6f 75 67 68 20 69 74 20 69 73 20 61 20   though it is a 
382b0 63 6f 70 79 20 6f 66 20 69 6e 69 74 69 61 6c 69  copy of initiali
382c0 7a 65 64 20 0a 20 20 20 20 2a 2a 20 70 61 67 65  zed .    ** page
382d0 20 70 46 72 6f 6d 2e 0a 20 20 20 20 2a 2f 0a 20   pFrom..    */. 
382e0 20 20 20 70 54 6f 2d 3e 69 73 49 6e 69 74 20 3d     pTo->isInit =
382f0 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   0;.    rc = btr
38300 65 65 49 6e 69 74 50 61 67 65 28 70 54 6f 29 3b  eeInitPage(pTo);
38310 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
38320 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
38330 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 20  *pRC = rc;.     
38340 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
38350 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73   .    /* If this
38360 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   is an auto-vacu
38370 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70 64  um database, upd
38380 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  ate the pointer-
38390 6d 61 70 20 65 6e 74 72 69 65 73 0a 20 20 20 20  map entries.    
383a0 2a 2a 20 66 6f 72 20 61 6e 79 20 62 2d 74 72 65  ** for any b-tre
383b0 65 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61  e or overflow pa
383c0 67 65 73 20 74 68 61 74 20 70 54 6f 20 6e 6f 77  ges that pTo now
383d0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f   contains the po
383e0 69 6e 74 65 72 73 20 74 6f 2e 0a 20 20 20 20 2a  inters to..    *
383f0 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f  /.    if( ISAUTO
38400 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20  VACUUM ){.      
38410 2a 70 52 43 20 3d 20 73 65 74 43 68 69 6c 64 50  *pRC = setChildP
38420 74 72 6d 61 70 73 28 70 54 6f 29 3b 0a 20 20 20  trmaps(pTo);.   
38430 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
38440 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 64  This routine red
38450 69 73 74 72 69 62 75 74 65 73 20 63 65 6c 6c 73  istributes cells
38460 20 6f 6e 20 74 68 65 20 69 50 61 72 65 6e 74 49   on the iParentI