/ Hex Artifact Content
Login

Artifact c1bbc83539de1e749aa36ce9c283f95b50543bcb:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0e90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0ea0: 44 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20  D_CACHE..#ifdef 
0eb0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
0ec0: 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  **** This functi
0ed0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
0ee0: 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73  as part of an as
0ef0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
0f00: 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63  . ***.**.** Chec
0f10: 6b 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72  k to see if pBtr
0f20: 65 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71  ee holds the req
0f30: 75 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72  uired locks to r
0f40: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20  ead or write to 
0f50: 74 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69  the .** table wi
0f60: 74 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f  th root page iRo
0f70: 6f 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69  ot.   Return 1 i
0f80: 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20  f it does and 0 
0f90: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  if not..**.** Fo
0fa0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
0fb0: 77 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62  writing to a tab
0fc0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
0fd0: 65 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20  e iRoot via .** 
0fe0: 42 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  Btree connection
0ff0: 20 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20   pBtree:.**.**  
1000: 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
1010: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1020: 6b 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c  k(pBtree, iRoot,
1030: 20 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20   0, WRITE_LOCK) 
1040: 29 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72  );.**.** When wr
1050: 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65  iting to an inde
1060: 78 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69  x that resides i
1070: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74  n a sharable dat
1080: 61 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63  abase, the .** c
1090: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76  aller should hav
10a0: 65 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64  e first obtained
10b0: 20 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69   a lock specifyi
10c0: 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ng the root page
10d0: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   of.** the corre
10e0: 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20  sponding table. 
10f0: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67  This makes thing
1100: 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d  s a bit more com
1110: 70 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20  plicated,.** as 
1120: 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61  this module trea
1130: 74 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73  ts each table as
1140: 20 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75   a separate stru
1150: 63 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d  cture. To determ
1160: 69 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ine.** the table
1170: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1180: 6f 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  o the index bein
1190: 67 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a  g written, this.
11a0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
11b0: 74 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67  to search throug
11c0: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  h the database s
11d0: 63 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73  chema..**.** Ins
11e0: 74 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f  tead of a lock o
11f0: 6e 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  n the table/inde
1200: 78 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  x rooted at page
1210: 20 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c   iRoot, the call
1220: 65 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61  er may.** hold a
1230: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
1240: 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20  he schema table 
1250: 28 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54  (root page 1). T
1260: 68 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61  his is also.** a
1270: 63 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  cceptable..*/.st
1280: 61 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72  atic int hasShar
1290: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
12a0: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
12b0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61  e,         /* Ha
12c0: 6e 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68  ndle that must h
12d0: 6f 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67  old lock */.  Pg
12e0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
12f0: 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1300: 65 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20  e of b-tree */. 
1310: 20 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20   int isIndex,   
1320: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1330: 69 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20  if iRoot is the 
1340: 72 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  root of an index
1350: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
1360: 20 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20   eLockType      
1370: 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
1380: 6c 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f  lock type (READ_
1390: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
13a0: 43 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65  CK) */.){.  Sche
13b0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53  ma *pSchema = (S
13c0: 63 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e  chema *)pBtree->
13d0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  pBt->pSchema;.  
13e0: 50 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20  Pgno iTab = 0;. 
13f0: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
1400: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
1410: 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68  tabase is not sh
1420: 61 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74  areable, or if t
1430: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1440: 64 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61  ding.  ** and ha
1450: 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  s the read-uncom
1460: 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c  mitted flag set,
1470: 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73   then no lock is
1480: 20 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a   required. .  **
1490: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d   Return true imm
14a0: 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
14b0: 20 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68   if( (pBtree->sh
14c0: 61 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c  arable==0).   ||
14d0: 20 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41   (eLockType==REA
14e0: 44 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65  D_LOCK && (pBtre
14f0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1500: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1510: 69 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20  itted)).  ){.   
1520: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
1530: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65    /* If the clie
1540: 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f  nt is reading  o
1550: 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64  r writing an ind
1560: 65 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d  ex and the schem
1570: 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f  a is.  ** not lo
1580: 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73  aded, then it is
1590: 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74   too difficult t
15a0: 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b  o actually check
15b0: 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20   to see if.  ** 
15c0: 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
15d0: 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20  s are held.  So 
15e0: 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20  do not bother - 
15f0: 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65  just return true
1600: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65  ..  ** This case
1610: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75   does not come u
1620: 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79  p very often any
1630: 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  how..  */.  if( 
1640: 69 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63  isIndex && (!pSc
1650: 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61  hema || (pSchema
1660: 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26 44 42  ->schemaFlags&DB
1670: 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d  _SchemaLoaded)==
1680: 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1690: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69   1;.  }..  /* Fi
16a0: 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f 6f  gure out the roo
16b0: 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65 20  t-page that the 
16c0: 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20 68  lock should be h
16d0: 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62 6c  eld on. For tabl
16e0: 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c 20  e.  ** b-trees, 
16f0: 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68 65  this is just the
1700: 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
1710: 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 72  e b-tree being r
1720: 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69 74  ead or.  ** writ
1730: 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20 62  ten. For index b
1740: 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74 68  -trees, it is th
1750: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
1760: 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  he associated.  
1770: 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  ** table.  */.  
1780: 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a 20  if( isIndex ){. 
1790: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a     HashElem *p;.
17a0: 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65      for(p=sqlite
17b0: 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65  HashFirst(&pSche
17c0: 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70 3b  ma->idxHash); p;
17d0: 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   p=sqliteHashNex
17e0: 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e 64  t(p)){.      Ind
17f0: 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64 65  ex *pIdx = (Inde
1800: 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  x *)sqliteHashDa
1810: 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28  ta(p);.      if(
1820: 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69 6e   pIdx->tnum==(in
1830: 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20  t)iRoot ){.     
1840: 20 20 20 69 66 28 20 69 54 61 62 20 29 7b 0a 20     if( iTab ){. 
1850: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20           /* Two 
1860: 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65 73 20  or more indexes 
1870: 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 72  share the same r
1880: 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65 72 65  oot page.  There
1890: 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20 20 20   must.          
18a0: 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72 20 74  ** be imposter t
18b0: 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73 74 20  ables.  So just 
18c0: 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20 54 68  return true.  Th
18d0: 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f 74 0a  e assert is not.
18e0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65            ** use
18f0: 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61 73 65  ful in that case
1900: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
1910: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
1920: 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61 62 20   }.        iTab 
1930: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
1940: 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tnum;.      }.  
1950: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1960: 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a 20   iTab = iRoot;. 
1970: 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20   }..  /* Search 
1980: 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65 64  for the required
1990: 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61 20   lock. Either a 
19a0: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72 6f  write-lock on ro
19b0: 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61 20  ot-page iTab, a 
19c0: 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b  .  ** write-lock
19d0: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
19e0: 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68 65  able, or (if the
19f0: 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64 69   client is readi
1a00: 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64 2d  ng) a.  ** read-
1a10: 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69 6c  lock on iTab wil
1a20: 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75 72  l suffice. Retur
1a30: 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74 68  n 1 if any of th
1a40: 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20 20  ese are found.  
1a50: 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70  */.  for(pLock=p
1a60: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f 63  Btree->pBt->pLoc
1a70: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
1a80: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
1a90: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42     if( pLock->pB
1aa0: 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20 20  tree==pBtree .  
1ab0: 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69 54     && (pLock->iT
1ac0: 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28 70  able==iTab || (p
1ad0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Lock->eLock==WRI
1ae0: 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b  TE_LOCK && pLock
1af0: 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20 20  ->iTable==1)).  
1b00: 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c 6f     && pLock->eLo
1b10: 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a 20  ck>=eLockType . 
1b20: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1b30: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1b40: 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20  .  /* Failed to 
1b50: 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72 65  find the require
1b60: 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65 74  d lock. */.  ret
1b70: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
1b80: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
1b90: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
1ba0: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20  E_DEBUG./*.**** 
1bb0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
1bc0: 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61 72  y be used as par
1bd0: 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  t of assert() st
1be0: 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20 2a  atements only. *
1bf0: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ***.**.** Return
1c00: 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75 6c   true if it woul
1c10: 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f 72  d be illegal for
1c20: 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74 65   pBtree to write
1c30: 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61 62   into the.** tab
1c40: 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f 74  le or index root
1c50: 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63 61  ed at iRoot beca
1c60: 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65 64  use other shared
1c70: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
1c80: 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  .** simultaneous
1c90: 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74 20  ly reading that 
1ca0: 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69 6e  same table or in
1cb0: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  dex..**.** It is
1cc0: 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42 74   illegal for pBt
1cd0: 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66 20  ree to write if 
1ce0: 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65 65  some other Btree
1cf0: 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20   object that.** 
1d00: 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65 20  shares the same 
1d10: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
1d20: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65 61  is currently rea
1d30: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 0a  ding or writing.
1d40: 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61 62  ** the iRoot tab
1d50: 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20  le.  Except, if 
1d60: 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65 20  the other Btree 
1d70: 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a 2a  object has the.*
1d80: 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  * read-uncommitt
1d90: 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68 65  ed flag set, the
1da0: 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74  n it is OK for t
1db0: 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74 20  he other object 
1dc0: 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65 61  to.** have a rea
1dd0: 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  d cursor..**.** 
1de0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65 66  For example, bef
1df0: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61  ore writing to a
1e00: 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  ny part of the t
1e10: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a 2a  able or index.**
1e20: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
1e30: 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75 6c  iRoot, one shoul
1e40: 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20  d call:.**.**   
1e50: 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65 61   assert( !hasRea
1e60: 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72 65  dConflicts(pBtre
1e70: 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f 0a  e, iRoot) );.*/.
1e80: 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52 65  static int hasRe
1e90: 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72 65  adConflicts(Btre
1ea0: 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f 20  e *pBtree, Pgno 
1eb0: 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72 73  iRoot){.  BtCurs
1ec0: 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  or *p;.  for(p=p
1ed0: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
1ee0: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
1ef0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  xt){.    if( p->
1f00: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 20  pgnoRoot==iRoot 
1f10: 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74 72  .     && p->pBtr
1f20: 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20 20  ee!=pBtree.     
1f30: 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65 65  && 0==(p->pBtree
1f40: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1f50: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1f60: 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20 20  tted).    ){.   
1f70: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1f80: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1f90: 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f  0;.}.#endif    /
1fa0: 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  * #ifdef SQLITE_
1fb0: 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
1fc0: 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20  Query to see if 
1fd0: 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d  Btree handle p m
1fe0: 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  ay obtain a lock
1ff0: 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a   of type eLock .
2000: 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72  ** (READ_LOCK or
2010: 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20   WRITE_LOCK) on 
2020: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
2030: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52  oot-page iTab. R
2040: 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  eturn.** SQLITE_
2050: 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d  OK if the lock m
2060: 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28  ay be obtained (
2070: 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65  by calling.** se
2080: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2090: 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c  eLock()), or SQL
20a0: 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f  ITE_LOCKED if no
20b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
20c0: 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68   querySharedCach
20d0: 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  eTableLock(Btree
20e0: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20   *p, Pgno iTab, 
20f0: 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53  u8 eLock){.  BtS
2100: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2110: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  pBt;.  BtLock *p
2120: 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Iter;..  assert(
2130: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2140: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
2150: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
2160: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  EAD_LOCK || eLoc
2170: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
2180: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
2190: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
21a0: 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26   !(p->db->flags&
21b0: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
21c0: 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d 3d  mitted)||eLock==
21d0: 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62  WRITE_LOCK||iTab
21e0: 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49  ==1 );.  .  /* I
21f0: 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 77  f requesting a w
2200: 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20  rite-lock, then 
2210: 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20 68  the Btree must h
2220: 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
2230: 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  e.  ** transacti
2240: 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2e  on on this file.
2250: 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79 2c   And, obviously,
2260: 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65 20   for this to be 
2270: 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20 6d  so there .  ** m
2280: 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 77  ust be an open w
2290: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
22a0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74 73   on the file its
22b0: 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  elf..  */.  asse
22c0: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
22d0: 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74 2d  LOCK || (p==pBt-
22e0: 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e 69  >pWriter && p->i
22f0: 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
2300: 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ITE) );.  assert
2310: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2320: 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61  CK || pBt->inTra
2330: 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
2340: 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f 2a  WRITE );.  .  /*
2350: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2360: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
2370: 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73 20  shared-cache is 
2380: 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20  not enabled */. 
2390: 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
23a0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
23b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
23c0: 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74 68    /* If some oth
23d0: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  er connection is
23e0: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63 6c   holding an excl
23f0: 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65 0a  usive lock, the.
2400: 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20 6c    ** requested l
2410: 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f  ock may not be o
2420: 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20  btained..  */.  
2430: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
2440: 21 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74 73  !=p && (pBt->bts
2450: 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43 4c  Flags & BTS_EXCL
2460: 55 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20 20  USIVE)!=0 ){.   
2470: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
2480: 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
2490: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
24a0: 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  b);.    return S
24b0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
24c0: 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20  REDCACHE;.  }.. 
24d0: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
24e0: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
24f0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
2500: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ){.    /* The co
2510: 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d 3e  ndition (pIter->
2520: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e  eLock!=eLock) in
2530: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
2540: 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20 73  f(...) .    ** s
2550: 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73 69  tatement is a si
2560: 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66 3a  mplification of:
2570: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2580: 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c   (eLock==WRITE_L
2590: 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c  OCK || pIter->eL
25a0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 29  ock==WRITE_LOCK)
25b0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73  .    **.    ** s
25c0: 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61  ince we know tha
25d0: 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  t if eLock==WRIT
25e0: 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f 20  E_LOCK, then no 
25f0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2600: 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c 64  .    ** may hold
2610: 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e   a WRITE_LOCK on
2620: 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74 68   any table in th
2630: 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20 74  is file (since t
2640: 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a 20  here can.    ** 
2650: 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65  only be a single
2660: 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a 2f   writer)..    */
2670: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
2680: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  er->eLock==READ_
2690: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
26a0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
26b0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
26c0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26d0: 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72 65   || pIter->pBtre
26e0: 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e 65  e==p || pIter->e
26f0: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29  Lock==READ_LOCK)
2700: 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
2710: 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49  >pBtree!=p && pI
2720: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
2730: 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f 63  b && pIter->eLoc
2740: 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k!=eLock ){.    
2750: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2760: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
2770: 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  , pIter->pBtree-
2780: 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
2790: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
27a0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
27b0: 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57 72  ert( p==pBt->pWr
27c0: 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20  iter );.        
27d0: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
27e0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20   BTS_PENDING;.  
27f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
2800: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2810: 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
2820: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2830: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
2840: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
2850: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
2860: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
2870: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2880: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64  _CACHE./*.** Add
2890: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74   a lock on the t
28a0: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
28b0: 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74 68  age iTable to th
28c0: 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 75  e shared-btree u
28d0: 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65 20  sed.** by Btree 
28e0: 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d 65  handle p. Parame
28f0: 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62  ter eLock must b
2900: 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c 4f  e either READ_LO
2910: 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f  CK or .** WRITE_
2920: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  LOCK..**.** This
2930: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
2940: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
2950: 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68 65  .**.**   (a) The
2960: 20 73 70 65 63 69 66 69 65 64 20 42 74 72 65 65   specified Btree
2970: 20 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f 6e   object p is con
2980: 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68 61 72  nected to a shar
2990: 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64 61  able.**       da
29a0: 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74 68  tabase (one with
29b0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73 68   the BtShared.sh
29c0: 61 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74 29  arable flag set)
29d0: 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62  , and.**.**   (b
29e0: 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65 65  ) No other Btree
29f0: 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61 20   objects hold a 
2a00: 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c 69  lock that confli
2a10: 63 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69 74  cts.**       wit
2a20: 68 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  h the requested 
2a30: 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72 79  lock (i.e. query
2a40: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2a50: 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20 20  Lock() has.**   
2a60: 20 20 20 20 61 6c 72 65 61 64 79 20 62 65 65 6e      already been
2a70: 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74 75   called and retu
2a80: 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29 2e  rned SQLITE_OK).
2a90: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
2aa0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2ab0: 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64 65  the lock is adde
2ac0: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20  d successfully. 
2ad0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a  SQLITE_NOMEM .**
2ae0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2af0: 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70 74  a malloc attempt
2b00: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
2b10: 63 20 69 6e 74 20 73 65 74 53 68 61 72 65 64 43  c int setSharedC
2b20: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74  acheTableLock(Bt
2b30: 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61  ree *p, Pgno iTa
2b40: 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a  ble, u8 eLock){.
2b50: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2b60: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f  = p->pBt;.  BtLo
2b70: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20  ck *pLock = 0;. 
2b80: 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
2b90: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2ba0: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
2bb0: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
2bc0: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2bd0: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49  CK || eLock==WRI
2be0: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  TE_LOCK );.  ass
2bf0: 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b  ert( p->db!=0 );
2c00: 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74  ..  /* A connect
2c10: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65 61  ion with the rea
2c20: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
2c30: 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76 65  ag set will neve
2c40: 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f 62  r try to.  ** ob
2c50: 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b  tain a read-lock
2c60: 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63   using this func
2c70: 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 72  tion. The only r
2c80: 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65  ead-lock obtaine
2c90: 64 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e 6e  d.  ** by a conn
2ca0: 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d 75  ection in read-u
2cb0: 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65 20  ncommitted mode 
2cc0: 69 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65  is on the sqlite
2cd0: 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74 61  _master .  ** ta
2ce0: 62 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c 6f  ble, and that lo
2cf0: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69  ck is obtained i
2d00: 6e 20 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  n BtreeBeginTran
2d10: 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  s().  */.  asser
2d20: 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c  t( 0==(p->db->fl
2d30: 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55  ags&SQLITE_ReadU
2d40: 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 65  ncommitted) || e
2d50: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
2d60: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   );..  /* This f
2d70: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f  unction should o
2d80: 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  nly be called on
2d90: 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74 72   a sharable b-tr
2da0: 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20 2a  ee after it .  *
2db0: 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65 72  * has been deter
2dc0: 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f 74  mined that no ot
2dd0: 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64 73  her b-tree holds
2de0: 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c   a conflicting l
2df0: 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ock.  */.  asser
2e00: 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  t( p->sharable )
2e10: 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
2e20: 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72  TE_OK==queryShar
2e30: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e40: 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63  (p, iTable, eLoc
2e50: 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72 73  k) );..  /* Firs
2e60: 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69 73  t search the lis
2e70: 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  t for an existin
2e80: 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74  g lock on this t
2e90: 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70  able. */.  for(p
2ea0: 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
2eb0: 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
2ec0: 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
2ed0: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61 62   if( pIter->iTab
2ee0: 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 49  le==iTable && pI
2ef0: 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ter->pBtree==p )
2f00: 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20  {.      pLock = 
2f10: 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72 65  pIter;.      bre
2f20: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
2f30: 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65   /* If the above
2f40: 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74 20   search did not 
2f50: 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73 74  find a BtLock st
2f60: 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e 67  ruct associating
2f70: 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77 69   Btree p.  ** wi
2f80: 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2c  th table iTable,
2f90: 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e   allocate one an
2fa0: 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74  d link it into t
2fb0: 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  he list..  */.  
2fc0: 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20  if( !pLock ){.  
2fd0: 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63    pLock = (BtLoc
2fe0: 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  k *)sqlite3Mallo
2ff0: 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c  cZero(sizeof(BtL
3000: 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20 21  ock));.    if( !
3010: 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72  pLock ){.      r
3020: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
3030: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  EM;.    }.    pL
3040: 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54  ock->iTable = iT
3050: 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d  able;.    pLock-
3060: 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20  >pBtree = p;.   
3070: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20   pLock->pNext = 
3080: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20  pBt->pLock;.    
3090: 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f  pBt->pLock = pLo
30a0: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  ck;.  }..  /* Se
30b0: 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f  t the BtLock.eLo
30c0: 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74  ck variable to t
30d0: 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68  he maximum of th
30e0: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20  e current lock. 
30f0: 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 71 75   ** and the requ
3100: 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73  ested lock. This
3110: 20 6d 65 61 6e 73 20 69 66 20 61 20 77 72 69 74   means if a writ
3120: 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65 61  e-lock was alrea
3130: 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64  dy held.  ** and
3140: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71   a read-lock req
3150: 75 65 73 74 65 64 2c 20 77 65 20 64 6f 6e 27 74  uested, we don't
3160: 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f 77   incorrectly dow
3170: 6e 67 72 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e  ngrade the lock.
3180: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
3190: 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f  WRITE_LOCK>READ_
31a0: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c  LOCK );.  if( eL
31b0: 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b  ock>pLock->eLock
31c0: 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65   ){.    pLock->e
31d0: 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20  Lock = eLock;.  
31e0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
31f0: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
3200: 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  /* !SQLITE_OMIT_
3210: 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a  SHARED_CACHE */.
3220: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
3230: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
3240: 45 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  E./*.** Release 
3250: 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f  all the table lo
3260: 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69  cks (locks obtai
3270: 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f  ned via calls to
3280: 0a 2a 2a 20 74 68 65 20 73 65 74 53 68 61 72 65  .** the setShare
3290: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
32a0: 29 20 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c  ) procedure) hel
32b0: 64 20 62 79 20 42 74 72 65 65 20 6f 62 6a 65 63  d by Btree objec
32c0: 74 20 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  t p..**.** This 
32d0: 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73  function assumes
32e0: 20 74 68 61 74 20 42 74 72 65 65 20 70 20 68 61   that Btree p ha
32f0: 73 20 61 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f  s an open read o
3300: 72 20 77 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e  r write .** tran
3310: 73 61 63 74 69 6f 6e 2e 20 49 66 20 69 74 20 64  saction. If it d
3320: 6f 65 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68  oes not, then th
3330: 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c  e BTS_PENDING fl
3340: 61 67 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63  ag.** may be inc
3350: 6f 72 72 65 63 74 6c 79 20 63 6c 65 61 72 65 64  orrectly cleared
3360: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3370: 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43   clearAllSharedC
3380: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42  acheTableLocks(B
3390: 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
33a0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
33b0: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70  Bt;.  BtLock **p
33c0: 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c  pIter = &pBt->pL
33d0: 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ock;..  assert( 
33e0: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
33f0: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
3400: 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62  ssert( p->sharab
3410: 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72  le || 0==*ppIter
3420: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
3430: 3e 69 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20  >inTrans>0 );.. 
3440: 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20   while( *ppIter 
3450: 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70  ){.    BtLock *p
3460: 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a  Lock = *ppIter;.
3470: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42 74      assert( (pBt
3480: 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
3490: 5f 45 58 43 4c 55 53 49 56 45 29 3d 3d 30 20 7c  _EXCLUSIVE)==0 |
34a0: 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d  | pBt->pWriter==
34b0: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b  pLock->pBtree );
34c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f  .    assert( pLo
34d0: 63 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72  ck->pBtree->inTr
34e0: 61 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  ans>=pLock->eLoc
34f0: 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f  k );.    if( pLo
3500: 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b  ck->pBtree==p ){
3510: 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d  .      *ppIter =
3520: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20   pLock->pNext;. 
3530: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
3540: 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c 7c  ck->iTable!=1 ||
3550: 20 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b   pLock==&p->lock
3560: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   );.      if( pL
3570: 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 29  ock->iTable!=1 )
3580: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3590: 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20  3_free(pLock);. 
35a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
35b0: 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72 20 3d  {.      ppIter =
35c0: 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a   &pLock->pNext;.
35d0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
35e0: 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c  ert( (pBt->btsFl
35f0: 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e  ags & BTS_PENDIN
3600: 47 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57  G)==0 || pBt->pW
3610: 72 69 74 65 72 20 29 3b 0a 20 20 69 66 28 20 70  riter );.  if( p
3620: 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29  Bt->pWriter==p )
3630: 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74  {.    pBt->pWrit
3640: 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  er = 0;.    pBt-
3650: 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42  >btsFlags &= ~(B
3660: 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53  TS_EXCLUSIVE|BTS
3670: 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65 6c  _PENDING);.  }el
3680: 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 61  se if( pBt->nTra
3690: 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20  nsaction==2 ){. 
36a0: 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74     /* This funct
36b0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
36c0: 65 6e 20 42 74 72 65 65 20 70 20 69 73 20 63 6f  en Btree p is co
36d0: 6e 63 6c 75 64 69 6e 67 20 69 74 73 20 0a 20 20  ncluding its .  
36e0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
36f0: 2e 20 49 66 20 74 68 65 72 65 20 63 75 72 72 65  . If there curre
3700: 6e 74 6c 79 20 65 78 69 73 74 73 20 61 20 77 72  ntly exists a wr
3710: 69 74 65 72 2c 20 61 6e 64 20 70 20 69 73 20 6e  iter, and p is n
3720: 6f 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77  ot.    ** that w
3730: 72 69 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20  riter, then the 
3740: 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20  number of locks 
3750: 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69  held by connecti
3760: 6f 6e 73 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a  ons other.    **
3770: 20 74 68 61 6e 20 74 68 65 20 77 72 69 74 65 72   than the writer
3780: 20 6d 75 73 74 20 62 65 20 61 62 6f 75 74 20 74   must be about t
3790: 6f 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20  o drop to zero. 
37a0: 49 6e 20 74 68 69 73 20 63 61 73 65 0a 20 20 20  In this case.   
37b0: 20 2a 2a 20 73 65 74 20 74 68 65 20 42 54 53 5f   ** set the BTS_
37c0: 50 45 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f 20  PENDING flag to 
37d0: 30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  0..    **.    **
37e0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74   If there is not
37f0: 20 63 75 72 72 65 6e 74 6c 79 20 61 20 77 72 69   currently a wri
3800: 74 65 72 2c 20 74 68 65 6e 20 42 54 53 5f 50 45  ter, then BTS_PE
3810: 4e 44 49 4e 47 20 6d 75 73 74 0a 20 20 20 20 2a  NDING must.    *
3820: 2a 20 62 65 20 7a 65 72 6f 20 61 6c 72 65 61 64  * be zero alread
3830: 79 2e 20 53 6f 20 74 68 69 73 20 6e 65 78 74 20  y. So this next 
3840: 6c 69 6e 65 20 69 73 20 68 61 72 6d 6c 65 73 73  line is harmless
3850: 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20   in that case.. 
3860: 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 62     */.    pBt->b
3870: 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f  tsFlags &= ~BTS_
3880: 50 45 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a 0a  PENDING;.  }.}..
3890: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
38a0: 69 6f 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c 20  ion changes all 
38b0: 77 72 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c 64  write-locks held
38c0: 20 62 79 20 42 74 72 65 65 20 70 20 69 6e 74 6f   by Btree p into
38d0: 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a   read-locks..*/.
38e0: 73 74 61 74 69 63 20 76 6f 69 64 20 64 6f 77 6e  static void down
38f0: 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61  gradeAllSharedCa
3900: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74  cheTableLocks(Bt
3910: 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
3920: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
3930: 74 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57  t;.  if( pBt->pW
3940: 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20  riter==p ){.    
3950: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20  BtLock *pLock;. 
3960: 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20     pBt->pWriter 
3970: 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74  = 0;.    pBt->bt
3980: 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53 5f  sFlags &= ~(BTS_
3990: 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50 45  EXCLUSIVE|BTS_PE
39a0: 4e 44 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72 28  NDING);.    for(
39b0: 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pLock=pBt->pLock
39c0: 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70  ; pLock; pLock=p
39d0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Lock->pNext){.  
39e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63      assert( pLoc
39f0: 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  k->eLock==READ_L
3a00: 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70 42  OCK || pLock->pB
3a10: 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20 20  tree==p );.     
3a20: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20   pLock->eLock = 
3a30: 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  READ_LOCK;.    }
3a40: 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  .  }.}..#endif /
3a50: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  * SQLITE_OMIT_SH
3a60: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73  ARED_CACHE */..s
3a70: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
3a80: 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  sePage(MemPage *
3a90: 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72 77  pPage);  /* Forw
3aa0: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
3ab0: 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69 73 20  ../*.***** This 
3ac0: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
3ad0: 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74  inside of assert
3ae0: 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a 2a 0a  () only ****.**.
3af0: 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  ** Verify that t
3b00: 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64 73 20  he cursor holds 
3b10: 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 69 74 73  the mutex on its
3b20: 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69 66   BtShared.*/.#if
3b30: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
3b40: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75 72 73  .static int curs
3b50: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42 74 43  orHoldsMutex(BtC
3b60: 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65 74  ursor *p){.  ret
3b70: 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  urn sqlite3_mute
3b80: 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d  x_held(p->pBt->m
3b90: 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  utex);.}.#endif.
3ba0: 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74  ./*.** Invalidat
3bb0: 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
3bc0: 61 63 68 65 20 6f 66 20 74 68 65 20 63 75 72 73  ache of the curs
3bd0: 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
3be0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
3bf0: 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65  .** on the share
3c00: 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d btree structur
3c10: 65 20 70 42 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e  e pBt..*/.#defin
3c20: 65 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72  e invalidateOver
3c30: 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 20  flowCache(pCur) 
3c40: 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
3c50: 26 3d 20 7e 42 54 43 46 5f 56 61 6c 69 64 4f 76  &= ~BTCF_ValidOv
3c60: 66 6c 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c  fl)../*.** Inval
3c70: 69 64 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  idate the overfl
3c80: 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
3c90: 68 65 20 66 6f 72 20 61 6c 6c 20 63 75 72 73 6f  he for all curso
3ca0: 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20  rs opened.** on 
3cb0: 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
3cc0: 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a   structure pBt..
3cd0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
3ce0: 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
3cf0: 66 6c 6f 77 43 61 63 68 65 28 42 74 53 68 61 72  flowCache(BtShar
3d00: 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75  ed *pBt){.  BtCu
3d10: 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72  rsor *p;.  asser
3d20: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
3d30: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
3d40: 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74  ) );.  for(p=pBt
3d50: 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
3d60: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
3d70: 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f  nvalidateOverflo
3d80: 77 43 61 63 68 65 28 70 29 3b 0a 20 20 7d 0a 7d  wCache(p);.  }.}
3d90: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3da0: 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f  _OMIT_INCRBLOB./
3db0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
3dc0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66  on is called bef
3dd0: 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  ore modifying th
3de0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20  e contents of a 
3df0: 74 61 62 6c 65 0a 2a 2a 20 74 6f 20 69 6e 76 61  table.** to inva
3e00: 6c 69 64 61 74 65 20 61 6e 79 20 69 6e 63 72 62  lidate any incrb
3e10: 6c 6f 62 20 63 75 72 73 6f 72 73 20 74 68 61 74  lob cursors that
3e20: 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65   are open on the
3e30: 0a 2a 2a 20 72 6f 77 20 6f 72 20 6f 6e 65 20 6f  .** row or one o
3e40: 66 20 74 68 65 20 72 6f 77 73 20 62 65 69 6e 67  f the rows being
3e50: 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a   modified..**.**
3e60: 20 49 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43   If argument isC
3e70: 6c 65 61 72 54 61 62 6c 65 20 69 73 20 74 72 75  learTable is tru
3e80: 65 2c 20 74 68 65 6e 20 74 68 65 20 65 6e 74 69  e, then the enti
3e90: 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  re contents of t
3ea0: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 61  he.** table is a
3eb0: 62 6f 75 74 20 74 6f 20 62 65 20 64 65 6c 65 74  bout to be delet
3ec0: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
3ed0: 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
3ee0: 69 6e 63 72 62 6c 6f 62 0a 2a 2a 20 63 75 72 73  incrblob.** curs
3ef0: 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 79 20  ors open on any 
3f00: 72 6f 77 20 77 69 74 68 69 6e 20 74 68 65 20 74  row within the t
3f10: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
3f20: 61 67 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a  age pgnoRoot..**
3f30: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
3f40: 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65  f argument isCle
3f50: 61 72 54 61 62 6c 65 20 69 73 20 66 61 6c 73 65  arTable is false
3f60: 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 77 20 77  , then the row w
3f70: 69 74 68 0a 2a 2a 20 72 6f 77 69 64 20 69 52 6f  ith.** rowid iRo
3f80: 77 20 69 73 20 62 65 69 6e 67 20 72 65 70 6c 61  w is being repla
3f90: 63 65 64 20 6f 72 20 64 65 6c 65 74 65 64 2e 20  ced or deleted. 
3fa0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e 76  In this case inv
3fb0: 61 6c 69 64 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20  alidate.** only 
3fc0: 74 68 6f 73 65 20 69 6e 63 72 62 6c 6f 62 20 63  those incrblob c
3fd0: 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  ursors open on t
3fe0: 68 61 74 20 73 70 65 63 69 66 69 63 20 72 6f 77  hat specific row
3ff0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4000: 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62   invalidateIncrb
4010: 6c 6f 62 43 75 72 73 6f 72 73 28 0a 20 20 42 74  lobCursors(.  Bt
4020: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 20 20 20  ree *pBtree,    
4030: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
4040: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 68  abase file to ch
4050: 65 63 6b 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f  eck */.  i64 iRo
4060: 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w,              
4070: 20 2f 2a 20 54 68 65 20 72 6f 77 69 64 20 74 68   /* The rowid th
4080: 61 74 20 6d 69 67 68 74 20 62 65 20 63 68 61 6e  at might be chan
4090: 67 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ging */.  int is
40a0: 43 6c 65 61 72 54 61 62 6c 65 20 20 20 20 20 20  ClearTable      
40b0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6c 6c    /* True if all
40c0: 20 72 6f 77 73 20 61 72 65 20 62 65 69 6e 67 20   rows are being 
40d0: 64 65 6c 65 74 65 64 20 2a 2f 0a 29 7b 0a 20 20  deleted */.){.  
40e0: 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69  BtCursor *p;.  i
40f0: 66 28 20 70 42 74 72 65 65 2d 3e 68 61 73 49 6e  f( pBtree->hasIn
4100: 63 72 62 6c 6f 62 43 75 72 3d 3d 30 20 29 20 72  crblobCur==0 ) r
4110: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
4120: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
4130: 64 73 4d 75 74 65 78 28 70 42 74 72 65 65 29 20  dsMutex(pBtree) 
4140: 29 3b 0a 20 20 70 42 74 72 65 65 2d 3e 68 61 73  );.  pBtree->has
4150: 49 6e 63 72 62 6c 6f 62 43 75 72 20 3d 20 30 3b  IncrblobCur = 0;
4160: 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d  .  for(p=pBtree-
4170: 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  >pBt->pCursor; p
4180: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
4190: 20 20 20 69 66 28 20 28 70 2d 3e 63 75 72 46 6c     if( (p->curFl
41a0: 61 67 73 20 26 20 42 54 43 46 5f 49 6e 63 72 62  ags & BTCF_Incrb
41b0: 6c 6f 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  lob)!=0 ){.     
41c0: 20 70 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72   pBtree->hasIncr
41d0: 62 6c 6f 62 43 75 72 20 3d 20 31 3b 0a 20 20 20  blobCur = 1;.   
41e0: 20 20 20 69 66 28 20 69 73 43 6c 65 61 72 54 61     if( isClearTa
41f0: 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e 66 6f 2e 6e  ble || p->info.n
4200: 4b 65 79 3d 3d 69 52 6f 77 20 29 7b 0a 20 20 20  Key==iRow ){.   
4210: 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d       p->eState =
4220: 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
4230: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4240: 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a 20 20 2f 2a   }.}..#else.  /*
4250: 20 53 74 75 62 20 66 75 6e 63 74 69 6f 6e 20 77   Stub function w
4260: 68 65 6e 20 49 4e 43 52 42 4c 4f 42 20 69 73 20  hen INCRBLOB is 
4270: 6f 6d 69 74 74 65 64 20 2a 2f 0a 20 20 23 64 65  omitted */.  #de
4280: 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 49  fine invalidateI
4290: 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 78  ncrblobCursors(x
42a0: 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20  ,y,z).#endif /* 
42b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
42c0: 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  BLOB */../*.** S
42d0: 65 74 20 62 69 74 20 70 67 6e 6f 20 6f 66 20 74  et bit pgno of t
42e0: 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  he BtShared.pHas
42f0: 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20  Content bitvec. 
4300: 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 0a  This is called .
4310: 2a 2a 20 77 68 65 6e 20 61 20 70 61 67 65 20 74  ** when a page t
4320: 68 61 74 20 70 72 65 76 69 6f 75 73 6c 79 20 63  hat previously c
4330: 6f 6e 74 61 69 6e 65 64 20 64 61 74 61 20 62 65  ontained data be
4340: 63 6f 6d 65 73 20 61 20 66 72 65 65 2d 6c 69 73  comes a free-lis
4350: 74 20 6c 65 61 66 20 0a 2a 2a 20 70 61 67 65 2e  t leaf .** page.
4360: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 74 53 68 61  .**.** The BtSha
4370: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20  red.pHasContent 
4380: 62 69 74 76 65 63 20 65 78 69 73 74 73 20 74 6f  bitvec exists to
4390: 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 6e 20   work around an 
43a0: 6f 62 73 63 75 72 65 0a 2a 2a 20 62 75 67 20 63  obscure.** bug c
43b0: 61 75 73 65 64 20 62 79 20 74 68 65 20 69 6e 74  aused by the int
43c0: 65 72 61 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20  eraction of two 
43d0: 75 73 65 66 75 6c 20 49 4f 20 6f 70 74 69 6d 69  useful IO optimi
43e0: 7a 61 74 69 6f 6e 73 20 73 75 72 72 6f 75 6e 64  zations surround
43f0: 69 6e 67 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74  ing.** free-list
4400: 20 6c 65 61 66 20 70 61 67 65 73 3a 0a 2a 2a 0a   leaf pages:.**.
4410: 2a 2a 20 20 20 31 29 20 57 68 65 6e 20 61 6c 6c  **   1) When all
4420: 20 64 61 74 61 20 69 73 20 64 65 6c 65 74 65 64   data is deleted
4430: 20 66 72 6f 6d 20 61 20 70 61 67 65 20 61 6e 64   from a page and
4440: 20 74 68 65 20 70 61 67 65 20 62 65 63 6f 6d 65   the page become
4450: 73 0a 2a 2a 20 20 20 20 20 20 61 20 66 72 65 65  s.**      a free
4460: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 2c  -list leaf page,
4470: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
4480: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
4490: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
44a0: 20 28 61 73 20 66 72 65 65 2d 6c 69 73 74 20 6c   (as free-list l
44b0: 65 61 66 20 70 61 67 65 73 20 63 6f 6e 74 61 69  eaf pages contai
44c0: 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67 66 75 6c 20  n no meaningful 
44d0: 64 61 74 61 29 2e 20 53 6f 6d 65 74 69 6d 65 73  data). Sometimes
44e0: 0a 2a 2a 20 20 20 20 20 20 73 75 63 68 20 61 20  .**      such a 
44f0: 70 61 67 65 20 69 73 20 6e 6f 74 20 65 76 65 6e  page is not even
4500: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 28 61 73 20   journalled (as 
4510: 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6d  it will not be m
4520: 6f 64 69 66 69 65 64 2c 0a 2a 2a 20 20 20 20 20  odified,.**     
4530: 20 77 68 79 20 62 6f 74 68 65 72 20 6a 6f 75 72   why bother jour
4540: 6e 61 6c 6c 69 6e 67 20 69 74 3f 29 2e 0a 2a 2a  nalling it?)..**
4550: 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e 20 61 20  .**   2) When a 
4560: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
4570: 61 67 65 20 69 73 20 72 65 75 73 65 64 2c 20 69  age is reused, i
4580: 74 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f  ts content is no
4590: 74 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66  t read.**      f
45a0: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
45b0: 20 6f 72 20 77 72 69 74 74 65 6e 20 74 6f 20 74   or written to t
45c0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
45d0: 28 77 68 79 20 73 68 6f 75 6c 64 20 69 74 0a 2a  (why should it.*
45e0: 2a 20 20 20 20 20 20 62 65 2c 20 69 66 20 69 74  *      be, if it
45f0: 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 6d   is not at all m
4600: 65 61 6e 69 6e 67 66 75 6c 3f 29 2e 0a 2a 2a 0a  eaningful?)..**.
4610: 2a 2a 20 42 79 20 74 68 65 6d 73 65 6c 76 65 73  ** By themselves
4620: 2c 20 74 68 65 73 65 20 6f 70 74 69 6d 69 7a 61  , these optimiza
4630: 74 69 6f 6e 73 20 77 6f 72 6b 20 66 69 6e 65 20  tions work fine 
4640: 61 6e 64 20 70 72 6f 76 69 64 65 20 61 20 68 61  and provide a ha
4650: 6e 64 79 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e  ndy.** performan
4660: 63 65 20 62 6f 6f 73 74 20 74 6f 20 62 75 6c 6b  ce boost to bulk
4670: 20 64 65 6c 65 74 65 20 6f 72 20 69 6e 73 65 72   delete or inser
4680: 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 48 6f  t operations. Ho
4690: 77 65 76 65 72 2c 20 69 66 0a 2a 2a 20 61 20 70  wever, if.** a p
46a0: 61 67 65 20 69 73 20 6d 6f 76 65 64 20 74 6f 20  age is moved to 
46b0: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  the free-list an
46c0: 64 20 74 68 65 6e 20 72 65 75 73 65 64 20 77 69  d then reused wi
46d0: 74 68 69 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a  thin the same.**
46e0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20   transaction, a 
46f0: 70 72 6f 62 6c 65 6d 20 63 6f 6d 65 73 20 75 70  problem comes up
4700: 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73  . If the page is
4710: 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20   not journalled 
4720: 77 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20 6d 6f  when.** it is mo
4730: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
4740: 6c 69 73 74 20 61 6e 64 20 69 74 20 69 73 20 61  list and it is a
4750: 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c  lso not journall
4760: 65 64 20 77 68 65 6e 20 69 74 0a 2a 2a 20 69 73  ed when it.** is
4770: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
4780: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  the free-list an
4790: 64 20 72 65 75 73 65 64 2c 20 74 68 65 6e 20 74  d reused, then t
47a0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
47b0: 0a 2a 2a 20 6d 61 79 20 62 65 20 6c 6f 73 74 2e  .** may be lost.
47c0: 20 49 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   In the event of
47d0: 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20   a rollback, it 
47e0: 6d 61 79 20 6e 6f 74 20 62 65 20 70 6f 73 73 69  may not be possi
47f0: 62 6c 65 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72  ble.** to restor
4800: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
4810: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63  o its original c
4820: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a 2a 2a  onfiguration..**
4830: 0a 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e  .** The solution
4840: 20 69 73 20 74 68 65 20 42 74 53 68 61 72 65 64   is the BtShared
4850: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
4860: 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20  vec. Whenever a 
4870: 70 61 67 65 20 69 73 20 0a 2a 2a 20 6d 6f 76 65  page is .** move
4880: 64 20 74 6f 20 62 65 63 6f 6d 65 20 61 20 66 72  d to become a fr
4890: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
48a0: 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  e, the correspon
48b0: 64 69 6e 67 20 62 69 74 20 69 73 0a 2a 2a 20 73  ding bit is.** s
48c0: 65 74 20 69 6e 20 74 68 65 20 62 69 74 76 65 63  et in the bitvec
48d0: 2e 20 57 68 65 6e 65 76 65 72 20 61 20 6c 65 61  . Whenever a lea
48e0: 66 20 70 61 67 65 20 69 73 20 65 78 74 72 61 63  f page is extrac
48f0: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65  ted from the fre
4900: 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f 70 74 69 6d  e-list,.** optim
4910: 69 7a 61 74 69 6f 6e 20 32 20 61 62 6f 76 65 20  ization 2 above 
4920: 69 73 20 6f 6d 69 74 74 65 64 20 69 66 20 74 68  is omitted if th
4930: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
4940: 62 69 74 20 69 73 20 61 6c 72 65 61 64 79 0a 2a  bit is already.*
4950: 2a 20 73 65 74 20 69 6e 20 42 74 53 68 61 72 65  * set in BtShare
4960: 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 2e 20 54  d.pHasContent. T
4970: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
4980: 68 65 20 62 69 74 76 65 63 20 61 72 65 20 63 6c  he bitvec are cl
4990: 65 61 72 65 64 0a 2a 2a 20 61 74 20 74 68 65 20  eared.** at the 
49a0: 65 6e 64 20 6f 66 20 65 76 65 72 79 20 74 72 61  end of every tra
49b0: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nsaction..*/.sta
49c0: 74 69 63 20 69 6e 74 20 62 74 72 65 65 53 65 74  tic int btreeSet
49d0: 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61  HasContent(BtSha
49e0: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
49f0: 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  gno){.  int rc =
4a00: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
4a10: 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  ( !pBt->pHasCont
4a20: 65 6e 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ent ){.    asser
4a30: 74 28 20 70 67 6e 6f 3c 3d 70 42 74 2d 3e 6e 50  t( pgno<=pBt->nP
4a40: 61 67 65 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  age );.    pBt->
4a50: 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 73 71  pHasContent = sq
4a60: 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
4a70: 65 28 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20  e(pBt->nPage);. 
4a80: 20 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61     if( !pBt->pHa
4a90: 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  sContent ){.    
4aa0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
4ab0: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
4ac0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
4ad0: 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d 73 71 6c 69  OK && pgno<=sqli
4ae0: 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70 42  te3BitvecSize(pB
4af0: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 20  t->pHasContent) 
4b00: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
4b10: 74 65 33 42 69 74 76 65 63 53 65 74 28 70 42 74  te3BitvecSet(pBt
4b20: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 2c 20 70  ->pHasContent, p
4b30: 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  gno);.  }.  retu
4b40: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
4b50: 51 75 65 72 79 20 74 68 65 20 42 74 53 68 61 72  Query the BtShar
4b60: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 76  ed.pHasContent v
4b70: 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ector..**.** Thi
4b80: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
4b90: 6c 6c 65 64 20 77 68 65 6e 20 61 20 66 72 65 65  lled when a free
4ba0: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20  -list leaf page 
4bb0: 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  is removed from 
4bc0: 74 68 65 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74  the.** free-list
4bd0: 20 66 6f 72 20 72 65 75 73 65 2e 20 49 74 20 72   for reuse. It r
4be0: 65 74 75 72 6e 73 20 66 61 6c 73 65 20 69 66 20  eturns false if 
4bf0: 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 72 65  it is safe to re
4c00: 74 72 69 65 76 65 20 74 68 65 0a 2a 2a 20 70 61  trieve the.** pa
4c10: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
4c20: 72 20 6c 61 79 65 72 20 77 69 74 68 20 74 68 65  r layer with the
4c30: 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c   'no-content' fl
4c40: 61 67 20 73 65 74 2e 20 54 72 75 65 20 6f 74 68  ag set. True oth
4c50: 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
4c60: 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 48 61  c int btreeGetHa
4c70: 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65  sContent(BtShare
4c80: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e  d *pBt, Pgno pgn
4c90: 6f 29 7b 0a 20 20 42 69 74 76 65 63 20 2a 70 20  o){.  Bitvec *p 
4ca0: 3d 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65  = pBt->pHasConte
4cb0: 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 20  nt;.  return (p 
4cc0: 26 26 20 28 70 67 6e 6f 3e 73 71 6c 69 74 65 33  && (pgno>sqlite3
4cd0: 42 69 74 76 65 63 53 69 7a 65 28 70 29 20 7c 7c  BitvecSize(p) ||
4ce0: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65   sqlite3BitvecTe
4cf0: 73 74 28 70 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d  st(p, pgno)));.}
4d00: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 28 64  ../*.** Clear (d
4d10: 65 73 74 72 6f 79 29 20 74 68 65 20 42 74 53 68  estroy) the BtSh
4d20: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
4d30: 20 62 69 74 76 65 63 2e 20 54 68 69 73 20 73 68   bitvec. This sh
4d40: 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b  ould be.** invok
4d50: 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ed at the conclu
4d60: 73 69 6f 6e 20 6f 66 20 65 61 63 68 20 77 72 69  sion of each wri
4d70: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  te-transaction..
4d80: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
4d90: 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74  treeClearHasCont
4da0: 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ent(BtShared *pB
4db0: 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 42 69 74  t){.  sqlite3Bit
4dc0: 76 65 63 44 65 73 74 72 6f 79 28 70 42 74 2d 3e  vecDestroy(pBt->
4dd0: 70 48 61 73 43 6f 6e 74 65 6e 74 29 3b 0a 20 20  pHasContent);.  
4de0: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
4df0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   = 0;.}../*.** R
4e00: 65 6c 65 61 73 65 20 61 6c 6c 20 6f 66 20 74 68  elease all of th
4e10: 65 20 61 70 50 61 67 65 5b 5d 20 70 61 67 65 73  e apPage[] pages
4e20: 20 66 6f 72 20 61 20 63 75 72 73 6f 72 2e 0a 2a   for a cursor..*
4e30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  /.static void bt
4e40: 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72  reeReleaseAllCur
4e50: 73 6f 72 50 61 67 65 73 28 42 74 43 75 72 73 6f  sorPages(BtCurso
4e60: 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  r *pCur){.  int 
4e70: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
4e80: 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b  =pCur->iPage; i+
4e90: 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  +){.    releaseP
4ea0: 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65  age(pCur->apPage
4eb0: 5b 69 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  [i]);.    pCur->
4ec0: 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20  apPage[i] = 0;. 
4ed0: 20 7d 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65   }.  pCur->iPage
4ee0: 20 3d 20 2d 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   = -1;.}.../*.**
4ef0: 20 53 61 76 65 20 74 68 65 20 63 75 72 72 65 6e   Save the curren
4f00: 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  t cursor positio
4f10: 6e 20 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c  n in the variabl
4f20: 65 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79  es BtCursor.nKey
4f30: 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f   .** and BtCurso
4f40: 72 2e 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73  r.pKey. The curs
4f50: 6f 72 27 73 20 73 74 61 74 65 20 69 73 20 73 65  or's state is se
4f60: 74 20 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55  t to CURSOR_REQU
4f70: 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54  IRESEEK..**.** T
4f80: 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65  he caller must e
4f90: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 63  nsure that the c
4fa0: 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 20 28  ursor is valid (
4fb0: 68 61 73 20 65 53 74 61 74 65 3d 3d 43 55 52 53  has eState==CURS
4fc0: 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69  OR_VALID).** pri
4fd0: 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68  or to calling th
4fe0: 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f  is routine.  .*/
4ff0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
5000: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42  CursorPosition(B
5010: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
5020: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
5030: 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49  ert( CURSOR_VALI
5040: 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
5050: 7c 7c 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45  || CURSOR_SKIPNE
5060: 58 54 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  XT==pCur->eState
5070: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d   );.  assert( 0=
5080: 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20  =pCur->pKey );. 
5090: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
50a0: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
50b0: 29 3b 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  );..  if( pCur->
50c0: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53  eState==CURSOR_S
50d0: 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 70  KIPNEXT ){.    p
50e0: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
50f0: 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65  RSOR_VALID;.  }e
5100: 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73  lse{.    pCur->s
5110: 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 7d  kipNext = 0;.  }
5120: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
5130: 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72  treeKeySize(pCur
5140: 2c 20 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a  , &pCur->nKey);.
5150: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
5160: 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 2f 2a 20 4b  LITE_OK );  /* K
5170: 65 79 53 69 7a 65 28 29 20 63 61 6e 6e 6f 74 20  eySize() cannot 
5180: 66 61 69 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  fail */..  /* If
5190: 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 74 4b   this is an intK
51a0: 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74  ey table, then t
51b0: 68 65 20 61 62 6f 76 65 20 63 61 6c 6c 20 74 6f  he above call to
51c0: 20 42 74 72 65 65 4b 65 79 53 69 7a 65 28 29 0a   BtreeKeySize().
51d0: 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20    ** stores the 
51e0: 69 6e 74 65 67 65 72 20 6b 65 79 20 69 6e 20 70  integer key in p
51f0: 43 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74 68  Cur->nKey. In th
5200: 69 73 20 63 61 73 65 20 74 68 69 73 20 76 61 6c  is case this val
5210: 75 65 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20 74  ue is.  ** all t
5220: 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64 2e  hat is required.
5230: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70   Otherwise, if p
5240: 43 75 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20  Cur is not open 
5250: 6f 6e 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20 2a  on an intKey.  *
5260: 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61  * table, then ma
5270: 6c 6c 6f 63 20 73 70 61 63 65 20 66 6f 72 20 61  lloc space for a
5280: 6e 64 20 73 74 6f 72 65 20 74 68 65 20 70 43 75  nd store the pCu
5290: 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f 66  r->nKey bytes of
52a0: 20 6b 65 79 20 0a 20 20 2a 2a 20 64 61 74 61 2e   key .  ** data.
52b0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 70  .  */.  if( 0==p
52c0: 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29  Cur->curIntKey )
52d0: 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79  {.    void *pKey
52e0: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
52f0: 28 20 70 43 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a  ( pCur->nKey );.
5300: 20 20 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a      if( pKey ){.
5310: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
5320: 65 33 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c  e3BtreeKey(pCur,
5330: 20 30 2c 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e   0, (int)pCur->n
5340: 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20  Key, pKey);.    
5350: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5360: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
5370: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79  Cur->pKey = pKey
5380: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
5390: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
53a0: 72 65 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 20  ree(pKey);.     
53b0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
53c0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
53d0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
53e0: 0a 20 20 61 73 73 65 72 74 28 20 21 70 43 75 72  .  assert( !pCur
53f0: 2d 3e 63 75 72 49 6e 74 4b 65 79 20 7c 7c 20 21  ->curIntKey || !
5400: 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20  pCur->pKey );.. 
5410: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
5420: 4f 4b 20 29 7b 0a 20 20 20 20 62 74 72 65 65 52  OK ){.    btreeR
5430: 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
5440: 61 67 65 73 28 70 43 75 72 29 3b 0a 20 20 20 20  ages(pCur);.    
5450: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
5460: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
5470: 4b 3b 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c 69  K;.  }..  invali
5480: 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
5490: 65 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72  e(pCur);.  retur
54a0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  n rc;.}../* Forw
54b0: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
54c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
54d0: 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65  TE_NOINLINE save
54e0: 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 42 74  CursorsOnList(Bt
54f0: 43 75 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42 74 43  Cursor*,Pgno,BtC
5500: 75 72 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  ursor*);../*.** 
5510: 53 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f  Save the positio
5520: 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72  ns of all cursor
5530: 73 20 28 65 78 63 65 70 74 20 70 45 78 63 65 70  s (except pExcep
5540: 74 29 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e  t) that are open
5550: 20 6f 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   on.** the table
5560: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
5570: 69 52 6f 6f 74 2e 20 20 22 53 61 76 69 6e 67 20  iRoot.  "Saving 
5580: 74 68 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74  the cursor posit
5590: 69 6f 6e 22 20 6d 65 61 6e 73 20 74 68 61 74 0a  ion" means that.
55a0: 2a 2a 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20  ** the location 
55b0: 69 6e 20 74 68 65 20 62 74 72 65 65 20 69 73 20  in the btree is 
55c0: 72 65 6d 65 6d 62 65 72 65 64 20 69 6e 20 73 75  remembered in su
55d0: 63 68 20 61 20 77 61 79 20 74 68 61 74 20 69 74  ch a way that it
55e0: 20 63 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76 65 64   can be.** moved
55f0: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 73 61 6d   back to the sam
5600: 65 20 73 70 6f 74 20 61 66 74 65 72 20 74 68 65  e spot after the
5610: 20 62 74 72 65 65 20 68 61 73 20 62 65 65 6e 20   btree has been 
5620: 6d 6f 64 69 66 69 65 64 2e 20 20 54 68 69 73 0a  modified.  This.
5630: 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ** routine is ca
5640: 6c 6c 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65  lled just before
5650: 20 63 75 72 73 6f 72 20 70 45 78 63 65 70 74 20   cursor pExcept 
5660: 69 73 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66  is used to modif
5670: 79 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 2c 20  y the.** table, 
5680: 66 6f 72 20 65 78 61 6d 70 6c 65 20 69 6e 20 42  for example in B
5690: 74 72 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20  treeDelete() or 
56a0: 42 74 72 65 65 49 6e 73 65 72 74 28 29 2e 0a 2a  BtreeInsert()..*
56b0: 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
56c0: 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75  e two or more cu
56d0: 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d  rsors on the sam
56e0: 65 20 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c  e btree, then al
56f0: 6c 20 73 75 63 68 20 0a 2a 2a 20 63 75 72 73 6f  l such .** curso
5700: 72 73 20 73 68 6f 75 6c 64 20 68 61 76 65 20 74  rs should have t
5710: 68 65 69 72 20 42 54 43 46 5f 4d 75 6c 74 69 70  heir BTCF_Multip
5720: 6c 65 20 66 6c 61 67 20 73 65 74 2e 20 20 54 68  le flag set.  Th
5730: 65 20 62 74 72 65 65 43 75 72 73 6f 72 28 29 0a  e btreeCursor().
5740: 2a 2a 20 72 6f 75 74 69 6e 65 20 65 6e 66 6f 72  ** routine enfor
5750: 63 65 73 20 74 68 61 74 20 72 75 6c 65 2e 20 20  ces that rule.  
5760: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c  This routine onl
5770: 79 20 6e 65 65 64 73 20 74 6f 20 62 65 20 63 61  y needs to be ca
5780: 6c 6c 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 75  lled in.** the u
5790: 6e 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65  ncommon case whe
57a0: 6e 20 70 45 78 70 65 63 74 20 68 61 73 20 74 68  n pExpect has th
57b0: 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20  e BTCF_Multiple 
57c0: 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  flag set..**.** 
57d0: 49 66 20 70 45 78 70 65 63 74 21 3d 4e 55 4c 4c  If pExpect!=NULL
57e0: 20 61 6e 64 20 69 66 20 6e 6f 20 6f 74 68 65 72   and if no other
57f0: 20 63 75 72 73 6f 72 73 20 61 72 65 20 66 6f 75   cursors are fou
5800: 6e 64 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 72  nd on the same r
5810: 6f 6f 74 2d 70 61 67 65 2c 0a 2a 2a 20 74 68 65  oot-page,.** the
5820: 6e 20 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69  n the BTCF_Multi
5830: 70 6c 65 20 66 6c 61 67 20 6f 6e 20 70 45 78 70  ple flag on pExp
5840: 65 63 74 20 69 73 20 63 6c 65 61 72 65 64 2c 20  ect is cleared, 
5850: 74 6f 20 61 76 6f 69 64 20 61 6e 6f 74 68 65 72  to avoid another
5860: 0a 2a 2a 20 70 6f 69 6e 74 6c 65 73 73 20 63 61  .** pointless ca
5870: 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ll to this routi
5880: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  ne..**.** Implem
5890: 65 6e 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20  entation note:  
58a0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 65 72  This routine mer
58b0: 65 6c 79 20 63 68 65 63 6b 73 20 74 6f 20 73 65  ely checks to se
58c0: 65 20 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73  e if any cursors
58d0: 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 73  .** need to be s
58e0: 61 76 65 64 2e 20 20 49 74 20 63 61 6c 6c 73 20  aved.  It calls 
58f0: 6f 75 74 20 74 6f 20 73 61 76 65 43 75 72 73 6f  out to saveCurso
5900: 72 73 4f 6e 4c 69 73 74 28 29 20 69 6e 20 74 68  rsOnList() in th
5910: 65 20 28 75 6e 75 73 75 61 6c 29 0a 2a 2a 20 65  e (unusual).** e
5920: 76 65 6e 74 20 74 68 61 74 20 63 75 72 73 6f 72  vent that cursor
5930: 73 20 61 72 65 20 69 6e 20 6e 65 65 64 20 74 6f  s are in need to
5940: 20 62 65 69 6e 67 20 73 61 76 65 64 2e 0a 2a 2f   being saved..*/
5950: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
5960: 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61  AllCursors(BtSha
5970: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69  red *pBt, Pgno i
5980: 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a  Root, BtCursor *
5990: 70 45 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75  pExcept){.  BtCu
59a0: 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72  rsor *p;.  asser
59b0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
59c0: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
59d0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
59e0: 45 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78  Except==0 || pEx
59f0: 63 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29  cept->pBt==pBt )
5a00: 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70  ;.  for(p=pBt->p
5a10: 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
5a20: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
5a30: 70 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30  p!=pExcept && (0
5a40: 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67  ==iRoot || p->pg
5a50: 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29  noRoot==iRoot) )
5a60: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
5a70: 28 20 70 20 29 20 72 65 74 75 72 6e 20 73 61 76  ( p ) return sav
5a80: 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 70  eCursorsOnList(p
5a90: 2c 20 69 52 6f 6f 74 2c 20 70 45 78 63 65 70 74  , iRoot, pExcept
5aa0: 29 3b 0a 20 20 69 66 28 20 70 45 78 63 65 70 74  );.  if( pExcept
5ab0: 20 29 20 70 45 78 63 65 70 74 2d 3e 63 75 72 46   ) pExcept->curF
5ac0: 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 4d 75  lags &= ~BTCF_Mu
5ad0: 6c 74 69 70 6c 65 3b 0a 20 20 72 65 74 75 72 6e  ltiple;.  return
5ae0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
5af0: 2a 20 54 68 69 73 20 68 65 6c 70 65 72 20 72 6f  * This helper ro
5b00: 75 74 69 6e 65 20 74 6f 20 73 61 76 65 41 6c 6c  utine to saveAll
5b10: 43 75 72 73 6f 72 73 20 64 6f 65 73 20 74 68 65  Cursors does the
5b20: 20 61 63 74 75 61 6c 20 77 6f 72 6b 20 6f 66 20   actual work of 
5b30: 73 61 76 69 6e 67 0a 2a 2a 20 74 68 65 20 63 75  saving.** the cu
5b40: 72 73 6f 72 73 20 69 66 20 61 6e 64 20 77 68 65  rsors if and whe
5b50: 6e 20 61 20 63 75 72 73 6f 72 20 69 73 20 66 6f  n a cursor is fo
5b60: 75 6e 64 20 74 68 61 74 20 61 63 74 75 61 6c 6c  und that actuall
5b70: 79 20 72 65 71 75 69 72 65 73 20 73 61 76 69 6e  y requires savin
5b80: 67 2e 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e  g..** The common
5b90: 20 63 61 73 65 20 69 73 20 74 68 61 74 20 6e 6f   case is that no
5ba0: 20 63 75 72 73 6f 72 73 20 6e 65 65 64 20 74 6f   cursors need to
5bb0: 20 62 65 20 73 61 76 65 64 2c 20 73 6f 20 74 68   be saved, so th
5bc0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a  is routine is.**
5bd0: 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d   broken out from
5be0: 20 69 74 73 20 63 61 6c 6c 65 72 20 74 6f 20 61   its caller to a
5bf0: 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79  void unnecessary
5c00: 20 73 74 61 63 6b 20 70 6f 69 6e 74 65 72 20 6d   stack pointer m
5c10: 6f 76 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  ovement..*/.stat
5c20: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f  ic int SQLITE_NO
5c30: 49 4e 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f  INLINE saveCurso
5c40: 72 73 4f 6e 4c 69 73 74 28 0a 20 20 42 74 43 75  rsOnList(.  BtCu
5c50: 72 73 6f 72 20 2a 70 2c 20 20 20 20 20 20 20 20  rsor *p,        
5c60: 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 63 75   /* The first cu
5c70: 72 73 6f 72 20 74 68 61 74 20 6e 65 65 64 73 20  rsor that needs 
5c80: 73 61 76 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f  saving */.  Pgno
5c90: 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20   iRoot,         
5ca0: 20 2f 2a 20 4f 6e 6c 79 20 73 61 76 65 20 63 75   /* Only save cu
5cb0: 72 73 6f 72 20 77 69 74 68 20 74 68 69 73 20 69  rsor with this i
5cc0: 52 6f 6f 74 2e 20 53 61 76 65 20 61 6c 6c 20 69  Root. Save all i
5cd0: 66 20 7a 65 72 6f 20 2a 2f 0a 20 20 42 74 43 75  f zero */.  BtCu
5ce0: 72 73 6f 72 20 2a 70 45 78 63 65 70 74 20 20 20  rsor *pExcept   
5cf0: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 61 76 65 20   /* Do not save 
5d00: 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 29  this cursor */.)
5d10: 7b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20  {.  do{.    if( 
5d20: 70 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30  p!=pExcept && (0
5d30: 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67  ==iRoot || p->pg
5d40: 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29  noRoot==iRoot) )
5d50: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65  {.      if( p->e
5d60: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
5d70: 4c 49 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65  LID || p->eState
5d80: 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58  ==CURSOR_SKIPNEX
5d90: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  T ){.        int
5da0: 20 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72   rc = saveCursor
5db0: 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20  Position(p);.   
5dc0: 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
5dd0: 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20  OK!=rc ){.      
5de0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
5df0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
5e00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65  else{.        te
5e10: 73 74 63 61 73 65 28 20 70 2d 3e 69 50 61 67 65  stcase( p->iPage
5e20: 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 62 74  >0 );.        bt
5e30: 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72  reeReleaseAllCur
5e40: 73 6f 72 50 61 67 65 73 28 70 29 3b 0a 20 20 20  sorPages(p);.   
5e50: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
5e60: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
5e70: 77 68 69 6c 65 28 20 70 20 29 3b 0a 20 20 72 65  while( p );.  re
5e80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
5e90: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74  }../*.** Clear t
5ea0: 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f  he current curso
5eb0: 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76  r position..*/.v
5ec0: 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
5ed0: 43 6c 65 61 72 43 75 72 73 6f 72 28 42 74 43 75  ClearCursor(BtCu
5ee0: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
5ef0: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
5f00: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
5f10: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
5f20: 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70  pCur->pKey);.  p
5f30: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20  Cur->pKey = 0;. 
5f40: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
5f50: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
5f60: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73  }../*.** In this
5f70: 20 76 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65   version of Btre
5f80: 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73  eMoveto, pKey is
5f90: 20 61 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20   a packed index 
5fa0: 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61  record.** such a
5fb0: 73 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62  s is generated b
5fc0: 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63  y the OP_MakeRec
5fd0: 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70  ord opcode.  Unp
5fe0: 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72  ack the.** recor
5ff0: 64 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20  d and then call 
6000: 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63  BtreeMovetoUnpac
6010: 6b 65 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20  ked() to do the 
6020: 77 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  work..*/.static 
6030: 69 6e 74 20 62 74 72 65 65 4d 6f 76 65 74 6f 28  int btreeMoveto(
6040: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
6050: 72 2c 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  r,     /* Cursor
6060: 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72   open on the btr
6070: 65 65 20 74 6f 20 62 65 20 73 65 61 72 63 68 65  ee to be searche
6080: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  d */.  const voi
6090: 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61  d *pKey,   /* Pa
60a0: 63 6b 65 64 20 6b 65 79 20 69 66 20 74 68 65 20  cked key if the 
60b0: 62 74 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65  btree is an inde
60c0: 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c  x */.  i64 nKey,
60d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
60e0: 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61  teger key for ta
60f0: 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70  bles.  Size of p
6100: 4b 65 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20  Key for indices 
6110: 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20  */.  int bias,  
6120: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73           /* Bias
6130: 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68   search to the h
6140: 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74  igh end */.  int
6150: 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20   *pRes          
6160: 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68   /* Write search
6170: 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
6180: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
6190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61a0: 20 2f 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20   /* Status code 
61b0: 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
61c0: 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20  ord *pIdxKey;   
61d0: 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65  /* Unpacked inde
61e0: 78 20 6b 65 79 20 2a 2f 0a 20 20 63 68 61 72 20  x key */.  char 
61f0: 61 53 70 61 63 65 5b 32 30 30 5d 3b 20 20 20 20  aSpace[200];    
6200: 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 70        /* Temp sp
6210: 61 63 65 20 66 6f 72 20 70 49 64 78 4b 65 79 20  ace for pIdxKey 
6220: 2d 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 61 6c  - to avoid a mal
6230: 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70  loc */.  char *p
6240: 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28  Free = 0;..  if(
6250: 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 73 73   pKey ){.    ass
6260: 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29  ert( nKey==(i64)
6270: 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20  (int)nKey );.   
6280: 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74   pIdxKey = sqlit
6290: 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63  e3VdbeAllocUnpac
62a0: 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 20 20 20  kedRecord(.     
62b0: 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66     pCur->pKeyInf
62c0: 6f 2c 20 61 53 70 61 63 65 2c 20 73 69 7a 65 6f  o, aSpace, sizeo
62d0: 66 28 61 53 70 61 63 65 29 2c 20 26 70 46 72 65  f(aSpace), &pFre
62e0: 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  e.    );.    if(
62f0: 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20 72 65   pIdxKey==0 ) re
6300: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
6310: 4d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  M;.    sqlite3Vd
6320: 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70  beRecordUnpack(p
6330: 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28  Cur->pKeyInfo, (
6340: 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 20  int)nKey, pKey, 
6350: 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 69 66  pIdxKey);.    if
6360: 28 20 70 49 64 78 4b 65 79 2d 3e 6e 46 69 65 6c  ( pIdxKey->nFiel
6370: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  d==0 ){.      sq
6380: 6c 69 74 65 33 44 62 46 72 65 65 28 70 43 75 72  lite3DbFree(pCur
6390: 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20  ->pKeyInfo->db, 
63a0: 70 46 72 65 65 29 3b 0a 20 20 20 20 20 20 72 65  pFree);.      re
63b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
63c0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
63d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64    }else{.    pId
63e0: 78 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  xKey = 0;.  }.  
63f0: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
6400: 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28  eMovetoUnpacked(
6410: 70 43 75 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e  pCur, pIdxKey, n
6420: 4b 65 79 2c 20 62 69 61 73 2c 20 70 52 65 73 29  Key, bias, pRes)
6430: 3b 0a 20 20 69 66 28 20 70 46 72 65 65 20 29 7b  ;.  if( pFree ){
6440: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
6450: 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  ee(pCur->pKeyInf
6460: 6f 2d 3e 64 62 2c 20 70 46 72 65 65 29 3b 0a 20  o->db, pFree);. 
6470: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
6480: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65  }../*.** Restore
6490: 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
64a0: 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77  he position it w
64b0: 61 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f  as in (or as clo
64c0: 73 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c  se to as possibl
64d0: 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43  e).** when saveC
64e0: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20  ursorPosition() 
64f0: 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65  was called. Note
6500: 20 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20   that this call 
6510: 64 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20  deletes the .** 
6520: 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69  saved position i
6530: 6e 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61  nfo stored by sa
6540: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
6550: 28 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e  (), so there can
6560: 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f   be.** at most o
6570: 6e 65 20 65 66 66 65 63 74 69 76 65 20 72 65 73  ne effective res
6580: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
6590: 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20  on() call after 
65a0: 65 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72  each .** saveCur
65b0: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a  sorPosition()..*
65c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
65d0: 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50  eeRestoreCursorP
65e0: 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72  osition(BtCursor
65f0: 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72   *pCur){.  int r
6600: 63 3b 0a 20 20 69 6e 74 20 73 6b 69 70 4e 65 78  c;.  int skipNex
6610: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  t;.  assert( cur
6620: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
6630: 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
6640: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43   pCur->eState>=C
6650: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
6660: 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  K );.  if( pCur-
6670: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
6680: 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74  FAULT ){.    ret
6690: 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  urn pCur->skipNe
66a0: 78 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  xt;.  }.  pCur->
66b0: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
66c0: 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20  INVALID;.  rc = 
66d0: 62 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72  btreeMoveto(pCur
66e0: 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43  , pCur->pKey, pC
66f0: 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 73 6b  ur->nKey, 0, &sk
6700: 69 70 4e 65 78 74 29 3b 0a 20 20 69 66 28 20 72  ipNext);.  if( r
6710: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
6720: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
6730: 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20  (pCur->pKey);.  
6740: 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30    pCur->pKey = 0
6750: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
6760: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
6770: 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  OR_VALID || pCur
6780: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
6790: 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  _INVALID );.    
67a0: 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 7c  pCur->skipNext |
67b0: 3d 20 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20  = skipNext;.    
67c0: 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  if( pCur->skipNe
67d0: 78 74 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61  xt && pCur->eSta
67e0: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
67f0: 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
6800: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
6810: 53 4b 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d 0a  SKIPNEXT;.    }.
6820: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
6830: 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74  .}..#define rest
6840: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
6850: 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74  n(p) \.  (p->eSt
6860: 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate>=CURSOR_REQU
6870: 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20  IRESEEK ? \.    
6880: 20 20 20 20 20 62 74 72 65 65 52 65 73 74 6f 72       btreeRestor
6890: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
68a0: 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20  p) : \.         
68b0: 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a  SQLITE_OK)../*.*
68c0: 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74  * Determine whet
68d0: 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72  her or not a cur
68e0: 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72  sor has moved fr
68f0: 6f 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  om the position 
6900: 77 68 65 72 65 0a 2a 2a 20 69 74 20 77 61 73 20  where.** it was 
6910: 6c 61 73 74 20 70 6c 61 63 65 64 2c 20 6f 72 20  last placed, or 
6920: 68 61 73 20 62 65 65 6e 20 69 6e 76 61 6c 69 64  has been invalid
6930: 61 74 65 64 20 66 6f 72 20 61 6e 79 20 6f 74 68  ated for any oth
6940: 65 72 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20 43 75  er reason..** Cu
6950: 72 73 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77  rsors can move w
6960: 68 65 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79  hen the row they
6970: 20 61 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 74   are pointing at
6980: 20 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74 0a   is deleted out.
6990: 2a 2a 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68  ** from under th
69a0: 65 6d 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e  em, for example.
69b0: 20 20 43 75 72 73 6f 72 20 6d 69 67 68 74 20 61    Cursor might a
69c0: 6c 73 6f 20 6d 6f 76 65 20 69 66 20 61 20 62 74  lso move if a bt
69d0: 72 65 65 0a 2a 2a 20 69 73 20 72 65 62 61 6c 61  ree.** is rebala
69e0: 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  nced..**.** Call
69f0: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
6a00: 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 63 75 72   with a NULL cur
6a10: 73 6f 72 20 70 6f 69 6e 74 65 72 20 72 65 74 75  sor pointer retu
6a20: 72 6e 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a  rns false..**.**
6a30: 20 55 73 65 20 74 68 65 20 73 65 70 61 72 61 74   Use the separat
6a40: 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  e sqlite3BtreeCu
6a50: 72 73 6f 72 52 65 73 74 6f 72 65 28 29 20 72 6f  rsorRestore() ro
6a60: 75 74 69 6e 65 20 74 6f 20 72 65 73 74 6f 72 65  utine to restore
6a70: 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 62 61 63   a cursor.** bac
6a80: 6b 20 74 6f 20 77 68 65 72 65 20 69 74 20 6f 75  k to where it ou
6a90: 67 68 74 20 74 6f 20 62 65 20 69 66 20 74 68 69  ght to be if thi
6aa0: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
6ab0: 73 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73  s true..*/.int s
6ac0: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
6ad0: 72 48 61 73 4d 6f 76 65 64 28 42 74 43 75 72 73  rHasMoved(BtCurs
6ae0: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74  or *pCur){.  ret
6af0: 75 72 6e 20 70 43 75 72 2d 3e 65 53 74 61 74 65  urn pCur->eState
6b00: 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  !=CURSOR_VALID;.
6b10: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
6b20: 75 74 69 6e 65 20 72 65 73 74 6f 72 65 73 20 61  utine restores a
6b30: 20 63 75 72 73 6f 72 20 62 61 63 6b 20 74 6f 20   cursor back to 
6b40: 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 70 6f 73  its original pos
6b50: 69 74 69 6f 6e 20 61 66 74 65 72 20 69 74 0a 2a  ition after it.*
6b60: 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 76 65 64  * has been moved
6b70: 20 62 79 20 73 6f 6d 65 20 6f 75 74 73 69 64 65   by some outside
6b80: 20 61 63 74 69 76 69 74 79 20 28 73 75 63 68 20   activity (such 
6b90: 61 73 20 61 20 62 74 72 65 65 20 72 65 62 61 6c  as a btree rebal
6ba0: 61 6e 63 65 20 6f 72 0a 2a 2a 20 61 20 72 6f 77  ance or.** a row
6bb0: 20 68 61 76 69 6e 67 20 62 65 65 6e 20 64 65 6c   having been del
6bc0: 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
6bd0: 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 29 2e  der the cursor).
6be0: 20 20 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63    .**.** On succ
6bf0: 65 73 73 2c 20 74 68 65 20 2a 70 44 69 66 66 65  ess, the *pDiffe
6c00: 72 65 6e 74 52 6f 77 20 70 61 72 61 6d 65 74 65  rentRow paramete
6c10: 72 20 69 73 20 66 61 6c 73 65 20 69 66 20 74 68  r is false if th
6c20: 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
6c30: 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  .** pointing at 
6c40: 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65  exactly the same
6c50: 20 72 6f 77 2e 20 20 2a 70 44 69 66 66 65 72 6e   row.  *pDiffern
6c60: 74 52 6f 77 20 69 73 20 74 68 65 20 72 6f 77 20  tRow is the row 
6c70: 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61  the cursor.** wa
6c80: 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 68 61  s pointing to ha
6c90: 73 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2c 20  s been deleted, 
6ca0: 66 6f 72 63 69 6e 67 20 74 68 65 20 63 75 72 73  forcing the curs
6cb0: 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 73  or to point to s
6cc0: 6f 6d 65 0a 2a 2a 20 6e 65 61 72 62 79 20 72 6f  ome.** nearby ro
6cd0: 77 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  w..**.** This ro
6ce0: 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c  utine should onl
6cf0: 79 20 62 65 20 63 61 6c 6c 65 64 20 66 6f 72 20  y be called for 
6d00: 61 20 63 75 72 73 6f 72 20 74 68 61 74 20 6a 75  a cursor that ju
6d10: 73 74 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 54  st returned.** T
6d20: 52 55 45 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  RUE from sqlite3
6d30: 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
6d40: 76 65 64 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ved()..*/.int sq
6d50: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
6d60: 52 65 73 74 6f 72 65 28 42 74 43 75 72 73 6f 72  Restore(BtCursor
6d70: 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 44 69   *pCur, int *pDi
6d80: 66 66 65 72 65 6e 74 52 6f 77 29 7b 0a 20 20 69  fferentRow){.  i
6d90: 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
6da0: 28 20 70 43 75 72 21 3d 30 20 29 3b 0a 20 20 61  ( pCur!=0 );.  a
6db0: 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
6dc0: 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
6dd0: 44 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74  D );.  rc = rest
6de0: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
6df0: 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  n(pCur);.  if( r
6e00: 63 20 29 7b 0a 20 20 20 20 2a 70 44 69 66 66 65  c ){.    *pDiffe
6e10: 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20  rentRow = 1;.   
6e20: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
6e30: 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
6e40: 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
6e50: 20 29 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72   ){.    *pDiffer
6e60: 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20 7d 65  entRow = 1;.  }e
6e70: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
6e80: 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d   pCur->skipNext=
6e90: 3d 30 20 29 3b 0a 20 20 20 20 2a 70 44 69 66 66  =0 );.    *pDiff
6ea0: 65 72 65 6e 74 52 6f 77 20 3d 20 30 3b 0a 20 20  erentRow = 0;.  
6eb0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
6ec0: 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  E_OK;.}..#ifndef
6ed0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
6ee0: 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69  OVACUUM./*.** Gi
6ef0: 76 65 6e 20 61 20 70 61 67 65 20 6e 75 6d 62 65  ven a page numbe
6f00: 72 20 6f 66 20 61 20 72 65 67 75 6c 61 72 20 64  r of a regular d
6f10: 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 72 65  atabase page, re
6f20: 74 75 72 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a  turn the page.**
6f30: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
6f40: 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
6f50: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
6f60: 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  he entry for the
6f70: 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67 65 20 6e  .** input page n
6f80: 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  umber..**.** Ret
6f90: 75 72 6e 20 30 20 28 6e 6f 74 20 61 20 76 61 6c  urn 0 (not a val
6fa0: 69 64 20 70 61 67 65 29 20 66 6f 72 20 70 67 6e  id page) for pgn
6fb0: 6f 3d 3d 31 20 73 69 6e 63 65 20 74 68 65 72 65  o==1 since there
6fc0: 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65   is.** no pointe
6fd0: 72 20 6d 61 70 20 61 73 73 6f 63 69 61 74 65 64  r map associated
6fe0: 20 77 69 74 68 20 70 61 67 65 20 31 2e 20 20 54   with page 1.  T
6ff0: 68 65 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  he integrity_che
7000: 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20 72 65 71 75  ck logic.** requ
7010: 69 72 65 73 20 74 68 61 74 20 70 74 72 6d 61 70  ires that ptrmap
7020: 50 61 67 65 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a  Pageno(*,1)!=1..
7030: 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70  */.static Pgno p
7040: 74 72 6d 61 70 50 61 67 65 6e 6f 28 42 74 53 68  trmapPageno(BtSh
7050: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
7060: 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61  pgno){.  int nPa
7070: 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20  gesPerMapPage;. 
7080: 20 50 67 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72   Pgno iPtrMap, r
7090: 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  et;.  assert( sq
70a0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
70b0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
70c0: 20 20 69 66 28 20 70 67 6e 6f 3c 32 20 29 20 72    if( pgno<2 ) r
70d0: 65 74 75 72 6e 20 30 3b 0a 20 20 6e 50 61 67 65  eturn 0;.  nPage
70e0: 73 50 65 72 4d 61 70 50 61 67 65 20 3d 20 28 70  sPerMapPage = (p
70f0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35  Bt->usableSize/5
7100: 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d  )+1;.  iPtrMap =
7110: 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73   (pgno-2)/nPages
7120: 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 72 65  PerMapPage;.  re
7130: 74 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50 61  t = (iPtrMap*nPa
7140: 67 65 73 50 65 72 4d 61 70 50 61 67 65 29 20 2b  gesPerMapPage) +
7150: 20 32 3b 20 0a 20 20 69 66 28 20 72 65 74 3d 3d   2; .  if( ret==
7160: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
7170: 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 65  E(pBt) ){.    re
7180: 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  t++;.  }.  retur
7190: 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n ret;.}../*.** 
71a0: 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69  Write an entry i
71b0: 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20  nto the pointer 
71c0: 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  map..**.** This 
71d0: 72 6f 75 74 69 6e 65 20 75 70 64 61 74 65 73 20  routine updates 
71e0: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
71f0: 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 6e  entry for page n
7200: 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73  umber 'key'.** s
7210: 6f 20 74 68 61 74 20 69 74 20 6d 61 70 73 20 74  o that it maps t
7220: 6f 20 74 79 70 65 20 27 65 54 79 70 65 27 20 61  o type 'eType' a
7230: 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e  nd parent page n
7240: 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a  umber 'pgno'..**
7250: 0a 2a 2a 20 49 66 20 2a 70 52 43 20 69 73 20 69  .** If *pRC is i
7260: 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72  nitially non-zer
7270: 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b  o (non-SQLITE_OK
7280: 29 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  ) then this rout
7290: 69 6e 65 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f  ine is.** a no-o
72a0: 70 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20  p.  If an error 
72b0: 6f 63 63 75 72 73 2c 20 74 68 65 20 61 70 70 72  occurs, the appr
72c0: 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
72d0: 64 65 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a  de is written.**
72e0: 20 69 6e 74 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73   into *pRC..*/.s
72f0: 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61  tatic void ptrma
7300: 70 50 75 74 28 42 74 53 68 61 72 65 64 20 2a 70  pPut(BtShared *p
7310: 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38  Bt, Pgno key, u8
7320: 20 65 54 79 70 65 2c 20 50 67 6e 6f 20 70 61 72   eType, Pgno par
7330: 65 6e 74 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  ent, int *pRC){.
7340: 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
7350: 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74  e;  /* The point
7360: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
7370: 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20   u8 *pPtrmap;   
7380: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
7390: 72 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20 20  r map data */.  
73a0: 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20 20  Pgno iPtrmap;   
73b0: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
73c0: 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72   map page number
73d0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74   */.  int offset
73e0: 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65  ;       /* Offse
73f0: 74 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70  t in pointer map
7400: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72   page */.  int r
7410: 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  c;           /* 
7420: 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d  Return code from
7430: 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f   subfunctions */
7440: 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72  ..  if( *pRC ) r
7450: 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74  eturn;..  assert
7460: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
7470: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
7480: 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73   );.  /* The mas
7490: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65  ter-journal page
74a0: 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 6e 65 76   number must nev
74b0: 65 72 20 62 65 20 75 73 65 64 20 61 73 20 61 20  er be used as a 
74c0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
74d0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d   */.  assert( 0=
74e0: 3d 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70  =PTRMAP_ISPAGE(p
74f0: 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  Bt, PENDING_BYTE
7500: 5f 50 41 47 45 28 70 42 74 29 29 20 29 3b 0a 0a  _PAGE(pBt)) );..
7510: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
7520: 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 69  utoVacuum );.  i
7530: 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20  f( key==0 ){.   
7540: 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43   *pRC = SQLITE_C
7550: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
7560: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
7570: 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f  Ptrmap = PTRMAP_
7580: 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29  PAGENO(pBt, key)
7590: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
75a0: 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
75b0: 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26  ager, iPtrmap, &
75c0: 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
75d0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
75e0: 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a  .    *pRC = rc;.
75f0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
7600: 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41    offset = PTRMA
7610: 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74 72  P_PTROFFSET(iPtr
7620: 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28  map, key);.  if(
7630: 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20   offset<0 ){.   
7640: 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43   *pRC = SQLITE_C
7650: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
7660: 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78 69   goto ptrmap_exi
7670: 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  t;.  }.  assert(
7680: 20 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29   offset <= (int)
7690: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
76a0: 35 20 29 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d  5 );.  pPtrmap =
76b0: 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61   (u8 *)sqlite3Pa
76c0: 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
76d0: 67 65 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70  ge);..  if( eTyp
76e0: 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e!=pPtrmap[offse
76f0: 74 5d 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26  t] || get4byte(&
7700: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
7710: 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20  ])!=parent ){.  
7720: 20 20 54 52 41 43 45 28 28 22 50 54 52 4d 41 50    TRACE(("PTRMAP
7730: 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64  _UPDATE: %d->(%d
7740: 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54  ,%d)\n", key, eT
7750: 79 70 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20  ype, parent));. 
7760: 20 20 20 2a 70 52 43 3d 20 72 63 20 3d 20 73 71     *pRC= rc = sq
7770: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
7780: 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
7790: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
77a0: 29 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70  ){.      pPtrmap
77b0: 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65  [offset] = eType
77c0: 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
77d0: 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  (&pPtrmap[offset
77e0: 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20  +1], parent);.  
77f0: 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70 5f    }.  }..ptrmap_
7800: 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 50  exit:.  sqlite3P
7810: 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
7820: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  e);.}../*.** Rea
7830: 64 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20  d an entry from 
7840: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
7850: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
7860: 69 6e 65 20 72 65 74 72 69 65 76 65 73 20 74 68  ine retrieves th
7870: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
7880: 74 72 79 20 66 6f 72 20 70 61 67 65 20 27 6b 65  try for page 'ke
7890: 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74  y', writing.** t
78a0: 68 65 20 74 79 70 65 20 61 6e 64 20 70 61 72 65  he type and pare
78b0: 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  nt page number t
78c0: 6f 20 2a 70 45 54 79 70 65 20 61 6e 64 20 2a 70  o *pEType and *p
78d0: 50 67 6e 6f 20 72 65 73 70 65 63 74 69 76 65 6c  Pgno respectivel
78e0: 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63  y..** An error c
78f0: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
7900: 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  if something goe
7910: 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69  s wrong, otherwi
7920: 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  se SQLITE_OK..*/
7930: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d  .static int ptrm
7940: 61 70 47 65 74 28 42 74 53 68 61 72 65 64 20 2a  apGet(BtShared *
7950: 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75  pBt, Pgno key, u
7960: 38 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f 20  8 *pEType, Pgno 
7970: 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67  *pPgno){.  DbPag
7980: 65 20 2a 70 44 62 50 61 67 65 3b 20 20 20 2f 2a  e *pDbPage;   /*
7990: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
79a0: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69   page */.  int i
79b0: 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a  Ptrmap;       /*
79c0: 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   Pointer map pag
79d0: 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20  e index */.  u8 
79e0: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20  *pPtrmap;       
79f0: 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70  /* Pointer map p
7a00: 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  age data */.  in
7a10: 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20  t offset;       
7a20: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65 6e   /* Offset of en
7a30: 74 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d  try in pointer m
7a40: 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a  ap */.  int rc;.
7a50: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
7a60: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
7a70: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
7a80: 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50  iPtrmap = PTRMAP
7a90: 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79  _PAGENO(pBt, key
7aa0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
7ab0: 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
7ac0: 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20  Pager, iPtrmap, 
7ad0: 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  &pDbPage);.  if(
7ae0: 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 65   rc!=0 ){.    re
7af0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
7b00: 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73  Ptrmap = (u8 *)s
7b10: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
7b20: 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20  ta(pDbPage);..  
7b30: 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f  offset = PTRMAP_
7b40: 50 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61  PTROFFSET(iPtrma
7b50: 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f  p, key);.  if( o
7b60: 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 73  ffset<0 ){.    s
7b70: 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
7b80: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 72  (pDbPage);.    r
7b90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
7ba0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
7bb0: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 20   assert( offset 
7bc0: 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61  <= (int)pBt->usa
7bd0: 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20 61  bleSize-5 );.  a
7be0: 73 73 65 72 74 28 20 70 45 54 79 70 65 21 3d 30  ssert( pEType!=0
7bf0: 20 29 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d 20   );.  *pEType = 
7c00: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b  pPtrmap[offset];
7c10: 0a 20 20 69 66 28 20 70 50 67 6e 6f 20 29 20 2a  .  if( pPgno ) *
7c20: 70 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  pPgno = get4byte
7c30: 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  (&pPtrmap[offset
7c40: 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  +1]);..  sqlite3
7c50: 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
7c60: 67 65 29 3b 0a 20 20 69 66 28 20 2a 70 45 54 79  ge);.  if( *pETy
7c70: 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e  pe<1 || *pEType>
7c80: 35 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  5 ) return SQLIT
7c90: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
7ca0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7cb0: 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20  OK;.}..#else /* 
7cc0: 69 66 20 64 65 66 69 6e 65 64 20 53 51 4c 49 54  if defined SQLIT
7cd0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
7ce0: 4d 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 70  M */.  #define p
7cf0: 74 72 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c 7a  trmapPut(w,x,y,z
7d00: 2c 72 63 29 0a 20 20 23 64 65 66 69 6e 65 20 70  ,rc).  #define p
7d10: 74 72 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a  trmapGet(w,x,y,z
7d20: 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64  ) SQLITE_OK.  #d
7d30: 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74 4f  efine ptrmapPutO
7d40: 76 66 6c 50 74 72 28 78 2c 20 79 2c 20 72 63 29  vflPtr(x, y, rc)
7d50: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47  .#endif../*.** G
7d60: 69 76 65 6e 20 61 20 62 74 72 65 65 20 70 61 67  iven a btree pag
7d70: 65 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64  e and a cell ind
7d80: 65 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20  ex (0 means the 
7d90: 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a  first cell on.**
7da0: 20 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61   the page, 1 mea
7db0: 6e 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65  ns the second ce
7dc0: 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68  ll, and so forth
7dd0: 29 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  ) return a point
7de0: 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c  er.** to the cel
7df0: 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a  l content..**.**
7e00: 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72   findCellPastPtr
7e10: 28 29 20 64 6f 65 73 20 74 68 65 20 73 61 6d 65  () does the same
7e20: 20 65 78 63 65 70 74 20 69 74 20 73 6b 69 70 73   except it skips
7e30: 20 70 61 73 74 20 74 68 65 20 69 6e 69 74 69 61   past the initia
7e40: 6c 0a 2a 2a 20 34 2d 62 79 74 65 20 63 68 69 6c  l.** 4-byte chil
7e50: 64 20 70 6f 69 6e 74 65 72 20 66 6f 75 6e 64 20  d pointer found 
7e60: 6f 6e 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65  on interior page
7e70: 73 2c 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  s, if there is o
7e80: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ne..**.** This r
7e90: 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c  outine works onl
7ea0: 79 20 66 6f 72 20 70 61 67 65 73 20 74 68 61 74  y for pages that
7eb0: 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20   do not contain 
7ec0: 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a  overflow cells..
7ed0: 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43  */.#define findC
7ee0: 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20 28 28 50  ell(P,I) \.  ((P
7ef0: 29 2d 3e 61 44 61 74 61 20 2b 20 28 28 50 29 2d  )->aData + ((P)-
7f00: 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74 32  >maskPage & get2
7f10: 62 79 74 65 41 6c 69 67 6e 65 64 28 26 28 50 29  byteAligned(&(P)
7f20: 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29  ->aCellIdx[2*(I)
7f30: 5d 29 29 29 0a 23 64 65 66 69 6e 65 20 66 69 6e  ]))).#define fin
7f40: 64 43 65 6c 6c 50 61 73 74 50 74 72 28 50 2c 49  dCellPastPtr(P,I
7f50: 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74  ) \.  ((P)->aDat
7f60: 61 4f 66 73 74 20 2b 20 28 28 50 29 2d 3e 6d 61  aOfst + ((P)->ma
7f70: 73 6b 50 61 67 65 20 26 20 67 65 74 32 62 79 74  skPage & get2byt
7f80: 65 41 6c 69 67 6e 65 64 28 26 28 50 29 2d 3e 61  eAligned(&(P)->a
7f90: 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29  CellIdx[2*(I)]))
7fa0: 29 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  ).../*.** This i
7fb0: 73 20 63 6f 6d 6d 6f 6e 20 74 61 69 6c 20 70 72  s common tail pr
7fc0: 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 62 74 72  ocessing for btr
7fd0: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
7fe0: 20 61 6e 64 0a 2a 2a 20 62 74 72 65 65 50 61 72   and.** btreePar
7ff0: 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28 29  seCellPtrIndex()
8000: 20 66 6f 72 20 74 68 65 20 63 61 73 65 20 77 68   for the case wh
8010: 65 6e 20 74 68 65 20 63 65 6c 6c 20 64 6f 65 73  en the cell does
8020: 20 6e 6f 74 20 66 69 74 20 65 6e 74 69 72 65 6c   not fit entirel
8030: 79 0a 2a 2a 20 6f 6e 20 61 20 73 69 6e 67 6c 65  y.** on a single
8040: 20 42 2d 74 72 65 65 20 70 61 67 65 2e 20 20 4d   B-tree page.  M
8050: 61 6b 65 20 6e 65 63 65 73 73 61 72 79 20 61 64  ake necessary ad
8060: 6a 75 73 74 6d 65 6e 74 73 20 74 6f 20 74 68 65  justments to the
8070: 20 43 65 6c 6c 49 6e 66 6f 0a 2a 2a 20 73 74 72   CellInfo.** str
8080: 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ucture..*/.stati
8090: 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
80a0: 45 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73  E void btreePars
80b0: 65 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46  eCellAdjustSizeF
80c0: 6f 72 4f 76 65 72 66 6c 6f 77 28 0a 20 20 4d 65  orOverflow(.  Me
80d0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
80e0: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
80f0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c  ntaining the cel
8100: 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  l */.  u8 *pCell
8110: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
8120: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
8130: 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20   cell text. */. 
8140: 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f   CellInfo *pInfo
8150: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c           /* Fill
8160: 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
8170: 72 65 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 49 66  re */.){.  /* If
8180: 20 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c   the payload wil
8190: 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65  l not fit comple
81a0: 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61  tely on the loca
81b0: 6c 20 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a  l page, we have.
81c0: 20 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20 68    ** to decide h
81d0: 6f 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72 65  ow much to store
81e0: 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77   locally and how
81f0: 20 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f   much to spill o
8200: 6e 74 6f 0a 20 20 2a 2a 20 6f 76 65 72 66 6c 6f  nto.  ** overflo
8210: 77 20 70 61 67 65 73 2e 20 20 54 68 65 20 73 74  w pages.  The st
8220: 72 61 74 65 67 79 20 69 73 20 74 6f 20 6d 69 6e  rategy is to min
8230: 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74  imize the amount
8240: 20 6f 66 20 75 6e 75 73 65 64 0a 20 20 2a 2a 20   of unused.  ** 
8250: 73 70 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f  space on overflo
8260: 77 20 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65  w pages while ke
8270: 65 70 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74  eping the amount
8280: 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67   of local storag
8290: 65 0a 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65  e.  ** in betwee
82a0: 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d  n minLocal and m
82b0: 61 78 4c 6f 63 61 6c 2e 0a 20 20 2a 2a 0a 20 20  axLocal..  **.  
82c0: 2a 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63 68 61  ** Warning:  cha
82d0: 6e 67 69 6e 67 20 74 68 65 20 77 61 79 20 6f 76  nging the way ov
82e0: 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69  erflow payload i
82f0: 73 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e  s distributed in
8300: 20 61 6e 79 0a 20 20 2a 2a 20 77 61 79 20 77 69   any.  ** way wi
8310: 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20  ll result in an 
8320: 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c  incompatible fil
8330: 65 20 66 6f 72 6d 61 74 2e 0a 20 20 2a 2f 0a 20  e format..  */. 
8340: 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20   int minLocal;  
8350: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e  /* Minimum amoun
8360: 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c  t of payload hel
8370: 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 69  d locally */.  i
8380: 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a  nt maxLocal;  /*
8390: 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20   Maximum amount 
83a0: 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20  of payload held 
83b0: 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74  locally */.  int
83c0: 20 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f   surplus;   /* O
83d0: 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20  verflow payload 
83e0: 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f  available for lo
83f0: 63 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a  cal storage */..
8400: 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61    minLocal = pPa
8410: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  ge->minLocal;.  
8420: 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65  maxLocal = pPage
8430: 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 73 75  ->maxLocal;.  su
8440: 72 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c  rplus = minLocal
8450: 20 2b 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c   + (pInfo->nPayl
8460: 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25  oad - minLocal)%
8470: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
8480: 62 6c 65 53 69 7a 65 2d 34 29 3b 0a 20 20 74 65  bleSize-4);.  te
8490: 73 74 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d  stcase( surplus=
84a0: 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74  =maxLocal );.  t
84b0: 65 73 74 63 61 73 65 28 20 73 75 72 70 6c 75 73  estcase( surplus
84c0: 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ==maxLocal+1 );.
84d0: 20 20 69 66 28 20 73 75 72 70 6c 75 73 20 3c 3d    if( surplus <=
84e0: 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20   maxLocal ){.   
84f0: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
8500: 20 28 75 31 36 29 73 75 72 70 6c 75 73 3b 0a 20   (u16)surplus;. 
8510: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66   }else{.    pInf
8520: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  o->nLocal = (u16
8530: 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20  )minLocal;.  }. 
8540: 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f   pInfo->iOverflo
8550: 77 20 3d 20 28 75 31 36 29 28 26 70 49 6e 66 6f  w = (u16)(&pInfo
8560: 2d 3e 70 50 61 79 6c 6f 61 64 5b 70 49 6e 66 6f  ->pPayload[pInfo
8570: 2d 3e 6e 4c 6f 63 61 6c 5d 20 2d 20 70 43 65 6c  ->nLocal] - pCel
8580: 6c 29 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53 69  l);.  pInfo->nSi
8590: 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f 76 65  ze = pInfo->iOve
85a0: 72 66 6c 6f 77 20 2b 20 34 3b 0a 7d 0a 0a 2f 2a  rflow + 4;.}../*
85b0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
85c0: 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 69  g routines are i
85d0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f  mplementations o
85e0: 66 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 78 50  f the MemPage.xP
85f0: 61 72 73 65 43 65 6c 6c 28 29 0a 2a 2a 20 6d 65  arseCell().** me
8600: 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 73  thod..**.** Pars
8610: 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  e a cell content
8620: 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20   block and fill 
8630: 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20  in the CellInfo 
8640: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
8650: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
8660: 74 72 28 29 20 20 20 20 20 20 20 20 3d 3e 20 20  tr()        =>  
8670: 20 74 61 62 6c 65 20 62 74 72 65 65 20 6c 65 61   table btree lea
8680: 66 20 6e 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65  f nodes.** btree
8690: 50 61 72 73 65 43 65 6c 6c 4e 6f 50 61 79 6c 6f  ParseCellNoPaylo
86a0: 61 64 28 29 20 20 3d 3e 20 20 20 74 61 62 6c 65  ad()  =>   table
86b0: 20 62 74 72 65 65 20 69 6e 74 65 72 6e 61 6c 20   btree internal 
86c0: 6e 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65 50 61  nodes.** btreePa
86d0: 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28  rseCellPtrIndex(
86e0: 29 20 20 20 3d 3e 20 20 20 69 6e 64 65 78 20 62  )   =>   index b
86f0: 74 72 65 65 20 6e 6f 64 65 73 0a 2a 2a 0a 2a 2a  tree nodes.**.**
8700: 20 54 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61   There is also a
8710: 20 77 72 61 70 70 65 72 20 66 75 6e 63 74 69 6f   wrapper functio
8720: 6e 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  n btreeParseCell
8730: 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f  () that works fo
8740: 72 0a 2a 2a 20 61 6c 6c 20 4d 65 6d 50 61 67 65  r.** all MemPage
8750: 20 74 79 70 65 73 20 61 6e 64 20 74 68 61 74 20   types and that 
8760: 72 65 66 65 72 65 6e 63 65 73 20 74 68 65 20 63  references the c
8770: 65 6c 6c 20 62 79 20 69 6e 64 65 78 20 72 61 74  ell by index rat
8780: 68 65 72 20 74 68 61 6e 0a 2a 2a 20 62 79 20 70  her than.** by p
8790: 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
87a0: 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73  c void btreePars
87b0: 65 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61  eCellPtrNoPayloa
87c0: 64 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  d(.  MemPage *pP
87d0: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
87e0: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
87f0: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  the cell */.  u8
8800: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
8810: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
8820: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78   to the cell tex
8830: 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  t. */.  CellInfo
8840: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
8850: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
8860: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
8870: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8880: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
8890: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
88a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
88b0: 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 29 3b 0a 20  ge->leaf==0 );. 
88c0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
88d0: 6e 6f 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 61  noPayload );.  a
88e0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68  ssert( pPage->ch
88f0: 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b  ildPtrSize==4 );
8900: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
8910: 44 45 42 55 47 0a 20 20 55 4e 55 53 45 44 5f 50  DEBUG.  UNUSED_P
8920: 41 52 41 4d 45 54 45 52 28 70 50 61 67 65 29 3b  ARAMETER(pPage);
8930: 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e 66 6f 2d  .#endif.  pInfo-
8940: 3e 6e 53 69 7a 65 20 3d 20 34 20 2b 20 67 65 74  >nSize = 4 + get
8950: 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34 5d  Varint(&pCell[4]
8960: 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e  , (u64*)&pInfo->
8970: 6e 4b 65 79 29 3b 0a 20 20 70 49 6e 66 6f 2d 3e  nKey);.  pInfo->
8980: 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20  nPayload = 0;.  
8990: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
89a0: 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65  0;.  pInfo->iOve
89b0: 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 70 49 6e  rflow = 0;.  pIn
89c0: 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 30  fo->pPayload = 0
89d0: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 73 74  ;.  return;.}.st
89e0: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50  atic void btreeP
89f0: 61 72 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d  arseCellPtr(.  M
8a00: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
8a10: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
8a20: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65  ontaining the ce
8a30: 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  ll */.  u8 *pCel
8a40: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
8a50: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
8a60: 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a  e cell text. */.
8a70: 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66    CellInfo *pInf
8a80: 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  o         /* Fil
8a90: 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  l in this struct
8aa0: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a  ure */.){.  u8 *
8ab0: 70 49 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  pIter;          
8ac0: 20 20 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e      /* For scann
8ad0: 69 6e 67 20 74 68 72 6f 75 67 68 20 70 43 65 6c  ing through pCel
8ae0: 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c  l */.  u32 nPayl
8af0: 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f  oad;           /
8b00: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
8b10: 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61  s of cell payloa
8b20: 64 20 2a 2f 0a 20 20 75 36 34 20 69 4b 65 79 3b  d */.  u64 iKey;
8b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8b40: 2a 20 45 78 74 72 61 63 74 65 64 20 4b 65 79 20  * Extracted Key 
8b50: 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 61 73 73 65  value */..  asse
8b60: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
8b70: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
8b80: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
8b90: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65  ssert( pPage->le
8ba0: 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e  af==0 || pPage->
8bb0: 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 61 73 73  leaf==1 );.  ass
8bc0: 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b  ert( pPage->intK
8bd0: 65 79 4c 65 61 66 20 7c 7c 20 70 50 61 67 65 2d  eyLeaf || pPage-
8be0: 3e 6e 6f 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20  >noPayload );.  
8bf0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
8c00: 6f 50 61 79 6c 6f 61 64 3d 3d 30 20 29 3b 0a 20  oPayload==0 );. 
8c10: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
8c20: 69 6e 74 4b 65 79 4c 65 61 66 20 29 3b 0a 20 20  intKeyLeaf );.  
8c30: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63  assert( pPage->c
8c40: 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 30 20 29  hildPtrSize==0 )
8c50: 3b 0a 20 20 70 49 74 65 72 20 3d 20 70 43 65 6c  ;.  pIter = pCel
8c60: 6c 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78  l;..  /* The nex
8c70: 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20  t block of code 
8c80: 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
8c90: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
8ca0: 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69  pIter += getVari
8cb0: 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 50 61 79  nt32(pIter, nPay
8cc0: 6c 6f 61 64 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a  load);.  **.  **
8cd0: 20 54 68 65 20 63 6f 64 65 20 69 73 20 69 6e 6c   The code is inl
8ce0: 69 6e 65 64 20 74 6f 20 61 76 6f 69 64 20 61 20  ined to avoid a 
8cf0: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20  function call.. 
8d00: 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d   */.  nPayload =
8d10: 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20 6e   *pIter;.  if( n
8d20: 50 61 79 6c 6f 61 64 3e 3d 30 78 38 30 20 29 7b  Payload>=0x80 ){
8d30: 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20  .    u8 *pEnd = 
8d40: 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e  &pIter[8];.    n
8d50: 50 61 79 6c 6f 61 64 20 26 3d 20 30 78 37 66 3b  Payload &= 0x7f;
8d60: 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e  .    do{.      n
8d70: 50 61 79 6c 6f 61 64 20 3d 20 28 6e 50 61 79 6c  Payload = (nPayl
8d80: 6f 61 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49  oad<<7) | (*++pI
8d90: 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20  ter & 0x7f);.   
8da0: 20 7d 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72   }while( (*pIter
8db0: 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74 65 72  )>=0x80 && pIter
8dc0: 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70  <pEnd );.  }.  p
8dd0: 49 74 65 72 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68  Iter++;..  /* Th
8de0: 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20  e next block of 
8df0: 63 6f 64 65 20 69 73 20 65 71 75 69 76 61 6c 65  code is equivale
8e00: 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  nt to:.  **.  **
8e10: 20 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65       pIter += ge
8e20: 74 56 61 72 69 6e 74 28 70 49 74 65 72 2c 20 28  tVarint(pIter, (
8e30: 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65  u64*)&pInfo->nKe
8e40: 79 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  y);.  **.  ** Th
8e50: 65 20 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65  e code is inline
8e60: 64 20 74 6f 20 61 76 6f 69 64 20 61 20 66 75 6e  d to avoid a fun
8e70: 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f  ction call..  */
8e80: 0a 20 20 69 4b 65 79 20 3d 20 2a 70 49 74 65 72  .  iKey = *pIter
8e90: 3b 0a 20 20 69 66 28 20 69 4b 65 79 3e 3d 30 78  ;.  if( iKey>=0x
8ea0: 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45  80 ){.    u8 *pE
8eb0: 6e 64 20 3d 20 26 70 49 74 65 72 5b 37 5d 3b 0a  nd = &pIter[7];.
8ec0: 20 20 20 20 69 4b 65 79 20 26 3d 20 30 78 37 66      iKey &= 0x7f
8ed0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 31 29 7b 0a  ;.    while(1){.
8ee0: 20 20 20 20 20 20 69 4b 65 79 20 3d 20 28 69 4b        iKey = (iK
8ef0: 65 79 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74  ey<<7) | (*++pIt
8f00: 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20  er & 0x7f);.    
8f10: 20 20 69 66 28 20 28 2a 70 49 74 65 72 29 3c 30    if( (*pIter)<0
8f20: 78 38 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  x80 ) break;.   
8f30: 20 20 20 69 66 28 20 70 49 74 65 72 3e 3d 70 45     if( pIter>=pE
8f40: 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4b  nd ){.        iK
8f50: 65 79 20 3d 20 28 69 4b 65 79 3c 3c 38 29 20 7c  ey = (iKey<<8) |
8f60: 20 2a 2b 2b 70 49 74 65 72 3b 0a 20 20 20 20 20   *++pIter;.     
8f70: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8f80: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49  }.    }.  }.  pI
8f90: 74 65 72 2b 2b 3b 0a 0a 20 20 70 49 6e 66 6f 2d  ter++;..  pInfo-
8fa0: 3e 6e 4b 65 79 20 3d 20 2a 28 69 36 34 2a 29 26  >nKey = *(i64*)&
8fb0: 69 4b 65 79 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e  iKey;.  pInfo->n
8fc0: 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f  Payload = nPaylo
8fd0: 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61  ad;.  pInfo->pPa
8fe0: 79 6c 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a 20  yload = pIter;. 
8ff0: 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c   testcase( nPayl
9000: 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  oad==pPage->maxL
9010: 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61  ocal );.  testca
9020: 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50  se( nPayload==pP
9030: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20  age->maxLocal+1 
9040: 29 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61  );.  if( nPayloa
9050: 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d<=pPage->maxLoc
9060: 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  al ){.    /* Thi
9070: 73 20 69 73 20 74 68 65 20 28 65 61 73 79 29 20  s is the (easy) 
9080: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
9090: 65 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 79  e the entire pay
90a0: 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a  load fits.    **
90b0: 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61   on the local pa
90c0: 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77  ge.  No overflow
90d0: 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20   is required..  
90e0: 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e    */.    pInfo->
90f0: 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64  nSize = nPayload
9100: 20 2b 20 28 75 31 36 29 28 70 49 74 65 72 20 2d   + (u16)(pIter -
9110: 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28   pCell);.    if(
9120: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20   pInfo->nSize<4 
9130: 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d  ) pInfo->nSize =
9140: 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   4;.    pInfo->n
9150: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61  Local = (u16)nPa
9160: 79 6c 6f 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f  yload;.    pInfo
9170: 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->iOverflow = 0;
9180: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 74  .  }else{.    bt
9190: 72 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75  reeParseCellAdju
91a0: 73 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f  stSizeForOverflo
91b0: 77 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  w(pPage, pCell, 
91c0: 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74  pInfo);.  }.}.st
91d0: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50  atic void btreeP
91e0: 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78  arseCellPtrIndex
91f0: 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
9200: 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ge,         /* P
9210: 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
9220: 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  he cell */.  u8 
9230: 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
9240: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
9250: 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74  to the cell text
9260: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
9270: 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f  *pInfo         /
9280: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73  * Fill in this s
9290: 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20  tructure */.){. 
92a0: 20 75 38 20 2a 70 49 74 65 72 3b 20 20 20 20 20   u8 *pIter;     
92b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
92c0: 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68  scanning through
92d0: 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 33 32 20   pCell */.  u32 
92e0: 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20  nPayload;       
92f0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
9300: 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70   bytes of cell p
9310: 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73  ayload */..  ass
9320: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
9330: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
9340: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
9350: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c  assert( pPage->l
9360: 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d  eaf==0 || pPage-
9370: 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 61 73  >leaf==1 );.  as
9380: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74  sert( pPage->int
9390: 4b 65 79 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20  KeyLeaf==0 );.  
93a0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
93b0: 6f 50 61 79 6c 6f 61 64 3d 3d 30 20 29 3b 0a 20  oPayload==0 );. 
93c0: 20 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b   pIter = pCell +
93d0: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
93e0: 53 69 7a 65 3b 0a 20 20 6e 50 61 79 6c 6f 61 64  Size;.  nPayload
93f0: 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28   = *pIter;.  if(
9400: 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78 38 30 20   nPayload>=0x80 
9410: 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20  ){.    u8 *pEnd 
9420: 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20  = &pIter[8];.   
9430: 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20 30 78 37   nPayload &= 0x7
9440: 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  f;.    do{.     
9450: 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28 6e 50 61   nPayload = (nPa
9460: 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b  yload<<7) | (*++
9470: 70 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20  pIter & 0x7f);. 
9480: 20 20 20 7d 77 68 69 6c 65 28 20 2a 28 70 49 74     }while( *(pIt
9490: 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74  er)>=0x80 && pIt
94a0: 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20  er<pEnd );.  }. 
94b0: 20 70 49 74 65 72 2b 2b 3b 0a 20 20 70 49 6e 66   pIter++;.  pInf
94c0: 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f  o->nKey = nPaylo
94d0: 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61  ad;.  pInfo->nPa
94e0: 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64  yload = nPayload
94f0: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c  ;.  pInfo->pPayl
9500: 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a 20 20 74  oad = pIter;.  t
9510: 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61  estcase( nPayloa
9520: 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d==pPage->maxLoc
9530: 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  al );.  testcase
9540: 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67  ( nPayload==pPag
9550: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b  e->maxLocal+1 );
9560: 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c  .  if( nPayload<
9570: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
9580: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
9590: 69 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f  is the (easy) co
95a0: 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
95b0: 74 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f  the entire paylo
95c0: 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f  ad fits.    ** o
95d0: 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
95e0: 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69  .  No overflow i
95f0: 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  s required..    
9600: 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53  */.    pInfo->nS
9610: 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b  ize = nPayload +
9620: 20 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70   (u16)(pIter - p
9630: 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 70  Cell);.    if( p
9640: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20  Info->nSize<4 ) 
9650: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34  pInfo->nSize = 4
9660: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f  ;.    pInfo->nLo
9670: 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c  cal = (u16)nPayl
9680: 6f 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  oad;.    pInfo->
9690: 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  iOverflow = 0;. 
96a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 74 72 65   }else{.    btre
96b0: 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75 73 74  eParseCellAdjust
96c0: 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28  SizeForOverflow(
96d0: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49  pPage, pCell, pI
96e0: 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  nfo);.  }.}.stat
96f0: 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72  ic void btreePar
9700: 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  seCell(.  MemPag
9710: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
9720: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
9730: 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ning the cell */
9740: 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20  .  int iCell,   
9750: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
9760: 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46  e cell index.  F
9770: 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20 2a  irst cell is 0 *
9780: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
9790: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
97a0: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
97b0: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 50  cture */.){.  pP
97c0: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
97d0: 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28  pPage, findCell(
97e0: 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 2c 20 70  pPage, iCell), p
97f0: 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Info);.}../*.** 
9800: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  The following ro
9810: 75 74 69 6e 65 73 20 61 72 65 20 69 6d 70 6c 65  utines are imple
9820: 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68  mentations of th
9830: 65 20 4d 65 6d 50 61 67 65 2e 78 43 65 6c 6c 53  e MemPage.xCellS
9840: 69 7a 65 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a  ize.** method..*
9850: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
9860: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
9870: 20 62 79 74 65 73 20 74 68 61 74 20 61 20 43 65   bytes that a Ce
9880: 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65 20  ll needs in the 
9890: 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65  cell.** data are
98a0: 61 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d 70  a of the btree-p
98b0: 61 67 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e  age.  The return
98c0: 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65 73   number includes
98d0: 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74   the cell.** dat
98e0: 61 20 68 65 61 64 65 72 20 61 6e 64 20 74 68 65  a header and the
98f0: 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20   local payload, 
9900: 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72  but not any over
9910: 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20  flow page or.** 
9920: 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20 62  the space used b
9930: 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  y the cell point
9940: 65 72 2e 0a 2a 2a 0a 2a 2a 20 63 65 6c 6c 53 69  er..**.** cellSi
9950: 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 29  zePtrNoPayload()
9960: 20 20 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 69      =>   table i
9970: 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a  nternal nodes.**
9980: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 29 20 20   cellSizePtr()  
9990: 20 20 20 20 20 20 20 20 20 20 20 3d 3e 20 20 20             =>   
99a0: 61 6c 6c 20 69 6e 64 65 78 20 6e 6f 64 65 73 20  all index nodes 
99b0: 26 20 74 61 62 6c 65 20 6c 65 61 66 20 6e 6f 64  & table leaf nod
99c0: 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36  es.*/.static u16
99d0: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d   cellSizePtr(Mem
99e0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20  Page *pPage, u8 
99f0: 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70  *pCell){.  u8 *p
9a00: 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70  Iter = pCell + p
9a10: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
9a20: 7a 65 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69  ze; /* For loopi
9a30: 6e 67 20 6f 76 65 72 20 62 79 74 65 73 20 6f 66  ng over bytes of
9a40: 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a   pCell */.  u8 *
9a50: 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  pEnd;           
9a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a70: 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b       /* End mark
9a80: 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20 2a 2f   for a varint */
9a90: 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b 20 20 20  .  u32 nSize;   
9aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ab0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
9ac0: 69 7a 65 20 76 61 6c 75 65 20 74 6f 20 72 65 74  ize value to ret
9ad0: 75 72 6e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  urn */..#ifdef S
9ae0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
9af0: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
9b00: 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ned by this func
9b10: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61  tion should alwa
9b20: 79 73 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  ys be the same a
9b30: 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c  s.  ** the (Cell
9b40: 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75  Info.nSize) valu
9b50: 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67  e found by doing
9b60: 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f 66   a full parse of
9b70: 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20   the.  ** cell. 
9b80: 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  If SQLITE_DEBUG 
9b90: 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61  is defined, an a
9ba0: 73 73 65 72 74 28 29 20 61 74 20 74 68 65 20 62  ssert() at the b
9bb0: 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68  ottom of.  ** th
9bc0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72 69  is function veri
9bd0: 66 69 65 73 20 74 68 61 74 20 74 68 69 73 20 69  fies that this i
9be0: 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74 20  nvariant is not 
9bf0: 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43  violated. */.  C
9c00: 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e 66  ellInfo debuginf
9c10: 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72  o;.  pPage->xPar
9c20: 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  seCell(pPage, pC
9c30: 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f 29  ell, &debuginfo)
9c40: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
9c50: 72 74 28 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79  rt( pPage->noPay
9c60: 6c 6f 61 64 3d 3d 30 20 29 3b 0a 20 20 6e 53 69  load==0 );.  nSi
9c70: 7a 65 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69  ze = *pIter;.  i
9c80: 66 28 20 6e 53 69 7a 65 3e 3d 30 78 38 30 20 29  f( nSize>=0x80 )
9c90: 7b 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49  {.    pEnd = &pI
9ca0: 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 53 69 7a  ter[8];.    nSiz
9cb0: 65 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64  e &= 0x7f;.    d
9cc0: 6f 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d  o{.      nSize =
9cd0: 20 28 6e 53 69 7a 65 3c 3c 37 29 20 7c 20 28 2a   (nSize<<7) | (*
9ce0: 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b  ++pIter & 0x7f);
9cf0: 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 2a 28 70  .    }while( *(p
9d00: 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70  Iter)>=0x80 && p
9d10: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
9d20: 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20 69 66  .  pIter++;.  if
9d30: 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
9d40: 29 7b 0a 20 20 20 20 2f 2a 20 70 49 74 65 72 20  ){.    /* pIter 
9d50: 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74 20 74 68  now points at th
9d60: 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  e 64-bit integer
9d70: 20 6b 65 79 20 76 61 6c 75 65 2c 20 61 20 76 61   key value, a va
9d80: 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20  riable length . 
9d90: 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54     ** integer. T
9da0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
9db0: 63 6b 20 6d 6f 76 65 73 20 70 49 74 65 72 20 74  ck moves pIter t
9dc0: 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 66  o point at the f
9dd0: 69 72 73 74 20 62 79 74 65 0a 20 20 20 20 2a 2a  irst byte.    **
9de0: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
9df0: 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20   the key value. 
9e00: 2a 2f 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70  */.    pEnd = &p
9e10: 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69  Iter[9];.    whi
9e20: 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30  le( (*pIter++)&0
9e30: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
9e40: 64 20 29 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63  d );.  }.  testc
9e50: 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67  ase( nSize==pPag
9e60: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  e->maxLocal );. 
9e70: 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65   testcase( nSize
9e80: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
9e90: 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 53 69  l+1 );.  if( nSi
9ea0: 7a 65 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze<=pPage->maxLo
9eb0: 63 61 6c 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65  cal ){.    nSize
9ec0: 20 2b 3d 20 28 75 33 32 29 28 70 49 74 65 72 20   += (u32)(pIter 
9ed0: 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  - pCell);.    if
9ee0: 28 20 6e 53 69 7a 65 3c 34 20 29 20 6e 53 69 7a  ( nSize<4 ) nSiz
9ef0: 65 20 3d 20 34 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 4;.  }else{.
9f00: 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c      int minLocal
9f10: 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63   = pPage->minLoc
9f20: 61 6c 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20  al;.    nSize = 
9f30: 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a  minLocal + (nSiz
9f40: 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20  e - minLocal) % 
9f50: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
9f60: 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20  bleSize - 4);.  
9f70: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
9f80: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
9f90: 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  al );.    testca
9fa0: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
9fb0: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
9fc0: 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50      if( nSize>pP
9fd0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
9fe0: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d  .      nSize = m
9ff0: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20  inLocal;.    }. 
a000: 20 20 20 6e 53 69 7a 65 20 2b 3d 20 34 20 2b 20     nSize += 4 + 
a010: 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43  (u16)(pIter - pC
a020: 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ell);.  }.  asse
a030: 72 74 28 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67  rt( nSize==debug
a040: 69 6e 66 6f 2e 6e 53 69 7a 65 20 7c 7c 20 43 4f  info.nSize || CO
a050: 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 72 65  RRUPT_DB );.  re
a060: 74 75 72 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b  turn (u16)nSize;
a070: 0a 7d 0a 73 74 61 74 69 63 20 75 31 36 20 63 65  .}.static u16 ce
a080: 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f  llSizePtrNoPaylo
a090: 61 64 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ad(MemPage *pPag
a0a0: 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20  e, u8 *pCell){. 
a0b0: 20 75 38 20 2a 70 49 74 65 72 20 3d 20 70 43 65   u8 *pIter = pCe
a0c0: 6c 6c 20 2b 20 34 3b 20 2f 2a 20 46 6f 72 20 6c  ll + 4; /* For l
a0d0: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 62 79 74 65  ooping over byte
a0e0: 73 20 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  s of pCell */.  
a0f0: 75 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20  u8 *pEnd;       
a100: 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61         /* End ma
a110: 72 6b 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20  rk for a varint 
a120: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
a130: 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65  E_DEBUG.  /* The
a140: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
a150: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
a160: 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62   should always b
a170: 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20  e the same as.  
a180: 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f  ** the (CellInfo
a190: 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f  .nSize) value fo
a1a0: 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66  und by doing a f
a1b0: 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65  ull parse of the
a1c0: 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53  .  ** cell. If S
a1d0: 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64  QLITE_DEBUG is d
a1e0: 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72  efined, an asser
a1f0: 74 28 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f  t() at the botto
a200: 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66  m of.  ** this f
a210: 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73  unction verifies
a220: 20 74 68 61 74 20 74 68 69 73 20 69 6e 76 61 72   that this invar
a230: 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c  iant is not viol
a240: 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  ated. */.  CellI
a250: 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20  nfo debuginfo;. 
a260: 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
a270: 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  ll(pPage, pCell,
a280: 20 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65   &debuginfo);.#e
a290: 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  lse.  UNUSED_PAR
a2a0: 41 4d 45 54 45 52 28 70 50 61 67 65 29 3b 0a 23  AMETER(pPage);.#
a2b0: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
a2c0: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
a2d0: 53 69 7a 65 3d 3d 34 20 29 3b 0a 20 20 70 45 6e  Size==4 );.  pEn
a2e0: 64 20 3d 20 70 49 74 65 72 20 2b 20 39 3b 0a 20  d = pIter + 9;. 
a2f0: 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b   while( (*pIter+
a300: 2b 29 26 30 78 38 30 20 26 26 20 70 49 74 65 72  +)&0x80 && pIter
a310: 3c 70 45 6e 64 20 29 3b 0a 20 20 61 73 73 65 72  <pEnd );.  asser
a320: 74 28 20 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69  t( debuginfo.nSi
a330: 7a 65 3d 3d 28 75 31 36 29 28 70 49 74 65 72 20  ze==(u16)(pIter 
a340: 2d 20 70 43 65 6c 6c 29 20 7c 7c 20 43 4f 52 52  - pCell) || CORR
a350: 55 50 54 5f 44 42 20 29 3b 0a 20 20 72 65 74 75  UPT_DB );.  retu
a360: 72 6e 20 28 75 31 36 29 28 70 49 74 65 72 20 2d  rn (u16)(pIter -
a370: 20 70 43 65 6c 6c 29 3b 0a 7d 0a 0a 0a 23 69 66   pCell);.}...#if
a380: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
a390: 0a 2f 2a 20 54 68 69 73 20 76 61 72 69 61 74 69  ./* This variati
a3a0: 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74  on on cellSizePt
a3b0: 72 28 29 20 69 73 20 75 73 65 64 20 69 6e 73 69  r() is used insi
a3c0: 64 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73  de of assert() s
a3d0: 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c  tatements.** onl
a3e0: 79 2e 20 2a 2f 0a 73 74 61 74 69 63 20 75 31 36  y. */.static u16
a3f0: 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67   cellSize(MemPag
a400: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43  e *pPage, int iC
a410: 65 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ell){.  return p
a420: 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28  Page->xCellSize(
a430: 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28  pPage, findCell(
a440: 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a  pPage, iCell));.
a450: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
a460: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
a470: 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49  TOVACUUM./*.** I
a480: 66 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c  f the cell pCell
a490: 2c 20 70 61 72 74 20 6f 66 20 70 61 67 65 20 70  , part of page p
a4a0: 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  Page contains a 
a4b0: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e  pointer.** to an
a4c0: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
a4d0: 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20  insert an entry 
a4e0: 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  into the pointer
a4f0: 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20  -map.** for the 
a500: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a  overflow page..*
a510: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 74  /.static void pt
a520: 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 4d  rmapPutOvflPtr(M
a530: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
a540: 38 20 2a 70 43 65 6c 6c 2c 20 69 6e 74 20 2a 70  8 *pCell, int *p
a550: 52 43 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  RC){.  CellInfo 
a560: 69 6e 66 6f 3b 0a 20 20 69 66 28 20 2a 70 52 43  info;.  if( *pRC
a570: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
a580: 65 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b  ert( pCell!=0 );
a590: 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65  .  pPage->xParse
a5a0: 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c  Cell(pPage, pCel
a5b0: 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28  l, &info);.  if(
a5c0: 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20   info.iOverflow 
a5d0: 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c  ){.    Pgno ovfl
a5e0: 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65   = get4byte(&pCe
a5f0: 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
a600: 77 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50  w]);.    ptrmapP
a610: 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f  ut(pPage->pBt, o
a620: 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52  vfl, PTRMAP_OVER
a630: 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67  FLOW1, pPage->pg
a640: 6e 6f 2c 20 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a  no, pRC);.  }.}.
a650: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44  #endif.../*.** D
a660: 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61  efragment the pa
a670: 67 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43  ge given.  All C
a680: 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64 20 74  ells are moved t
a690: 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20  o the.** end of 
a6a0: 74 68 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c  the page and all
a6b0: 20 66 72 65 65 20 73 70 61 63 65 20 69 73 20 63   free space is c
a6c0: 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e  ollected into on
a6d0: 65 0a 2a 2a 20 62 69 67 20 46 72 65 65 42 6c 6b  e.** big FreeBlk
a6e0: 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20   that occurs in 
a6f0: 62 65 74 77 65 65 6e 20 74 68 65 20 68 65 61 64  between the head
a700: 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70  er and cell.** p
a710: 6f 69 6e 74 65 72 20 61 72 72 61 79 20 61 6e 64  ointer array and
a720: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
a730: 74 20 61 72 65 61 2e 0a 2a 2a 0a 2a 2a 20 45 56  t area..**.** EV
a740: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 35  IDENCE-OF: R-445
a750: 38 32 2d 36 30 31 33 38 20 53 51 4c 69 74 65 20  82-60138 SQLite 
a760: 6d 61 79 20 66 72 6f 6d 20 74 69 6d 65 20 74 6f  may from time to
a770: 20 74 69 6d 65 20 72 65 6f 72 67 61 6e 69 7a 65   time reorganize
a780: 20 61 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67   a.** b-tree pag
a790: 65 20 73 6f 20 74 68 61 74 20 74 68 65 72 65 20  e so that there 
a7a0: 61 72 65 20 6e 6f 20 66 72 65 65 62 6c 6f 63 6b  are no freeblock
a7b0: 73 20 6f 72 20 66 72 61 67 6d 65 6e 74 20 62 79  s or fragment by
a7c0: 74 65 73 2c 20 61 6c 6c 0a 2a 2a 20 75 6e 75 73  tes, all.** unus
a7d0: 65 64 20 62 79 74 65 73 20 61 72 65 20 63 6f 6e  ed bytes are con
a7e0: 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 75 6e  tained in the un
a7f0: 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 20  allocated space 
a800: 72 65 67 69 6f 6e 2c 20 61 6e 64 20 61 6c 6c 0a  region, and all.
a810: 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20 70 61 63  ** cells are pac
a820: 6b 65 64 20 74 69 67 68 74 6c 79 20 61 74 20 74  ked tightly at t
a830: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  he end of the pa
a840: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ge..*/.static in
a850: 74 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65  t defragmentPage
a860: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
a870: 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
a880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a890: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
a8a0: 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20  /.  int pc;     
a8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a8c0: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
a8d0: 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20   i-th cell */.  
a8e0: 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20  int hdr;        
a8f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
a900: 66 73 65 74 20 74 6f 20 74 68 65 20 70 61 67 65  fset to the page
a910: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
a920: 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20   size;          
a930: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
a940: 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69  of a cell */.  i
a950: 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20  nt usableSize;  
a960: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
a970: 62 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79  ber of usable by
a980: 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f  tes on a page */
a990: 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65  .  int cellOffse
a9a0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
a9b0: 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63   Offset to the c
a9c0: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
a9d0: 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b  y */.  int cbrk;
a9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9f0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
aa00: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
aa10: 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  area */.  int nC
aa20: 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
aa30: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
aa40: 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70  f cells on the p
aa50: 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  age */.  unsigne
aa60: 64 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20  d char *data;   
aa70: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
aa80: 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  data */.  unsign
aa90: 65 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20 20  ed char *temp;  
aaa0: 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72 65       /* Temp are
aab0: 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65  a for cell conte
aac0: 6e 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  nt */.  unsigned
aad0: 20 63 68 61 72 20 2a 73 72 63 3b 20 20 20 20 20   char *src;     
aae0: 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6f 66 20     /* Source of 
aaf0: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  content */.  int
ab00: 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20   iCellFirst;    
ab10: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
ab20: 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20   allowable cell 
ab30: 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69  index */.  int i
ab40: 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 20 20  CellLast;       
ab50: 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f        /* Last po
ab60: 73 73 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65  ssible cell inde
ab70: 78 20 2a 2f 0a 0a 0a 20 20 61 73 73 65 72 74 28  x */...  assert(
ab80: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
ab90: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
aba0: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
abb0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
abc0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
abd0: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
abe0: 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54  bleSize <= SQLIT
abf0: 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20  E_MAX_PAGE_SIZE 
ac00: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
ac10: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
ac20: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
ac30: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
ac40: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
ac50: 65 78 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20  ex) );.  temp = 
ac60: 30 3b 0a 20 20 73 72 63 20 3d 20 64 61 74 61 20  0;.  src = data 
ac70: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
ac80: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
ac90: 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c  drOffset;.  cell
aca0: 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e  Offset = pPage->
acb0: 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43  cellOffset;.  nC
acc0: 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
acd0: 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43  ll;.  assert( nC
ace0: 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28 26 64  ell==get2byte(&d
acf0: 61 74 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20  ata[hdr+3]) );. 
ad00: 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50   usableSize = pP
ad10: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
ad20: 53 69 7a 65 3b 0a 20 20 63 62 72 6b 20 3d 20 75  Size;.  cbrk = u
ad30: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65  sableSize;.  iCe
ad40: 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66  llFirst = cellOf
ad50: 66 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a  fset + 2*nCell;.
ad60: 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73    iCellLast = us
ad70: 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
ad80: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
ad90: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a  ; i++){.    u8 *
ada0: 70 41 64 64 72 3b 20 20 20 20 20 2f 2a 20 54 68  pAddr;     /* Th
adb0: 65 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e  e i-th cell poin
adc0: 74 65 72 20 2a 2f 0a 20 20 20 20 70 41 64 64 72  ter */.    pAddr
add0: 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66   = &data[cellOff
ade0: 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20  set + i*2];.    
adf0: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 41  pc = get2byte(pA
ae00: 64 64 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61  ddr);.    testca
ae10: 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72  se( pc==iCellFir
ae20: 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  st );.    testca
ae30: 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73  se( pc==iCellLas
ae40: 74 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 73  t );.    /* Thes
ae50: 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76  e conditions hav
ae60: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 76  e already been v
ae70: 65 72 69 66 69 65 64 20 69 6e 20 62 74 72 65 65  erified in btree
ae80: 49 6e 69 74 50 61 67 65 28 29 0a 20 20 20 20 2a  InitPage().    *
ae90: 2a 20 69 66 20 50 52 41 47 4d 41 20 63 65 6c 6c  * if PRAGMA cell
aea0: 5f 73 69 7a 65 5f 63 68 65 63 6b 3d 4f 4e 2e 0a  _size_check=ON..
aeb0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
aec0: 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20  c<iCellFirst || 
aed0: 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
aee0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
aef0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
af00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
af10: 72 74 28 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72  rt( pc>=iCellFir
af20: 73 74 20 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c  st && pc<=iCellL
af30: 61 73 74 20 29 3b 0a 20 20 20 20 73 69 7a 65 20  ast );.    size 
af40: 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69  = pPage->xCellSi
af50: 7a 65 28 70 50 61 67 65 2c 20 26 73 72 63 5b 70  ze(pPage, &src[p
af60: 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d 3d  c]);.    cbrk -=
af70: 20 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 63   size;.    if( c
af80: 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c  brk<iCellFirst |
af90: 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65  | pc+size>usable
afa0: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65  Size ){.      re
afb0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
afc0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
afd0: 20 20 20 20 61 73 73 65 72 74 28 20 63 62 72 6b      assert( cbrk
afe0: 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a  +size<=usableSiz
aff0: 65 20 26 26 20 63 62 72 6b 3e 3d 69 43 65 6c 6c  e && cbrk>=iCell
b000: 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73  First );.    tes
b010: 74 63 61 73 65 28 20 63 62 72 6b 2b 73 69 7a 65  tcase( cbrk+size
b020: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ==usableSize );.
b030: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
b040: 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a  +size==usableSiz
b050: 65 20 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  e );.    put2byt
b060: 65 28 70 41 64 64 72 2c 20 63 62 72 6b 29 3b 0a  e(pAddr, cbrk);.
b070: 20 20 20 20 69 66 28 20 74 65 6d 70 3d 3d 30 20      if( temp==0 
b080: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 3b 0a  ){.      int x;.
b090: 20 20 20 20 20 20 69 66 28 20 63 62 72 6b 3d 3d        if( cbrk==
b0a0: 70 63 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  pc ) continue;. 
b0b0: 20 20 20 20 20 74 65 6d 70 20 3d 20 73 71 6c 69       temp = sqli
b0c0: 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63  te3PagerTempSpac
b0d0: 65 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50  e(pPage->pBt->pP
b0e0: 61 67 65 72 29 3b 0a 20 20 20 20 20 20 78 20 3d  ager);.      x =
b0f0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
b100: 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20 6d  hdr+5]);.      m
b110: 65 6d 63 70 79 28 26 74 65 6d 70 5b 78 5d 2c 20  emcpy(&temp[x], 
b120: 26 64 61 74 61 5b 78 5d 2c 20 28 63 62 72 6b 2b  &data[x], (cbrk+
b130: 73 69 7a 65 29 20 2d 20 78 29 3b 0a 20 20 20 20  size) - x);.    
b140: 20 20 73 72 63 20 3d 20 74 65 6d 70 3b 0a 20 20    src = temp;.  
b150: 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 26    }.    memcpy(&
b160: 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 73 72 63  data[cbrk], &src
b170: 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 7d  [pc], size);.  }
b180: 0a 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 3e  .  assert( cbrk>
b190: 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20  =iCellFirst );. 
b1a0: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
b1b0: 68 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20  hdr+5], cbrk);. 
b1c0: 20 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30   data[hdr+1] = 0
b1d0: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d 20  ;.  data[hdr+2] 
b1e0: 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b  = 0;.  data[hdr+
b1f0: 37 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74  7] = 0;.  memset
b200: 28 26 64 61 74 61 5b 69 43 65 6c 6c 46 69 72 73  (&data[iCellFirs
b210: 74 5d 2c 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c  t], 0, cbrk-iCel
b220: 6c 46 69 72 73 74 29 3b 0a 20 20 61 73 73 65 72  lFirst);.  asser
b230: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
b240: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
b250: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
b260: 69 66 28 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69  if( cbrk-iCellFi
b270: 72 73 74 21 3d 70 50 61 67 65 2d 3e 6e 46 72 65  rst!=pPage->nFre
b280: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
b290: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
b2a0: 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  KPT;.  }.  retur
b2b0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
b2c0: 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68 65  /*.** Search the
b2d0: 20 66 72 65 65 2d 6c 69 73 74 20 6f 6e 20 70 61   free-list on pa
b2e0: 67 65 20 70 50 67 20 66 6f 72 20 73 70 61 63 65  ge pPg for space
b2f0: 20 74 6f 20 73 74 6f 72 65 20 61 20 63 65 6c 6c   to store a cell
b300: 20 6e 42 79 74 65 20 62 79 74 65 73 20 69 6e 0a   nByte bytes in.
b310: 2a 2a 20 73 69 7a 65 2e 20 49 66 20 6f 6e 65 20  ** size. If one 
b320: 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72 65  can be found, re
b330: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
b340: 6f 20 74 68 65 20 73 70 61 63 65 20 61 6e 64 20  o the space and 
b350: 72 65 6d 6f 76 65 20 69 74 0a 2a 2a 20 66 72 6f  remove it.** fro
b360: 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  m the free-list.
b370: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69  .**.** If no sui
b380: 74 61 62 6c 65 20 73 70 61 63 65 20 63 61 6e 20  table space can 
b390: 62 65 20 66 6f 75 6e 64 20 6f 6e 20 74 68 65 20  be found on the 
b3a0: 66 72 65 65 2d 6c 69 73 74 2c 20 72 65 74 75 72  free-list, retur
b3b0: 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  n NULL..**.** Th
b3c0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
b3d0: 64 65 74 65 63 74 20 63 6f 72 72 75 70 74 69 6f  detect corruptio
b3e0: 6e 20 77 69 74 68 69 6e 20 70 50 67 2e 20 20 49  n within pPg.  I
b3f0: 66 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 0a  f corruption is.
b400: 2a 2a 20 64 65 74 65 63 74 65 64 20 74 68 65 6e  ** detected then
b410: 20 2a 70 52 63 20 69 73 20 73 65 74 20 74 6f 20   *pRc is set to 
b420: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 61  SQLITE_CORRUPT a
b430: 6e 64 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  nd NULL is retur
b440: 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 6c 6f 74 73  ned..**.** Slots
b450: 20 6f 6e 20 74 68 65 20 66 72 65 65 20 6c 69 73   on the free lis
b460: 74 20 74 68 61 74 20 61 72 65 20 62 65 74 77 65  t that are betwe
b470: 65 6e 20 31 20 61 6e 64 20 33 20 62 79 74 65 73  en 1 and 3 bytes
b480: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 42 79   larger than nBy
b490: 74 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 69 67  te.** will be ig
b4a0: 6e 6f 72 65 64 20 69 66 20 61 64 64 69 6e 67 20  nored if adding 
b4b0: 74 68 65 20 65 78 74 72 61 20 73 70 61 63 65 20  the extra space 
b4c0: 74 6f 20 74 68 65 20 66 72 61 67 6d 65 6e 74 61  to the fragmenta
b4d0: 74 69 6f 6e 20 63 6f 75 6e 74 0a 2a 2a 20 63 61  tion count.** ca
b4e0: 75 73 65 73 20 74 68 65 20 66 72 61 67 6d 65 6e  uses the fragmen
b4f0: 74 61 74 69 6f 6e 20 63 6f 75 6e 74 20 74 6f 20  tation count to 
b500: 65 78 63 65 65 64 20 36 30 2e 0a 2a 2f 0a 73 74  exceed 60..*/.st
b510: 61 74 69 63 20 75 38 20 2a 70 61 67 65 46 69 6e  atic u8 *pageFin
b520: 64 53 6c 6f 74 28 4d 65 6d 50 61 67 65 20 2a 70  dSlot(MemPage *p
b530: 50 67 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69  Pg, int nByte, i
b540: 6e 74 20 2a 70 52 63 29 7b 0a 20 20 63 6f 6e 73  nt *pRc){.  cons
b550: 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 67 2d  t int hdr = pPg-
b560: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 38  >hdrOffset;.  u8
b570: 20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61 20 3d   * const aData =
b580: 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20 69   pPg->aData;.  i
b590: 6e 74 20 69 41 64 64 72 20 3d 20 68 64 72 20 2b  nt iAddr = hdr +
b5a0: 20 31 3b 0a 20 20 69 6e 74 20 70 63 20 3d 20 67   1;.  int pc = g
b5b0: 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 69  et2byte(&aData[i
b5c0: 41 64 64 72 5d 29 3b 0a 20 20 69 6e 74 20 78 3b  Addr]);.  int x;
b5d0: 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  .  int usableSiz
b5e0: 65 20 3d 20 70 50 67 2d 3e 70 42 74 2d 3e 75 73  e = pPg->pBt->us
b5f0: 61 62 6c 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73  ableSize;..  ass
b600: 65 72 74 28 20 70 63 3e 30 20 29 3b 0a 20 20 64  ert( pc>0 );.  d
b610: 6f 7b 0a 20 20 20 20 69 6e 74 20 73 69 7a 65 3b  o{.    int size;
b620: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
b630: 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65 20  ize of the free 
b640: 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 45  slot */.    /* E
b650: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 36  VIDENCE-OF: R-06
b660: 38 36 36 2d 33 39 31 32 35 20 46 72 65 65 62 6c  866-39125 Freebl
b670: 6f 63 6b 73 20 61 72 65 20 61 6c 77 61 79 73 20  ocks are always 
b680: 63 6f 6e 6e 65 63 74 65 64 20 69 6e 20 6f 72 64  connected in ord
b690: 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 69 6e 63  er of.    ** inc
b6a0: 72 65 61 73 69 6e 67 20 6f 66 66 73 65 74 2e 20  reasing offset. 
b6b0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3e 75 73  */.    if( pc>us
b6c0: 61 62 6c 65 53 69 7a 65 2d 34 20 7c 7c 20 70 63  ableSize-4 || pc
b6d0: 3c 69 41 64 64 72 2b 34 20 29 7b 0a 20 20 20 20  <iAddr+4 ){.    
b6e0: 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f    *pRc = SQLITE_
b6f0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
b700: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
b710: 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45    }.    /* EVIDE
b720: 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 37 31 30 2d  NCE-OF: R-22710-
b730: 35 33 33 32 38 20 54 68 65 20 74 68 69 72 64 20  53328 The third 
b740: 61 6e 64 20 66 6f 75 72 74 68 20 62 79 74 65 73  and fourth bytes
b750: 20 6f 66 20 65 61 63 68 0a 20 20 20 20 2a 2a 20   of each.    ** 
b760: 66 72 65 65 62 6c 6f 63 6b 20 66 6f 72 6d 20 61  freeblock form a
b770: 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
b780: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
b790: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65   size of the fre
b7a0: 65 62 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 69 6e  eblock.    ** in
b7b0: 20 62 79 74 65 73 2c 20 69 6e 63 6c 75 64 69 6e   bytes, includin
b7c0: 67 20 74 68 65 20 34 2d 62 79 74 65 20 68 65 61  g the 4-byte hea
b7d0: 64 65 72 2e 20 2a 2f 0a 20 20 20 20 73 69 7a 65  der. */.    size
b7e0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44 61   = get2byte(&aDa
b7f0: 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 69  ta[pc+2]);.    i
b800: 66 28 20 28 78 20 3d 20 73 69 7a 65 20 2d 20 6e  f( (x = size - n
b810: 42 79 74 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20  Byte)>=0 ){.    
b820: 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 34    testcase( x==4
b830: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
b840: 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20 20 20  se( x==3 );.    
b850: 20 20 69 66 28 20 70 63 20 3c 20 70 50 67 2d 3e    if( pc < pPg->
b860: 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 70 50 67  cellOffset+2*pPg
b870: 2d 3e 6e 43 65 6c 6c 20 7c 7c 20 73 69 7a 65 2b  ->nCell || size+
b880: 70 63 20 3e 20 75 73 61 62 6c 65 53 69 7a 65 20  pc > usableSize 
b890: 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 63 20  ){.        *pRc 
b8a0: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
b8b0: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 72  _BKPT;.        r
b8c0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
b8d0: 65 6c 73 65 20 69 66 28 20 78 3c 34 20 29 7b 0a  else if( x<4 ){.
b8e0: 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45          /* EVIDE
b8f0: 4e 43 45 2d 4f 46 3a 20 52 2d 31 31 34 39 38 2d  NCE-OF: R-11498-
b900: 35 38 30 32 32 20 49 6e 20 61 20 77 65 6c 6c 2d  58022 In a well-
b910: 66 6f 72 6d 65 64 20 62 2d 74 72 65 65 20 70 61  formed b-tree pa
b920: 67 65 2c 20 74 68 65 20 74 6f 74 61 6c 0a 20 20  ge, the total.  
b930: 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20        ** number 
b940: 6f 66 20 62 79 74 65 73 20 69 6e 20 66 72 61 67  of bytes in frag
b950: 6d 65 6e 74 73 20 6d 61 79 20 6e 6f 74 20 65 78  ments may not ex
b960: 63 65 65 64 20 36 30 2e 20 2a 2f 0a 20 20 20 20  ceed 60. */.    
b970: 20 20 20 20 69 66 28 20 61 44 61 74 61 5b 68 64      if( aData[hd
b980: 72 2b 37 5d 3e 35 37 20 29 20 72 65 74 75 72 6e  r+7]>57 ) return
b990: 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   0;..        /* 
b9a0: 52 65 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74 20  Remove the slot 
b9b0: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69  from the free-li
b9c0: 73 74 2e 20 55 70 64 61 74 65 20 74 68 65 20 6e  st. Update the n
b9d0: 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 20 20  umber of.       
b9e0: 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65 64 20 62   ** fragmented b
b9f0: 79 74 65 73 20 77 69 74 68 69 6e 20 74 68 65 20  ytes within the 
ba00: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  page. */.       
ba10: 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b 69   memcpy(&aData[i
ba20: 41 64 64 72 5d 2c 20 26 61 44 61 74 61 5b 70 63  Addr], &aData[pc
ba30: 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 61  ], 2);.        a
ba40: 44 61 74 61 5b 68 64 72 2b 37 5d 20 2b 3d 20 28  Data[hdr+7] += (
ba50: 75 38 29 78 3b 0a 20 20 20 20 20 20 7d 65 6c 73  u8)x;.      }els
ba60: 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e{.        /* Th
ba70: 65 20 73 6c 6f 74 20 72 65 6d 61 69 6e 73 20 6f  e slot remains o
ba80: 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  n the free-list.
ba90: 20 52 65 64 75 63 65 20 69 74 73 20 73 69 7a 65   Reduce its size
baa0: 20 74 6f 20 61 63 63 6f 75 6e 74 0a 20 20 20 20   to account.    
bab0: 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20       ** for the 
bac0: 70 6f 72 74 69 6f 6e 20 75 73 65 64 20 62 79 20  portion used by 
bad0: 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69  the new allocati
bae0: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  on. */.        p
baf0: 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 70  ut2byte(&aData[p
bb00: 63 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20  c+2], x);.      
bb10: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26  }.      return &
bb20: 61 44 61 74 61 5b 70 63 20 2b 20 78 5d 3b 0a 20  aData[pc + x];. 
bb30: 20 20 20 7d 0a 20 20 20 20 69 41 64 64 72 20 3d     }.    iAddr =
bb40: 20 70 63 3b 0a 20 20 20 20 70 63 20 3d 20 67 65   pc;.    pc = ge
bb50: 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 70 63  t2byte(&aData[pc
bb60: 5d 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 70 63  ]);.  }while( pc
bb70: 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b   );..  return 0;
bb80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
bb90: 74 65 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f  te nByte bytes o
bba0: 66 20 73 70 61 63 65 20 66 72 6f 6d 20 77 69 74  f space from wit
bbb0: 68 69 6e 20 74 68 65 20 42 2d 54 72 65 65 20 70  hin the B-Tree p
bbc0: 61 67 65 20 70 61 73 73 65 64 0a 2a 2a 20 61 73  age passed.** as
bbd0: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
bbe0: 65 6e 74 2e 20 57 72 69 74 65 20 69 6e 74 6f 20  ent. Write into 
bbf0: 2a 70 49 64 78 20 74 68 65 20 69 6e 64 65 78 20  *pIdx the index 
bc00: 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74  into pPage->aDat
bc10: 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69  a[].** of the fi
bc20: 72 73 74 20 62 79 74 65 20 6f 66 20 61 6c 6c 6f  rst byte of allo
bc30: 63 61 74 65 64 20 73 70 61 63 65 2e 20 52 65 74  cated space. Ret
bc40: 75 72 6e 20 65 69 74 68 65 72 20 53 51 4c 49 54  urn either SQLIT
bc50: 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65 72  E_OK or.** an er
bc60: 72 6f 72 20 63 6f 64 65 20 28 75 73 75 61 6c 6c  ror code (usuall
bc70: 79 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  y SQLITE_CORRUPT
bc80: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  )..**.** The cal
bc90: 6c 65 72 20 67 75 61 72 61 6e 74 65 65 73 20 74  ler guarantees t
bca0: 68 61 74 20 74 68 65 72 65 20 69 73 20 73 75 66  hat there is suf
bcb0: 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 74 6f  ficient space to
bcc0: 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 61 6c 6c   make the.** all
bcd0: 6f 63 61 74 69 6f 6e 2e 20 20 54 68 69 73 20 72  ocation.  This r
bce0: 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 6e 65 65  outine might nee
bcf0: 64 20 74 6f 20 64 65 66 72 61 67 6d 65 6e 74 20  d to defragment 
bd00: 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 69 6e  in order to brin
bd10: 67 0a 2a 2a 20 61 6c 6c 20 74 68 65 20 73 70 61  g.** all the spa
bd20: 63 65 20 74 6f 67 65 74 68 65 72 2c 20 68 6f 77  ce together, how
bd30: 65 76 65 72 2e 20 20 54 68 69 73 20 72 6f 75 74  ever.  This rout
bd40: 69 6e 65 20 77 69 6c 6c 20 61 76 6f 69 64 20 75  ine will avoid u
bd50: 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 72 73  sing.** the firs
bd60: 74 20 74 77 6f 20 62 79 74 65 73 20 70 61 73 74  t two bytes past
bd70: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
bd80: 72 20 61 72 65 61 20 73 69 6e 63 65 20 70 72 65  r area since pre
bd90: 73 75 6d 61 62 6c 79 20 74 68 69 73 0a 2a 2a 20  sumably this.** 
bda0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 62 65  allocation is be
bdb0: 69 6e 67 20 6d 61 64 65 20 69 6e 20 6f 72 64 65  ing made in orde
bdc0: 72 20 74 6f 20 69 6e 73 65 72 74 20 61 20 6e 65  r to insert a ne
bdd0: 77 20 63 65 6c 6c 2c 20 73 6f 20 77 65 20 77 69  w cell, so we wi
bde0: 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65 6e 64 20 75  ll.** also end u
bdf0: 70 20 6e 65 65 64 69 6e 67 20 61 20 6e 65 77 20  p needing a new 
be00: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  cell pointer..*/
be10: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
be20: 63 61 74 65 53 70 61 63 65 28 4d 65 6d 50 61 67  cateSpace(MemPag
be30: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e 42  e *pPage, int nB
be40: 79 74 65 2c 20 69 6e 74 20 2a 70 49 64 78 29 7b  yte, int *pIdx){
be50: 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72  .  const int hdr
be60: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
be70: 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  set;    /* Local
be80: 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d   cache of pPage-
be90: 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f 0a 20 20  >hdrOffset */.  
bea0: 75 38 20 2a 20 63 6f 6e 73 74 20 64 61 74 61 20  u8 * const data 
beb0: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20  = pPage->aData; 
bec0: 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61       /* Local ca
bed0: 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 61 44  che of pPage->aD
bee0: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70  ata */.  int top
bef0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bf00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bf10: 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 63   First byte of c
bf20: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
bf30: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
bf40: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
bf50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
bf60: 74 65 67 65 72 20 72 65 74 75 72 6e 20 63 6f 64  teger return cod
bf70: 65 20 2a 2f 0a 20 20 69 6e 74 20 67 61 70 3b 20  e */.  int gap; 
bf80: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
bf90: 62 79 74 65 20 6f 66 20 67 61 70 20 62 65 74 77  byte of gap betw
bfa0: 65 65 6e 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  een cell pointer
bfb0: 73 20 61 6e 64 20 63 65 6c 6c 20 63 6f 6e 74 65  s and cell conte
bfc0: 6e 74 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72  nt */.  .  asser
bfd0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
bfe0: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
bff0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
c000: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
c010: 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Bt );.  assert( 
c020: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
c030: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
c040: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
c050: 74 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20  t( nByte>=0 );  
c060: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20  /* Minimum cell 
c070: 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61  size is 4 */.  a
c080: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46  ssert( pPage->nF
c090: 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20  ree>=nByte );.  
c0a0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
c0b0: 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20  Overflow==0 );. 
c0c0: 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 20 3c   assert( nByte <
c0d0: 20 28 69 6e 74 29 28 70 50 61 67 65 2d 3e 70 42   (int)(pPage->pB
c0e0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 38 29  t->usableSize-8)
c0f0: 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
c100: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
c110: 20 3d 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34   == hdr + 12 - 4
c120: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a  *pPage->leaf );.
c130: 20 20 67 61 70 20 3d 20 70 50 61 67 65 2d 3e 63    gap = pPage->c
c140: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50  ellOffset + 2*pP
c150: 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73  age->nCell;.  as
c160: 73 65 72 74 28 20 67 61 70 3c 3d 36 35 35 33 36  sert( gap<=65536
c170: 20 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43   );.  /* EVIDENC
c180: 45 2d 4f 46 3a 20 52 2d 32 39 33 35 36 2d 30 32  E-OF: R-29356-02
c190: 33 39 31 20 49 66 20 74 68 65 20 64 61 74 61 62  391 If the datab
c1a0: 61 73 65 20 75 73 65 73 20 61 20 36 35 35 33 36  ase uses a 65536
c1b0: 2d 62 79 74 65 20 70 61 67 65 20 73 69 7a 65 0a  -byte page size.
c1c0: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 73    ** and the res
c1d0: 65 72 76 65 64 20 73 70 61 63 65 20 69 73 20 7a  erved space is z
c1e0: 65 72 6f 20 28 74 68 65 20 75 73 75 61 6c 20 76  ero (the usual v
c1f0: 61 6c 75 65 20 66 6f 72 20 72 65 73 65 72 76 65  alue for reserve
c200: 64 20 73 70 61 63 65 29 0a 20 20 2a 2a 20 74 68  d space).  ** th
c210: 65 6e 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  en the cell cont
c220: 65 6e 74 20 6f 66 66 73 65 74 20 6f 66 20 61 6e  ent offset of an
c230: 20 65 6d 70 74 79 20 70 61 67 65 20 77 61 6e 74   empty page want
c240: 73 20 74 6f 20 62 65 20 36 35 35 33 36 2e 0a 20  s to be 65536.. 
c250: 20 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74 68 61   ** However, tha
c260: 74 20 69 6e 74 65 67 65 72 20 69 73 20 74 6f 6f  t integer is too
c270: 20 6c 61 72 67 65 20 74 6f 20 62 65 20 73 74 6f   large to be sto
c280: 72 65 64 20 69 6e 20 61 20 32 2d 62 79 74 65 20  red in a 2-byte 
c290: 75 6e 73 69 67 6e 65 64 0a 20 20 2a 2a 20 69 6e  unsigned.  ** in
c2a0: 74 65 67 65 72 2c 20 73 6f 20 61 20 76 61 6c 75  teger, so a valu
c2b0: 65 20 6f 66 20 30 20 69 73 20 75 73 65 64 20 69  e of 0 is used i
c2c0: 6e 20 69 74 73 20 70 6c 61 63 65 2e 20 2a 2f 0a  n its place. */.
c2d0: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
c2e0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
c2f0: 20 20 61 73 73 65 72 74 28 20 74 6f 70 3c 3d 28    assert( top<=(
c300: 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e  int)pPage->pBt->
c310: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 20 2f 2a  usableSize ); /*
c320: 20 50 72 65 76 65 6e 74 20 62 79 20 67 65 74 41   Prevent by getA
c330: 6e 64 49 6e 69 74 50 61 67 65 28 29 20 2a 2f 0a  ndInitPage() */.
c340: 20 20 69 66 28 20 67 61 70 3e 74 6f 70 20 29 7b    if( gap>top ){
c350: 0a 20 20 20 20 69 66 28 20 74 6f 70 3d 3d 30 20  .    if( top==0 
c360: 26 26 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  && pPage->pBt->u
c370: 73 61 62 6c 65 53 69 7a 65 3d 3d 36 35 35 33 36  sableSize==65536
c380: 20 29 7b 0a 20 20 20 20 20 20 74 6f 70 20 3d 20   ){.      top = 
c390: 36 35 35 33 36 3b 0a 20 20 20 20 7d 65 6c 73 65  65536;.    }else
c3a0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
c3b0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
c3c0: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  PT;.    }.  }.. 
c3d0: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
c3e0: 65 6e 6f 75 67 68 20 73 70 61 63 65 20 62 65 74  enough space bet
c3f0: 77 65 65 6e 20 67 61 70 20 61 6e 64 20 74 6f 70  ween gap and top
c400: 20 66 6f 72 20 6f 6e 65 20 6d 6f 72 65 20 63 65   for one more ce
c410: 6c 6c 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20  ll pointer.  ** 
c420: 61 72 72 61 79 20 65 6e 74 72 79 20 6f 66 66 73  array entry offs
c430: 65 74 2c 20 61 6e 64 20 69 66 20 74 68 65 20 66  et, and if the f
c440: 72 65 65 6c 69 73 74 20 69 73 20 6e 6f 74 20 65  reelist is not e
c450: 6d 70 74 79 2c 20 74 68 65 6e 20 73 65 61 72 63  mpty, then searc
c460: 68 20 74 68 65 0a 20 20 2a 2a 20 66 72 65 65 6c  h the.  ** freel
c470: 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ist looking for 
c480: 61 20 66 72 65 65 20 73 6c 6f 74 20 62 69 67 20  a free slot big 
c490: 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66  enough to satisf
c4a0: 79 20 74 68 65 20 72 65 71 75 65 73 74 2e 0a 20  y the request.. 
c4b0: 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
c4c0: 67 61 70 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20 20  gap+2==top );.  
c4d0: 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 31 3d  testcase( gap+1=
c4e0: 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61  =top );.  testca
c4f0: 73 65 28 20 67 61 70 3d 3d 74 6f 70 20 29 3b 0a  se( gap==top );.
c500: 20 20 69 66 28 20 28 64 61 74 61 5b 68 64 72 2b    if( (data[hdr+
c510: 32 5d 20 7c 7c 20 64 61 74 61 5b 68 64 72 2b 31  2] || data[hdr+1
c520: 5d 29 20 26 26 20 67 61 70 2b 32 3c 3d 74 6f 70  ]) && gap+2<=top
c530: 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 53 70 61   ){.    u8 *pSpa
c540: 63 65 20 3d 20 70 61 67 65 46 69 6e 64 53 6c 6f  ce = pageFindSlo
c550: 74 28 70 50 61 67 65 2c 20 6e 42 79 74 65 2c 20  t(pPage, nByte, 
c560: 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 70 53  &rc);.    if( pS
c570: 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 61 73  pace ){.      as
c580: 73 65 72 74 28 20 70 53 70 61 63 65 3e 3d 64 61  sert( pSpace>=da
c590: 74 61 20 26 26 20 28 70 53 70 61 63 65 20 2d 20  ta && (pSpace - 
c5a0: 64 61 74 61 29 3c 36 35 35 33 36 20 29 3b 0a 20  data)<65536 );. 
c5b0: 20 20 20 20 20 2a 70 49 64 78 20 3d 20 28 69 6e       *pIdx = (in
c5c0: 74 29 28 70 53 70 61 63 65 20 2d 20 64 61 74 61  t)(pSpace - data
c5d0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
c5e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
c5f0: 65 6c 73 65 20 69 66 28 20 72 63 20 29 7b 0a 20  else if( rc ){. 
c600: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
c610: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
c620: 54 68 65 20 72 65 71 75 65 73 74 20 63 6f 75 6c  The request coul
c630: 64 20 6e 6f 74 20 62 65 20 66 75 6c 66 69 6c 6c  d not be fulfill
c640: 65 64 20 75 73 69 6e 67 20 61 20 66 72 65 65 6c  ed using a freel
c650: 69 73 74 20 73 6c 6f 74 2e 20 20 43 68 65 63 6b  ist slot.  Check
c660: 0a 20 20 2a 2a 20 74 6f 20 73 65 65 20 69 66 20  .  ** to see if 
c670: 64 65 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20  defragmentation 
c680: 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  is necessary..  
c690: 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  */.  testcase( g
c6a0: 61 70 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f 70 20  ap+2+nByte==top 
c6b0: 29 3b 0a 20 20 69 66 28 20 67 61 70 2b 32 2b 6e  );.  if( gap+2+n
c6c0: 42 79 74 65 3e 74 6f 70 20 29 7b 0a 20 20 20 20  Byte>top ){.    
c6d0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
c6e0: 43 65 6c 6c 3e 30 20 7c 7c 20 43 4f 52 52 55 50  Cell>0 || CORRUP
c6f0: 54 5f 44 42 20 29 3b 0a 20 20 20 20 72 63 20 3d  T_DB );.    rc =
c700: 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28   defragmentPage(
c710: 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  pPage);.    if( 
c720: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
c730: 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
c740: 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b  teNotZero(&data[
c750: 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 61 73 73  hdr+5]);.    ass
c760: 65 72 74 28 20 67 61 70 2b 6e 42 79 74 65 3c 3d  ert( gap+nByte<=
c770: 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f  top );.  }...  /
c780: 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  * Allocate memor
c790: 79 20 66 72 6f 6d 20 74 68 65 20 67 61 70 20 69  y from the gap i
c7a0: 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 65  n between the ce
c7b0: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll pointer array
c7c0: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 63 65  .  ** and the ce
c7d0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e  ll content area.
c7e0: 20 20 54 68 65 20 62 74 72 65 65 49 6e 69 74 50    The btreeInitP
c7f0: 61 67 65 28 29 20 63 61 6c 6c 20 68 61 73 20 61  age() call has a
c800: 6c 72 65 61 64 79 0a 20 20 2a 2a 20 76 61 6c 69  lready.  ** vali
c810: 64 61 74 65 64 20 74 68 65 20 66 72 65 65 6c 69  dated the freeli
c820: 73 74 2e 20 20 47 69 76 65 6e 20 74 68 61 74 20  st.  Given that 
c830: 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20  the freelist is 
c840: 76 61 6c 69 64 2c 20 74 68 65 72 65 0a 20 20 2a  valid, there.  *
c850: 2a 20 69 73 20 6e 6f 20 77 61 79 20 74 68 61 74  * is no way that
c860: 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   the allocation 
c870: 63 61 6e 20 65 78 74 65 6e 64 20 6f 66 66 20 74  can extend off t
c880: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  he end of the pa
c890: 67 65 2e 0a 20 20 2a 2a 20 54 68 65 20 61 73 73  ge..  ** The ass
c8a0: 65 72 74 28 29 20 62 65 6c 6f 77 20 76 65 72 69  ert() below veri
c8b0: 66 69 65 73 20 74 68 65 20 70 72 65 76 69 6f 75  fies the previou
c8c0: 73 20 73 65 6e 74 65 6e 63 65 2e 0a 20 20 2a 2f  s sentence..  */
c8d0: 0a 20 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b  .  top -= nByte;
c8e0: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
c8f0: 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a  a[hdr+5], top);.
c900: 20 20 61 73 73 65 72 74 28 20 74 6f 70 2b 6e 42    assert( top+nB
c910: 79 74 65 20 3c 3d 20 28 69 6e 74 29 70 50 61 67  yte <= (int)pPag
c920: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
c930: 7a 65 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20  ze );.  *pIdx = 
c940: 74 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  top;.  return SQ
c950: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
c960: 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63 74 69  * Return a secti
c970: 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67 65 2d  on of the pPage-
c980: 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20 66 72  >aData to the fr
c990: 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66  eelist..** The f
c9a0: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
c9b0: 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63 6b 20   new free block 
c9c0: 69 73 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  is pPage->aData[
c9d0: 69 53 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74  iStart].** and t
c9e0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62  he size of the b
c9f0: 6c 6f 63 6b 20 69 73 20 69 53 69 7a 65 20 62 79  lock is iSize by
ca00: 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 64 6a 61 63  tes..**.** Adjac
ca10: 65 6e 74 20 66 72 65 65 62 6c 6f 63 6b 73 20 61  ent freeblocks a
ca20: 72 65 20 63 6f 61 6c 65 73 63 65 64 2e 0a 2a 2a  re coalesced..**
ca30: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 65 76  .** Note that ev
ca40: 65 6e 20 74 68 6f 75 67 68 20 74 68 65 20 66 72  en though the fr
ca50: 65 65 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73  eeblock list was
ca60: 20 63 68 65 63 6b 65 64 20 62 79 20 62 74 72 65   checked by btre
ca70: 65 49 6e 69 74 50 61 67 65 28 29 2c 0a 2a 2a 20  eInitPage(),.** 
ca80: 74 68 61 74 20 72 6f 75 74 69 6e 65 20 77 69 6c  that routine wil
ca90: 6c 20 6e 6f 74 20 64 65 74 65 63 74 20 6f 76 65  l not detect ove
caa0: 72 6c 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c  rlap between cel
cab0: 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73  ls or freeblocks
cac0: 2e 20 20 4e 6f 72 0a 2a 2a 20 64 6f 65 73 20 69  .  Nor.** does i
cad0: 74 20 64 65 74 65 63 74 20 63 65 6c 6c 73 20 6f  t detect cells o
cae0: 72 20 66 72 65 65 62 6c 6f 63 6b 73 20 74 68 61  r freeblocks tha
caf0: 74 20 65 6e 63 72 6f 75 63 68 20 69 6e 74 6f 20  t encrouch into 
cb00: 74 68 65 20 72 65 73 65 72 76 65 64 20 62 79 74  the reserved byt
cb10: 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64  es.** at the end
cb20: 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 20 53   of the page.  S
cb30: 6f 20 64 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20  o do additional 
cb40: 63 6f 72 72 75 70 74 69 6f 6e 20 63 68 65 63 6b  corruption check
cb50: 73 20 69 6e 73 69 64 65 20 74 68 69 73 0a 2a 2a  s inside this.**
cb60: 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 72 65 74   routine and ret
cb70: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
cb80: 50 54 20 69 66 20 61 6e 79 20 70 72 6f 62 6c 65  PT if any proble
cb90: 6d 73 20 61 72 65 20 66 6f 75 6e 64 2e 0a 2a 2f  ms are found..*/
cba0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65  .static int free
cbb0: 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70  Space(MemPage *p
cbc0: 50 61 67 65 2c 20 75 31 36 20 69 53 74 61 72 74  Page, u16 iStart
cbd0: 2c 20 75 31 36 20 69 53 69 7a 65 29 7b 0a 20 20  , u16 iSize){.  
cbe0: 75 31 36 20 69 50 74 72 3b 20 20 20 20 20 20 20  u16 iPtr;       
cbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc00: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
cc10: 20 6f 66 20 70 74 72 20 74 6f 20 6e 65 78 74 20   of ptr to next 
cc20: 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75  freeblock */.  u
cc30: 31 36 20 69 46 72 65 65 42 6c 6b 3b 20 20 20 20  16 iFreeBlk;    
cc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc50: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
cc60: 6f 66 20 74 68 65 20 6e 65 78 74 20 66 72 65 65  of the next free
cc70: 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 38 20 68 64  block */.  u8 hd
cc80: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
cc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cca0: 20 2f 2a 20 50 61 67 65 20 68 65 61 64 65 72 20   /* Page header 
ccb0: 73 69 7a 65 2e 20 20 30 20 6f 72 20 31 30 30 20  size.  0 or 100 
ccc0: 2a 2f 0a 20 20 75 38 20 6e 46 72 61 67 20 3d 20  */.  u8 nFrag = 
ccd0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
cce0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
ccf0: 64 75 63 74 69 6f 6e 20 69 6e 20 66 72 61 67 6d  duction in fragm
cd00: 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 31  entation */.  u1
cd10: 36 20 69 4f 72 69 67 53 69 7a 65 20 3d 20 69 53  6 iOrigSize = iS
cd20: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
cd30: 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
cd40: 76 61 6c 75 65 20 6f 66 20 69 53 69 7a 65 20 2a  value of iSize *
cd50: 2f 0a 20 20 75 33 32 20 69 4c 61 73 74 20 3d 20  /.  u32 iLast = 
cd60: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
cd70: 6c 65 53 69 7a 65 2d 34 3b 20 2f 2a 20 4c 61 72  leSize-4; /* Lar
cd80: 67 65 73 74 20 70 6f 73 73 69 62 6c 65 20 66 72  gest possible fr
cd90: 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a  eeblock offset *
cda0: 2f 0a 20 20 75 33 32 20 69 45 6e 64 20 3d 20 69  /.  u32 iEnd = i
cdb0: 53 74 61 72 74 20 2b 20 69 53 69 7a 65 3b 20 20  Start + iSize;  
cdc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
cdd0: 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65  st byte past the
cde0: 20 69 53 74 61 72 74 20 62 75 66 66 65 72 20 2a   iStart buffer *
cdf0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
ce00: 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d  r *data = pPage-
ce10: 3e 61 44 61 74 61 3b 20 20 20 2f 2a 20 50 61 67  >aData;   /* Pag
ce20: 65 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20  e content */..  
ce30: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
ce40: 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
ce50: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
ce60: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
ce70: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
ce80: 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
ce90: 44 42 20 7c 7c 20 69 53 74 61 72 74 3e 3d 70 50  DB || iStart>=pP
cea0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36  age->hdrOffset+6
ceb0: 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72  +pPage->childPtr
cec0: 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Size );.  assert
ced0: 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
cee0: 69 45 6e 64 20 3c 3d 20 70 50 61 67 65 2d 3e 70  iEnd <= pPage->p
cef0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
cf00: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
cf10: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
cf20: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
cf30: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ) );.  assert( i
cf40: 53 69 7a 65 3e 3d 34 20 29 3b 20 20 20 2f 2a 20  Size>=4 );   /* 
cf50: 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a  Minimum cell siz
cf60: 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65  e is 4 */.  asse
cf70: 72 74 28 20 69 53 74 61 72 74 3c 3d 69 4c 61 73  rt( iStart<=iLas
cf80: 74 20 29 3b 0a 0a 20 20 2f 2a 20 4f 76 65 72 77  t );..  /* Overw
cf90: 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66  rite deleted inf
cfa0: 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65  ormation with ze
cfb0: 72 6f 73 20 77 68 65 6e 20 74 68 65 20 73 65 63  ros when the sec
cfc0: 75 72 65 5f 64 65 6c 65 74 65 0a 20 20 2a 2a 20  ure_delete.  ** 
cfd0: 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  option is enable
cfe0: 64 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65  d */.  if( pPage
cff0: 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ->pBt->btsFlags 
d000: 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  & BTS_SECURE_DEL
d010: 45 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  ETE ){.    memse
d020: 74 28 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c  t(&data[iStart],
d030: 20 30 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a   0, iSize);.  }.
d040: 0a 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 6f  .  /* The list o
d050: 66 20 66 72 65 65 62 6c 6f 63 6b 73 20 6d 75 73  f freeblocks mus
d060: 74 20 62 65 20 69 6e 20 61 73 63 65 6e 64 69 6e  t be in ascendin
d070: 67 20 6f 72 64 65 72 2e 20 20 46 69 6e 64 20 74  g order.  Find t
d080: 68 65 20 0a 20 20 2a 2a 20 73 70 6f 74 20 6f 6e  he .  ** spot on
d090: 20 74 68 65 20 6c 69 73 74 20 77 68 65 72 65 20   the list where 
d0a0: 69 53 74 61 72 74 20 73 68 6f 75 6c 64 20 62 65  iStart should be
d0b0: 20 69 6e 73 65 72 74 65 64 2e 0a 20 20 2a 2f 0a   inserted..  */.
d0c0: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
d0d0: 64 72 4f 66 66 73 65 74 3b 0a 20 20 69 50 74 72  drOffset;.  iPtr
d0e0: 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69 66   = hdr + 1;.  if
d0f0: 28 20 64 61 74 61 5b 69 50 74 72 2b 31 5d 3d 3d  ( data[iPtr+1]==
d100: 30 20 26 26 20 64 61 74 61 5b 69 50 74 72 5d 3d  0 && data[iPtr]=
d110: 3d 30 20 29 7b 0a 20 20 20 20 69 46 72 65 65 42  =0 ){.    iFreeB
d120: 6c 6b 20 3d 20 30 3b 20 20 2f 2a 20 53 68 6f 72  lk = 0;  /* Shor
d130: 74 63 75 74 20 66 6f 72 20 74 68 65 20 63 61 73  tcut for the cas
d140: 65 20 77 68 65 6e 20 74 68 65 20 66 72 65 65 6c  e when the freel
d150: 69 73 74 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a  ist is empty */.
d160: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69    }else{.    whi
d170: 6c 65 28 20 28 69 46 72 65 65 42 6c 6b 20 3d 20  le( (iFreeBlk = 
d180: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
d190: 50 74 72 5d 29 29 3e 30 20 26 26 20 69 46 72 65  Ptr]))>0 && iFre
d1a0: 65 42 6c 6b 3c 69 53 74 61 72 74 20 29 7b 0a 20  eBlk<iStart ){. 
d1b0: 20 20 20 20 20 69 66 28 20 69 46 72 65 65 42 6c       if( iFreeBl
d1c0: 6b 3c 69 50 74 72 2b 34 20 29 20 72 65 74 75 72  k<iPtr+4 ) retur
d1d0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
d1e0: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 69 50 74  _BKPT;.      iPt
d1f0: 72 20 3d 20 69 46 72 65 65 42 6c 6b 3b 0a 20 20  r = iFreeBlk;.  
d200: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 46 72 65    }.    if( iFre
d210: 65 42 6c 6b 3e 69 4c 61 73 74 20 29 20 72 65 74  eBlk>iLast ) ret
d220: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
d230: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73  PT_BKPT;.    ass
d240: 65 72 74 28 20 69 46 72 65 65 42 6c 6b 3e 69 50  ert( iFreeBlk>iP
d250: 74 72 20 7c 7c 20 69 46 72 65 65 42 6c 6b 3d 3d  tr || iFreeBlk==
d260: 30 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 41  0 );.  .    /* A
d270: 74 20 74 68 69 73 20 70 6f 69 6e 74 3a 0a 20 20  t this point:.  
d280: 20 20 2a 2a 20 20 20 20 69 46 72 65 65 42 6c 6b    **    iFreeBlk
d290: 3a 20 20 20 46 69 72 73 74 20 66 72 65 65 62 6c  :   First freebl
d2a0: 6f 63 6b 20 61 66 74 65 72 20 69 53 74 61 72 74  ock after iStart
d2b0: 2c 20 6f 72 20 7a 65 72 6f 20 69 66 20 6e 6f 6e  , or zero if non
d2c0: 65 0a 20 20 20 20 2a 2a 20 20 20 20 69 50 74 72  e.    **    iPtr
d2d0: 3a 20 20 20 20 20 20 20 54 68 65 20 61 64 64 72  :       The addr
d2e0: 65 73 73 20 6f 66 20 61 20 70 6f 69 6e 74 65 72  ess of a pointer
d2f0: 20 74 6f 20 69 46 72 65 65 42 6c 6b 0a 20 20 20   to iFreeBlk.   
d300: 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b   **.    ** Check
d310: 20 74 6f 20 73 65 65 20 69 66 20 69 46 72 65 65   to see if iFree
d320: 42 6c 6b 20 73 68 6f 75 6c 64 20 62 65 20 63 6f  Blk should be co
d330: 61 6c 65 73 63 65 64 20 6f 6e 74 6f 20 74 68 65  alesced onto the
d340: 20 65 6e 64 20 6f 66 20 69 53 74 61 72 74 2e 0a   end of iStart..
d350: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
d360: 46 72 65 65 42 6c 6b 20 26 26 20 69 45 6e 64 2b  FreeBlk && iEnd+
d370: 33 3e 3d 69 46 72 65 65 42 6c 6b 20 29 7b 0a 20  3>=iFreeBlk ){. 
d380: 20 20 20 20 20 6e 46 72 61 67 20 3d 20 69 46 72       nFrag = iFr
d390: 65 65 42 6c 6b 20 2d 20 69 45 6e 64 3b 0a 20 20  eeBlk - iEnd;.  
d3a0: 20 20 20 20 69 66 28 20 69 45 6e 64 3e 69 46 72      if( iEnd>iFr
d3b0: 65 65 42 6c 6b 20 29 20 72 65 74 75 72 6e 20 53  eeBlk ) return S
d3c0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
d3d0: 50 54 3b 0a 20 20 20 20 20 20 69 45 6e 64 20 3d  PT;.      iEnd =
d3e0: 20 69 46 72 65 65 42 6c 6b 20 2b 20 67 65 74 32   iFreeBlk + get2
d3f0: 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65  byte(&data[iFree
d400: 42 6c 6b 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69  Blk+2]);.      i
d410: 66 28 20 69 45 6e 64 20 3e 20 70 50 61 67 65 2d  f( iEnd > pPage-
d420: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
d430: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
d440: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
d450: 20 20 20 20 20 69 53 69 7a 65 20 3d 20 69 45 6e       iSize = iEn
d460: 64 20 2d 20 69 53 74 61 72 74 3b 0a 20 20 20 20  d - iStart;.    
d470: 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 67 65 74    iFreeBlk = get
d480: 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65  2byte(&data[iFre
d490: 65 42 6c 6b 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  eBlk]);.    }.  
d4a0: 0a 20 20 20 20 2f 2a 20 49 66 20 69 50 74 72 20  .    /* If iPtr 
d4b0: 69 73 20 61 6e 6f 74 68 65 72 20 66 72 65 65 62  is another freeb
d4c0: 6c 6f 63 6b 20 28 74 68 61 74 20 69 73 2c 20 69  lock (that is, i
d4d0: 66 20 69 50 74 72 20 69 73 20 6e 6f 74 20 74 68  f iPtr is not th
d4e0: 65 20 66 72 65 65 6c 69 73 74 0a 20 20 20 20 2a  e freelist.    *
d4f0: 2a 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65  * pointer in the
d500: 20 70 61 67 65 20 68 65 61 64 65 72 29 20 74 68   page header) th
d510: 65 6e 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  en check to see 
d520: 69 66 20 69 53 74 61 72 74 20 73 68 6f 75 6c 64  if iStart should
d530: 20 62 65 0a 20 20 20 20 2a 2a 20 63 6f 61 6c 65   be.    ** coale
d540: 73 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e  sced onto the en
d550: 64 20 6f 66 20 69 50 74 72 2e 0a 20 20 20 20 2a  d of iPtr..    *
d560: 2f 0a 20 20 20 20 69 66 28 20 69 50 74 72 3e 68  /.    if( iPtr>h
d570: 64 72 2b 31 20 29 7b 0a 20 20 20 20 20 20 69 6e  dr+1 ){.      in
d580: 74 20 69 50 74 72 45 6e 64 20 3d 20 69 50 74 72  t iPtrEnd = iPtr
d590: 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74   + get2byte(&dat
d5a0: 61 5b 69 50 74 72 2b 32 5d 29 3b 0a 20 20 20 20  a[iPtr+2]);.    
d5b0: 20 20 69 66 28 20 69 50 74 72 45 6e 64 2b 33 3e    if( iPtrEnd+3>
d5c0: 3d 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20  =iStart ){.     
d5d0: 20 20 20 69 66 28 20 69 50 74 72 45 6e 64 3e 69     if( iPtrEnd>i
d5e0: 53 74 61 72 74 20 29 20 72 65 74 75 72 6e 20 53  Start ) return S
d5f0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
d600: 50 54 3b 0a 20 20 20 20 20 20 20 20 6e 46 72 61  PT;.        nFra
d610: 67 20 2b 3d 20 69 53 74 61 72 74 20 2d 20 69 50  g += iStart - iP
d620: 74 72 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 69  trEnd;.        i
d630: 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 50  Size = iEnd - iP
d640: 74 72 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61  tr;.        iSta
d650: 72 74 20 3d 20 69 50 74 72 3b 0a 20 20 20 20 20  rt = iPtr;.     
d660: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
d670: 20 6e 46 72 61 67 3e 64 61 74 61 5b 68 64 72 2b   nFrag>data[hdr+
d680: 37 5d 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  7] ) return SQLI
d690: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
d6a0: 0a 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d  .    data[hdr+7]
d6b0: 20 2d 3d 20 6e 46 72 61 67 3b 0a 20 20 7d 0a 20   -= nFrag;.  }. 
d6c0: 20 69 66 28 20 69 53 74 61 72 74 3d 3d 67 65 74   if( iStart==get
d6d0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
d6e0: 35 5d 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  5]) ){.    /* Th
d6f0: 65 20 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b 20  e new freeblock 
d700: 69 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  is at the beginn
d710: 69 6e 67 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  ing of the cell 
d720: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2c 0a 20 20  content area,.  
d730: 20 20 2a 2a 20 73 6f 20 6a 75 73 74 20 65 78 74    ** so just ext
d740: 65 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  end the cell con
d750: 74 65 6e 74 20 61 72 65 61 20 72 61 74 68 65 72  tent area rather
d760: 20 74 68 61 6e 20 63 72 65 61 74 65 20 61 6e 6f   than create ano
d770: 74 68 65 72 0a 20 20 20 20 2a 2a 20 66 72 65 65  ther.    ** free
d780: 6c 69 73 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20  list entry */.  
d790: 20 20 69 66 28 20 69 50 74 72 21 3d 68 64 72 2b    if( iPtr!=hdr+
d7a0: 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  1 ) return SQLIT
d7b0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
d7c0: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
d7d0: 74 61 5b 68 64 72 2b 31 5d 2c 20 69 46 72 65 65  ta[hdr+1], iFree
d7e0: 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74 32 62 79  Blk);.    put2by
d7f0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
d800: 20 69 45 6e 64 29 3b 0a 20 20 7d 65 6c 73 65 7b   iEnd);.  }else{
d810: 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74  .    /* Insert t
d820: 68 65 20 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b  he new freeblock
d830: 20 69 6e 74 6f 20 74 68 65 20 66 72 65 65 6c 69   into the freeli
d840: 73 74 20 2a 2f 0a 20 20 20 20 70 75 74 32 62 79  st */.    put2by
d850: 74 65 28 26 64 61 74 61 5b 69 50 74 72 5d 2c 20  te(&data[iPtr], 
d860: 69 53 74 61 72 74 29 3b 0a 20 20 20 20 70 75 74  iStart);.    put
d870: 32 62 79 74 65 28 26 64 61 74 61 5b 69 53 74 61  2byte(&data[iSta
d880: 72 74 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a  rt], iFreeBlk);.
d890: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
d8a0: 74 61 5b 69 53 74 61 72 74 2b 32 5d 2c 20 69 53  ta[iStart+2], iS
d8b0: 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67  ize);.  }.  pPag
d8c0: 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 69 4f 72 69  e->nFree += iOri
d8d0: 67 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20  gSize;.  return 
d8e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
d8f0: 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20 66  .** Decode the f
d900: 6c 61 67 73 20 62 79 74 65 20 28 74 68 65 20 66  lags byte (the f
d910: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
d920: 20 68 65 61 64 65 72 29 20 66 6f 72 20 61 20 70   header) for a p
d930: 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69  age.** and initi
d940: 61 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66 20  alize fields of 
d950: 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75  the MemPage stru
d960: 63 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67 6c  cture accordingl
d970: 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68  y..**.** Only th
d980: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62  e following comb
d990: 69 6e 61 74 69 6f 6e 73 20 61 72 65 20 73 75 70  inations are sup
d9a0: 70 6f 72 74 65 64 2e 20 20 41 6e 79 74 68 69 6e  ported.  Anythin
d9b0: 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 69  g different.** i
d9c0: 6e 64 69 63 61 74 65 73 20 61 20 63 6f 72 72 75  ndicates a corru
d9d0: 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  pt database file
d9e0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
d9f0: 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a   PTF_ZERODATA.**
da00: 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52           PTF_ZER
da10: 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c 45 41 46  ODATA | PTF_LEAF
da20: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
da30: 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49  LEAFDATA | PTF_I
da40: 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20 20  NTKEY.**        
da50: 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20   PTF_LEAFDATA | 
da60: 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54 46  PTF_INTKEY | PTF
da70: 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63 20  _LEAF.*/.static 
da80: 69 6e 74 20 64 65 63 6f 64 65 46 6c 61 67 73 28  int decodeFlags(
da90: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
daa0: 69 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a 20  int flagByte){. 
dab0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
dac0: 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66      /* A copy of
dad0: 20 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a   pPage->pBt */..
dae0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
daf0: 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50 61  >hdrOffset==(pPa
db00: 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30  ge->pgno==1 ? 10
db10: 30 20 3a 20 30 29 20 29 3b 0a 20 20 61 73 73 65  0 : 0) );.  asse
db20: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
db30: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
db40: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
db50: 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75 38  Page->leaf = (u8
db60: 29 28 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b 20  )(flagByte>>3); 
db70: 20 61 73 73 65 72 74 28 20 50 54 46 5f 4c 45 41   assert( PTF_LEA
db80: 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20 66  F == 1<<3 );.  f
db90: 6c 61 67 42 79 74 65 20 26 3d 20 7e 50 54 46 5f  lagByte &= ~PTF_
dba0: 4c 45 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e 63  LEAF;.  pPage->c
dbb0: 68 69 6c 64 50 74 72 53 69 7a 65 20 3d 20 34 2d  hildPtrSize = 4-
dbc0: 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20  4*pPage->leaf;. 
dbd0: 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a   pPage->xCellSiz
dbe0: 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 3b  e = cellSizePtr;
dbf0: 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  .  pBt = pPage->
dc00: 70 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67 42  pBt;.  if( flagB
dc10: 79 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41  yte==(PTF_LEAFDA
dc20: 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29  TA | PTF_INTKEY)
dc30: 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45   ){.    /* EVIDE
dc40: 4e 43 45 2d 4f 46 3a 20 52 2d 30 33 36 34 30 2d  NCE-OF: R-03640-
dc50: 31 33 34 31 35 20 41 20 76 61 6c 75 65 20 6f 66  13415 A value of
dc60: 20 35 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67   5 means the pag
dc70: 65 20 69 73 20 61 6e 20 69 6e 74 65 72 69 6f 72  e is an interior
dc80: 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 62 2d  .    ** table b-
dc90: 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20  tree page. */.  
dca0: 20 20 61 73 73 65 72 74 28 20 28 50 54 46 5f 4c    assert( (PTF_L
dcb0: 45 41 46 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b  EAFDATA|PTF_INTK
dcc0: 45 59 29 3d 3d 35 20 29 3b 0a 20 20 20 20 2f 2a  EY)==5 );.    /*
dcd0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
dce0: 32 30 35 30 31 2d 36 31 37 39 36 20 41 20 76 61  20501-61796 A va
dcf0: 6c 75 65 20 6f 66 20 31 33 20 6d 65 61 6e 73 20  lue of 13 means 
dd00: 74 68 65 20 70 61 67 65 20 69 73 20 61 20 6c 65  the page is a le
dd10: 61 66 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20  af.    ** table 
dd20: 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a  b-tree page. */.
dd30: 20 20 20 20 61 73 73 65 72 74 28 20 28 50 54 46      assert( (PTF
dd40: 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 49 4e  _LEAFDATA|PTF_IN
dd50: 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 29 3d 3d  TKEY|PTF_LEAF)==
dd60: 31 33 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  13 );.    pPage-
dd70: 3e 69 6e 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20  >intKey = 1;.   
dd80: 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
dd90: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 2d   ){.      pPage-
dda0: 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 31 3b  >intKeyLeaf = 1;
ddb0: 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 6e 6f  .      pPage->no
ddc0: 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20  Payload = 0;.   
ddd0: 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65     pPage->xParse
dde0: 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73  Cell = btreePars
ddf0: 65 43 65 6c 6c 50 74 72 3b 0a 20 20 20 20 7d 65  eCellPtr;.    }e
de00: 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65  lse{.      pPage
de10: 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30  ->intKeyLeaf = 0
de20: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 6e  ;.      pPage->n
de30: 6f 50 61 79 6c 6f 61 64 20 3d 20 31 3b 0a 20 20  oPayload = 1;.  
de40: 20 20 20 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c      pPage->xCell
de50: 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50  Size = cellSizeP
de60: 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20 20 20  trNoPayload;.   
de70: 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65     pPage->xParse
de80: 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73  Cell = btreePars
de90: 65 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61  eCellPtrNoPayloa
dea0: 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  d;.    }.    pPa
deb0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70  ge->maxLocal = p
dec0: 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20  Bt->maxLeaf;.   
ded0: 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c   pPage->minLocal
dee0: 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b   = pBt->minLeaf;
def0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61  .  }else if( fla
df00: 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44  gByte==PTF_ZEROD
df10: 41 54 41 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56  ATA ){.    /* EV
df20: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 37 32  IDENCE-OF: R-272
df30: 32 35 2d 35 33 39 33 36 20 41 20 76 61 6c 75 65  25-53936 A value
df40: 20 6f 66 20 32 20 6d 65 61 6e 73 20 74 68 65 20   of 2 means the 
df50: 70 61 67 65 20 69 73 20 61 6e 20 69 6e 74 65 72  page is an inter
df60: 69 6f 72 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78  ior.    ** index
df70: 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f   b-tree page. */
df80: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 54  .    assert( (PT
df90: 46 5f 5a 45 52 4f 44 41 54 41 29 3d 3d 32 20 29  F_ZERODATA)==2 )
dfa0: 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
dfb0: 45 2d 4f 46 3a 20 52 2d 31 36 35 37 31 2d 31 31  E-OF: R-16571-11
dfc0: 36 31 35 20 41 20 76 61 6c 75 65 20 6f 66 20 31  615 A value of 1
dfd0: 30 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65  0 means the page
dfe0: 20 69 73 20 61 20 6c 65 61 66 0a 20 20 20 20 2a   is a leaf.    *
dff0: 2a 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 70  * index b-tree p
e000: 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  age. */.    asse
e010: 72 74 28 20 28 50 54 46 5f 5a 45 52 4f 44 41 54  rt( (PTF_ZERODAT
e020: 41 7c 50 54 46 5f 4c 45 41 46 29 3d 3d 31 30 20  A|PTF_LEAF)==10 
e030: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  );.    pPage->in
e040: 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 50  tKey = 0;.    pP
e050: 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20  age->intKeyLeaf 
e060: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = 0;.    pPage->
e070: 6e 6f 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20  noPayload = 0;. 
e080: 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65     pPage->xParse
e090: 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73  Cell = btreePars
e0a0: 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 3b 0a 20  eCellPtrIndex;. 
e0b0: 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63     pPage->maxLoc
e0c0: 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63  al = pBt->maxLoc
e0d0: 61 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d  al;.    pPage->m
e0e0: 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  inLocal = pBt->m
e0f0: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65  inLocal;.  }else
e100: 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  {.    /* EVIDENC
e110: 45 2d 4f 46 3a 20 52 2d 34 37 36 30 38 2d 35 36  E-OF: R-47608-56
e120: 34 36 39 20 41 6e 79 20 6f 74 68 65 72 20 76 61  469 Any other va
e130: 6c 75 65 20 66 6f 72 20 74 68 65 20 62 2d 74 72  lue for the b-tr
e140: 65 65 20 70 61 67 65 20 74 79 70 65 20 69 73 0a  ee page type is.
e150: 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 2e      ** an error.
e160: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
e170: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
e180: 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d  PT;.  }.  pPage-
e190: 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64  >max1bytePayload
e1a0: 20 3d 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65   = pBt->max1byte
e1b0: 50 61 79 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72  Payload;.  retur
e1c0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
e1d0: 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
e1e0: 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 69   the auxiliary i
e1f0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61  nformation for a
e200: 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a   disk block..**.
e210: 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
e220: 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  _OK on success. 
e230: 20 49 66 20 77 65 20 73 65 65 20 74 68 61 74 20   If we see that 
e240: 74 68 65 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a  the page does.**
e250: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 77   not contain a w
e260: 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62  ell-formed datab
e270: 61 73 65 20 70 61 67 65 2c 20 74 68 65 6e 20 72  ase page, then r
e280: 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  eturn .** SQLITE
e290: 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65 20  _CORRUPT.  Note 
e2a0: 74 68 61 74 20 61 20 72 65 74 75 72 6e 20 6f 66  that a return of
e2b0: 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20   SQLITE_OK does 
e2c0: 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65  not.** guarantee
e2d0: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
e2e0: 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20  s well-formed.  
e2f0: 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68  It only shows th
e300: 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64 20  at.** we failed 
e310: 74 6f 20 64 65 74 65 63 74 20 61 6e 79 20 63 6f  to detect any co
e320: 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  rruption..*/.sta
e330: 74 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e 69  tic int btreeIni
e340: 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  tPage(MemPage *p
e350: 50 61 67 65 29 7b 0a 0a 20 20 61 73 73 65 72 74  Page){..  assert
e360: 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20  ( pPage->pBt!=0 
e370: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
e380: 67 65 2d 3e 70 42 74 2d 3e 64 62 21 3d 30 20 29  ge->pBt->db!=0 )
e390: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
e3a0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
e3b0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
e3c0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
e3d0: 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69  Page->pgno==sqli
e3e0: 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
e3f0: 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  er(pPage->pDbPag
e400: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
e410: 70 50 61 67 65 20 3d 3d 20 73 71 6c 69 74 65 33  pPage == sqlite3
e420: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
e430: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
e440: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
e450: 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c 69 74  ->aData == sqlit
e460: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
e470: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
e480: 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  ;..  if( !pPage-
e490: 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 75  >isInit ){.    u
e4a0: 31 36 20 70 63 3b 20 20 20 20 20 20 20 20 20 20  16 pc;          
e4b0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
e4c0: 61 20 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68  a freeblock with
e4d0: 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  in pPage->aData[
e4e0: 5d 20 2a 2f 0a 20 20 20 20 75 38 20 68 64 72 3b  ] */.    u8 hdr;
e4f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
e500: 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e 6e 69  ffset to beginni
e510: 6e 67 20 6f 66 20 70 61 67 65 20 68 65 61 64 65  ng of page heade
e520: 72 20 2a 2f 0a 20 20 20 20 75 38 20 2a 64 61 74  r */.    u8 *dat
e530: 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  a;          /* E
e540: 71 75 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61  qual to pPage->a
e550: 44 61 74 61 20 2a 2f 0a 20 20 20 20 42 74 53 68  Data */.    BtSh
e560: 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20  ared *pBt;      
e570: 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62 74    /* The main bt
e580: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ree structure */
e590: 0a 20 20 20 20 69 6e 74 20 75 73 61 62 6c 65 53  .    int usableS
e5a0: 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e  ize;    /* Amoun
e5b0: 74 20 6f 66 20 75 73 61 62 6c 65 20 73 70 61 63  t of usable spac
e5c0: 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a  e on each page *
e5d0: 2f 0a 20 20 20 20 75 31 36 20 63 65 6c 6c 4f 66  /.    u16 cellOf
e5e0: 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73  fset;    /* Offs
e5f0: 65 74 20 66 72 6f 6d 20 73 74 61 72 74 20 6f 66  et from start of
e600: 20 70 61 67 65 20 74 6f 20 66 69 72 73 74 20 63   page to first c
e610: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  ell pointer */. 
e620: 20 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20     int nFree;   
e630: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
e640: 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20  of unused bytes 
e650: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
e660: 20 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20     int top;     
e670: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
e680: 79 74 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  yte of the cell 
e690: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
e6a0: 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72      int iCellFir
e6b0: 73 74 3b 20 20 20 20 2f 2a 20 46 69 72 73 74 20  st;    /* First 
e6c0: 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 6f  allowable cell o
e6d0: 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73  r freeblock offs
e6e0: 65 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43  et */.    int iC
e6f0: 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 2f 2a 20  ellLast;     /* 
e700: 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65  Last possible ce
e710: 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20  ll or freeblock 
e720: 6f 66 66 73 65 74 20 2a 2f 0a 0a 20 20 20 20 70  offset */..    p
e730: 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
e740: 0a 0a 20 20 20 20 68 64 72 20 3d 20 70 50 61 67  ..    hdr = pPag
e750: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
e760: 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
e770: 61 44 61 74 61 3b 0a 20 20 20 20 2f 2a 20 45 56  aData;.    /* EV
e780: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 35  IDENCE-OF: R-285
e790: 39 34 2d 30 32 38 39 30 20 54 68 65 20 6f 6e 65  94-02890 The one
e7a0: 2d 62 79 74 65 20 66 6c 61 67 20 61 74 20 6f 66  -byte flag at of
e7b0: 66 73 65 74 20 30 20 69 6e 64 69 63 61 74 69 6e  fset 0 indicatin
e7c0: 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 2d 74  g.    ** the b-t
e7d0: 72 65 65 20 70 61 67 65 20 74 79 70 65 2e 20 2a  ree page type. *
e7e0: 2f 0a 20 20 20 20 69 66 28 20 64 65 63 6f 64 65  /.    if( decode
e7f0: 46 6c 61 67 73 28 70 50 61 67 65 2c 20 64 61 74  Flags(pPage, dat
e800: 61 5b 68 64 72 5d 29 20 29 20 72 65 74 75 72 6e  a[hdr]) ) return
e810: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
e820: 42 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74  BKPT;.    assert
e830: 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  ( pBt->pageSize>
e840: 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67  =512 && pBt->pag
e850: 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a  eSize<=65536 );.
e860: 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50      pPage->maskP
e870: 61 67 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d  age = (u16)(pBt-
e880: 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a  >pageSize - 1);.
e890: 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72      pPage->nOver
e8a0: 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 75 73  flow = 0;.    us
e8b0: 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
e8c0: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20  usableSize;.    
e8d0: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
e8e0: 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d  t = cellOffset =
e8f0: 20 68 64 72 20 2b 20 38 20 2b 20 70 50 61 67 65   hdr + 8 + pPage
e900: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
e910: 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61      pPage->aData
e920: 45 6e 64 20 3d 20 26 64 61 74 61 5b 75 73 61 62  End = &data[usab
e930: 6c 65 53 69 7a 65 5d 3b 0a 20 20 20 20 70 50 61  leSize];.    pPa
e940: 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26  ge->aCellIdx = &
e950: 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d  data[cellOffset]
e960: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61  ;.    pPage->aDa
e970: 74 61 4f 66 73 74 20 3d 20 26 64 61 74 61 5b 70  taOfst = &data[p
e980: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
e990: 7a 65 5d 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  ze];.    /* EVID
e9a0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 38 30 31 35  ENCE-OF: R-58015
e9b0: 2d 34 38 31 37 35 20 54 68 65 20 74 77 6f 2d 62  -48175 The two-b
e9c0: 79 74 65 20 69 6e 74 65 67 65 72 20 61 74 20 6f  yte integer at o
e9d0: 66 66 73 65 74 20 35 20 64 65 73 69 67 6e 61 74  ffset 5 designat
e9e0: 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74  es.    ** the st
e9f0: 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  art of the cell 
ea00: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 41 20  content area. A 
ea10: 7a 65 72 6f 20 76 61 6c 75 65 20 66 6f 72 20 74  zero value for t
ea20: 68 69 73 20 69 6e 74 65 67 65 72 20 69 73 0a 20  his integer is. 
ea30: 20 20 20 2a 2a 20 69 6e 74 65 72 70 72 65 74 65     ** interprete
ea40: 64 20 61 73 20 36 35 35 33 36 2e 20 2a 2f 0a 20  d as 65536. */. 
ea50: 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
ea60: 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68  eNotZero(&data[h
ea70: 64 72 2b 35 5d 29 3b 0a 20 20 20 20 2f 2a 20 45  dr+5]);.    /* E
ea80: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37  VIDENCE-OF: R-37
ea90: 30 30 32 2d 33 32 37 37 34 20 54 68 65 20 74 77  002-32774 The tw
eaa0: 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 61  o-byte integer a
eab0: 74 20 6f 66 66 73 65 74 20 33 20 67 69 76 65 73  t offset 3 gives
eac0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62   the.    ** numb
ead0: 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74  er of cells on t
eae0: 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  he page. */.    
eaf0: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67  pPage->nCell = g
eb00: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
eb10: 72 2b 33 5d 29 3b 0a 20 20 20 20 69 66 28 20 70  r+3]);.    if( p
eb20: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43  Page->nCell>MX_C
eb30: 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ELL(pBt) ){.    
eb40: 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c    /* To many cel
eb50: 6c 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  ls for a single 
eb60: 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20  page.  The page 
eb70: 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 20  must be corrupt 
eb80: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
eb90: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
eba0: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74  KPT;.    }.    t
ebb0: 65 73 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e  estcase( pPage->
ebc0: 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70  nCell==MX_CELL(p
ebd0: 42 74 29 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56  Bt) );.    /* EV
ebe0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 30  IDENCE-OF: R-240
ebf0: 38 39 2d 35 37 39 37 39 20 49 66 20 61 20 70 61  89-57979 If a pa
ec00: 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63  ge contains no c
ec10: 65 6c 6c 73 20 28 77 68 69 63 68 20 69 73 20 6f  ells (which is o
ec20: 6e 6c 79 0a 20 20 20 20 2a 2a 20 70 6f 73 73 69  nly.    ** possi
ec30: 62 6c 65 20 66 6f 72 20 61 20 72 6f 6f 74 20 70  ble for a root p
ec40: 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20 74  age of a table t
ec50: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  hat contains no 
ec60: 72 6f 77 73 29 20 74 68 65 6e 20 74 68 65 0a 20  rows) then the. 
ec70: 20 20 20 2a 2a 20 6f 66 66 73 65 74 20 74 6f 20     ** offset to 
ec80: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
ec90: 20 61 72 65 61 20 77 69 6c 6c 20 65 71 75 61 6c   area will equal
eca0: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d   the page size m
ecb0: 69 6e 75 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  inus the.    ** 
ecc0: 62 79 74 65 73 20 6f 66 20 72 65 73 65 72 76 65  bytes of reserve
ecd0: 64 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20  d space. */.    
ece0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
ecf0: 43 65 6c 6c 3e 30 20 7c 7c 20 74 6f 70 3d 3d 75  Cell>0 || top==u
ed00: 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20 43 4f 52  sableSize || COR
ed10: 52 55 50 54 5f 44 42 20 29 3b 0a 0a 20 20 20 20  RUPT_DB );..    
ed20: 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20 64  /* A malformed d
ed30: 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 69 67  atabase page mig
ed40: 68 74 20 63 61 75 73 65 20 75 73 20 74 6f 20 72  ht cause us to r
ed50: 65 61 64 20 70 61 73 74 20 74 68 65 20 65 6e 64  ead past the end
ed60: 0a 20 20 20 20 2a 2a 20 6f 66 20 70 61 67 65 20  .    ** of page 
ed70: 77 68 65 6e 20 70 61 72 73 69 6e 67 20 61 20 63  when parsing a c
ed80: 65 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20  ell.  .    **.  
ed90: 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    ** The followi
eda0: 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65  ng block of code
edb0: 20 63 68 65 63 6b 73 20 65 61 72 6c 79 20 74 6f   checks early to
edc0: 20 73 65 65 20 69 66 20 61 20 63 65 6c 6c 20 65   see if a cell e
edd0: 78 74 65 6e 64 73 0a 20 20 20 20 2a 2a 20 70 61  xtends.    ** pa
ede0: 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  st the end of a 
edf0: 70 61 67 65 20 62 6f 75 6e 64 61 72 79 20 61 6e  page boundary an
ee00: 64 20 63 61 75 73 65 73 20 53 51 4c 49 54 45 5f  d causes SQLITE_
ee10: 43 4f 52 52 55 50 54 20 74 6f 20 62 65 20 0a 20  CORRUPT to be . 
ee20: 20 20 20 2a 2a 20 72 65 74 75 72 6e 65 64 20 69     ** returned i
ee30: 66 20 69 74 20 64 6f 65 73 2e 0a 20 20 20 20 2a  f it does..    *
ee40: 2f 0a 20 20 20 20 69 43 65 6c 6c 46 69 72 73 74  /.    iCellFirst
ee50: 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20   = cellOffset + 
ee60: 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  2*pPage->nCell;.
ee70: 20 20 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20      iCellLast = 
ee80: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a  usableSize - 4;.
ee90: 20 20 20 20 69 66 28 20 70 42 74 2d 3e 64 62 2d      if( pBt->db-
eea0: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
eeb0: 43 65 6c 6c 53 69 7a 65 43 6b 20 29 7b 0a 20 20  CellSizeCk ){.  
eec0: 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
eed0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
eee0: 6e 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69  nto the cell poi
eef0: 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20  nter array */.  
ef00: 20 20 20 20 69 6e 74 20 73 7a 3b 20 20 20 20 20      int sz;     
ef10: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
ef20: 20 61 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20   a cell */..    
ef30: 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
ef40: 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2d 2d  af ) iCellLast--
ef50: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
ef60: 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   i<pPage->nCell;
ef70: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
ef80: 63 20 3d 20 67 65 74 32 62 79 74 65 41 6c 69 67  c = get2byteAlig
ef90: 6e 65 64 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66  ned(&data[cellOf
efa0: 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20  fset+i*2]);.    
efb0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
efc0: 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a  ==iCellFirst );.
efd0: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
efe0: 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20  ( pc==iCellLast 
eff0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
f000: 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20  c<iCellFirst || 
f010: 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
f020: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
f030: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
f040: 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a  BKPT;.        }.
f050: 20 20 20 20 20 20 20 20 73 7a 20 3d 20 70 50 61          sz = pPa
f060: 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50  ge->xCellSize(pP
f070: 61 67 65 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b  age, &data[pc]);
f080: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
f090: 65 28 20 70 63 2b 73 7a 3d 3d 75 73 61 62 6c 65  e( pc+sz==usable
f0a0: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Size );.        
f0b0: 69 66 28 20 70 63 2b 73 7a 3e 75 73 61 62 6c 65  if( pc+sz>usable
f0c0: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
f0d0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f0e0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
f0f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
f100: 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
f110: 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61  ->leaf ) iCellLa
f120: 73 74 2b 2b 3b 0a 20 20 20 20 7d 20 20 0a 0a 20  st++;.    }  .. 
f130: 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68     /* Compute th
f140: 65 20 74 6f 74 61 6c 20 66 72 65 65 20 73 70 61  e total free spa
f150: 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 20  ce on the page. 
f160: 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f     ** EVIDENCE-O
f170: 46 3a 20 52 2d 32 33 35 38 38 2d 33 34 34 35 30  F: R-23588-34450
f180: 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e   The two-byte in
f190: 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20  teger at offset 
f1a0: 31 20 67 69 76 65 73 20 74 68 65 0a 20 20 20 20  1 gives the.    
f1b0: 2a 2a 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  ** start of the 
f1c0: 66 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20  first freeblock 
f1d0: 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 6f 72 20  on the page, or 
f1e0: 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65 72 65  is zero if there
f1f0: 20 61 72 65 20 6e 6f 0a 20 20 20 20 2a 2a 20 66   are no.    ** f
f200: 72 65 65 62 6c 6f 63 6b 73 2e 20 2a 2f 0a 20 20  reeblocks. */.  
f210: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
f220: 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20  &data[hdr+1]);. 
f230: 20 20 20 6e 46 72 65 65 20 3d 20 64 61 74 61 5b     nFree = data[
f240: 68 64 72 2b 37 5d 20 2b 20 74 6f 70 3b 20 20 2f  hdr+7] + top;  /
f250: 2a 20 49 6e 69 74 20 6e 46 72 65 65 20 74 6f 20  * Init nFree to 
f260: 6e 6f 6e 2d 66 72 65 65 62 6c 6f 63 6b 20 66 72  non-freeblock fr
f270: 65 65 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20  ee space */.    
f280: 77 68 69 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20  while( pc>0 ){. 
f290: 20 20 20 20 20 75 31 36 20 6e 65 78 74 2c 20 73       u16 next, s
f2a0: 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ize;.      if( p
f2b0: 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20  c<iCellFirst || 
f2c0: 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
f2d0: 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45          /* EVIDE
f2e0: 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35 33 30 2d  NCE-OF: R-55530-
f2f0: 35 32 39 33 30 20 49 6e 20 61 20 77 65 6c 6c 2d  52930 In a well-
f300: 66 6f 72 6d 65 64 20 62 2d 74 72 65 65 20 70 61  formed b-tree pa
f310: 67 65 2c 20 74 68 65 72 65 20 77 69 6c 6c 0a 20  ge, there will. 
f320: 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73         ** always
f330: 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   be at least one
f340: 20 63 65 6c 6c 20 62 65 66 6f 72 65 20 74 68 65   cell before the
f350: 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b   first freeblock
f360: 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
f370: 20 20 20 20 20 2a 2a 20 4f 72 2c 20 74 68 65 20       ** Or, the 
f380: 66 72 65 65 62 6c 6f 63 6b 20 69 73 20 6f 66 66  freeblock is off
f390: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
f3a0: 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a  page.        */.
f3b0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
f3c0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
f3d0: 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20  PT; .      }.   
f3e0: 20 20 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79     next = get2by
f3f0: 74 65 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20  te(&data[pc]);. 
f400: 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32       size = get2
f410: 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d  byte(&data[pc+2]
f420: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6e 65  );.      if( (ne
f430: 78 74 3e 30 20 26 26 20 6e 65 78 74 3c 3d 70 63  xt>0 && next<=pc
f440: 2b 73 69 7a 65 2b 33 29 20 7c 7c 20 70 63 2b 73  +size+3) || pc+s
f450: 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  ize>usableSize )
f460: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65  {.        /* Fre
f470: 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65  e blocks must be
f480: 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
f490: 64 65 72 2e 20 41 6e 64 20 74 68 65 20 6c 61 73  der. And the las
f4a0: 74 20 62 79 74 65 20 6f 66 0a 20 20 20 20 20 20  t byte of.      
f4b0: 20 20 2a 2a 20 74 68 65 20 66 72 65 65 2d 62 6c    ** the free-bl
f4c0: 6f 63 6b 20 6d 75 73 74 20 6c 69 65 20 6f 6e 20  ock must lie on 
f4d0: 74 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67  the database pag
f4e0: 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  e.  */.        r
f4f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
f500: 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20  RUPT_BKPT; .    
f510: 20 20 7d 0a 20 20 20 20 20 20 6e 46 72 65 65 20    }.      nFree 
f520: 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a 65 3b 0a  = nFree + size;.
f530: 20 20 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b        pc = next;
f540: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
f550: 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6e 46  t this point, nF
f560: 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ree contains the
f570: 20 73 75 6d 20 6f 66 20 74 68 65 20 6f 66 66 73   sum of the offs
f580: 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a  et to the start.
f590: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 65      ** of the ce
f5a0: 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll-content area 
f5b0: 70 6c 75 73 20 74 68 65 20 6e 75 6d 62 65 72 20  plus the number 
f5c0: 6f 66 20 66 72 65 65 20 62 79 74 65 73 20 77 69  of free bytes wi
f5d0: 74 68 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  thin.    ** the 
f5e0: 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65  cell-content are
f5f0: 61 2e 20 49 66 20 74 68 69 73 20 69 73 20 67 72  a. If this is gr
f600: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 75  eater than the u
f610: 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20 20 20 2a  sable-size.    *
f620: 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2c 20 74  * of the page, t
f630: 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 75 73  hen the page mus
f640: 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20  t be corrupted. 
f650: 54 68 69 73 20 63 68 65 63 6b 20 61 6c 73 6f 0a  This check also.
f660: 20 20 20 20 2a 2a 20 73 65 72 76 65 73 20 74 6f      ** serves to
f670: 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
f680: 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73   offset to the s
f690: 74 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  tart of the cell
f6a0: 2d 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20  -content.    ** 
f6b0: 61 72 65 61 2c 20 61 63 63 6f 72 64 69 6e 67 20  area, according 
f6c0: 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64  to the page head
f6d0: 65 72 2c 20 6c 69 65 73 20 77 69 74 68 69 6e 20  er, lies within 
f6e0: 74 68 65 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  the page..    */
f6f0: 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 3e 75  .    if( nFree>u
f700: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
f710: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
f720: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
f730: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d      }.    pPage-
f740: 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28 6e  >nFree = (u16)(n
f750: 46 72 65 65 20 2d 20 69 43 65 6c 6c 46 69 72 73  Free - iCellFirs
f760: 74 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69  t);.    pPage->i
f770: 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 20  sInit = 1;.  }. 
f780: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
f790: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  K;.}../*.** Set 
f7a0: 75 70 20 61 20 72 61 77 20 70 61 67 65 20 73 6f  up a raw page so
f7b0: 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c   that it looks l
f7c0: 69 6b 65 20 61 20 64 61 74 61 62 61 73 65 20 70  ike a database p
f7d0: 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e  age holding.** n
f7e0: 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74  o entries..*/.st
f7f0: 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61  atic void zeroPa
f800: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
f810: 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  e, int flags){. 
f820: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
f830: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
f840: 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20  ata;.  BtShared 
f850: 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
f860: 74 3b 0a 20 20 75 38 20 68 64 72 20 3d 20 70 50  t;.  u8 hdr = pP
f870: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
f880: 20 20 75 31 36 20 66 69 72 73 74 3b 0a 0a 20 20    u16 first;..  
f890: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
f8a0: 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70  agerPagenumber(p
f8b0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d  Page->pDbPage)==
f8c0: 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20  pPage->pgno );. 
f8d0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
f8e0: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
f8f0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d  age->pDbPage) ==
f900: 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b   (void*)pPage );
f910: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
f920: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
f930: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d  Page->pDbPage) =
f940: 3d 20 64 61 74 61 20 29 3b 0a 20 20 61 73 73 65  = data );.  asse
f950: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
f960: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
f970: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
f980: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
f990: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
f9a0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
f9b0: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
f9c0: 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
f9d0: 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  TE ){.    memset
f9e0: 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20  (&data[hdr], 0, 
f9f0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
fa00: 2d 20 68 64 72 29 3b 0a 20 20 7d 0a 20 20 64 61  - hdr);.  }.  da
fa10: 74 61 5b 68 64 72 5d 20 3d 20 28 63 68 61 72 29  ta[hdr] = (char)
fa20: 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20 3d  flags;.  first =
fa30: 20 68 64 72 20 2b 20 28 28 66 6c 61 67 73 26 50   hdr + ((flags&P
fa40: 54 46 5f 4c 45 41 46 29 3d 3d 30 20 3f 20 31 32  TF_LEAF)==0 ? 12
fa50: 20 3a 20 38 29 3b 0a 20 20 6d 65 6d 73 65 74 28   : 8);.  memset(
fa60: 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c  &data[hdr+1], 0,
fa70: 20 34 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b   4);.  data[hdr+
fa80: 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32 62 79  7] = 0;.  put2by
fa90: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
faa0: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
fab0: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
fac0: 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75  e = (u16)(pBt->u
fad0: 73 61 62 6c 65 53 69 7a 65 20 2d 20 66 69 72 73  sableSize - firs
fae0: 74 29 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67  t);.  decodeFlag
faf0: 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b  s(pPage, flags);
fb00: 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  .  pPage->cellOf
fb10: 66 73 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20  fset = first;.  
fb20: 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
fb30: 3d 20 26 64 61 74 61 5b 70 42 74 2d 3e 75 73 61  = &data[pBt->usa
fb40: 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67  bleSize];.  pPag
fb50: 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64  e->aCellIdx = &d
fb60: 61 74 61 5b 66 69 72 73 74 5d 3b 0a 20 20 70 50  ata[first];.  pP
fb70: 61 67 65 2d 3e 61 44 61 74 61 4f 66 73 74 20 3d  age->aDataOfst =
fb80: 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 68   &data[pPage->ch
fb90: 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 70  ildPtrSize];.  p
fba0: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
fbb0: 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
fbc0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31  Bt->pageSize>=51
fbd0: 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69  2 && pBt->pageSi
fbe0: 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 70  ze<=65536 );.  p
fbf0: 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d  Page->maskPage =
fc00: 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65   (u16)(pBt->page
fc10: 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50 61  Size - 1);.  pPa
fc20: 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20  ge->nCell = 0;. 
fc30: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
fc40: 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f   1;.}.../*.** Co
fc50: 6e 76 65 72 74 20 61 20 44 62 50 61 67 65 20 6f  nvert a DbPage o
fc60: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 74 68 65  btained from the
fc70: 20 70 61 67 65 72 20 69 6e 74 6f 20 61 20 4d 65   pager into a Me
fc80: 6d 50 61 67 65 20 75 73 65 64 20 62 79 0a 2a 2a  mPage used by.**
fc90: 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72   the btree layer
fca0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50  ..*/.static MemP
fcb0: 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 46 72  age *btreePageFr
fcc0: 6f 6d 44 62 50 61 67 65 28 44 62 50 61 67 65 20  omDbPage(DbPage 
fcd0: 2a 70 44 62 50 61 67 65 2c 20 50 67 6e 6f 20 70  *pDbPage, Pgno p
fce0: 67 6e 6f 2c 20 42 74 53 68 61 72 65 64 20 2a 70  gno, BtShared *p
fcf0: 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Bt){.  MemPage *
fd00: 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65  pPage = (MemPage
fd10: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
fd20: 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29 3b  tExtra(pDbPage);
fd30: 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  .  pPage->aData 
fd40: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
fd50: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
fd60: 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65    pPage->pDbPage
fd70: 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 70 50   = pDbPage;.  pP
fd80: 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a  age->pBt = pBt;.
fd90: 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20    pPage->pgno = 
fda0: 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 68  pgno;.  pPage->h
fdb0: 64 72 4f 66 66 73 65 74 20 3d 20 70 67 6e 6f 3d  drOffset = pgno=
fdc0: 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20  =1 ? 100 : 0;.  
fdd0: 72 65 74 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d  return pPage; .}
fde0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61  ../*.** Get a pa
fdf0: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
fe00: 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  r.  Initialize t
fe10: 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61  he MemPage.pBt a
fe20: 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44  nd.** MemPage.aD
fe30: 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20  ata elements if 
fe40: 6e 65 65 64 65 64 2e 20 20 53 65 65 20 61 6c 73  needed.  See als
fe50: 6f 3a 20 62 74 72 65 65 47 65 74 55 6e 75 73 65  o: btreeGetUnuse
fe60: 64 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  dPage()..**.** I
fe70: 66 20 74 68 65 20 50 41 47 45 52 5f 47 45 54 5f  f the PAGER_GET_
fe80: 4e 4f 43 4f 4e 54 45 4e 54 20 66 6c 61 67 20 69  NOCONTENT flag i
fe90: 73 20 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20  s set, it means 
fea0: 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63  that we do not c
feb0: 61 72 65 0a 2a 2a 20 61 62 6f 75 74 20 74 68 65  are.** about the
fec0: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
fed0: 70 61 67 65 20 61 74 20 74 68 69 73 20 74 69 6d  page at this tim
fee0: 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f  e.  So do not go
fef0: 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20   to the disk.** 
ff00: 74 6f 20 66 65 74 63 68 20 74 68 65 20 63 6f 6e  to fetch the con
ff10: 74 65 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c  tent.  Just fill
ff20: 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   in the content 
ff30: 77 69 74 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e  with zeros for n
ff40: 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65  ow..** If in the
ff50: 20 66 75 74 75 72 65 20 77 65 20 63 61 6c 6c 20   future we call 
ff60: 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
ff70: 65 28 29 20 6f 6e 20 74 68 69 73 20 70 61 67 65  e() on this page
ff80: 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20  , that.** means 
ff90: 77 65 20 68 61 76 65 20 73 74 61 72 74 65 64 20  we have started 
ffa0: 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65 64 20  to be concerned 
ffb0: 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e  about content an
ffc0: 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65  d the disk.** re
ffd0: 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20  ad should occur 
ffe0: 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a  at that point..*
fff0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
10000 65 65 47 65 74 50 61 67 65 28 0a 20 20 42 74 53  eeGetPage(.  BtS
10010 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
10020 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
10030 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
10040 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
10050 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  er of the page t
10060 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d  o fetch */.  Mem
10070 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
10080 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
10090 70 61 67 65 20 69 6e 20 74 68 69 73 20 70 61 72  page in this par
100a0 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ameter */.  int 
100b0 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
100c0 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f   /* PAGER_GET_NO
100d0 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47 45 52  CONTENT or PAGER
100e0 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f  _GET_READONLY */
100f0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
10100 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
10110 0a 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67  ..  assert( flag
10120 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 50  s==0 || flags==P
10130 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
10140 4e 54 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47  NT || flags==PAG
10150 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
10160 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
10170 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
10180 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
10190 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
101a0 65 72 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70  erAcquire(pBt->p
101b0 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62  Pager, pgno, (Db
101c0 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c  Page**)&pDbPage,
101d0 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72   flags);.  if( r
101e0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
101f0 20 2a 70 70 50 61 67 65 20 3d 20 62 74 72 65 65   *ppPage = btree
10200 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70  PageFromDbPage(p
10210 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42  DbPage, pgno, pB
10220 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  t);.  return SQL
10230 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
10240 20 52 65 74 72 69 65 76 65 20 61 20 70 61 67 65   Retrieve a page
10250 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
10260 63 61 63 68 65 2e 20 49 66 20 74 68 65 20 72 65  cache. If the re
10270 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
10280 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69  not.** already i
10290 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
102a0 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49  e return NULL. I
102b0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65  nitialize the Me
102c0 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a  mPage.pBt and.**
102d0 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65   MemPage.aData e
102e0 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65  lements if neede
102f0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d  d..*/.static Mem
10300 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 4c  Page *btreePageL
10310 6f 6f 6b 75 70 28 42 74 53 68 61 72 65 64 20 2a  ookup(BtShared *
10320 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  pBt, Pgno pgno){
10330 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
10340 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  ge;.  assert( sq
10350 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
10360 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
10370 20 20 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69    pDbPage = sqli
10380 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70  te3PagerLookup(p
10390 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f  Bt->pPager, pgno
103a0 29 3b 0a 20 20 69 66 28 20 70 44 62 50 61 67 65  );.  if( pDbPage
103b0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62   ){.    return b
103c0 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61  treePageFromDbPa
103d0 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f  ge(pDbPage, pgno
103e0 2c 20 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65  , pBt);.  }.  re
103f0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
10400 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   Return the size
10410 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
10420 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 2e 20   file in pages. 
10430 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20  If there is any 
10440 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72  kind of.** error
10450 2c 20 72 65 74 75 72 6e 20 28 28 75 6e 73 69 67  , return ((unsig
10460 6e 65 64 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a  ned int)-1)..*/.
10470 73 74 61 74 69 63 20 50 67 6e 6f 20 62 74 72 65  static Pgno btre
10480 65 50 61 67 65 63 6f 75 6e 74 28 42 74 53 68 61  ePagecount(BtSha
10490 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 72 65 74  red *pBt){.  ret
104a0 75 72 6e 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a  urn pBt->nPage;.
104b0 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 42 74 72  }.u32 sqlite3Btr
104c0 65 65 4c 61 73 74 50 61 67 65 28 42 74 72 65 65  eeLastPage(Btree
104d0 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
104e0 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
104f0 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
10500 73 73 65 72 74 28 20 28 28 70 2d 3e 70 42 74 2d  ssert( ((p->pBt-
10510 3e 6e 50 61 67 65 29 26 30 78 38 30 30 30 30 30  >nPage)&0x800000
10520 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  0)==0 );.  retur
10530 6e 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  n btreePagecount
10540 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a  (p->pBt);.}../*.
10550 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72  ** Get a page fr
10560 6f 6d 20 74 68 65 20 70 61 67 65 72 20 61 6e 64  om the pager and
10570 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 0a   initialize it..
10580 2a 2a 0a 2a 2a 20 49 66 20 70 43 75 72 21 3d 30  **.** If pCur!=0
10590 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 69   then the page i
105a0 73 20 62 65 69 6e 67 20 66 65 74 63 68 65 64 20  s being fetched 
105b0 61 73 20 70 61 72 74 20 6f 66 20 61 20 6d 6f 76  as part of a mov
105c0 65 54 6f 43 68 69 6c 64 28 29 0a 2a 2a 20 63 61  eToChild().** ca
105d0 6c 6c 2e 20 20 44 6f 20 61 64 64 69 74 69 6f 6e  ll.  Do addition
105e0 61 6c 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  al sanity checki
105f0 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 20 69  ng on the page i
10600 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 20  n this case..** 
10610 41 6e 64 20 69 66 20 74 68 65 20 66 65 74 63 68  And if the fetch
10620 20 66 61 69 6c 73 2c 20 74 68 69 73 20 72 6f 75   fails, this rou
10630 74 69 6e 65 20 6d 75 73 74 20 64 65 63 72 65 6d  tine must decrem
10640 65 6e 74 20 70 43 75 72 2d 3e 69 50 61 67 65 2e  ent pCur->iPage.
10650 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
10660 69 73 20 66 65 74 63 68 65 64 20 61 73 20 72 65  is fetched as re
10670 61 64 2d 77 72 69 74 65 20 75 6e 6c 65 73 73 20  ad-write unless 
10680 70 43 75 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  pCur is not NULL
10690 20 61 6e 64 20 69 73 0a 2a 2a 20 61 20 72 65 61   and is.** a rea
106a0 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2e 0a 2a  d-only cursor..*
106b0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
106c0 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 2a 70   occurs, then *p
106d0 70 50 61 67 65 20 69 73 20 75 6e 64 65 66 69 6e  pPage is undefin
106e0 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79 20 72 65  ed. It.** may re
106f0 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65 64 2c 20  main unchanged, 
10700 6f 72 20 69 74 20 6d 61 79 20 62 65 20 73 65 74  or it may be set
10710 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 76   to an invalid v
10720 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alue..*/.static 
10730 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74 50 61  int getAndInitPa
10740 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
10750 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  pBt,            
10760 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
10770 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
10780 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
10790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107a0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65  /* Number of the
107b0 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a   page to get */.
107c0 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
107d0 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ge,             
107e0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70    /* Write the p
107f0 61 67 65 20 70 6f 69 6e 74 65 72 20 68 65 72 65  age pointer here
10800 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a   */.  BtCursor *
10810 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20  pCur,           
10820 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
10830 74 6f 20 72 65 63 65 69 76 65 20 74 68 65 20 70  to receive the p
10840 61 67 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  age, or NULL */.
10850 20 20 69 6e 74 20 62 52 65 61 64 4f 6e 6c 79 20    int bReadOnly 
10860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10870 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20    /* True for a 
10880 72 65 61 64 2d 6f 6e 6c 79 20 70 61 67 65 20 2a  read-only page *
10890 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
108a0 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
108b0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
108c0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
108d0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
108e0 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d 30 20  assert( pCur==0 
108f0 7c 7c 20 70 70 50 61 67 65 3d 3d 26 70 43 75 72  || ppPage==&pCur
10900 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
10910 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72  Page] );.  asser
10920 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 62 52  t( pCur==0 || bR
10930 65 61 64 4f 6e 6c 79 3d 3d 70 43 75 72 2d 3e 63  eadOnly==pCur->c
10940 75 72 50 61 67 65 72 46 6c 61 67 73 20 29 3b 0a  urPagerFlags );.
10950 20 20 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d    assert( pCur==
10960 30 20 7c 7c 20 70 43 75 72 2d 3e 69 50 61 67 65  0 || pCur->iPage
10970 3e 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e  >0 );..  if( pgn
10980 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  o>btreePagecount
10990 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 63 20  (pBt) ){.    rc 
109a0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
109b0 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20  _BKPT;.    goto 
109c0 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65  getAndInitPage_e
109d0 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  rror;.  }.  rc =
109e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71   sqlite3PagerAcq
109f0 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67 65 72  uire(pBt->pPager
10a00 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a  , pgno, (DbPage*
10a10 2a 29 26 70 44 62 50 61 67 65 2c 20 62 52 65 61  *)&pDbPage, bRea
10a20 64 4f 6e 6c 79 29 3b 0a 20 20 69 66 28 20 72 63  dOnly);.  if( rc
10a30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74   ){.    goto get
10a40 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f  AndInitPage_erro
10a50 72 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65  r;.  }.  *ppPage
10a60 20 3d 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d   = btreePageFrom
10a70 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20  DbPage(pDbPage, 
10a80 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 69 66  pgno, pBt);.  if
10a90 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49  ( (*ppPage)->isI
10aa0 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  nit==0 ){.    rc
10ab0 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67 65   = btreeInitPage
10ac0 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 69  (*ppPage);.    i
10ad0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10ae0 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
10af0 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
10b00 20 20 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e        goto getAn
10b10 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b  dInitPage_error;
10b20 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
10b30 20 49 66 20 6f 62 74 61 69 6e 69 6e 67 20 61 20   If obtaining a 
10b40 63 68 69 6c 64 20 70 61 67 65 20 66 6f 72 20 61  child page for a
10b50 20 63 75 72 73 6f 72 2c 20 77 65 20 6d 75 73 74   cursor, we must
10b60 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
10b70 20 70 61 67 65 20 69 73 0a 20 20 2a 2a 20 63 6f   page is.  ** co
10b80 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68  mpatible with th
10b90 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 2a 2f 0a  e root page. */.
10ba0 20 20 69 66 28 20 70 43 75 72 0a 20 20 20 26 26    if( pCur.   &&
10bb0 20 28 28 2a 70 70 50 61 67 65 29 2d 3e 6e 43 65   ((*ppPage)->nCe
10bc0 6c 6c 3c 31 20 7c 7c 20 28 2a 70 70 50 61 67 65  ll<1 || (*ppPage
10bd0 29 2d 3e 69 6e 74 4b 65 79 21 3d 70 43 75 72 2d  )->intKey!=pCur-
10be0 3e 63 75 72 49 6e 74 4b 65 79 29 0a 20 20 29 7b  >curIntKey).  ){
10bf0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
10c00 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
10c10 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
10c20 70 70 50 61 67 65 29 3b 0a 20 20 20 20 67 6f 74  ppPage);.    got
10c30 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  o getAndInitPage
10c40 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 72 65  _error;.  }.  re
10c50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10c60 0a 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f  .getAndInitPage_
10c70 65 72 72 6f 72 3a 0a 20 20 69 66 28 20 70 43 75  error:.  if( pCu
10c80 72 20 29 20 70 43 75 72 2d 3e 69 50 61 67 65 2d  r ) pCur->iPage-
10c90 2d 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  -;.  testcase( p
10ca0 67 6e 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  gno==0 );.  asse
10cb0 72 74 28 20 70 67 6e 6f 21 3d 30 20 7c 7c 20 72  rt( pgno!=0 || r
10cc0 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  c==SQLITE_CORRUP
10cd0 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  T );.  return rc
10ce0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
10cf0 73 65 20 61 20 4d 65 6d 50 61 67 65 2e 20 20 54  se a MemPage.  T
10d00 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 63 61  his should be ca
10d10 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61  lled once for ea
10d20 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c  ch prior.** call
10d30 20 74 6f 20 62 74 72 65 65 47 65 74 50 61 67 65   to btreeGetPage
10d40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
10d50 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e   releasePageNotN
10d60 75 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ull(MemPage *pPa
10d70 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ge){.  assert( p
10d80 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20  Page->aData );. 
10d90 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
10da0 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  pBt );.  assert(
10db0 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 21   pPage->pDbPage!
10dc0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
10dd0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
10de0 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50  xtra(pPage->pDbP
10df0 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70  age) == (void*)p
10e00 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
10e10 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
10e20 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62  tData(pPage->pDb
10e30 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44  Page)==pPage->aD
10e40 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ata );.  assert(
10e50 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
10e60 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
10e70 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
10e80 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74  te3PagerUnrefNot
10e90 4e 75 6c 6c 28 70 50 61 67 65 2d 3e 70 44 62 50  Null(pPage->pDbP
10ea0 61 67 65 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  age);.}.static v
10eb0 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28  oid releasePage(
10ec0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
10ed0 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 20 72  .  if( pPage ) r
10ee0 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c  eleasePageNotNul
10ef0 6c 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a  l(pPage);.}../*.
10f00 2a 2a 20 47 65 74 20 61 6e 20 75 6e 75 73 65 64  ** Get an unused
10f10 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   page..**.** Thi
10f20 73 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b  s works just lik
10f30 65 20 62 74 72 65 65 47 65 74 50 61 67 65 28 29  e btreeGetPage()
10f40 20 77 69 74 68 20 74 68 65 20 61 64 64 69 74 69   with the additi
10f50 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 49  on:.**.**   *  I
10f60 66 20 74 68 65 20 70 61 67 65 20 69 73 20 61 6c  f the page is al
10f70 72 65 61 64 79 20 69 6e 20 75 73 65 20 66 6f 72  ready in use for
10f80 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70   some other purp
10f90 6f 73 65 2c 20 69 6d 6d 65 64 69 61 74 65 6c 79  ose, immediately
10fa0 0a 2a 2a 20 20 20 20 20 20 72 65 6c 65 61 73 65  .**      release
10fb0 20 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61   it and return a
10fc0 6e 20 53 51 4c 49 54 45 5f 43 55 52 52 55 50 54  n SQLITE_CURRUPT
10fd0 20 65 72 72 6f 72 2e 0a 2a 2a 20 20 20 2a 20 20   error..**   *  
10fe0 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 69 73  Make sure the is
10ff0 49 6e 69 74 20 66 6c 61 67 20 69 73 20 63 6c 65  Init flag is cle
11000 61 72 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ar.*/.static int
11010 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50   btreeGetUnusedP
11020 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
11030 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54  *pBt,       /* T
11040 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67  he btree */.  Pg
11050 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
11060 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
11070 74 68 65 20 70 61 67 65 20 74 6f 20 66 65 74 63  the page to fetc
11080 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  h */.  MemPage *
11090 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52  *ppPage,    /* R
110a0 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 69  eturn the page i
110b0 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74 65 72  n this parameter
110c0 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
110d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41             /* PA
110e0 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
110f0 54 20 6f 72 20 50 41 47 45 52 5f 47 45 54 5f 52  T or PAGER_GET_R
11100 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20  EADONLY */.){.  
11110 69 6e 74 20 72 63 20 3d 20 62 74 72 65 65 47 65  int rc = btreeGe
11120 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c  tPage(pBt, pgno,
11130 20 70 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b   ppPage, flags);
11140 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
11150 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
11160 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
11170 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67  Refcount((*ppPag
11180 65 29 2d 3e 70 44 62 50 61 67 65 29 3e 31 20 29  e)->pDbPage)>1 )
11190 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
111a0 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
111b0 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
111c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
111d0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
111e0 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 2a 70  T;.    }.    (*p
111f0 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d  pPage)->isInit =
11200 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
11210 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
11220 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
11230 0a 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20  .../*.** During 
11240 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e  a rollback, when
11250 20 74 68 65 20 70 61 67 65 72 20 72 65 6c 6f 61   the pager reloa
11260 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ds information i
11270 6e 74 6f 20 74 68 65 20 63 61 63 68 65 0a 2a 2a  nto the cache.**
11280 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 63   so that the cac
11290 68 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 74  he is restored t
112a0 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
112b0 74 61 74 65 20 61 74 20 74 68 65 20 73 74 61 72  tate at the star
112c0 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e  t of.** the tran
112d0 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63  saction, for eac
112e0 68 20 70 61 67 65 20 72 65 73 74 6f 72 65 64 20  h page restored 
112f0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
11300 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  called..**.** Th
11310 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73  is routine needs
11320 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 65 78   to reset the ex
11330 74 72 61 20 64 61 74 61 20 73 65 63 74 69 6f 6e  tra data section
11340 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
11350 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61 67  he.** page to ag
11360 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73  ree with the res
11370 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73  tored data..*/.s
11380 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 52  tatic void pageR
11390 65 69 6e 69 74 28 44 62 50 61 67 65 20 2a 70 44  einit(DbPage *pD
113a0 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  ata){.  MemPage 
113b0 2a 70 50 61 67 65 3b 0a 20 20 70 50 61 67 65 20  *pPage;.  pPage 
113c0 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c  = (MemPage *)sql
113d0 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
113e0 61 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65  a(pData);.  asse
113f0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
11400 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61  PageRefcount(pDa
11410 74 61 29 3e 30 20 29 3b 0a 20 20 69 66 28 20 70  ta)>0 );.  if( p
11420 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a  Page->isInit ){.
11430 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
11440 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
11450 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
11460 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) );.    pPage->
11470 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20  isInit = 0;.    
11480 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  if( sqlite3Pager
11490 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61  PageRefcount(pDa
114a0 74 61 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f  ta)>1 ){.      /
114b0 2a 20 70 50 61 67 65 20 6d 69 67 68 74 20 6e 6f  * pPage might no
114c0 74 20 62 65 20 61 20 62 74 72 65 65 20 70 61 67  t be a btree pag
114d0 65 3b 20 20 69 74 20 6d 69 67 68 74 20 62 65 20  e;  it might be 
114e0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
114f0 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 70 74 72  .      ** or ptr
11500 6d 61 70 20 70 61 67 65 20 6f 72 20 61 20 66 72  map page or a fr
11510 65 65 20 70 61 67 65 2e 20 20 49 6e 20 74 68 6f  ee page.  In tho
11520 73 65 20 63 61 73 65 73 2c 20 74 68 65 20 66 6f  se cases, the fo
11530 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a  llowing.      **
11540 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 49 6e   call to btreeIn
11550 69 74 50 61 67 65 28 29 20 77 69 6c 6c 20 6c 69  itPage() will li
11560 6b 65 6c 79 20 72 65 74 75 72 6e 20 53 51 4c 49  kely return SQLI
11570 54 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20 20  TE_CORRUPT..    
11580 20 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d    ** But no harm
11590 20 69 73 20 64 6f 6e 65 20 62 79 20 74 68 69 73   is done by this
115a0 2e 20 20 41 6e 64 20 69 74 20 69 73 20 76 65 72  .  And it is ver
115b0 79 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  y important that
115c0 0a 20 20 20 20 20 20 2a 2a 20 62 74 72 65 65 49  .      ** btreeI
115d0 6e 69 74 50 61 67 65 28 29 20 62 65 20 63 61 6c  nitPage() be cal
115e0 6c 65 64 20 6f 6e 20 65 76 65 72 79 20 62 74 72  led on every btr
115f0 65 65 20 70 61 67 65 20 73 6f 20 77 65 20 6d 61  ee page so we ma
11600 6b 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  ke.      ** the 
11610 63 61 6c 6c 20 66 6f 72 20 65 76 65 72 79 20 70  call for every p
11620 61 67 65 20 74 68 61 74 20 63 6f 6d 65 73 20 69  age that comes i
11630 6e 20 66 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67  n for re-initing
11640 2e 20 2a 2f 0a 20 20 20 20 20 20 62 74 72 65 65  . */.      btree
11650 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b  InitPage(pPage);
11660 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
11670 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 62  .** Invoke the b
11680 75 73 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20  usy handler for 
11690 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74  a btree..*/.stat
116a0 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e 76 6f  ic int btreeInvo
116b0 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f  keBusyHandler(vo
116c0 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 42 74 53  id *pArg){.  BtS
116d0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74  hared *pBt = (Bt
116e0 53 68 61 72 65 64 2a 29 70 41 72 67 3b 0a 20 20  Shared*)pArg;.  
116f0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 64 62 20  assert( pBt->db 
11700 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
11710 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
11720 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  pBt->db->mutex) 
11730 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
11740 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  te3InvokeBusyHan
11750 64 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62  dler(&pBt->db->b
11760 75 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a  usyHandler);.}..
11770 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74  /*.** Open a dat
11780 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a  abase file..** .
11790 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  ** zFilename is 
117a0 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
117b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
117c0 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
117d0 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 61 6e 20  NULL.** then an 
117e0 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61  ephemeral databa
117f0 73 65 20 69 73 20 63 72 65 61 74 65 64 2e 20 20  se is created.  
11800 54 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61  The ephemeral da
11810 74 61 62 61 73 65 20 6d 69 67 68 74 0a 2a 2a 20  tabase might.** 
11820 62 65 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69  be exclusively i
11830 6e 20 6d 65 6d 6f 72 79 2c 20 6f 72 20 69 74 20  n memory, or it 
11840 6d 69 67 68 74 20 75 73 65 20 61 20 64 69 73 6b  might use a disk
11850 2d 62 61 73 65 64 20 6d 65 6d 6f 72 79 20 63 61  -based memory ca
11860 63 68 65 2e 0a 2a 2a 20 45 69 74 68 65 72 20 77  che..** Either w
11870 61 79 2c 20 74 68 65 20 65 70 68 65 6d 65 72 61  ay, the ephemera
11880 6c 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20  l database will 
11890 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  be automatically
118a0 20 64 65 6c 65 74 65 64 20 0a 2a 2a 20 77 68 65   deleted .** whe
118b0 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  n sqlite3BtreeCl
118c0 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  ose() is called.
118d0 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e  .**.** If zFilen
118e0 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a  ame is ":memory:
118f0 22 20 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d  " then an in-mem
11900 6f 72 79 20 64 61 74 61 62 61 73 65 20 69 73 20  ory database is 
11910 63 72 65 61 74 65 64 0a 2a 2a 20 74 68 61 74 20  created.** that 
11920 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  is automatically
11930 20 64 65 73 74 72 6f 79 65 64 20 77 68 65 6e 20   destroyed when 
11940 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a  it is closed..**
11950 0a 2a 2a 20 54 68 65 20 22 66 6c 61 67 73 22 20  .** The "flags" 
11960 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62  parameter is a b
11970 69 74 6d 61 73 6b 20 74 68 61 74 20 6d 69 67 68  itmask that migh
11980 74 20 63 6f 6e 74 61 69 6e 20 62 69 74 73 20 6c  t contain bits l
11990 69 6b 65 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49  ike.** BTREE_OMI
119a0 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72  T_JOURNAL and/or
119b0 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59 2e 0a 2a   BTREE_MEMORY..*
119c0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
119d0 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 20  base is already 
119e0 6f 70 65 6e 65 64 20 69 6e 20 74 68 65 20 73 61  opened in the sa
119f0 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  me database conn
11a00 65 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65  ection.** and we
11a10 20 61 72 65 20 69 6e 20 73 68 61 72 65 64 20 63   are in shared c
11a20 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20  ache mode, then 
11a30 74 68 65 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61  the open will fa
11a40 69 6c 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51  il with an.** SQ
11a50 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
11a60 65 72 72 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f  error.  We canno
11a70 74 20 61 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d  t allow two or m
11a80 6f 72 65 20 42 74 53 68 61 72 65 64 0a 2a 2a 20  ore BtShared.** 
11a90 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20 73  objects in the s
11aa0 61 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ame database con
11ab0 6e 65 63 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f  nection since do
11ac0 69 6e 67 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64  ing so will lead
11ad0 0a 2a 2a 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20  .** to problems 
11ae0 77 69 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f  with locking..*/
11af0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
11b00 65 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  eOpen(.  sqlite3
11b10 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
11b20 20 2f 2a 20 56 46 53 20 74 6f 20 75 73 65 20 66   /* VFS to use f
11b30 6f 72 20 74 68 69 73 20 62 2d 74 72 65 65 20 2a  or this b-tree *
11b40 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
11b50 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e  zFilename,  /* N
11b60 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
11b70 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42  containing the B
11b80 54 72 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f  Tree database */
11b90 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
11ba0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73             /* As
11bb0 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73  sociated databas
11bc0 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74  e handle */.  Bt
11bd0 72 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20  ree **ppBtree,  
11be0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
11bf0 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62   to new Btree ob
11c00 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68 65 72  ject written her
11c10 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
11c20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
11c30 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  * Options */.  i
11c40 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20  nt vfsFlags     
11c50 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
11c60 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74  passed through t
11c70 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f  o sqlite3_vfs.xO
11c80 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 42 74  pen() */.){.  Bt
11c90 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 30 3b  Shared *pBt = 0;
11ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11cb0 53 68 61 72 65 64 20 70 61 72 74 20 6f 66 20 62  Shared part of b
11cc0 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a  tree structure *
11cd0 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20  /.  Btree *p;   
11ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cf0 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20     /* Handle to 
11d00 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69  return */.  sqli
11d10 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
11d20 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72  Open = 0;  /* Pr
11d30 65 76 65 6e 74 73 20 61 20 72 61 63 65 20 63 6f  events a race co
11d40 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20  ndition. Ticket 
11d50 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72  #3537 */.  int r
11d60 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
11d70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
11d80 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 74 68  ult code from th
11d90 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
11da0 20 75 38 20 6e 52 65 73 65 72 76 65 3b 20 20 20   u8 nReserve;   
11db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11dc0 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e 75 73 65  /* Byte of unuse
11dd0 64 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20  d space on each 
11de0 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  page */.  unsign
11df0 65 64 20 63 68 61 72 20 7a 44 62 48 65 61 64 65  ed char zDbHeade
11e00 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61  r[100];  /* Data
11e10 62 61 73 65 20 68 65 61 64 65 72 20 63 6f 6e 74  base header cont
11e20 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75  ent */..  /* Tru
11e30 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 61 6e 20  e if opening an 
11e40 65 70 68 65 6d 65 72 61 6c 2c 20 74 65 6d 70 6f  ephemeral, tempo
11e50 72 61 72 79 20 64 61 74 61 62 61 73 65 20 2a 2f  rary database */
11e60 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 54  .  const int isT
11e70 65 6d 70 44 62 20 3d 20 7a 46 69 6c 65 6e 61 6d  empDb = zFilenam
11e80 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d  e==0 || zFilenam
11e90 65 5b 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53  e[0]==0;..  /* S
11ea0 65 74 20 74 68 65 20 76 61 72 69 61 62 6c 65 20  et the variable 
11eb0 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20  isMemdb to true 
11ec0 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  for an in-memory
11ed0 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20   database, or . 
11ee0 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20   ** false for a 
11ef0 66 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62  file-based datab
11f00 61 73 65 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  ase..  */.#ifdef
11f10 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
11f20 4f 52 59 44 42 0a 20 20 63 6f 6e 73 74 20 69 6e  ORYDB.  const in
11f30 74 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 23  t isMemdb = 0;.#
11f40 65 6c 73 65 0a 20 20 63 6f 6e 73 74 20 69 6e 74  else.  const int
11f50 20 69 73 4d 65 6d 64 62 20 3d 20 28 7a 46 69 6c   isMemdb = (zFil
11f60 65 6e 61 6d 65 20 26 26 20 73 74 72 63 6d 70 28  ename && strcmp(
11f70 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d  zFilename, ":mem
11f80 6f 72 79 3a 22 29 3d 3d 30 29 0a 20 20 20 20 20  ory:")==0).     
11f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11fa0 20 20 7c 7c 20 28 69 73 54 65 6d 70 44 62 20 26    || (isTempDb &
11fb0 26 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d  & sqlite3TempInM
11fc0 65 6d 6f 72 79 28 64 62 29 29 0a 20 20 20 20 20  emory(db)).     
11fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11fe0 20 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 20 26    || (vfsFlags &
11ff0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d   SQLITE_OPEN_MEM
12000 4f 52 59 29 21 3d 30 3b 0a 23 65 6e 64 69 66 0a  ORY)!=0;.#endif.
12010 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
12020 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56   );.  assert( pV
12030 66 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  fs!=0 );.  asser
12040 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
12050 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
12060 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 66   );.  assert( (f
12070 6c 61 67 73 26 30 78 66 66 29 3d 3d 66 6c 61 67  lags&0xff)==flag
12080 73 20 29 3b 20 20 20 2f 2a 20 66 6c 61 67 73 20  s );   /* flags 
12090 66 69 74 20 69 6e 20 38 20 62 69 74 73 20 2a 2f  fit in 8 bits */
120a0 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61 20 42 54  ..  /* Only a BT
120b0 52 45 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62  REE_SINGLE datab
120c0 61 73 65 20 63 61 6e 20 62 65 20 42 54 52 45 45  ase can be BTREE
120d0 5f 55 4e 4f 52 44 45 52 45 44 20 2a 2f 0a 20 20  _UNORDERED */.  
120e0 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 20 26  assert( (flags &
120f0 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44   BTREE_UNORDERED
12100 29 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26  )==0 || (flags &
12110 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 29 21 3d   BTREE_SINGLE)!=
12120 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 42 54 52  0 );..  /* A BTR
12130 45 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61  EE_SINGLE databa
12140 73 65 20 69 73 20 61 6c 77 61 79 73 20 61 20 74  se is always a t
12150 65 6d 70 6f 72 61 72 79 20 61 6e 64 2f 6f 72 20  emporary and/or 
12160 65 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 61  ephemeral */.  a
12170 73 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20  ssert( (flags & 
12180 42 54 52 45 45 5f 53 49 4e 47 4c 45 29 3d 3d 30  BTREE_SINGLE)==0
12190 20 7c 7c 20 69 73 54 65 6d 70 44 62 20 29 3b 0a   || isTempDb );.
121a0 0a 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29  .  if( isMemdb )
121b0 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 42  {.    flags |= B
121c0 54 52 45 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d  TREE_MEMORY;.  }
121d0 0a 20 20 69 66 28 20 28 76 66 73 46 6c 61 67 73  .  if( (vfsFlags
121e0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d   & SQLITE_OPEN_M
121f0 41 49 4e 5f 44 42 29 21 3d 30 20 26 26 20 28 69  AIN_DB)!=0 && (i
12200 73 4d 65 6d 64 62 20 7c 7c 20 69 73 54 65 6d 70  sMemdb || isTemp
12210 44 62 29 20 29 7b 0a 20 20 20 20 76 66 73 46 6c  Db) ){.    vfsFl
12220 61 67 73 20 3d 20 28 76 66 73 46 6c 61 67 73 20  ags = (vfsFlags 
12230 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  & ~SQLITE_OPEN_M
12240 41 49 4e 5f 44 42 29 20 7c 20 53 51 4c 49 54 45  AIN_DB) | SQLITE
12250 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20  _OPEN_TEMP_DB;. 
12260 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33   }.  p = sqlite3
12270 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f  MallocZero(sizeo
12280 66 28 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28  f(Btree));.  if(
12290 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72   !p ){.    retur
122a0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
122b0 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73    }.  p->inTrans
122c0 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
122d0 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 23 69 66   p->db = db;.#if
122e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
122f0 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
12300 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 20 3d  p->lock.pBtree =
12310 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54   p;.  p->lock.iT
12320 61 62 6c 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66  able = 1;.#endif
12330 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
12340 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
12350 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66  D_CACHE) && !def
12360 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
12370 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20  _DISKIO).  /*.  
12380 2a 2a 20 49 66 20 74 68 69 73 20 42 74 72 65 65  ** If this Btree
12390 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   is a candidate 
123a0 66 6f 72 20 73 68 61 72 65 64 20 63 61 63 68 65  for shared cache
123b0 2c 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61 6e  , try to find an
123c0 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e 67 20 42  .  ** existing B
123d0 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74  tShared object t
123e0 68 61 74 20 77 65 20 63 61 6e 20 73 68 61 72 65  hat we can share
123f0 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28   with.  */.  if(
12400 20 69 73 54 65 6d 70 44 62 3d 3d 30 20 26 26 20   isTempDb==0 && 
12410 28 69 73 4d 65 6d 64 62 3d 3d 30 20 7c 7c 20 28  (isMemdb==0 || (
12420 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f  vfsFlags&SQLITE_
12430 4f 50 45 4e 5f 55 52 49 29 21 3d 30 29 20 29 7b  OPEN_URI)!=0) ){
12440 0a 20 20 20 20 69 66 28 20 76 66 73 46 6c 61 67  .    if( vfsFlag
12450 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
12460 53 48 41 52 45 44 43 41 43 48 45 20 29 7b 0a 20  SHAREDCACHE ){. 
12470 20 20 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61       int nFilena
12480 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
12490 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b  en30(zFilename)+
124a0 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 75  1;.      int nFu
124b0 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66  llPathname = pVf
124c0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
124d0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46 75  .      char *zFu
124e0 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c  llPathname = sql
124f0 69 74 65 33 4d 61 6c 6c 6f 63 28 4d 41 58 28 6e  ite3Malloc(MAX(n
12500 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 6e 46 69  FullPathname,nFi
12510 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  lename));.      
12520 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c  MUTEX_LOGIC( sql
12530 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
12540 78 53 68 61 72 65 64 3b 20 29 0a 0a 20 20 20 20  xShared; )..    
12550 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20    p->sharable = 
12560 31 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 46  1;.      if( !zF
12570 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  ullPathname ){. 
12580 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
12590 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ree(p);.        
125a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
125b0 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
125c0 20 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29     if( isMemdb )
125d0 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
125e0 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  (zFullPathname, 
125f0 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 69 6c 65  zFilename, nFile
12600 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  name);.      }el
12610 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
12620 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61   sqlite3OsFullPa
12630 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69  thname(pVfs, zFi
12640 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  lename,.        
12650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12660 20 20 20 20 20 20 20 20 20 20 20 6e 46 75 6c 6c             nFull
12670 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50  Pathname, zFullP
12680 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
12690 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
126a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
126b0 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
126c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
126d0 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
126e0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
126f0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
12700 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f     }.#if SQLITE_
12710 54 48 52 45 41 44 53 41 46 45 0a 20 20 20 20 20  THREADSAFE.     
12720 20 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c   mutexOpen = sql
12730 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
12740 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
12750 49 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20  IC_OPEN);.      
12760 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
12770 74 65 72 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a  ter(mutexOpen);.
12780 20 20 20 20 20 20 6d 75 74 65 78 53 68 61 72 65        mutexShare
12790 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  d = sqlite3Mutex
127a0 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
127b0 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
127c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
127d0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
127e0 65 78 53 68 61 72 65 64 29 3b 0a 23 65 6e 64 69  exShared);.#endi
127f0 66 0a 20 20 20 20 20 20 66 6f 72 28 70 42 74 3d  f.      for(pBt=
12800 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
12810 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
12820 63 68 65 4c 69 73 74 29 3b 20 70 42 74 3b 20 70  cheList); pBt; p
12830 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a  Bt=pBt->pNext){.
12840 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
12850 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  pBt->nRef>0 );. 
12860 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74         if( 0==st
12870 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61  rcmp(zFullPathna
12880 6d 65 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72  me, sqlite3Pager
12890 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50  Filename(pBt->pP
128a0 61 67 65 72 2c 20 30 29 29 0a 20 20 20 20 20 20  ager, 0)).      
128b0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71             && sq
128c0 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 70 42  lite3PagerVfs(pB
128d0 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56 66 73  t->pPager)==pVfs
128e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
128f0 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20  t iDb;.         
12900 20 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62   for(iDb=db->nDb
12910 2d 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d  -1; iDb>=0; iDb-
12920 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -){.            
12930 42 74 72 65 65 20 2a 70 45 78 69 73 74 69 6e 67  Btree *pExisting
12940 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
12950 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pBt;.           
12960 20 69 66 28 20 70 45 78 69 73 74 69 6e 67 20 26   if( pExisting &
12970 26 20 70 45 78 69 73 74 69 6e 67 2d 3e 70 42 74  & pExisting->pBt
12980 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ==pBt ){.       
12990 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
129a0 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
129b0 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 20  Shared);.       
129c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
129d0 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
129e0 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  Open);.         
129f0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
12a00 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
12a10 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
12a20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
12a30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
12a40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e  eturn SQLITE_CON
12a50 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20 20 20  STRAINT;.       
12a60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
12a70 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e   }.          p->
12a80 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20  pBt = pBt;.     
12a90 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b       pBt->nRef++
12aa0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
12ab0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
12ac0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
12ad0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
12ae0 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
12af0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
12b00 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
12b10 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
12b20 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 65 6c  ITE_DEBUG.    el
12b30 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20  se{.      /* In 
12b40 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d  debug mode, we m
12b50 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73 74 65  ark all persiste
12b60 6e 74 20 64 61 74 61 62 61 73 65 73 20 61 73 20  nt databases as 
12b70 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20 20 2a  sharable.      *
12b80 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65 79  * even when they
12b90 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69 73 20   are not.  This 
12ba0 65 78 65 72 63 69 73 65 73 20 74 68 65 20 6c 6f  exercises the lo
12bb0 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20  cking code and. 
12bc0 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f       ** gives mo
12bd0 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 66  re opportunity f
12be0 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c 69 74  or asserts(sqlit
12bf0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29 29  e3_mutex_held())
12c00 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  .      ** statem
12c10 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63  ents to find loc
12c20 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20  king problems.. 
12c30 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d       */.      p-
12c40 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20  >sharable = 1;. 
12c50 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
12c60 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74  #endif.  if( pBt
12c70 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20  ==0 ){.    /*.  
12c80 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    ** The followi
12c90 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b 65 20  ng asserts make 
12ca0 73 75 72 65 20 74 68 61 74 20 73 74 72 75 63 74  sure that struct
12cb0 75 72 65 73 20 75 73 65 64 20 62 79 20 74 68 65  ures used by the
12cc0 20 62 74 72 65 65 20 61 72 65 0a 20 20 20 20 2a   btree are.    *
12cd0 2a 20 74 68 65 20 72 69 67 68 74 20 73 69 7a 65  * the right size
12ce0 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20 67 75  .  This is to gu
12cf0 61 72 64 20 61 67 61 69 6e 73 74 20 73 69 7a 65  ard against size
12d00 20 63 68 61 6e 67 65 73 20 74 68 61 74 20 72 65   changes that re
12d10 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e  sult.    ** when
12d20 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20   compiling on a 
12d30 64 69 66 66 65 72 65 6e 74 20 61 72 63 68 69 74  different archit
12d40 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  ecture..    */. 
12d50 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
12d60 66 28 69 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20  f(i64)==8 );.   
12d70 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
12d80 75 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20 20 61  u64)==8 );.    a
12d90 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 33  ssert( sizeof(u3
12da0 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73  2)==4 );.    ass
12db0 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36 29  ert( sizeof(u16)
12dc0 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==2 );.    asser
12dd0 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d  t( sizeof(Pgno)=
12de0 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42 74  =4 );.  .    pBt
12df0 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
12e00 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42  Zero( sizeof(*pB
12e10 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42  t) );.    if( pB
12e20 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  t==0 ){.      rc
12e30 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
12e40 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65  .      goto btre
12e50 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
12e60 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
12e70 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56 66 73  e3PagerOpen(pVfs
12e80 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  , &pBt->pPager, 
12e90 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20  zFilename,.     
12ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12eb0 20 20 20 20 20 45 58 54 52 41 5f 53 49 5a 45 2c       EXTRA_SIZE,
12ec0 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61 67 73   flags, vfsFlags
12ed0 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b 0a 20  , pageReinit);. 
12ee0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
12ef0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
12f00 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61  lite3PagerSetMma
12f10 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50 61 67  pLimit(pBt->pPag
12f20 65 72 2c 20 64 62 2d 3e 73 7a 4d 6d 61 70 29 3b  er, db->szMmap);
12f30 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
12f40 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65  te3PagerReadFile
12f50 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67  header(pBt->pPag
12f60 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61  er,sizeof(zDbHea
12f70 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b  der),zDbHeader);
12f80 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
12f90 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
12fa0 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
12fb0 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d  _open_out;.    }
12fc0 0a 20 20 20 20 70 42 74 2d 3e 6f 70 65 6e 46 6c  .    pBt->openFl
12fd0 61 67 73 20 3d 20 28 75 38 29 66 6c 61 67 73 3b  ags = (u8)flags;
12fe0 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20 64  .    pBt->db = d
12ff0 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  b;.    sqlite3Pa
13000 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
13010 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 62  r(pBt->pPager, b
13020 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61  treeInvokeBusyHa
13030 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20 20  ndler, pBt);.   
13040 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20   p->pBt = pBt;. 
13050 20 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73   .    pBt->pCurs
13060 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  or = 0;.    pBt-
13070 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20  >pPage1 = 0;.   
13080 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
13090 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d  rIsreadonly(pBt-
130a0 3e 70 50 61 67 65 72 29 20 29 20 70 42 74 2d 3e  >pPager) ) pBt->
130b0 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
130c0 52 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69 66 64 65  READ_ONLY;.#ifde
130d0 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f  f SQLITE_SECURE_
130e0 44 45 4c 45 54 45 0a 20 20 20 20 70 42 74 2d 3e  DELETE.    pBt->
130f0 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
13100 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 23  SECURE_DELETE;.#
13110 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 45 56 49  endif.    /* EVI
13120 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37  DENCE-OF: R-5187
13130 33 2d 33 39 36 31 38 20 54 68 65 20 70 61 67 65  3-39618 The page
13140 20 73 69 7a 65 20 66 6f 72 20 61 20 64 61 74 61   size for a data
13150 62 61 73 65 20 66 69 6c 65 20 69 73 0a 20 20 20  base file is.   
13160 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62   ** determined b
13170 79 20 74 68 65 20 32 2d 62 79 74 65 20 69 6e 74  y the 2-byte int
13180 65 67 65 72 20 6c 6f 63 61 74 65 64 20 61 74 20  eger located at 
13190 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 31 36 20  an offset of 16 
131a0 62 79 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a  bytes from.    *
131b0 2a 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  * the beginning 
131c0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
131d0 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 42 74  file. */.    pBt
131e0 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 7a 44  ->pageSize = (zD
131f0 62 48 65 61 64 65 72 5b 31 36 5d 3c 3c 38 29 20  bHeader[16]<<8) 
13200 7c 20 28 7a 44 62 48 65 61 64 65 72 5b 31 37 5d  | (zDbHeader[17]
13210 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66 28 20 70  <<16);.    if( p
13220 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31 32  Bt->pageSize<512
13230 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   || pBt->pageSiz
13240 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  e>SQLITE_MAX_PAG
13250 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20  E_SIZE.         
13260 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69  || ((pBt->pageSi
13270 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67 65 53  ze-1)&pBt->pageS
13280 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ize)!=0 ){.     
13290 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
132a0 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
132b0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
132c0 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  UM.      /* If t
132d0 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a  he magic name ":
132e0 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72  memory:" will cr
132f0 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  eate an in-memor
13300 79 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  y database, then
13310 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61 76 65 20  .      ** leave 
13320 74 68 65 20 61 75 74 6f 56 61 63 75 75 6d 20 6d  the autoVacuum m
13330 6f 64 65 20 61 74 20 30 20 28 64 6f 20 6e 6f 74  ode at 0 (do not
13340 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65   auto-vacuum), e
13350 76 65 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a 20  ven if.      ** 
13360 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
13370 55 54 4f 56 41 43 55 55 4d 20 69 73 20 74 72 75  UTOVACUUM is tru
13380 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  e. On the other 
13390 68 61 6e 64 2c 20 69 66 0a 20 20 20 20 20 20 2a  hand, if.      *
133a0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  * SQLITE_OMIT_ME
133b0 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65 6e 20  MORYDB has been 
133c0 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a  defined, then ":
133d0 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73 74  memory:" is just
133e0 20 61 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 75   a.      ** regu
133f0 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49  lar file-name. I
13400 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
13410 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c  auto-vacuum appl
13420 69 65 73 20 61 73 20 70 65 72 20 6e 6f 72 6d 61  ies as per norma
13430 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  l..      */.    
13440 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
13450 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20  && !isMemdb ){. 
13460 20 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f         pBt->auto
13470 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45  Vacuum = (SQLITE
13480 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
13490 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20  UUM ? 1 : 0);.  
134a0 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56        pBt->incrV
134b0 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f  acuum = (SQLITE_
134c0 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
134d0 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a  UM==2 ? 1 : 0);.
134e0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
134f0 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20       nReserve = 
13500 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
13510 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
13520 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34 32 34 31  OF: R-37497-4241
13530 32 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  2 The size of th
13540 65 20 72 65 73 65 72 76 65 64 20 72 65 67 69 6f  e reserved regio
13550 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 65  n is.      ** de
13560 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
13570 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69 67 6e 65  one-byte unsigne
13580 64 20 69 6e 74 65 67 65 72 20 66 6f 75 6e 64 20  d integer found 
13590 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20  at an offset of 
135a0 32 30 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f  20.      ** into
135b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
135c0 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20  le header. */.  
135d0 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 7a      nReserve = z
135e0 44 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20  DbHeader[20];.  
135f0 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
13600 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a  s |= BTS_PAGESIZ
13610 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65 66  E_FIXED;.#ifndef
13620 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
13630 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 70 42  OVACUUM.      pB
13640 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
13650 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65  (get4byte(&zDbHe
13660 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f  ader[36 + 4*4])?
13670 31 3a 30 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  1:0);.      pBt-
13680 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67  >incrVacuum = (g
13690 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64  et4byte(&zDbHead
136a0 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a  er[36 + 7*4])?1:
136b0 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  0);.#endif.    }
136c0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
136d0 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
136e0 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  e(pBt->pPager, &
136f0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e  pBt->pageSize, n
13700 52 65 73 65 72 76 65 29 3b 0a 20 20 20 20 69 66  Reserve);.    if
13710 28 20 72 63 20 29 20 67 6f 74 6f 20 62 74 72 65  ( rc ) goto btre
13720 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
13730 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
13740 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
13750 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20  - nReserve;.    
13760 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 70 61  assert( (pBt->pa
13770 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
13780 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69  ;  /* 8-byte ali
13790 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65 53 69  gnment of pageSi
137a0 7a 65 20 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64  ze */.   .#if !d
137b0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
137c0 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
137d0 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
137e0 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29  ITE_OMIT_DISKIO)
137f0 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20  .    /* Add the 
13800 6e 65 77 20 42 74 53 68 61 72 65 64 20 6f 62 6a  new BtShared obj
13810 65 63 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65  ect to the linke
13820 64 20 6c 69 73 74 20 73 68 61 72 61 62 6c 65 20  d list sharable 
13830 42 74 53 68 61 72 65 64 73 2e 0a 20 20 20 20 2a  BtShareds..    *
13840 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61  /.    if( p->sha
13850 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 4d  rable ){.      M
13860 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69  UTEX_LOGIC( sqli
13870 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
13880 53 68 61 72 65 64 3b 20 29 0a 20 20 20 20 20 20  Shared; ).      
13890 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  pBt->nRef = 1;. 
138a0 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43       MUTEX_LOGIC
138b0 28 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20  ( mutexShared = 
138c0 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
138d0 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
138e0 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 29 0a  TATIC_MASTER);).
138f0 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
13900 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20 73  _THREADSAFE && s
13910 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
13920 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b  ig.bCoreMutex ){
13930 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6d 75  .        pBt->mu
13940 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  tex = sqlite3Mut
13950 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
13960 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20  UTEX_FAST);.    
13970 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6d 75 74      if( pBt->mut
13980 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ex==0 ){.       
13990 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
139a0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
139b0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
139c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
139d0 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
139e0 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  out;.        }. 
139f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
13a00 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
13a10 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
13a20 20 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20       pBt->pNext 
13a30 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  = GLOBAL(BtShare
13a40 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
13a50 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20  CacheList);.    
13a60 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65    GLOBAL(BtShare
13a70 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
13a80 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74  CacheList) = pBt
13a90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
13aa0 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
13ab0 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a  xShared);.    }.
13ac0 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20  #endif.  }..#if 
13ad0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
13ae0 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
13af0 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
13b00 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
13b10 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e  O).  /* If the n
13b20 65 77 20 42 74 72 65 65 20 75 73 65 73 20 61 20  ew Btree uses a 
13b30 73 68 61 72 61 62 6c 65 20 70 42 74 53 68 61 72  sharable pBtShar
13b40 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68  ed, then link th
13b50 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65 65  e new.  ** Btree
13b60 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 20 6f   into the list o
13b70 66 20 61 6c 6c 20 73 68 61 72 61 62 6c 65 20 42  f all sharable B
13b80 74 72 65 65 73 20 66 6f 72 20 74 68 65 20 73 61  trees for the sa
13b90 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20  me connection.. 
13ba0 20 2a 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20   ** The list is 
13bb0 6b 65 70 74 20 69 6e 20 61 73 63 65 6e 64 69 6e  kept in ascendin
13bc0 67 20 6f 72 64 65 72 20 62 79 20 70 42 74 20 61  g order by pBt a
13bd0 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69  ddress..  */.  i
13be0 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  f( p->sharable )
13bf0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
13c00 20 42 74 72 65 65 20 2a 70 53 69 62 3b 0a 20 20   Btree *pSib;.  
13c10 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
13c20 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
13c30 20 20 69 66 28 20 28 70 53 69 62 20 3d 20 64 62    if( (pSib = db
13c40 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30  ->aDb[i].pBt)!=0
13c50 20 26 26 20 70 53 69 62 2d 3e 73 68 61 72 61 62   && pSib->sharab
13c60 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68  le ){.        wh
13c70 69 6c 65 28 20 70 53 69 62 2d 3e 70 50 72 65 76  ile( pSib->pPrev
13c80 20 29 7b 20 70 53 69 62 20 3d 20 70 53 69 62 2d   ){ pSib = pSib-
13c90 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20 20 20 20  >pPrev; }.      
13ca0 20 20 69 66 28 20 70 2d 3e 70 42 74 3c 70 53 69    if( p->pBt<pSi
13cb0 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20  b->pBt ){.      
13cc0 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70      p->pNext = p
13cd0 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Sib;.          p
13ce0 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20  ->pPrev = 0;.   
13cf0 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 50 72         pSib->pPr
13d00 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  ev = p;.        
13d10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
13d20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e   while( pSib->pN
13d30 65 78 74 20 26 26 20 70 53 69 62 2d 3e 70 4e 65  ext && pSib->pNe
13d40 78 74 2d 3e 70 42 74 3c 70 2d 3e 70 42 74 20 29  xt->pBt<p->pBt )
13d50 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53  {.            pS
13d60 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74  ib = pSib->pNext
13d70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
13d80 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
13d90 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a   = pSib->pNext;.
13da0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72            p->pPr
13db0 65 76 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20  ev = pSib;.     
13dc0 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78       if( p->pNex
13dd0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
13de0 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
13df0 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20   = p;.          
13e00 7d 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62  }.          pSib
13e10 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20  ->pNext = p;.   
13e20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
13e30 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
13e40 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
13e50 20 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a   *ppBtree = p;..
13e60 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a  btree_open_out:.
13e70 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
13e80 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
13e90 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  Bt && pBt->pPage
13ea0 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  r ){.      sqlit
13eb0 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74  e3PagerClose(pBt
13ec0 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  ->pPager);.    }
13ed0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
13ee0 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69  e(pBt);.    sqli
13ef0 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
13f00 20 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a 20   *ppBtree = 0;. 
13f10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
13f20 66 20 74 68 65 20 42 2d 54 72 65 65 20 77 61 73  f the B-Tree was
13f30 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70   successfully op
13f40 65 6e 65 64 2c 20 73 65 74 20 74 68 65 20 70 61  ened, set the pa
13f50 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65 20 74  ger-cache size t
13f60 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66  o the.    ** def
13f70 61 75 6c 74 20 76 61 6c 75 65 2e 20 45 78 63 65  ault value. Exce
13f80 70 74 2c 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67  pt, when opening
13f90 20 6f 6e 20 61 6e 20 65 78 69 73 74 69 6e 67 20   on an existing 
13fa0 73 68 61 72 65 64 20 70 61 67 65 72 2d 63 61 63  shared pager-cac
13fb0 68 65 2c 0a 20 20 20 20 2a 2a 20 64 6f 20 6e 6f  he,.    ** do no
13fc0 74 20 63 68 61 6e 67 65 20 74 68 65 20 70 61 67  t change the pag
13fd0 65 72 2d 63 61 63 68 65 20 73 69 7a 65 2e 0a 20  er-cache size.. 
13fe0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71     */.    if( sq
13ff0 6c 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61  lite3BtreeSchema
14000 28 70 2c 20 30 2c 20 30 29 3d 3d 30 20 29 7b 0a  (p, 0, 0)==0 ){.
14010 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
14020 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70  erSetCachesize(p
14030 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 53  ->pBt->pPager, S
14040 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41  QLITE_DEFAULT_CA
14050 43 48 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d  CHE_SIZE);.    }
14060 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75 74 65 78  .  }.  if( mutex
14070 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65  Open ){.    asse
14080 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
14090 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e  x_held(mutexOpen
140a0 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
140b0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
140c0 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 72  exOpen);.  }.  r
140d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
140e0 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  ** Decrement the
140f0 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63   BtShared.nRef c
14100 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e 20 69 74  ounter.  When it
14110 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a   reaches zero,.*
14120 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 42 74 53  * remove the BtS
14130 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65 20  hared structure 
14140 66 72 6f 6d 20 74 68 65 20 73 68 61 72 69 6e 67  from the sharing
14150 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a   list.  Return.*
14160 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 42 74  * true if the Bt
14170 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e  Shared.nRef coun
14180 74 65 72 20 72 65 61 63 68 65 73 20 7a 65 72 6f  ter reaches zero
14190 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66   and return.** f
141a0 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 74  alse if it is st
141b0 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f  ill positive..*/
141c0 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f  .static int remo
141d0 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73  veFromSharingLis
141e0 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  t(BtShared *pBt)
141f0 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
14200 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
14210 48 45 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43  HE.  MUTEX_LOGIC
14220 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20  ( sqlite3_mutex 
14230 2a 70 4d 61 73 74 65 72 3b 20 29 0a 20 20 42 74  *pMaster; ).  Bt
14240 53 68 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20  Shared *pList;. 
14250 20 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20 30   int removed = 0
14260 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
14270 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65  ite3_mutex_nothe
14280 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
14290 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28  ;.  MUTEX_LOGIC(
142a0 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74   pMaster = sqlit
142b0 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
142c0 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
142d0 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 73 71  _MASTER); ).  sq
142e0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
142f0 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 70 42  r(pMaster);.  pB
14300 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28  t->nRef--;.  if(
14310 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b   pBt->nRef<=0 ){
14320 0a 20 20 20 20 69 66 28 20 47 4c 4f 42 41 4c 28  .    if( GLOBAL(
14330 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
14340 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
14350 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20  )==pBt ){.      
14360 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
14370 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
14380 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e  cheList) = pBt->
14390 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65  pNext;.    }else
143a0 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20  {.      pList = 
143b0 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
143c0 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
143d0 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  cheList);.      
143e0 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4c  while( ALWAYS(pL
143f0 69 73 74 29 20 26 26 20 70 4c 69 73 74 2d 3e 70  ist) && pList->p
14400 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a 20 20 20  Next!=pBt ){.   
14410 20 20 20 20 20 70 4c 69 73 74 3d 70 4c 69 73 74       pList=pList
14420 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
14430 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59  .      if( ALWAY
14440 53 28 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20  S(pList) ){.    
14450 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74      pList->pNext
14460 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20   = pBt->pNext;. 
14470 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
14480 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45   if( SQLITE_THRE
14490 41 44 53 41 46 45 20 29 7b 0a 20 20 20 20 20 20  ADSAFE ){.      
144a0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72  sqlite3_mutex_fr
144b0 65 65 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a  ee(pBt->mutex);.
144c0 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65      }.    remove
144d0 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c  d = 1;.  }.  sql
144e0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
144f0 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74  (pMaster);.  ret
14500 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c  urn removed;.#el
14510 73 65 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23  se.  return 1;.#
14520 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  endif.}../*.** M
14530 61 6b 65 20 73 75 72 65 20 70 42 74 2d 3e 70 54  ake sure pBt->pT
14540 6d 70 53 70 61 63 65 20 70 6f 69 6e 74 73 20 74  mpSpace points t
14550 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  o an allocation 
14560 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53  of .** MX_CELL_S
14570 49 5a 45 28 70 42 74 29 20 62 79 74 65 73 20 77  IZE(pBt) bytes w
14580 69 74 68 20 61 20 34 2d 62 79 74 65 20 70 72 65  ith a 4-byte pre
14590 66 69 78 20 66 6f 72 20 61 20 6c 65 66 74 2d 63  fix for a left-c
145a0 68 69 6c 64 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e  hild.** pointer.
145b0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
145c0 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63  allocateTempSpac
145d0 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
145e0 7b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70 54  {.  if( !pBt->pT
145f0 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70  mpSpace ){.    p
14600 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  Bt->pTmpSpace = 
14610 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f  sqlite3PageMallo
14620 63 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  c( pBt->pageSize
14630 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e 65 20   );..    /* One 
14640 6f 66 20 74 68 65 20 75 73 65 73 20 6f 66 20 70  of the uses of p
14650 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 69 73  Bt->pTmpSpace is
14660 20 74 6f 20 66 6f 72 6d 61 74 20 63 65 6c 6c 73   to format cells
14670 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69   before.    ** i
14680 6e 73 65 72 74 69 6e 67 20 74 68 65 6d 20 69 6e  nserting them in
14690 74 6f 20 61 20 6c 65 61 66 20 70 61 67 65 20 28  to a leaf page (
146a0 66 75 6e 63 74 69 6f 6e 20 66 69 6c 6c 49 6e 43  function fillInC
146b0 65 6c 6c 28 29 29 2e 20 49 66 0a 20 20 20 20 2a  ell()). If.    *
146c0 2a 20 61 20 63 65 6c 6c 20 69 73 20 6c 65 73 73  * a cell is less
146d0 20 74 68 61 6e 20 34 20 62 79 74 65 73 20 69 6e   than 4 bytes in
146e0 20 73 69 7a 65 2c 20 69 74 20 69 73 20 72 6f 75   size, it is rou
146f0 6e 64 65 64 20 75 70 20 74 6f 20 34 20 62 79 74  nded up to 4 byt
14700 65 73 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65  es.    ** by the
14710 20 76 61 72 69 6f 75 73 20 72 6f 75 74 69 6e 65   various routine
14720 73 20 74 68 61 74 20 6d 61 6e 69 70 75 6c 61 74  s that manipulat
14730 65 20 62 69 6e 61 72 79 20 63 65 6c 6c 73 2e 20  e binary cells. 
14740 57 68 69 63 68 0a 20 20 20 20 2a 2a 20 63 61 6e  Which.    ** can
14750 20 6d 65 61 6e 20 74 68 61 74 20 66 69 6c 6c 49   mean that fillI
14760 6e 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 69 6e 69  nCell() only ini
14770 74 69 61 6c 69 7a 65 73 20 74 68 65 20 66 69 72  tializes the fir
14780 73 74 20 32 20 6f 72 20 33 0a 20 20 20 20 2a 2a  st 2 or 3.    **
14790 20 62 79 74 65 73 20 6f 66 20 70 54 6d 70 53 70   bytes of pTmpSp
147a0 61 63 65 2c 20 62 75 74 20 74 68 61 74 20 74 68  ace, but that th
147b0 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
147c0 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a  are copied from.
147d0 20 20 20 20 2a 2a 20 69 74 20 69 6e 74 6f 20 61      ** it into a
147e0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20   database page. 
147f0 54 68 69 73 20 69 73 20 6e 6f 74 20 61 63 74 75  This is not actu
14800 61 6c 6c 79 20 61 20 70 72 6f 62 6c 65 6d 2c 20  ally a problem, 
14810 62 75 74 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f  but it.    ** do
14820 65 73 20 63 61 75 73 65 20 61 20 76 61 6c 67 72  es cause a valgr
14830 69 6e 64 20 65 72 72 6f 72 20 77 68 65 6e 20 74  ind error when t
14840 68 65 20 31 20 6f 72 20 32 20 62 79 74 65 73 20  he 1 or 2 bytes 
14850 6f 66 20 75 6e 69 74 69 61 6c 69 7a 65 64 20 0a  of unitialized .
14860 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 70      ** data is p
14870 61 73 73 65 64 20 74 6f 20 73 79 73 74 65 6d 20  assed to system 
14880 63 61 6c 6c 20 77 72 69 74 65 28 29 2e 20 53 6f  call write(). So
14890 20 74 6f 20 61 76 6f 69 64 20 74 68 69 73 20 65   to avoid this e
148a0 72 72 6f 72 2c 0a 20 20 20 20 2a 2a 20 7a 65 72  rror,.    ** zer
148b0 6f 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79  o the first 4 by
148c0 74 65 73 20 6f 66 20 74 65 6d 70 20 73 70 61 63  tes of temp spac
148d0 65 20 68 65 72 65 2e 0a 20 20 20 20 2a 2a 0a 20  e here..    **. 
148e0 20 20 20 2a 2a 20 41 6c 73 6f 3a 20 20 50 72 6f     ** Also:  Pro
148f0 76 69 64 65 20 66 6f 75 72 20 62 79 74 65 73 20  vide four bytes 
14900 6f 66 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 73  of initialized s
14910 70 61 63 65 20 62 65 66 6f 72 65 20 74 68 65 0a  pace before the.
14920 20 20 20 20 2a 2a 20 62 65 67 69 6e 6e 69 6e 67      ** beginning
14930 20 6f 66 20 70 54 6d 70 53 70 61 63 65 20 61 73   of pTmpSpace as
14940 20 61 6e 20 61 72 65 61 20 61 76 61 69 6c 61 62   an area availab
14950 6c 65 20 74 6f 20 70 72 65 70 65 6e 64 20 74 68  le to prepend th
14960 65 0a 20 20 20 20 2a 2a 20 6c 65 66 74 2d 63 68  e.    ** left-ch
14970 69 6c 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  ild pointer to t
14980 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
14990 61 20 63 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20  a cell..    */. 
149a0 20 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70     if( pBt->pTmp
149b0 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 6d  Space ){.      m
149c0 65 6d 73 65 74 28 70 42 74 2d 3e 70 54 6d 70 53  emset(pBt->pTmpS
149d0 70 61 63 65 2c 20 30 2c 20 38 29 3b 0a 20 20 20  pace, 0, 8);.   
149e0 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63     pBt->pTmpSpac
149f0 65 20 2b 3d 20 34 3b 0a 20 20 20 20 7d 0a 20 20  e += 4;.    }.  
14a00 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  }.}../*.** Free 
14a10 74 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  the pBt->pTmpSpa
14a20 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f  ce allocation.*/
14a30 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65  .static void fre
14a40 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61  eTempSpace(BtSha
14a50 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28  red *pBt){.  if(
14a60 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
14a70 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70  ){.    pBt->pTmp
14a80 53 70 61 63 65 20 2d 3d 20 34 3b 0a 20 20 20 20  Space -= 4;.    
14a90 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
14aa0 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b  pBt->pTmpSpace);
14ab0 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70  .    pBt->pTmpSp
14ac0 61 63 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  ace = 0;.  }.}..
14ad0 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f  /*.** Close an o
14ae0 70 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64  pen database and
14af0 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
14b00 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20  cursors..*/.int 
14b10 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
14b20 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  e(Btree *p){.  B
14b30 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
14b40 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f  ->pBt;.  BtCurso
14b50 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43  r *pCur;..  /* C
14b60 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  lose all cursors
14b70 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69 73   opened via this
14b80 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61   handle.  */.  a
14b90 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
14ba0 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
14bb0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
14bc0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
14bd0 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d  );.  pCur = pBt-
14be0 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c  >pCursor;.  whil
14bf0 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42  e( pCur ){.    B
14c00 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20  tCursor *pTmp = 
14c10 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d  pCur;.    pCur =
14c20 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20   pCur->pNext;.  
14c30 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72    if( pTmp->pBtr
14c40 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73  ee==p ){.      s
14c50 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
14c60 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20  Cursor(pTmp);.  
14c70 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f    }.  }..  /* Ro
14c80 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76  llback any activ
14c90 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  e transaction an
14ca0 64 20 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c  d free the handl
14cb0 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a  e structure..  *
14cc0 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  * The call to sq
14cd0 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
14ce0 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74  ck() drops any t
14cf0 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20  able-locks held 
14d00 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e  by.  ** this han
14d10 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  dle..  */.  sqli
14d20 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
14d30 28 70 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30  (p, SQLITE_OK, 0
14d40 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
14d50 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a  eLeave(p);..  /*
14d60 20 49 66 20 74 68 65 72 65 20 61 72 65 20 73 74   If there are st
14d70 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61  ill other outsta
14d80 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
14d90 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62   to the shared-b
14da0 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74  tree.  ** struct
14db0 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e  ure, return now.
14dc0 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f   The remainder o
14dd0 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  f this procedure
14de0 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70   cleans .  ** up
14df0 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
14e00 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
14e10 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d  ( p->wantToLock=
14e20 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d  =0 && p->locked=
14e30 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e  =0 );.  if( !p->
14e40 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f  sharable || remo
14e50 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73  veFromSharingLis
14e60 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a  t(pBt) ){.    /*
14e70 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c   The pBt is no l
14e80 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61  onger on the sha
14e90 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65  ring list, so we
14ea0 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20   can access.    
14eb0 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68 61  ** it without ha
14ec0 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65  ving to hold the
14ed0 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20   mutex..    **. 
14ee0 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20     ** Clean out 
14ef0 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 42  and delete the B
14f00 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a  tShared object..
14f10 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
14f20 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72  t( !pBt->pCursor
14f30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   );.    sqlite3P
14f40 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70  agerClose(pBt->p
14f50 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
14f60 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61  pBt->xFreeSchema
14f70 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d 61   && pBt->pSchema
14f80 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 78   ){.      pBt->x
14f90 46 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d 3e  FreeSchema(pBt->
14fa0 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a  pSchema);.    }.
14fb0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
14fc0 65 28 30 2c 20 70 42 74 2d 3e 70 53 63 68 65 6d  e(0, pBt->pSchem
14fd0 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70  a);.    freeTemp
14fe0 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
14ff0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74  sqlite3_free(pBt
15000 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  );.  }..#ifndef 
15010 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
15020 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65 72  ED_CACHE.  asser
15030 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b  t( p->wantToLock
15040 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
15050 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b   p->locked==0 );
15060 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20  .  if( p->pPrev 
15070 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  ) p->pPrev->pNex
15080 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  t = p->pNext;.  
15090 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70  if( p->pNext ) p
150a0 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
150b0 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69   p->pPrev;.#endi
150c0 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  f..  sqlite3_fre
150d0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
150e0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
150f0 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69  ** Change the li
15100 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65  mit on the numbe
15110 72 20 6f 66 20 70 61 67 65 73 20 61 6c 6c 6f 77  r of pages allow
15120 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e  ed in the cache.
15130 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  .**.** The maxim
15140 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63  um number of cac
15150 68 65 20 70 61 67 65 73 20 69 73 20 73 65 74 20  he pages is set 
15160 74 6f 20 74 68 65 20 61 62 73 6f 6c 75 74 65 0a  to the absolute.
15170 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61  ** value of mxPa
15180 67 65 2e 20 20 49 66 20 6d 78 50 61 67 65 20 69  ge.  If mxPage i
15190 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 20  s negative, the 
151a0 70 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70  pager will.** op
151b0 65 72 61 74 65 20 61 73 79 6e 63 68 72 6f 6e 6f  erate asynchrono
151c0 75 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c 20 6e  usly - it will n
151d0 6f 74 20 73 74 6f 70 20 74 6f 20 64 6f 20 66 73  ot stop to do fs
151e0 79 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69 6e 73  ync()s.** to ins
151f0 75 72 65 20 64 61 74 61 20 69 73 20 77 72 69 74  ure data is writ
15200 74 65 6e 20 74 6f 20 74 68 65 20 64 69 73 6b 20  ten to the disk 
15210 73 75 72 66 61 63 65 20 62 65 66 6f 72 65 0a 2a  surface before.*
15220 2a 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 54  * continuing.  T
15230 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74 69 6c  ransactions stil
15240 6c 20 77 6f 72 6b 20 69 66 20 73 79 6e 63 68 72  l work if synchr
15250 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a 2a 2a  onous is off,.**
15260 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
15270 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 72 72  e cannot be corr
15280 75 70 74 65 64 20 69 66 20 74 68 69 73 20 70 72  upted if this pr
15290 6f 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68 65 73  ogram.** crashes
152a0 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 6f 70  .  But if the op
152b0 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63  erating system c
152c0 72 61 73 68 65 73 20 6f 72 20 74 68 65 72 65 20  rashes or there 
152d0 69 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70 74 20  is.** an abrupt 
152e0 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77 68  power failure wh
152f0 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69  en synchronous i
15300 73 20 6f 66 66 2c 20 74 68 65 20 64 61 74 61 62  s off, the datab
15310 61 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20  ase.** could be 
15320 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e  left in an incon
15330 73 69 73 74 65 6e 74 20 61 6e 64 20 75 6e 72 65  sistent and unre
15340 63 6f 76 65 72 61 62 6c 65 20 73 74 61 74 65 2e  coverable state.
15350 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75 73 20  .** Synchronous 
15360 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74  is on by default
15370 20 73 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72   so database cor
15380 72 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a  ruption is not.*
15390 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77 6f 72  * normally a wor
153a0 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ry..*/.int sqlit
153b0 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65 53  e3BtreeSetCacheS
153c0 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ize(Btree *p, in
153d0 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53  t mxPage){.  BtS
153e0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
153f0 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
15400 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
15410 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
15420 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
15430 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c  eEnter(p);.  sql
15440 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
15450 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
15460 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71  r, mxPage);.  sq
15470 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
15480 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
15490 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53  ITE_OK;.}..#if S
154a0 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
154b0 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  IZE>0./*.** Chan
154c0 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20  ge the limit on 
154d0 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68  the amount of th
154e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
154f0 74 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6d  that may be.** m
15500 65 6d 6f 72 79 20 6d 61 70 70 65 64 2e 0a 2a 2f  emory mapped..*/
15510 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
15520 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 42 74  eSetMmapLimit(Bt
15530 72 65 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f  ree *p, sqlite3_
15540 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b 0a 20  int64 szMmap){. 
15550 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
15560 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
15570 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
15580 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
15590 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
155a0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
155b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
155c0 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70  MmapLimit(pBt->p
155d0 50 61 67 65 72 2c 20 73 7a 4d 6d 61 70 29 3b 0a  Pager, szMmap);.
155e0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
155f0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
15600 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
15610 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d  ndif /* SQLITE_M
15620 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a  AX_MMAP_SIZE>0 *
15630 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  /../*.** Change 
15640 74 68 65 20 77 61 79 20 64 61 74 61 20 69 73 20  the way data is 
15650 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 69  synced to disk i
15660 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72 65  n order to incre
15670 61 73 65 20 6f 72 20 64 65 63 72 65 61 73 65 0a  ase or decrease.
15680 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65 20  ** how well the 
15690 64 61 74 61 62 61 73 65 20 72 65 73 69 73 74 73  database resists
156a0 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f   damage due to O
156b0 53 20 63 72 61 73 68 65 73 20 61 6e 64 20 70 6f  S crashes and po
156c0 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e  wer.** failures.
156d0 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68 65    Level 1 is the
156e0 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68 72   same as asynchr
156f0 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73 28  onous (no syncs(
15700 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74  ) occur and.** t
15710 68 65 72 65 20 69 73 20 61 20 68 69 67 68 20 70  here is a high p
15720 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61  robability of da
15730 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20 69  mage)  Level 2 i
15740 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20  s the default.  
15750 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76 65  There.** is a ve
15760 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a  ry low but non-z
15770 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79 20  ero probability 
15780 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76 65  of damage.  Leve
15790 6c 20 33 20 72 65 64 75 63 65 73 20 74 68 65 0a  l 3 reduces the.
157a0 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  ** probability o
157b0 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61 72  f damage to near
157c0 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20 61   zero but with a
157d0 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61 6e   write performan
157e0 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f  ce reduction..*/
157f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15800 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
15810 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  AS.int sqlite3Bt
15820 72 65 65 53 65 74 50 61 67 65 72 46 6c 61 67 73  reeSetPagerFlags
15830 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
15840 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
15850 65 20 62 74 72 65 65 20 74 6f 20 73 65 74 20 74  e btree to set t
15860 68 65 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20  he safety level 
15870 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  on */.  unsigned
15880 20 70 67 46 6c 61 67 73 20 20 20 20 20 20 20 2f   pgFlags       /
15890 2a 20 56 61 72 69 6f 75 73 20 50 41 47 45 52 5f  * Various PAGER_
158a0 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20  * flags */.){.  
158b0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
158c0 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  p->pBt;.  assert
158d0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
158e0 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
158f0 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
15900 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
15910 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 46  sqlite3PagerSetF
15920 6c 61 67 73 28 70 42 74 2d 3e 70 50 61 67 65 72  lags(pBt->pPager
15930 2c 20 70 67 46 6c 61 67 73 29 3b 0a 20 20 73 71  , pgFlags);.  sq
15940 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
15950 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
15960 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
15970 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
15980 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
15990 20 62 74 72 65 65 20 69 73 20 73 65 74 20 74 6f   btree is set to
159a0 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 31 2e   safety level 1.
159b0 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f    In other.** wo
159c0 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45  rds, return TRUE
159d0 20 69 66 20 6e 6f 20 73 79 6e 63 28 29 20 6f 63   if no sync() oc
159e0 63 75 72 73 20 6f 6e 20 74 68 65 20 64 69 73 6b  curs on the disk
159f0 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   files..*/.int s
15a00 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 44  qlite3BtreeSyncD
15a10 69 73 61 62 6c 65 64 28 42 74 72 65 65 20 2a 70  isabled(Btree *p
15a20 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
15a30 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
15a40 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
15a50 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
15a60 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
15a70 29 20 29 3b 20 20 0a 20 20 73 71 6c 69 74 65 33  ) );  .  sqlite3
15a80 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
15a90 20 61 73 73 65 72 74 28 20 70 42 74 20 26 26 20   assert( pBt && 
15aa0 70 42 74 2d 3e 70 50 61 67 65 72 20 29 3b 0a 20  pBt->pPager );. 
15ab0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
15ac0 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e 70 50  erNosync(pBt->pP
15ad0 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  ager);.  sqlite3
15ae0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
15af0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
15b00 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
15b10 64 65 66 61 75 6c 74 20 70 61 67 65 73 20 73 69  default pages si
15b20 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65  ze and the numbe
15b30 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79  r of reserved by
15b40 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a  tes per page..**
15b50 20 4f 72 2c 20 69 66 20 74 68 65 20 70 61 67 65   Or, if the page
15b60 20 73 69 7a 65 20 68 61 73 20 61 6c 72 65 61 64   size has alread
15b70 79 20 62 65 65 6e 20 66 69 78 65 64 2c 20 72 65  y been fixed, re
15b80 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
15b90 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74  ONLY .** without
15ba0 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 74 68 69   changing anythi
15bb0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ng..**.** The pa
15bc0 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20  ge size must be 
15bd0 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65 74  a power of 2 bet
15be0 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35  ween 512 and 655
15bf0 33 36 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  36.  If the page
15c00 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69 65  .** size supplie
15c10 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20  d does not meet 
15c20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  this constraint 
15c30 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 73 69  then the page si
15c40 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61  ze is not.** cha
15c50 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  nged..**.** Page
15c60 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73 74   sizes are const
15c70 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70  rained to be a p
15c80 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20 74  ower of two so t
15c90 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a  hat the region.*
15ca0 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  * of the databas
15cb0 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20  e file used for 
15cc0 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69  locking (beginni
15cd0 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42 59  ng at PENDING_BY
15ce0 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  TE,.** the first
15cf0 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 31   byte past the 1
15d00 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78 34  GB boundary, 0x4
15d10 30 30 30 30 30 30 30 29 20 6e 65 65 64 73 20 74  0000000) needs t
15d20 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74 68  o occur.** at th
15d30 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61  e beginning of a
15d40 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
15d50 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65 72  parameter nReser
15d60 76 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ve is less than 
15d70 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e  zero, then the n
15d80 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65  umber of reserve
15d90 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20 70  d.** bytes per p
15da0 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68  age is left unch
15db0 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  anged..**.** If 
15dc0 74 68 65 20 69 46 69 78 21 3d 30 20 74 68 65 6e  the iFix!=0 then
15dd0 20 74 68 65 20 42 54 53 5f 50 41 47 45 53 49 5a   the BTS_PAGESIZ
15de0 45 5f 46 49 58 45 44 20 66 6c 61 67 20 69 73 20  E_FIXED flag is 
15df0 73 65 74 20 73 6f 20 74 68 61 74 20 74 68 65 20  set so that the 
15e00 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64  page size.** and
15e10 20 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65   autovacuum mode
15e20 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62   can no longer b
15e30 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e  e changed..*/.in
15e40 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
15e50 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20  tPageSize(Btree 
15e60 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65  *p, int pageSize
15e70 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 2c 20  , int nReserve, 
15e80 69 6e 74 20 69 46 69 78 29 7b 0a 20 20 69 6e 74  int iFix){.  int
15e90 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
15ea0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
15eb0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
15ec0 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d  ert( nReserve>=-
15ed0 31 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32  1 && nReserve<=2
15ee0 35 35 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  55 );.  sqlite3B
15ef0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69  treeEnter(p);.#i
15f00 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
15f10 45 43 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76  EC.  if( nReserv
15f20 65 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65  e>pBt->optimalRe
15f30 73 65 72 76 65 20 29 20 70 42 74 2d 3e 6f 70 74  serve ) pBt->opt
15f40 69 6d 61 6c 52 65 73 65 72 76 65 20 3d 20 28 75  imalReserve = (u
15f50 38 29 6e 52 65 73 65 72 76 65 3b 0a 23 65 6e 64  8)nReserve;.#end
15f60 69 66 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74  if.  if( pBt->bt
15f70 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41 47  sFlags & BTS_PAG
15f80 45 53 49 5a 45 5f 46 49 58 45 44 20 29 7b 0a 20  ESIZE_FIXED ){. 
15f90 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
15fa0 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74  eave(p);.    ret
15fb0 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
15fc0 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  NLY;.  }.  if( n
15fd0 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20 20 20  Reserve<0 ){.   
15fe0 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42 74 2d   nReserve = pBt-
15ff0 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d  >pageSize - pBt-
16000 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d  >usableSize;.  }
16010 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65  .  assert( nRese
16020 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72  rve>=0 && nReser
16030 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66 28  ve<=255 );.  if(
16040 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26   pageSize>=512 &
16050 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49  & pageSize<=SQLI
16060 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
16070 20 26 26 0a 20 20 20 20 20 20 20 20 28 28 70 61   &&.        ((pa
16080 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69  geSize-1)&pageSi
16090 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  ze)==0 ){.    as
160a0 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20  sert( (pageSize 
160b0 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61  & 7)==0 );.    a
160c0 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75  ssert( !pBt->pCu
160d0 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42 74 2d  rsor );.    pBt-
160e0 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75 33 32  >pageSize = (u32
160f0 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 66  )pageSize;.    f
16100 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
16110 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
16120 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
16130 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
16140 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  r, &pBt->pageSiz
16150 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20  e, nReserve);.  
16160 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
16170 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
16180 2d 20 28 75 31 36 29 6e 52 65 73 65 72 76 65 3b  - (u16)nReserve;
16190 0a 20 20 69 66 28 20 69 46 69 78 20 29 20 70 42  .  if( iFix ) pB
161a0 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
161b0 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
161c0 44 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  D;.  sqlite3Btre
161d0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
161e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
161f0 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   Return the curr
16200 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 70 61  ently defined pa
16210 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73  ge size.*/.int s
16220 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
16230 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 29  geSize(Btree *p)
16240 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42  {.  return p->pB
16250 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a  t->pageSize;.}..
16260 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
16270 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20 74  ion is similar t
16280 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  o sqlite3BtreeGe
16290 74 52 65 73 65 72 76 65 28 29 2c 20 65 78 63 65  tReserve(), exce
162a0 70 74 20 74 68 61 74 20 69 74 0a 2a 2a 20 6d 61  pt that it.** ma
162b0 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  y only be called
162c0 20 69 66 20 69 74 20 69 73 20 67 75 61 72 61 6e   if it is guaran
162d0 74 65 65 64 20 74 68 61 74 20 74 68 65 20 62 2d  teed that the b-
162e0 74 72 65 65 20 6d 75 74 65 78 20 69 73 20 61 6c  tree mutex is al
162f0 72 65 61 64 79 0a 2a 2a 20 68 65 6c 64 2e 0a 2a  ready.** held..*
16300 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 75 73 65  *.** This is use
16310 66 75 6c 20 69 6e 20 6f 6e 65 20 73 70 65 63 69  ful in one speci
16320 61 6c 20 63 61 73 65 20 69 6e 20 74 68 65 20 62  al case in the b
16330 61 63 6b 75 70 20 41 50 49 20 63 6f 64 65 20 77  ackup API code w
16340 68 65 72 65 20 69 74 20 69 73 0a 2a 2a 20 6b 6e  here it is.** kn
16350 6f 77 6e 20 74 68 61 74 20 74 68 65 20 73 68 61  own that the sha
16360 72 65 64 20 62 2d 74 72 65 65 20 6d 75 74 65 78  red b-tree mutex
16370 20 69 73 20 68 65 6c 64 2c 20 62 75 74 20 74 68   is held, but th
16380 65 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 0a  e mutex on the .
16390 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ** database hand
163a0 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70 20  le that owns *p 
163b0 69 73 20 6e 6f 74 2e 20 49 6e 20 74 68 69 73 20  is not. In this 
163c0 63 61 73 65 20 69 66 20 73 71 6c 69 74 65 33 42  case if sqlite3B
163d0 74 72 65 65 45 6e 74 65 72 28 29 0a 2a 2a 20 77  treeEnter().** w
163e0 65 72 65 20 74 6f 20 62 65 20 63 61 6c 6c 65 64  ere to be called
163f0 2c 20 69 74 20 6d 69 67 68 74 20 63 6f 6c 6c 69  , it might colli
16400 64 65 20 77 69 74 68 20 73 6f 6d 65 20 6f 74 68  de with some oth
16410 65 72 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20  er operation on 
16420 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
16430 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73  handle that owns
16440 20 2a 70 2c 20 63 61 75 73 69 6e 67 20 75 6e 64   *p, causing und
16450 65 66 69 6e 65 64 20 62 65 68 61 76 69 6f 72 2e  efined behavior.
16460 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
16470 74 72 65 65 47 65 74 52 65 73 65 72 76 65 4e 6f  treeGetReserveNo
16480 4d 75 74 65 78 28 42 74 72 65 65 20 2a 70 29 7b  Mutex(Btree *p){
16490 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 61 73 73 65  .  int n;.  asse
164a0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
164b0 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d  x_held(p->pBt->m
164c0 75 74 65 78 29 20 29 3b 0a 20 20 6e 20 3d 20 70  utex) );.  n = p
164d0 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  ->pBt->pageSize 
164e0 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  - p->pBt->usable
164f0 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20 6e  Size;.  return n
16500 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
16510 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
16520 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  bytes of space a
16530 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65  t the end of eve
16540 72 79 20 70 61 67 65 20 74 68 61 74 0a 2a 2a 20  ry page that.** 
16550 61 72 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20  are intentually 
16560 6c 65 66 74 20 75 6e 75 73 65 64 2e 20 20 54 68  left unused.  Th
16570 69 73 20 69 73 20 74 68 65 20 22 72 65 73 65 72  is is the "reser
16580 76 65 64 22 20 73 70 61 63 65 20 74 68 61 74 20  ved" space that 
16590 69 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20  is.** sometimes 
165a0 75 73 65 64 20 62 79 20 65 78 74 65 6e 73 69 6f  used by extensio
165b0 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  ns..**.** If SQL
165c0 49 54 45 5f 48 41 53 5f 4d 55 54 45 58 20 69 73  ITE_HAS_MUTEX is
165d0 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20 74 68   defined then th
165e0 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65  e number returne
165f0 64 20 69 73 20 74 68 65 0a 2a 2a 20 67 72 65 61  d is the.** grea
16600 74 65 72 20 6f 66 20 74 68 65 20 63 75 72 72 65  ter of the curre
16610 6e 74 20 72 65 73 65 72 76 65 64 20 73 70 61 63  nt reserved spac
16620 65 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75  e and the maximu
16630 6d 20 72 65 71 75 65 73 74 65 64 0a 2a 2a 20 72  m requested.** r
16640 65 73 65 72 76 65 20 73 70 61 63 65 2e 0a 2a 2f  eserve space..*/
16650 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
16660 65 47 65 74 4f 70 74 69 6d 61 6c 52 65 73 65 72  eGetOptimalReser
16670 76 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ve(Btree *p){.  
16680 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
16690 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
166a0 20 6e 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65   n = sqlite3Btre
166b0 65 47 65 74 52 65 73 65 72 76 65 4e 6f 4d 75 74  eGetReserveNoMut
166c0 65 78 28 70 29 3b 0a 23 69 66 64 65 66 20 53 51  ex(p);.#ifdef SQ
166d0 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
166e0 20 69 66 28 20 6e 3c 70 2d 3e 70 42 74 2d 3e 6f   if( n<p->pBt->o
166f0 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20 29 20  ptimalReserve ) 
16700 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 6f 70 74 69  n = p->pBt->opti
16710 6d 61 6c 52 65 73 65 72 76 65 3b 0a 23 65 6e 64  malReserve;.#end
16720 69 66 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  if.  sqlite3Btre
16730 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
16740 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  urn n;.}.../*.**
16750 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d   Set the maximum
16760 20 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20   page count for 
16770 61 20 64 61 74 61 62 61 73 65 20 69 66 20 6d 78  a database if mx
16780 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65  Page is positive
16790 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20  ..** No changes 
167a0 61 72 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61  are made if mxPa
167b0 67 65 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74  ge is 0 or negat
167c0 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65  ive..** Regardle
167d0 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20  ss of the value 
167e0 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72  of mxPage, retur
167f0 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  n the maximum pa
16800 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74  ge count..*/.int
16810 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78   sqlite3BtreeMax
16820 50 61 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20  PageCount(Btree 
16830 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  *p, int mxPage){
16840 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69  .  int n;.  sqli
16850 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
16860 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50  ;.  n = sqlite3P
16870 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74  agerMaxPageCount
16880 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c  (p->pBt->pPager,
16890 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69   mxPage);.  sqli
168a0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
168b0 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
168c0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 42  ./*.** Set the B
168d0 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
168e0 20 66 6c 61 67 20 69 66 20 6e 65 77 46 6c 61 67   flag if newFlag
168f0 20 69 73 20 30 20 6f 72 20 31 2e 20 20 49 66 20   is 0 or 1.  If 
16900 6e 65 77 46 6c 61 67 20 69 73 20 2d 31 2c 0a 2a  newFlag is -1,.*
16910 2a 20 74 68 65 6e 20 6d 61 6b 65 20 6e 6f 20 63  * then make no c
16920 68 61 6e 67 65 73 2e 20 20 41 6c 77 61 79 73 20  hanges.  Always 
16930 72 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  return the value
16940 20 6f 66 20 74 68 65 20 42 54 53 5f 53 45 43 55   of the BTS_SECU
16950 52 45 5f 44 45 4c 45 54 45 0a 2a 2a 20 73 65 74  RE_DELETE.** set
16960 74 69 6e 67 20 61 66 74 65 72 20 74 68 65 20 63  ting after the c
16970 68 61 6e 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  hange..*/.int sq
16980 6c 69 74 65 33 42 74 72 65 65 53 65 63 75 72 65  lite3BtreeSecure
16990 44 65 6c 65 74 65 28 42 74 72 65 65 20 2a 70 2c  Delete(Btree *p,
169a0 20 69 6e 74 20 6e 65 77 46 6c 61 67 29 7b 0a 20   int newFlag){. 
169b0 20 69 6e 74 20 62 3b 0a 20 20 69 66 28 20 70 3d   int b;.  if( p=
169c0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
169d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
169e0 65 72 28 70 29 3b 0a 20 20 69 66 28 20 6e 65 77  er(p);.  if( new
169f0 46 6c 61 67 3e 3d 30 20 29 7b 0a 20 20 20 20 70  Flag>=0 ){.    p
16a00 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ->pBt->btsFlags 
16a10 26 3d 20 7e 42 54 53 5f 53 45 43 55 52 45 5f 44  &= ~BTS_SECURE_D
16a20 45 4c 45 54 45 3b 0a 20 20 20 20 69 66 28 20 6e  ELETE;.    if( n
16a30 65 77 46 6c 61 67 20 29 20 70 2d 3e 70 42 74 2d  ewFlag ) p->pBt-
16a40 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
16a50 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a  _SECURE_DELETE;.
16a60 20 20 7d 20 0a 20 20 62 20 3d 20 28 70 2d 3e 70    } .  b = (p->p
16a70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
16a80 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
16a90 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 42  )!=0;.  sqlite3B
16aa0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
16ab0 72 65 74 75 72 6e 20 62 3b 0a 7d 0a 0a 2f 2a 0a  return b;.}../*.
16ac0 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 27 61  ** Change the 'a
16ad0 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70  uto-vacuum' prop
16ae0 65 72 74 79 20 6f 66 20 74 68 65 20 64 61 74 61  erty of the data
16af0 62 61 73 65 2e 20 49 66 20 74 68 65 20 27 61 75  base. If the 'au
16b00 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72  toVacuum'.** par
16b10 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65  ameter is non-ze
16b20 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61  ro, then auto-va
16b30 63 75 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61  cuum mode is ena
16b40 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69  bled. If zero, i
16b50 74 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64  t.** is disabled
16b60 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 76 61  . The default va
16b70 6c 75 65 20 66 6f 72 20 74 68 65 20 61 75 74 6f  lue for the auto
16b80 2d 76 61 63 75 75 6d 20 70 72 6f 70 65 72 74 79  -vacuum property
16b90 20 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e   is .** determin
16ba0 65 64 20 62 79 20 74 68 65 20 53 51 4c 49 54 45  ed by the SQLITE
16bb0 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
16bc0 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e  UUM macro..*/.in
16bd0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
16be0 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65  tAutoVacuum(Btre
16bf0 65 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56 61  e *p, int autoVa
16c00 63 75 75 6d 29 7b 0a 23 69 66 64 65 66 20 53 51  cuum){.#ifdef SQ
16c10 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
16c20 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 53 51  CUUM.  return SQ
16c30 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23  LITE_READONLY;.#
16c40 65 6c 73 65 0a 20 20 42 74 53 68 61 72 65 64 20  else.  BtShared 
16c50 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
16c60 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
16c70 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20 28  _OK;.  u8 av = (
16c80 75 38 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a 0a  u8)autoVacuum;..
16c90 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
16ca0 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 28 70  ter(p);.  if( (p
16cb0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
16cc0 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
16cd0 44 29 21 3d 30 20 26 26 20 28 61 76 20 3f 31 3a  D)!=0 && (av ?1:
16ce0 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63  0)!=pBt->autoVac
16cf0 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  uum ){.    rc = 
16d00 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
16d10 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42  .  }else{.    pB
16d20 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
16d30 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74  av ?1:0;.    pBt
16d40 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 61  ->incrVacuum = a
16d50 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20  v==2 ?1:0;.  }. 
16d60 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
16d70 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
16d80 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  rc;.#endif.}../*
16d90 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76  .** Return the v
16da0 61 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75 74  alue of the 'aut
16db0 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72  o-vacuum' proper
16dc0 74 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75  ty. If auto-vacu
16dd0 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65  um is .** enable
16de0 64 20 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e  d 1 is returned.
16df0 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f   Otherwise 0..*/
16e00 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
16e10 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42  eGetAutoVacuum(B
16e20 74 72 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66  tree *p){.#ifdef
16e30 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
16e40 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e  OVACUUM.  return
16e50 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55   BTREE_AUTOVACUU
16e60 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20  M_NONE;.#else.  
16e70 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
16e80 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
16e90 20 20 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70    rc = (.    (!p
16ea0 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
16eb0 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43  m)?BTREE_AUTOVAC
16ec0 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21  UUM_NONE:.    (!
16ed0 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  p->pBt->incrVacu
16ee0 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41  um)?BTREE_AUTOVA
16ef0 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42  CUUM_FULL:.    B
16f00 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
16f10 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69  INCR.  );.  sqli
16f20 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
16f30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  ;.  return rc;.#
16f40 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  endif.}.../*.** 
16f50 47 65 74 20 61 20 72 65 66 65 72 65 6e 63 65 20  Get a reference 
16f60 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68 65  to pPage1 of the
16f70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
16f80 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c   This will.** al
16f90 73 6f 20 61 63 71 75 69 72 65 20 61 20 72 65 61  so acquire a rea
16fa0 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69  dlock on that fi
16fb0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  le..**.** SQLITE
16fc0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
16fd0 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
16fe0 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  the file is not 
16ff0 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  a.** well-formed
17000 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
17010 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  then SQLITE_CORR
17020 55 50 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e  UPT is returned.
17030 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20  .** SQLITE_BUSY 
17040 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  is returned if t
17050 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6c  he database is l
17060 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e  ocked.  SQLITE_N
17070 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72  OMEM.** is retur
17080 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75  ned if we run ou
17090 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f  t of memory. .*/
170a0 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b  .static int lock
170b0 42 74 72 65 65 28 42 74 53 68 61 72 65 64 20 2a  Btree(BtShared *
170c0 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  pBt){.  int rc; 
170d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
170e0 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d  Result code from
170f0 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f   subfunctions */
17100 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
17110 65 31 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20  e1;     /* Page 
17120 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  1 of the databas
17130 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
17140 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
17150 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
17160 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
17170 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  ase */.  int nPa
17180 67 65 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f 2a  geFile = 0;   /*
17190 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
171a0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
171b0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
171c0 50 61 67 65 48 65 61 64 65 72 3b 20 20 20 20 20  PageHeader;     
171d0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
171e0 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
171f0 73 65 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  se according to 
17200 68 64 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  hdr */..  assert
17210 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
17220 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
17230 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
17240 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a  t->pPage1==0 );.
17250 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
17260 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 42  gerSharedLock(pB
17270 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66  t->pPager);.  if
17280 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17290 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
172a0 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
172b0 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31  (pBt, 1, &pPage1
172c0 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
172d0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
172e0 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20  rn rc;..  /* Do 
172f0 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74 6f  some checking to
17300 20 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68 65   help insure the
17310 20 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64 20   file we opened 
17320 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61  really is.  ** a
17330 20 76 61 6c 69 64 20 64 61 74 61 62 61 73 65 20   valid database 
17340 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50  file. .  */.  nP
17350 61 67 65 20 3d 20 6e 50 61 67 65 48 65 61 64 65  age = nPageHeade
17360 72 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b  r = get4byte(28+
17370 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61  (u8*)pPage1->aDa
17380 74 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  ta);.  sqlite3Pa
17390 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
173a0 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  ->pPager, &nPage
173b0 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 6e 50 61  File);.  if( nPa
173c0 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28  ge==0 || memcmp(
173d0 32 34 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e  24+(u8*)pPage1->
173e0 61 44 61 74 61 2c 20 39 32 2b 28 75 38 2a 29 70  aData, 92+(u8*)p
173f0 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 34 29 21  Page1->aData,4)!
17400 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20  =0 ){.    nPage 
17410 3d 20 6e 50 61 67 65 46 69 6c 65 3b 0a 20 20 7d  = nPageFile;.  }
17420 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29  .  if( nPage>0 )
17430 7b 0a 20 20 20 20 75 33 32 20 70 61 67 65 53 69  {.    u32 pageSi
17440 7a 65 3b 0a 20 20 20 20 75 33 32 20 75 73 61 62  ze;.    u32 usab
17450 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a  leSize;.    u8 *
17460 70 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e  page1 = pPage1->
17470 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20  aData;.    rc = 
17480 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20  SQLITE_NOTADB;. 
17490 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
174a0 46 3a 20 52 2d 34 33 37 33 37 2d 33 39 39 39 39  F: R-43737-39999
174b0 20 45 76 65 72 79 20 76 61 6c 69 64 20 53 51 4c   Every valid SQL
174c0 69 74 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  ite database fil
174d0 65 20 62 65 67 69 6e 73 0a 20 20 20 20 2a 2a 20  e begins.    ** 
174e0 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  with the followi
174f0 6e 67 20 31 36 20 62 79 74 65 73 20 28 69 6e 20  ng 16 bytes (in 
17500 68 65 78 29 3a 20 35 33 20 35 31 20 34 63 20 36  hex): 53 51 4c 6
17510 39 20 37 34 20 36 35 20 32 30 20 36 36 20 36 66  9 74 65 20 66 6f
17520 20 37 32 20 36 64 0a 20 20 20 20 2a 2a 20 36 31   72 6d.    ** 61
17530 20 37 34 20 32 30 20 33 33 20 30 30 2e 20 2a 2f   74 20 33 00. */
17540 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28  .    if( memcmp(
17550 70 61 67 65 31 2c 20 7a 4d 61 67 69 63 48 65 61  page1, zMagicHea
17560 64 65 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20  der, 16)!=0 ){. 
17570 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
17580 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
17590 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
175a0 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 69  E_OMIT_WAL.    i
175b0 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 31 20 29  f( page1[18]>1 )
175c0 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73  {.      pBt->bts
175d0 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41  Flags |= BTS_REA
175e0 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20  D_ONLY;.    }.  
175f0 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e    if( page1[19]>
17600 31 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  1 ){.      goto 
17610 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
17620 64 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20  d;.    }.#else. 
17630 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d     if( page1[18]
17640 3e 32 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  >2 ){.      pBt-
17650 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
17660 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20  _READ_ONLY;.    
17670 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  }.    if( page1[
17680 31 39 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 67  19]>2 ){.      g
17690 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
176a0 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  ailed;.    }..  
176b0 20 20 2f 2a 20 49 66 20 74 68 65 20 77 72 69 74    /* If the writ
176c0 65 20 76 65 72 73 69 6f 6e 20 69 73 20 73 65 74  e version is set
176d0 20 74 6f 20 32 2c 20 74 68 69 73 20 64 61 74 61   to 2, this data
176e0 62 61 73 65 20 73 68 6f 75 6c 64 20 62 65 20 61  base should be a
176f0 63 63 65 73 73 65 64 0a 20 20 20 20 2a 2a 20 69  ccessed.    ** i
17700 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 49 66 20 74  n WAL mode. If t
17710 68 65 20 6c 6f 67 20 69 73 20 6e 6f 74 20 61 6c  he log is not al
17720 72 65 61 64 79 20 6f 70 65 6e 2c 20 6f 70 65 6e  ready open, open
17730 20 69 74 20 6e 6f 77 2e 20 54 68 65 6e 20 0a 20   it now. Then . 
17740 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c     ** return SQL
17750 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 74 75 72  ITE_OK and retur
17760 6e 20 77 69 74 68 6f 75 74 20 70 6f 70 75 6c 61  n without popula
17770 74 69 6e 67 20 42 74 53 68 61 72 65 64 2e 70 50  ting BtShared.pP
17780 61 67 65 31 2e 0a 20 20 20 20 2a 2a 20 54 68 65  age1..    ** The
17790 20 63 61 6c 6c 65 72 20 64 65 74 65 63 74 73 20   caller detects 
177a0 74 68 69 73 20 61 6e 64 20 63 61 6c 6c 73 20 74  this and calls t
177b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61  his function aga
177c0 69 6e 2e 20 54 68 69 73 20 69 73 0a 20 20 20 20  in. This is.    
177d0 2a 2a 20 72 65 71 75 69 72 65 64 20 61 73 20 74  ** required as t
177e0 68 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 61  he version of pa
177f0 67 65 20 31 20 63 75 72 72 65 6e 74 6c 79 20 69  ge 1 currently i
17800 6e 20 74 68 65 20 70 61 67 65 31 20 62 75 66 66  n the page1 buff
17810 65 72 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f  er.    ** may no
17820 74 20 62 65 20 74 68 65 20 6c 61 74 65 73 74 20  t be the latest 
17830 76 65 72 73 69 6f 6e 20 2d 20 74 68 65 72 65 20  version - there 
17840 6d 61 79 20 62 65 20 61 20 6e 65 77 65 72 20 6f  may be a newer o
17850 6e 65 20 69 6e 20 74 68 65 20 6c 6f 67 0a 20 20  ne in the log.  
17860 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 2a    ** file..    *
17870 2f 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  /.    if( page1[
17880 31 39 5d 3d 3d 32 20 26 26 20 28 70 42 74 2d 3e  19]==2 && (pBt->
17890 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 4e  btsFlags & BTS_N
178a0 4f 5f 57 41 4c 29 3d 3d 30 20 29 7b 0a 20 20 20  O_WAL)==0 ){.   
178b0 20 20 20 69 6e 74 20 69 73 4f 70 65 6e 20 3d 20     int isOpen = 
178c0 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  0;.      rc = sq
178d0 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 57 61  lite3PagerOpenWa
178e0 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  l(pBt->pPager, &
178f0 69 73 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 69  isOpen);.      i
17900 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17910 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
17920 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
17930 65 64 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ed;.      }else 
17940 69 66 28 20 69 73 4f 70 65 6e 3d 3d 30 20 29 7b  if( isOpen==0 ){
17950 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
17960 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
17970 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
17980 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
17990 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
179a0 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d 0a  E_NOTADB;.    }.
179b0 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 45  #endif..    /* E
179c0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 35  VIDENCE-OF: R-15
179d0 34 36 35 2d 32 30 38 31 33 20 54 68 65 20 6d 61  465-20813 The ma
179e0 78 69 6d 75 6d 20 61 6e 64 20 6d 69 6e 69 6d 75  ximum and minimu
179f0 6d 20 65 6d 62 65 64 64 65 64 20 70 61 79 6c 6f  m embedded paylo
17a00 61 64 0a 20 20 20 20 2a 2a 20 66 72 61 63 74 69  ad.    ** fracti
17a10 6f 6e 73 20 61 6e 64 20 74 68 65 20 6c 65 61 66  ons and the leaf
17a20 20 70 61 79 6c 6f 61 64 20 66 72 61 63 74 69 6f   payload fractio
17a30 6e 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65  n values must be
17a40 20 36 34 2c 20 33 32 2c 20 61 6e 64 20 33 32 2e   64, 32, and 32.
17a50 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
17a60 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69  he original desi
17a70 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65 73 65  gn allowed these
17a80 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72 79   amounts to vary
17a90 2c 20 62 75 74 20 61 73 20 6f 66 0a 20 20 20 20  , but as of.    
17aa0 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30  ** version 3.6.0
17ab0 2c 20 77 65 20 72 65 71 75 69 72 65 20 74 68 65  , we require the
17ac0 6d 20 74 6f 20 62 65 20 66 69 78 65 64 2e 0a 20  m to be fixed.. 
17ad0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65     */.    if( me
17ae0 6d 63 6d 70 28 26 70 61 67 65 31 5b 32 31 5d 2c  mcmp(&page1[21],
17af0 20 22 5c 31 30 30 5c 30 34 30 5c 30 34 30 22 2c   "\100\040\040",
17b00 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  3)!=0 ){.      g
17b10 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
17b20 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
17b30 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
17b40 20 52 2d 35 31 38 37 33 2d 33 39 36 31 38 20 54   R-51873-39618 T
17b50 68 65 20 70 61 67 65 20 73 69 7a 65 20 66 6f 72  he page size for
17b60 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
17b70 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72   is.    ** deter
17b80 6d 69 6e 65 64 20 62 79 20 74 68 65 20 32 2d 62  mined by the 2-b
17b90 79 74 65 20 69 6e 74 65 67 65 72 20 6c 6f 63 61  yte integer loca
17ba0 74 65 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74  ted at an offset
17bb0 20 6f 66 20 31 36 20 62 79 74 65 73 20 66 72 6f   of 16 bytes fro
17bc0 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 65 67  m.    ** the beg
17bd0 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61  inning of the da
17be0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
17bf0 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20 28      pageSize = (
17c00 70 61 67 65 31 5b 31 36 5d 3c 3c 38 29 20 7c 20  page1[16]<<8) | 
17c10 28 70 61 67 65 31 5b 31 37 5d 3c 3c 31 36 29 3b  (page1[17]<<16);
17c20 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
17c30 2d 4f 46 3a 20 52 2d 32 35 30 30 38 2d 32 31 36  -OF: R-25008-216
17c40 38 38 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61  88 The size of a
17c50 20 70 61 67 65 20 69 73 20 61 20 70 6f 77 65 72   page is a power
17c60 20 6f 66 20 74 77 6f 0a 20 20 20 20 2a 2a 20 62   of two.    ** b
17c70 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36  etween 512 and 6
17c80 35 35 33 36 20 69 6e 63 6c 75 73 69 76 65 2e 20  5536 inclusive. 
17c90 2a 2f 0a 20 20 20 20 69 66 28 20 28 28 70 61 67  */.    if( ((pag
17ca0 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a  eSize-1)&pageSiz
17cb0 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 70 61  e)!=0.     || pa
17cc0 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  geSize>SQLITE_MA
17cd0 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20 20  X_PAGE_SIZE .   
17ce0 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 3d 32    || pageSize<=2
17cf0 35 36 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  56 .    ){.     
17d00 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
17d10 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
17d20 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65     assert( (page
17d30 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a  Size & 7)==0 );.
17d40 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
17d50 4f 46 3a 20 52 2d 35 39 33 31 30 2d 35 31 32 30  OF: R-59310-5120
17d60 35 20 54 68 65 20 22 72 65 73 65 72 76 65 64 20  5 The "reserved 
17d70 73 70 61 63 65 22 20 73 69 7a 65 20 69 6e 20 74  space" size in t
17d80 68 65 20 31 2d 62 79 74 65 0a 20 20 20 20 2a 2a  he 1-byte.    **
17d90 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73   integer at offs
17da0 65 74 20 32 30 20 69 73 20 74 68 65 20 6e 75 6d  et 20 is the num
17db0 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
17dc0 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64  space at the end
17dd0 20 6f 66 0a 20 20 20 20 2a 2a 20 65 61 63 68 20   of.    ** each 
17de0 70 61 67 65 20 74 6f 20 72 65 73 65 72 76 65 20  page to reserve 
17df0 66 6f 72 20 65 78 74 65 6e 73 69 6f 6e 73 2e 20  for extensions. 
17e00 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45  .    **.    ** E
17e10 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37  VIDENCE-OF: R-37
17e20 34 39 37 2d 34 32 34 31 32 20 54 68 65 20 73 69  497-42412 The si
17e30 7a 65 20 6f 66 20 74 68 65 20 72 65 73 65 72 76  ze of the reserv
17e40 65 64 20 72 65 67 69 6f 6e 20 69 73 0a 20 20 20  ed region is.   
17e50 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62   ** determined b
17e60 79 20 74 68 65 20 6f 6e 65 2d 62 79 74 65 20 75  y the one-byte u
17e70 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20  nsigned integer 
17e80 66 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66 66 73  found at an offs
17e90 65 74 20 6f 66 20 32 30 0a 20 20 20 20 2a 2a 20  et of 20.    ** 
17ea0 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
17eb0 65 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 2a  e file header. *
17ec0 2f 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65  /.    usableSize
17ed0 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61   = pageSize - pa
17ee0 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28  ge1[20];.    if(
17ef0 20 28 75 33 32 29 70 61 67 65 53 69 7a 65 21 3d   (u32)pageSize!=
17f00 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b  pBt->pageSize ){
17f10 0a 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20  .      /* After 
17f20 72 65 61 64 69 6e 67 20 74 68 65 20 66 69 72 73  reading the firs
17f30 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
17f40 74 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20  tabase assuming 
17f50 61 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20  a page size.    
17f60 20 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64    ** of BtShared
17f70 2e 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61  .pageSize, we ha
17f80 76 65 20 64 69 73 63 6f 76 65 72 65 64 20 74 68  ve discovered th
17f90 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  at the page-size
17fa0 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74   is.      ** act
17fb0 75 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20  ually pageSize. 
17fc0 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  Unlock the datab
17fd0 61 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e  ase, leave pBt->
17fe0 70 50 61 67 65 31 20 61 74 0a 20 20 20 20 20 20  pPage1 at.      
17ff0 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75  ** zero and retu
18000 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68  rn SQLITE_OK. Th
18010 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61  e caller will ca
18020 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ll this function
18030 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20  .      ** again 
18040 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74  with the correct
18050 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20   page-size..    
18060 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61    */.      relea
18070 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
18080 20 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c        pBt->usabl
18090 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69  eSize = usableSi
180a0 7a 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  ze;.      pBt->p
180b0 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
180c0 7a 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65  ze;.      freeTe
180d0 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
180e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
180f0 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
18100 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
18110 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20  Bt->pageSize,.  
18120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18140 20 70 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65   pageSize-usable
18150 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Size);.      ret
18160 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
18170 20 20 69 66 28 20 28 70 42 74 2d 3e 64 62 2d 3e    if( (pBt->db->
18180 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52  flags & SQLITE_R
18190 65 63 6f 76 65 72 79 4d 6f 64 65 29 3d 3d 30 20  ecoveryMode)==0 
181a0 26 26 20 6e 50 61 67 65 3e 6e 50 61 67 65 46 69  && nPage>nPageFi
181b0 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  le ){.      rc =
181c0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
181d0 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
181e0 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
181f0 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  ed;.    }.    /*
18200 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
18210 32 38 33 31 32 2d 36 34 37 30 34 20 48 6f 77 65  28312-64704 Howe
18220 76 65 72 2c 20 74 68 65 20 75 73 61 62 6c 65 20  ver, the usable 
18230 73 69 7a 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  size is not allo
18240 77 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65  wed to.    ** be
18250 20 6c 65 73 73 20 74 68 61 6e 20 34 38 30 2e 20   less than 480. 
18260 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
18270 69 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  if the page size
18280 20 69 73 20 35 31 32 2c 20 74 68 65 6e 20 74 68   is 512, then th
18290 65 0a 20 20 20 20 2a 2a 20 72 65 73 65 72 76 65  e.    ** reserve
182a0 64 20 73 70 61 63 65 20 73 69 7a 65 20 63 61 6e  d space size can
182b0 6e 6f 74 20 65 78 63 65 65 64 20 33 32 2e 20 2a  not exceed 32. *
182c0 2f 0a 20 20 20 20 69 66 28 20 75 73 61 62 6c 65  /.    if( usable
182d0 53 69 7a 65 3c 34 38 30 20 29 7b 0a 20 20 20 20  Size<480 ){.    
182e0 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
182f0 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
18300 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
18310 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  e = pageSize;.  
18320 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
18330 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  e = usableSize;.
18340 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18350 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
18360 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
18370 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
18380 70 61 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29  page1[36 + 4*4])
18390 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ?1:0);.    pBt->
183a0 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65  incrVacuum = (ge
183b0 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36  t4byte(&page1[36
183c0 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23   + 7*4])?1:0);.#
183d0 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20  endif.  }..  /* 
183e0 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74 68 65 20  maxLocal is the 
183f0 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  maximum amount o
18400 66 20 70 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f  f payload to sto
18410 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20  re locally for. 
18420 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b   ** a cell.  Mak
18430 65 20 73 75 72 65 20 69 74 20 69 73 20 73 6d 61  e sure it is sma
18440 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74 68 61  ll enough so tha
18450 74 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 61  t at least minFa
18460 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20  nout.  ** cells 
18470 63 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20  can will fit on 
18480 6f 6e 65 20 70 61 67 65 2e 20 20 57 65 20 61 73  one page.  We as
18490 73 75 6d 65 20 61 20 31 30 2d 62 79 74 65 20 70  sume a 10-byte p
184a0 61 67 65 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a  age header..  **
184b0 20 42 65 73 69 64 65 73 20 74 68 65 20 70 61 79   Besides the pay
184c0 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d  load, the cell m
184d0 75 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20  ust store:.  ** 
184e0 20 20 20 20 32 2d 62 79 74 65 20 70 6f 69 6e 74      2-byte point
184f0 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20  er to the cell. 
18500 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 63   **     4-byte c
18510 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a  hild pointer.  *
18520 2a 20 20 20 20 20 39 2d 62 79 74 65 20 6e 4b 65  *     9-byte nKe
18530 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20  y value.  **    
18540 20 34 2d 62 79 74 65 20 6e 44 61 74 61 20 76 61   4-byte nData va
18550 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62  lue.  **     4-b
18560 79 74 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  yte overflow pag
18570 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53  e pointer.  ** S
18580 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74  o a cell consist
18590 73 20 6f 66 20 61 20 32 2d 62 79 74 65 20 70 6f  s of a 2-byte po
185a0 69 6e 74 65 72 2c 20 61 20 68 65 61 64 65 72 20  inter, a header 
185b0 77 68 69 63 68 20 69 73 20 61 73 20 6d 75 63 68  which is as much
185c0 20 61 73 0a 20 20 2a 2a 20 31 37 20 62 79 74 65   as.  ** 17 byte
185d0 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62  s long, 0 to N b
185e0 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c  ytes of payload,
185f0 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c   and an optional
18600 20 34 20 62 79 74 65 20 6f 76 65 72 66 6c 6f 77   4 byte overflow
18610 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74  .  ** page point
18620 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e  er..  */.  pBt->
18630 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  maxLocal = (u16)
18640 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ((pBt->usableSiz
18650 65 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d 20 32  e-12)*64/255 - 2
18660 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f  3);.  pBt->minLo
18670 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74  cal = (u16)((pBt
18680 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
18690 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20  *32/255 - 23);. 
186a0 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20   pBt->maxLeaf = 
186b0 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c  (u16)(pBt->usabl
186c0 65 53 69 7a 65 20 2d 20 33 35 29 3b 0a 20 20 70  eSize - 35);.  p
186d0 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 75  Bt->minLeaf = (u
186e0 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65  16)((pBt->usable
186f0 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20  Size-12)*32/255 
18700 2d 20 32 33 29 3b 0a 20 20 69 66 28 20 70 42 74  - 23);.  if( pBt
18710 2d 3e 6d 61 78 4c 6f 63 61 6c 3e 31 32 37 20 29  ->maxLocal>127 )
18720 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62  {.    pBt->max1b
18730 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 31 32 37  ytePayload = 127
18740 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
18750 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c  Bt->max1bytePayl
18760 6f 61 64 20 3d 20 28 75 38 29 70 42 74 2d 3e 6d  oad = (u8)pBt->m
18770 61 78 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 61  axLocal;.  }.  a
18780 73 73 65 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c  ssert( pBt->maxL
18790 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43  eaf + 23 <= MX_C
187a0 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b  ELL_SIZE(pBt) );
187b0 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d  .  pBt->pPage1 =
187c0 20 70 50 61 67 65 31 3b 0a 20 20 70 42 74 2d 3e   pPage1;.  pBt->
187d0 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20  nPage = nPage;. 
187e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
187f0 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66  K;..page1_init_f
18800 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73 65  ailed:.  release
18810 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
18820 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b  pBt->pPage1 = 0;
18830 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
18840 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
18850 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
18860 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f   number of curso
18870 72 73 20 6f 70 65 6e 20 6f 6e 20 70 42 74 2e 20  rs open on pBt. 
18880 54 68 69 73 20 69 73 20 66 6f 72 20 75 73 65 0a  This is for use.
18890 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20 65  ** in assert() e
188a0 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69  xpressions, so i
188b0 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c  t is only compil
188c0 65 64 20 69 66 20 4e 44 45 42 55 47 20 69 73 20  ed if NDEBUG is 
188d0 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a  not.** defined..
188e0 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65  **.** Only write
188f0 20 63 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75   cursors are cou
18900 6e 74 65 64 20 69 66 20 77 72 4f 6e 6c 79 20 69  nted if wrOnly i
18910 73 20 74 72 75 65 2e 20 20 49 66 20 77 72 4f 6e  s true.  If wrOn
18920 6c 79 20 69 73 0a 2a 2a 20 66 61 6c 73 65 20 74  ly is.** false t
18930 68 65 6e 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  hen all cursors 
18940 61 72 65 20 63 6f 75 6e 74 65 64 2e 0a 2a 2a 0a  are counted..**.
18950 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
18960 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74  ses of this rout
18970 69 6e 65 2c 20 61 20 63 75 72 73 6f 72 20 69 73  ine, a cursor is
18980 20 61 6e 79 20 63 75 72 73 6f 72 20 74 68 61 74   any cursor that
18990 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c 65 20 6f  .** is capable o
189a0 66 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  f reading or wri
189b0 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
189c0 62 61 73 65 2e 20 20 43 75 72 73 6f 72 73 20 74  base.  Cursors t
189d0 68 61 74 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e  hat.** have been
189e0 20 74 72 69 70 70 65 64 20 69 6e 74 6f 20 74 68   tripped into th
189f0 65 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 73  e CURSOR_FAULT s
18a00 74 61 74 65 20 61 72 65 20 6e 6f 74 20 63 6f 75  tate are not cou
18a10 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nted..*/.static 
18a20 69 6e 74 20 63 6f 75 6e 74 56 61 6c 69 64 43 75  int countValidCu
18a30 72 73 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a  rsors(BtShared *
18a40 70 42 74 2c 20 69 6e 74 20 77 72 4f 6e 6c 79 29  pBt, int wrOnly)
18a50 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  {.  BtCursor *pC
18a60 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b  ur;.  int r = 0;
18a70 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d  .  for(pCur=pBt-
18a80 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20  >pCursor; pCur; 
18a90 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74  pCur=pCur->pNext
18aa0 29 7b 0a 20 20 20 20 69 66 28 20 28 77 72 4f 6e  ){.    if( (wrOn
18ab0 6c 79 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e  ly==0 || (pCur->
18ac0 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
18ad0 57 72 69 74 65 46 6c 61 67 29 21 3d 30 29 0a 20  WriteFlag)!=0). 
18ae0 20 20 20 20 26 26 20 70 43 75 72 2d 3e 65 53 74      && pCur->eSt
18af0 61 74 65 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate!=CURSOR_FAUL
18b00 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20  T ) r++; .  }.  
18b10 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64  return r;.}.#end
18b20 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  if../*.** If the
18b30 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
18b40 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e  nding cursors an
18b50 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20  d we are not in 
18b60 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66  the middle.** of
18b70 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62   a transaction b
18b80 75 74 20 74 68 65 72 65 20 69 73 20 61 20 72 65  ut there is a re
18b90 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
18ba0 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a  atabase, then.**
18bb0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e   this routine un
18bc0 72 65 66 73 20 74 68 65 20 66 69 72 73 74 20 70  refs the first p
18bd0 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
18be0 61 73 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a  ase file which .
18bf0 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66 65 63  ** has the effec
18c00 74 20 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74  t of releasing t
18c10 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a  he read lock..**
18c20 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20  .** If there is 
18c30 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  a transaction in
18c40 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20   progress, this 
18c50 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
18c60 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
18c70 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  id unlockBtreeIf
18c80 55 6e 75 73 65 64 28 42 74 53 68 61 72 65 64 20  Unused(BtShared 
18c90 2a 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28  *pBt){.  assert(
18ca0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
18cb0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
18cc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 6f 75  );.  assert( cou
18cd0 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70  ntValidCursors(p
18ce0 42 74 2c 30 29 3d 3d 30 20 7c 7c 20 70 42 74 2d  Bt,0)==0 || pBt-
18cf0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 54  >inTransaction>T
18d00 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69  RANS_NONE );.  i
18d10 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  f( pBt->inTransa
18d20 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  ction==TRANS_NON
18d30 45 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31  E && pBt->pPage1
18d40 21 3d 30 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61  !=0 ){.    MemPa
18d50 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74  ge *pPage1 = pBt
18d60 2d 3e 70 50 61 67 65 31 3b 0a 20 20 20 20 61 73  ->pPage1;.    as
18d70 73 65 72 74 28 20 70 50 61 67 65 31 2d 3e 61 44  sert( pPage1->aD
18d80 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ata );.    asser
18d90 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  t( sqlite3PagerR
18da0 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  efcount(pBt->pPa
18db0 67 65 72 29 3d 3d 31 20 29 3b 0a 20 20 20 20 70  ger)==1 );.    p
18dc0 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a  Bt->pPage1 = 0;.
18dd0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e      releasePageN
18de0 6f 74 4e 75 6c 6c 28 70 50 61 67 65 31 29 3b 0a  otNull(pPage1);.
18df0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    }.}../*.** If 
18e00 70 42 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e  pBt points to an
18e10 20 65 6d 70 74 79 20 66 69 6c 65 20 74 68 65 6e   empty file then
18e20 20 63 6f 6e 76 65 72 74 20 74 68 61 74 20 65 6d   convert that em
18e30 70 74 79 20 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f  pty file.** into
18e40 20 61 20 6e 65 77 20 65 6d 70 74 79 20 64 61 74   a new empty dat
18e50 61 62 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c  abase by initial
18e60 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  izing the first 
18e70 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20 64  page of.** the d
18e80 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  atabase..*/.stat
18e90 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61  ic int newDataba
18ea0 73 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  se(BtShared *pBt
18eb0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
18ec0 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  1;.  unsigned ch
18ed0 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20  ar *data;.  int 
18ee0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
18ef0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
18f00 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
18f10 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67  .  if( pBt->nPag
18f20 65 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  e>0 ){.    retur
18f30 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
18f40 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50  .  pP1 = pBt->pP
18f50 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20  age1;.  assert( 
18f60 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61  pP1!=0 );.  data
18f70 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20   = pP1->aData;. 
18f80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
18f90 65 72 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62  erWrite(pP1->pDb
18fa0 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
18fb0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d  ) return rc;.  m
18fc0 65 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67  emcpy(data, zMag
18fd0 69 63 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66  icHeader, sizeof
18fe0 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b  (zMagicHeader));
18ff0 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f  .  assert( sizeo
19000 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d  f(zMagicHeader)=
19010 3d 31 36 20 29 3b 0a 20 20 64 61 74 61 5b 31 36  =16 );.  data[16
19020 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70  ] = (u8)((pBt->p
19030 61 67 65 53 69 7a 65 3e 3e 38 29 26 30 78 66 66  ageSize>>8)&0xff
19040 29 3b 0a 20 20 64 61 74 61 5b 31 37 5d 20 3d 20  );.  data[17] = 
19050 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53  (u8)((pBt->pageS
19060 69 7a 65 3e 3e 31 36 29 26 30 78 66 66 29 3b 0a  ize>>16)&0xff);.
19070 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a    data[18] = 1;.
19080 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a    data[19] = 1;.
19090 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75    assert( pBt->u
190a0 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d 3e  sableSize<=pBt->
190b0 70 61 67 65 53 69 7a 65 20 26 26 20 70 42 74 2d  pageSize && pBt-
190c0 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32 35 35 3e  >usableSize+255>
190d0 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b  =pBt->pageSize);
190e0 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20 28 75  .  data[20] = (u
190f0 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  8)(pBt->pageSize
19100 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   - pBt->usableSi
19110 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20  ze);.  data[21] 
19120 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d  = 64;.  data[22]
19130 20 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b 32 33   = 32;.  data[23
19140 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74  ] = 32;.  memset
19150 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31  (&data[24], 0, 1
19160 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61  00-24);.  zeroPa
19170 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b  ge(pP1, PTF_INTK
19180 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f  EY|PTF_LEAF|PTF_
19190 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42  LEAFDATA );.  pB
191a0 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
191b0 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
191c0 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  D;.#ifndef SQLIT
191d0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
191e0 4d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  M.  assert( pBt-
191f0 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c  >autoVacuum==1 |
19200 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  | pBt->autoVacuu
19210 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  m==0 );.  assert
19220 28 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  ( pBt->incrVacuu
19230 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63  m==1 || pBt->inc
19240 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20  rVacuum==0 );.  
19250 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33  put4byte(&data[3
19260 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61  6 + 4*4], pBt->a
19270 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70 75  utoVacuum);.  pu
19280 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20  t4byte(&data[36 
19290 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63  + 7*4], pBt->inc
192a0 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66  rVacuum);.#endif
192b0 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20  .  pBt->nPage = 
192c0 31 3b 0a 20 20 64 61 74 61 5b 33 31 5d 20 3d 20  1;.  data[31] = 
192d0 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  1;.  return SQLI
192e0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
192f0 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 66  Initialize the f
19300 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
19310 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
19320 63 72 65 61 74 69 6e 67 20 61 20 64 61 74 61 62  creating a datab
19330 61 73 65 0a 2a 2a 20 63 6f 6e 73 69 73 74 69 6e  ase.** consistin
19340 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61  g of a single pa
19350 67 65 20 61 6e 64 20 6e 6f 20 73 63 68 65 6d 61  ge and no schema
19360 20 6f 62 6a 65 63 74 73 29 2e 20 52 65 74 75 72   objects). Retur
19370 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69  n SQLITE_OK.** i
19380 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72  f successful, or
19390 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
193a0 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e   code otherwise.
193b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
193c0 74 72 65 65 4e 65 77 44 62 28 42 74 72 65 65 20  treeNewDb(Btree 
193d0 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
193e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
193f0 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d  er(p);.  p->pBt-
19400 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 63  >nPage = 0;.  rc
19410 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70   = newDatabase(p
19420 2d 3e 70 42 74 29 3b 0a 20 20 73 71 6c 69 74 65  ->pBt);.  sqlite
19430 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
19440 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
19450 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
19460 20 73 74 61 72 74 20 61 20 6e 65 77 20 74 72 61   start a new tra
19470 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74  nsaction. A writ
19480 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  e-transaction.**
19490 20 69 73 20 73 74 61 72 74 65 64 20 69 66 20 74   is started if t
194a0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
194b0 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f  nt is nonzero, o
194c0 74 68 65 72 77 69 73 65 20 61 20 72 65 61 64 2d  therwise a read-
194d0 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
194e0 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20    If the second 
194f0 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72  argument is 2 or
19500 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73   more and exclus
19510 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ive.** transacti
19520 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d  on is started, m
19530 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f  eaning that no o
19540 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20  ther process is 
19550 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63  allowed.** to ac
19560 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73  cess the databas
19570 65 2e 20 20 41 20 70 72 65 65 78 69 73 74 69 6e  e.  A preexistin
19580 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61  g transaction ma
19590 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72  y not be.** upgr
195a0 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76  aded to exclusiv
195b0 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69  e by calling thi
195c0 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f  s routine a seco
195d0 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a  nd time - the.**
195e0 20 65 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61   exclusivity fla
195f0 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72  g only works for
19600 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
19610 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74  on..**.** A writ
19620 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  e-transaction mu
19630 73 74 20 62 65 20 73 74 61 72 74 65 64 20 62 65  st be started be
19640 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20  fore attempting 
19650 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20  any .** changes 
19660 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
19670 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f    None of the fo
19680 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73  llowing routines
19690 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75   .** will work u
196a0 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63 74  nless a transact
196b0 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20 66  ion is started f
196c0 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  irst:.**.**     
196d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65   sqlite3BtreeCre
196e0 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20  ateTable().**   
196f0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
19700 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20  reateIndex().** 
19710 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
19720 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a  eClearTable().**
19730 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
19740 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a  eeDropTable().**
19750 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
19760 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20  eeInsert().**   
19770 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44     sqlite3BtreeD
19780 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20  elete().**      
19790 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61  sqlite3BtreeUpda
197a0 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49  teMeta().**.** I
197b0 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74  f an initial att
197c0 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65 20  empt to acquire 
197d0 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62  the lock fails b
197e0 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63  ecause of lock c
197f0 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64  ontention.** and
19800 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61   the database wa
19810 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c  s previously unl
19820 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f  ocked, then invo
19830 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
19840 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20  ler.** if there 
19850 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20  is one.  But if 
19860 74 68 65 72 65 20 77 61 73 20 70 72 65 76 69 6f  there was previo
19870 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b  usly a read-lock
19880 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f  , do not.** invo
19890 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
198a0 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72  ler - just retur
198b0 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20  n SQLITE_BUSY.  
198c0 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a  SQLITE_BUSY is .
198d0 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e  ** returned when
198e0 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
198f0 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e  y a read-lock in
19900 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20   order to avoid 
19910 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  a deadlock..**.*
19920 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72 65 20  * Suppose there 
19930 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65  are two processe
19940 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61  s A and B.  A ha
19950 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e  s a read lock an
19960 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73  d B has.** a res
19970 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74  erved lock.  B t
19980 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20  ries to promote 
19990 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 75 74  to exclusive but
199a0 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61   is blocked beca
199b0 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65  use.** of A's re
199c0 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65  ad lock.  A trie
199d0 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20  s to promote to 
199e0 72 65 73 65 72 76 65 64 20 62 75 74 20 69 73 20  reserved but is 
199f0 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a  blocked by B..**
19a00 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65   One or the othe
19a10 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f  r of the two pro
19a20 63 65 73 73 65 73 20 6d 75 73 74 20 67 69 76 65  cesses must give
19a30 20 77 61 79 20 6f 72 20 74 68 65 72 65 20 63 61   way or there ca
19a40 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72  n be.** no progr
19a50 65 73 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69  ess.  By returni
19a60 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61  ng SQLITE_BUSY a
19a70 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20  nd not invoking 
19a80 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  the busy callbac
19a90 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65  k.** when A alre
19aa0 61 64 79 20 68 61 73 20 61 20 72 65 61 64 20 6c  ady has a read l
19ab0 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67  ock, we encourag
19ac0 65 20 41 20 74 6f 20 67 69 76 65 20 75 70 20 61  e A to give up a
19ad0 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63  nd let B.** proc
19ae0 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  eed..*/.int sqli
19af0 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61  te3BtreeBeginTra
19b00 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ns(Btree *p, int
19b10 20 77 72 66 6c 61 67 29 7b 0a 20 20 73 71 6c 69   wrflag){.  sqli
19b20 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b  te3 *pBlock = 0;
19b30 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
19b40 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74   = p->pBt;.  int
19b50 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
19b60 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
19b70 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65  Enter(p);.  btre
19b80 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a  eIntegrity(p);..
19b90 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65    /* If the btre
19ba0 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
19bb0 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
19bc0 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20  ion, or it.  ** 
19bd0 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20  is already in a 
19be0 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
19bf0 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e   and a read-tran
19c00 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  saction.  ** is 
19c10 72 65 71 75 65 73 74 65 64 2c 20 74 68 69 73 20  requested, this 
19c20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f  is a no-op..  */
19c30 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
19c40 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c  s==TRANS_WRITE |
19c50 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  | (p->inTrans==T
19c60 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72  RANS_READ && !wr
19c70 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74  flag) ){.    got
19c80 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
19c90 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74   }.  assert( pBt
19ca0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
19cb0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20  =TRANS_WRITE || 
19cc0 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d  IfNotOmitAV(pBt-
19cd0 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 3d 3d 30  >bDoTruncate)==0
19ce0 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20   );..  /* Write 
19cf0 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
19d00 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e   not possible on
19d10 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74   a read-only dat
19d20 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 28  abase */.  if( (
19d30 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
19d40 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d  BTS_READ_ONLY)!=
19d50 30 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  0 && wrflag ){. 
19d60 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
19d70 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74  EADONLY;.    got
19d80 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
19d90 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
19da0 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
19db0 41 43 48 45 0a 20 20 2f 2a 20 49 66 20 61 6e 6f  ACHE.  /* If ano
19dc0 74 68 65 72 20 64 61 74 61 62 61 73 65 20 68 61  ther database ha
19dd0 6e 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79  ndle has already
19de0 20 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65 20   opened a write 
19df0 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a  transaction .  *
19e00 2a 20 6f 6e 20 74 68 69 73 20 73 68 61 72 65 64  * on this shared
19e10 2d 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65  -btree structure
19e20 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 77 72   and a second wr
19e30 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
19e40 69 73 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65  is.  ** requeste
19e50 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  d, return SQLITE
19e60 5f 4c 4f 43 4b 45 44 2e 0a 20 20 2a 2f 0a 20 20  _LOCKED..  */.  
19e70 69 66 28 20 28 77 72 66 6c 61 67 20 26 26 20 70  if( (wrflag && p
19e80 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
19e90 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 0a  n==TRANS_WRITE).
19ea0 20 20 20 7c 7c 20 28 70 42 74 2d 3e 62 74 73 46     || (pBt->btsF
19eb0 6c 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49  lags & BTS_PENDI
19ec0 4e 47 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20  NG)!=0.  ){.    
19ed0 70 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57  pBlock = pBt->pW
19ee0 72 69 74 65 72 2d 3e 64 62 3b 0a 20 20 7d 65 6c  riter->db;.  }el
19ef0 73 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20  se if( wrflag>1 
19f00 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70  ){.    BtLock *p
19f10 49 74 65 72 3b 0a 20 20 20 20 66 6f 72 28 70 49  Iter;.    for(pI
19f20 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ter=pBt->pLock; 
19f30 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74  pIter; pIter=pIt
19f40 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  er->pNext){.    
19f50 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74    if( pIter->pBt
19f60 72 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree!=p ){.      
19f70 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72    pBlock = pIter
19f80 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20  ->pBtree->db;.  
19f90 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
19fa0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
19fb0 20 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a 20   if( pBlock ){. 
19fc0 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63     sqlite3Connec
19fd0 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64  tionBlocked(p->d
19fe0 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20  b, pBlock);.    
19ff0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  rc = SQLITE_LOCK
1a000 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a  ED_SHAREDCACHE;.
1a010 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62      goto trans_b
1a020 65 67 75 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  egun;.  }.#endif
1a030 0a 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d  ..  /* Any read-
1a040 6f 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77 72 69  only or read-wri
1a050 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
1a060 6d 70 6c 69 65 73 20 61 20 72 65 61 64 2d 6c 6f  mplies a read-lo
1a070 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65  ck on .  ** page
1a080 20 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f   1. So if some o
1a090 74 68 65 72 20 73 68 61 72 65 64 2d 63 61 63 68  ther shared-cach
1a0a0 65 20 63 6c 69 65 6e 74 20 61 6c 72 65 61 64 79  e client already
1a0b0 20 68 61 73 20 61 20 77 72 69 74 65 2d 6c 6f 63   has a write-loc
1a0c0 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20  k .  ** on page 
1a0d0 31 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  1, the transacti
1a0e0 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65  on cannot be ope
1a0f0 6e 65 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71  ned. */.  rc = q
1a100 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
1a110 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54  ableLock(p, MAST
1a120 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f  ER_ROOT, READ_LO
1a130 43 4b 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  CK);.  if( SQLIT
1a140 45 5f 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20  E_OK!=rc ) goto 
1a150 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20  trans_begun;..  
1a160 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d  pBt->btsFlags &=
1a170 20 7e 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f   ~BTS_INITIALLY_
1a180 45 4d 50 54 59 3b 0a 20 20 69 66 28 20 70 42 74  EMPTY;.  if( pBt
1a190 2d 3e 6e 50 61 67 65 3d 3d 30 20 29 20 70 42 74  ->nPage==0 ) pBt
1a1a0 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
1a1b0 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54  S_INITIALLY_EMPT
1a1c0 59 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a  Y;.  do {.    /*
1a1d0 20 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28   Call lockBtree(
1a1e0 29 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20 70  ) until either p
1a1f0 42 74 2d 3e 70 50 61 67 65 31 20 69 73 20 70 6f  Bt->pPage1 is po
1a200 70 75 6c 61 74 65 64 20 6f 72 0a 20 20 20 20 2a  pulated or.    *
1a210 2a 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 72 65  * lockBtree() re
1a220 74 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20  turns something 
1a230 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
1a240 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28  E_OK. lockBtree(
1a250 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72 65 74  ).    ** may ret
1a260 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75  urn SQLITE_OK bu
1a270 74 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61  t leave pBt->pPa
1a280 67 65 31 20 73 65 74 20 74 6f 20 30 20 69 66 20  ge1 set to 0 if 
1a290 61 66 74 65 72 0a 20 20 20 20 2a 2a 20 72 65 61  after.    ** rea
1a2a0 64 69 6e 67 20 70 61 67 65 20 31 20 69 74 20 64  ding page 1 it d
1a2b0 69 73 63 6f 76 65 72 73 20 74 68 61 74 20 74 68  iscovers that th
1a2c0 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74  e page-size of t
1a2d0 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20  he database .   
1a2e0 20 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74 20   ** file is not 
1a2f0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49  pBt->pageSize. I
1a300 6e 20 74 68 69 73 20 63 61 73 65 20 6c 6f 63 6b  n this case lock
1a310 42 74 72 65 65 28 29 20 77 69 6c 6c 20 75 70 64  Btree() will upd
1a320 61 74 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e  ate.    ** pBt->
1a330 70 61 67 65 53 69 7a 65 20 74 6f 20 74 68 65 20  pageSize to the 
1a340 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65  page-size of the
1a350 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20   file on disk.. 
1a360 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28     */.    while(
1a370 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
1a380 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72  && SQLITE_OK==(r
1a390 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42  c = lockBtree(pB
1a3a0 74 29 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  t)) );..    if( 
1a3b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1a3c0 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20   wrflag ){.     
1a3d0 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c   if( (pBt->btsFl
1a3e0 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f  ags & BTS_READ_O
1a3f0 4e 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  NLY)!=0 ){.     
1a400 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
1a410 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d  EADONLY;.      }
1a420 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
1a430 74 20 65 78 46 6c 61 67 20 3d 20 28 70 2d 3e 64  t exFlag = (p->d
1a440 62 2d 3e 62 55 6e 6c 6f 63 6b 65 64 20 26 26 20  b->bUnlocked && 
1a450 21 49 53 41 55 54 4f 56 41 43 55 55 4d 29 20 3f  !ISAUTOVACUUM) ?
1a460 20 2d 31 20 3a 20 28 77 72 66 6c 61 67 3e 31 29   -1 : (wrflag>1)
1a470 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62 53  ;.        int bS
1a480 75 62 6a 49 6e 4d 65 6d 20 3d 20 73 71 6c 69 74  ubjInMem = sqlit
1a490 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 70  e3TempInMemory(p
1a4a0 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 61  ->db);.        a
1a4b0 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 62 55  ssert( p->db->bU
1a4c0 6e 6c 6f 63 6b 65 64 3d 3d 30 20 7c 7c 20 77 72  nlocked==0 || wr
1a4d0 66 6c 61 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20  flag==1 );.     
1a4e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1a4f0 61 67 65 72 42 65 67 69 6e 28 70 42 74 2d 3e 70  agerBegin(pBt->p
1a500 50 61 67 65 72 2c 20 65 78 46 6c 61 67 2c 20 62  Pager, exFlag, b
1a510 53 75 62 6a 49 6e 4d 65 6d 29 3b 0a 20 20 20 20  SubjInMem);.    
1a520 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1a530 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1a540 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62     rc = newDatab
1a550 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ase(pBt);.      
1a560 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1a570 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72 63 21  }.  .    if( rc!
1a580 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a590 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
1a5a0 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
1a5b0 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 28 72    }.  }while( (r
1a5c0 63 26 30 78 46 46 29 3d 3d 53 51 4c 49 54 45 5f  c&0xFF)==SQLITE_
1a5d0 42 55 53 59 20 26 26 20 70 42 74 2d 3e 69 6e 54  BUSY && pBt->inT
1a5e0 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
1a5f0 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20 20  S_NONE &&.      
1a600 20 20 20 20 62 74 72 65 65 49 6e 76 6f 6b 65 42      btreeInvokeB
1a610 75 73 79 48 61 6e 64 6c 65 72 28 70 42 74 29 20  usyHandler(pBt) 
1a620 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
1a630 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
1a640 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
1a650 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  RANS_NONE ){.   
1a660 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63     pBt->nTransac
1a670 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66 20  tion++;.#ifndef 
1a680 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
1a690 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20 69  ED_CACHE.      i
1a6a0 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  f( p->sharable )
1a6b0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
1a6c0 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65  ( p->lock.pBtree
1a6d0 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f 63 6b 2e 69  ==p && p->lock.i
1a6e0 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20  Table==1 );.    
1a6f0 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63      p->lock.eLoc
1a700 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20  k = READ_LOCK;. 
1a710 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 70         p->lock.p
1a720 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63  Next = pBt->pLoc
1a730 6b 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  k;.        pBt->
1a740 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f 63 6b  pLock = &p->lock
1a750 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
1a760 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e  .    }.    p->in
1a770 54 72 61 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f  Trans = (wrflag?
1a780 54 52 41 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e  TRANS_WRITE:TRAN
1a790 53 5f 52 45 41 44 29 3b 0a 20 20 20 20 69 66 28  S_READ);.    if(
1a7a0 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d   p->inTrans>pBt-
1a7b0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  >inTransaction )
1a7c0 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54  {.      pBt->inT
1a7d0 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e  ransaction = p->
1a7e0 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 20  inTrans;.    }. 
1a7f0 20 20 20 69 66 28 20 77 72 66 6c 61 67 20 29 7b     if( wrflag ){
1a800 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
1a810 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50  pPage1 = pBt->pP
1a820 61 67 65 31 3b 0a 23 69 66 6e 64 65 66 20 53 51  age1;.#ifndef SQ
1a830 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
1a840 5f 43 41 43 48 45 0a 20 20 20 20 20 20 61 73 73  _CACHE.      ass
1a850 65 72 74 28 20 21 70 42 74 2d 3e 70 57 72 69 74  ert( !pBt->pWrit
1a860 65 72 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  er );.      pBt-
1a870 3e 70 57 72 69 74 65 72 20 3d 20 70 3b 0a 20 20  >pWriter = p;.  
1a880 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
1a890 73 20 26 3d 20 7e 42 54 53 5f 45 58 43 4c 55 53  s &= ~BTS_EXCLUS
1a8a0 49 56 45 3b 0a 20 20 20 20 20 20 69 66 28 20 77  IVE;.      if( w
1a8b0 72 66 6c 61 67 3e 31 20 29 20 70 42 74 2d 3e 62  rflag>1 ) pBt->b
1a8c0 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 45  tsFlags |= BTS_E
1a8d0 58 43 4c 55 53 49 56 45 3b 0a 23 65 6e 64 69 66  XCLUSIVE;.#endif
1a8e0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
1a8f0 65 20 64 62 2d 73 69 7a 65 20 68 65 61 64 65 72  e db-size header
1a900 20 66 69 65 6c 64 20 69 73 20 69 6e 63 6f 72 72   field is incorr
1a910 65 63 74 20 28 61 73 20 69 74 20 6d 61 79 20 62  ect (as it may b
1a920 65 20 69 66 20 61 6e 20 6f 6c 64 0a 20 20 20 20  e if an old.    
1a930 20 20 2a 2a 20 63 6c 69 65 6e 74 20 68 61 73 20    ** client has 
1a940 62 65 65 6e 20 77 72 69 74 69 6e 67 20 74 68 65  been writing the
1a950 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c   database file),
1a960 20 75 70 64 61 74 65 20 69 74 20 6e 6f 77 2e 20   update it now. 
1a970 44 6f 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74  Doing.      ** t
1a980 68 69 73 20 73 6f 6f 6e 65 72 20 72 61 74 68 65  his sooner rathe
1a990 72 20 74 68 61 6e 20 6c 61 74 65 72 20 6d 65 61  r than later mea
1a9a0 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
1a9b0 73 69 7a 65 20 63 61 6e 20 73 61 66 65 6c 79 20  size can safely 
1a9c0 0a 20 20 20 20 20 20 2a 2a 20 72 65 2d 72 65 61  .      ** re-rea
1a9d0 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
1a9e0 69 7a 65 20 66 72 6f 6d 20 70 61 67 65 20 31 20  ize from page 1 
1a9f0 69 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 6f  if a savepoint o
1aa00 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  r transaction.  
1aa10 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20      ** rollback 
1aa20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
1aa30 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
1aa40 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
1aa50 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 67 65  ( pBt->nPage!=ge
1aa60 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
1aa70 61 44 61 74 61 5b 32 38 5d 29 20 29 7b 0a 20 20  aData[28]) ){.  
1aa80 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1aa90 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
1aaa0 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
1aab0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1aac0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1aad0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1aae0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38  pPage1->aData[28
1aaf0 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a  ], pBt->nPage);.
1ab00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ab10 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 74 72  }.    }.  }...tr
1ab20 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 69 66 28  ans_begun:.  if(
1ab30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1ab40 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  & wrflag ){.    
1ab50 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 61 6b  /* This call mak
1ab60 65 73 20 73 75 72 65 20 74 68 61 74 20 74 68 65  es sure that the
1ab70 20 70 61 67 65 72 20 68 61 73 20 74 68 65 20 63   pager has the c
1ab80 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20 6f 66  orrect number of
1ab90 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 20 73 61 76  .    ** open sav
1aba0 65 70 6f 69 6e 74 73 2e 20 49 66 20 74 68 65 20  epoints. If the 
1abb0 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
1abc0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
1abd0 20 30 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74 68   0 and.    ** th
1abe0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73  e sub-journal is
1abf0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
1ac00 6e 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20  n, then it will 
1ac10 62 65 20 6f 70 65 6e 65 64 20 68 65 72 65 2e 0a  be opened here..
1ac20 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
1ac30 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
1ac40 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70  Savepoint(pBt->p
1ac50 50 61 67 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53  Pager, p->db->nS
1ac60 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 0a  avepoint);.  }..
1ac70 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
1ac80 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  (p);.  sqlite3Bt
1ac90 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
1aca0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
1acb0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1acc0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a  _AUTOVACUUM../*.
1acd0 2a 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74  ** Set the point
1ace0 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66  er-map entries f
1acf0 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20  or all children 
1ad00 6f 66 20 70 61 67 65 20 70 50 61 67 65 2e 20 41  of page pPage. A
1ad10 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65  lso, if.** pPage
1ad20 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20   contains cells 
1ad30 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76  that point to ov
1ad40 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 73 65  erflow pages, se
1ad50 74 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a  t the pointer.**
1ad60 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72   map entries for
1ad70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
1ad80 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a  ges as well..*/.
1ad90 73 74 61 74 69 63 20 69 6e 74 20 73 65 74 43 68  static int setCh
1ada0 69 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d 50 61  ildPtrmaps(MemPa
1adb0 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e  ge *pPage){.  in
1adc0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
1add0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ade0 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61 72 69   /* Counter vari
1adf0 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  able */.  int nC
1ae00 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
1ae10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ae20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
1ae30 69 6e 20 70 61 67 65 20 70 50 61 67 65 20 2a 2f  in page pPage */
1ae40 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1ae50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae60 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1ae70 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68 61 72  code */.  BtShar
1ae80 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
1ae90 3e 70 42 74 3b 0a 20 20 75 38 20 69 73 49 6e 69  >pBt;.  u8 isIni
1aea0 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69  tOrig = pPage->i
1aeb0 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f 20 70 67  sInit;.  Pgno pg
1aec0 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f  no = pPage->pgno
1aed0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
1aee0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1aef0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
1af00 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 62 74 72  x) );.  rc = btr
1af10 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
1af20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1af30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
1af40 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72  to set_child_ptr
1af50 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  maps_out;.  }.  
1af60 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e  nCell = pPage->n
1af70 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  Cell;..  for(i=0
1af80 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
1af90 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d  .    u8 *pCell =
1afa0 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
1afb0 20 69 29 3b 0a 0a 20 20 20 20 70 74 72 6d 61 70   i);..    ptrmap
1afc0 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65  PutOvflPtr(pPage
1afd0 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a  , pCell, &rc);..
1afe0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
1aff0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67  leaf ){.      Pg
1b000 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67  no childPgno = g
1b010 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a  et4byte(pCell);.
1b020 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
1b030 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20  pBt, childPgno, 
1b040 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67  PTRMAP_BTREE, pg
1b050 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a  no, &rc);.    }.
1b060 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67    }..  if( !pPag
1b070 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50  e->leaf ){.    P
1b080 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20  gno childPgno = 
1b090 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
1b0a0 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
1b0b0 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
1b0c0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
1b0d0 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41  childPgno, PTRMA
1b0e0 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26  P_BTREE, pgno, &
1b0f0 72 63 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63 68  rc);.  }..set_ch
1b100 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3a  ild_ptrmaps_out:
1b110 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  .  pPage->isInit
1b120 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20   = isInitOrig;. 
1b130 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1b140 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f  *.** Somewhere o
1b150 6e 20 70 50 61 67 65 20 69 73 20 61 20 70 6f 69  n pPage is a poi
1b160 6e 74 65 72 20 74 6f 20 70 61 67 65 20 69 46 72  nter to page iFr
1b170 6f 6d 2e 20 20 4d 6f 64 69 66 79 20 74 68 69 73  om.  Modify this
1b180 20 70 6f 69 6e 74 65 72 20 73 6f 0a 2a 2a 20 74   pointer so.** t
1b190 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
1b1a0 20 69 54 6f 2e 20 50 61 72 61 6d 65 74 65 72 20   iTo. Parameter 
1b1b0 65 54 79 70 65 20 64 65 73 63 72 69 62 65 73 20  eType describes 
1b1c0 74 68 65 20 74 79 70 65 20 6f 66 20 70 6f 69 6e  the type of poin
1b1d0 74 65 72 20 74 6f 0a 2a 2a 20 62 65 20 6d 6f 64  ter to.** be mod
1b1e0 69 66 69 65 64 2c 20 61 73 20 20 66 6f 6c 6c 6f  ified, as  follo
1b1f0 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  ws:.**.** PTRMAP
1b200 5f 42 54 52 45 45 3a 20 20 20 20 20 70 50 61 67  _BTREE:     pPag
1b210 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67  e is a btree-pag
1b220 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70  e. The pointer p
1b230 6f 69 6e 74 73 20 61 74 20 61 20 63 68 69 6c 64  oints at a child
1b240 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20   .**            
1b250 20 20 20 20 20 20 20 70 61 67 65 20 6f 66 20 70         page of p
1b260 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  Page..**.** PTRM
1b270 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50  AP_OVERFLOW1: pP
1b280 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70  age is a btree-p
1b290 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  age. The pointer
1b2a0 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f 76   points at an ov
1b2b0 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20  erflow.**       
1b2c0 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65              page
1b2d0 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 6f   pointed to by o
1b2e0 6e 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20  ne of the cells 
1b2f0 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  on pPage..**.** 
1b300 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
1b310 3a 20 70 50 61 67 65 20 69 73 20 61 6e 20 6f 76  : pPage is an ov
1b320 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65  erflow-page. The
1b330 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
1b340 61 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20  at the next.**  
1b350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b360 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
1b370 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73  n the list..*/.s
1b380 74 61 74 69 63 20 69 6e 74 20 6d 6f 64 69 66 79  tatic int modify
1b390 50 61 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50  PagePointer(MemP
1b3a0 61 67 65 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f  age *pPage, Pgno
1b3b0 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f   iFrom, Pgno iTo
1b3c0 2c 20 75 38 20 65 54 79 70 65 29 7b 0a 20 20 61  , u8 eType){.  a
1b3d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1b3e0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
1b3f0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
1b400 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1b410 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
1b420 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
1b430 29 20 29 3b 0a 20 20 69 66 28 20 65 54 79 70 65  ) );.  if( eType
1b440 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
1b450 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  W2 ){.    /* The
1b460 20 70 6f 69 6e 74 65 72 20 69 73 20 61 6c 77 61   pointer is alwa
1b470 79 73 20 74 68 65 20 66 69 72 73 74 20 34 20 62  ys the first 4 b
1b480 79 74 65 73 20 6f 66 20 74 68 65 20 70 61 67 65  ytes of the page
1b490 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20   in this case.  
1b4a0 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74 34 62  */.    if( get4b
1b4b0 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
1b4c0 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  )!=iFrom ){.    
1b4d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b4e0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1b4f0 20 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74 65    }.    put4byte
1b500 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69  (pPage->aData, i
1b510 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  To);.  }else{.  
1b520 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20    u8 isInitOrig 
1b530 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b  = pPage->isInit;
1b540 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1b550 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 20 20 69  int nCell;.    i
1b560 6e 74 20 72 63 3b 0a 0a 20 20 20 20 72 63 20 3d  nt rc;..    rc =
1b570 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70   btreeInitPage(p
1b580 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1b590 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1b5a0 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65     nCell = pPage
1b5b0 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f  ->nCell;..    fo
1b5c0 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
1b5d0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a  i++){.      u8 *
1b5e0 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
1b5f0 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20  (pPage, i);.    
1b600 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
1b610 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b  MAP_OVERFLOW1 ){
1b620 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66  .        CellInf
1b630 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  o info;.        
1b640 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
1b650 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  l(pPage, pCell, 
1b660 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  &info);.        
1b670 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  if( info.iOverfl
1b680 6f 77 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  ow.         && p
1b690 43 65 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell+info.iOverf
1b6a0 6c 6f 77 2b 33 3c 3d 70 50 61 67 65 2d 3e 61 44  low+3<=pPage->aD
1b6b0 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50  ata+pPage->maskP
1b6c0 61 67 65 0a 20 20 20 20 20 20 20 20 20 26 26 20  age.         && 
1b6d0 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28  iFrom==get4byte(
1b6e0 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
1b6f0 72 66 6c 6f 77 5d 29 0a 20 20 20 20 20 20 20 20  rflow]).        
1b700 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  ){.          put
1b710 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
1b720 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54  o.iOverflow], iT
1b730 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  o);.          br
1b740 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
1b750 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1b760 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65      if( get4byte
1b770 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29  (pCell)==iFrom )
1b780 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  {.          put4
1b790 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29  byte(pCell, iTo)
1b7a0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
1b7b0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
1b7c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
1b7d0 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29    if( i==nCell )
1b7e0 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  {.      if( eTyp
1b7f0 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e!=PTRMAP_BTREE 
1b800 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 67 65  || .          ge
1b810 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
1b820 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
1b830 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d  ffset+8])!=iFrom
1b840 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
1b850 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1b860 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a  T_BKPT;.      }.
1b870 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1b880 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
1b890 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
1b8a0 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20  , iTo);.    }.. 
1b8b0 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
1b8c0 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20   = isInitOrig;. 
1b8d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1b8e0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
1b8f0 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64   Move the open d
1b900 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
1b910 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e  Page to location
1b920 20 69 46 72 65 65 50 61 67 65 20 69 6e 20 74 68   iFreePage in th
1b930 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  e .** database. 
1b940 54 68 65 20 70 44 62 50 61 67 65 20 72 65 66 65  The pDbPage refe
1b950 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61  rence remains va
1b960 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  lid..**.** The i
1b970 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 6e 64  sCommit flag ind
1b980 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 72  icates that ther
1b990 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
1b9a0 72 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 2a 2a  remember that.**
1b9b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65   the journal nee
1b9c0 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65  ds to be sync()e
1b9d0 64 20 62 65 66 6f 72 65 20 64 61 74 61 62 61 73  d before databas
1b9e0 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2d 3e  e page pDbPage->
1b9f0 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62 65 20  pgno .** can be 
1ba00 77 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20  written to. The 
1ba10 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61  caller has alrea
1ba20 64 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20  dy promised not 
1ba30 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 61 74  to write to that
1ba40 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  .** page..*/.sta
1ba50 74 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65  tic int relocate
1ba60 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
1ba70 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
1ba80 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d   /* Btree */.  M
1ba90 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c  emPage *pDbPage,
1baa0 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
1bab0 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a  page to move */.
1bac0 20 20 75 38 20 65 54 79 70 65 2c 20 20 20 20 20    u8 eType,     
1bad0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
1bae0 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65 27  inter map 'type'
1baf0 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61   entry for pDbPa
1bb00 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74  ge */.  Pgno iPt
1bb10 72 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  rPage,          
1bb20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
1bb30 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20  'page-no' entry 
1bb40 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20  for pDbPage */. 
1bb50 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65 2c   Pgno iFreePage,
1bb60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1bb70 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76   location to mov
1bb80 65 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a  e pDbPage to */.
1bb90 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20    int isCommit  
1bba0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 73             /* is
1bbb0 43 6f 6d 6d 69 74 20 66 6c 61 67 20 70 61 73 73  Commit flag pass
1bbc0 65 64 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ed to sqlite3Pag
1bbd0 65 72 4d 6f 76 65 70 61 67 65 20 2a 2f 0a 29 7b  erMovepage */.){
1bbe0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72  .  MemPage *pPtr
1bbf0 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70  Page;   /* The p
1bc00 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
1bc10 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  s a pointer to p
1bc20 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
1bc30 20 69 44 62 50 61 67 65 20 3d 20 70 44 62 50 61   iDbPage = pDbPa
1bc40 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65  ge->pgno;.  Page
1bc50 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d  r *pPager = pBt-
1bc60 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
1bc70 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54  c;..  assert( eT
1bc80 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
1bc90 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d  FLOW2 || eType==
1bca0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
1bcb0 20 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65   || .      eType
1bcc0 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c  ==PTRMAP_BTREE |
1bcd0 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
1bce0 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73  ROOTPAGE );.  as
1bcf0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1bd00 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
1bd10 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
1bd20 28 20 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d  ( pDbPage->pBt==
1bd30 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76  pBt );..  /* Mov
1bd40 65 20 70 61 67 65 20 69 44 62 50 61 67 65 20 66  e page iDbPage f
1bd50 72 6f 6d 20 69 74 73 20 63 75 72 72 65 6e 74 20  rom its current 
1bd60 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65  location to page
1bd70 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61 67   number iFreePag
1bd80 65 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41  e */.  TRACE(("A
1bd90 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e  UTOVACUUM: Movin
1bda0 67 20 25 64 20 74 6f 20 66 72 65 65 20 70 61 67  g %d to free pag
1bdb0 65 20 25 64 20 28 70 74 72 20 70 61 67 65 20 25  e %d (ptr page %
1bdc0 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a  d type %d)\n", .
1bdd0 20 20 20 20 20 20 69 44 62 50 61 67 65 2c 20 69        iDbPage, i
1bde0 46 72 65 65 50 61 67 65 2c 20 69 50 74 72 50 61  FreePage, iPtrPa
1bdf0 67 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72  ge, eType));.  r
1be00 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1be10 4d 6f 76 65 70 61 67 65 28 70 50 61 67 65 72 2c  Movepage(pPager,
1be20 20 70 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67   pDbPage->pDbPag
1be30 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 73  e, iFreePage, is
1be40 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72  Commit);.  if( r
1be50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1be60 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1be70 20 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67   }.  pDbPage->pg
1be80 6e 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a  no = iFreePage;.
1be90 0a 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65  .  /* If pDbPage
1bea0 20 77 61 73 20 61 20 62 74 72 65 65 2d 70 61 67   was a btree-pag
1beb0 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68  e, then it may h
1bec0 61 76 65 20 63 68 69 6c 64 20 70 61 67 65 73 20  ave child pages 
1bed0 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a  and/or cells.  *
1bee0 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  * that point to 
1bef0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
1bf00 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
1bf10 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
1bf20 74 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73  these.  ** pages
1bf30 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e   need to be chan
1bf40 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ged..  **.  ** I
1bf50 66 20 70 44 62 50 61 67 65 20 69 73 20 61 6e 20  f pDbPage is an 
1bf60 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74  overflow page, t
1bf70 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 34 20  hen the first 4 
1bf80 62 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20  bytes may store 
1bf90 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74  a.  ** pointer t
1bfa0 6f 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f  o a subsequent o
1bfb0 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66  verflow page. If
1bfc0 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
1bfd0 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65  e, then.  ** the
1bfe0 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65   pointer map nee
1bff0 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64  ds to be updated
1c000 20 66 6f 72 20 74 68 65 20 73 75 62 73 65 71 75   for the subsequ
1c010 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ent overflow pag
1c020 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54  e..  */.  if( eT
1c030 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype==PTRMAP_BTRE
1c040 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  E || eType==PTRM
1c050 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
1c060 20 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64     rc = setChild
1c070 50 74 72 6d 61 70 73 28 70 44 62 50 61 67 65 29  Ptrmaps(pDbPage)
1c080 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1c090 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1c0a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1c0b0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50  }.  }else{.    P
1c0c0 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67  gno nextOvfl = g
1c0d0 65 74 34 62 79 74 65 28 70 44 62 50 61 67 65 2d  et4byte(pDbPage-
1c0e0 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28  >aData);.    if(
1c0f0 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a   nextOvfl!=0 ){.
1c100 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
1c110 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50  pBt, nextOvfl, P
1c120 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c  TRMAP_OVERFLOW2,
1c130 20 69 46 72 65 65 50 61 67 65 2c 20 26 72 63 29   iFreePage, &rc)
1c140 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1c150 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1c160 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1c170 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1c180 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20  }..  /* Fix the 
1c190 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72  database pointer
1c1a0 20 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61 67   on page iPtrPag
1c1b0 65 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61  e that pointed a
1c1c0 74 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a  t iDbPage so.  *
1c1d0 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  * that it points
1c1e0 20 61 74 20 69 46 72 65 65 50 61 67 65 2e 20 41   at iFreePage. A
1c1f0 6c 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e  lso fix the poin
1c200 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f  ter map entry fo
1c210 72 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e  r.  ** iPtrPage.
1c220 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70  .  */.  if( eTyp
1c230 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e!=PTRMAP_ROOTPA
1c240 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62  GE ){.    rc = b
1c250 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
1c260 20 69 50 74 72 50 61 67 65 2c 20 26 70 50 74 72   iPtrPage, &pPtr
1c270 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66  Page, 0);.    if
1c280 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1c290 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1c2a0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
1c2b0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1c2c0 72 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70  rite(pPtrPage->p
1c2d0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
1c2e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1c2f0 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
1c300 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20  age(pPtrPage);. 
1c310 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1c320 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d      }.    rc = m
1c330 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72  odifyPagePointer
1c340 28 70 50 74 72 50 61 67 65 2c 20 69 44 62 50 61  (pPtrPage, iDbPa
1c350 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65  ge, iFreePage, e
1c360 54 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61  Type);.    relea
1c370 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29  sePage(pPtrPage)
1c380 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1c390 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1c3a0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
1c3b0 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65  iFreePage, eType
1c3c0 2c 20 69 50 74 72 50 61 67 65 2c 20 26 72 63 29  , iPtrPage, &rc)
1c3d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1c3e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46  turn rc;.}../* F
1c3f0 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
1c400 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79 20 69  on required by i
1c410 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e  ncrVacuumStep().
1c420 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61   */.static int a
1c430 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
1c440 28 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d  (BtShared *, Mem
1c450 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c  Page **, Pgno *,
1c460 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a   Pgno, u8);../*.
1c470 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e  ** Perform a sin
1c480 67 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69  gle step of an i
1c490 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75  ncremental-vacuu
1c4a0 6d 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  m. If successful
1c4b0 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49  , return.** SQLI
1c4c0 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20  TE_OK. If there 
1c4d0 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f  is no work to do
1c4e0 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20   (and therefore 
1c4f0 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 0a 2a 2a 20  no point in .** 
1c500 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e  calling this fun
1c510 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65  ction again), re
1c520 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
1c530 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f  . Or, if an erro
1c540 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 72 65  r .** occurs, re
1c550 74 75 72 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20  turn some other 
1c560 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  error code..**.*
1c570 2a 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63 61  * More specifica
1c580 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69  lly, this functi
1c590 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72  on attempts to r
1c5a0 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65 20 64  e-organize the d
1c5b0 61 74 61 62 61 73 65 20 73 6f 20 0a 2a 2a 20 74  atabase so .** t
1c5c0 68 61 74 20 74 68 65 20 6c 61 73 74 20 70 61 67  hat the last pag
1c5d0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 75  e of the file cu
1c5e0 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 69  rrently in use i
1c5f0 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75  s no longer in u
1c600 73 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65  se..**.** Parame
1c610 74 65 72 20 6e 46 69 6e 20 69 73 20 74 68 65 20  ter nFin is the 
1c620 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
1c630 74 68 61 74 20 74 68 69 73 20 64 61 74 61 62 61  that this databa
1c640 73 65 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e  se would contain
1c650 0a 2a 2a 20 77 65 72 65 20 74 68 69 73 20 66 75  .** were this fu
1c660 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 75 6e  nction called un
1c670 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73 20 53  til it returns S
1c680 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a  QLITE_DONE..**.*
1c690 2a 20 49 66 20 74 68 65 20 62 43 6f 6d 6d 69 74  * If the bCommit
1c6a0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
1c6b0 6e 2d 7a 65 72 6f 2c 20 74 68 69 73 20 66 75 6e  n-zero, this fun
1c6c0 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
1c6d0 61 74 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65  at the .** calle
1c6e0 72 20 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c  r will keep call
1c6f0 69 6e 67 20 69 6e 63 72 56 61 63 75 75 6d 53 74  ing incrVacuumSt
1c700 65 70 28 29 20 75 6e 74 69 6c 20 69 74 20 72 65  ep() until it re
1c710 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e  turns SQLITE_DON
1c720 45 20 0a 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f  E .** or an erro
1c730 72 2e 20 62 43 6f 6d 6d 69 74 20 69 73 20 70 61  r. bCommit is pa
1c740 73 73 65 64 20 74 72 75 65 20 66 6f 72 20 61 6e  ssed true for an
1c750 20 61 75 74 6f 2d 76 61 63 75 75 6d 2d 6f 6e 2d   auto-vacuum-on-
1c760 63 6f 6d 6d 69 74 20 0a 2a 2a 20 6f 70 65 72 61  commit .** opera
1c770 74 69 6f 6e 2c 20 6f 72 20 66 61 6c 73 65 20 66  tion, or false f
1c780 6f 72 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  or an incrementa
1c790 6c 20 76 61 63 75 75 6d 2e 0a 2a 2f 0a 73 74 61  l vacuum..*/.sta
1c7a0 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61 63 75  tic int incrVacu
1c7b0 75 6d 53 74 65 70 28 42 74 53 68 61 72 65 64 20  umStep(BtShared 
1c7c0 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c  *pBt, Pgno nFin,
1c7d0 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 2c 20 69   Pgno iLastPg, i
1c7e0 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 50  nt bCommit){.  P
1c7f0 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20 20  gno nFreeList;  
1c800 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1c810 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 69 6c  er of pages stil
1c820 6c 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  l on the free-li
1c830 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a  st */.  int rc;.
1c840 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1c850 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
1c860 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
1c870 73 73 65 72 74 28 20 69 4c 61 73 74 50 67 3e 6e  ssert( iLastPg>n
1c880 46 69 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21 50  Fin );..  if( !P
1c890 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
1c8a0 2c 20 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c  , iLastPg) && iL
1c8b0 61 73 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42  astPg!=PENDING_B
1c8c0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
1c8d0 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20  .    u8 eType;. 
1c8e0 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65     Pgno iPtrPage
1c8f0 3b 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74  ;..    nFreeList
1c900 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74   = get4byte(&pBt
1c910 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
1c920 33 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46  36]);.    if( nF
1c930 72 65 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  reeList==0 ){.  
1c940 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1c950 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20  E_DONE;.    }.. 
1c960 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
1c970 74 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20  t(pBt, iLastPg, 
1c980 26 65 54 79 70 65 2c 20 26 69 50 74 72 50 61 67  &eType, &iPtrPag
1c990 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
1c9a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1c9b0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1c9c0 20 20 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70    }.    if( eTyp
1c9d0 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e==PTRMAP_ROOTPA
1c9e0 47 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  GE ){.      retu
1c9f0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1ca00 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20  T_BKPT;.    }.. 
1ca10 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
1ca20 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b  RMAP_FREEPAGE ){
1ca30 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d  .      if( bComm
1ca40 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  it==0 ){.       
1ca50 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70   /* Remove the p
1ca60 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  age from the fil
1ca70 65 73 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68  es free-list. Th
1ca80 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  is is not requir
1ca90 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66  ed.        ** if
1caa0 20 62 43 6f 6d 6d 69 74 20 69 73 20 6e 6f 6e 2d   bCommit is non-
1cab0 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74 20 63 61  zero. In that ca
1cac0 73 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69 73  se, the free-lis
1cad0 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20  t will be.      
1cae0 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74    ** truncated t
1caf0 6f 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68 69  o zero after thi
1cb00 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
1cb10 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27  ns, so it doesn'
1cb20 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61  t .        ** ma
1cb30 74 74 65 72 20 69 66 20 69 74 20 73 74 69 6c 6c  tter if it still
1cb40 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67   contains some g
1cb50 61 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e 0a  arbage entries..
1cb60 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1cb70 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b     Pgno iFreePg;
1cb80 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65  .        MemPage
1cb90 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20   *pFreePg;.     
1cba0 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
1cbb0 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
1cbc0 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50  pFreePg, &iFreeP
1cbd0 67 2c 20 69 4c 61 73 74 50 67 2c 20 42 54 41 4c  g, iLastPg, BTAL
1cbe0 4c 4f 43 5f 45 58 41 43 54 29 3b 0a 20 20 20 20  LOC_EXACT);.    
1cbf0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1cc00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1cc10 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1cc20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1cc30 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3d  assert( iFreePg=
1cc40 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20  =iLastPg );.    
1cc50 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1cc60 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20  pFreePg);.      
1cc70 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  }.    } else {. 
1cc80 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50       Pgno iFreeP
1cc90 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  g;             /
1cca0 2a 20 49 6e 64 65 78 20 6f 66 20 66 72 65 65 20  * Index of free 
1ccb0 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61  page to move pLa
1ccc0 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20  stPg to */.     
1ccd0 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73 74 50   MemPage *pLastP
1cce0 67 3b 0a 20 20 20 20 20 20 75 38 20 65 4d 6f 64  g;.      u8 eMod
1ccf0 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 3b  e = BTALLOC_ANY;
1cd00 20 20 20 2f 2a 20 4d 6f 64 65 20 70 61 72 61 6d     /* Mode param
1cd10 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74  eter for allocat
1cd20 65 42 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a  eBtreePage() */.
1cd30 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 61 72        Pgno iNear
1cd40 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1cd50 2f 2a 20 6e 65 61 72 62 79 20 70 61 72 61 6d 65  /* nearby parame
1cd60 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65  ter for allocate
1cd70 42 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 0a  BtreePage() */..
1cd80 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
1cd90 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61  GetPage(pBt, iLa
1cda0 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20  stPg, &pLastPg, 
1cdb0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
1cdc0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1cdd0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1cde0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1cdf0 20 2f 2a 20 49 66 20 62 43 6f 6d 6d 69 74 20 69   /* If bCommit i
1ce00 73 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f  s zero, this loo
1ce10 70 20 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f  p runs exactly o
1ce20 6e 63 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61  nce and page pLa
1ce30 73 74 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73  stPg.      ** is
1ce40 20 73 77 61 70 70 65 64 20 77 69 74 68 20 74 68   swapped with th
1ce50 65 20 66 69 72 73 74 20 66 72 65 65 20 70 61 67  e first free pag
1ce60 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65  e pulled off the
1ce70 20 66 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20   free list..    
1ce80 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e    **.      ** On
1ce90 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
1cea0 20 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 67   if bCommit is g
1ceb0 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f  reater than zero
1cec0 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20  , then keep.    
1ced0 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74    ** looping unt
1cee0 69 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c  il a free-page l
1cef0 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20 74 68  ocated within th
1cf00 65 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67  e first nFin pag
1cf10 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  es.      ** of t
1cf20 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64  he file is found
1cf30 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1cf40 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20   if( bCommit==0 
1cf50 29 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65  ){.        eMode
1cf60 20 3d 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a 20   = BTALLOC_LE;. 
1cf70 20 20 20 20 20 20 20 69 4e 65 61 72 20 3d 20 6e         iNear = n
1cf80 46 69 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Fin;.      }.   
1cf90 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20     do {.        
1cfa0 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67  MemPage *pFreePg
1cfb0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  ;.        rc = a
1cfc0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
1cfd0 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20  (pBt, &pFreePg, 
1cfe0 26 69 46 72 65 65 50 67 2c 20 69 4e 65 61 72 2c  &iFreePg, iNear,
1cff0 20 65 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20   eMode);.       
1d000 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1d010 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1d020 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73  releasePage(pLas
1d030 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tPg);.          
1d040 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1d050 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c     }.        rel
1d060 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67  easePage(pFreePg
1d070 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28  );.      }while(
1d080 20 62 43 6f 6d 6d 69 74 20 26 26 20 69 46 72 65   bCommit && iFre
1d090 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20  ePg>nFin );.    
1d0a0 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50    assert( iFreeP
1d0b0 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20  g<iLastPg );.   
1d0c0 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20 72     .      rc = r
1d0d0 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c  elocatePage(pBt,
1d0e0 20 70 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c   pLastPg, eType,
1d0f0 20 69 50 74 72 50 61 67 65 2c 20 69 46 72 65 65   iPtrPage, iFree
1d100 50 67 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a 20 20  Pg, bCommit);.  
1d110 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1d120 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20  pLastPg);.      
1d130 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1d140 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
1d150 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
1d160 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
1d170 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20   bCommit==0 ){. 
1d180 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 69 4c     do {.      iL
1d190 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 77 68  astPg--;.    }wh
1d1a0 69 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d 50 45  ile( iLastPg==PE
1d1b0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
1d1c0 70 42 74 29 20 7c 7c 20 50 54 52 4d 41 50 5f 49  pBt) || PTRMAP_I
1d1d0 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74  SPAGE(pBt, iLast
1d1e0 50 67 29 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  Pg) );.    pBt->
1d1f0 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b  bDoTruncate = 1;
1d200 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20  .    pBt->nPage 
1d210 3d 20 69 4c 61 73 74 50 67 3b 0a 20 20 7d 0a 20  = iLastPg;.  }. 
1d220 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1d230 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  K;.}../*.** The 
1d240 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20  database opened 
1d250 62 79 20 74 68 65 20 66 69 72 73 74 20 61 72 67  by the first arg
1d260 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 75 74 6f  ument is an auto
1d270 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
1d280 0a 2a 2a 20 6e 4f 72 69 67 20 70 61 67 65 73 20  .** nOrig pages 
1d290 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69  in size containi
1d2a0 6e 67 20 6e 46 72 65 65 20 66 72 65 65 20 70 61  ng nFree free pa
1d2b0 67 65 73 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ges. Return the 
1d2c0 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 73 69 7a  expected .** siz
1d2d0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1d2e0 65 20 69 6e 20 70 61 67 65 73 20 66 6f 6c 6c 6f  e in pages follo
1d2f0 77 69 6e 67 20 61 6e 20 61 75 74 6f 2d 76 61 63  wing an auto-vac
1d300 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  uum operation..*
1d310 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 66 69  /.static Pgno fi
1d320 6e 61 6c 44 62 53 69 7a 65 28 42 74 53 68 61 72  nalDbSize(BtShar
1d330 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 4f  ed *pBt, Pgno nO
1d340 72 69 67 2c 20 50 67 6e 6f 20 6e 46 72 65 65 29  rig, Pgno nFree)
1d350 7b 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20  {.  int nEntry; 
1d360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d370 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1d380 20 65 6e 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20   entries on one 
1d390 70 74 72 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  ptrmap page */. 
1d3a0 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20   Pgno nPtrmap;  
1d3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d3c0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 74   /* Number of Pt
1d3d0 72 4d 61 70 20 70 61 67 65 73 20 74 6f 20 62 65  rMap pages to be
1d3e0 20 66 72 65 65 64 20 2a 2f 0a 20 20 50 67 6e 6f   freed */.  Pgno
1d3f0 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20 20   nFin;          
1d400 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1d410 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a  eturn value */..
1d420 20 20 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e    nEntry = pBt->
1d430 75 73 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20  usableSize/5;.  
1d440 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46 72 65 65  nPtrmap = (nFree
1d450 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50 41  -nOrig+PTRMAP_PA
1d460 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29  GENO(pBt, nOrig)
1d470 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b  +nEntry)/nEntry;
1d480 0a 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20  .  nFin = nOrig 
1d490 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61  - nFree - nPtrma
1d4a0 70 3b 0a 20 20 69 66 28 20 6e 4f 72 69 67 3e 50  p;.  if( nOrig>P
1d4b0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
1d4c0 28 70 42 74 29 20 26 26 20 6e 46 69 6e 3c 50 45  (pBt) && nFin<PE
1d4d0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
1d4e0 70 42 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e  pBt) ){.    nFin
1d4f0 2d 2d 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28  --;.  }.  while(
1d500 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
1d510 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69  Bt, nFin) || nFi
1d520 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  n==PENDING_BYTE_
1d530 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
1d540 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20   nFin--;.  }..  
1d550 72 65 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a  return nFin;.}..
1d560 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72  /*.** A write-tr
1d570 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
1d580 65 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20  e opened before 
1d590 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e  calling this fun
1d5a0 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72  ction..** It per
1d5b0 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75  forms a single u
1d5c0 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61  nit of work towa
1d5d0 72 64 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74  rds an increment
1d5e0 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a  al vacuum..**.**
1d5f0 20 49 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e   If the incremen
1d600 74 61 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69  tal vacuum is fi
1d610 6e 69 73 68 65 64 20 61 66 74 65 72 20 74 68 69  nished after thi
1d620 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72  s function has r
1d630 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f  un,.** SQLITE_DO
1d640 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  NE is returned. 
1d650 49 66 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e  If it is not fin
1d660 69 73 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72  ished, but no er
1d670 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a  ror occurred,.**
1d680 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1d690 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
1d6a0 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  e an SQLite erro
1d6b0 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20  r code. .*/.int 
1d6c0 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72  sqlite3BtreeIncr
1d6d0 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29  Vacuum(Btree *p)
1d6e0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
1d6f0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1d700 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33  >pBt;..  sqlite3
1d710 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
1d720 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
1d730 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
1d740 4e 53 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69  NS_WRITE && p->i
1d750 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
1d760 49 54 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42  ITE );.  if( !pB
1d770 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
1d780 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1d790 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _DONE;.  }else{.
1d7a0 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d      Pgno nOrig =
1d7b0 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
1d7c0 70 42 74 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e  pBt);.    Pgno n
1d7d0 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28  Free = get4byte(
1d7e0 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
1d7f0 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 50 67  ata[36]);.    Pg
1d800 6e 6f 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44  no nFin = finalD
1d810 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67  bSize(pBt, nOrig
1d820 2c 20 6e 46 72 65 65 29 3b 0a 0a 20 20 20 20 69  , nFree);..    i
1d830 66 28 20 6e 4f 72 69 67 3c 6e 46 69 6e 20 29 7b  f( nOrig<nFin ){
1d840 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1d850 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1d860 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  .    }else if( n
1d870 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Free>0 ){.      
1d880 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
1d890 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a  ors(pBt, 0, 0);.
1d8a0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1d8b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1d8c0 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c     invalidateAll
1d8d0 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42  OverflowCache(pB
1d8e0 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  t);.        rc =
1d8f0 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
1d900 70 42 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72 69 67  pBt, nFin, nOrig
1d910 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
1d920 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1d930 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1d940 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1d950 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61  erWrite(pBt->pPa
1d960 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
1d970 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
1d980 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
1d990 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50  ata[28], pBt->nP
1d9a0 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
1d9b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1d9c0 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
1d9d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
1d9e0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1d9f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1da00 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
1da10 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
1da20 70 72 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33  prior to sqlite3
1da30 50 61 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e  PagerCommit when
1da40 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   a transaction.*
1da50 2a 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 66  * is committed f
1da60 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  or an auto-vacuu
1da70 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  m database..**.*
1da80 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69  * If SQLITE_OK i
1da90 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e  s returned, then
1daa0 20 2a 70 6e 54 72 75 6e 63 20 69 73 20 73 65 74   *pnTrunc is set
1dab0 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
1dac0 66 20 70 61 67 65 73 0a 2a 2a 20 74 68 65 20 64  f pages.** the d
1dad0 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f  atabase file sho
1dae0 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65 64  uld be truncated
1daf0 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20 63   to during the c
1db00 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 20 0a  ommit process. .
1db10 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64 61 74 61  ** i.e. the data
1db20 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 72 65  base has been re
1db30 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20 74 68 61  organized so tha
1db40 74 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74  t only the first
1db50 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67   *pnTrunc.** pag
1db60 65 73 20 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a  es are in use..*
1db70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75 74  /.static int aut
1db80 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74  oVacuumCommit(Bt
1db90 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
1dba0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1dbb0 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  OK;.  Pager *pPa
1dbc0 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ger = pBt->pPage
1dbd0 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69  r;.  VVA_ONLY( i
1dbe0 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65  nt nRef = sqlite
1dbf0 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
1dc00 50 61 67 65 72 29 3b 20 29 0a 0a 20 20 61 73 73  Pager); )..  ass
1dc10 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1dc20 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
1dc30 65 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64  ex) );.  invalid
1dc40 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
1dc50 63 68 65 28 70 42 74 29 3b 0a 20 20 61 73 73 65  che(pBt);.  asse
1dc60 72 74 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  rt(pBt->autoVacu
1dc70 75 6d 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  um);.  if( !pBt-
1dc80 3e 69 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a 20  >incrVacuum ){. 
1dc90 20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20     Pgno nFin;   
1dca0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1dcb0 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61  of pages in data
1dcc0 62 61 73 65 20 61 66 74 65 72 20 61 75 74 6f 76  base after autov
1dcd0 61 63 75 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20  acuuming */.    
1dce0 50 67 6e 6f 20 6e 46 72 65 65 3b 20 20 20 20 20  Pgno nFree;     
1dcf0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1dd00 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
1dd10 65 6c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20  elist initially 
1dd20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 46 72 65  */.    Pgno iFre
1dd30 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  e;        /* The
1dd40 20 6e 65 78 74 20 70 61 67 65 20 74 6f 20 62 65   next page to be
1dd50 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 50 67   freed */.    Pg
1dd60 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20  no nOrig;       
1dd70 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a   /* Database siz
1dd80 65 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67  e before freeing
1dd90 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d   */..    nOrig =
1dda0 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
1ddb0 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 50 54  pBt);.    if( PT
1ddc0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
1ddd0 20 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67   nOrig) || nOrig
1dde0 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
1ddf0 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
1de00 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70    /* It is not p
1de10 6f 73 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74  ossible to creat
1de20 65 20 61 20 64 61 74 61 62 61 73 65 20 66 6f 72  e a database for
1de30 20 77 68 69 63 68 20 74 68 65 20 66 69 6e 61 6c   which the final
1de40 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69   page.      ** i
1de50 73 20 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74  s either a point
1de60 65 72 2d 6d 61 70 20 70 61 67 65 20 6f 72 20 74  er-map page or t
1de70 68 65 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20  he pending-byte 
1de80 70 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20  page. If one.   
1de90 20 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74     ** is encount
1dea0 65 72 65 64 2c 20 74 68 69 73 20 69 6e 64 69 63  ered, this indic
1deb0 61 74 65 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e  ates corruption.
1dec0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1ded0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1dee0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1def0 7d 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 67  }..    nFree = g
1df00 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  et4byte(&pBt->pP
1df10 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
1df20 3b 0a 20 20 20 20 6e 46 69 6e 20 3d 20 66 69 6e  ;.    nFin = fin
1df30 61 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f  alDbSize(pBt, nO
1df40 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a 20 20 20  rig, nFree);.   
1df50 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20   if( nFin>nOrig 
1df60 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1df70 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1df80 20 20 69 66 28 20 6e 46 69 6e 3c 6e 4f 72 69 67    if( nFin<nOrig
1df90 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1dfa0 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  aveAllCursors(pB
1dfb0 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  t, 0, 0);.    }.
1dfc0 20 20 20 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f      for(iFree=nO
1dfd0 72 69 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20  rig; iFree>nFin 
1dfe0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
1dff0 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20  ; iFree--){.    
1e000 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75    rc = incrVacuu
1e010 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c  mStep(pBt, nFin,
1e020 20 69 46 72 65 65 2c 20 31 29 3b 0a 20 20 20 20   iFree, 1);.    
1e030 7d 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53  }.    if( (rc==S
1e040 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63  QLITE_DONE || rc
1e050 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20  ==SQLITE_OK) && 
1e060 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20  nFree>0 ){.     
1e070 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1e080 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61  erWrite(pBt->pPa
1e090 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
1e0a0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1e0b0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1e0c0 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20  a[32], 0);.     
1e0d0 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e   put4byte(&pBt->
1e0e0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
1e0f0 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74  ], 0);.      put
1e100 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
1e110 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 6e  e1->aData[28], n
1e120 46 69 6e 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  Fin);.      pBt-
1e130 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31  >bDoTruncate = 1
1e140 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61  ;.      pBt->nPa
1e150 67 65 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 7d  ge = nFin;.    }
1e160 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1e170 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1e180 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
1e190 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
1e1a0 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
1e1b0 74 28 20 6e 52 65 66 3e 3d 73 71 6c 69 74 65 33  t( nRef>=sqlite3
1e1c0 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50  PagerRefcount(pP
1e1d0 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72  ager) );.  retur
1e1e0 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f  n rc;.}..#else /
1e1f0 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  * ifndef SQLITE_
1e200 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  OMIT_AUTOVACUUM 
1e210 2a 2f 0a 23 20 64 65 66 69 6e 65 20 73 65 74 43  */.# define setC
1e220 68 69 6c 64 50 74 72 6d 61 70 73 28 78 29 20 53  hildPtrmaps(x) S
1e230 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a  QLITE_OK.#endif.
1e240 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1e250 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72  ine does the fir
1e260 73 74 20 70 68 61 73 65 20 6f 66 20 61 20 74 77  st phase of a tw
1e270 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20  o-phase commit. 
1e280 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
1e290 20 63 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61   causes a rollba
1e2a0 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65  ck journal to be
1e2b0 20 63 72 65 61 74 65 64 20 28 69 66 20 69 74 20   created (if it 
1e2c0 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  does not already
1e2d0 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70   exist).** and p
1e2e0 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e  opulated with en
1e2f0 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ough information
1e300 20 73 6f 20 74 68 61 74 20 69 66 20 61 20 70 6f   so that if a po
1e310 77 65 72 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a  wer loss occurs.
1e320 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
1e330 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20  can be restored 
1e340 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
1e350 73 74 61 74 65 20 62 79 20 70 6c 61 79 69 6e 67  state by playing
1e360 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75   back.** the jou
1e370 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68 65 20  rnal.  Then the 
1e380 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
1e390 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c 75 73  journal are flus
1e3a0 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68  hed out to.** th
1e3b0 65 20 64 69 73 6b 2e 20 20 41 66 74 65 72 20 74  e disk.  After t
1e3c0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61  he journal is sa
1e3d0 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74  fely on oxide, t
1e3e0 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  he changes to th
1e3f0 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 61 72  e.** database ar
1e400 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
1e410 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1e420 20 61 6e 64 20 66 6c 75 73 68 65 64 20 74 6f 20   and flushed to 
1e430 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65  oxide..** At the
1e440 20 65 6e 64 20 6f 66 20 74 68 69 73 20 63 61 6c   end of this cal
1e450 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  l, the rollback 
1e460 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78  journal still ex
1e470 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64  ists on the.** d
1e480 69 73 6b 20 61 6e 64 20 77 65 20 61 72 65 20 73  isk and we are s
1e490 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c  till holding all
1e4a0 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20 74   locks, so the t
1e4b0 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e  ransaction has n
1e4c0 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e  ot.** committed.
1e4d0 20 20 53 65 65 20 73 71 6c 69 74 65 33 42 74 72    See sqlite3Btr
1e4e0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
1e4f0 28 29 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e  () for the secon
1e500 64 20 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a  d phase of the.*
1e510 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73  * commit process
1e520 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c  ..**.** This cal
1e530 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  l is a no-op if 
1e540 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  no write-transac
1e550 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c  tion is currentl
1e560 79 20 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e  y active on pBt.
1e570 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
1e580 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62  , sync the datab
1e590 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65  ase file for the
1e5a0 20 62 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73   btree pBt. zMas
1e5b0 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a  ter points to.**
1e5c0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d   the name of a m
1e5d0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1e5e0 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  le that should b
1e5f0 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
1e600 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c  he.** individual
1e610 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f   journal file, o
1e620 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63  r is NULL, indic
1e630 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20  ating no master 
1e640 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a  journal file .**
1e650 20 28 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73   (single databas
1e660 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a  e transaction)..
1e670 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
1e680 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d  is called, the m
1e690 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68  aster journal sh
1e6a0 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76  ould already hav
1e6b0 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65  e been.** create
1e6c0 64 2c 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  d, populated wit
1e6d0 68 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70  h this journal p
1e6e0 6f 69 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65  ointer and synce
1e6f0 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a  d to disk..**.**
1e700 20 4f 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f   Once this is ro
1e710 75 74 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e  utine has return
1e720 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69  ed, the only thi
1e730 6e 67 20 72 65 71 75 69 72 65 64 20 74 6f 20 63  ng required to c
1e740 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69  ommit.** the wri
1e750 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66  te-transaction f
1e760 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65  or this database
1e770 20 66 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65   file is to dele
1e780 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  te the journal..
1e790 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1e7a0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
1e7b0 65 28 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73  e(Btree *p, cons
1e7c0 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29  t char *zMaster)
1e7d0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1e7e0 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d  ITE_OK;.  if( p-
1e7f0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1e800 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53  WRITE ){.    BtS
1e810 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
1e820 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pBt;.    sqlite3
1e830 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 0a  BtreeEnter(p);..
1e840 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1e850 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
1e860 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
1e870 20 69 66 20 74 68 69 73 20 69 73 20 61 20 63 6f   if this is a co
1e880 6d 6d 69 74 20 6f 66 20 61 6e 20 55 4e 4c 4f 43  mmit of an UNLOC
1e890 4b 45 44 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  KED transaction 
1e8a0 74 68 61 74 20 0a 20 20 20 20 2a 2a 20 72 65 71  that .    ** req
1e8b0 75 69 72 65 73 20 61 20 73 6e 61 70 73 68 6f 74  uires a snapshot
1e8c0 20 75 70 67 72 61 64 65 2e 20 49 66 20 73 6f 2c   upgrade. If so,
1e8d0 20 73 6b 69 70 20 61 6e 79 20 61 75 74 6f 2d 76   skip any auto-v
1e8e0 61 63 75 75 6d 20 0a 20 20 20 20 2a 2a 20 70 72  acuum .    ** pr
1e8f0 6f 63 65 73 73 69 6e 67 2e 20 20 2a 2f 0a 20 20  ocessing.  */.  
1e900 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
1e910 61 63 75 75 6d 20 26 26 20 28 0a 20 20 20 20 20  acuum && (.     
1e920 20 20 20 30 3d 3d 70 42 74 2d 3e 64 62 2d 3e 62     0==pBt->db->b
1e930 55 6e 6c 6f 63 6b 65 64 0a 20 20 20 20 20 7c 7c  Unlocked.     ||
1e940 20 30 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72   0==sqlite3Pager
1e950 43 6f 6d 6d 69 74 52 65 71 75 69 72 65 73 55 70  CommitRequiresUp
1e960 67 72 61 64 65 28 70 42 74 2d 3e 70 50 61 67 65  grade(pBt->pPage
1e970 72 29 20 0a 20 20 20 20 29 29 7b 0a 20 20 20 20  r) .    )){.    
1e980 20 20 72 63 20 3d 20 61 75 74 6f 56 61 63 75 75    rc = autoVacuu
1e990 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20  mCommit(pBt);.  
1e9a0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1e9b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1e9c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1e9d0 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72  ve(p);.        r
1e9e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1e9f0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
1ea00 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65  pBt->bDoTruncate
1ea10 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1ea20 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d  3PagerTruncateIm
1ea30 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  age(pBt->pPager,
1ea40 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20   pBt->nPage);.  
1ea50 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69    }.#endif.    i
1ea60 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1ea70 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1ea80 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
1ea90 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70  tPhaseOne(pBt->p
1eaa0 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20  Pager, zMaster, 
1eab0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  0);.    }.    sq
1eac0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1ead0 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
1eae0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
1eaf0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1eb00 61 6c 6c 65 64 20 66 72 6f 6d 20 62 6f 74 68 20  alled from both 
1eb10 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
1eb20 54 77 6f 28 29 20 61 6e 64 20 42 74 72 65 65 52  Two() and BtreeR
1eb30 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 61 74 20  ollback().** at 
1eb40 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f  the conclusion o
1eb50 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  f a transaction.
1eb60 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1eb70 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74  btreeEndTransact
1eb80 69 6f 6e 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ion(Btree *p){. 
1eb90 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1eba0 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74   p->pBt;.  sqlit
1ebb0 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
1ebc0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1ebd0 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
1ebe0 28 70 29 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20  (p) );..#ifndef 
1ebf0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1ec00 56 41 43 55 55 4d 0a 20 20 70 42 74 2d 3e 62 44  VACUUM.  pBt->bD
1ec10 6f 54 72 75 6e 63 61 74 65 20 3d 20 30 3b 0a 23  oTruncate = 0;.#
1ec20 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 69  endif.  if( p->i
1ec30 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e  nTrans>TRANS_NON
1ec40 45 20 26 26 20 64 62 2d 3e 6e 56 64 62 65 52 65  E && db->nVdbeRe
1ec50 61 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49  ad>1 ){.    /* I
1ec60 66 20 74 68 65 72 65 20 61 72 65 20 6f 74 68 65  f there are othe
1ec70 72 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65  r active stateme
1ec80 6e 74 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 20  nts that belong 
1ec90 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
1eca0 0a 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 2c 20  .    ** handle, 
1ecb0 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 61 20 72  downgrade to a r
1ecc0 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63  ead-only transac
1ecd0 74 69 6f 6e 2e 20 54 68 65 20 6f 74 68 65 72 20  tion. The other 
1ece0 73 74 61 74 65 6d 65 6e 74 73 0a 20 20 20 20 2a  statements.    *
1ecf0 2a 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72  * may still be r
1ed00 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  eading from the 
1ed10 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20  database.  */.  
1ed20 20 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68    downgradeAllSh
1ed30 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
1ed40 63 6b 73 28 70 29 3b 0a 20 20 20 20 70 2d 3e 69  cks(p);.    p->i
1ed50 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 52  nTrans = TRANS_R
1ed60 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  EAD;.  }else{.  
1ed70 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64    /* If the hand
1ed80 6c 65 20 68 61 64 20 61 6e 79 20 6b 69 6e 64 20  le had any kind 
1ed90 6f 66 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  of transaction o
1eda0 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74  pen, decrement t
1edb0 68 65 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  he .    ** trans
1edc0 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 6f 66 20  action count of 
1edd0 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
1ede0 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63  . If the transac
1edf0 74 69 6f 6e 20 63 6f 75 6e 74 20 0a 20 20 20 20  tion count .    
1ee00 2a 2a 20 72 65 61 63 68 65 73 20 30 2c 20 73 65  ** reaches 0, se
1ee10 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61  t the shared sta
1ee20 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45  te to TRANS_NONE
1ee30 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65  . The unlockBtre
1ee40 65 49 66 55 6e 75 73 65 64 28 29 0a 20 20 20 20  eIfUnused().    
1ee50 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f 77 20 77 69  ** call below wi
1ee60 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61  ll unlock the pa
1ee70 67 65 72 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ger.  */.    if(
1ee80 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41   p->inTrans!=TRA
1ee90 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  NS_NONE ){.     
1eea0 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43   clearAllSharedC
1eeb0 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70  acheTableLocks(p
1eec0 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54  );.      pBt->nT
1eed0 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20  ransaction--;.  
1eee0 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e      if( 0==pBt->
1eef0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a  nTransaction ){.
1ef00 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54          pBt->inT
1ef10 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41  ransaction = TRA
1ef20 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 7d  NS_NONE;.      }
1ef30 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
1ef40 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  et the current t
1ef50 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65  ransaction state
1ef60 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61   to TRANS_NONE a
1ef70 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 20  nd unlock the . 
1ef80 20 20 20 2a 2a 20 70 61 67 65 72 20 69 66 20 74     ** pager if t
1ef90 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20  his call closed 
1efa0 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72  the only read or
1efb0 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
1efc0 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 70 2d 3e 69  on.  */.    p->i
1efd0 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e  nTrans = TRANS_N
1efe0 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42  ONE;.    unlockB
1eff0 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
1f000 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49  );.  }..  btreeI
1f010 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 7d 0a 0a  ntegrity(p);.}..
1f020 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65  /*.** Commit the
1f030 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72   transaction cur
1f040 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65  rently in progre
1f050 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ss..**.** This r
1f060 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74  outine implement
1f070 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61  s the second pha
1f080 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20  se of a 2-phase 
1f090 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20  commit.  The.** 
1f0a0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
1f0b0 69 74 50 68 61 73 65 4f 6e 65 28 29 20 72 6f 75  itPhaseOne() rou
1f0c0 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69  tine does the fi
1f0d0 72 73 74 20 70 68 61 73 65 20 61 6e 64 20 73 68  rst phase and sh
1f0e0 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b  ould.** be invok
1f0f0 65 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c  ed prior to call
1f100 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
1f110 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 42 74  .  The sqlite3Bt
1f120 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
1f130 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64  e().** routine d
1f140 69 64 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20  id all the work 
1f150 6f 66 20 77 72 69 74 69 6e 67 20 69 6e 66 6f 72  of writing infor
1f160 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69  mation out to di
1f170 73 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e 67 20  sk and flushing 
1f180 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  the.** contents 
1f190 73 6f 20 74 68 61 74 20 74 68 65 79 20 61 72 65  so that they are
1f1a0 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68   written onto th
1f1b0 65 20 64 69 73 6b 20 70 6c 61 74 74 65 72 2e 20  e disk platter. 
1f1c0 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75   All this.** rou
1f1d0 74 69 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 69  tine has to do i
1f1e0 73 20 64 65 6c 65 74 65 20 6f 72 20 74 72 75 6e  s delete or trun
1f1f0 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65  cate or zero the
1f200 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 0a 2a   header in the.*
1f210 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  * the rollback j
1f220 6f 75 72 6e 61 6c 20 28 77 68 69 63 68 20 63 61  ournal (which ca
1f230 75 73 65 73 20 74 68 65 20 74 72 61 6e 73 61 63  uses the transac
1f240 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20  tion to commit) 
1f250 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b  and.** drop lock
1f260 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c  s..**.** Normall
1f270 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  y, if an error o
1f280 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20  ccurs while the 
1f290 70 61 67 65 72 20 6c 61 79 65 72 20 69 73 20 61  pager layer is a
1f2a0 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 0a 2a 2a  ttempting to .**
1f2b0 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 75 6e   finalize the un
1f2c0 64 65 72 6c 79 69 6e 67 20 6a 6f 75 72 6e 61 6c  derlying journal
1f2d0 20 66 69 6c 65 2c 20 74 68 69 73 20 66 75 6e 63   file, this func
1f2e0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20  tion returns an 
1f2f0 65 72 72 6f 72 20 61 6e 64 0a 2a 2a 20 74 68 65  error and.** the
1f300 20 75 70 70 65 72 20 6c 61 79 65 72 20 77 69 6c   upper layer wil
1f310 6c 20 61 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c  l attempt a roll
1f320 62 61 63 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69  back. However, i
1f330 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
1f340 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f 6e 2d  ument.** is non-
1f350 7a 65 72 6f 20 74 68 65 6e 20 74 68 69 73 20 62  zero then this b
1f360 2d 74 72 65 65 20 74 72 61 6e 73 61 63 74 69 6f  -tree transactio
1f370 6e 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 6d  n is part of a m
1f380 75 6c 74 69 2d 66 69 6c 65 20 0a 2a 2a 20 74 72  ulti-file .** tr
1f390 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68  ansaction. In th
1f3a0 69 73 20 63 61 73 65 2c 20 74 68 65 20 74 72 61  is case, the tra
1f3b0 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72  nsaction has alr
1f3c0 65 61 64 79 20 62 65 65 6e 20 63 6f 6d 6d 69 74  eady been commit
1f3d0 74 65 64 20 0a 2a 2a 20 28 62 79 20 64 65 6c 65  ted .** (by dele
1f3e0 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6a 6f  ting a master jo
1f3f0 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20  urnal file) and 
1f400 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  the caller will 
1f410 69 67 6e 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20  ignore this .** 
1f420 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e  functions return
1f430 20 63 6f 64 65 2e 20 53 6f 2c 20 65 76 65 6e 20   code. So, even 
1f440 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
1f450 72 73 20 69 6e 20 74 68 65 20 70 61 67 65 72 20  rs in the pager 
1f460 6c 61 79 65 72 2c 0a 2a 2a 20 72 65 73 65 74 20  layer,.** reset 
1f470 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63  the b-tree objec
1f480 74 73 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74  ts internal stat
1f490 65 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  e to indicate th
1f4a0 61 74 20 74 68 65 20 77 72 69 74 65 0a 2a 2a 20  at the write.** 
1f4b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
1f4c0 62 65 65 6e 20 63 6c 6f 73 65 64 2e 20 54 68 69  been closed. Thi
1f4d0 73 20 69 73 20 71 75 69 74 65 20 73 61 66 65 2c  s is quite safe,
1f4e0 20 61 73 20 74 68 65 20 70 61 67 65 72 20 77 69   as the pager wi
1f4f0 6c 6c 20 68 61 76 65 0a 2a 2a 20 74 72 61 6e 73  ll have.** trans
1f500 69 74 69 6f 6e 65 64 20 74 6f 20 74 68 65 20 65  itioned to the e
1f510 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  rror state..**.*
1f520 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65  * This will rele
1f530 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ase the write lo
1f540 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
1f550 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  se file.  If the
1f560 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74  re.** are no act
1f570 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20  ive cursors, it 
1f580 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68  also releases th
1f590 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a  e read lock..*/.
1f5a0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1f5b0 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 42  CommitPhaseTwo(B
1f5c0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 62 43 6c  tree *p, int bCl
1f5d0 65 61 6e 75 70 29 7b 0a 0a 20 20 69 66 28 20 70  eanup){..  if( p
1f5e0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1f5f0 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72 6e 20 53  _NONE ) return S
1f600 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69  QLITE_OK;.  sqli
1f610 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
1f620 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ;.  btreeIntegri
1f630 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ty(p);..  /* If 
1f640 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61  the handle has a
1f650 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
1f660 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20  on open, commit 
1f670 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
1f680 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  s .  ** transact
1f690 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68 65 20  ion and set the 
1f6a0 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20  shared state to 
1f6b0 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f  TRANS_READ..  */
1f6c0 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
1f6d0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
1f6e0 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
1f6f0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1f700 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73  = p->pBt;.    as
1f710 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
1f720 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
1f730 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61 73 73  WRITE );.    ass
1f740 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73  ert( pBt->nTrans
1f750 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20  action>0 );.    
1f760 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1f770 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  rCommitPhaseTwo(
1f780 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
1f790 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1f7a0 5f 4f 4b 20 26 26 20 62 43 6c 65 61 6e 75 70 3d  _OK && bCleanup=
1f7b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
1f7c0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1f7d0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
1f7e0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  c;.    }.    p->
1f7f0 69 44 61 74 61 56 65 72 73 69 6f 6e 2d 2d 3b 20  iDataVersion--; 
1f800 20 2f 2a 20 43 6f 6d 70 65 6e 73 61 74 65 20 66   /* Compensate f
1f810 6f 72 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61  or pPager->iData
1f820 56 65 72 73 69 6f 6e 2b 2b 3b 20 2a 2f 0a 20 20  Version++; */.  
1f830 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
1f840 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41  tion = TRANS_REA
1f850 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c 65 61  D;.    btreeClea
1f860 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29  rHasContent(pBt)
1f870 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e  ;.  }..  btreeEn
1f880 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b  dTransaction(p);
1f890 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1f8a0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
1f8b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1f8c0 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68  /*.** Do both ph
1f8d0 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74  ases of a commit
1f8e0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1f8f0 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74 72 65  BtreeCommit(Btre
1f900 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
1f910 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1f920 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20  nter(p);.  rc = 
1f930 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
1f940 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20 30 29  itPhaseOne(p, 0)
1f950 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1f960 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
1f970 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
1f980 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 2c 20  mmitPhaseTwo(p, 
1f990 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  0);.  }.  sqlite
1f9a0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1f9b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1f9c0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1f9d0 6e 65 20 73 65 74 73 20 74 68 65 20 73 74 61 74  ne sets the stat
1f9e0 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c  e to CURSOR_FAUL
1f9f0 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 0a  T and the error.
1fa00 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72 43 6f  ** code to errCo
1fa10 64 65 20 66 6f 72 20 65 76 65 72 79 20 63 75 72  de for every cur
1fa20 73 6f 72 20 6f 6e 20 61 6e 79 20 42 74 53 68 61  sor on any BtSha
1fa30 72 65 64 20 74 68 61 74 20 70 42 74 72 65 65 0a  red that pBtree.
1fa40 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 20 20  ** references.  
1fa50 4f 72 20 69 66 20 74 68 65 20 77 72 69 74 65 4f  Or if the writeO
1fa60 6e 6c 79 20 66 6c 61 67 20 69 73 20 73 65 74 20  nly flag is set 
1fa70 74 6f 20 31 2c 20 74 68 65 6e 20 6f 6e 6c 79 0a  to 1, then only.
1fa80 2a 2a 20 74 72 69 70 20 77 72 69 74 65 20 63 75  ** trip write cu
1fa90 72 73 6f 72 73 20 61 6e 64 20 6c 65 61 76 65 20  rsors and leave 
1faa0 72 65 61 64 20 63 75 72 73 6f 72 73 20 75 6e 63  read cursors unc
1fab0 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 76  hanged..**.** Ev
1fac0 65 72 79 20 63 75 72 73 6f 72 20 69 73 20 61 20  ery cursor is a 
1fad0 63 61 6e 64 69 64 61 74 65 20 74 6f 20 62 65 20  candidate to be 
1fae0 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75 64 69  tripped, includi
1faf0 6e 67 20 63 75 72 73 6f 72 73 0a 2a 2a 20 74 68  ng cursors.** th
1fb00 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 6f 74 68  at belong to oth
1fb10 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  er database conn
1fb20 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61 70  ections that hap
1fb30 70 65 6e 20 74 6f 20 62 65 0a 2a 2a 20 73 68 61  pen to be.** sha
1fb40 72 69 6e 67 20 74 68 65 20 63 61 63 68 65 20 77  ring the cache w
1fb50 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a  ith pBtree..**.*
1fb60 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67  * This routine g
1fb70 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20  ets called when 
1fb80 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
1fb90 73 2e 20 49 66 20 74 68 65 20 77 72 69 74 65 4f  s. If the writeO
1fba0 6e 6c 79 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74  nly.** flag is t
1fbb0 72 75 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 77  rue, then only w
1fbc0 72 69 74 65 2d 63 75 72 73 6f 72 73 20 6e 65 65  rite-cursors nee
1fbd0 64 20 62 65 20 74 72 69 70 70 65 64 20 2d 20 72  d be tripped - r
1fbe0 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 63 75 72 73  ead-only.** curs
1fbf0 6f 72 73 20 73 61 76 65 20 74 68 65 69 72 20 63  ors save their c
1fc00 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 73  urrent positions
1fc10 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 6d 61   so that they ma
1fc20 79 20 63 6f 6e 74 69 6e 75 65 20 0a 2a 2a 20 66  y continue .** f
1fc30 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 72 6f 6c  ollowing the rol
1fc40 6c 62 61 63 6b 2e 20 4f 72 2c 20 69 66 20 77 72  lback. Or, if wr
1fc50 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65  iteOnly is false
1fc60 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72  , all cursors ar
1fc70 65 20 0a 2a 2a 20 74 72 69 70 70 65 64 2e 20 49  e .** tripped. I
1fc80 6e 20 67 65 6e 65 72 61 6c 2c 20 77 72 69 74 65  n general, write
1fc90 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 20 69 66  Only is false if
1fca0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1fcb0 20 62 65 69 6e 67 0a 2a 2a 20 72 6f 6c 6c 65 64   being.** rolled
1fcc0 20 62 61 63 6b 20 6d 6f 64 69 66 69 65 64 20 74   back modified t
1fcd0 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
1fce0 6d 61 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ma. In this case
1fcf0 20 62 2d 74 72 65 65 20 72 6f 6f 74 0a 2a 2a 20   b-tree root.** 
1fd00 70 61 67 65 73 20 6d 61 79 20 62 65 20 6d 6f 76  pages may be mov
1fd10 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20 66 72  ed or deleted fr
1fd20 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
1fd30 61 6c 74 6f 67 65 74 68 65 72 2c 20 6d 61 6b 69  altogether, maki
1fd40 6e 67 0a 2a 2a 20 69 74 20 75 6e 73 61 66 65 20  ng.** it unsafe 
1fd50 66 6f 72 20 72 65 61 64 20 63 75 72 73 6f 72 73  for read cursors
1fd60 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0a 2a 2a   to continue..**
1fd70 0a 2a 2a 20 49 66 20 74 68 65 20 77 72 69 74 65  .** If the write
1fd80 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 74 72 75  Only flag is tru
1fd90 65 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 69  e and an error i
1fda0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 77 68  s encountered wh
1fdb0 69 6c 65 20 0a 2a 2a 20 73 61 76 69 6e 67 20 74  ile .** saving t
1fdc0 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74  he current posit
1fdd0 69 6f 6e 20 6f 66 20 61 20 72 65 61 64 2d 6f 6e  ion of a read-on
1fde0 6c 79 20 63 75 72 73 6f 72 2c 20 61 6c 6c 20 63  ly cursor, all c
1fdf0 75 72 73 6f 72 73 2c 20 0a 2a 2a 20 69 6e 63 6c  ursors, .** incl
1fe00 75 64 69 6e 67 20 61 6c 6c 20 72 65 61 64 2d 63  uding all read-c
1fe10 75 72 73 6f 72 73 20 61 72 65 20 74 72 69 70 70  ursors are tripp
1fe20 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  ed..**.** SQLITE
1fe30 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
1fe40 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  if successful, o
1fe50 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  r if an error oc
1fe60 63 75 72 73 20 77 68 69 6c 65 0a 2a 2a 20 73 61  curs while.** sa
1fe70 76 69 6e 67 20 61 20 63 75 72 73 6f 72 20 70 6f  ving a cursor po
1fe80 73 69 74 69 6f 6e 2c 20 61 6e 20 53 51 4c 69 74  sition, an SQLit
1fe90 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
1fea0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1feb0 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28  eTripAllCursors(
1fec0 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 69  Btree *pBtree, i
1fed0 6e 74 20 65 72 72 43 6f 64 65 2c 20 69 6e 74 20  nt errCode, int 
1fee0 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20 42 74  writeOnly){.  Bt
1fef0 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69 6e 74  Cursor *p;.  int
1ff00 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1ff10 0a 0a 20 20 61 73 73 65 72 74 28 20 28 77 72 69  ..  assert( (wri
1ff20 74 65 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 77 72 69  teOnly==0 || wri
1ff30 74 65 4f 6e 6c 79 3d 3d 31 29 20 26 26 20 42 54  teOnly==1) && BT
1ff40 43 46 5f 57 72 69 74 65 46 6c 61 67 3d 3d 31 20  CF_WriteFlag==1 
1ff50 29 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 20  );.  if( pBtree 
1ff60 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  ){.    sqlite3Bt
1ff70 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29  reeEnter(pBtree)
1ff80 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 42 74 72  ;.    for(p=pBtr
1ff90 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72  ee->pBt->pCursor
1ffa0 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
1ffb0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
1ffc0 20 20 20 20 20 69 66 28 20 77 72 69 74 65 4f 6e       if( writeOn
1ffd0 6c 79 20 26 26 20 28 70 2d 3e 63 75 72 46 6c 61  ly && (p->curFla
1ffe0 67 73 20 26 20 42 54 43 46 5f 57 72 69 74 65 46  gs & BTCF_WriteF
1fff0 6c 61 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lag)==0 ){.     
20000 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61 74 65     if( p->eState
20010 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c  ==CURSOR_VALID |
20020 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  | p->eState==CUR
20030 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a  SOR_SKIPNEXT ){.
20040 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
20050 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
20060 6e 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  n(p);.          
20070 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
20080 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
20090 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 42 74   (void)sqlite3Bt
200a0 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72  reeTripAllCursor
200b0 73 28 70 42 74 72 65 65 2c 20 72 63 2c 20 30 29  s(pBtree, rc, 0)
200c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
200d0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
200e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
200f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
20100 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
20110 72 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20 20  rCursor(p);.    
20120 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20      p->eState = 
20130 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20  CURSOR_FAULT;.  
20140 20 20 20 20 20 20 70 2d 3e 73 6b 69 70 4e 65 78        p->skipNex
20150 74 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20 20  t = errCode;.   
20160 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
20170 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50 61 67 65 3b  =0; i<=p->iPage;
20180 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 72   i++){.        r
20190 65 6c 65 61 73 65 50 61 67 65 28 70 2d 3e 61 70  eleasePage(p->ap
201a0 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20  Page[i]);.      
201b0 20 20 70 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d    p->apPage[i] =
201c0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
201d0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  }.    sqlite3Btr
201e0 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b  eeLeave(pBtree);
201f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
20200 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
20210 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74  ack the transact
20220 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2e  ion in progress.
20230 0a 2a 2a 0a 2a 2a 20 49 66 20 74 72 69 70 43 6f  .**.** If tripCo
20240 64 65 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45  de is not SQLITE
20250 5f 4f 4b 20 74 68 65 6e 20 63 75 72 73 6f 72 73  _OK then cursors
20260 20 77 69 6c 6c 20 62 65 20 69 6e 76 61 6c 69 64   will be invalid
20270 61 74 65 64 20 28 74 72 69 70 70 65 64 29 2e 0a  ated (tripped)..
20280 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20 63 75  ** Only write cu
20290 72 73 6f 72 73 20 61 72 65 20 74 72 69 70 70 65  rsors are trippe
202a0 64 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69  d if writeOnly i
202b0 73 20 74 72 75 65 20 62 75 74 20 61 6c 6c 20 63  s true but all c
202c0 75 72 73 6f 72 73 20 61 72 65 0a 2a 2a 20 74 72  ursors are.** tr
202d0 69 70 70 65 64 20 69 66 20 77 72 69 74 65 4f 6e  ipped if writeOn
202e0 6c 79 20 69 73 20 66 61 6c 73 65 2e 20 20 41 6e  ly is false.  An
202f0 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  y attempt to use
20300 0a 2a 2a 20 61 20 74 72 69 70 70 65 64 20 63 75  .** a tripped cu
20310 72 73 6f 72 20 77 69 6c 6c 20 72 65 73 75 6c 74  rsor will result
20320 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a   in an error..**
20330 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65  .** This will re
20340 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20  lease the write 
20350 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
20360 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74  base file.  If t
20370 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61  here.** are no a
20380 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69  ctive cursors, i
20390 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20  t also releases 
203a0 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a  the read lock..*
203b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
203c0 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65  eeRollback(Btree
203d0 20 2a 70 2c 20 69 6e 74 20 74 72 69 70 43 6f 64   *p, int tripCod
203e0 65 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e 6c 79  e, int writeOnly
203f0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
20400 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
20410 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65  ->pBt;.  MemPage
20420 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 61 73 73   *pPage1;..  ass
20430 65 72 74 28 20 77 72 69 74 65 4f 6e 6c 79 3d 3d  ert( writeOnly==
20440 31 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79 3d 3d  1 || writeOnly==
20450 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74  0 );.  assert( t
20460 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  ripCode==SQLITE_
20470 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c  ABORT_ROLLBACK |
20480 7c 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49  | tripCode==SQLI
20490 54 45 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c 69 74  TE_OK );.  sqlit
204a0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
204b0 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64 65 3d  .  if( tripCode=
204c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
204d0 20 20 72 63 20 3d 20 74 72 69 70 43 6f 64 65 20    rc = tripCode 
204e0 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  = saveAllCursors
204f0 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  (pBt, 0, 0);.   
20500 20 69 66 28 20 72 63 20 29 20 77 72 69 74 65 4f   if( rc ) writeO
20510 6e 6c 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  nly = 0;.  }else
20520 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
20530 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
20540 74 72 69 70 43 6f 64 65 20 29 7b 0a 20 20 20 20  tripCode ){.    
20550 69 6e 74 20 72 63 32 20 3d 20 73 71 6c 69 74 65  int rc2 = sqlite
20560 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72  3BtreeTripAllCur
20570 73 6f 72 73 28 70 2c 20 74 72 69 70 43 6f 64 65  sors(p, tripCode
20580 2c 20 77 72 69 74 65 4f 6e 6c 79 29 3b 0a 20 20  , writeOnly);.  
20590 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
205a0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 77 72 69 74  LITE_OK || (writ
205b0 65 4f 6e 6c 79 3d 3d 30 20 26 26 20 72 63 32 3d  eOnly==0 && rc2=
205c0 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a 20  =SQLITE_OK) );. 
205d0 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49     if( rc2!=SQLI
205e0 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32  TE_OK ) rc = rc2
205f0 3b 0a 20 20 7d 0a 20 20 62 74 72 65 65 49 6e 74  ;.  }.  btreeInt
20600 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 69 66  egrity(p);..  if
20610 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
20620 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
20630 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20 61   int rc2;..    a
20640 73 73 65 72 74 28 20 54 52 41 4e 53 5f 57 52 49  ssert( TRANS_WRI
20650 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73  TE==pBt->inTrans
20660 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63  action );.    rc
20670 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  2 = sqlite3Pager
20680 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50  Rollback(pBt->pP
20690 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
206a0 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  c2!=SQLITE_OK ){
206b0 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b  .      rc = rc2;
206c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
206d0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20  he rollback may 
206e0 68 61 76 65 20 64 65 73 74 72 6f 79 65 64 20 74  have destroyed t
206f0 68 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61  he pPage1->aData
20700 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20   value.  So.    
20710 2a 2a 20 63 61 6c 6c 20 62 74 72 65 65 47 65 74  ** call btreeGet
20720 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20 31  Page() on page 1
20730 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20   again to make. 
20740 20 20 20 2a 2a 20 73 75 72 65 20 70 50 61 67 65     ** sure pPage
20750 31 2d 3e 61 44 61 74 61 20 69 73 20 73 65 74 20  1->aData is set 
20760 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20  correctly. */.  
20770 20 20 69 66 28 20 62 74 72 65 65 47 65 74 50 61    if( btreeGetPa
20780 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67  ge(pBt, 1, &pPag
20790 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f  e1, 0)==SQLITE_O
207a0 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  K ){.      int n
207b0 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
207c0 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e  28+(u8*)pPage1->
207d0 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 74 65  aData);.      te
207e0 73 74 63 61 73 65 28 20 6e 50 61 67 65 3d 3d 30  stcase( nPage==0
207f0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 50   );.      if( nP
20800 61 67 65 3d 3d 30 20 29 20 73 71 6c 69 74 65 33  age==0 ) sqlite3
20810 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
20820 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61  Bt->pPager, &nPa
20830 67 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ge);.      testc
20840 61 73 65 28 20 70 42 74 2d 3e 6e 50 61 67 65 21  ase( pBt->nPage!
20850 3d 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  =nPage );.      
20860 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61  pBt->nPage = nPa
20870 67 65 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  ge;.      releas
20880 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20  ePage(pPage1);. 
20890 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
208a0 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f   countValidCurso
208b0 72 73 28 70 42 74 2c 20 31 29 3d 3d 30 20 29 3b  rs(pBt, 1)==0 );
208c0 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e  .    pBt->inTran
208d0 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f  saction = TRANS_
208e0 52 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43  READ;.    btreeC
208f0 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70  learHasContent(p
20900 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65  Bt);.  }..  btre
20910 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  eEndTransaction(
20920 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
20930 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
20940 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
20950 2a 20 53 74 61 72 74 20 61 20 73 74 61 74 65 6d  * Start a statem
20960 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69  ent subtransacti
20970 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73  on. The subtrans
20980 61 63 74 69 6f 6e 20 63 61 6e 20 62 65 20 72 6f  action can be ro
20990 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64  lled.** back ind
209a0 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68  ependently of th
209b0 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69  e main transacti
209c0 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73 74 61  on. You must sta
209d0 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  rt a transaction
209e0 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74 61 72   .** before star
209f0 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61  ting a subtransa
20a00 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72  ction. The subtr
20a10 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64  ansaction is end
20a20 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
20a30 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61 69 6e   .** if the main
20a40 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d   transaction com
20a50 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61  mits or rolls ba
20a60 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d  ck..**.** Statem
20a70 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69  ent subtransacti
20a80 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61 72 6f  ons are used aro
20a90 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53  und individual S
20aa0 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a  QL statements.**
20ab0 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69   that are contai
20ac0 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42 45 47  ned within a BEG
20ad0 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63  IN...COMMIT bloc
20ae0 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61  k.  If a constra
20af0 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63  int.** error occ
20b00 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 73  urs within the s
20b10 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66  tatement, the ef
20b20 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65  fect of that one
20b30 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61   statement.** ca
20b40 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n be rolled back
20b50 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
20b60 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
20b70 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69  entire transacti
20b80 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74  on..**.** A stat
20b90 65 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e 73 61  ement sub-transa
20ba0 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65  ction is impleme
20bb0 6e 74 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79  nted as an anony
20bc0 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2e 20  mous savepoint. 
20bd0 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73  The.** value pas
20be0 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
20bf0 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  d parameter is t
20c00 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
20c10 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a  of savepoints,.*
20c20 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  * including the 
20c30 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61  new anonymous sa
20c40 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e  vepoint, open on
20c50 20 74 68 65 20 42 2d 54 72 65 65 2e 20 69 2e 65   the B-Tree. i.e
20c60 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72  . if there.** ar
20c70 65 20 6e 6f 20 61 63 74 69 76 65 20 73 61 76 65  e no active save
20c80 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74  points and no ot
20c90 68 65 72 20 73 74 61 74 65 6d 65 6e 74 2d 74 72  her statement-tr
20ca0 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c  ansactions open,
20cb0 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74 20 69  .** iStatement i
20cc0 73 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d  s 1. This anonym
20cd0 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 20 63 61  ous savepoint ca
20ce0 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20 6f 72  n be released or
20cf0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20   rolled back.** 
20d00 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  using the sqlite
20d10 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28  3BtreeSavepoint(
20d20 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  ) function..*/.i
20d30 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42  nt sqlite3BtreeB
20d40 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a  eginStmt(Btree *
20d50 70 2c 20 69 6e 74 20 69 53 74 61 74 65 6d 65 6e  p, int iStatemen
20d60 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  t){.  int rc;.  
20d70 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
20d80 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65  p->pBt;.  sqlite
20d90 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
20da0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54    assert( p->inT
20db0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
20dc0 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  E );.  assert( (
20dd0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
20de0 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d  BTS_READ_ONLY)==
20df0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
20e00 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20  Statement>0 );. 
20e10 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d   assert( iStatem
20e20 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65  ent>p->db->nSave
20e30 70 6f 69 6e 74 20 29 3b 0a 20 20 61 73 73 65 72  point );.  asser
20e40 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
20e50 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
20e60 54 45 20 29 3b 0a 20 20 2f 2a 20 41 74 20 74 68  TE );.  /* At th
20e70 65 20 70 61 67 65 72 20 6c 65 76 65 6c 2c 20 61  e pager level, a
20e80 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
20e90 61 63 74 69 6f 6e 20 69 73 20 61 20 73 61 76 65  action is a save
20ea0 70 6f 69 6e 74 20 77 69 74 68 0a 20 20 2a 2a 20  point with.  ** 
20eb0 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65 72  an index greater
20ec0 20 74 68 61 6e 20 61 6c 6c 20 73 61 76 65 70 6f   than all savepo
20ed0 69 6e 74 73 20 63 72 65 61 74 65 64 20 65 78 70  ints created exp
20ee0 6c 69 63 69 74 6c 79 20 75 73 69 6e 67 0a 20 20  licitly using.  
20ef0 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ** SQL statement
20f00 73 2e 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c  s. It is illegal
20f10 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61 73   to open, releas
20f20 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  e or rollback an
20f30 79 0a 20 20 2a 2a 20 73 75 63 68 20 73 61 76 65  y.  ** such save
20f40 70 6f 69 6e 74 73 20 77 68 69 6c 65 20 74 68 65  points while the
20f50 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
20f60 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74  action savepoint
20f70 20 69 73 20 61 63 74 69 76 65 2e 0a 20 20 2a 2f   is active..  */
20f80 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
20f90 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e  agerOpenSavepoin
20fa0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69  t(pBt->pPager, i
20fb0 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 73 71  Statement);.  sq
20fc0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
20fd0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
20fe0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65  .}../*.** The se
20ff0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
21000 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
21010 6f 70 2c 20 69 73 20 61 6c 77 61 79 73 20 53 41  op, is always SA
21020 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
21030 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e 54  .** or SAVEPOINT
21040 5f 52 45 4c 45 41 53 45 2e 20 54 68 69 73 20 66  _RELEASE. This f
21050 75 6e 63 74 69 6f 6e 20 65 69 74 68 65 72 20 72  unction either r
21060 65 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73  eleases or rolls
21070 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76   back the.** sav
21080 65 70 6f 69 6e 74 20 69 64 65 6e 74 69 66 69 65  epoint identifie
21090 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 69  d by parameter i
210a0 53 61 76 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e  Savepoint, depen
210b0 64 69 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c 75  ding on the valu
210c0 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a  e .** of op..**.
210d0 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61  ** Normally, iSa
210e0 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74  vepoint is great
210f0 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
21100 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65   to zero. Howeve
21110 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53  r, if op is.** S
21120 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
21130 4b 2c 20 74 68 65 6e 20 69 53 61 76 65 70 6f 69  K, then iSavepoi
21140 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d  nt may also be -
21150 31 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  1. In this case 
21160 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73  the .** contents
21170 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 74   of the entire t
21180 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 72  ransaction are r
21190 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73  olled back. This
211a0 20 69 73 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a   is different.**
211b0 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74   from a normal t
211c0 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62  ransaction rollb
211d0 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73  ack, as no locks
211e0 20 61 72 65 20 72 65 6c 65 61 73 65 64 20 61 6e   are released an
211f0 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63  d the.** transac
21200 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65  tion remains ope
21210 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
21220 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28  3BtreeSavepoint(
21230 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70  Btree *p, int op
21240 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74  , int iSavepoint
21250 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
21260 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
21270 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d   && p->inTrans==
21280 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
21290 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
212a0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61   = p->pBt;.    a
212b0 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50  ssert( op==SAVEP
212c0 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20  OINT_RELEASE || 
212d0 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  op==SAVEPOINT_RO
212e0 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20 61 73  LLBACK );.    as
212f0 73 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74  sert( iSavepoint
21300 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65 70 6f 69  >=0 || (iSavepoi
21310 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41  nt==-1 && op==SA
21320 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
21330 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
21340 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
21350 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
21360 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28 70 42  agerSavepoint(pB
21370 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c 20 69  t->pPager, op, i
21380 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
21390 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
213a0 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  K ){.      if( i
213b0 53 61 76 65 70 6f 69 6e 74 3c 30 20 26 26 20 28  Savepoint<0 && (
213c0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
213d0 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d  BTS_INITIALLY_EM
213e0 50 54 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  PTY)!=0 ){.     
213f0 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
21400 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
21410 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73   rc = newDatabas
21420 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70 42  e(pBt);.      pB
21430 74 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74 34 62  t->nPage = get4b
21440 79 74 65 28 32 38 20 2b 20 70 42 74 2d 3e 70 50  yte(28 + pBt->pP
21450 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 0a 20  age1->aData);.. 
21460 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
21470 62 61 73 65 20 73 69 7a 65 20 77 61 73 20 77 72  base size was wr
21480 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6f  itten into the o
21490 66 66 73 65 74 20 32 38 20 6f 66 20 74 68 65 20  ffset 28 of the 
214a0 68 65 61 64 65 72 0a 20 20 20 20 20 20 2a 2a 20  header.      ** 
214b0 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63  when the transac
214c0 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 73 6f  tion started, so
214d0 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   we know that th
214e0 65 20 76 61 6c 75 65 20 61 74 20 6f 66 66 73 65  e value at offse
214f0 74 0a 20 20 20 20 20 20 2a 2a 20 32 38 20 69 73  t.      ** 28 is
21500 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20 20   nonzero. */.   
21510 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
21520 6e 50 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 7d  nPage>0 );.    }
21530 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
21540 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20  eLeave(p);.  }. 
21550 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
21560 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
21570 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  w cursor for the
21580 20 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f 6f   BTree whose roo
21590 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67 65  t is on the page
215a0 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66 20 61  .** iTable. If a
215b0 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f   read-only curso
215c0 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  r is requested, 
215d0 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  it is assumed th
215e0 61 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72  at.** the caller
215f0 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 74 20   already has at 
21600 6c 65 61 73 74 20 61 20 72 65 61 64 2d 6f 6e 6c  least a read-onl
21610 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  y transaction op
21620 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74  en.** on the dat
21630 61 62 61 73 65 20 61 6c 72 65 61 64 79 2e 20 49  abase already. I
21640 66 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72  f a write-cursor
21650 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74   is requested, t
21660 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65  hen.** the calle
21670 72 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  r is assumed to 
21680 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69  have an open wri
21690 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  te transaction..
216a0 2a 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d  **.** If wrFlag=
216b0 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  =0, then the cur
216c0 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20  sor can only be 
216d0 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67  used for reading
216e0 2e 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d  ..** If wrFlag==
216f0 31 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  1, then the curs
21700 6f 72 20 63 61 6e 20 62 65 20 75 73 65 64 20 66  or can be used f
21710 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f  or reading or fo
21720 72 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69 66 20  r.** writing if 
21730 6f 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73  other conditions
21740 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61 72 65   for writing are
21750 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73   also met.  Thes
21760 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 63 6f 6e  e.** are the con
21770 64 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73  ditions that mus
21780 74 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65  t be met in orde
21790 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f  r for writing to
217a0 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a  .** be allowed:.
217b0 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75  **.** 1:  The cu
217c0 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62  rsor must have b
217d0 65 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20  een opened with 
217e0 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20  wrFlag==1.**.** 
217f0 32 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62 61  2:  Other databa
21800 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74  se connections t
21810 68 61 74 20 73 68 61 72 65 20 74 68 65 20 73 61  hat share the sa
21820 6d 65 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a  me pager cache.*
21830 2a 20 20 20 20 20 62 75 74 20 77 68 69 63 68 20  *     but which 
21840 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52  are not in the R
21850 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20  EAD_UNCOMMITTED 
21860 73 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61  state may not ha
21870 76 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72  ve.**     cursor
21880 73 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c  s open with wrFl
21890 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d  ag==0 on the sam
218a0 65 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77  e table.  Otherw
218b0 69 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63  ise.**     the c
218c0 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74  hanges made by t
218d0 68 69 73 20 77 72 69 74 65 20 63 75 72 73 6f 72  his write cursor
218e0 20 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c   would be visibl
218f0 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20  e to.**     the 
21900 72 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20  read cursors in 
21910 74 68 65 20 6f 74 68 65 72 20 64 61 74 61 62 61  the other databa
21920 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
21930 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74  *.** 3:  The dat
21940 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 77 72  abase must be wr
21950 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72  itable (not on r
21960 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a  ead-only media).
21970 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20  **.** 4:  There 
21980 6d 75 73 74 20 62 65 20 61 6e 20 61 63 74 69 76  must be an activ
21990 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
219a0 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67  *.** No checking
219b0 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65   is done to make
219c0 20 73 75 72 65 20 74 68 61 74 20 70 61 67 65 20   sure that page 
219d0 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73  iTable really is
219e0 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67   the.** root pag
219f0 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20  e of a b-tree.  
21a00 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68  If it is not, th
21a10 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  en the cursor ac
21a20 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e  quired.** will n
21a30 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c  ot work correctl
21a40 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61  y..**.** It is a
21a50 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
21a60 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
21a70 6f 72 5a 65 72 6f 28 29 20 68 61 73 20 62 65 65  orZero() has bee
21a80 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20 70  n called.** on p
21a90 43 75 72 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  Cur to initializ
21aa0 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 70 61  e the memory spa
21ab0 63 65 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f  ce prior to invo
21ac0 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  king this routin
21ad0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
21ae0 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20   btreeCursor(.  
21af0 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20  Btree *p,       
21b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b10 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
21b20 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ree */.  int iTa
21b30 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ble,            
21b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b50 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
21b60 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  table to open */
21b70 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20  .  int wrFlag,  
21b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74            /* 1 t
21ba0 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d  o write. 0 read-
21bb0 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  only */.  struct
21bc0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
21bd0 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fo,             
21be0 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f   /* First arg to
21bf0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
21c00 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73  tion */.  BtCurs
21c10 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20  or *pCur        
21c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c30 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e 65   /* Space for ne
21c40 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20  w cursor */.){. 
21c50 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
21c60 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20   p->pBt;        
21c70 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65          /* Share
21c80 64 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65 20  d b-tree handle 
21c90 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  */.  BtCursor *p
21ca0 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X;              
21cb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
21cc0 6f 6f 70 69 6e 67 20 6f 76 65 72 20 6f 74 68 65  ooping over othe
21cd0 72 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 2a 2f  r all cursors */
21ce0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
21cf0 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
21d00 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72  ex(p) );.  asser
21d10 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20  t( wrFlag==0 || 
21d20 77 72 46 6c 61 67 3d 3d 31 20 29 3b 0a 0a 20 20  wrFlag==1 );..  
21d30 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
21d40 20 61 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e   assert statemen
21d50 74 73 20 76 65 72 69 66 79 20 74 68 61 74 20 69  ts verify that i
21d60 66 20 74 68 69 73 20 69 73 20 61 20 73 68 61 72  f this is a shar
21d70 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74 72 65  able .  ** b-tre
21d80 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  e database, the 
21d90 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f  connection is ho
21da0 6c 64 69 6e 67 20 74 68 65 20 72 65 71 75 69 72  lding the requir
21db0 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2c 20  ed table locks, 
21dc0 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61 74 20 6e  .  ** and that n
21dd0 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  o other connecti
21de0 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70 65 6e 20  on has any open 
21df0 63 75 72 73 6f 72 20 74 68 61 74 20 63 6f 6e 66  cursor that conf
21e00 6c 69 63 74 73 20 77 69 74 68 20 0a 20 20 2a 2a  licts with .  **
21e10 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a   this lock.  */.
21e20 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
21e30 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
21e40 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 4b 65  k(p, iTable, pKe
21e50 79 49 6e 66 6f 21 3d 30 2c 20 77 72 46 6c 61 67  yInfo!=0, wrFlag
21e60 2b 31 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  +1) );.  assert(
21e70 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 21 68   wrFlag==0 || !h
21e80 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28  asReadConflicts(
21e90 70 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a 0a 20  p, iTable) );.. 
21ea0 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20   /* Assert that 
21eb0 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 6f  the caller has o
21ec0 70 65 6e 65 64 20 74 68 65 20 72 65 71 75 69 72  pened the requir
21ed0 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ed transaction. 
21ee0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
21ef0 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f  inTrans>TRANS_NO
21f00 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  NE );.  assert( 
21f10 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e  wrFlag==0 || p->
21f20 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
21f30 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74  RITE );.  assert
21f40 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26  ( pBt->pPage1 &&
21f50 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
21f60 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ata );.  assert(
21f70 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 28 70   wrFlag==0 || (p
21f80 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
21f90 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30  TS_READ_ONLY)==0
21fa0 20 29 3b 0a 0a 20 20 69 66 28 20 77 72 46 6c 61   );..  if( wrFla
21fb0 67 20 29 7b 0a 20 20 20 20 61 6c 6c 6f 63 61 74  g ){.    allocat
21fc0 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
21fd0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 54  .    if( pBt->pT
21fe0 6d 70 53 70 61 63 65 3d 3d 30 20 29 20 72 65 74  mpSpace==0 ) ret
21ff0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
22000 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61 62  ;.  }.  if( iTab
22010 6c 65 3d 3d 31 20 26 26 20 62 74 72 65 65 50 61  le==1 && btreePa
22020 67 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30 20  gecount(pBt)==0 
22030 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 77  ){.    assert( w
22040 72 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20  rFlag==0 );.    
22050 69 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a  iTable = 0;.  }.
22060 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e  .  /* Now that n
22070 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20 63  o other errors c
22080 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73 68  an occur, finish
22090 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20   filling in the 
220a0 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61  BtCursor.  ** va
220b0 72 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e 6b  riables and link
220c0 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f   the cursor into
220d0 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6c 69   the BtShared li
220e0 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e  st.  */.  pCur->
220f0 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f  pgnoRoot = (Pgno
22100 29 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72 2d  )iTable;.  pCur-
22110 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 70  >iPage = -1;.  p
22120 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20  Cur->pKeyInfo = 
22130 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72  pKeyInfo;.  pCur
22140 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20  ->pBtree = p;.  
22150 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b  pCur->pBt = pBt;
22160 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61  .  assert( wrFla
22170 67 3d 3d 30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d  g==0 || wrFlag==
22180 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 20 29  BTCF_WriteFlag )
22190 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  ;.  pCur->curFla
221a0 67 73 20 3d 20 77 72 46 6c 61 67 3b 0a 20 20 70  gs = wrFlag;.  p
221b0 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61  Cur->curPagerFla
221c0 67 73 20 3d 20 77 72 46 6c 61 67 20 3f 20 30 20  gs = wrFlag ? 0 
221d0 3a 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  : PAGER_GET_READ
221e0 4f 4e 4c 59 3b 0a 20 20 2f 2a 20 49 66 20 74 68  ONLY;.  /* If th
221f0 65 72 65 20 61 72 65 20 74 77 6f 20 6f 72 20 6d  ere are two or m
22200 6f 72 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 74  ore cursors on t
22210 68 65 20 73 61 6d 65 20 62 74 72 65 65 2c 20 74  he same btree, t
22220 68 65 6e 20 61 6c 6c 20 73 75 63 68 0a 20 20 2a  hen all such.  *
22230 2a 20 63 75 72 73 6f 72 73 20 2a 6d 75 73 74 2a  * cursors *must*
22240 20 68 61 76 65 20 74 68 65 20 42 54 43 46 5f 4d   have the BTCF_M
22250 75 6c 74 69 70 6c 65 20 66 6c 61 67 20 73 65 74  ultiple flag set
22260 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 58 3d 70 42  . */.  for(pX=pB
22270 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 58 3b 20  t->pCursor; pX; 
22280 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20  pX=pX->pNext){. 
22290 20 20 20 69 66 28 20 70 58 2d 3e 70 67 6e 6f 52     if( pX->pgnoR
222a0 6f 6f 74 3d 3d 28 50 67 6e 6f 29 69 54 61 62 6c  oot==(Pgno)iTabl
222b0 65 20 29 7b 0a 20 20 20 20 20 20 70 58 2d 3e 63  e ){.      pX->c
222c0 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f  urFlags |= BTCF_
222d0 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 20 20 20 20  Multiple;.      
222e0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c  pCur->curFlags |
222f0 3d 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b  = BTCF_Multiple;
22300 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43 75  .    }.  }.  pCu
22310 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e  r->pNext = pBt->
22320 70 43 75 72 73 6f 72 3b 0a 20 20 70 42 74 2d 3e  pCursor;.  pBt->
22330 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a  pCursor = pCur;.
22340 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
22350 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
22360 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
22370 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  _OK;.}.int sqlit
22380 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a 20  e3BtreeCursor(. 
22390 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20   Btree *p,      
223a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
223c0 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69  The btree */.  i
223d0 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
223e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
22400 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65  ot page of table
22410 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
22420 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20  t wrFlag,       
22430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22440 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74            /* 1 t
22450 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d  o write. 0 read-
22460 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  only */.  struct
22470 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
22480 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fo,             
22490 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
224a0 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29  rg to xCompare()
224b0 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a   */.  BtCursor *
224c0 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20  pCur            
224d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224e0 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63    /* Write new c
224f0 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b  ursor here */.){
22500 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
22510 20 69 54 61 62 6c 65 3c 31 20 29 7b 0a 20 20 20   iTable<1 ){.   
22520 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
22530 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c  RUPT_BKPT;.  }el
22540 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  se{.    sqlite3B
22550 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
22560 20 20 72 63 20 3d 20 62 74 72 65 65 43 75 72 73    rc = btreeCurs
22570 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c 20 77 72  or(p, iTable, wr
22580 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20  Flag, pKeyInfo, 
22590 70 43 75 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  pCur);.    sqlit
225a0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
225b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
225c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
225d0 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 20  n the size of a 
225e0 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20  BtCursor object 
225f0 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  in bytes..**.** 
22600 54 68 69 73 20 69 6e 74 65 72 66 61 63 65 73 20  This interfaces 
22610 69 73 20 6e 65 65 64 65 64 20 73 6f 20 74 68 61  is needed so tha
22620 74 20 75 73 65 72 73 20 6f 66 20 63 75 72 73 6f  t users of curso
22630 72 73 20 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61  rs can prealloca
22640 74 65 0a 2a 2a 20 73 75 66 66 69 63 69 65 6e 74  te.** sufficient
22650 20 73 74 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64   storage to hold
22660 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20   a cursor.  The 
22670 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20  BtCursor object 
22680 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20  is opaque.** to 
22690 75 73 65 72 73 20 73 6f 20 74 68 65 79 20 63 61  users so they ca
226a0 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73 69 7a 65  nnot do the size
226b0 6f 66 28 29 20 74 68 65 6d 73 65 6c 76 65 73 20  of() themselves 
226c0 2d 20 74 68 65 79 20 6d 75 73 74 20 63 61 6c 6c  - they must call
226d0 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
226e0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
226f0 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28  BtreeCursorSize(
22700 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20  void){.  return 
22710 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 42 74  ROUND8(sizeof(Bt
22720 43 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a  Cursor));.}../*.
22730 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65  ** Initialize me
22740 6d 6f 72 79 20 74 68 61 74 20 77 69 6c 6c 20 62  mory that will b
22750 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  e converted into
22760 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65   a BtCursor obje
22770 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69  ct..**.** The si
22780 6d 70 6c 65 20 61 70 70 72 6f 61 63 68 20 68 65  mple approach he
22790 72 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 6d  re would be to m
227a0 65 6d 73 65 74 28 29 20 74 68 65 20 65 6e 74 69  emset() the enti
227b0 72 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20  re object.** to 
227c0 7a 65 72 6f 2e 20 20 42 75 74 20 69 74 20 74 75  zero.  But it tu
227d0 72 6e 73 20 6f 75 74 20 74 68 61 74 20 74 68 65  rns out that the
227e0 20 61 70 50 61 67 65 5b 5d 20 61 6e 64 20 61 69   apPage[] and ai
227f0 49 64 78 5b 5d 20 61 72 72 61 79 73 0a 2a 2a 20  Idx[] arrays.** 
22800 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  do not need to b
22810 65 20 7a 65 72 6f 65 64 20 61 6e 64 20 74 68 65  e zeroed and the
22820 79 20 61 72 65 20 6c 61 72 67 65 2c 20 73 6f 20  y are large, so 
22830 77 65 20 63 61 6e 20 73 61 76 65 20 61 20 6c 6f  we can save a lo
22840 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74 69 6d 65  t.** of run-time
22850 20 62 79 20 73 6b 69 70 70 69 6e 67 20 74 68 65   by skipping the
22860 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
22870 6f 66 20 74 68 6f 73 65 20 65 6c 65 6d 65 6e 74  of those element
22880 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
22890 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72  e3BtreeCursorZer
228a0 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a  o(BtCursor *p){.
228b0 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 6f    memset(p, 0, o
228c0 66 66 73 65 74 6f 66 28 42 74 43 75 72 73 6f 72  ffsetof(BtCursor
228d0 2c 20 69 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a  , iPage));.}../*
228e0 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73  .** Close a curs
228f0 6f 72 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f  or.  The read lo
22900 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
22910 73 65 20 66 69 6c 65 20 69 73 20 72 65 6c 65 61  se file is relea
22920 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20  sed.** when the 
22930 6c 61 73 74 20 63 75 72 73 6f 72 20 69 73 20 63  last cursor is c
22940 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  losed..*/.int sq
22950 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43  lite3BtreeCloseC
22960 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a  ursor(BtCursor *
22970 70 43 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a  pCur){.  Btree *
22980 70 42 74 72 65 65 20 3d 20 70 43 75 72 2d 3e 70  pBtree = pCur->p
22990 42 74 72 65 65 3b 0a 20 20 69 66 28 20 70 42 74  Btree;.  if( pBt
229a0 72 65 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ree ){.    int i
229b0 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  ;.    BtShared *
229c0 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b  pBt = pCur->pBt;
229d0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
229e0 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a  eEnter(pBtree);.
229f0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
22a00 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75 72  ClearCursor(pCur
22a10 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
22a20 42 74 2d 3e 70 43 75 72 73 6f 72 21 3d 30 20 29  Bt->pCursor!=0 )
22a30 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70  ;.    if( pBt->p
22a40 43 75 72 73 6f 72 3d 3d 70 43 75 72 20 29 7b 0a  Cursor==pCur ){.
22a50 20 20 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73        pBt->pCurs
22a60 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74  or = pCur->pNext
22a70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
22a80 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70 50 72     BtCursor *pPr
22a90 65 76 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f  ev = pBt->pCurso
22aa0 72 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  r;.      do{.   
22ab0 20 20 20 20 20 69 66 28 20 70 50 72 65 76 2d 3e       if( pPrev->
22ac0 70 4e 65 78 74 3d 3d 70 43 75 72 20 29 7b 0a 20  pNext==pCur ){. 
22ad0 20 20 20 20 20 20 20 20 20 70 50 72 65 76 2d 3e           pPrev->
22ae0 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e  pNext = pCur->pN
22af0 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ext;.          b
22b00 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
22b10 20 20 20 20 20 20 20 20 70 50 72 65 76 20 3d 20          pPrev = 
22b20 70 50 72 65 76 2d 3e 70 4e 65 78 74 3b 0a 20 20  pPrev->pNext;.  
22b30 20 20 20 20 7d 77 68 69 6c 65 28 20 41 4c 57 41      }while( ALWA
22b40 59 53 28 70 50 72 65 76 29 20 29 3b 0a 20 20 20  YS(pPrev) );.   
22b50 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
22b60 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20  i<=pCur->iPage; 
22b70 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  i++){.      rele
22b80 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70  asePage(pCur->ap
22b90 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  Page[i]);.    }.
22ba0 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
22bb0 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
22bc0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
22bd0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b  Cur->aOverflow);
22be0 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f  .    /* sqlite3_
22bf0 66 72 65 65 28 70 43 75 72 29 3b 20 2a 2f 0a 20  free(pCur); */. 
22c00 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
22c10 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20  eave(pBtree);.  
22c20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
22c30 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  E_OK;.}../*.** M
22c40 61 6b 65 20 73 75 72 65 20 74 68 65 20 42 74 43  ake sure the BtC
22c50 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20  ursor* given in 
22c60 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61 73  the argument has
22c70 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75   a valid.** BtCu
22c80 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63 74  rsor.info struct
22c90 75 72 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e  ure.  If it is n
22ca0 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69 64  ot already valid
22cb0 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72 65 65 50  , call.** btreeP
22cc0 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66 69  arseCell() to fi
22cd0 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20  ll it in..**.** 
22ce0 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73  BtCursor.info is
22cf0 20 61 20 63 61 63 68 65 20 6f 66 20 74 68 65 20   a cache of the 
22d00 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74  information in t
22d10 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e  he current cell.
22d20 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20 63  .** Using this c
22d30 61 63 68 65 20 72 65 64 75 63 65 73 20 74 68 65  ache reduces the
22d40 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73   number of calls
22d50 20 74 6f 20 62 74 72 65 65 50 61 72 73 65 43 65   to btreeParseCe
22d60 6c 6c 28 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ll()..*/.#ifndef
22d70 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74 69 63   NDEBUG.  static
22d80 20 76 6f 69 64 20 61 73 73 65 72 74 43 65 6c 6c   void assertCell
22d90 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Info(BtCursor *p
22da0 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e  Cur){.    CellIn
22db0 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 69 6e 74  fo info;.    int
22dc0 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69   iPage = pCur->i
22dd0 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 73 65 74  Page;.    memset
22de0 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f  (&info, 0, sizeo
22df0 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20 62 74  f(info));.    bt
22e00 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75  reeParseCell(pCu
22e10 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d  r->apPage[iPage]
22e20 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50  , pCur->aiIdx[iP
22e30 61 67 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  age], &info);.  
22e40 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
22e50 54 5f 44 42 20 7c 7c 20 6d 65 6d 63 6d 70 28 26  T_DB || memcmp(&
22e60 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66  info, &pCur->inf
22e70 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29  o, sizeof(info))
22e80 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65  ==0 );.  }.#else
22e90 0a 20 20 23 64 65 66 69 6e 65 20 61 73 73 65 72  .  #define asser
22ea0 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e  tCellInfo(x).#en
22eb0 64 69 66 0a 73 74 61 74 69 63 20 53 51 4c 49 54  dif.static SQLIT
22ec0 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20  E_NOINLINE void 
22ed0 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75  getCellInfo(BtCu
22ee0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
22ef0 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  f( pCur->info.nS
22f00 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  ize==0 ){.    in
22f10 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  t iPage = pCur->
22f20 69 50 61 67 65 3b 0a 20 20 20 20 70 43 75 72 2d  iPage;.    pCur-
22f30 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
22f40 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20  F_ValidNKey;.   
22f50 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
22f60 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61  pCur->apPage[iPa
22f70 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b  ge],pCur->aiIdx[
22f80 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e  iPage],&pCur->in
22f90 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  fo);.  }else{.  
22fa0 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f    assertCellInfo
22fb0 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 23  (pCur);.  }.}..#
22fc0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 20 2f  ifndef NDEBUG  /
22fd0 2a 20 54 68 65 20 6e 65 78 74 20 72 6f 75 74 69  * The next routi
22fe0 6e 65 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74  ne used only wit
22ff0 68 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61  hin assert() sta
23000 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a  tements */./*.**
23010 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
23020 74 68 65 20 67 69 76 65 6e 20 42 74 43 75 72 73  the given BtCurs
23030 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20 41 20  or is valid.  A 
23040 76 61 6c 69 64 20 63 75 72 73 6f 72 20 69 73 20  valid cursor is 
23050 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 69 73 20 63  one.** that is c
23060 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
23070 67 20 74 6f 20 61 20 72 6f 77 20 69 6e 20 61 20  g to a row in a 
23080 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74 61 62 6c  (non-empty) tabl
23090 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  e..** This is a 
230a0 76 65 72 69 66 69 63 61 74 69 6f 6e 20 72 6f 75  verification rou
230b0 74 69 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c  tine is used onl
230c0 79 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28  y within assert(
230d0 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f  ) statements..*/
230e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
230f0 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 42  eCursorIsValid(B
23100 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
23110 20 20 72 65 74 75 72 6e 20 70 43 75 72 20 26 26    return pCur &&
23120 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
23130 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 23  URSOR_VALID;.}.#
23140 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42 55 47 20  endif /* NDEBUG 
23150 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70  */../*.** Set *p
23160 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65  Size to the size
23170 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6e   of the buffer n
23180 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 74 68  eeded to hold th
23190 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68  e value of.** th
231a0 65 20 6b 65 79 20 66 6f 72 20 74 68 65 20 63 75  e key for the cu
231b0 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 20 49 66  rrent entry.  If
231c0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e   the cursor is n
231d0 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74  ot pointing.** t
231e0 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2c  o a valid entry,
231f0 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20 74   *pSize is set t
23200 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  o 0. .**.** For 
23210 61 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  a table with the
23220 20 49 4e 54 4b 45 59 20 66 6c 61 67 20 73 65 74   INTKEY flag set
23230 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
23240 65 74 75 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a  eturns the key.*
23250 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68  * itself, not th
23260 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
23270 73 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2a  s in the key..**
23280 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  .** The caller m
23290 75 73 74 20 70 6f 73 69 74 69 6f 6e 20 74 68 65  ust position the
232a0 20 63 75 72 73 6f 72 20 70 72 69 6f 72 20 74 6f   cursor prior to
232b0 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72   invoking this r
232c0 6f 75 74 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20 54  outine..** .** T
232d0 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e  his routine cann
232e0 6f 74 20 66 61 69 6c 2e 20 20 49 74 20 61 6c 77  ot fail.  It alw
232f0 61 79 73 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ays returns SQLI
23300 54 45 5f 4f 4b 2e 20 20 0a 2a 2f 0a 69 6e 74 20  TE_OK.  .*/.int 
23310 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53  sqlite3BtreeKeyS
23320 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ize(BtCursor *pC
23330 75 72 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b  ur, i64 *pSize){
23340 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
23350 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
23360 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
23370 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
23380 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 67  SOR_VALID );.  g
23390 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
233a0 3b 0a 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75  ;.  *pSize = pCu
233b0 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20  r->info.nKey;.  
233c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
233d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a  ;.}../*.** Set *
233e0 70 53 69 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d  pSize to the num
233f0 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
23400 64 61 74 61 20 69 6e 20 74 68 65 20 65 6e 74 72  data in the entr
23410 79 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20  y the.** cursor 
23420 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
23430 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63   to..**.** The c
23440 61 6c 6c 65 72 20 6d 75 73 74 20 67 75 61 72 61  aller must guara
23450 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 63 75  ntee that the cu
23460 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
23470 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a   to a non-NULL.*
23480 2a 20 76 61 6c 69 64 20 65 6e 74 72 79 2e 20 20  * valid entry.  
23490 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
234a0 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63  the calling proc
234b0 65 64 75 72 65 20 6d 75 73 74 20 67 75 61 72 61  edure must guara
234c0 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20 74 68 65  ntee.** that the
234d0 20 63 75 72 73 6f 72 20 68 61 73 20 43 75 72 73   cursor has Curs
234e0 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  or.eState==CURSO
234f0 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 46  R_VALID..**.** F
23500 61 69 6c 75 72 65 20 69 73 20 6e 6f 74 20 70 6f  ailure is not po
23510 73 73 69 62 6c 65 2e 20 20 54 68 69 73 20 66 75  ssible.  This fu
23520 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 72 65  nction always re
23530 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
23540 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20 6a 75 73  .** It might jus
23550 74 20 61 73 20 77 65 6c 6c 20 62 65 20 61 20 70  t as well be a p
23560 72 6f 63 65 64 75 72 65 20 28 72 65 74 75 72 6e  rocedure (return
23570 69 6e 67 20 76 6f 69 64 29 20 62 75 74 20 77 65  ing void) but we
23580 20 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 74 6f 20   continue.** to 
23590 72 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65  return an intege
235a0 72 20 72 65 73 75 6c 74 20 63 6f 64 65 20 66 6f  r result code fo
235b0 72 20 68 69 73 74 6f 72 69 63 61 6c 20 72 65 61  r historical rea
235c0 73 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sons..*/.int sql
235d0 69 74 65 33 42 74 72 65 65 44 61 74 61 53 69 7a  ite3BtreeDataSiz
235e0 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
235f0 2c 20 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20  , u32 *pSize){. 
23600 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
23610 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
23620 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
23630 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
23640 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
23650 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
23660 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=0 );.  assert(
23670 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43   pCur->iPage<BTC
23680 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20  URSOR_MAX_DEPTH 
23690 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
236a0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
236b0 69 50 61 67 65 5d 2d 3e 69 6e 74 4b 65 79 4c 65  iPage]->intKeyLe
236c0 61 66 3d 3d 31 20 29 3b 0a 20 20 67 65 74 43 65  af==1 );.  getCe
236d0 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
236e0 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69  *pSize = pCur->i
236f0 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  nfo.nPayload;.  
23700 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
23710 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
23720 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
23730 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   of an overflow 
23740 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
23750 62 61 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a  base (parameter.
23760 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66  ** ovfl), this f
23770 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68  unction finds th
23780 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
23790 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
237a0 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64  n the .** linked
237b0 20 6c 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f   list of overflo
237c0 77 20 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73  w pages. If poss
237d0 69 62 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68  ible, it uses th
237e0 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a  e auto-vacuum.**
237f0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74   pointer-map dat
23800 61 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61  a instead of rea
23810 64 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ding the content
23820 20 6f 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f   of page ovfl to
23830 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49   do so. .**.** I
23840 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
23850 73 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  s an SQLite erro
23860 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
23870 65 64 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a  ed. Otherwise:.*
23880 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 6e 75  *.** The page nu
23890 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74  mber of the next
238a0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
238b0 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  n the linked lis
238c0 74 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e  t is .** written
238d0 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20   to *pPgnoNext. 
238e0 49 66 20 70 61 67 65 20 6f 76 66 6c 20 69 73 20  If page ovfl is 
238f0 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e  the last page in
23900 20 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20   its linked .** 
23910 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74  list, *pPgnoNext
23920 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
23930 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67   .**.** If ppPag
23940 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61  e is not NULL, a
23950 6e 64 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  nd a reference t
23960 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62  o the MemPage ob
23970 6a 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69  ject correspondi
23980 6e 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75  ng.** to page nu
23990 6d 62 65 72 20 70 4f 76 66 6c 20 77 61 73 20 6f  mber pOvfl was o
239a0 62 74 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70  btained, then *p
239b0 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
239c0 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a  point to that.**
239d0 20 72 65 66 65 72 65 6e 63 65 2e 20 49 74 20 69   reference. It i
239e0 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
239f0 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
23a00 65 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61  er to call relea
23a10 73 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a  sePage().** on *
23a20 70 70 50 61 67 65 20 74 6f 20 66 72 65 65 20 74  ppPage to free t
23a30 68 65 20 72 65 66 65 72 65 6e 63 65 2e 20 49 6e  he reference. In
23a40 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61   no reference wa
23a50 73 20 6f 62 74 61 69 6e 65 64 20 28 62 65 63 61  s obtained (beca
23a60 75 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74  use.** the point
23a70 65 72 2d 6d 61 70 20 77 61 73 20 75 73 65 64 20  er-map was used 
23a80 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 76 61  to obtain the va
23a90 6c 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65  lue for *pPgnoNe
23aa0 78 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70  xt), then.** *pp
23ab0 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 7a  Page is set to z
23ac0 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ero..*/.static i
23ad0 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61  nt getOverflowPa
23ae0 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
23af0 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  pBt,            
23b00 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
23b10 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file */.  Pgn
23b20 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20  o ovfl,         
23b30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
23b40 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  rent overflow pa
23b50 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 4d  ge number */.  M
23b60 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
23b70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
23b80 55 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64  UT: MemPage hand
23b90 6c 65 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29  le (may be NULL)
23ba0 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e   */.  Pgno *pPgn
23bb0 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20 20 20  oNext           
23bc0 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20     /* OUT: Next 
23bd0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75  overflow page nu
23be0 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e  mber */.){.  Pgn
23bf0 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65  o next = 0;.  Me
23c00 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30  mPage *pPage = 0
23c10 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
23c20 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
23c30 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
23c40 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
23c50 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50  ) );.  assert(pP
23c60 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64  gnoNext);..#ifnd
23c70 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
23c80 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54  UTOVACUUM.  /* T
23c90 72 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e  ry to find the n
23ca0 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
23cb0 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73  overflow list us
23cc0 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74  ing the.  ** aut
23cd0 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d  ovacuum pointer-
23ce0 6d 61 70 20 70 61 67 65 73 2e 20 47 75 65 73 73  map pages. Guess
23cf0 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 70   that the next p
23d00 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65  age in .  ** the
23d10 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69   overflow list i
23d20 73 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f  s page number (o
23d30 76 66 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20  vfl+1). If that 
23d40 67 75 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a  guess turns .  *
23d50 2a 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e  * out to be wron
23d60 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20  g, fall back to 
23d70 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  loading the data
23d80 20 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e   of page .  ** n
23d90 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65  umber ovfl to de
23da0 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74  termine the next
23db0 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20   page number..  
23dc0 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75  */.  if( pBt->au
23dd0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
23de0 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50  Pgno pgno;.    P
23df0 67 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66  gno iGuess = ovf
23e00 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70  l+1;.    u8 eTyp
23e10 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50  e;..    while( P
23e20 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
23e30 2c 20 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75  , iGuess) || iGu
23e40 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  ess==PENDING_BYT
23e50 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
23e60 20 20 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20       iGuess++;. 
23e70 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47     }..    if( iG
23e80 75 65 73 73 3c 3d 62 74 72 65 65 50 61 67 65 63  uess<=btreePagec
23e90 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20  ount(pBt) ){.   
23ea0 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
23eb0 74 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26  t(pBt, iGuess, &
23ec0 65 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20  eType, &pgno);. 
23ed0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
23ee0 49 54 45 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d  ITE_OK && eType=
23ef0 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
23f00 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20  2 && pgno==ovfl 
23f10 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20  ){.        next 
23f20 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20  = iGuess;.      
23f30 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
23f40 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  NE;.      }.    
23f50 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
23f60 61 73 73 65 72 74 28 20 6e 65 78 74 3d 3d 30 20  assert( next==0 
23f70 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  || rc==SQLITE_DO
23f80 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  NE );.  if( rc==
23f90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23fa0 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
23fb0 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70  ge(pBt, ovfl, &p
23fc0 50 61 67 65 2c 20 28 70 70 50 61 67 65 3d 3d 30  Page, (ppPage==0
23fd0 29 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45  ) ? PAGER_GET_RE
23fe0 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 20  ADONLY : 0);.   
23ff0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
24000 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d  ITE_OK || pPage=
24010 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  =0 );.    if( rc
24020 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
24030 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34       next = get4
24040 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
24050 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  a);.    }.  }.. 
24060 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65   *pPgnoNext = ne
24070 78 74 3b 0a 20 20 69 66 28 20 70 70 50 61 67 65  xt;.  if( ppPage
24080 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20   ){.    *ppPage 
24090 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65  = pPage;.  }else
240a0 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
240b0 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  e(pPage);.  }.  
240c0 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49  return (rc==SQLI
240d0 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45  TE_DONE ? SQLITE
240e0 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a  _OK : rc);.}../*
240f0 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72  .** Copy data fr
24100 6f 6d 20 61 20 62 75 66 66 65 72 20 74 6f 20 61  om a buffer to a
24110 20 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61   page, or from a
24120 20 70 61 67 65 20 74 6f 20 61 20 62 75 66 66 65   page to a buffe
24130 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61  r..**.** pPayloa
24140 64 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  d is a pointer t
24150 6f 20 64 61 74 61 20 73 74 6f 72 65 64 20 6f 6e  o data stored on
24160 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70   database page p
24170 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72  DbPage..** If ar
24180 67 75 6d 65 6e 74 20 65 4f 70 20 69 73 20 66 61  gument eOp is fa
24190 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79 74 65 20  lse, then nByte 
241a0 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 61 72  bytes of data ar
241b0 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d  e copied.** from
241c0 20 70 50 61 79 6c 6f 61 64 20 74 6f 20 74 68 65   pPayload to the
241d0 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
241e0 61 74 20 62 79 20 70 42 75 66 2e 20 49 66 20 65  at by pBuf. If e
241f0 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74  Op is true,.** t
24200 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72  hen sqlite3Pager
24210 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65  Write() is calle
24220 64 20 6f 6e 20 70 44 62 50 61 67 65 20 61 6e 64  d on pDbPage and
24230 20 6e 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20   nByte bytes.** 
24240 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69  of data are copi
24250 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66  ed from the buff
24260 65 72 20 70 42 75 66 20 74 6f 20 70 50 61 79 6c  er pBuf to pPayl
24270 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  oad..**.** SQLIT
24280 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
24290 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 74 68   on success, oth
242a0 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20  erwise an error 
242b0 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
242c0 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  int copyPayload(
242d0 0a 20 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61  .  void *pPayloa
242e0 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d,           /* 
242f0 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20  Pointer to page 
24300 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  data */.  void *
24310 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20  pBuf,           
24320 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
24330 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e  o buffer */.  in
24340 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20  t nByte,        
24350 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
24360 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 63 6f  r of bytes to co
24370 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c  py */.  int eOp,
24380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24390 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66    /* 0 -> copy f
243a0 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20 63  rom page, 1 -> c
243b0 6f 70 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20  opy to page */. 
243c0 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
243d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
243e0 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50  ge containing pP
243f0 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69  ayload */.){.  i
24400 66 28 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a  f( eOp ){.    /*
24410 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   Copy data from 
24420 62 75 66 66 65 72 20 74 6f 20 70 61 67 65 20 28  buffer to page (
24430 61 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f  a write operatio
24440 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63  n) */.    int rc
24450 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
24460 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20  rite(pDbPage);. 
24470 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
24480 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
24490 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
244a0 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f     memcpy(pPaylo
244b0 61 64 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29  ad, pBuf, nByte)
244c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
244d0 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
244e0 20 70 61 67 65 20 74 6f 20 62 75 66 66 65 72 20   page to buffer 
244f0 28 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f  (a read operatio
24500 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79  n) */.    memcpy
24510 28 70 42 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c  (pBuf, pPayload,
24520 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72   nByte);.  }.  r
24530 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
24540 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
24550 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
24560 74 6f 20 72 65 61 64 20 6f 72 20 6f 76 65 72 77  to read or overw
24570 72 69 74 65 20 70 61 79 6c 6f 61 64 20 69 6e 66  rite payload inf
24580 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20  ormation.** for 
24590 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
245a0 68 65 20 70 43 75 72 20 63 75 72 73 6f 72 20 69  he pCur cursor i
245b0 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 54  s pointing to. T
245c0 68 65 20 65 4f 70 0a 2a 2a 20 61 72 67 75 6d 65  he eOp.** argume
245d0 6e 74 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  nt is interprete
245e0 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  d as follows:.**
245f0 0a 2a 2a 20 20 20 30 3a 20 54 68 65 20 6f 70 65  .**   0: The ope
24600 72 61 74 69 6f 6e 20 69 73 20 61 20 72 65 61 64  ration is a read
24610 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f  . Populate the o
24620 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a  verflow cache..*
24630 2a 20 20 20 31 3a 20 54 68 65 20 6f 70 65 72 61  *   1: The opera
24640 74 69 6f 6e 20 69 73 20 61 20 77 72 69 74 65 2e  tion is a write.
24650 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76   Populate the ov
24660 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a  erflow cache..**
24670 20 20 20 32 3a 20 54 68 65 20 6f 70 65 72 61 74     2: The operat
24680 69 6f 6e 20 69 73 20 61 20 72 65 61 64 2e 20 44  ion is a read. D
24690 6f 20 6e 6f 74 20 70 6f 70 75 6c 61 74 65 20 74  o not populate t
246a0 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68  he overflow cach
246b0 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c  e..**.** A total
246c0 20 6f 66 20 22 61 6d 74 22 20 62 79 74 65 73 20   of "amt" bytes 
246d0 61 72 65 20 72 65 61 64 20 6f 72 20 77 72 69 74  are read or writ
246e0 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ten beginning at
246f0 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61   "offset"..** Da
24700 74 61 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72  ta is read to or
24710 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72   from the buffer
24720 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   pBuf..**.** The
24730 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 72   content being r
24740 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 6d  ead or written m
24750 69 67 68 74 20 61 70 70 65 61 72 20 6f 6e 20 74  ight appear on t
24760 68 65 20 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20  he main page.** 
24770 6f 72 20 62 65 20 73 63 61 74 74 65 72 65 64 20  or be scattered 
24780 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20  out on multiple 
24790 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a  overflow pages..
247a0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
247b0 72 65 6e 74 20 63 75 72 73 6f 72 20 65 6e 74 72  rent cursor entr
247c0 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f  y uses one or mo
247d0 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  re overflow page
247e0 73 20 61 6e 64 20 74 68 65 0a 2a 2a 20 65 4f 70  s and the.** eOp
247f0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74   argument is not
24800 20 32 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f   2, this functio
24810 6e 20 6d 61 79 20 61 6c 6c 6f 63 61 74 65 20 73  n may allocate s
24820 70 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a  pace for and laz
24830 69 6c 79 20 0a 2a 2a 20 70 6f 70 75 6c 61 74 65  ily .** populate
24840 73 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  s the overflow p
24850 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 61  age-list cache a
24860 72 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61  rray (BtCursor.a
24870 4f 76 65 72 66 6c 6f 77 29 2e 20 0a 2a 2a 20 53  Overflow). .** S
24880 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
24890 75 73 65 20 74 68 69 73 20 63 61 63 68 65 20 74  use this cache t
248a0 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74  o make seeking t
248b0 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f  o the supplied o
248c0 66 66 73 65 74 20 0a 2a 2a 20 6d 6f 72 65 20 65  ffset .** more e
248d0 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  fficient..**.** 
248e0 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  Once an overflow
248f0 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
24900 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
24910 74 65 64 2c 20 69 74 20 6d 61 79 20 62 65 0a 2a  ted, it may be.*
24920 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 20 69 66  * invalidated if
24930 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 75 72 73   some other curs
24940 6f 72 20 77 72 69 74 65 73 20 74 6f 20 74 68 65  or writes to the
24950 20 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20   same table, or 
24960 69 66 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72  if.** the cursor
24970 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 61 20 64   is moved to a d
24980 69 66 66 65 72 65 6e 74 20 72 6f 77 2e 20 41 64  ifferent row. Ad
24990 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61  ditionally, in a
249a0 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f  uto-vacuum.** mo
249b0 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  de, the followin
249c0 67 20 65 76 65 6e 74 73 20 6d 61 79 20 69 6e 76  g events may inv
249d0 61 6c 69 64 61 74 65 20 61 6e 20 6f 76 65 72 66  alidate an overf
249e0 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
249f0 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41  che..**.**   * A
24a00 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
24a10 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63  cuum,.**   * A c
24a20 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76 61  ommit in auto_va
24a30 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65  cuum="full" mode
24a40 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74 69 6e  ,.**   * Creatin
24a50 67 20 61 20 74 61 62 6c 65 20 28 6d 61 79 20 72  g a table (may r
24a60 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e  equire moving an
24a70 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 29 2e   overflow page).
24a80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
24a90 63 63 65 73 73 50 61 79 6c 6f 61 64 28 0a 20 20  ccessPayload(.  
24aa0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
24ab0 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70       /* Cursor p
24ac0 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79  ointing to entry
24ad0 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
24ae0 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c 20 20  .  u32 offset,  
24af0 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
24b00 20 72 65 61 64 69 6e 67 20 74 68 69 73 20 66 61   reading this fa
24b10 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a  r into payload *
24b20 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20 20 20 20  /.  u32 amt,    
24b30 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64           /* Read
24b40 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73   this many bytes
24b50 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
24b60 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72  har *pBuf, /* Wr
24b70 69 74 65 20 74 68 65 20 62 79 74 65 73 20 69 6e  ite the bytes in
24b80 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a  to this buffer *
24b90 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20  / .  int eOp    
24ba0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72            /* zer
24bb0 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a  o to read. non-z
24bc0 65 72 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f  ero to write. */
24bd0 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  .){.  unsigned c
24be0 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20  har *aPayload;. 
24bf0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
24c00 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 49 64 78 20  _OK;.  int iIdx 
24c10 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
24c20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
24c30 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
24c40 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65  ]; /* Btree page
24c50 20 6f 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72   of current entr
24c60 79 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  y */.  BtShared 
24c70 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
24c80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24c90 20 20 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73     /* Btree this
24ca0 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20   cursor belongs 
24cb0 74 6f 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  to */.#ifdef SQL
24cc0 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46  ITE_DIRECT_OVERF
24cd0 4c 4f 57 5f 52 45 41 44 0a 20 20 75 6e 73 69 67  LOW_READ.  unsig
24ce0 6e 65 64 20 63 68 61 72 20 2a 20 63 6f 6e 73 74  ned char * const
24cf0 20 70 42 75 66 53 74 61 72 74 20 3d 20 70 42 75   pBufStart = pBu
24d00 66 3b 0a 20 20 69 6e 74 20 62 45 6e 64 3b 20 20  f;.  int bEnd;  
24d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24d30 2a 20 54 72 75 65 20 69 66 20 72 65 61 64 69 6e  * True if readin
24d40 67 20 74 6f 20 65 6e 64 20 6f 66 20 64 61 74 61  g to end of data
24d50 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73   */.#endif..  as
24d60 73 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20  sert( pPage );. 
24d70 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
24d80 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
24d90 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
24da0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
24db0 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d  r->iPage]<pPage-
24dc0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65  >nCell );.  asse
24dd0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
24de0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
24df0 61 73 73 65 72 74 28 20 65 4f 70 21 3d 32 20 7c  assert( eOp!=2 |
24e00 7c 20 6f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20  | offset==0 );  
24e10 20 20 2f 2a 20 41 6c 77 61 79 73 20 73 74 61 72    /* Always star
24e20 74 20 66 72 6f 6d 20 62 65 67 69 6e 6e 69 6e 67  t from beginning
24e30 20 66 6f 72 20 65 4f 70 3d 3d 32 20 2a 2f 0a 0a   for eOp==2 */..
24e40 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
24e50 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20  ur);.  aPayload 
24e60 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61  = pCur->info.pPa
24e70 79 6c 6f 61 64 3b 0a 23 69 66 64 65 66 20 53 51  yload;.#ifdef SQ
24e80 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52  LITE_DIRECT_OVER
24e90 46 4c 4f 57 5f 52 45 41 44 0a 20 20 62 45 6e 64  FLOW_READ.  bEnd
24ea0 20 3d 20 6f 66 66 73 65 74 2b 61 6d 74 3d 3d 70   = offset+amt==p
24eb0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f  Cur->info.nPaylo
24ec0 61 64 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73  ad;.#endif.  ass
24ed0 65 72 74 28 20 6f 66 66 73 65 74 2b 61 6d 74 20  ert( offset+amt 
24ee0 3c 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50  <= pCur->info.nP
24ef0 61 79 6c 6f 61 64 20 29 3b 0a 0a 20 20 69 66 28  ayload );..  if(
24f00 20 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d   &aPayload[pCur-
24f10 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20  >info.nLocal] > 
24f20 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
24f30 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 20 29  t->usableSize] )
24f40 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20  {.    /* Trying 
24f50 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  to read or write
24f60 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
24f70 20 74 68 65 20 64 61 74 61 20 69 73 20 61 6e 20   the data is an 
24f80 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74  error */.    ret
24f90 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
24fa0 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  PT_BKPT;.  }..  
24fb0 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61 74 61  /* Check if data
24fc0 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f 77 72   must be read/wr
24fd0 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68  itten to/from th
24fe0 65 20 62 74 72 65 65 20 70 61 67 65 20 69 74 73  e btree page its
24ff0 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66  elf. */.  if( of
25000 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e  fset<pCur->info.
25010 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e  nLocal ){.    in
25020 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69  t a = amt;.    i
25030 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72  f( a+offset>pCur
25040 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b  ->info.nLocal ){
25050 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d  .      a = pCur-
25060 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f  >info.nLocal - o
25070 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20  ffset;.    }.   
25080 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61   rc = copyPayloa
25090 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73  d(&aPayload[offs
250a0 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20 28 65  et], pBuf, a, (e
250b0 4f 70 20 26 20 30 78 30 31 29 2c 20 70 50 61 67  Op & 0x01), pPag
250c0 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
250d0 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20   offset = 0;.   
250e0 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20   pBuf += a;.    
250f0 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73  amt -= a;.  }els
25100 65 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d  e{.    offset -=
25110 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
25120 61 6c 3b 0a 20 20 7d 0a 0a 0a 20 20 69 66 28 20  al;.  }...  if( 
25130 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
25140 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f   amt>0 ){.    co
25150 6e 73 74 20 75 33 32 20 6f 76 66 6c 53 69 7a 65  nst u32 ovflSize
25160 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
25170 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65  ze - 4;  /* Byte
25180 73 20 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76  s content per ov
25190 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50  fl page */.    P
251a0 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20  gno nextPage;.. 
251b0 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65     nextPage = ge
251c0 74 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61 64  t4byte(&aPayload
251d0 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  [pCur->info.nLoc
251e0 61 6c 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  al]);..    /* If
251f0 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 61 4f   the BtCursor.aO
25200 76 65 72 66 6c 6f 77 5b 5d 20 68 61 73 20 6e 6f  verflow[] has no
25210 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  t been allocated
25220 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f  , allocate it no
25230 77 2e 0a 20 20 20 20 2a 2a 20 45 78 63 65 70 74  w..    ** Except
25240 2c 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 63 61 74  , do not allocat
25250 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 66 6f  e aOverflow[] fo
25260 72 20 65 4f 70 3d 3d 32 2e 0a 20 20 20 20 2a 2a  r eOp==2..    **
25270 0a 20 20 20 20 2a 2a 20 54 68 65 20 61 4f 76 65  .    ** The aOve
25280 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 69 73  rflow[] array is
25290 20 73 69 7a 65 64 20 61 74 20 6f 6e 65 20 65 6e   sized at one en
252a0 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65  try for each ove
252b0 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 2a  rflow page.    *
252c0 2a 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f  * in the overflo
252d0 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67  w chain. The pag
252e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
252f0 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70  first overflow p
25300 61 67 65 20 69 73 0a 20 20 20 20 2a 2a 20 73 74  age is.    ** st
25310 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f  ored in aOverflo
25320 77 5b 30 5d 2c 20 65 74 63 2e 20 41 20 76 61 6c  w[0], etc. A val
25330 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61  ue of 0 in the a
25340 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79  Overflow[] array
25350 0a 20 20 20 20 2a 2a 20 6d 65 61 6e 73 20 22 6e  .    ** means "n
25360 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 20 28 74  ot yet known" (t
25370 68 65 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69  he cache is lazi
25380 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20  ly populated).. 
25390 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 4f     */.    if( eO
253a0 70 21 3d 32 20 26 26 20 28 70 43 75 72 2d 3e 63  p!=2 && (pCur->c
253b0 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
253c0 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 7b 0a  alidOvfl)==0 ){.
253d0 20 20 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20        int nOvfl 
253e0 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50  = (pCur->info.nP
253f0 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66  ayload-pCur->inf
25400 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a  o.nLocal+ovflSiz
25410 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20  e-1)/ovflSize;. 
25420 20 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 3e 70       if( nOvfl>p
25430 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20  Cur->nOvflAlloc 
25440 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  ){.        Pgno 
25450 2a 61 4e 65 77 20 3d 20 28 50 67 6e 6f 2a 29 73  *aNew = (Pgno*)s
25460 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63 28 0a 20  qlite3Realloc(. 
25470 20 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d             pCur-
25480 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 6e 4f 76 66  >aOverflow, nOvf
25490 6c 2a 32 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29  l*2*sizeof(Pgno)
254a0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
254b0 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20      if( aNew==0 
254c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
254d0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
254e0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
254f0 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 6e           pCur->n
25500 4f 76 66 6c 41 6c 6c 6f 63 20 3d 20 6e 4f 76 66  OvflAlloc = nOvf
25510 6c 2a 32 3b 0a 20 20 20 20 20 20 20 20 20 20 70  l*2;.          p
25520 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d  Cur->aOverflow =
25530 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d   aNew;.        }
25540 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
25550 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
25560 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73   ){.        mems
25570 65 74 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  et(pCur->aOverfl
25580 6f 77 2c 20 30 2c 20 6e 4f 76 66 6c 2a 73 69 7a  ow, 0, nOvfl*siz
25590 65 6f 66 28 50 67 6e 6f 29 29 3b 0a 20 20 20 20  eof(Pgno));.    
255a0 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
255b0 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64  gs |= BTCF_Valid
255c0 4f 76 66 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Ovfl;.      }.  
255d0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
255e0 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
255f0 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20  -list cache has 
25600 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61  been allocated a
25610 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e  nd the.    ** en
25620 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 72 73  try for the firs
25630 74 20 72 65 71 75 69 72 65 64 20 6f 76 65 72 66  t required overf
25640 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c 69  low page is vali
25650 64 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20 64  d, skip.    ** d
25660 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20  irectly to it.. 
25670 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70     */.    if( (p
25680 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
25690 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 21  BTCF_ValidOvfl)!
256a0 3d 30 0a 20 20 20 20 20 26 26 20 70 43 75 72 2d  =0.     && pCur-
256b0 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65  >aOverflow[offse
256c0 74 2f 6f 76 66 6c 53 69 7a 65 5d 0a 20 20 20 20  t/ovflSize].    
256d0 29 7b 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20  ){.      iIdx = 
256e0 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65  (offset/ovflSize
256f0 29 3b 0a 20 20 20 20 20 20 6e 65 78 74 50 61 67  );.      nextPag
25700 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  e = pCur->aOverf
25710 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20  low[iIdx];.     
25720 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66 73 65   offset = (offse
25730 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20  t%ovflSize);.   
25740 20 7d 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20 72   }..    for( ; r
25750 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
25760 61 6d 74 3e 30 20 26 26 20 6e 65 78 74 50 61 67  amt>0 && nextPag
25770 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 20 20 20  e; iIdx++){..   
25780 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65     /* If require
25790 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  d, populate the 
257a0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
257b0 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20  st cache. */.   
257c0 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75     if( (pCur->cu
257d0 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
257e0 6c 69 64 4f 76 66 6c 29 21 3d 30 20 29 7b 0a 20  lidOvfl)!=0 ){. 
257f0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 21 70         assert(!p
25800 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
25810 49 64 78 5d 20 7c 7c 20 70 43 75 72 2d 3e 61 4f  Idx] || pCur->aO
25820 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e  verflow[iIdx]==n
25830 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20  extPage);.      
25840 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f    pCur->aOverflo
25850 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50 61  w[iIdx] = nextPa
25860 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ge;.      }..   
25870 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f     if( offset>=o
25880 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  vflSize ){.     
25890 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72     /* The only r
258a0 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20 74 68  eason to read th
258b0 69 73 20 70 61 67 65 20 69 73 20 74 6f 20 6f 62  is page is to ob
258c0 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a 20 20  tain the page.  
258d0 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20        ** number 
258e0 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70 61 67  for the next pag
258f0 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f  e in the overflo
25900 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67  w chain. The pag
25910 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74  e.        ** dat
25920 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  a is not require
25930 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72 79 20  d. So first try 
25940 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76  to lookup the ov
25950 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a  erflow.        *
25960 2a 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  * page-list cach
25970 65 2c 20 69 66 20 61 6e 79 2c 20 74 68 65 6e 20  e, if any, then 
25980 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65  fall back to the
25990 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
259a0 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75  ().        ** fu
259b0 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20  nction..        
259c0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f  **.        ** No
259d0 74 65 20 74 68 61 74 20 74 68 65 20 61 4f 76 65  te that the aOve
259e0 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 6d 75  rflow[] array mu
259f0 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20  st be allocated 
25a00 62 65 63 61 75 73 65 20 65 4f 70 21 3d 32 0a 20  because eOp!=2. 
25a10 20 20 20 20 20 20 20 2a 2a 20 68 65 72 65 2e 20         ** here. 
25a20 20 49 66 20 65 4f 70 3d 3d 32 2c 20 74 68 65 6e   If eOp==2, then
25a30 20 6f 66 66 73 65 74 3d 3d 30 20 61 6e 64 20 74   offset==0 and t
25a40 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 6e 65  his branch is ne
25a50 76 65 72 20 74 61 6b 65 6e 2e 0a 20 20 20 20 20  ver taken..     
25a60 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73     */.        as
25a70 73 65 72 74 28 20 65 4f 70 21 3d 32 20 29 3b 0a  sert( eOp!=2 );.
25a80 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
25a90 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
25aa0 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 20   BTCF_ValidOvfl 
25ab0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
25ac0 74 28 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  t( pCur->pBtree-
25ad0 3e 64 62 3d 3d 70 42 74 2d 3e 64 62 20 29 3b 0a  >db==pBt->db );.
25ae0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 75 72          if( pCur
25af0 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
25b00 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  +1] ){.         
25b10 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72   nextPage = pCur
25b20 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
25b30 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  +1];.        }el
25b40 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63  se{.          rc
25b50 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61   = getOverflowPa
25b60 67 65 28 70 42 74 2c 20 6e 65 78 74 50 61 67 65  ge(pBt, nextPage
25b70 2c 20 30 2c 20 26 6e 65 78 74 50 61 67 65 29 3b  , 0, &nextPage);
25b80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
25b90 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66     offset -= ovf
25ba0 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c  lSize;.      }el
25bb0 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e  se{.        /* N
25bc0 65 65 64 20 74 6f 20 72 65 61 64 20 74 68 69 73  eed to read this
25bd0 20 70 61 67 65 20 70 72 6f 70 65 72 6c 79 2e 20   page properly. 
25be0 49 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65  It contains some
25bf0 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20   of the.        
25c00 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61 74 61  ** range of data
25c10 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 72   that is being r
25c20 65 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20  ead (eOp==0) or 
25c30 77 72 69 74 74 65 6e 20 28 65 4f 70 21 3d 30 29  written (eOp!=0)
25c40 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66  ..        */.#if
25c50 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43  def SQLITE_DIREC
25c60 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a  T_OVERFLOW_READ.
25c70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
25c80 66 69 6c 65 20 2a 66 64 3b 0a 23 65 6e 64 69 66  file *fd;.#endif
25c90 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 20 3d  .        int a =
25ca0 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20 69 66   amt;.        if
25cb0 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f  ( a + offset > o
25cc0 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  vflSize ){.     
25cd0 20 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a       a = ovflSiz
25ce0 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20  e - offset;.    
25cf0 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
25d00 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52  LITE_DIRECT_OVER
25d10 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20  FLOW_READ.      
25d20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 74 68 65 20    /* If all the 
25d30 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
25d40 75 65 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ue:.        **. 
25d50 20 20 20 20 20 20 20 2a 2a 20 20 20 31 29 20 74         **   1) t
25d60 68 69 73 20 69 73 20 61 20 72 65 61 64 20 6f 70  his is a read op
25d70 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20 0a 20 20  eration, and .  
25d80 20 20 20 20 20 20 2a 2a 20 20 20 32 29 20 64 61        **   2) da
25d90 74 61 20 69 73 20 72 65 71 75 69 72 65 64 20 66  ta is required f
25da0 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66  rom the start of
25db0 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 70   this overflow p
25dc0 61 67 65 2c 20 61 6e 64 0a 20 20 20 20 20 20 20  age, and.       
25dd0 20 2a 2a 20 20 20 33 29 20 74 68 65 20 64 61 74   **   3) the dat
25de0 61 62 61 73 65 20 69 73 20 66 69 6c 65 2d 62 61  abase is file-ba
25df0 63 6b 65 64 2c 20 61 6e 64 0a 20 20 20 20 20 20  cked, and.      
25e00 20 20 2a 2a 20 20 20 34 29 20 74 68 65 72 65 20    **   4) there 
25e10 69 73 20 6e 6f 20 6f 70 65 6e 20 77 72 69 74 65  is no open write
25e20 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e  -transaction, an
25e30 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 35  d.        **   5
25e40 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  ) the database i
25e50 73 20 6e 6f 74 20 61 20 57 41 4c 20 64 61 74 61  s not a WAL data
25e60 62 61 73 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a  base,.        **
25e70 20 20 20 36 29 20 61 6c 6c 20 64 61 74 61 20 66     6) all data f
25e80 72 6f 6d 20 74 68 65 20 70 61 67 65 20 69 73 20  rom the page is 
25e90 62 65 69 6e 67 20 72 65 61 64 2e 0a 20 20 20 20  being read..    
25ea0 20 20 20 20 2a 2a 20 20 20 37 29 20 61 74 20 6c      **   7) at l
25eb0 65 61 73 74 20 34 20 62 79 74 65 73 20 68 61 76  east 4 bytes hav
25ec0 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72  e already been r
25ed0 65 61 64 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  ead into the out
25ee0 70 75 74 20 62 75 66 66 65 72 20 0a 20 20 20 20  put buffer .    
25ef0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
25f00 2a 20 74 68 65 6e 20 64 61 74 61 20 63 61 6e 20  * then data can 
25f10 62 65 20 72 65 61 64 20 64 69 72 65 63 74 6c 79  be read directly
25f20 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
25f30 73 65 20 66 69 6c 65 20 69 6e 74 6f 20 74 68 65  se file into the
25f40 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70  .        ** outp
25f50 75 74 20 62 75 66 66 65 72 2c 20 62 79 70 61 73  ut buffer, bypas
25f60 73 69 6e 67 20 74 68 65 20 70 61 67 65 2d 63 61  sing the page-ca
25f70 63 68 65 20 61 6c 74 6f 67 65 74 68 65 72 2e 20  che altogether. 
25f80 54 68 69 73 20 73 70 65 65 64 73 0a 20 20 20 20  This speeds.    
25f90 20 20 20 20 2a 2a 20 75 70 20 6c 6f 61 64 69 6e      ** up loadin
25fa0 67 20 6c 61 72 67 65 20 72 65 63 6f 72 64 73 20  g large records 
25fb0 74 68 61 74 20 73 70 61 6e 20 6d 61 6e 79 20 6f  that span many o
25fc0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20  verflow pages.. 
25fd0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
25fe0 20 20 69 66 28 20 28 65 4f 70 26 30 78 30 31 29    if( (eOp&0x01)
25ff0 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20  ==0             
26000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26010 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31 29 20           /* (1) 
26020 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 6f  */.         && o
26030 66 66 73 65 74 3d 3d 30 20 20 20 20 20 20 20 20  ffset==0        
26040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26060 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20    /* (2) */.    
26070 20 20 20 20 20 26 26 20 28 62 45 6e 64 20 7c 7c       && (bEnd ||
26080 20 61 3d 3d 6f 76 66 6c 53 69 7a 65 29 20 20 20   a==ovflSize)   
26090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
260a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 36             /* (6
260b0 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
260c0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
260d0 69 6f 6e 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20  ion==TRANS_READ 
260e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
260f0 20 20 20 20 2f 2a 20 28 34 29 20 2a 2f 0a 20 20      /* (4) */.  
26100 20 20 20 20 20 20 20 26 26 20 28 66 64 20 3d 20         && (fd = 
26110 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
26120 28 70 42 74 2d 3e 70 50 61 67 65 72 29 29 2d 3e  (pBt->pPager))->
26130 70 4d 65 74 68 6f 64 73 20 20 20 20 20 2f 2a 20  pMethods     /* 
26140 28 33 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (3) */.         
26150 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  && pBt->pPage1->
26160 61 44 61 74 61 5b 31 39 5d 3d 3d 30 78 30 31 20  aData[19]==0x01 
26170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26180 20 20 20 20 20 20 2f 2a 20 28 35 29 20 2a 2f 0a        /* (5) */.
26190 20 20 20 20 20 20 20 20 20 26 26 20 26 70 42 75           && &pBu
261a0 66 5b 2d 34 5d 3e 3d 70 42 75 66 53 74 61 72 74  f[-4]>=pBufStart
261b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
261c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
261d0 2a 20 28 37 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (7) */.       
261e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38   ){.          u8
261f0 20 61 53 61 76 65 5b 34 5d 3b 0a 20 20 20 20 20   aSave[4];.     
26200 20 20 20 20 20 75 38 20 2a 61 57 72 69 74 65 20       u8 *aWrite 
26210 3d 20 26 70 42 75 66 5b 2d 34 5d 3b 0a 20 20 20  = &pBuf[-4];.   
26220 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 61         assert( a
26230 57 72 69 74 65 3e 3d 70 42 75 66 53 74 61 72 74  Write>=pBufStart
26240 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
26250 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 68              /* h
26260 65 6e 63 65 20 28 37 29 20 2a 2f 0a 20 20 20 20  ence (7) */.    
26270 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 53 61        memcpy(aSa
26280 76 65 2c 20 61 57 72 69 74 65 2c 20 34 29 3b 0a  ve, aWrite, 4);.
26290 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
262a0 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c  qlite3OsRead(fd,
262b0 20 61 57 72 69 74 65 2c 20 61 2b 34 2c 20 28 69   aWrite, a+4, (i
262c0 36 34 29 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  64)pBt->pageSize
262d0 2a 28 6e 65 78 74 50 61 67 65 2d 31 29 29 3b 0a  *(nextPage-1));.
262e0 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61            nextPa
262f0 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 61 57  ge = get4byte(aW
26300 72 69 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20  rite);.         
26310 20 6d 65 6d 63 70 79 28 61 57 72 69 74 65 2c 20   memcpy(aWrite, 
26320 61 53 61 76 65 2c 20 34 29 3b 0a 20 20 20 20 20  aSave, 4);.     
26330 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
26340 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
26350 20 20 20 20 20 44 62 50 61 67 65 20 2a 70 44 62       DbPage *pDb
26360 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Page;.          
26370 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
26380 72 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50  rAcquire(pBt->pP
26390 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20  ager, nextPage, 
263a0 26 70 44 62 50 61 67 65 2c 0a 20 20 20 20 20 20  &pDbPage,.      
263b0 20 20 20 20 20 20 20 20 28 28 65 4f 70 26 30 78          ((eOp&0x
263c0 30 31 29 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47  01)==0 ? PAGER_G
263d0 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29  ET_READONLY : 0)
263e0 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
263f0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
26400 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
26410 20 20 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61           aPayloa
26420 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  d = sqlite3Pager
26430 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
26440 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 65  ;.            ne
26450 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  xtPage = get4byt
26460 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20  e(aPayload);.   
26470 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f           rc = co
26480 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c  pyPayload(&aPayl
26490 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70  oad[offset+4], p
264a0 42 75 66 2c 20 61 2c 20 28 65 4f 70 26 30 78 30  Buf, a, (eOp&0x0
264b0 31 29 2c 20 70 44 62 50 61 67 65 29 3b 0a 20 20  1), pDbPage);.  
264c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
264d0 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
264e0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
264f0 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20    offset = 0;.  
26500 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26510 20 20 7d 0a 20 20 20 20 20 20 20 20 61 6d 74 20    }.        amt 
26520 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 70 42  -= a;.        pB
26530 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 7d  uf += a;.      }
26540 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
26550 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
26560 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20  && amt>0 ){.    
26570 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
26580 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
26590 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
265a0 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20  /*.** Read part 
265b0 6f 66 20 74 68 65 20 6b 65 79 20 61 73 73 6f 63  of the key assoc
265c0 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f  iated with curso
265d0 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79  r pCur.  Exactly
265e0 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20  .** "amt" bytes 
265f0 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72  will be transfer
26600 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e  red into pBuf[].
26610 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a    The transfer.*
26620 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66  * begins at "off
26630 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  set"..**.** The 
26640 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75  caller must ensu
26650 72 65 20 74 68 61 74 20 70 43 75 72 20 69 73 20  re that pCur is 
26660 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 76 61  pointing to a va
26670 6c 69 64 20 72 6f 77 0a 2a 2a 20 69 6e 20 74 68  lid row.** in th
26680 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52  e table..**.** R
26690 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
266a0 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
266b0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
266c0 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  nything goes.** 
266d0 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72  wrong.  An error
266e0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
266f0 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20  "offset+amt" is 
26700 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74  larger than.** t
26710 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79  he available pay
26720 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  load..*/.int sql
26730 69 74 65 33 42 74 72 65 65 4b 65 79 28 42 74 43  ite3BtreeKey(BtC
26740 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
26750 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74   offset, u32 amt
26760 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20  , void *pBuf){. 
26770 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
26780 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
26790 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
267a0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
267b0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
267c0 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
267d0 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50  >=0 && pCur->apP
267e0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
267f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
26800 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
26810 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50  iPage]<pCur->apP
26820 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
26830 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72 65 74  ->nCell );.  ret
26840 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61  urn accessPayloa
26850 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCur, offset, 
26860 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  amt, (unsigned c
26870 68 61 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a 7d  har*)pBuf, 0);.}
26880 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72  ../*.** Read par
26890 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 73  t of the data as
268a0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75  sociated with cu
268b0 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63  rsor pCur.  Exac
268c0 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74  tly.** "amt" byt
268d0 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73  es will be trans
268e0 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b  fered into pBuf[
268f0 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72  ].  The transfer
26900 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f  .** begins at "o
26910 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65  ffset"..**.** Re
26920 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
26930 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20  n success or an 
26940 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
26950 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
26960 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20  rong.  An error 
26970 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22  is returned if "
26980 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c  offset+amt" is l
26990 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68  arger than.** th
269a0 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c  e available payl
269b0 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  oad..*/.int sqli
269c0 74 65 33 42 74 72 65 65 44 61 74 61 28 42 74 43  te3BtreeData(BtC
269d0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
269e0 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74   offset, u32 amt
269f0 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20  , void *pBuf){. 
26a00 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e 64 65   int rc;..#ifnde
26a10 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
26a20 43 52 42 4c 4f 42 0a 20 20 69 66 20 28 20 70 43  CRBLOB.  if ( pC
26a30 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
26a40 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
26a50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
26a60 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e 64 69  ABORT;.  }.#endi
26a70 66 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  f..  assert( cur
26a80 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
26a90 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65  ur) );.  rc = re
26aa0 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
26ab0 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
26ac0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
26ad0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
26ae0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
26af0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  OR_VALID );.    
26b00 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
26b10 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  age>=0 && pCur->
26b20 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
26b30 67 65 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ge] );.    asser
26b40 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
26b50 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72  Cur->iPage]<pCur
26b60 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
26b70 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  Page]->nCell );.
26b80 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50      rc = accessP
26b90 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66  ayload(pCur, off
26ba0 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20  set, amt, pBuf, 
26bb0 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
26bc0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
26bd0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
26be0 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d  o payload inform
26bf0 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65  ation from the e
26c00 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a  ntry that the .*
26c10 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73  * pCur cursor is
26c20 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54   pointing to.  T
26c30 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f  he pointer is to
26c40 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
26c50 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20  f.** the key if 
26c60 69 6e 64 65 78 20 62 74 72 65 65 73 20 28 70 50  index btrees (pP
26c70 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30 29 20  age->intKey==0) 
26c80 61 6e 64 20 69 73 20 74 68 65 20 64 61 74 61 20  and is the data 
26c90 66 6f 72 0a 2a 2a 20 74 61 62 6c 65 20 62 74 72  for.** table btr
26ca0 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b  ees (pPage->intK
26cb0 65 79 3d 3d 31 29 2e 20 54 68 65 20 6e 75 6d 62  ey==1). The numb
26cc0 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61  er of bytes of a
26cd0 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 6b 65 79 2f  vailable.** key/
26ce0 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
26cf0 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20  into *pAmt.  If 
26d00 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74  *pAmt==0, then t
26d10 68 65 20 76 61 6c 75 65 0a 2a 2a 20 72 65 74 75  he value.** retu
26d20 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65  rned will not be
26d30 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72   a valid pointer
26d40 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
26d50 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69 6d  tine is an optim
26d60 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73 20  ization.  It is 
26d70 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65  common for the e
26d80 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64  ntire key.** and
26d90 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20   data to fit on 
26da0 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61  the local page a
26db0 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20  nd for there to 
26dc0 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a  be no overflow.*
26dd0 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74  * pages.  When t
26de0 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20  hat is so, this 
26df0 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75  routine can be u
26e00 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68  sed to access th
26e10 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74  e.** key and dat
26e20 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67  a without making
26e30 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65   a copy.  If the
26e40 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61   key and/or data
26e50 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20   spills.** onto 
26e60 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20  overflow pages, 
26e70 74 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c 6f  then accessPaylo
26e80 61 64 28 29 20 6d 75 73 74 20 62 65 20 75 73 65  ad() must be use
26e90 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a  d to reassemble.
26ea0 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61 20  ** the key/data 
26eb0 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74 6f  and copy it into
26ec0 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20   a preallocated 
26ed0 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  buffer..**.** Th
26ee0 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  e pointer return
26ef0 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  ed by this routi
26f00 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c  ne looks directl
26f10 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65  y into the cache
26f20 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68 65  d.** page of the
26f30 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
26f40 64 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e 67  data might chang
26f50 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e 65  e or move the ne
26f60 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62  xt time.** any b
26f70 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73 20  tree routine is 
26f80 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
26f90 63 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 66 65  c const void *fe
26fa0 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74  tchPayload(.  Bt
26fb0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
26fc0 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69     /* Cursor poi
26fd0 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74  nting to entry t
26fe0 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
26ff0 20 75 33 32 20 2a 70 41 6d 74 20 20 20 20 20 20   u32 *pAmt      
27000 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
27010 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61  he number of ava
27020 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65 72  ilable bytes her
27030 65 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 61 6d  e */.){.  u32 am
27040 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  t;.  assert( pCu
27050 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 50  r!=0 && pCur->iP
27060 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  age>=0 && pCur->
27070 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
27080 67 65 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge]);.  assert( 
27090 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
270a0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
270b0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
270c0 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
270d0 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
270e0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
270f0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
27100 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
27110 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
27120 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43  [pCur->iPage]<pC
27130 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
27140 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29  >iPage]->nCell )
27150 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
27160 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3e 30 20 29  ->info.nSize>0 )
27170 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
27180 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3e  ->info.pPayload>
27190 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
271a0 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44 61 74 61  r->iPage]->aData
271b0 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
271c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
271d0 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3c  ->info.pPayload<
271e0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
271f0 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44 61 74 61  r->iPage]->aData
27200 45 6e 64 20 7c 7c 43 4f 52 52 55 50 54 5f 44 42  End ||CORRUPT_DB
27210 29 3b 0a 20 20 61 6d 74 20 3d 20 28 69 6e 74 29  );.  amt = (int)
27220 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  (pCur->apPage[pC
27230 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44 61 74  ur->iPage]->aDat
27240 61 45 6e 64 20 2d 20 70 43 75 72 2d 3e 69 6e 66  aEnd - pCur->inf
27250 6f 2e 70 50 61 79 6c 6f 61 64 29 3b 0a 20 20 69  o.pPayload);.  i
27260 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  f( pCur->info.nL
27270 6f 63 61 6c 3c 61 6d 74 20 29 20 61 6d 74 20 3d  ocal<amt ) amt =
27280 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
27290 61 6c 3b 0a 20 20 2a 70 41 6d 74 20 3d 20 61 6d  al;.  *pAmt = am
272a0 74 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69  t;.  return (voi
272b0 64 2a 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50  d*)pCur->info.pP
272c0 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ayload;.}.../*.*
272d0 2a 20 46 6f 72 20 74 68 65 20 65 6e 74 72 79 20  * For the entry 
272e0 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 75 72  that cursor pCur
272f0 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65   is point to, re
27300 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20  turn as.** many 
27310 62 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65 79  bytes of the key
27320 20 6f 72 20 64 61 74 61 20 61 73 20 61 72 65 20   or data as are 
27330 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65  available on the
27340 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65   local.** b-tree
27350 20 70 61 67 65 2e 20 20 57 72 69 74 65 20 74 68   page.  Write th
27360 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69  e number of avai
27370 6c 61 62 6c 65 20 62 79 74 65 73 20 69 6e 74 6f  lable bytes into
27380 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68   *pAmt..**.** Th
27390 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  e pointer return
273a0 65 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2e  ed is ephemeral.
273b0 20 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20 6d    The key/data m
273c0 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65  ay move.** or be
273d0 20 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74 68   destroyed on th
273e0 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61  e next call to a
273f0 6e 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e 65  ny Btree routine
27400 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63  ,.** including c
27410 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72 20  alls from other 
27420 74 68 72 65 61 64 73 20 61 67 61 69 6e 73 74 20  threads against 
27430 74 68 65 20 73 61 6d 65 20 63 61 63 68 65 2e 0a  the same cache..
27440 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75 74 65  ** Hence, a mute
27450 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72 65  x on the BtShare
27460 64 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64  d should be held
27470 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
27480 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  g.** this routin
27490 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72  e..**.** These r
274a0 6f 75 74 69 6e 65 73 20 69 73 20 75 73 65 64 20  outines is used 
274b0 74 6f 20 67 65 74 20 71 75 69 63 6b 20 61 63 63  to get quick acc
274c0 65 73 73 20 74 6f 20 6b 65 79 20 61 6e 64 20 64  ess to key and d
274d0 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f  ata.** in the co
274e0 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
274f0 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  no overflow page
27500 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63  s are used..*/.c
27510 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74  onst void *sqlit
27520 65 33 42 74 72 65 65 4b 65 79 46 65 74 63 68 28  e3BtreeKeyFetch(
27530 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
27540 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20 72 65  u32 *pAmt){.  re
27550 74 75 72 6e 20 66 65 74 63 68 50 61 79 6c 6f 61  turn fetchPayloa
27560 64 28 70 43 75 72 2c 20 70 41 6d 74 29 3b 0a 7d  d(pCur, pAmt);.}
27570 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c  .const void *sql
27580 69 74 65 33 42 74 72 65 65 44 61 74 61 46 65 74  ite3BtreeDataFet
27590 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ch(BtCursor *pCu
275a0 72 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20  r, u32 *pAmt){. 
275b0 20 72 65 74 75 72 6e 20 66 65 74 63 68 50 61 79   return fetchPay
275c0 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 29  load(pCur, pAmt)
275d0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ;.}.../*.** Move
275e0 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
275f0 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20   to a new child 
27600 70 61 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67  page.  The newPg
27610 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  no argument is t
27620 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65  he.** page numbe
27630 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70  r of the child p
27640 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a  age to move to..
27650 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
27660 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ion returns SQLI
27670 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 74 68  TE_CORRUPT if th
27680 65 20 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c  e page-header fl
27690 61 67 73 20 66 69 65 6c 64 20 6f 66 0a 2a 2a 20  ags field of.** 
276a0 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61  the new child pa
276b0 67 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  ge does not matc
276c0 68 20 74 68 65 20 66 6c 61 67 73 20 66 69 65 6c  h the flags fiel
276d0 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20  d of the parent 
276e0 28 69 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e 20 69  (i.e..** if an i
276f0 6e 74 6b 65 79 20 70 61 67 65 20 61 70 70 65 61  ntkey page appea
27700 72 73 20 74 6f 20 62 65 20 74 68 65 20 70 61 72  rs to be the par
27710 65 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74  ent of a non-int
27720 6b 65 79 20 70 61 67 65 2c 20 6f 72 0a 2a 2a 20  key page, or.** 
27730 76 69 63 65 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a  vice-versa)..*/.
27740 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
27750 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20  oChild(BtCursor 
27760 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67  *pCur, u32 newPg
27770 6e 6f 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  no){.  BtShared 
27780 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
27790 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
277a0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
277b0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
277c0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
277d0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
277e0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
277f0 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41  Page<BTCURSOR_MA
27800 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73  X_DEPTH );.  ass
27810 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
27820 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75  >=0 );.  if( pCu
27830 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43 55 52  r->iPage>=(BTCUR
27840 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29  SOR_MAX_DEPTH-1)
27850 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
27860 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
27870 50 54 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  PT;.  }.  pCur->
27880 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
27890 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
278a0 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64   &= ~(BTCF_Valid
278b0 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f  NKey|BTCF_ValidO
278c0 76 66 6c 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50  vfl);.  pCur->iP
278d0 61 67 65 2b 2b 3b 0a 20 20 70 43 75 72 2d 3e 61  age++;.  pCur->a
278e0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
278f0 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  ] = 0;.  return 
27900 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
27910 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 43  Bt, newPgno, &pC
27920 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
27930 3e 69 50 61 67 65 5d 2c 0a 20 20 20 20 20 20 20  >iPage],.       
27940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27950 20 70 43 75 72 2c 20 70 43 75 72 2d 3e 63 75 72   pCur, pCur->cur
27960 50 61 67 65 72 46 6c 61 67 73 29 3b 0a 7d 0a 0a  PagerFlags);.}..
27970 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  #if SQLITE_DEBUG
27980 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61 72  ./*.** Page pPar
27990 65 6e 74 20 69 73 20 61 6e 20 69 6e 74 65 72 6e  ent is an intern
279a0 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72  al (non-leaf) tr
279b0 65 65 20 70 61 67 65 2e 20 54 68 69 73 20 66 75  ee page. This fu
279c0 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72  nction .** asser
279d0 74 73 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d  ts that page num
279e0 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68  ber iChild is th
279f0 65 20 6c 65 66 74 2d 63 68 69 6c 64 20 69 66 20  e left-child if 
27a00 74 68 65 20 69 49 64 78 27 74 68 0a 2a 2a 20 63  the iIdx'th.** c
27a10 65 6c 6c 20 69 6e 20 70 61 67 65 20 70 50 61 72  ell in page pPar
27a20 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49 64 78  ent. Or, if iIdx
27a30 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65   is equal to the
27a40 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
27a50 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50 61  .** cells in pPa
27a60 72 65 6e 74 2c 20 74 68 61 74 20 70 61 67 65 20  rent, that page 
27a70 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73  number iChild is
27a80 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
27a90 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e   of.** the page.
27aa0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
27ab0 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65  assertParentInde
27ac0 78 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65  x(MemPage *pPare
27ad0 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c 20 50 67  nt, int iIdx, Pg
27ae0 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20 69 66  no iChild){.  if
27af0 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72  ( CORRUPT_DB ) r
27b00 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63  eturn;  /* The c
27b10 6f 6e 64 69 74 69 6f 6e 73 20 74 65 73 74 65 64  onditions tested
27b20 20 62 65 6c 6f 77 20 6d 69 67 68 74 20 6e 6f 74   below might not
27b30 20 62 65 20 74 72 75 65 0a 20 20 20 20 20 20 20   be true.       
27b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b50 20 20 20 20 20 2a 2a 20 69 6e 20 61 20 63 6f 72       ** in a cor
27b60 72 75 70 74 20 64 61 74 61 62 61 73 65 20 2a 2f  rupt database */
27b70 0a 20 20 61 73 73 65 72 74 28 20 69 49 64 78 3c  .  assert( iIdx<
27b80 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20  =pParent->nCell 
27b90 29 3b 0a 20 20 69 66 28 20 69 49 64 78 3d 3d 70  );.  if( iIdx==p
27ba0 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b  Parent->nCell ){
27bb0 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74  .    assert( get
27bc0 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e  4byte(&pParent->
27bd0 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68  aData[pParent->h
27be0 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43  drOffset+8])==iC
27bf0 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  hild );.  }else{
27c00 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74  .    assert( get
27c10 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
27c20 50 61 72 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d  Parent, iIdx))==
27c30 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a  iChild );.  }.}.
27c40 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20  #else.#  define 
27c50 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65  assertParentInde
27c60 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66  x(x,y,z) .#endif
27c70 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
27c80 20 63 75 72 73 6f 72 20 75 70 20 74 6f 20 74 68   cursor up to th
27c90 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a  e parent page..*
27ca0 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20 69  *.** pCur->idx i
27cb0 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c  s set to the cel
27cc0 6c 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e  l index that con
27cd0 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65  tains the pointe
27ce0 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65  r.** to the page
27cf0 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66   we are coming f
27d00 72 6f 6d 2e 20 20 49 66 20 77 65 20 61 72 65 20  rom.  If we are 
27d10 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a  coming from the.
27d20 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68  ** right-most ch
27d30 69 6c 64 20 70 61 67 65 20 74 68 65 6e 20 70 43  ild page then pC
27d40 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74  ur->idx is set t
27d50 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a  o one more than.
27d60 2a 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20 63  ** the largest c
27d70 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74  ell index..*/.st
27d80 61 74 69 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f  atic void moveTo
27d90 50 61 72 65 6e 74 28 42 74 43 75 72 73 6f 72 20  Parent(BtCursor 
27da0 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74  *pCur){.  assert
27db0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
27dc0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
27dd0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
27de0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
27df0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
27e00 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20  ur->iPage>0 );. 
27e10 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
27e20 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
27e30 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 50 61  e] );.  assertPa
27e40 72 65 6e 74 49 6e 64 65 78 28 0a 20 20 20 20 70  rentIndex(.    p
27e50 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
27e60 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20  ->iPage-1], .   
27e70 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
27e80 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20  r->iPage-1], .  
27e90 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70    pCur->apPage[p
27ea0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e  Cur->iPage]->pgn
27eb0 6f 0a 20 20 29 3b 0a 20 20 74 65 73 74 63 61 73  o.  );.  testcas
27ec0 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  e( pCur->aiIdx[p
27ed0 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 20 3e 20  Cur->iPage-1] > 
27ee0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
27ef0 72 2d 3e 69 50 61 67 65 2d 31 5d 2d 3e 6e 43 65  r->iPage-1]->nCe
27f00 6c 6c 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e  ll );.  pCur->in
27f10 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
27f20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
27f30 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b  = ~(BTCF_ValidNK
27f40 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  ey|BTCF_ValidOvf
27f50 6c 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67  l);.  releasePag
27f60 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 61  eNotNull(pCur->a
27f70 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
27f80 65 2d 2d 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e--]);.}../*.** 
27f90 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
27fa0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
27fb0 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 74 73  root page of its
27fc0 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   b-tree structur
27fd0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
27fe0 74 61 62 6c 65 20 68 61 73 20 61 20 76 69 72 74  table has a virt
27ff0 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20 74  ual root page, t
28000 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69  hen the cursor i
28010 73 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74  s moved to point
28020 0a 2a 2a 20 74 6f 20 74 68 65 20 76 69 72 74 75  .** to the virtu
28030 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 73  al root page ins
28040 74 65 61 64 20 6f 66 20 74 68 65 20 61 63 74 75  tead of the actu
28050 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 41 20  al root page. A 
28060 74 61 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76  table has a.** v
28070 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  irtual root page
28080 20 77 68 65 6e 20 74 68 65 20 61 63 74 75 61 6c   when the actual
28090 20 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74 61   root page conta
280a0 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64  ins no cells and
280b0 20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68   a .** single ch
280c0 69 6c 64 20 70 61 67 65 2e 20 54 68 69 73 20 63  ild page. This c
280d0 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77  an only happen w
280e0 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 72 6f  ith the table ro
280f0 6f 74 65 64 20 61 74 20 70 61 67 65 20 31 2e 0a  oted at page 1..
28100 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d 74  **.** If the b-t
28110 72 65 65 20 73 74 72 75 63 74 75 72 65 20 69 73  ree structure is
28120 20 65 6d 70 74 79 2c 20 74 68 65 20 63 75 72 73   empty, the curs
28130 6f 72 20 73 74 61 74 65 20 69 73 20 73 65 74 20  or state is set 
28140 74 6f 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e  to .** CURSOR_IN
28150 56 41 4c 49 44 2e 20 4f 74 68 65 72 77 69 73 65  VALID. Otherwise
28160 2c 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  , the cursor is 
28170 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
28180 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 63 65 6c  the first.** cel
28190 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65  l located on the
281a0 20 72 6f 6f 74 20 28 6f 72 20 76 69 72 74 75 61   root (or virtua
281b0 6c 20 72 6f 6f 74 29 20 70 61 67 65 20 61 6e 64  l root) page and
281c0 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74   the cursor stat
281d0 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 43  e.** is set to C
281e0 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a  URSOR_VALID..**.
281f0 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74  ** If this funct
28200 69 6f 6e 20 72 65 74 75 72 6e 73 20 73 75 63 63  ion returns succ
28210 65 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d 61 79  essfully, it may
28220 20 62 65 20 61 73 73 75 6d 65 64 20 74 68 61 74   be assumed that
28230 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68 65 61   the.** page-hea
28240 64 65 72 20 66 6c 61 67 73 20 69 6e 64 69 63 61  der flags indica
28250 74 65 20 74 68 61 74 20 74 68 65 20 5b 76 69 72  te that the [vir
28260 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67 65 20  tual] root-page 
28270 69 73 20 74 68 65 20 65 78 70 65 63 74 65 64 20  is the expected 
28280 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d 74 72  .** kind of b-tr
28290 65 65 20 70 61 67 65 20 28 69 2e 65 2e 20 69 66  ee page (i.e. if
282a0 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68   when opening th
282b0 65 20 63 75 72 73 6f 72 20 74 68 65 20 63 61 6c  e cursor the cal
282c0 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a 20 73  ler did not.** s
282d0 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f  pecify a KeyInfo
282e0 20 73 74 72 75 63 74 75 72 65 20 74 68 65 20 66   structure the f
282f0 6c 61 67 73 20 62 79 74 65 20 69 73 20 73 65 74  lags byte is set
28300 20 74 6f 20 30 78 30 35 20 6f 72 20 30 78 30 44   to 0x05 or 0x0D
28310 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20  ,.** indicating 
28320 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 20  a table b-tree, 
28330 6f 72 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72  or if the caller
28340 20 64 69 64 20 73 70 65 63 69 66 79 20 61 20 4b   did specify a K
28350 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63  eyInfo .** struc
28360 74 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62  ture the flags b
28370 79 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78  yte is set to 0x
28380 30 32 20 6f 72 20 30 78 30 41 2c 20 69 6e 64 69  02 or 0x0A, indi
28390 63 61 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 0a  cating an index.
283a0 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73  ** b-tree)..*/.s
283b0 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
283c0 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Root(BtCursor *p
283d0 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  Cur){.  MemPage 
283e0 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63  *pRoot;.  int rc
283f0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
28400 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
28410 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
28420 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
28430 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55  SOR_INVALID < CU
28440 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
28450 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
28460 52 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43  RSOR_VALID   < C
28470 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
28480 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  K );.  assert( C
28490 55 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20  URSOR_FAULT   > 
284a0 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
284b0 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  EK );.  if( pCur
284c0 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52  ->eState>=CURSOR
284d0 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a  _REQUIRESEEK ){.
284e0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53      if( pCur->eS
284f0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55  tate==CURSOR_FAU
28500 4c 54 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  LT ){.      asse
28510 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  rt( pCur->skipNe
28520 78 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  xt!=SQLITE_OK );
28530 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43  .      return pC
28540 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20  ur->skipNext;.  
28550 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
28560 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28  treeClearCursor(
28570 70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  pCur);.  }..  if
28580 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  ( pCur->iPage>=0
28590 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70   ){.    while( p
285a0 43 75 72 2d 3e 69 50 61 67 65 20 29 7b 0a 20 20  Cur->iPage ){.  
285b0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
285c0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
285d0 50 61 67 65 5d 21 3d 30 20 29 3b 0a 20 20 20 20  Page]!=0 );.    
285e0 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74    releasePageNot
285f0 4e 75 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67  Null(pCur->apPag
28600 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 5d  e[pCur->iPage--]
28610 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
28620 20 69 66 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52   if( pCur->pgnoR
28630 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43  oot==0 ){.    pC
28640 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
28650 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
28660 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
28670 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
28680 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
28690 61 67 65 3d 3d 28 2d 31 29 20 29 3b 0a 20 20 20  age==(-1) );.   
286a0 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74   rc = getAndInit
286b0 50 61 67 65 28 70 43 75 72 2d 3e 70 42 74 72 65  Page(pCur->pBtre
286c0 65 2d 3e 70 42 74 2c 20 70 43 75 72 2d 3e 70 67  e->pBt, pCur->pg
286d0 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61  noRoot, &pCur->a
286e0 70 50 61 67 65 5b 30 5d 2c 0a 20 20 20 20 20 20  pPage[0],.      
286f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28700 20 20 30 2c 20 70 43 75 72 2d 3e 63 75 72 50 61    0, pCur->curPa
28710 67 65 72 46 6c 61 67 73 29 3b 0a 20 20 20 20 69  gerFlags);.    i
28720 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
28730 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
28740 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
28750 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 72  INVALID;.      r
28760 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
28770 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20      pCur->iPage 
28780 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 63  = 0;.    pCur->c
28790 75 72 49 6e 74 4b 65 79 20 3d 20 70 43 75 72 2d  urIntKey = pCur-
287a0 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b  >apPage[0]->intK
287b0 65 79 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f 74 20  ey;.  }.  pRoot 
287c0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  = pCur->apPage[0
287d0 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f  ];.  assert( pRo
287e0 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e  ot->pgno==pCur->
287f0 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20 20 2f  pgnoRoot );..  /
28800 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b 65 79 49  * If pCur->pKeyI
28810 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  nfo is not NULL,
28820 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72   then the caller
28830 20 74 68 61 74 20 6f 70 65 6e 65 64 20 74 68 69   that opened thi
28840 73 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 65 78  s cursor.  ** ex
28850 70 65 63 74 65 64 20 74 6f 20 6f 70 65 6e 20 69  pected to open i
28860 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d  t on an index b-
28870 74 72 65 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  tree. Otherwise,
28880 20 69 66 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a   if pKeyInfo is.
28890 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63    ** NULL, the c
288a0 61 6c 6c 65 72 20 65 78 70 65 63 74 73 20 61 20  aller expects a 
288b0 74 61 62 6c 65 20 62 2d 74 72 65 65 2e 20 49 66  table b-tree. If
288c0 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65   this is not the
288d0 20 63 61 73 65 2c 0a 20 20 2a 2a 20 72 65 74 75   case,.  ** retu
288e0 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52  rn an SQLITE_COR
288f0 52 55 50 54 20 65 72 72 6f 72 2e 20 0a 20 20 2a  RUPT error. .  *
28900 2a 0a 20 20 2a 2a 20 45 61 72 6c 69 65 72 20 76  *.  ** Earlier v
28910 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
28920 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  e assumed that t
28930 68 69 73 20 74 65 73 74 20 63 6f 75 6c 64 20 6e  his test could n
28940 6f 74 20 66 61 69 6c 0a 20 20 2a 2a 20 69 66 20  ot fail.  ** if 
28950 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 77 61  the root page wa
28960 73 20 61 6c 72 65 61 64 79 20 6c 6f 61 64 65 64  s already loaded
28970 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
28980 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 28  ion was called (
28990 69 2e 65 2e 0a 20 20 2a 2a 20 69 66 20 70 43 75  i.e..  ** if pCu
289a0 72 2d 3e 69 50 61 67 65 3e 3d 30 29 2e 20 42 75  r->iPage>=0). Bu
289b0 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20 73 6f  t this is not so
289c0 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
289d0 20 69 73 20 63 6f 72 72 75 70 74 65 64 20 0a 20   is corrupted . 
289e0 20 2a 2a 20 69 6e 20 73 75 63 68 20 61 20 77 61   ** in such a wa
289f0 79 20 74 68 61 74 20 70 61 67 65 20 70 52 6f 6f  y that page pRoo
28a00 74 20 69 73 20 6c 69 6e 6b 65 64 20 69 6e 74 6f  t is linked into
28a10 20 61 20 73 65 63 6f 6e 64 20 62 2d 74 72 65 65   a second b-tree
28a20 20 74 61 62 6c 65 20 0a 20 20 2a 2a 20 28 6f 72   table .  ** (or
28a30 20 74 68 65 20 66 72 65 65 6c 69 73 74 29 2e 20   the freelist). 
28a40 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 52   */.  assert( pR
28a50 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c  oot->intKey==1 |
28a60 7c 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d  | pRoot->intKey=
28a70 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 52 6f 6f  =0 );.  if( pRoo
28a80 74 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20  t->isInit==0 || 
28a90 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d  (pCur->pKeyInfo=
28aa0 3d 30 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b  =0)!=pRoot->intK
28ab0 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ey ){.    return
28ac0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
28ad0 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 70 43 75  BKPT;.  }..  pCu
28ae0 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b  r->aiIdx[0] = 0;
28af0 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
28b00 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
28b10 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42  >curFlags &= ~(B
28b20 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f  TCF_AtLast|BTCF_
28b30 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
28b40 61 6c 69 64 4f 76 66 6c 29 3b 0a 0a 20 20 69 66  alidOvfl);..  if
28b50 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30  ( pRoot->nCell>0
28b60 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53   ){.    pCur->eS
28b70 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41  tate = CURSOR_VA
28b80 4c 49 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  LID;.  }else if(
28b90 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b   !pRoot->leaf ){
28ba0 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70 61 67  .    Pgno subpag
28bb0 65 3b 0a 20 20 20 20 69 66 28 20 70 52 6f 6f 74  e;.    if( pRoot
28bc0 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72 65 74 75  ->pgno!=1 ) retu
28bd0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
28be0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 73 75 62 70  T_BKPT;.    subp
28bf0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
28c00 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f  pRoot->aData[pRo
28c10 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ot->hdrOffset+8]
28c20 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  );.    pCur->eSt
28c30 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
28c40 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ID;.    rc = mov
28c50 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73  eToChild(pCur, s
28c60 75 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65  ubpage);.  }else
28c70 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  {.    pCur->eSta
28c80 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
28c90 4c 49 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  LID;.  }.  retur
28ca0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
28cb0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
28cc0 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d  own to the left-
28cd0 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20  most leaf entry 
28ce0 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65  beneath the.** e
28cf0 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 69 74  ntry to which it
28d00 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
28d10 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  inting..**.** Th
28d20 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66  e left-most leaf
28d30 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68   is the one with
28d40 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65   the smallest ke
28d50 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a  y - the first.**
28d60 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
28d70 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
28d80 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  nt moveToLeftmos
28d90 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
28da0 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  ){.  Pgno pgno;.
28db0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
28dc0 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20  E_OK;.  MemPage 
28dd0 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  *pPage;..  asser
28de0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
28df0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
28e00 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
28e10 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
28e20 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63  D );.  while( rc
28e30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
28e40 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  (pPage = pCur->a
28e50 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
28e60 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  e])->leaf ){.   
28e70 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
28e80 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
28e90 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ]<pPage->nCell )
28ea0 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74  ;.    pgno = get
28eb0 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
28ec0 50 61 67 65 2c 20 70 43 75 72 2d 3e 61 69 49 64  Page, pCur->aiId
28ed0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 29  x[pCur->iPage]))
28ee0 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
28ef0 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e  oChild(pCur, pgn
28f00 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  o);.  }.  return
28f10 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f   rc;.}../*.** Mo
28f20 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
28f30 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d  wn to the right-
28f40 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20  most leaf entry 
28f50 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 70  beneath the.** p
28f60 61 67 65 20 74 6f 20 77 68 69 63 68 20 69 74 20  age to which it 
28f70 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
28f80 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74  nting.  Notice t
28f90 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a  he difference.**
28fa0 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c   between moveToL
28fb0 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f  eftmost() and mo
28fc0 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e  veToRightmost().
28fd0 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74    moveToLeftmost
28fe0 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20  ().** finds the 
28ff0 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  left-most entry 
29000 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65 6e 74  beneath the *ent
29010 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f 76 65  ry* whereas move
29020 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a  ToRightmost().**
29030 20 66 69 6e 64 73 20 74 68 65 20 72 69 67 68 74   finds the right
29040 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65  -most entry bene
29050 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a  ath the *page*..
29060 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68 74 2d  **.** The right-
29070 6d 6f 73 74 20 65 6e 74 72 79 20 69 73 20 74 68  most entry is th
29080 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6c  e one with the l
29090 61 72 67 65 73 74 20 6b 65 79 20 2d 20 74 68 65  argest key - the
290a0 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20   last.** key in 
290b0 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  ascending order.
290c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
290d0 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42  oveToRightmost(B
290e0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
290f0 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69    Pgno pgno;.  i
29100 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
29110 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  K;.  MemPage *pP
29120 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  age = 0;..  asse
29130 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
29140 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
29150 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
29160 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
29170 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 21  ID );.  while( !
29180 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  (pPage = pCur->a
29190 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
291a0 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  e])->leaf ){.   
291b0 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
291c0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
291d0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
291e0 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61  8]);.    pCur->a
291f0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
29200 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ] = pPage->nCell
29210 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
29220 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e  oChild(pCur, pgn
29230 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  o);.    if( rc )
29240 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
29250 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
29260 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61  ur->iPage] = pPa
29270 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 61  ge->nCell-1;.  a
29280 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66  ssert( pCur->inf
29290 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20  o.nSize==0 );.  
292a0 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63  assert( (pCur->c
292b0 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
292c0 61 6c 69 64 4e 4b 65 79 29 3d 3d 30 20 29 3b 0a  alidNKey)==0 );.
292d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
292e0 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  OK;.}../* Move t
292f0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
29300 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
29310 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
29320 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
29330 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74  on success.  Set
29340 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74   *pRes to 0 if t
29350 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c  he cursor actual
29360 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d  ly points to som
29370 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74  ething.** or set
29380 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74   *pRes to 1 if t
29390 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
293a0 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
293b0 33 42 74 72 65 65 46 69 72 73 74 28 42 74 43 75  3BtreeFirst(BtCu
293c0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
293d0 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
293e0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
293f0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
29400 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
29410 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
29420 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
29430 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
29440 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f    rc = moveToRoo
29450 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  t(pCur);.  if( r
29460 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
29470 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53      if( pCur->eS
29480 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
29490 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 61 73  ALID ){.      as
294a0 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
294b0 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
294c0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
294d0 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  age]->nCell==0 )
294e0 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
294f0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
29500 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
29510 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
29520 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29  Page]->nCell>0 )
29530 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
29540 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f  0;.      rc = mo
29550 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
29560 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
29570 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
29580 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
29590 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
295a0 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ry in the table.
295b0 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
295c0 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
295d0 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20  .  Set *pRes to 
295e0 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  0 if the cursor 
295f0 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20  actually points 
29600 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20  to something.** 
29610 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20  or set *pRes to 
29620 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  1 if the table i
29630 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20  s empty..*/.int 
29640 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74  sqlite3BtreeLast
29650 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
29660 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
29670 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72  nt rc;. .  asser
29680 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
29690 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
296a0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
296b0 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
296c0 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
296d0 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  x) );..  /* If t
296e0 68 65 20 63 75 72 73 6f 72 20 61 6c 72 65 61 64  he cursor alread
296f0 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  y points to the 
29700 6c 61 73 74 20 65 6e 74 72 79 2c 20 74 68 69 73  last entry, this
29710 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a   is a no-op. */.
29720 20 20 69 66 28 20 43 55 52 53 4f 52 5f 56 41 4c    if( CURSOR_VAL
29730 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
29740 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c   && (pCur->curFl
29750 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c 61 73  ags & BTCF_AtLas
29760 74 29 21 3d 30 20 29 7b 0a 23 69 66 64 65 66 20  t)!=0 ){.#ifdef 
29770 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
29780 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 73   /* This block s
29790 65 72 76 65 73 20 74 6f 20 61 73 73 65 72 74 28  erves to assert(
297a0 29 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  ) that the curso
297b0 72 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 70 6f  r really does po
297c0 69 6e 74 20 0a 20 20 20 20 2a 2a 20 74 6f 20 74  int .    ** to t
297d0 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
297e0 20 74 68 65 20 62 2d 74 72 65 65 2e 20 2a 2f 0a   the b-tree. */.
297f0 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
29800 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 43 75  for(ii=0; ii<pCu
29810 72 2d 3e 69 50 61 67 65 3b 20 69 69 2b 2b 29 7b  r->iPage; ii++){
29820 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
29830 43 75 72 2d 3e 61 69 49 64 78 5b 69 69 5d 3d 3d  Cur->aiIdx[ii]==
29840 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 69 5d  pCur->apPage[ii]
29850 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 7d  ->nCell );.    }
29860 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
29870 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
29880 50 61 67 65 5d 3d 3d 70 43 75 72 2d 3e 61 70 50  Page]==pCur->apP
29890 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
298a0 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20 20 20  ->nCell-1 );.   
298b0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
298c0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
298d0 65 5d 2d 3e 6c 65 61 66 20 29 3b 0a 23 65 6e 64  e]->leaf );.#end
298e0 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  if.    return SQ
298f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
29900 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
29910 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
29920 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
29930 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
29940 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
29950 74 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  te ){.      asse
29960 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  rt( pCur->pgnoRo
29970 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61  ot==0 || pCur->a
29980 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
29990 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  e]->nCell==0 );.
299a0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
299b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
299c0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
299d0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
299e0 41 4c 49 44 20 29 3b 0a 20 20 20 20 20 20 2a 70  ALID );.      *p
299f0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
29a00 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  c = moveToRightm
29a10 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20  ost(pCur);.     
29a20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
29a30 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  OK ){.        pC
29a40 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20  ur->curFlags |= 
29a50 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20  BTCF_AtLast;.   
29a60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29a70 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
29a80 20 26 3d 20 7e 42 54 43 46 5f 41 74 4c 61 73 74   &= ~BTCF_AtLast
29a90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 0a 20 20  ;.      }.   .  
29aa0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
29ab0 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20   rc;.}../* Move 
29ac0 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68  the cursor so th
29ad0 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  at it points to 
29ae0 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 74 68  an entry near th
29af0 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69 66  e key .** specif
29b00 69 65 64 20 62 79 20 70 49 64 78 4b 65 79 20 6f  ied by pIdxKey o
29b10 72 20 69 6e 74 4b 65 79 2e 20 20 20 52 65 74 75  r intKey.   Retu
29b20 72 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f 64  rn a success cod
29b30 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54  e..**.** For INT
29b40 4b 45 59 20 74 61 62 6c 65 73 2c 20 74 68 65 20  KEY tables, the 
29b50 69 6e 74 4b 65 79 20 70 61 72 61 6d 65 74 65 72  intKey parameter
29b60 20 69 73 20 75 73 65 64 2e 20 20 70 49 64 78 4b   is used.  pIdxK
29b70 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e  ey .** must be N
29b80 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78 20  ULL.  For index 
29b90 74 61 62 6c 65 73 2c 20 70 49 64 78 4b 65 79 20  tables, pIdxKey 
29ba0 69 73 20 75 73 65 64 20 61 6e 64 20 69 6e 74 4b  is used and intK
29bb0 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64  ey.** is ignored
29bc0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78  ..**.** If an ex
29bd0 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74  act match is not
29be0 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65   found, then the
29bf0 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79   cursor is alway
29c00 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69  s.** left pointi
29c10 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70 61 67  ng at a leaf pag
29c20 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f  e which would ho
29c30 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69 66 20  ld the entry if 
29c40 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65  it.** were prese
29c50 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20  nt.  The cursor 
29c60 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61  might point to a
29c70 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d  n entry that com
29c80 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20  es.** before or 
29c90 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a  after the key..*
29ca0 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72 20  *.** An integer 
29cb0 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
29cc0 2a 70 52 65 73 20 77 68 69 63 68 20 69 73 20 74  *pRes which is t
29cd0 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20  he result of.** 
29ce0 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b 65  comparing the ke
29cf0 79 20 77 69 74 68 20 74 68 65 20 65 6e 74 72 79  y with the entry
29d00 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 63 75   to which the cu
29d10 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e  rsor is .** poin
29d20 74 69 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e 69  ting.  The meani
29d30 6e 67 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65  ng of the intege
29d40 72 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a  r written into.*
29d50 2a 20 2a 70 52 65 73 20 69 73 20 61 73 20 66 6f  * *pRes is as fo
29d60 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
29d70 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20 54 68   *pRes<0      Th
29d80 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
29d90 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
29da0 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20  entry that.**   
29db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
29dc0 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69  s smaller than i
29dd0 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f 72  ntKey/pIdxKey or
29de0 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
29df0 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20   empty.**       
29e00 20 20 20 20 20 20 20 20 20 20 20 61 6e 64 20 74             and t
29e10 68 65 20 63 75 72 73 6f 72 20 69 73 20 74 68 65  he cursor is the
29e20 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e  refore left poin
29e30 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a  t to nothing..**
29e40 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30  .**     *pRes==0
29e50 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
29e60 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
29e70 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
29e80 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
29e90 20 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61        exactly ma
29ea0 74 63 68 65 73 20 69 6e 74 4b 65 79 2f 70 49 64  tches intKey/pId
29eb0 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  xKey..**.**     
29ec0 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54 68 65  *pRes>0      The
29ed0 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
29ee0 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
29ef0 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
29f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
29f10 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 6e 74   larger than int
29f20 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a  Key/pIdxKey..**.
29f30 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
29f40 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
29f50 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
29f60 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Cur,          /*
29f70 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 62   The cursor to b
29f80 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 55 6e 70  e moved */.  Unp
29f90 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64  ackedRecord *pId
29fa0 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61 63 6b 65  xKey, /* Unpacke
29fb0 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20  d index key */. 
29fc0 20 69 36 34 20 69 6e 74 4b 65 79 2c 20 20 20 20   i64 intKey,    
29fd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
29fe0 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f 0a 20 20   table key */.  
29ff0 69 6e 74 20 62 69 61 73 52 69 67 68 74 2c 20 20  int biasRight,  
2a000 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
2a010 72 75 65 2c 20 62 69 61 73 20 74 68 65 20 73 65  rue, bias the se
2a020 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67 68  arch to the high
2a030 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   end */.  int *p
2a040 52 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20  Res             
2a050 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72     /* Write sear
2a060 63 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  ch results here 
2a070 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
2a080 20 20 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20    RecordCompare 
2a090 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b 0a  xRecordCompare;.
2a0a0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2a0b0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
2a0c0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2a0d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2a0e0 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
2a0f0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
2a100 61 73 73 65 72 74 28 20 70 52 65 73 20 29 3b 0a  assert( pRes );.
2a110 20 20 61 73 73 65 72 74 28 20 28 70 49 64 78 4b    assert( (pIdxK
2a120 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 70  ey==0)==(pCur->p
2a130 4b 65 79 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a 0a  KeyInfo==0) );..
2a140 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73    /* If the curs
2a150 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f  or is already po
2a160 73 69 74 69 6f 6e 65 64 20 61 74 20 74 68 65 20  sitioned at the 
2a170 70 6f 69 6e 74 20 77 65 20 61 72 65 20 74 72 79  point we are try
2a180 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65  ing.  ** to move
2a190 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20 72   to, then just r
2a1a0 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f  eturn without do
2a1b0 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a  ing any work */.
2a1c0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
2a1d0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
2a1e0 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c   && (pCur->curFl
2a1f0 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
2a200 4e 4b 65 79 29 21 3d 30 0a 20 20 20 26 26 20 70  NKey)!=0.   && p
2a210 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 0a  Cur->curIntKey .
2a220 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75    ){.    if( pCu
2a230 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e  r->info.nKey==in
2a240 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70  tKey ){.      *p
2a250 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
2a260 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2a270 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
2a280 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2a290 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21 3d 30   BTCF_AtLast)!=0
2a2a0 20 26 26 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   && pCur->info.n
2a2b0 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20  Key<intKey ){.  
2a2c0 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a      *pRes = -1;.
2a2d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2a2e0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
2a2f0 7d 0a 0a 20 20 69 66 28 20 70 49 64 78 4b 65 79  }..  if( pIdxKey
2a300 20 29 7b 0a 20 20 20 20 78 52 65 63 6f 72 64 43   ){.    xRecordC
2a310 6f 6d 70 61 72 65 20 3d 20 73 71 6c 69 74 65 33  ompare = sqlite3
2a320 56 64 62 65 46 69 6e 64 43 6f 6d 70 61 72 65 28  VdbeFindCompare(
2a330 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 70 49  pIdxKey);.    pI
2a340 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20 3d  dxKey->errCode =
2a350 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
2a360 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74  pIdxKey->default
2a370 5f 72 63 3d 3d 31 20 0a 20 20 20 20 20 20 20 20  _rc==1 .        
2a380 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65 66   || pIdxKey->def
2a390 61 75 6c 74 5f 72 63 3d 3d 30 20 0a 20 20 20 20  ault_rc==0 .    
2a3a0 20 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d       || pIdxKey-
2a3b0 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 2d 31 0a  >default_rc==-1.
2a3c0 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a      );.  }else{.
2a3d0 20 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61      xRecordCompa
2a3e0 72 65 20 3d 20 30 3b 20 2f 2a 20 41 6c 6c 20 6b  re = 0; /* All k
2a3f0 65 79 73 20 61 72 65 20 69 6e 74 65 67 65 72 73  eys are integers
2a400 20 2a 2f 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20   */.  }..  rc = 
2a410 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
2a420 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
2a430 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
2a440 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2a450 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20  >pgnoRoot==0 || 
2a460 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2a470 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61  r->iPage] );.  a
2a480 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e  ssert( pCur->pgn
2a490 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72  oRoot==0 || pCur
2a4a0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2a4b0 50 61 67 65 5d 2d 3e 69 73 49 6e 69 74 20 29 3b  Page]->isInit );
2a4c0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2a4d0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2a4e0 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  INVALID || pCur-
2a4f0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2a500 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b  age]->nCell>0 );
2a510 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
2a520 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
2a530 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  LID ){.    *pRes
2a540 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72   = -1;.    asser
2a550 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t( pCur->pgnoRoo
2a560 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70  t==0 || pCur->ap
2a570 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2a580 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  ]->nCell==0 );. 
2a590 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2a5a0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  _OK;.  }.  asser
2a5b0 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
2a5c0 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 70 43 75 72  0]->intKey==pCur
2a5d0 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29 3b 0a 20  ->curIntKey );. 
2a5e0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63   assert( pCur->c
2a5f0 75 72 49 6e 74 4b 65 79 20 7c 7c 20 70 49 64 78  urIntKey || pIdx
2a600 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28 3b 3b 29  Key );.  for(;;)
2a610 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c 20 75  {.    int lwr, u
2a620 70 72 2c 20 69 64 78 2c 20 63 3b 0a 20 20 20 20  pr, idx, c;.    
2a630 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20  Pgno chldPg;.   
2a640 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
2a650 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
2a660 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20  Cur->iPage];.   
2a670 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20   u8 *pCell;     
2a680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a690 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
2a6a0 74 6f 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 20  to current cell 
2a6b0 69 6e 20 70 50 61 67 65 20 2a 2f 0a 0a 20 20 20  in pPage */..   
2a6c0 20 2f 2a 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   /* pPage->nCell
2a6d0 20 6d 75 73 74 20 62 65 20 67 72 65 61 74 65 72   must be greater
2a6e0 20 74 68 61 6e 20 7a 65 72 6f 2e 20 49 66 20 74   than zero. If t
2a6f0 68 69 73 20 69 73 20 74 68 65 20 72 6f 6f 74 2d  his is the root-
2a700 70 61 67 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  page.    ** the 
2a710 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 68 61 76  cursor would hav
2a720 65 20 62 65 65 6e 20 49 4e 56 41 4c 49 44 20 61  e been INVALID a
2a730 62 6f 76 65 20 61 6e 64 20 74 68 69 73 20 66 6f  bove and this fo
2a740 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20 20 20 2a  r(;;) loop.    *
2a750 2a 20 6e 6f 74 20 72 75 6e 2e 20 49 66 20 74 68  * not run. If th
2a760 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 72 6f  is is not the ro
2a770 6f 74 2d 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ot-page, then th
2a780 65 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20  e moveToChild() 
2a790 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 77  routine.    ** w
2a7a0 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64  ould have alread
2a7b0 79 20 64 65 74 65 63 74 65 64 20 64 62 20 63 6f  y detected db co
2a7c0 72 72 75 70 74 69 6f 6e 2e 20 53 69 6d 69 6c 61  rruption. Simila
2a7d0 72 6c 79 2c 20 70 50 61 67 65 20 6d 75 73 74 0a  rly, pPage must.
2a7e0 20 20 20 20 2a 2a 20 62 65 20 74 68 65 20 72 69      ** be the ri
2a7f0 67 68 74 20 6b 69 6e 64 20 28 69 6e 64 65 78 20  ght kind (index 
2a800 6f 72 20 74 61 62 6c 65 29 20 6f 66 20 62 2d 74  or table) of b-t
2a810 72 65 65 20 70 61 67 65 2e 20 4f 74 68 65 72 77  ree page. Otherw
2a820 69 73 65 0a 20 20 20 20 2a 2a 20 61 20 6d 6f 76  ise.    ** a mov
2a830 65 54 6f 43 68 69 6c 64 28 29 20 6f 72 20 6d 6f  eToChild() or mo
2a840 76 65 54 6f 52 6f 6f 74 28 29 20 63 61 6c 6c 20  veToRoot() call 
2a850 77 6f 75 6c 64 20 68 61 76 65 20 64 65 74 65 63  would have detec
2a860 74 65 64 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20  ted corruption. 
2a870 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
2a880 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29  pPage->nCell>0 )
2a890 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
2a8a0 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 28 70 49  age->intKey==(pI
2a8b0 64 78 4b 65 79 3d 3d 30 29 20 29 3b 0a 20 20 20  dxKey==0) );.   
2a8c0 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20 75 70   lwr = 0;.    up
2a8d0 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  r = pPage->nCell
2a8e0 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  -1;.    assert( 
2a8f0 62 69 61 73 52 69 67 68 74 3d 3d 30 20 7c 7c 20  biasRight==0 || 
2a900 62 69 61 73 52 69 67 68 74 3d 3d 31 20 29 3b 0a  biasRight==1 );.
2a910 20 20 20 20 69 64 78 20 3d 20 75 70 72 3e 3e 28      idx = upr>>(
2a920 31 2d 62 69 61 73 52 69 67 68 74 29 3b 20 2f 2a  1-biasRight); /*
2a930 20 69 64 78 20 3d 20 62 69 61 73 52 69 67 68 74   idx = biasRight
2a940 20 3f 20 75 70 72 20 3a 20 28 6c 77 72 2b 75 70   ? upr : (lwr+up
2a950 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 70 43 75  r)/2; */.    pCu
2a960 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2a970 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78  Page] = (u16)idx
2a980 3b 0a 20 20 20 20 69 66 28 20 78 52 65 63 6f 72  ;.    if( xRecor
2a990 64 43 6f 6d 70 61 72 65 3d 3d 30 20 29 7b 0a 20  dCompare==0 ){. 
2a9a0 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20       for(;;){.  
2a9b0 20 20 20 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b        i64 nCellK
2a9c0 65 79 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c  ey;.        pCel
2a9d0 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 50 61 73 74  l = findCellPast
2a9e0 50 74 72 28 70 50 61 67 65 2c 20 69 64 78 29 3b  Ptr(pPage, idx);
2a9f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
2aa00 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29  ge->intKeyLeaf )
2aa10 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  {.          whil
2aa20 65 28 20 30 78 38 30 20 3c 3d 20 2a 28 70 43 65  e( 0x80 <= *(pCe
2aa30 6c 6c 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20 20  ll++) ){.       
2aa40 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 3e 3d       if( pCell>=
2aa50 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
2aa60 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2aa70 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2aa80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2aa90 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56    }.        getV
2aaa0 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36  arint(pCell, (u6
2aab0 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20  4*)&nCellKey);. 
2aac0 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c         if( nCell
2aad0 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20  Key<intKey ){.  
2aae0 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64          lwr = id
2aaf0 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69  x+1;.          i
2ab00 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63 20  f( lwr>upr ){ c 
2ab10 3d 20 2d 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20  = -1; break; }. 
2ab20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
2ab30 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79   nCellKey>intKey
2ab40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70   ){.          up
2ab50 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20  r = idx-1;.     
2ab60 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72       if( lwr>upr
2ab70 20 29 7b 20 63 20 3d 20 2b 31 3b 20 62 72 65 61   ){ c = +1; brea
2ab80 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c  k; }.        }el
2ab90 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  se{.          as
2aba0 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d  sert( nCellKey==
2abb0 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 20 20  intKey );.      
2abc0 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
2abd0 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64  gs |= BTCF_Valid
2abe0 4e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20  NKey;.          
2abf0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20  pCur->info.nKey 
2ac00 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20  = nCellKey;.    
2ac10 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64        pCur->aiId
2ac20 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
2ac30 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20   (u16)idx;.     
2ac40 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d       if( !pPage-
2ac50 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  >leaf ){.       
2ac60 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a       lwr = idx;.
2ac70 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
2ac80 20 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79   moveto_next_lay
2ac90 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  er;.          }e
2aca0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
2acb0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
2acc0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2acd0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
2ace0 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
2acf0 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
2ad00 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2ad10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 77        assert( lw
2ad20 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20  r+upr>=0 );.    
2ad30 20 20 20 20 69 64 78 20 3d 20 28 6c 77 72 2b 75      idx = (lwr+u
2ad40 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20  pr)>>1;  /* idx 
2ad50 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a  = (lwr+upr)/2; *
2ad60 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  /.      }.    }e
2ad70 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b  lse{.      for(;
2ad80 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ;){.        int 
2ad90 6e 43 65 6c 6c 3b 20 20 2f 2a 20 53 69 7a 65 20  nCell;  /* Size 
2ada0 6f 66 20 74 68 65 20 70 43 65 6c 6c 20 63 65 6c  of the pCell cel
2adb0 6c 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  l in bytes */.  
2adc0 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69        pCell = fi
2add0 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28 70 50  ndCellPastPtr(pP
2ade0 61 67 65 2c 20 69 64 78 29 3b 0a 0a 20 20 20 20  age, idx);..    
2adf0 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d      /* The maxim
2ae00 75 6d 20 73 75 70 70 6f 72 74 65 64 20 70 61 67  um supported pag
2ae10 65 2d 73 69 7a 65 20 69 73 20 36 35 35 33 36 20  e-size is 65536 
2ae20 62 79 74 65 73 2e 20 54 68 69 73 20 6d 65 61 6e  bytes. This mean
2ae30 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  s that.        *
2ae40 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  * the maximum nu
2ae50 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 20 62  mber of record b
2ae60 79 74 65 73 20 73 74 6f 72 65 64 20 6f 6e 20 61  ytes stored on a
2ae70 6e 20 69 6e 64 65 78 20 42 2d 54 72 65 65 0a 20  n index B-Tree. 
2ae80 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69         ** page i
2ae90 73 20 6c 65 73 73 20 74 68 61 6e 20 31 36 33 38  s less than 1638
2aea0 34 20 62 79 74 65 73 20 61 6e 64 20 6d 61 79 20  4 bytes and may 
2aeb0 62 65 20 73 74 6f 72 65 64 20 61 73 20 61 20 32  be stored as a 2
2aec0 2d 62 79 74 65 0a 20 20 20 20 20 20 20 20 2a 2a  -byte.        **
2aed0 20 76 61 72 69 6e 74 2e 20 54 68 69 73 20 69 6e   varint. This in
2aee0 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
2aef0 64 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20  d to attempt to 
2af00 61 76 6f 69 64 20 70 61 72 73 69 6e 67 20 0a 20  avoid parsing . 
2af10 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e         ** the en
2af20 74 69 72 65 20 63 65 6c 6c 20 62 79 20 63 68 65  tire cell by che
2af30 63 6b 69 6e 67 20 66 6f 72 20 74 68 65 20 63 61  cking for the ca
2af40 73 65 73 20 77 68 65 72 65 20 74 68 65 20 72 65  ses where the re
2af50 63 6f 72 64 20 69 73 20 0a 20 20 20 20 20 20 20  cord is .       
2af60 20 2a 2a 20 73 74 6f 72 65 64 20 65 6e 74 69 72   ** stored entir
2af70 65 6c 79 20 77 69 74 68 69 6e 20 74 68 65 20 62  ely within the b
2af80 2d 74 72 65 65 20 70 61 67 65 20 62 79 20 69 6e  -tree page by in
2af90 73 70 65 63 74 69 6e 67 20 74 68 65 20 66 69 72  specting the fir
2afa0 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 32  st .        ** 2
2afb0 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 63 65   bytes of the ce
2afc0 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ll..        */. 
2afd0 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70         nCell = p
2afe0 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20  Cell[0];.       
2aff0 20 69 66 28 20 6e 43 65 6c 6c 3c 3d 70 50 61 67   if( nCell<=pPag
2b000 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f  e->max1bytePaylo
2b010 61 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ad ){.          
2b020 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 72  /* This branch r
2b030 75 6e 73 20 69 66 20 74 68 65 20 72 65 63 6f 72  uns if the recor
2b040 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20  d-size field of 
2b050 74 68 65 20 63 65 6c 6c 20 69 73 20 61 0a 20 20  the cell is a.  
2b060 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c          ** singl
2b070 65 20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e  e byte varint an
2b080 64 20 74 68 65 20 72 65 63 6f 72 64 20 66 69 74  d the record fit
2b090 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68  s entirely on th
2b0a0 65 20 6d 61 69 6e 0a 20 20 20 20 20 20 20 20 20  e main.         
2b0b0 20 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e   ** b-tree page.
2b0c0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74    */.          t
2b0d0 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e  estcase( pCell+n
2b0e0 43 65 6c 6c 2b 31 3d 3d 70 50 61 67 65 2d 3e 61  Cell+1==pPage->a
2b0f0 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20  DataEnd );.     
2b100 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64       c = xRecord
2b110 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28  Compare(nCell, (
2b120 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c  void*)&pCell[1],
2b130 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20   pIdxKey);.     
2b140 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 70     }else if( !(p
2b150 43 65 6c 6c 5b 31 5d 20 26 20 30 78 38 30 29 20  Cell[1] & 0x80) 
2b160 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6e  .          && (n
2b170 43 65 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30  Cell = ((nCell&0
2b180 78 37 66 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c  x7f)<<7) + pCell
2b190 5b 31 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78  [1])<=pPage->max
2b1a0 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20 20 29 7b  Local.        ){
2b1b0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
2b1c0 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69  e record-size fi
2b1d0 65 6c 64 20 69 73 20 61 20 32 20 62 79 74 65 20  eld is a 2 byte 
2b1e0 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72  varint and the r
2b1f0 65 63 6f 72 64 20 0a 20 20 20 20 20 20 20 20 20  ecord .         
2b200 20 2a 2a 20 66 69 74 73 20 65 6e 74 69 72 65 6c   ** fits entirel
2b210 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d  y on the main b-
2b220 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20  tree page.  */. 
2b230 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2b240 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 32  e( pCell+nCell+2
2b250 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e  ==pPage->aDataEn
2b260 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  d );.          c
2b270 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72   = xRecordCompar
2b280 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29  e(nCell, (void*)
2b290 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b  &pCell[2], pIdxK
2b2a0 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ey);.        }el
2b2b0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
2b2c0 20 54 68 65 20 72 65 63 6f 72 64 20 66 6c 6f 77   The record flow
2b2d0 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e 65 20  s over onto one 
2b2e0 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77  or more overflow
2b2f0 20 70 61 67 65 73 2e 20 49 6e 0a 20 20 20 20 20   pages. In.     
2b300 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61 73       ** this cas
2b310 65 20 74 68 65 20 77 68 6f 6c 65 20 63 65 6c 6c  e the whole cell
2b320 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 61 72   needs to be par
2b330 73 65 64 2c 20 61 20 62 75 66 66 65 72 20 61 6c  sed, a buffer al
2b340 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20 20 20  located.        
2b350 20 20 2a 2a 20 61 6e 64 20 61 63 63 65 73 73 50    ** and accessP
2b360 61 79 6c 6f 61 64 28 29 20 75 73 65 64 20 74 6f  ayload() used to
2b370 20 72 65 74 72 69 65 76 65 20 74 68 65 20 72 65   retrieve the re
2b380 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 0a 20 20  cord into the.  
2b390 20 20 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65          ** buffe
2b3a0 72 20 62 65 66 6f 72 65 20 56 64 62 65 52 65 63  r before VdbeRec
2b3b0 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63 61 6e  ordCompare() can
2b3c0 20 62 65 20 63 61 6c 6c 65 64 2e 20 0a 20 20 20   be called. .   
2b3d0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
2b3e0 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65      ** If the re
2b3f0 63 6f 72 64 20 69 73 20 63 6f 72 72 75 70 74 2c  cord is corrupt,
2b400 20 74 68 65 20 78 52 65 63 6f 72 64 43 6f 6d 70   the xRecordComp
2b410 61 72 65 20 72 6f 75 74 69 6e 65 20 6d 61 79 20  are routine may 
2b420 72 65 61 64 0a 20 20 20 20 20 20 20 20 20 20 2a  read.          *
2b430 2a 20 75 70 20 74 6f 20 74 77 6f 20 76 61 72 69  * up to two vari
2b440 6e 74 73 20 70 61 73 74 20 74 68 65 20 65 6e 64  nts past the end
2b450 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 2e 20   of the buffer. 
2b460 41 6e 20 65 78 74 72 61 20 31 38 20 0a 20 20 20  An extra 18 .   
2b470 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20         ** bytes 
2b480 6f 66 20 70 61 64 64 69 6e 67 20 69 73 20 61 6c  of padding is al
2b490 6c 6f 63 61 74 65 64 20 61 74 20 74 68 65 20 65  located at the e
2b4a0 6e 64 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  nd of the buffer
2b4b0 20 69 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   in.          **
2b4c0 20 63 61 73 65 20 74 68 69 73 20 68 61 70 70 65   case this happe
2b4d0 6e 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ns.  */.        
2b4e0 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79    void *pCellKey
2b4f0 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 2a  ;.          u8 *
2b500 20 63 6f 6e 73 74 20 70 43 65 6c 6c 42 6f 64 79   const pCellBody
2b510 20 3d 20 70 43 65 6c 6c 20 2d 20 70 50 61 67 65   = pCell - pPage
2b520 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
2b530 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 2d            pPage-
2b540 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67  >xParseCell(pPag
2b550 65 2c 20 70 43 65 6c 6c 42 6f 64 79 2c 20 26 70  e, pCellBody, &p
2b560 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20  Cur->info);.    
2b570 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 28 69        nCell = (i
2b580 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  nt)pCur->info.nK
2b590 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  ey;.          te
2b5a0 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3c 30 20  stcase( nCell<0 
2b5b0 29 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  );   /* True if 
2b5c0 6b 65 79 20 73 69 7a 65 20 69 73 20 32 5e 33 32  key size is 2^32
2b5d0 20 6f 72 20 6d 6f 72 65 20 2a 2f 0a 20 20 20 20   or more */.    
2b5e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2b5f0 6e 43 65 6c 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20  nCell==0 );  /* 
2b600 49 6e 76 61 6c 69 64 20 6b 65 79 20 73 69 7a 65  Invalid key size
2b610 3a 20 20 30 78 38 30 20 30 78 38 30 20 30 78 30  :  0x80 0x80 0x0
2b620 30 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74  0 */.          t
2b630 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d  estcase( nCell==
2b640 31 20 29 3b 20 20 2f 2a 20 49 6e 76 61 6c 69 64  1 );  /* Invalid
2b650 20 6b 65 79 20 73 69 7a 65 3a 20 20 30 78 38 30   key size:  0x80
2b660 20 30 78 38 30 20 30 78 30 31 20 2a 2f 0a 20 20   0x80 0x01 */.  
2b670 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2b680 28 20 6e 43 65 6c 6c 3d 3d 32 20 29 3b 20 20 2f  ( nCell==2 );  /
2b690 2a 20 4d 69 6e 69 6d 75 6d 20 6c 65 67 61 6c 20  * Minimum legal 
2b6a0 69 6e 64 65 78 20 6b 65 79 20 73 69 7a 65 20 2a  index key size *
2b6b0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
2b6c0 6e 43 65 6c 6c 3c 32 20 29 7b 0a 20 20 20 20 20  nCell<2 ){.     
2b6d0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2b6e0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2b6f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
2b700 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
2b710 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2b720 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20         pCellKey 
2b730 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
2b740 20 6e 43 65 6c 6c 2b 31 38 20 29 3b 0a 20 20 20   nCell+18 );.   
2b750 20 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c         if( pCell
2b760 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Key==0 ){.      
2b770 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2b780 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
2b790 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
2b7a0 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
2b7b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
2b7c0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2b7d0 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69  >iPage] = (u16)i
2b7e0 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  dx;.          rc
2b7f0 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64   = accessPayload
2b800 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c  (pCur, 0, nCell,
2b810 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
2b820 29 70 43 65 6c 6c 4b 65 79 2c 20 32 29 3b 0a 20  )pCellKey, 2);. 
2b830 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20           if( rc 
2b840 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
2b850 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c  qlite3_free(pCel
2b860 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20  lKey);.         
2b870 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
2b880 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20  inish;.         
2b890 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d   }.          c =
2b8a0 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28   xRecordCompare(
2b8b0 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c  nCell, pCellKey,
2b8c0 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20   pIdxKey);.     
2b8d0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2b8e0 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20  e(pCellKey);.   
2b8f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
2b900 73 73 65 72 74 28 20 0a 20 20 20 20 20 20 20 20  ssert( .        
2b910 20 20 20 20 28 70 49 64 78 4b 65 79 2d 3e 65 72      (pIdxKey->er
2b920 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 43 4f  rCode!=SQLITE_CO
2b930 52 52 55 50 54 20 7c 7c 20 63 3d 3d 30 29 0a 20  RRUPT || c==0). 
2b940 20 20 20 20 20 20 20 20 26 26 20 28 70 49 64 78          && (pIdx
2b950 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51  Key->errCode!=SQ
2b960 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 70 43  LITE_NOMEM || pC
2b970 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
2b980 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 0a 20 20  mallocFailed).  
2b990 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
2b9a0 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20   if( c<0 ){.    
2b9b0 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b        lwr = idx+
2b9c0 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
2b9d0 20 69 66 28 20 63 3e 30 20 29 7b 0a 20 20 20 20   if( c>0 ){.    
2b9e0 20 20 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d        upr = idx-
2b9f0 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
2ba00 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
2ba10 72 74 28 20 63 3d 3d 30 20 29 3b 0a 20 20 20 20  rt( c==0 );.    
2ba20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
2ba30 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2ba40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2ba50 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78       pCur->aiIdx
2ba60 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
2ba70 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20  (u16)idx;.      
2ba80 20 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 2d      if( pIdxKey-
2ba90 3e 65 72 72 43 6f 64 65 20 29 20 72 63 20 3d 20  >errCode ) rc = 
2baa0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a  SQLITE_CORRUPT;.
2bab0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
2bac0 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
2bad0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2bae0 69 66 28 20 6c 77 72 3e 75 70 72 20 29 20 62 72  if( lwr>upr ) br
2baf0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 61 73 73  eak;.        ass
2bb00 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20  ert( lwr+upr>=0 
2bb10 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d  );.        idx =
2bb20 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20   (lwr+upr)>>1;  
2bb30 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70  /* idx = (lwr+up
2bb40 72 29 2f 32 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  r)/2 */.      }.
2bb50 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
2bb60 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 7c 7c 20  ( lwr==upr+1 || 
2bb70 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26  (pPage->intKey &
2bb80 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 29 20  & !pPage->leaf) 
2bb90 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2bba0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
2bbb0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c      if( pPage->l
2bbc0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73  eaf ){.      ass
2bbd0 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
2bbe0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43  [pCur->iPage]<pC
2bbf0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2bc00 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29  >iPage]->nCell )
2bc10 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69  ;.      pCur->ai
2bc20 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2bc30 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20   = (u16)idx;.   
2bc40 20 20 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20     *pRes = c;.  
2bc50 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2bc60 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d  OK;.      goto m
2bc70 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
2bc80 20 20 7d 0a 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f    }.moveto_next_
2bc90 6c 61 79 65 72 3a 0a 20 20 20 20 69 66 28 20 6c  layer:.    if( l
2bca0 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  wr>=pPage->nCell
2bcb0 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67   ){.      chldPg
2bcc0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
2bcd0 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
2bce0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
2bcf0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2bd00 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79   chldPg = get4by
2bd10 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  te(findCell(pPag
2bd20 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a  e, lwr));.    }.
2bd30 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
2bd40 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
2bd50 75 31 36 29 6c 77 72 3b 0a 20 20 20 20 72 63 20  u16)lwr;.    rc 
2bd60 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
2bd70 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20  ur, chldPg);.   
2bd80 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b   if( rc ) break;
2bd90 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69  .  }.moveto_fini
2bda0 73 68 3a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f  sh:.  pCur->info
2bdb0 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
2bdc0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
2bdd0 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  ~(BTCF_ValidNKey
2bde0 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  |BTCF_ValidOvfl)
2bdf0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2be00 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  .../*.** Return 
2be10 54 52 55 45 20 69 66 20 74 68 65 20 63 75 72 73  TRUE if the curs
2be20 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69  or is not pointi
2be30 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f  ng at an entry o
2be40 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a  f the table..**.
2be50 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20  ** TRUE will be 
2be60 72 65 74 75 72 6e 65 64 20 61 66 74 65 72 20 61  returned after a
2be70 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
2be80 42 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65  BtreeNext() move
2be90 73 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61  s.** past the la
2bea0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
2beb0 74 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33  table or sqlite3
2bec0 42 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65  BtreePrev() move
2bed0 73 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69  s past.** the fi
2bee0 72 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45  rst entry.  TRUE
2bef0 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65   is also returne
2bf00 64 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  d if the table i
2bf10 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20  s empty..*/.int 
2bf20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28  sqlite3BtreeEof(
2bf30 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
2bf40 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74  .  /* TODO: What
2bf50 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
2bf60 73 20 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55  s in CURSOR_REQU
2bf70 49 52 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20  IRESEEK but all 
2bf80 74 61 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20  table entries.  
2bf90 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c  ** have been del
2bfa0 65 74 65 64 3f 20 54 68 69 73 20 41 50 49 20 77  eted? This API w
2bfb0 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e  ill need to chan
2bfc0 67 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20  ge to return an 
2bfd0 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20  error code.  ** 
2bfe0 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62  as well as the b
2bff0 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61  oolean result va
2c000 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75  lue..  */.  retu
2c010 72 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44  rn (CURSOR_VALID
2c020 21 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b  !=pCur->eState);
2c030 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
2c040 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
2c050 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69  the next entry i
2c060 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
2c070 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75   If.** successfu
2c080 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  l then set *pRes
2c090 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  =0.  If the curs
2c0a0 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64  or.** was alread
2c0b0 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  y pointing to th
2c0c0 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
2c0d0 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66  the database bef
2c0e0 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ore.** this rout
2c0f0 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20  ine was called, 
2c100 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31  then set *pRes=1
2c110 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e  ..**.** The main
2c120 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 69 73 20   entry point is 
2c130 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
2c140 28 29 2e 20 20 54 68 61 74 20 72 6f 75 74 69 6e  ().  That routin
2c150 65 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a  e is optimized.*
2c160 2a 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e  * for the common
2c170 20 63 61 73 65 20 6f 66 20 6d 65 72 65 6c 79 20   case of merely 
2c180 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65  incrementing the
2c190 20 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74   cell counter Bt
2c1a0 43 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20  Cursor.aiIdx.** 
2c1b0 74 6f 20 74 68 65 20 6e 65 78 74 20 63 65 6c 6c  to the next cell
2c1c0 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
2c1d0 70 61 67 65 2e 20 20 54 68 65 20 28 73 6c 6f 77  page.  The (slow
2c1e0 65 72 29 20 62 74 72 65 65 4e 65 78 74 28 29 20  er) btreeNext() 
2c1f0 68 65 6c 70 65 72 0a 2a 2a 20 72 6f 75 74 69 6e  helper.** routin
2c200 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
2c210 20 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79   it is necessary
2c220 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64 69   to move to a di
2c230 66 66 65 72 65 6e 74 20 70 61 67 65 20 6f 72 0a  fferent page or.
2c240 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ** to restore th
2c250 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  e cursor..**.** 
2c260 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  The calling func
2c270 74 69 6f 6e 20 77 69 6c 6c 20 73 65 74 20 2a 70  tion will set *p
2c280 52 65 73 20 74 6f 20 30 20 6f 72 20 31 2e 20 20  Res to 0 or 1.  
2c290 54 68 65 20 69 6e 69 74 69 61 6c 20 2a 70 52 65  The initial *pRe
2c2a0 73 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20  s value.** will 
2c2b0 62 65 20 31 20 69 66 20 74 68 65 20 63 75 72 73  be 1 if the curs
2c2c0 6f 72 20 62 65 69 6e 67 20 73 74 65 70 70 65 64  or being stepped
2c2d0 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
2c2e0 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64  an SQL index and
2c2f0 0a 2a 2a 20 69 66 20 74 68 69 73 20 72 6f 75 74  .** if this rout
2c300 69 6e 65 20 63 6f 75 6c 64 20 68 61 76 65 20 62  ine could have b
2c310 65 65 6e 20 73 6b 69 70 70 65 64 20 69 66 20 74  een skipped if t
2c320 68 61 74 20 53 51 4c 20 69 6e 64 65 78 20 68 61  hat SQL index ha
2c330 64 20 62 65 65 6e 0a 2a 2a 20 61 20 75 6e 69 71  d been.** a uniq
2c340 75 65 20 69 6e 64 65 78 2e 20 20 4f 74 68 65 72  ue index.  Other
2c350 77 69 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20  wise the caller 
2c360 77 69 6c 6c 20 68 61 76 65 20 73 65 74 20 2a 70  will have set *p
2c370 52 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20  Res to zero..** 
2c380 5a 65 72 6f 20 69 73 20 74 68 65 20 63 6f 6d 6d  Zero is the comm
2c390 6f 6e 20 63 61 73 65 2e 20 54 68 65 20 62 74 72  on case. The btr
2c3a0 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ee implementatio
2c3b0 6e 20 69 73 20 66 72 65 65 20 74 6f 20 75 73 65  n is free to use
2c3c0 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 20   the.** initial 
2c3d0 2a 70 52 65 73 20 76 61 6c 75 65 20 61 73 20 61  *pRes value as a
2c3e0 20 68 69 6e 74 20 74 6f 20 69 6d 70 72 6f 76 65   hint to improve
2c3f0 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20 62 75   performance, bu
2c400 74 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  t the current.**
2c410 20 53 51 4c 69 74 65 20 62 74 72 65 65 20 69 6d   SQLite btree im
2c420 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65  plementation doe
2c430 73 20 6e 6f 74 2e 20 28 4e 6f 74 65 20 74 68 61  s not. (Note tha
2c440 74 20 74 68 65 20 63 6f 6d 64 62 32 20 62 74 72  t the comdb2 btr
2c450 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61  ee.** implementa
2c460 74 69 6f 6e 20 64 6f 65 73 20 75 73 65 20 74 68  tion does use th
2c470 69 73 20 68 69 6e 74 2c 20 68 6f 77 65 76 65 72  is hint, however
2c480 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  .).*/.static SQL
2c490 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74  ITE_NOINLINE int
2c4a0 20 62 74 72 65 65 4e 65 78 74 28 42 74 43 75 72   btreeNext(BtCur
2c4b0 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
2c4c0 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
2c4d0 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65  .  int idx;.  Me
2c4e0 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
2c4f0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
2c500 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
2c510 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2c520 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c  r->skipNext==0 |
2c530 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  | pCur->eState!=
2c540 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2c550 20 20 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d    assert( *pRes=
2c560 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  =0 );.  if( pCur
2c570 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
2c580 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 61 73  _VALID ){.    as
2c590 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72  sert( (pCur->cur
2c5a0 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c  Flags & BTCF_Val
2c5b0 69 64 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a 20 20  idOvfl)==0 );.  
2c5c0 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
2c5d0 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
2c5e0 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
2c5f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2c600 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2c610 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53    }.    if( CURS
2c620 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
2c630 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
2c640 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
2c650 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2c660 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  _OK;.    }.    i
2c670 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  f( pCur->skipNex
2c680 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t ){.      asser
2c690 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
2c6a0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c  =CURSOR_VALID ||
2c6b0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2c6c0 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29  URSOR_SKIPNEXT )
2c6d0 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53  ;.      pCur->eS
2c6e0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41  tate = CURSOR_VA
2c6f0 4c 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70  LID;.      if( p
2c700 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3e 30 20  Cur->skipNext>0 
2c710 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
2c720 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20  >skipNext = 0;. 
2c730 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2c740 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
2c750 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69  .      pCur->ski
2c760 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d  pNext = 0;.    }
2c770 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20  .  }..  pPage = 
2c780 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2c790 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64 78  r->iPage];.  idx
2c7a0 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78   = ++pCur->aiIdx
2c7b0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
2c7c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2c7d0 69 73 49 6e 69 74 20 29 3b 0a 0a 20 20 2f 2a 20  isInit );..  /* 
2c7e0 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
2c7f0 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74 2c  file is corrupt,
2c800 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
2c810 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 6f 66  for the value of
2c820 20 69 64 78 20 0a 20 20 2a 2a 20 74 6f 20 62 65   idx .  ** to be
2c830 20 69 6e 76 61 6c 69 64 20 68 65 72 65 2e 20 54   invalid here. T
2c840 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63  his can only occ
2c850 75 72 20 69 66 20 61 20 73 65 63 6f 6e 64 20 63  ur if a second c
2c860 75 72 73 6f 72 20 6d 6f 64 69 66 69 65 73 0a 20  ursor modifies. 
2c870 20 2a 2a 20 74 68 65 20 70 61 67 65 20 77 68 69   ** the page whi
2c880 6c 65 20 63 75 72 73 6f 72 20 70 43 75 72 20 69  le cursor pCur i
2c890 73 20 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65  s holding a refe
2c8a0 72 65 6e 63 65 20 74 6f 20 69 74 2e 20 57 68 69  rence to it. Whi
2c8b0 63 68 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79  ch can.  ** only
2c8c0 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20 64   happen if the d
2c8d0 61 74 61 62 61 73 65 20 69 73 20 63 6f 72 72 75  atabase is corru
2c8e0 70 74 20 69 6e 20 73 75 63 68 20 61 20 77 61 79  pt in such a way
2c8f0 20 61 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 0a   as to link the.
2c900 20 20 2a 2a 20 70 61 67 65 20 69 6e 74 6f 20 6d    ** page into m
2c910 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 2d 74  ore than one b-t
2c920 72 65 65 20 73 74 72 75 63 74 75 72 65 2e 20 2a  ree structure. *
2c930 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 69 64  /.  testcase( id
2c940 78 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  x>pPage->nCell )
2c950 3b 0a 0a 20 20 69 66 28 20 69 64 78 3e 3d 70 50  ;..  if( idx>=pP
2c960 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  age->nCell ){.  
2c970 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
2c980 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  af ){.      rc =
2c990 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
2c9a0 72 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61  r, get4byte(&pPa
2c9b0 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
2c9c0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b  >hdrOffset+8]));
2c9d0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
2c9e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2c9f0 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65   return moveToLe
2ca00 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
2ca10 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20    }.    do{.    
2ca20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
2ca30 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
2ca40 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
2ca50 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
2ca60 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
2ca70 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2ca80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2ca90 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f    }.      moveTo
2caa0 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20  Parent(pCur);.  
2cab0 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72      pPage = pCur
2cac0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2cad0 50 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c  Page];.    }whil
2cae0 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  e( pCur->aiIdx[p
2caf0 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 50 61  Cur->iPage]>=pPa
2cb00 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
2cb10 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
2cb20 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ey ){.      retu
2cb30 72 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  rn sqlite3BtreeN
2cb40 65 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b  ext(pCur, pRes);
2cb50 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2cb60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2cb70 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
2cb80 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
2cb90 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2cba0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
2cbb0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76  {.    return mov
2cbc0 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
2cbd0 29 3b 0a 20 20 7d 0a 7d 0a 69 6e 74 20 73 71 6c  );.  }.}.int sql
2cbe0 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 42 74  ite3BtreeNext(Bt
2cbf0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
2cc00 74 20 2a 70 52 65 73 29 7b 0a 20 20 4d 65 6d 50  t *pRes){.  MemP
2cc10 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 61 73  age *pPage;.  as
2cc20 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
2cc30 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
2cc40 20 20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d    assert( pRes!=
2cc50 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a  0 );.  assert( *
2cc60 70 52 65 73 3d 3d 30 20 7c 7c 20 2a 70 52 65 73  pRes==0 || *pRes
2cc70 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
2cc80 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d   pCur->skipNext=
2cc90 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  =0 || pCur->eSta
2cca0 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2ccb0 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f   );.  pCur->info
2ccc0 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
2ccd0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
2cce0 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  ~(BTCF_ValidNKey
2ccf0 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  |BTCF_ValidOvfl)
2cd00 3b 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20  ;.  *pRes = 0;. 
2cd10 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
2cd20 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
2cd30 29 20 72 65 74 75 72 6e 20 62 74 72 65 65 4e 65  ) return btreeNe
2cd40 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a  xt(pCur, pRes);.
2cd50 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
2cd60 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2cd70 67 65 5d 3b 0a 20 20 69 66 28 20 28 2b 2b 70 43  ge];.  if( (++pC
2cd80 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2cd90 69 50 61 67 65 5d 29 3e 3d 70 50 61 67 65 2d 3e  iPage])>=pPage->
2cda0 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70 43 75  nCell ){.    pCu
2cdb0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2cdc0 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 72 65 74  Page]--;.    ret
2cdd0 75 72 6e 20 62 74 72 65 65 4e 65 78 74 28 70 43  urn btreeNext(pC
2cde0 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 7d 0a 20  ur, pRes);.  }. 
2cdf0 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
2ce00 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2ce10 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
2ce20 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 6f  e{.    return mo
2ce30 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
2ce40 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
2ce50 20 53 74 65 70 20 74 68 65 20 63 75 72 73 6f 72   Step the cursor
2ce60 20 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20   to the back to 
2ce70 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74  the previous ent
2ce80 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
2ce90 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65  se.  If.** succe
2cea0 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a  ssful then set *
2ceb0 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20  pRes=0.  If the 
2cec0 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c  cursor.** was al
2ced0 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74  ready pointing t
2cee0 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  o the first entr
2cef0 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
2cf00 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73  e before.** this
2cf10 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c   routine was cal
2cf20 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70  led, then set *p
2cf30 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  Res=1..**.** The
2cf40 20 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e   main entry poin
2cf50 74 20 69 73 20 73 71 6c 69 74 65 33 42 74 72 65  t is sqlite3Btre
2cf60 65 50 72 65 76 69 6f 75 73 28 29 2e 20 20 54 68  ePrevious().  Th
2cf70 61 74 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 70  at routine is op
2cf80 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74  timized.** for t
2cf90 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f  he common case o
2cfa0 66 20 6d 65 72 65 6c 79 20 64 65 63 72 65 6d 65  f merely decreme
2cfb0 6e 74 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 63  nting the cell c
2cfc0 6f 75 6e 74 65 72 20 42 74 43 75 72 73 6f 72 2e  ounter BtCursor.
2cfd0 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20  aiIdx.** to the 
2cfe0 70 72 65 76 69 6f 75 73 20 63 65 6c 6c 20 6f 6e  previous cell on
2cff0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
2d000 65 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72 29  e.  The (slower)
2d010 20 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 29   btreePrevious()
2d020 0a 2a 2a 20 68 65 6c 70 65 72 20 72 6f 75 74 69  .** helper routi
2d030 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
2d040 6e 20 69 74 20 69 73 20 6e 65 63 65 73 73 61 72  n it is necessar
2d050 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64  y to move to a d
2d060 69 66 66 65 72 65 6e 74 20 70 61 67 65 0a 2a 2a  ifferent page.**
2d070 20 6f 72 20 74 6f 20 72 65 73 74 6f 72 65 20 74   or to restore t
2d080 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  he cursor..**.**
2d090 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   The calling fun
2d0a0 63 74 69 6f 6e 20 77 69 6c 6c 20 73 65 74 20 2a  ction will set *
2d0b0 70 52 65 73 20 74 6f 20 30 20 6f 72 20 31 2e 20  pRes to 0 or 1. 
2d0c0 20 54 68 65 20 69 6e 69 74 69 61 6c 20 2a 70 52   The initial *pR
2d0d0 65 73 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c  es value.** will
2d0e0 20 62 65 20 31 20 69 66 20 74 68 65 20 63 75 72   be 1 if the cur
2d0f0 73 6f 72 20 62 65 69 6e 67 20 73 74 65 70 70 65  sor being steppe
2d100 64 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  d corresponds to
2d110 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e   an SQL index an
2d120 64 0a 2a 2a 20 69 66 20 74 68 69 73 20 72 6f 75  d.** if this rou
2d130 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76 65 20  tine could have 
2d140 62 65 65 6e 20 73 6b 69 70 70 65 64 20 69 66 20  been skipped if 
2d150 74 68 61 74 20 53 51 4c 20 69 6e 64 65 78 20 68  that SQL index h
2d160 61 64 20 62 65 65 6e 0a 2a 2a 20 61 20 75 6e 69  ad been.** a uni
2d170 71 75 65 20 69 6e 64 65 78 2e 20 20 4f 74 68 65  que index.  Othe
2d180 72 77 69 73 65 20 74 68 65 20 63 61 6c 6c 65 72  rwise the caller
2d190 20 77 69 6c 6c 20 68 61 76 65 20 73 65 74 20 2a   will have set *
2d1a0 70 52 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a  pRes to zero..**
2d1b0 20 5a 65 72 6f 20 69 73 20 74 68 65 20 63 6f 6d   Zero is the com
2d1c0 6d 6f 6e 20 63 61 73 65 2e 20 54 68 65 20 62 74  mon case. The bt
2d1d0 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ree implementati
2d1e0 6f 6e 20 69 73 20 66 72 65 65 20 74 6f 20 75 73  on is free to us
2d1f0 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c  e the.** initial
2d200 20 2a 70 52 65 73 20 76 61 6c 75 65 20 61 73 20   *pRes value as 
2d210 61 20 68 69 6e 74 20 74 6f 20 69 6d 70 72 6f 76  a hint to improv
2d220 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20 62  e performance, b
2d230 75 74 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  ut the current.*
2d240 2a 20 53 51 4c 69 74 65 20 62 74 72 65 65 20 69  * SQLite btree i
2d250 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f  mplementation do
2d260 65 73 20 6e 6f 74 2e 20 28 4e 6f 74 65 20 74 68  es not. (Note th
2d270 61 74 20 74 68 65 20 63 6f 6d 64 62 32 20 62 74  at the comdb2 bt
2d280 72 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  ree.** implement
2d290 61 74 69 6f 6e 20 64 6f 65 73 20 75 73 65 20 74  ation does use t
2d2a0 68 69 73 20 68 69 6e 74 2c 20 68 6f 77 65 76 65  his hint, howeve
2d2b0 72 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  r.).*/.static SQ
2d2c0 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e  LITE_NOINLINE in
2d2d0 74 20 62 74 72 65 65 50 72 65 76 69 6f 75 73 28  t btreePrevious(
2d2e0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
2d2f0 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
2d300 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20  t rc;.  MemPage 
2d310 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  *pPage;..  asser
2d320 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
2d330 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
2d340 73 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29  ssert( pRes!=0 )
2d350 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52 65  ;.  assert( *pRe
2d360 73 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  s==0 );.  assert
2d370 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
2d380 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  ==0 || pCur->eSt
2d390 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
2d3a0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  D );.  assert( (
2d3b0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2d3c0 20 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54   (BTCF_AtLast|BT
2d3d0 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43  CF_ValidOvfl|BTC
2d3e0 46 5f 56 61 6c 69 64 4e 4b 65 79 29 29 3d 3d 30  F_ValidNKey))==0
2d3f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2d400 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
2d410 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  0 );.  if( pCur-
2d420 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
2d430 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 63 20  VALID ){.    rc 
2d440 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
2d450 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
2d460 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2d470 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
2d480 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
2d490 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e     if( CURSOR_IN
2d4a0 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
2d4b0 61 74 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  ate ){.      *pR
2d4c0 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65  es = 1;.      re
2d4d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2d4e0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43      }.    if( pC
2d4f0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a  ur->skipNext ){.
2d500 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
2d510 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2d520 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  OR_VALID || pCur
2d530 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2d540 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20 20  _SKIPNEXT );.   
2d550 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
2d560 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
2d570 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
2d580 73 6b 69 70 4e 65 78 74 3c 30 20 29 7b 0a 20 20  skipNext<0 ){.  
2d590 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70        pCur->skip
2d5a0 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Next = 0;.      
2d5b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2d5c0 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
2d5d0 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
2d5e0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
2d5f0 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
2d600 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2d610 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  age];.  assert( 
2d620 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
2d630 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
2d640 65 61 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  eaf ){.    int i
2d650 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78  dx = pCur->aiIdx
2d660 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
2d670 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
2d680 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79  ild(pCur, get4by
2d690 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  te(findCell(pPag
2d6a0 65 2c 20 69 64 78 29 29 29 3b 0a 20 20 20 20 69  e, idx)));.    i
2d6b0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2d6c0 63 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  c;.    rc = move
2d6d0 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72  ToRightmost(pCur
2d6e0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2d6f0 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49  while( pCur->aiI
2d700 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d  dx[pCur->iPage]=
2d710 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
2d720 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29  pCur->iPage==0 )
2d730 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
2d740 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
2d750 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20  INVALID;.       
2d760 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
2d770 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2d780 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
2d790 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74      moveToParent
2d7a0 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCur);.    }.  
2d7b0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2d7c0 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b  info.nSize==0 );
2d7d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 43  .    assert( (pC
2d7e0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 28  ur->curFlags & (
2d7f0 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42  BTCF_ValidNKey|B
2d800 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 29 3d  TCF_ValidOvfl))=
2d810 3d 30 20 29 3b 0a 0a 20 20 20 20 70 43 75 72 2d  =0 );..    pCur-
2d820 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2d830 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65  ge]--;.    pPage
2d840 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
2d850 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
2d860 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
2d870 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c  Key && !pPage->l
2d880 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20  eaf ){.      rc 
2d890 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  = sqlite3BtreePr
2d8a0 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65  evious(pCur, pRe
2d8b0 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  s);.    }else{. 
2d8c0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2d8d0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
2d8e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e   return rc;.}.in
2d8f0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  t sqlite3BtreePr
2d900 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20  evious(BtCursor 
2d910 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
2d920 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
2d930 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
2d940 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
2d950 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 61 73   pRes!=0 );.  as
2d960 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 7c  sert( *pRes==0 |
2d970 7c 20 2a 70 52 65 73 3d 3d 31 20 29 3b 0a 20 20  | *pRes==1 );.  
2d980 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b  assert( pCur->sk
2d990 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75  ipNext==0 || pCu
2d9a0 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2d9b0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 2a 70 52  R_VALID );.  *pR
2d9c0 65 73 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  es = 0;.  pCur->
2d9d0 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54  curFlags &= ~(BT
2d9e0 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56  CF_AtLast|BTCF_V
2d9f0 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61  alidOvfl|BTCF_Va
2da00 6c 69 64 4e 4b 65 79 29 3b 0a 20 20 70 43 75 72  lidNKey);.  pCur
2da10 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
2da20 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
2da30 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
2da40 49 44 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61  ID.   || pCur->a
2da50 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2da60 5d 3d 3d 30 0a 20 20 20 7c 7c 20 70 43 75 72 2d  ]==0.   || pCur-
2da70 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2da80 61 67 65 5d 2d 3e 6c 65 61 66 3d 3d 30 0a 20 20  age]->leaf==0.  
2da90 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74  ){.    return bt
2daa0 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72  reePrevious(pCur
2dab0 2c 20 70 52 65 73 29 3b 0a 20 20 7d 0a 20 20 70  , pRes);.  }.  p
2dac0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2dad0 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 72 65 74  >iPage]--;.  ret
2dae0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2daf0 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
2db00 20 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d   a new page from
2db10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2db20 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  le..**.** The ne
2db30 77 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64  w page is marked
2db40 20 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20   as dirty.  (In 
2db50 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c  other words, sql
2db60 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
2db70 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20  .** has already 
2db80 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74  been called on t
2db90 68 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54  he new page.)  T
2dba0 68 65 20 6e 65 77 20 70 61 67 65 20 68 61 73 20  he new page has 
2dbb0 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66  also.** been ref
2dbc0 65 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20  erenced and the 
2dbd0 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20  calling routine 
2dbe0 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
2dbf0 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71  or calling.** sq
2dc00 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
2dc10 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67  ) on the new pag
2dc20 65 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e  e when it is don
2dc30 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  e..**.** SQLITE_
2dc40 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f  OK is returned o
2dc50 6e 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20  n success.  Any 
2dc60 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c  other return val
2dc70 75 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20  ue indicates.** 
2dc80 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61  an error.  *ppPa
2dc90 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  ge is set to NUL
2dca0 4c 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f  L in the event o
2dcb0 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a  f an error..**.*
2dcc0 2a 20 49 66 20 74 68 65 20 22 6e 65 61 72 62 79  * If the "nearby
2dcd0 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  " parameter is n
2dce0 6f 74 20 30 2c 20 74 68 65 6e 20 61 6e 20 65 66  ot 0, then an ef
2dcf0 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20  fort is made to 
2dd00 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67  .** locate a pag
2dd10 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70  e close to the p
2dd20 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72  age number "near
2dd30 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62  by".  This can b
2dd40 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20  e used in an.** 
2dd50 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20  attempt to keep 
2dd60 72 65 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c  related pages cl
2dd70 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65  ose to each othe
2dd80 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  r in the databas
2dd90 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68  e file,.** which
2dda0 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b   in turn can mak
2ddb0 65 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73  e database acces
2ddc0 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  s faster..**.** 
2ddd0 49 66 20 74 68 65 20 65 4d 6f 64 65 20 70 61 72  If the eMode par
2dde0 61 6d 65 74 65 72 20 69 73 20 42 54 41 4c 4c 4f  ameter is BTALLO
2ddf0 43 5f 45 58 41 43 54 20 61 6e 64 20 74 68 65 20  C_EXACT and the 
2de00 6e 65 61 72 62 79 20 70 61 67 65 20 65 78 69 73  nearby page exis
2de10 74 73 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f  ts.** anywhere o
2de20 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  n the free-list,
2de30 20 74 68 65 6e 20 69 74 20 69 73 20 67 75 61 72   then it is guar
2de40 61 6e 74 65 65 64 20 74 6f 20 62 65 20 72 65 74  anteed to be ret
2de50 75 72 6e 65 64 2e 20 20 49 66 0a 2a 2a 20 65 4d  urned.  If.** eM
2de60 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 4c  ode is BTALLOC_L
2de70 54 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  T then the page 
2de80 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65  returned will be
2de90 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
2dea0 75 61 6c 0a 2a 2a 20 74 6f 20 6e 65 61 72 62 79  ual.** to nearby
2deb0 20 69 66 20 61 6e 79 20 73 75 63 68 20 70 61 67   if any such pag
2dec0 65 20 65 78 69 73 74 73 2e 20 20 49 66 20 65 4d  e exists.  If eM
2ded0 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 41  ode is BTALLOC_A
2dee0 4e 59 20 74 68 65 6e 20 74 68 65 72 65 0a 2a 2a  NY then there.**
2def0 20 61 72 65 20 6e 6f 20 72 65 73 74 72 69 63 74   are no restrict
2df00 69 6f 6e 73 20 6f 6e 20 77 68 69 63 68 20 70 61  ions on which pa
2df10 67 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ge is returned..
2df20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
2df30 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
2df40 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2df50 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
2df60 20 62 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50   btree */.  MemP
2df70 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
2df80 20 20 20 2f 2a 20 53 74 6f 72 65 20 70 6f 69 6e     /* Store poin
2df90 74 65 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63  ter to the alloc
2dfa0 61 74 65 64 20 70 61 67 65 20 68 65 72 65 20 2a  ated page here *
2dfb0 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c  /.  Pgno *pPgno,
2dfc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
2dfd0 6f 72 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d  ore the page num
2dfe0 62 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 50 67  ber here */.  Pg
2dff0 6e 6f 20 6e 65 61 72 62 79 2c 20 20 20 20 20 20  no nearby,      
2e000 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66       /* Search f
2e010 6f 72 20 61 20 70 61 67 65 20 6e 65 61 72 20 74  or a page near t
2e020 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 75 38 20  his one */.  u8 
2e030 65 4d 6f 64 65 20 20 20 20 20 20 20 20 20 20 20  eMode           
2e040 20 20 20 20 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45      /* BTALLOC_E
2e050 58 41 43 54 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54  XACT, BTALLOC_LT
2e060 2c 20 6f 72 20 42 54 41 4c 4c 4f 43 5f 41 4e 59  , or BTALLOC_ANY
2e070 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65   */.){.  MemPage
2e080 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20   *pPage1;.  int 
2e090 72 63 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20 20  rc;.  u32 n;    
2e0a0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
2e0b0 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
2e0c0 69 73 74 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20  ist */.  u32 k; 
2e0d0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2e0e0 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74   leaves on the t
2e0f0 72 75 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65  runk of the free
2e100 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  list */.  MemPag
2e110 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20  e *pTrunk = 0;. 
2e120 20 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54   MemPage *pPrevT
2e130 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f  runk = 0;.  Pgno
2e140 20 6d 78 50 61 67 65 3b 20 20 20 20 20 2f 2a 20   mxPage;     /* 
2e150 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68  Total size of th
2e160 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2e170 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
2e180 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2e190 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
2e1a0 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d    assert( eMode=
2e1b0 3d 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20  =BTALLOC_ANY || 
2e1c0 28 6e 65 61 72 62 79 3e 30 20 26 26 20 49 66 4e  (nearby>0 && IfN
2e1d0 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 61 75  otOmitAV(pBt->au
2e1e0 74 6f 56 61 63 75 75 6d 29 29 20 29 3b 0a 20 20  toVacuum)) );.  
2e1f0 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50  pPage1 = pBt->pP
2e200 61 67 65 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d  age1;.  mxPage =
2e210 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
2e220 70 42 74 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45  pBt);.  /* EVIDE
2e230 4e 43 45 2d 4f 46 3a 20 52 2d 30 35 31 31 39 2d  NCE-OF: R-05119-
2e240 30 32 36 33 37 20 54 68 65 20 34 2d 62 79 74 65  02637 The 4-byte
2e250 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
2e260 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 33 36  ger at offset 36
2e270 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 73 74 6f  .  ** stores sto
2e280 72 65 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  res the total nu
2e290 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e  mber of pages on
2e2a0 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 2a   the freelist. *
2e2b0 2f 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65  /.  n = get4byte
2e2c0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
2e2d0 33 36 5d 29 3b 0a 20 20 74 65 73 74 63 61 73 65  36]);.  testcase
2e2e0 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20 29 3b  ( n==mxPage-1 );
2e2f0 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61 67 65  .  if( n>=mxPage
2e300 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2e310 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2e320 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e  PT;.  }.  if( n>
2e330 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  0 ){.    /* Ther
2e340 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74  e are pages on t
2e350 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65  he freelist.  Re
2e360 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65  use one of those
2e370 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50   pages. */.    P
2e380 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20  gno iTrunk;.    
2e390 75 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20  u8 searchList = 
2e3a0 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65  0; /* If the fre
2e3b0 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73  e-list must be s
2e3c0 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61  earched for 'nea
2e3d0 72 62 79 27 20 2a 2f 0a 20 20 20 20 75 33 32 20  rby' */.    u32 
2e3e0 6e 53 65 61 72 63 68 20 3d 20 30 3b 20 20 20 2f  nSearch = 0;   /
2e3f0 2a 20 43 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e  * Count of the n
2e400 75 6d 62 65 72 20 6f 66 20 73 65 61 72 63 68 20  umber of search 
2e410 61 74 74 65 6d 70 74 73 20 2a 2f 0a 20 20 20 20  attempts */.    
2e420 0a 20 20 20 20 2f 2a 20 49 66 20 65 4d 6f 64 65  .    /* If eMode
2e430 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20  ==BTALLOC_EXACT 
2e440 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20 74  and a query of t
2e450 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
2e460 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74     ** shows that
2e470 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62   the page 'nearb
2e480 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20  y' is somewhere 
2e490 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
2e4a0 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68  , then.    ** th
2e4b0 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69  e entire-list wi
2e4c0 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64 20 66  ll be searched f
2e4d0 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20  or that page..  
2e4e0 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
2e4f0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2e500 55 55 4d 0a 20 20 20 20 69 66 28 20 65 4d 6f 64  UUM.    if( eMod
2e510 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54  e==BTALLOC_EXACT
2e520 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65   ){.      if( ne
2e530 61 72 62 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a  arby<=mxPage ){.
2e540 20 20 20 20 20 20 20 20 75 38 20 65 54 79 70 65          u8 eType
2e550 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2e560 28 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20  ( nearby>0 );.  
2e570 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
2e580 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b  t->autoVacuum );
2e590 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74  .        rc = pt
2e5a0 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61  rmapGet(pBt, nea
2e5b0 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b  rby, &eType, 0);
2e5c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
2e5d0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
2e5e0 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d       if( eType==
2e5f0 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20  PTRMAP_FREEPAGE 
2e600 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 65 61  ){.          sea
2e610 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20  rchList = 1;.   
2e620 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2e630 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4d 6f     }else if( eMo
2e640 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29  de==BTALLOC_LE )
2e650 7b 0a 20 20 20 20 20 20 73 65 61 72 63 68 4c 69  {.      searchLi
2e660 73 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65  st = 1;.    }.#e
2e670 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63  ndif..    /* Dec
2e680 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d  rement the free-
2e690 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e  list count by 1.
2e6a0 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74   Set iTrunk to t
2e6b0 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a  he index of the.
2e6c0 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65      ** first fre
2e6d0 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
2e6e0 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73  e. iPrevTrunk is
2e6f0 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20   initially 1..  
2e700 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
2e710 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2e720 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
2e730 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
2e740 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 75  eturn rc;.    pu
2e750 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
2e760 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b  aData[36], n-1);
2e770 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64  ..    /* The cod
2e780 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f  e within this lo
2e790 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f  op is run only o
2e7a0 6e 63 65 20 69 66 20 74 68 65 20 27 73 65 61 72  nce if the 'sear
2e7b0 63 68 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65  chList' variable
2e7c0 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74  .    ** is not t
2e7d0 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  rue. Otherwise, 
2e7e0 69 74 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72  it runs once for
2e7f0 20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65   each trunk-page
2e800 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66   on the.    ** f
2e810 72 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74  ree-list until t
2e820 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27  he page 'nearby'
2e830 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f   is located (eMo
2e840 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43  de==BTALLOC_EXAC
2e850 54 29 0a 20 20 20 20 2a 2a 20 6f 72 20 75 6e 74  T).    ** or unt
2e860 69 6c 20 61 20 70 61 67 65 20 6c 65 73 73 20 74  il a page less t
2e870 68 61 6e 20 27 6e 65 61 72 62 79 27 20 69 73 20  han 'nearby' is 
2e880 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d  located (eMode==
2e890 42 54 41 4c 4c 4f 43 5f 4c 54 29 0a 20 20 20 20  BTALLOC_LT).    
2e8a0 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  */.    do {.    
2e8b0 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 70    pPrevTrunk = p
2e8c0 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28  Trunk;.      if(
2e8d0 20 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20   pPrevTrunk ){. 
2e8e0 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e         /* EVIDEN
2e8f0 43 45 2d 4f 46 3a 20 52 2d 30 31 35 30 36 2d 31  CE-OF: R-01506-1
2e900 31 30 35 33 20 54 68 65 20 66 69 72 73 74 20 69  1053 The first i
2e910 6e 74 65 67 65 72 20 6f 6e 20 61 20 66 72 65 65  nteger on a free
2e920 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a  list trunk page.
2e930 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68          ** is th
2e940 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
2e950 20 74 68 65 20 6e 65 78 74 20 66 72 65 65 6c 69   the next freeli
2e960 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e  st trunk page in
2e970 20 74 68 65 20 6c 69 73 74 20 6f 72 0a 20 20 20   the list or.   
2e980 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20       ** zero if 
2e990 74 68 69 73 20 69 73 20 74 68 65 20 6c 61 73 74  this is the last
2e9a0 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
2e9b0 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  page. */.       
2e9c0 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
2e9d0 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  te(&pPrevTrunk->
2e9e0 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20  aData[0]);.     
2e9f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2ea00 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
2ea10 52 2d 35 39 38 34 31 2d 31 33 37 39 38 20 54 68  R-59841-13798 Th
2ea20 65 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  e 4-byte big-end
2ea30 69 61 6e 20 69 6e 74 65 67 65 72 20 61 74 20 6f  ian integer at o
2ea40 66 66 73 65 74 20 33 32 0a 20 20 20 20 20 20 20  ffset 32.       
2ea50 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 70   ** stores the p
2ea60 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
2ea70 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
2ea80 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 6f 72  the freelist, or
2ea90 20 7a 65 72 6f 20 69 66 0a 20 20 20 20 20 20 20   zero if.       
2eaa0 20 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74   ** the freelist
2eab0 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a 20 20   is empty. */.  
2eac0 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67        iTrunk = g
2ead0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
2eae0 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20  >aData[32]);.   
2eaf0 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63     }.      testc
2eb00 61 73 65 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50  ase( iTrunk==mxP
2eb10 61 67 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28  age );.      if(
2eb20 20 69 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 7c   iTrunk>mxPage |
2eb30 7c 20 6e 53 65 61 72 63 68 2b 2b 20 3e 20 6e 20  | nSearch++ > n 
2eb40 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
2eb50 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2eb60 4b 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  KPT;.      }else
2eb70 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62  {.        rc = b
2eb80 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67  treeGetUnusedPag
2eb90 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26  e(pBt, iTrunk, &
2eba0 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  pTrunk, 0);.    
2ebb0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
2ebc0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75   ){.        pTru
2ebd0 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nk = 0;.        
2ebe0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
2ebf0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a  e_page;.      }.
2ec00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
2ec10 72 75 6e 6b 21 3d 30 20 29 3b 0a 20 20 20 20 20  runk!=0 );.     
2ec20 20 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b 2d   assert( pTrunk-
2ec30 3e 61 44 61 74 61 21 3d 30 20 29 3b 0a 20 20 20  >aData!=0 );.   
2ec40 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
2ec50 46 3a 20 52 2d 31 33 35 32 33 2d 30 34 33 39 34  F: R-13523-04394
2ec60 20 54 68 65 20 73 65 63 6f 6e 64 20 69 6e 74 65   The second inte
2ec70 67 65 72 20 6f 6e 20 61 20 66 72 65 65 6c 69 73  ger on a freelis
2ec80 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20  t trunk page.   
2ec90 20 20 20 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d     ** is the num
2eca0 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65  ber of leaf page
2ecb0 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 6f 6c   pointers to fol
2ecc0 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 6b 20  low. */.      k 
2ecd0 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
2ece0 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20  nk->aData[4]);. 
2ecf0 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26       if( k==0 &&
2ed00 20 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a   !searchList ){.
2ed10 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
2ed20 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76  runk has no leav
2ed30 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20  es and the list 
2ed40 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61  is not being sea
2ed50 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20  rched. .        
2ed60 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74 68  ** So extract th
2ed70 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73  e trunk page its
2ed80 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20 61  elf and use it a
2ed90 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20  s the newly .   
2eda0 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65       ** allocate
2edb0 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  d page */.      
2edc0 20 20 61 73 73 65 72 74 28 20 70 50 72 65 76 54    assert( pPrevT
2edd0 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20  runk==0 );.     
2ede0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2edf0 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
2ee00 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2ee10 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
2ee20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2ee30 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2ee40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ee50 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e    *pPgno = iTrun
2ee60 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  k;.        memcp
2ee70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
2ee80 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
2ee90 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
2eea0 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
2eeb0 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70  Trunk;.        p
2eec0 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20  Trunk = 0;.     
2eed0 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
2eee0 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20  ATE: %d trunk - 
2eef0 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65  %d free pages le
2ef00 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e  ft\n", *pPgno, n
2ef10 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  -1));.      }els
2ef20 65 20 69 66 28 20 6b 3e 28 75 33 32 29 28 70 42  e if( k>(u32)(pB
2ef30 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
2ef40 2d 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  - 2) ){.        
2ef50 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73  /* Value of k is
2ef60 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20   out of range.  
2ef70 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  Database corrupt
2ef80 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  ion */.        r
2ef90 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
2efa0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
2efb0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
2efc0 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66  te_page;.#ifndef
2efd0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2efe0 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65  OVACUUM.      }e
2eff0 6c 73 65 20 69 66 28 20 73 65 61 72 63 68 4c 69  lse if( searchLi
2f000 73 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  st .            
2f010 26 26 20 28 6e 65 61 72 62 79 3d 3d 69 54 72 75  && (nearby==iTru
2f020 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c 6e 65  nk || (iTrunk<ne
2f030 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42  arby && eMode==B
2f040 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20  TALLOC_LE)) .   
2f050 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a     ){.        /*
2f060 20 54 68 65 20 6c 69 73 74 20 69 73 20 62 65 69   The list is bei
2f070 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e 64 20  ng searched and 
2f080 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20  this trunk page 
2f090 69 73 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  is the page.    
2f0a0 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61      ** to alloca
2f0b0 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f  te, regardless o
2f0c0 66 20 77 68 65 74 68 65 72 20 69 74 20 68 61 73  f whether it has
2f0d0 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20   leaves..       
2f0e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70 50 67   */.        *pPg
2f0f0 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20  no = iTrunk;.   
2f100 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
2f110 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73  Trunk;.        s
2f120 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20  earchList = 0;. 
2f130 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2f140 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
2f150 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
2f160 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
2f170 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
2f180 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
2f190 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
2f1a0 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 29        if( k==0 )
2f1b0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2f1c0 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20  !pPrevTrunk ){. 
2f1d0 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
2f1e0 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
2f1f0 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
2f200 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
2f210 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2f220 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
2f230 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2f240 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62  (pPrevTrunk->pDb
2f250 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
2f260 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2f270 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2f280 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2f290 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
2f2a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2f2b0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
2f2c0 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
2f2d0 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[0], &pTrunk->a
2f2e0 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
2f2f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2f300 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2f310 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70    /* The trunk p
2f320 61 67 65 20 69 73 20 72 65 71 75 69 72 65 64 20  age is required 
2f330 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75  by the caller bu
2f340 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20  t it contains . 
2f350 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e           ** poin
2f360 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73  ters to free-lis
2f370 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69  t leaves. The fi
2f380 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73  rst leaf becomes
2f390 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20   a trunk.       
2f3a0 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68     ** page in th
2f3b0 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20  is case..       
2f3c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
2f3d0 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75  MemPage *pNewTru
2f3e0 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67  nk;.          Pg
2f3f0 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67  no iNewTrunk = g
2f400 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
2f410 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20  >aData[8]);.    
2f420 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 54 72        if( iNewTr
2f430 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20 0a 20  unk>mxPage ){ . 
2f440 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2f450 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2f460 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  KPT;.           
2f470 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
2f480 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
2f490 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74     }.          t
2f4a0 65 73 74 63 61 73 65 28 20 69 4e 65 77 54 72 75  estcase( iNewTru
2f4b0 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  nk==mxPage );.  
2f4c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72          rc = btr
2f4d0 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28  eeGetUnusedPage(
2f4e0 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20  pBt, iNewTrunk, 
2f4f0 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a  &pNewTrunk, 0);.
2f500 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
2f510 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2f520 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
2f530 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
2f540 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
2f550 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
2f560 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2f570 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61  pNewTrunk->pDbPa
2f580 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ge);.          i
2f590 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2f5a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2f5b0 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
2f5c0 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
2f5d0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
2f5e0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
2f5f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2f600 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72    memcpy(&pNewTr
2f610 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26  unk->aData[0], &
2f620 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
2f630 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
2f640 70 75 74 34 62 79 74 65 28 26 70 4e 65 77 54 72  put4byte(&pNewTr
2f650 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b  unk->aData[4], k
2f660 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  -1);.          m
2f670 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b  emcpy(&pNewTrunk
2f680 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72  ->aData[8], &pTr
2f690 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20  unk->aData[12], 
2f6a0 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20  (k-1)*4);.      
2f6b0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2f6c0 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  pNewTrunk);.    
2f6d0 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76        if( !pPrev
2f6e0 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
2f6f0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
2f700 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2f710 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70 44 62  able(pPage1->pDb
2f720 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20  Page) );.       
2f730 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
2f740 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
2f750 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  , iNewTrunk);.  
2f760 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2f770 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2f780 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2f790 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44  e(pPrevTrunk->pD
2f7a0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
2f7b0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
2f7c0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
2f7d0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
2f7e0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ge;.            
2f7f0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  }.            pu
2f800 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75  t4byte(&pPrevTru
2f810 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e  nk->aData[0], iN
2f820 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
2f830 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2f840 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
2f850 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43   0;.        TRAC
2f860 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
2f870 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65   trunk - %d free
2f880 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20   pages left\n", 
2f890 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23  *pPgno, n-1));.#
2f8a0 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73  endif.      }els
2f8b0 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20  e if( k>0 ){.   
2f8c0 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20       /* Extract 
2f8d0 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20  a leaf from the 
2f8e0 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20  trunk */.       
2f8f0 20 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20   u32 closest;.  
2f900 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65        Pgno iPage
2f910 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e  ;.        unsign
2f920 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d  ed char *aData =
2f930 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a   pTrunk->aData;.
2f940 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 61 72          if( near
2f950 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  by>0 ){.        
2f960 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20 20 20    u32 i;.       
2f970 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a     closest = 0;.
2f980 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 4d            if( eM
2f990 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20  ode==BTALLOC_LE 
2f9a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ){.            f
2f9b0 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b  or(i=0; i<k; i++
2f9c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2f9d0 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74   iPage = get4byt
2f9e0 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29  e(&aData[8+i*4])
2f9f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2fa00 69 66 28 20 69 50 61 67 65 3c 3d 6e 65 61 72 62  if( iPage<=nearb
2fa10 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  y ){.           
2fa20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69       closest = i
2fa30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2fa40 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2fa50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2fa60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2fa70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2fa80 20 20 20 20 69 6e 74 20 64 69 73 74 3b 0a 20 20      int dist;.  
2fa90 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d            dist =
2faa0 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32   sqlite3AbsInt32
2fab0 28 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61  (get4byte(&aData
2fac0 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a  [8]) - nearby);.
2fad0 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
2fae0 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a  i=1; i<k; i++){.
2faf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
2fb00 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 41 62  t d2 = sqlite3Ab
2fb10 73 49 6e 74 33 32 28 67 65 74 34 62 79 74 65 28  sInt32(get4byte(
2fb20 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d  &aData[8+i*4]) -
2fb30 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20   nearby);.      
2fb40 20 20 20 20 20 20 20 20 69 66 28 20 64 32 3c 64          if( d2<d
2fb50 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ist ){.         
2fb60 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
2fb70 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   i;.            
2fb80 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20      dist = d2;. 
2fb90 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
2fba0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2fbb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2fbc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2fbd0 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20    closest = 0;. 
2fbe0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
2fbf0 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79    iPage = get4by
2fc00 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73  te(&aData[8+clos
2fc10 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20  est*4]);.       
2fc20 20 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65   testcase( iPage
2fc30 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20  ==mxPage );.    
2fc40 20 20 20 20 69 66 28 20 69 50 61 67 65 3e 6d 78      if( iPage>mx
2fc50 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
2fc60 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
2fc70 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2fc80 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2fc90 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
2fca0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2fcb0 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65 3d  testcase( iPage=
2fcc0 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20  =mxPage );.     
2fcd0 20 20 20 69 66 28 20 21 73 65 61 72 63 68 4c 69     if( !searchLi
2fce0 73 74 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  st .         || 
2fcf0 28 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20 7c  (iPage==nearby |
2fd00 7c 20 28 69 50 61 67 65 3c 6e 65 61 72 62 79 20  | (iPage<nearby 
2fd10 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  && eMode==BTALLO
2fd20 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20 20 20  C_LE)) .        
2fd30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
2fd40 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20   noContent;.    
2fd50 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69        *pPgno = i
2fd60 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Page;.          
2fd70 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
2fd80 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20 25 64  : %d was leaf %d
2fd90 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20   of %d on trunk 
2fda0 25 64 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  %d".            
2fdb0 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65 20       ": %d more 
2fdc0 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20  free pages\n",. 
2fdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fde0 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b  *pPgno, closest+
2fdf0 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67  1, k, pTrunk->pg
2fe00 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20  no, n-1));.     
2fe10 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2fe20 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
2fe30 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
2fe40 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
2fe50 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
2fe60 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
2fe70 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b     if( closest<k
2fe80 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -1 ){.          
2fe90 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b    memcpy(&aData[
2fea0 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61  8+closest*4], &a
2feb0 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b  Data[4+k*4], 4);
2fec0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2fed0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
2fee0 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b  &aData[4], k-1);
2fef0 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e  .          noCon
2ff00 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47 65 74  tent = !btreeGet
2ff10 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20  HasContent(pBt, 
2ff20 2a 70 50 67 6e 6f 29 3f 20 50 41 47 45 52 5f 47  *pPgno)? PAGER_G
2ff30 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a 20 30  ET_NOCONTENT : 0
2ff40 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
2ff50 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50   btreeGetUnusedP
2ff60 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c  age(pBt, *pPgno,
2ff70 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65   ppPage, noConte
2ff80 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nt);.          i
2ff90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2ffa0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2ffb0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2ffc0 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29  rWrite((*ppPage)
2ffd0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2ffe0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2fff0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30000 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61             relea
30010 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
30020 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
30030 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  ppPage = 0;.    
30040 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30050 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
30060 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a  searchList = 0;.
30070 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30080 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  }.      releaseP
30090 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b  age(pPrevTrunk);
300a0 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e  .      pPrevTrun
300b0 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c  k = 0;.    }whil
300c0 65 28 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b  e( searchList );
300d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
300e0 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61   There are no pa
300f0 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
30100 69 73 74 2c 20 73 6f 20 61 70 70 65 6e 64 20 61  ist, so append a
30110 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65   new page to the
30120 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
30130 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 0a 20   image..    **. 
30140 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20     ** Normally, 
30150 6e 65 77 20 70 61 67 65 73 20 61 6c 6c 6f 63 61  new pages alloca
30160 74 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63  ted by this bloc
30170 6b 20 63 61 6e 20 62 65 20 72 65 71 75 65 73 74  k can be request
30180 65 64 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20  ed from the.    
30190 2a 2a 20 70 61 67 65 72 20 6c 61 79 65 72 20 77  ** pager layer w
301a0 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74  ith the 'no-cont
301b0 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20 54  ent' flag set. T
301c0 68 69 73 20 70 72 65 76 65 6e 74 73 20 74 68 65  his prevents the
301d0 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 66 72   pager.    ** fr
301e0 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 72 65 61  om trying to rea
301f0 64 20 74 68 65 20 70 61 67 65 73 20 63 6f 6e 74  d the pages cont
30200 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 2e 20 48  ent from disk. H
30210 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 0a 20  owever, if the. 
30220 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 74 72     ** current tr
30230 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c  ansaction has al
30240 72 65 61 64 79 20 72 75 6e 20 6f 6e 65 20 6f 72  ready run one or
30250 20 6d 6f 72 65 20 69 6e 63 72 65 6d 65 6e 74 61   more incrementa
30260 6c 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a 2a 20  l-vacuum.    ** 
30270 73 74 65 70 73 2c 20 74 68 65 6e 20 74 68 65 20  steps, then the 
30280 70 61 67 65 20 77 65 20 61 72 65 20 61 62 6f 75  page we are abou
30290 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 61  t to allocate ma
302a0 79 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74 65 6e  y contain conten
302b0 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73  t.    ** that is
302c0 20 72 65 71 75 69 72 65 64 20 69 6e 20 74 68 65   required in the
302d0 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c   event of a roll
302e0 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61  back. In this ca
302f0 73 65 2c 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f  se, do.    ** no
30300 74 20 73 65 74 20 74 68 65 20 6e 6f 2d 63 6f 6e  t set the no-con
30310 74 65 6e 74 20 66 6c 61 67 2e 20 54 68 69 73 20  tent flag. This 
30320 63 61 75 73 65 73 20 74 68 65 20 70 61 67 65 72  causes the pager
30330 20 74 6f 20 6c 6f 61 64 20 61 6e 64 20 6a 6f 75   to load and jou
30340 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20  rnal.    ** the 
30350 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e  current page con
30360 74 65 6e 74 20 62 65 66 6f 72 65 20 6f 76 65 72  tent before over
30370 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20  writing it..    
30380 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74  **.    ** Note t
30390 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77 69  hat the pager wi
303a0 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  ll not actually 
303b0 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20  attempt to load 
303c0 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20  or journal .    
303d0 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61  ** content for a
303e0 6e 79 20 70 61 67 65 20 74 68 61 74 20 72 65 61  ny page that rea
303f0 6c 6c 79 20 64 6f 65 73 20 6c 69 65 20 70 61 73  lly does lie pas
30400 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
30410 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
30420 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 53   file on disk. S
30430 6f 20 74 68 65 20 65 66 66 65 63 74 73 20 6f 66  o the effects of
30440 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65 20 6e   disabling the n
30450 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70 74 69 6d 69  o-content optimi
30460 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 65  zation.    ** he
30470 72 65 20 61 72 65 20 63 6f 6e 66 69 6e 65 64 20  re are confined 
30480 74 6f 20 74 68 6f 73 65 20 70 61 67 65 73 20 74  to those pages t
30490 68 61 74 20 6c 69 65 20 62 65 74 77 65 65 6e 20  hat lie between 
304a0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20  the end of the. 
304b0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
304c0 6d 61 67 65 20 61 6e 64 20 74 68 65 20 65 6e 64  mage and the end
304d0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
304e0 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
304f0 20 20 69 6e 74 20 62 4e 6f 43 6f 6e 74 65 6e 74    int bNoContent
30500 20 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f 6d 69 74   = (0==IfNotOmit
30510 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  AV(pBt->bDoTrunc
30520 61 74 65 29 29 3f 20 50 41 47 45 52 5f 47 45 54  ate))? PAGER_GET
30530 5f 4e 4f 43 4f 4e 54 45 4e 54 3a 30 3b 0a 0a 20  _NOCONTENT:0;.. 
30540 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
30550 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
30560 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
30570 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
30580 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 42 74  turn rc;.    pBt
30590 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 69  ->nPage++;.    i
305a0 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50  f( pBt->nPage==P
305b0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
305c0 28 70 42 74 29 20 29 20 70 42 74 2d 3e 6e 50 61  (pBt) ) pBt->nPa
305d0 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ge++;..#ifndef S
305e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
305f0 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
30600 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
30610 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
30620 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 20  Bt, pBt->nPage) 
30630 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a  ){.      /* If *
30640 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20  pPgno refers to 
30650 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  a pointer-map pa
30660 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f  ge, allocate two
30670 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20 20   new pages.     
30680 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f   ** at the end o
30690 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65  f the file inste
306a0 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66  ad of one. The f
306b0 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70  irst allocated p
306c0 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63  age.      ** bec
306d0 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74  omes a new point
306e0 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65  er-map page, the
306f0 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20   second is used 
30700 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20  by the caller.. 
30710 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65       */.      Me
30720 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a  mPage *pPg = 0;.
30730 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
30740 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20  LOCATE: %d from 
30750 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69  end of file (poi
30760 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e  nter-map page)\n
30770 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 29 3b  ", pBt->nPage));
30780 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
30790 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45 4e 44 49  Bt->nPage!=PENDI
307a0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
307b0 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) );.      rc = 
307c0 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61  btreeGetUnusedPa
307d0 67 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61  ge(pBt, pBt->nPa
307e0 67 65 2c 20 26 70 50 67 2c 20 62 4e 6f 43 6f 6e  ge, &pPg, bNoCon
307f0 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28  tent);.      if(
30800 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
30810 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
30820 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
30830 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a  (pPg->pDbPage);.
30840 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
30850 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  age(pPg);.      
30860 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  }.      if( rc )
30870 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
30880 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a    pBt->nPage++;.
30890 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e        if( pBt->n
308a0 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Page==PENDING_BY
308b0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 20  TE_PAGE(pBt) ){ 
308c0 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a  pBt->nPage++; }.
308d0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
308e0 20 70 75 74 34 62 79 74 65 28 32 38 20 2b 20 28   put4byte(28 + (
308f0 75 38 2a 29 70 42 74 2d 3e 70 50 61 67 65 31 2d  u8*)pBt->pPage1-
30900 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 6e 50 61  >aData, pBt->nPa
30910 67 65 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20  ge);.    *pPgno 
30920 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20  = pBt->nPage;.. 
30930 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e     assert( *pPgn
30940 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o!=PENDING_BYTE_
30950 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20  PAGE(pBt) );.   
30960 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e   rc = btreeGetUn
30970 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 2a 70  usedPage(pBt, *p
30980 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62 4e  Pgno, ppPage, bN
30990 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 69  oContent);.    i
309a0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
309b0 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  c;.    rc = sqli
309c0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a  te3PagerWrite((*
309d0 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
309e0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
309f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
30a00 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
30a10 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a 70  pPage);.      *p
30a20 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d  pPage = 0;.    }
30a30 0a 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c  .    TRACE(("ALL
30a40 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65  OCATE: %d from e
30a50 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a  nd of file\n", *
30a60 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20  pPgno));.  }..  
30a70 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d  assert( *pPgno!=
30a80 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
30a90 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61  E(pBt) );..end_a
30aa0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20  llocate_page:.  
30ab0 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75  releasePage(pTru
30ac0 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61  nk);.  releasePa
30ad0 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a  ge(pPrevTrunk);.
30ae0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
30af0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74  LITE_OK || sqlit
30b00 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
30b10 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  unt((*ppPage)->p
30b20 44 62 50 61 67 65 29 3c 3d 31 20 29 3b 0a 20 20  DbPage)<=1 );.  
30b30 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
30b40 54 45 5f 4f 4b 20 7c 7c 20 28 2a 70 70 50 61 67  TE_OK || (*ppPag
30b50 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b  e)->isInit==0 );
30b60 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
30b70 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
30b80 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
30b90 61 64 64 20 70 61 67 65 20 69 50 61 67 65 20 74  add page iPage t
30ba0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
30bb0 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a  ile free-list. .
30bc0 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  ** It is assumed
30bd0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
30be0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20  s not already a 
30bf0 70 61 72 74 20 6f 66 20 74 68 65 20 66 72 65 65  part of the free
30c00 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  -list..**.** The
30c10 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
30c20 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
30c30 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
30c40 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61  ction is optiona
30c50 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c  l..** If the cal
30c60 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f 20 68  ler happens to h
30c70 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ave a pointer to
30c80 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a   the MemPage obj
30c90 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f  ect .** correspo
30ca0 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20 69 50  nding to page iP
30cb0 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20 6d 61  age handy, it ma
30cc0 79 20 70 61 73 73 20 69 74 20 61 73 20 74 68 65  y pass it as the
30cd0 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a   second value. .
30ce0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  ** Otherwise, it
30cf0 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a   may pass NULL..
30d00 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74  **.** If a point
30d10 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67 65 20  er to a MemPage 
30d20 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73 65 64  object is passed
30d30 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
30d40 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20  rgument,.** its 
30d50 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
30d60 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62  is not altered b
30d70 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
30d80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
30d90 72 65 65 50 61 67 65 32 28 42 74 53 68 61 72 65  reePage2(BtShare
30da0 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20  d *pBt, MemPage 
30db0 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20  *pMemPage, Pgno 
30dc0 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67  iPage){.  MemPag
30dd0 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20  e *pTrunk = 0;  
30de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30df0 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   Free-list trunk
30e00 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   page */.  Pgno 
30e10 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20  iTrunk = 0;     
30e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30e30 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * Page number of
30e40 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   free-list trunk
30e50 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50   page */ .  MemP
30e60 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42  age *pPage1 = pB
30e70 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20 20 20  t->pPage1;      
30e80 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e  /* Local referen
30e90 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a  ce to page 1 */.
30ea0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
30eb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
30ec0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 62 65        /* Page be
30ed0 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79 20 62  ing freed. May b
30ee0 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74  e NULL. */.  int
30ef0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
30f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30f10 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
30f20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20  */.  int nFree; 
30f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30f40 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
30f50 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  ial number of pa
30f60 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74  ges on free-list
30f70 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
30f80 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
30f90 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
30fa0 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
30fb0 50 54 5f 44 42 20 7c 7c 20 69 50 61 67 65 3e 31  PT_DB || iPage>1
30fc0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
30fd0 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50  MemPage || pMemP
30fe0 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65  age->pgno==iPage
30ff0 20 29 3b 0a 0a 20 20 69 66 28 20 69 50 61 67 65   );..  if( iPage
31000 3c 32 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  <2 ) return SQLI
31010 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
31020 0a 20 20 69 66 28 20 70 4d 65 6d 50 61 67 65 20  .  if( pMemPage 
31030 29 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70  ){.    pPage = p
31040 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20 73 71 6c  MemPage;.    sql
31050 69 74 65 33 50 61 67 65 72 52 65 66 28 70 50 61  ite3PagerRef(pPa
31060 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
31070 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
31080 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b   = btreePageLook
31090 75 70 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a  up(pBt, iPage);.
310a0 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d    }..  /* Increm
310b0 65 6e 74 20 74 68 65 20 66 72 65 65 20 70 61 67  ent the free pag
310c0 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65  e count on pPage
310d0 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69  1 */.  rc = sqli
310e0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
310f0 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
31100 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
31110 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
31120 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65  nFree = get4byte
31130 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
31140 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65  36]);.  put4byte
31150 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
31160 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a  36], nFree+1);..
31170 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c    if( pBt->btsFl
31180 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45  ags & BTS_SECURE
31190 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 2f  _DELETE ){.    /
311a0 2a 20 49 66 20 74 68 65 20 73 65 63 75 72 65 5f  * If the secure_
311b0 64 65 6c 65 74 65 20 6f 70 74 69 6f 6e 20 69 73  delete option is
311c0 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20   enabled, then. 
311d0 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c     ** always ful
311e0 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c  ly overwrite del
311f0 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  eted information
31200 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20   with zeros..   
31210 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21 70 50   */.    if( (!pP
31220 61 67 65 20 26 26 20 28 28 72 63 20 3d 20 62 74  age && ((rc = bt
31230 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
31240 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30  iPage, &pPage, 0
31250 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20 7c 7c  ))!=0) ).     ||
31260 20 20 20 20 20 20 20 20 20 20 20 20 28 28 72 63              ((rc
31270 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
31280 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
31290 61 67 65 29 29 21 3d 30 29 0a 20 20 20 20 29 7b  age))!=0).    ){
312a0 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
312b0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
312c0 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65      memset(pPage
312d0 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50 61 67  ->aData, 0, pPag
312e0 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e->pBt->pageSize
312f0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
31300 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70  the database sup
31310 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
31320 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72  m, write an entr
31330 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72  y in the pointer
31340 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64  -map.  ** to ind
31350 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 70  icate that the p
31360 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a  age is free..  *
31370 2f 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56 41  /.  if( ISAUTOVA
31380 43 55 55 4d 20 29 7b 0a 20 20 20 20 70 74 72 6d  CUUM ){.    ptrm
31390 61 70 50 75 74 28 70 42 74 2c 20 69 50 61 67 65  apPut(pBt, iPage
313a0 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  , PTRMAP_FREEPAG
313b0 45 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20 20 20  E, 0, &rc);.    
313c0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72  if( rc ) goto fr
313d0 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  eepage_out;.  }.
313e0 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75  .  /* Now manipu
313f0 6c 61 74 65 20 74 68 65 20 61 63 74 75 61 6c 20  late the actual 
31400 64 61 74 61 62 61 73 65 20 66 72 65 65 2d 6c 69  database free-li
31410 73 74 20 73 74 72 75 63 74 75 72 65 2e 20 54 68  st structure. Th
31420 65 72 65 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a  ere are two.  **
31430 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73 2e 20   possibilities. 
31440 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  If the free-list
31450 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 65 6d   is currently em
31460 70 74 79 2c 20 6f 72 20 69 66 20 74 68 65 20 66  pty, or if the f
31470 69 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20  irst.  ** trunk 
31480 70 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65  page in the free
31490 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c 20 74  -list is full, t
314a0 68 65 6e 20 74 68 69 73 20 70 61 67 65 20 77 69  hen this page wi
314b0 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a  ll become a.  **
314c0 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 74   new free-list t
314d0 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65 72  runk page. Other
314e0 77 69 73 65 2c 20 69 74 20 77 69 6c 6c 20 62 65  wise, it will be
314f0 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66 20 74  come a leaf of t
31500 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72  he.  ** first tr
31510 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
31520 63 75 72 72 65 6e 74 20 66 72 65 65 2d 6c 69 73  current free-lis
31530 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 74 65  t. This block te
31540 73 74 73 20 69 66 20 69 74 0a 20 20 2a 2a 20 69  sts if it.  ** i
31550 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64  s possible to ad
31560 64 20 74 68 65 20 70 61 67 65 20 61 73 20 61 20  d the page as a 
31570 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  new free-list le
31580 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  af..  */.  if( n
31590 46 72 65 65 21 3d 30 20 29 7b 0a 20 20 20 20 75  Free!=0 ){.    u
315a0 33 32 20 6e 4c 65 61 66 3b 20 20 20 20 20 20 20  32 nLeaf;       
315b0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
315c0 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65  ial number of le
315d0 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e  af cells on trun
315e0 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69  k page */..    i
315f0 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
31600 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
31610 33 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 62  32]);.    rc = b
31620 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
31630 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b   iTrunk, &pTrunk
31640 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
31650 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
31660 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
31670 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20  ge_out;.    }.. 
31680 20 20 20 6e 4c 65 61 66 20 3d 20 67 65 74 34 62     nLeaf = get4b
31690 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
316a0 74 61 5b 34 5d 29 3b 0a 20 20 20 20 61 73 73 65  ta[4]);.    asse
316b0 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  rt( pBt->usableS
316c0 69 7a 65 3e 33 32 20 29 3b 0a 20 20 20 20 69 66  ize>32 );.    if
316d0 28 20 6e 4c 65 61 66 20 3e 20 28 75 33 32 29 70  ( nLeaf > (u32)p
316e0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34  Bt->usableSize/4
316f0 20 2d 20 32 20 29 7b 0a 20 20 20 20 20 20 72 63   - 2 ){.      rc
31700 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
31710 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  T_BKPT;.      go
31720 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
31730 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
31740 4c 65 61 66 20 3c 20 28 75 33 32 29 70 42 74 2d  Leaf < (u32)pBt-
31750 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20  >usableSize/4 - 
31760 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  8 ){.      /* In
31770 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65   this case there
31780 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68 65 20   is room on the 
31790 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20 69 6e  trunk page to in
317a0 73 65 72 74 20 74 68 65 20 70 61 67 65 0a 20 20  sert the page.  
317b0 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 66 72 65      ** being fre
317c0 65 64 20 61 73 20 61 20 6e 65 77 20 6c 65 61 66  ed as a new leaf
317d0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
317e0 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
317f0 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20  e trunk page is 
31800 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20  not really full 
31810 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e  until it contain
31820 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c  s.      ** usabl
31830 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72  eSize/4 - 2 entr
31840 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53  ies, not usableS
31850 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65  ize/4 - 8 entrie
31860 73 20 61 73 20 77 65 20 68 61 76 65 0a 20 20 20  s as we have.   
31870 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75     ** coded.  Bu
31880 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e  t due to a codin
31890 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72 73 69  g error in versi
318a0 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72  ons of SQLite pr
318b0 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ior to.      ** 
318c0 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73 65 73  3.6.0, databases
318d0 20 77 69 74 68 20 66 72 65 65 6c 69 73 74 20 74   with freelist t
318e0 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64 69  runk pages holdi
318f0 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20  ng more than.   
31900 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65     ** usableSize
31910 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 77  /4 - 8 entries w
31920 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65 64 20  ill be reported 
31930 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49 6e 20  as corrupt.  In 
31940 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 74  order.      ** t
31950 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b 77  o maintain backw
31960 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69  ards compatibili
31970 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20 76 65  ty with older ve
31980 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
31990 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 77 69  ,.      ** we wi
319a0 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 72  ll continue to r
319b0 65 73 74 72 69 63 74 20 74 68 65 20 6e 75 6d 62  estrict the numb
319c0 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 74 6f  er of entries to
319d0 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
319e0 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e  8.      ** for n
319f0 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f 69  ow.  At some poi
31a00 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  nt in the future
31a10 20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65 20   (once everyone 
31a20 68 61 73 20 75 70 67 72 61 64 65 64 0a 20 20 20  has upgraded.   
31a30 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f     ** to 3.6.0 o
31a40 72 20 6c 61 74 65 72 29 20 77 65 20 73 68 6f 75  r later) we shou
31a50 6c 64 20 63 6f 6e 73 69 64 65 72 20 66 69 78 69  ld consider fixi
31a60 6e 67 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  ng the condition
31a70 61 6c 20 61 62 6f 76 65 0a 20 20 20 20 20 20 2a  al above.      *
31a80 2a 20 74 6f 20 72 65 61 64 20 22 75 73 61 62 6c  * to read "usabl
31a90 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65  eSize/4-2" inste
31aa0 61 64 20 6f 66 20 22 75 73 61 62 6c 65 53 69 7a  ad of "usableSiz
31ab0 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2a  e/4-8"..      **
31ac0 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e  .      ** EVIDEN
31ad0 43 45 2d 4f 46 3a 20 52 2d 31 39 39 32 30 2d 31  CE-OF: R-19920-1
31ae0 31 35 37 36 20 48 6f 77 65 76 65 72 2c 20 6e 65  1576 However, ne
31af0 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  wer versions of 
31b00 53 51 4c 69 74 65 20 73 74 69 6c 6c 0a 20 20 20  SQLite still.   
31b10 20 20 20 2a 2a 20 61 76 6f 69 64 20 75 73 69 6e     ** avoid usin
31b20 67 20 74 68 65 20 6c 61 73 74 20 73 69 78 20 65  g the last six e
31b30 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 66 72  ntries in the fr
31b40 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
31b50 65 20 61 72 72 61 79 20 69 6e 0a 20 20 20 20 20  e array in.     
31b60 20 2a 2a 20 6f 72 64 65 72 20 74 68 61 74 20 64   ** order that d
31b70 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 63 72  atabase files cr
31b80 65 61 74 65 64 20 62 79 20 6e 65 77 65 72 20 76  eated by newer v
31b90 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
31ba0 65 20 63 61 6e 20 62 65 0a 20 20 20 20 20 20 2a  e can be.      *
31bb0 2a 20 72 65 61 64 20 62 79 20 6f 6c 64 65 72 20  * read by older 
31bc0 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
31bd0 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  te..      */.   
31be0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
31bf0 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
31c00 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
31c10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
31c20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
31c30 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  ut4byte(&pTrunk-
31c40 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66  >aData[4], nLeaf
31c50 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  +1);.        put
31c60 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
31c70 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c  Data[8+nLeaf*4],
31c80 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20   iPage);.       
31c90 20 69 66 28 20 70 50 61 67 65 20 26 26 20 28 70   if( pPage && (p
31ca0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
31cb0 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
31cc0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
31cd0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f    sqlite3PagerDo
31ce0 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  ntWrite(pPage->p
31cf0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
31d00 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
31d10 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65  btreeSetHasConte
31d20 6e 74 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a  nt(pBt, iPage);.
31d30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52        }.      TR
31d40 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a  ACE(("FREE-PAGE:
31d50 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e   %d leaf on trun
31d60 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70 50 61  k page %d\n",pPa
31d70 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d  ge->pgno,pTrunk-
31d80 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 67  >pgno));.      g
31d90 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
31da0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
31db0 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f  * If control flo
31dc0 77 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ws to this point
31dd0 2c 20 74 68 65 6e 20 69 74 20 77 61 73 20 6e 6f  , then it was no
31de0 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64  t possible to ad
31df0 64 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 70  d the.  ** the p
31e00 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 20  age being freed 
31e10 61 73 20 61 20 6c 65 61 66 20 70 61 67 65 20 6f  as a leaf page o
31e20 66 20 74 68 65 20 66 69 72 73 74 20 74 72 75 6e  f the first trun
31e30 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  k in the free-li
31e40 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c  st..  ** Possibl
31e50 79 20 62 65 63 61 75 73 65 20 74 68 65 20 66 72  y because the fr
31e60 65 65 2d 6c 69 73 74 20 69 73 20 65 6d 70 74 79  ee-list is empty
31e70 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79 20 62 65  , or possibly be
31e80 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20  cause the .  ** 
31e90 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74  first trunk in t
31ea0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20  he free-list is 
31eb0 66 75 6c 6c 2e 20 45 69 74 68 65 72 20 77 61 79  full. Either way
31ec0 2c 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67  , the page being
31ed0 20 66 72 65 65 64 0a 20 20 2a 2a 20 77 69 6c 6c   freed.  ** will
31ee0 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20   become the new 
31ef0 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65  first trunk page
31f00 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   in the free-lis
31f10 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  t..  */.  if( pP
31f20 61 67 65 3d 3d 30 20 26 26 20 53 51 4c 49 54 45  age==0 && SQLITE
31f30 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72 65 65  _OK!=(rc = btree
31f40 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 61  GetPage(pBt, iPa
31f50 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 20  ge, &pPage, 0)) 
31f60 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65  ){.    goto free
31f70 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  page_out;.  }.  
31f80 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
31f90 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
31fa0 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
31fb0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
31fc0 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
31fd0 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74 34  _out;.  }.  put4
31fe0 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
31ff0 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20 70 75  a, iTrunk);.  pu
32000 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
32010 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 70  Data[4], 0);.  p
32020 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
32030 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 50 61 67  >aData[32], iPag
32040 65 29 3b 0a 20 20 54 52 41 43 45 28 28 22 46 52  e);.  TRACE(("FR
32050 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20  EE-PAGE: %d new 
32060 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61  trunk page repla
32070 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50 61 67  cing %d\n", pPag
32080 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e 6b 29  e->pgno, iTrunk)
32090 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f 75 74  );..freepage_out
320a0 3a 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 7b  :.  if( pPage ){
320b0 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
320c0 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  it = 0;.  }.  re
320d0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
320e0 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
320f0 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72  pTrunk);.  retur
32100 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 76  n rc;.}.static v
32110 6f 69 64 20 66 72 65 65 50 61 67 65 28 4d 65 6d  oid freePage(Mem
32120 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
32130 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20 28 2a   *pRC){.  if( (*
32140 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  pRC)==SQLITE_OK 
32150 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 66 72  ){.    *pRC = fr
32160 65 65 50 61 67 65 32 28 70 50 61 67 65 2d 3e 70  eePage2(pPage->p
32170 42 74 2c 20 70 50 61 67 65 2c 20 70 50 61 67 65  Bt, pPage, pPage
32180 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a  ->pgno);.  }.}..
32190 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f  /*.** Free any o
321a0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73  verflow pages as
321b0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
321c0 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 20 20 57  e given Cell.  W
321d0 72 69 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 61  rite the.** loca
321e0 6c 20 43 65 6c 6c 20 73 69 7a 65 20 28 74 68 65  l Cell size (the
321f0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
32200 20 6f 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   on the original
32210 20 70 61 67 65 2c 20 6f 6d 69 74 74 69 6e 67 0a   page, omitting.
32220 2a 2a 20 6f 76 65 72 66 6c 6f 77 29 20 69 6e 74  ** overflow) int
32230 6f 20 2a 70 6e 53 69 7a 65 2e 0a 2a 2f 0a 73 74  o *pnSize..*/.st
32240 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72 43 65  atic int clearCe
32250 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ll(.  MemPage *p
32260 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f  Page,          /
32270 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
32280 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 43 65 6c  contains the Cel
32290 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  l */.  unsigned 
322a0 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20  char *pCell,    
322b0 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
322c0 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 75   the Cell */.  u
322d0 31 36 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20  16 *pnSize      
322e0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
322f0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
32300 20 43 65 6c 6c 20 68 65 72 65 20 2a 2f 0a 29 7b   Cell here */.){
32310 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
32320 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
32330 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
32340 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b    Pgno ovflPgno;
32350 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
32360 20 6e 4f 76 66 6c 3b 0a 20 20 75 33 32 20 6f 76   nOvfl;.  u32 ov
32370 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61  flPageSize;..  a
32380 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
32390 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
323a0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
323b0 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
323c0 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
323d0 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 2a 70 6e 53  , &info);.  *pnS
323e0 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65  ize = info.nSize
323f0 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76  ;.  if( info.iOv
32400 65 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20  erflow==0 ){.   
32410 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
32420 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c  K;  /* No overfl
32430 6f 77 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e  ow pages. Return
32440 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
32450 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20  nything */.  }. 
32460 20 69 66 28 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e   if( pCell+info.
32470 69 4f 76 65 72 66 6c 6f 77 2b 33 20 3e 20 70 50  iOverflow+3 > pP
32480 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65  age->aData+pPage
32490 2d 3e 6d 61 73 6b 50 61 67 65 20 29 7b 0a 20 20  ->maskPage ){.  
324a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
324b0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 20 2f  CORRUPT_BKPT;  /
324c0 2a 20 43 65 6c 6c 20 65 78 74 65 6e 64 73 20 70  * Cell extends p
324d0 61 73 74 20 65 6e 64 20 6f 66 20 70 61 67 65 20  ast end of page 
324e0 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e  */.  }.  ovflPgn
324f0 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43  o = get4byte(&pC
32500 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
32510 6f 77 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ow]);.  assert( 
32520 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
32530 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67  > 4 );.  ovflPag
32540 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  eSize = pBt->usa
32550 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e  bleSize - 4;.  n
32560 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61  Ovfl = (info.nPa
32570 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f  yload - info.nLo
32580 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69  cal + ovflPageSi
32590 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65  ze - 1)/ovflPage
325a0 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Size;.  assert( 
325b0 6e 4f 76 66 6c 3e 30 20 7c 7c 20 0a 20 20 20 20  nOvfl>0 || .    
325c0 28 43 4f 52 52 55 50 54 5f 44 42 20 26 26 20 28  (CORRUPT_DB && (
325d0 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2b 20  info.nPayload + 
325e0 6f 76 66 6c 50 61 67 65 53 69 7a 65 29 3c 6f 76  ovflPageSize)<ov
325f0 66 6c 50 61 67 65 53 69 7a 65 29 0a 20 20 29 3b  flPageSize).  );
32600 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d  .  while( nOvfl-
32610 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4e  - ){.    Pgno iN
32620 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d  ext = 0;.    Mem
32630 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b  Page *pOvfl = 0;
32640 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e  .    if( ovflPgn
32650 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e  o<2 || ovflPgno>
32660 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
32670 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Bt) ){.      /* 
32680 30 20 69 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c  0 is not a legal
32690 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64   page number and
326a0 20 70 61 67 65 20 31 20 63 61 6e 6e 6f 74 20 62   page 1 cannot b
326b0 65 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6f  e an .      ** o
326c0 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 54 68  verflow page. Th
326d0 65 72 65 66 6f 72 65 20 69 66 20 6f 76 66 6c 50  erefore if ovflP
326e0 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20 74 68  gno<2 or past th
326f0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a 20 20  e end of the .  
32700 20 20 20 20 2a 2a 20 66 69 6c 65 20 74 68 65 20      ** file the 
32710 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
32720 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20   corrupt. */.   
32730 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
32740 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
32750 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f 76     }.    if( nOv
32760 66 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  fl ){.      rc =
32770 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
32780 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20  (pBt, ovflPgno, 
32790 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29 3b  &pOvfl, &iNext);
327a0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
327b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
327c0 0a 0a 20 20 20 20 69 66 28 20 28 20 70 4f 76 66  ..    if( ( pOvf
327d0 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d 20 62  l || ((pOvfl = b
327e0 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70  treePageLookup(p
327f0 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29 21 3d  Bt, ovflPgno))!=
32800 30 29 20 29 0a 20 20 20 20 20 26 26 20 73 71 6c  0) ).     && sql
32810 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
32820 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70 44 62  count(pOvfl->pDb
32830 50 61 67 65 29 21 3d 31 0a 20 20 20 20 29 7b 0a  Page)!=1.    ){.
32840 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69        /* There i
32850 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e 79 20  s no reason any 
32860 63 75 72 73 6f 72 20 73 68 6f 75 6c 64 20 68 61  cursor should ha
32870 76 65 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e  ve an outstandin
32880 67 20 72 65 66 65 72 65 6e 63 65 20 0a 20 20 20  g reference .   
32890 20 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72     ** to an over
328a0 66 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f 6e 67  flow page belong
328b0 69 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20 74 68  ing to a cell th
328c0 61 74 20 69 73 20 62 65 69 6e 67 20 64 65 6c 65  at is being dele
328d0 74 65 64 2f 75 70 64 61 74 65 64 2e 0a 20 20 20  ted/updated..   
328e0 20 20 20 2a 2a 20 53 6f 20 69 66 20 74 68 65 72     ** So if ther
328f0 65 20 65 78 69 73 74 73 20 6d 6f 72 65 20 74 68  e exists more th
32900 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65  an one reference
32910 20 74 6f 20 74 68 69 73 20 70 61 67 65 2c 20 74   to this page, t
32920 68 65 6e 20 69 74 20 0a 20 20 20 20 20 20 2a 2a  hen it .      **
32930 20 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c 6c 79   must not really
32940 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   be an overflow 
32950 70 61 67 65 20 61 6e 64 20 74 68 65 20 64 61 74  page and the dat
32960 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f  abase must be co
32970 72 72 75 70 74 2e 20 0a 20 20 20 20 20 20 2a 2a  rrupt. .      **
32980 20 49 74 20 69 73 20 68 65 6c 70 66 75 6c 20 74   It is helpful t
32990 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 62 65  o detect this be
329a0 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66 72 65  fore calling fre
329b0 65 50 61 67 65 32 28 29 2c 20 61 73 20 0a 20 20  ePage2(), as .  
329c0 20 20 20 20 2a 2a 20 66 72 65 65 50 61 67 65 32      ** freePage2
329d0 28 29 20 6d 61 79 20 7a 65 72 6f 20 74 68 65 20  () may zero the 
329e0 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 69 66  page contents if
329f0 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d   secure-delete m
32a00 6f 64 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ode is.      ** 
32a10 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 69 73  enabled. If this
32a20 20 27 6f 76 65 72 66 6c 6f 77 27 20 70 61 67 65   'overflow' page
32a30 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61   happens to be a
32a40 20 70 61 67 65 20 74 68 61 74 20 74 68 65 0a 20   page that the. 
32a50 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20 69       ** caller i
32a60 73 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f  s iterating thro
32a70 75 67 68 20 6f 72 20 75 73 69 6e 67 20 69 6e 20  ugh or using in 
32a80 73 6f 6d 65 20 6f 74 68 65 72 20 77 61 79 2c 20  some other way, 
32a90 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 63 61  this.      ** ca
32aa0 6e 20 62 65 20 70 72 6f 62 6c 65 6d 61 74 69 63  n be problematic
32ab0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
32ac0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
32ad0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
32ae0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
32af0 20 66 72 65 65 50 61 67 65 32 28 70 42 74 2c 20   freePage2(pBt, 
32b00 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29  pOvfl, ovflPgno)
32b10 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
32b20 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20   pOvfl ){.      
32b30 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
32b40 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65  f(pOvfl->pDbPage
32b50 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
32b60 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
32b70 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20  .    ovflPgno = 
32b80 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74  iNext;.  }.  ret
32b90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
32ba0 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74  ../*.** Create t
32bb0 68 65 20 62 79 74 65 20 73 65 71 75 65 6e 63 65  he byte sequence
32bc0 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65   used to represe
32bd0 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67  nt a cell on pag
32be0 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77  e pPage.** and w
32bf0 72 69 74 65 20 74 68 61 74 20 62 79 74 65 20 73  rite that byte s
32c00 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70 43 65  equence into pCe
32c10 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20  ll[].  Overflow 
32c20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c  pages are.** all
32c30 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65  ocated and fille
32c40 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72  d in as necessar
32c50 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  y.  The calling 
32c60 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73 20  procedure.** is 
32c70 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
32c80 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66  making sure suff
32c90 69 63 69 65 6e 74 20 73 70 61 63 65 20 68 61 73  icient space has
32ca0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a   been allocated.
32cb0 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a  ** for pCell[]..
32cc0 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
32cd0 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e  pCell does not n
32ce0 65 63 65 73 73 61 72 79 20 6e 65 65 64 20 74 6f  ecessary need to
32cf0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 50   point to the pP
32d00 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72  age->aData.** ar
32d10 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68 74  ea.  pCell might
32d20 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74   point to some t
32d30 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65  emporary storage
32d40 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c  .  The cell will
32d50 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75 63 74  .** be construct
32d60 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f  ed in this tempo
32d70 72 61 72 79 20 61 72 65 61 20 74 68 65 6e 20 63  rary area then c
32d80 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61 67 65  opied into pPage
32d90 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72  ->aData.** later
32da0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
32db0 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65  fillInCell(.  Me
32dc0 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
32dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32de0 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f  The page that co
32df0 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20  ntains the cell 
32e00 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
32e10 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  ar *pCell,      
32e20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20      /* Complete 
32e30 74 65 78 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  text of the cell
32e40 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
32e50 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79   *pKey, i64 nKey
32e60 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20  ,    /* The key 
32e70 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
32e80 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44 61 74 61  *pData,int nData
32e90 2c 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20  ,   /* The data 
32ea0 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20  */.  int nZero, 
32eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32ec0 20 20 20 20 2f 2a 20 45 78 74 72 61 20 7a 65 72      /* Extra zer
32ed0 6f 20 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e  o bytes to appen
32ee0 64 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20  d to pData */.  
32ef0 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20  int *pnSize     
32f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32f10 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a  * Write cell siz
32f20 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  e here */.){.  i
32f30 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63  nt nPayload;.  c
32f40 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20  onst u8 *pSrc;. 
32f50 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63   int nSrc, n, rc
32f60 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66  ;.  int spaceLef
32f70 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f  t;.  MemPage *pO
32f80 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  vfl = 0;.  MemPa
32f90 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d  ge *pToRelease =
32fa0 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   0;.  unsigned c
32fb0 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75  har *pPrior;.  u
32fc0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50  nsigned char *pP
32fd0 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72  ayload;.  BtShar
32fe0 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
32ff0 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e  >pBt;.  Pgno pgn
33000 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74  oOvfl = 0;.  int
33010 20 6e 48 65 61 64 65 72 3b 0a 0a 20 20 61 73 73   nHeader;..  ass
33020 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
33030 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
33040 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
33050 20 2f 2a 20 70 50 61 67 65 20 69 73 20 6e 6f 74   /* pPage is not
33060 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 72 69   necessarily wri
33070 74 65 61 62 6c 65 20 73 69 6e 63 65 20 70 43 65  teable since pCe
33080 6c 6c 20 6d 69 67 68 74 20 62 65 20 61 75 78 69  ll might be auxi
33090 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75 66 66 65  liary.  ** buffe
330a0 72 20 73 70 61 63 65 20 74 68 61 74 20 69 73 20  r space that is 
330b0 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
330c0 65 20 70 50 61 67 65 20 62 75 66 66 65 72 20 61  e pPage buffer a
330d0 72 65 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  rea */.  assert(
330e0 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44   pCell<pPage->aD
330f0 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70  ata || pCell>=&p
33100 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d  Page->aData[pBt-
33110 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20  >pageSize].     
33120 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
33130 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
33140 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
33150 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20  ) );..  /* Fill 
33160 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a  in the header. *
33170 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 70 50  /.  nHeader = pP
33180 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
33190 65 3b 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20  e;.  nPayload = 
331a0 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20  nData + nZero;. 
331b0 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
331c0 65 79 4c 65 61 66 20 29 7b 0a 20 20 20 20 6e 48  eyLeaf ){.    nH
331d0 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69  eader += putVari
331e0 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 48 65 61  nt32(&pCell[nHea
331f0 64 65 72 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b  der], nPayload);
33200 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
33210 73 65 72 74 28 20 6e 44 61 74 61 3d 3d 30 20 29  sert( nData==0 )
33220 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 5a  ;.    assert( nZ
33230 65 72 6f 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20  ero==0 );.  }.  
33240 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61  nHeader += putVa
33250 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61  rint(&pCell[nHea
33260 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e 4b  der], *(u64*)&nK
33270 65 79 29 3b 0a 20 20 0a 20 20 2f 2a 20 46 69 6c  ey);.  .  /* Fil
33280 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61 64  l in the payload
33290 20 73 69 7a 65 20 2a 2f 0a 20 20 69 66 28 20 70   size */.  if( p
332a0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
332b0 20 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61      pSrc = pData
332c0 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61  ;.    nSrc = nDa
332d0 74 61 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20  ta;.    nData = 
332e0 30 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20  0;.  }else{ .   
332f0 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3c 3d 30   assert( nKey<=0
33300 78 37 66 66 66 66 66 66 66 20 26 26 20 70 4b 65  x7fffffff && pKe
33310 79 21 3d 30 20 29 3b 0a 20 20 20 20 6e 50 61 79  y!=0 );.    nPay
33320 6c 6f 61 64 20 3d 20 28 69 6e 74 29 6e 4b 65 79  load = (int)nKey
33330 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 4b 65  ;.    pSrc = pKe
33340 79 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 28 69  y;.    nSrc = (i
33350 6e 74 29 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69  nt)nKey;.  }.  i
33360 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61  f( nPayload<=pPa
33370 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a  ge->maxLocal ){.
33380 20 20 20 20 6e 20 3d 20 6e 48 65 61 64 65 72 20      n = nHeader 
33390 2b 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  + nPayload;.    
333a0 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 33 20 29  testcase( n==3 )
333b0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
333c0 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 69 66 28 20  n==4 );.    if( 
333d0 6e 3c 34 20 29 20 6e 20 3d 20 34 3b 0a 20 20 20  n<4 ) n = 4;.   
333e0 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 3b 0a 20 20   *pnSize = n;.  
333f0 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 6e 50    spaceLeft = nP
33400 61 79 6c 6f 61 64 3b 0a 20 20 20 20 70 50 72 69  ayload;.    pPri
33410 6f 72 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 7d 65  or = pCell;.  }e
33420 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6d 6e 20  lse{.    int mn 
33430 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61  = pPage->minLoca
33440 6c 3b 0a 20 20 20 20 6e 20 3d 20 6d 6e 20 2b 20  l;.    n = mn + 
33450 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 6e 29 20  (nPayload - mn) 
33460 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  % (pPage->pBt->u
33470 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a  sableSize - 4);.
33480 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d      testcase( n=
33490 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
334a0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
334b0 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ( n==pPage->maxL
334c0 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66  ocal+1 );.    if
334d0 28 20 6e 20 3e 20 70 50 61 67 65 2d 3e 6d 61 78  ( n > pPage->max
334e0 4c 6f 63 61 6c 20 29 20 6e 20 3d 20 6d 6e 3b 0a  Local ) n = mn;.
334f0 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20      spaceLeft = 
33500 6e 3b 0a 20 20 20 20 2a 70 6e 53 69 7a 65 20 3d  n;.    *pnSize =
33510 20 6e 20 2b 20 6e 48 65 61 64 65 72 20 2b 20 34   n + nHeader + 4
33520 3b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20 26  ;.    pPrior = &
33530 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 2b 6e 5d  pCell[nHeader+n]
33540 3b 0a 20 20 7d 0a 20 20 70 50 61 79 6c 6f 61 64  ;.  }.  pPayload
33550 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65   = &pCell[nHeade
33560 72 5d 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69  r];..  /* At thi
33570 73 20 70 6f 69 6e 74 20 76 61 72 69 61 62 6c 65  s point variable
33580 73 20 73 68 6f 75 6c 64 20 62 65 20 73 65 74 20  s should be set 
33590 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a  as follows:.  **
335a0 0a 20 20 2a 2a 20 20 20 6e 50 61 79 6c 6f 61 64  .  **   nPayload
335b0 20 20 20 20 20 20 20 20 20 20 20 54 6f 74 61 6c             Total
335c0 20 70 61 79 6c 6f 61 64 20 73 69 7a 65 20 69 6e   payload size in
335d0 20 62 79 74 65 73 0a 20 20 2a 2a 20 20 20 70 50   bytes.  **   pP
335e0 61 79 6c 6f 61 64 20 20 20 20 20 20 20 20 20 20  ayload          
335f0 20 42 65 67 69 6e 20 77 72 69 74 69 6e 67 20 70   Begin writing p
33600 61 79 6c 6f 61 64 20 68 65 72 65 0a 20 20 2a 2a  ayload here.  **
33610 20 20 20 73 70 61 63 65 4c 65 66 74 20 20 20 20     spaceLeft    
33620 20 20 20 20 20 20 53 70 61 63 65 20 61 76 61 69        Space avai
33630 6c 61 62 6c 65 20 61 74 20 70 50 61 79 6c 6f 61  lable at pPayloa
33640 64 2e 20 20 49 66 20 6e 50 61 79 6c 6f 61 64 3e  d.  If nPayload>
33650 73 70 61 63 65 4c 65 66 74 2c 0a 20 20 2a 2a 20  spaceLeft,.  ** 
33660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33670 20 20 20 20 20 74 68 61 74 20 6d 65 61 6e 73 20       that means 
33680 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 73 70 69  content must spi
33690 6c 6c 20 69 6e 74 6f 20 6f 76 65 72 66 6c 6f 77  ll into overflow
336a0 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 20 20 2a   pages..  **   *
336b0 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  pnSize          
336c0 20 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6c 6f    Size of the lo
336d0 63 61 6c 20 63 65 6c 6c 20 28 6e 6f 74 20 63 6f  cal cell (not co
336e0 75 6e 74 69 6e 67 20 6f 76 65 72 66 6c 6f 77 20  unting overflow 
336f0 70 61 67 65 73 29 0a 20 20 2a 2a 20 20 20 70 50  pages).  **   pP
33700 72 69 6f 72 20 20 20 20 20 20 20 20 20 20 20 20  rior            
33710 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20   Where to write 
33720 74 68 65 20 70 67 6e 6f 20 6f 66 20 74 68 65 20  the pgno of the 
33730 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70  first overflow p
33740 61 67 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 55 73  age.  **.  ** Us
33750 65 20 61 20 63 61 6c 6c 20 74 6f 20 62 74 72 65  e a call to btre
33760 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20  eParseCellPtr() 
33770 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74  to verify that t
33780 68 65 20 76 61 6c 75 65 73 20 61 62 6f 76 65 0a  he values above.
33790 20 20 2a 2a 20 77 65 72 65 20 63 6f 6d 70 75 74    ** were comput
337a0 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20  ed correctly..  
337b0 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45  */.#if SQLITE_DE
337c0 42 55 47 0a 20 20 7b 0a 20 20 20 20 43 65 6c 6c  BUG.  {.    Cell
337d0 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 70  Info info;.    p
337e0 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
337f0 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
33800 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72  info);.    asser
33810 74 28 20 6e 48 65 61 64 65 72 3d 28 69 6e 74 29  t( nHeader=(int)
33820 28 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 20 2d  (info.pPayload -
33830 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20 20 20 61   pCell) );.    a
33840 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79  ssert( info.nKey
33850 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 20 20 61 73  ==nKey );.    as
33860 73 65 72 74 28 20 2a 70 6e 53 69 7a 65 20 3d 3d  sert( *pnSize ==
33870 20 69 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20   info.nSize );. 
33880 20 20 20 61 73 73 65 72 74 28 20 73 70 61 63 65     assert( space
33890 4c 65 66 74 20 3d 3d 20 69 6e 66 6f 2e 6e 4c 6f  Left == info.nLo
338a0 63 61 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72  cal );.    asser
338b0 74 28 20 70 50 72 69 6f 72 20 3d 3d 20 26 70 43  t( pPrior == &pC
338c0 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
338d0 6f 77 5d 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  ow] );.  }.#endi
338e0 66 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68  f..  /* Write th
338f0 65 20 70 61 79 6c 6f 61 64 20 69 6e 74 6f 20 74  e payload into t
33900 68 65 20 6c 6f 63 61 6c 20 43 65 6c 6c 20 61 6e  he local Cell an
33910 64 20 61 6e 79 20 65 78 74 72 61 20 69 6e 74 6f  d any extra into
33920 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
33930 2a 2f 0a 20 20 77 68 69 6c 65 28 20 6e 50 61 79  */.  while( nPay
33940 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20 20 69 66  load>0 ){.    if
33950 28 20 73 70 61 63 65 4c 65 66 74 3d 3d 30 20 29  ( spaceLeft==0 )
33960 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
33970 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
33980 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  .      Pgno pgno
33990 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66  Ptrmap = pgnoOvf
339a0 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70  l; /* Overflow p
339b0 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  age pointer-map 
339c0 65 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a 20 20  entry page */.  
339d0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
339e0 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
339f0 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20     do{.         
33a00 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20   pgnoOvfl++;.   
33a10 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20 0a 20       } while( . 
33a20 20 20 20 20 20 20 20 20 20 50 54 52 4d 41 50 5f           PTRMAP_
33a30 49 53 50 41 47 45 28 70 42 74 2c 20 70 67 6e 6f  ISPAGE(pBt, pgno
33a40 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66  Ovfl) || pgnoOvf
33a50 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  l==PENDING_BYTE_
33a60 50 41 47 45 28 70 42 74 29 20 0a 20 20 20 20 20  PAGE(pBt) .     
33a70 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65     );.      }.#e
33a80 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20  ndif.      rc = 
33a90 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
33aa0 65 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26  e(pBt, &pOvfl, &
33ab0 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76  pgnoOvfl, pgnoOv
33ac0 66 6c 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20  fl, 0);.#ifndef 
33ad0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
33ae0 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20  VACUUM.      /* 
33af0 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
33b00 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61  supports auto-va
33b10 63 75 75 6d 2c 20 61 6e 64 20 74 68 65 20 73 65  cuum, and the se
33b20 63 6f 6e 64 20 6f 72 20 73 75 62 73 65 71 75 65  cond or subseque
33b30 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72  nt.      ** over
33b40 66 6c 6f 77 20 70 61 67 65 20 69 73 20 62 65 69  flow page is bei
33b50 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64  ng allocated, ad
33b60 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68  d an entry to th
33b70 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20  e pointer-map.  
33b80 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 61 74 20      ** for that 
33b90 70 61 67 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20  page now. .     
33ba0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20   **.      ** If 
33bb0 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
33bc0 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  t overflow page,
33bd0 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 70 61   then write a pa
33be0 72 74 69 61 6c 20 65 6e 74 72 79 20 0a 20 20 20  rtial entry .   
33bf0 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69     ** to the poi
33c00 6e 74 65 72 2d 6d 61 70 2e 20 49 66 20 77 65 20  nter-map. If we 
33c10 77 72 69 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f  write nothing to
33c20 20 74 68 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61   this pointer-ma
33c30 70 20 73 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a  p slot,.      **
33c40 20 74 68 65 6e 20 74 68 65 20 6f 70 74 69 6d 69   then the optimi
33c50 73 74 69 63 20 6f 76 65 72 66 6c 6f 77 20 63 68  stic overflow ch
33c60 61 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 69  ain processing i
33c70 6e 20 63 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20  n clearCell().  
33c80 20 20 20 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e      ** may misin
33c90 74 65 72 70 72 65 74 20 74 68 65 20 75 6e 69 6e  terpret the unin
33ca0 69 74 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 73  itialized values
33cb0 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 0a   and delete the.
33cc0 20 20 20 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70        ** wrong p
33cd0 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20 64 61  ages from the da
33ce0 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f  tabase..      */
33cf0 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
33d00 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 72 63  autoVacuum && rc
33d10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
33d20 20 20 20 20 20 20 20 75 38 20 65 54 79 70 65 20         u8 eType 
33d30 3d 20 28 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54  = (pgnoPtrmap?PT
33d40 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50  RMAP_OVERFLOW2:P
33d50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29  TRMAP_OVERFLOW1)
33d60 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70  ;.        ptrmap
33d70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66  Put(pBt, pgnoOvf
33d80 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f 50 74  l, eType, pgnoPt
33d90 72 6d 61 70 2c 20 26 72 63 29 3b 0a 20 20 20 20  rmap, &rc);.    
33da0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
33db0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
33dc0 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20  age(pOvfl);.    
33dd0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65      }.      }.#e
33de0 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 72  ndif.      if( r
33df0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c  c ){.        rel
33e00 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
33e10 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ase);.        re
33e20 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
33e30 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 54  ..      /* If pT
33e40 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20  oRelease is not 
33e50 7a 65 72 6f 20 74 68 61 6e 20 70 50 72 69 6f 72  zero than pPrior
33e60 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65   points into the
33e70 20 64 61 74 61 20 61 72 65 61 0a 20 20 20 20 20   data area.     
33e80 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73   ** of pToReleas
33e90 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54  e.  Make sure pT
33ea0 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c  oRelease is stil
33eb0 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a  l writeable. */.
33ec0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
33ed0 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73  oRelease==0 || s
33ee0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
33ef0 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73  teable(pToReleas
33f00 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
33f10 20 20 20 20 20 20 2f 2a 20 49 66 20 70 50 72 69        /* If pPri
33f20 6f 72 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  or is part of th
33f30 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70  e data area of p
33f40 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20  Page, then make 
33f50 73 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 20  sure pPage.     
33f60 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69   ** is still wri
33f70 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20  teable */.      
33f80 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 3c 70  assert( pPrior<p
33f90 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70  Page->aData || p
33fa0 50 72 69 6f 72 3e 3d 26 70 50 61 67 65 2d 3e 61  Prior>=&pPage->a
33fb0 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69  Data[pBt->pageSi
33fc0 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze].            
33fd0 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
33fe0 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
33ff0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
34000 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50       put4byte(pP
34010 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b  rior, pgnoOvfl);
34020 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
34030 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a  ge(pToRelease);.
34040 20 20 20 20 20 20 70 54 6f 52 65 6c 65 61 73 65        pToRelease
34050 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20   = pOvfl;.      
34060 70 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e  pPrior = pOvfl->
34070 61 44 61 74 61 3b 0a 20 20 20 20 20 20 70 75 74  aData;.      put
34080 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 30 29  4byte(pPrior, 0)
34090 3b 0a 20 20 20 20 20 20 70 50 61 79 6c 6f 61 64  ;.      pPayload
340a0 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61   = &pOvfl->aData
340b0 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70 61 63 65  [4];.      space
340c0 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75 73 61 62  Left = pBt->usab
340d0 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20  leSize - 4;.    
340e0 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f  }.    n = nPaylo
340f0 61 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73 70  ad;.    if( n>sp
34100 61 63 65 4c 65 66 74 20 29 20 6e 20 3d 20 73 70  aceLeft ) n = sp
34110 61 63 65 4c 65 66 74 3b 0a 0a 20 20 20 20 2f 2a  aceLeft;..    /*
34120 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69   If pToRelease i
34130 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20  s not zero than 
34140 70 50 61 79 6c 6f 61 64 20 70 6f 69 6e 74 73 20  pPayload points 
34150 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61 72  into the data ar
34160 65 61 0a 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f  ea.    ** of pTo
34170 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73  Release.  Make s
34180 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69  ure pToRelease i
34190 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
341a0 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
341b0 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20  ( pToRelease==0 
341c0 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
341d0 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65  swriteable(pToRe
341e0 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20  lease->pDbPage) 
341f0 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 50  );..    /* If pP
34200 61 79 6c 6f 61 64 20 69 73 20 70 61 72 74 20 6f  ayload is part o
34210 66 20 74 68 65 20 64 61 74 61 20 61 72 65 61 20  f the data area 
34220 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d  of pPage, then m
34230 61 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a 20  ake sure pPage. 
34240 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77     ** is still w
34250 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20  riteable */.    
34260 61 73 73 65 72 74 28 20 70 50 61 79 6c 6f 61 64  assert( pPayload
34270 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c  <pPage->aData ||
34280 20 70 50 61 79 6c 6f 61 64 3e 3d 26 70 50 61 67   pPayload>=&pPag
34290 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61  e->aData[pBt->pa
342a0 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20  geSize].        
342b0 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61      || sqlite3Pa
342c0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
342d0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
342e0 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3e  ;..    if( nSrc>
342f0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  0 ){.      if( n
34300 3e 6e 53 72 63 20 29 20 6e 20 3d 20 6e 53 72 63  >nSrc ) n = nSrc
34310 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
34320 70 53 72 63 20 29 3b 0a 20 20 20 20 20 20 6d 65  pSrc );.      me
34330 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70  mcpy(pPayload, p
34340 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c  Src, n);.    }el
34350 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  se{.      memset
34360 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29  (pPayload, 0, n)
34370 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 79  ;.    }.    nPay
34380 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 70  load -= n;.    p
34390 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20  Payload += n;.  
343a0 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20    pSrc += n;.   
343b0 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20   nSrc -= n;.    
343c0 73 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a  spaceLeft -= n;.
343d0 20 20 20 20 69 66 28 20 6e 53 72 63 3d 3d 30 20      if( nSrc==0 
343e0 29 7b 0a 20 20 20 20 20 20 6e 53 72 63 20 3d 20  ){.      nSrc = 
343f0 6e 44 61 74 61 3b 0a 20 20 20 20 20 20 70 53 72  nData;.      pSr
34400 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 7d  c = pData;.    }
34410 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61  .  }.  releasePa
34420 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a  ge(pToRelease);.
34430 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
34440 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d  OK;.}../*.** Rem
34450 6f 76 65 20 74 68 65 20 69 2d 74 68 20 63 65 6c  ove the i-th cel
34460 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 20 20 54  l from pPage.  T
34470 68 69 73 20 72 6f 75 74 69 6e 65 20 65 66 66 65  his routine effe
34480 63 74 73 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a  cts pPage only..
34490 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74  ** The cell cont
344a0 65 6e 74 20 69 73 20 6e 6f 74 20 66 72 65 65 64  ent is not freed
344b0 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e   or deallocated.
344c0 20 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20    It is assumed 
344d0 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c  that.** the cell
344e0 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62 65 65   content has bee
344f0 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61  n copied somepla
34500 63 65 20 65 6c 73 65 2e 20 20 54 68 69 73 20 72  ce else.  This r
34510 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72  outine just.** r
34520 65 6d 6f 76 65 73 20 74 68 65 20 72 65 66 65 72  emoves the refer
34530 65 6e 63 65 20 74 6f 20 74 68 65 20 63 65 6c 6c  ence to the cell
34540 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a   from pPage..**.
34550 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20 62 65 20  ** "sz" must be 
34560 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
34570 74 65 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e  tes in the cell.
34580 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
34590 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61 67 65  dropCell(MemPage
345a0 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 64 78   *pPage, int idx
345b0 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74 20 2a 70  , int sz, int *p
345c0 52 43 29 7b 0a 20 20 75 33 32 20 70 63 3b 20 20  RC){.  u32 pc;  
345d0 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
345e0 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74   to cell content
345f0 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67 20 64   of cell being d
34600 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a  eleted */.  u8 *
34610 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 70  data;       /* p
34620 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20  Page->aData */. 
34630 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20   u8 *ptr;       
34640 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76 65   /* Used to move
34650 20 62 79 74 65 73 20 61 72 6f 75 6e 64 20 77 69   bytes around wi
34660 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  thin data[] */. 
34670 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
34680 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63   /* The return c
34690 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72  ode */.  int hdr
346a0 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69  ;        /* Begi
346b0 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 68 65 61  nning of the hea
346c0 64 65 72 2e 20 20 30 20 6d 6f 73 74 20 70 61 67  der.  0 most pag
346d0 65 73 2e 20 20 31 30 30 20 70 61 67 65 20 31 20  es.  100 page 1 
346e0 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29  */..  if( *pRC )
346f0 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65   return;..  asse
34700 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64  rt( idx>=0 && id
34710 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  x<pPage->nCell )
34720 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52  ;.  assert( CORR
34730 55 50 54 5f 44 42 20 7c 7c 20 73 7a 3d 3d 63 65  UPT_DB || sz==ce
34740 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69 64  llSize(pPage, id
34750 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
34760 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
34770 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
34780 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
34790 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
347a0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
347b0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
347c0 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
347d0 61 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 70 50  ata;.  ptr = &pP
347e0 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a  age->aCellIdx[2*
347f0 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74  idx];.  pc = get
34800 32 62 79 74 65 28 70 74 72 29 3b 0a 20 20 68 64  2byte(ptr);.  hd
34810 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
34820 66 73 65 74 3b 0a 20 20 74 65 73 74 63 61 73 65  fset;.  testcase
34830 28 20 70 63 3d 3d 67 65 74 32 62 79 74 65 28 26  ( pc==get2byte(&
34840 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a  data[hdr+5]) );.
34850 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73    testcase( pc+s
34860 7a 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  z==pPage->pBt->u
34870 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 69  sableSize );.  i
34880 66 28 20 70 63 20 3c 20 28 75 33 32 29 67 65 74  f( pc < (u32)get
34890 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
348a0 35 5d 29 20 7c 7c 20 70 63 2b 73 7a 20 3e 20 70  5]) || pc+sz > p
348b0 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
348c0 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 2a 70 52  eSize ){.    *pR
348d0 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  C = SQLITE_CORRU
348e0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  PT_BKPT;.    ret
348f0 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  urn;.  }.  rc = 
34900 66 72 65 65 53 70 61 63 65 28 70 50 61 67 65 2c  freeSpace(pPage,
34910 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20   pc, sz);.  if( 
34920 72 63 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d  rc ){.    *pRC =
34930 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   rc;.    return;
34940 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43  .  }.  pPage->nC
34950 65 6c 6c 2d 2d 3b 0a 20 20 69 66 28 20 70 50 61  ell--;.  if( pPa
34960 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a  ge->nCell==0 ){.
34970 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61      memset(&data
34980 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a  [hdr+1], 0, 4);.
34990 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20      data[hdr+7] 
349a0 3d 20 30 3b 0a 20 20 20 20 70 75 74 32 62 79 74  = 0;.    put2byt
349b0 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
349c0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
349d0 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 70 50 61  leSize);.    pPa
349e0 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 50 61 67  ge->nFree = pPag
349f0 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
34a00 7a 65 20 2d 20 70 50 61 67 65 2d 3e 68 64 72 4f  ze - pPage->hdrO
34a10 66 66 73 65 74 0a 20 20 20 20 20 20 20 20 20 20  ffset.          
34a20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 20 70               - p
34a30 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
34a40 7a 65 20 2d 20 38 3b 0a 20 20 7d 65 6c 73 65 7b  ze - 8;.  }else{
34a50 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 74 72  .    memmove(ptr
34a60 2c 20 70 74 72 2b 32 2c 20 32 2a 28 70 50 61 67  , ptr+2, 2*(pPag
34a70 65 2d 3e 6e 43 65 6c 6c 20 2d 20 69 64 78 29 29  e->nCell - idx))
34a80 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
34a90 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61  data[hdr+3], pPa
34aa0 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 20 20  ge->nCell);.    
34ab0 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20  pPage->nFree += 
34ac0 32 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  2;.  }.}../*.** 
34ad0 49 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c  Insert a new cel
34ae0 6c 20 6f 6e 20 70 50 61 67 65 20 61 74 20 63 65  l on pPage at ce
34af0 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e 20 20 70  ll index "i".  p
34b00 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74  Cell points to t
34b10 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66  he.** content of
34b20 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a   the cell..**.**
34b30 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   If the cell con
34b40 74 65 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e  tent will fit on
34b50 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20   the page, then 
34b60 70 75 74 20 69 74 20 74 68 65 72 65 2e 20 20 49  put it there.  I
34b70 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  f it.** will not
34b80 20 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20   fit, then make 
34b90 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 65  a copy of the ce
34ba0 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20  ll content into 
34bb0 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d  pTemp if.** pTem
34bc0 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20  p is not null.  
34bd0 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 70 54  Regardless of pT
34be0 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20  emp, allocate a 
34bf0 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20  new entry.** in 
34c00 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 5d 20  pPage->apOvfl[] 
34c10 61 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e  and make it poin
34c20 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  t to the cell co
34c30 6e 74 65 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a  ntent (either.**
34c40 20 69 6e 20 70 54 65 6d 70 20 6f 72 20 74 68 65   in pTemp or the
34c50 20 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29   original pCell)
34c60 20 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72 64   and also record
34c70 20 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20   its index. .** 
34c80 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77  Allocating a new
34c90 20 65 6e 74 72 79 20 69 6e 20 70 50 61 67 65 2d   entry in pPage-
34ca0 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73  >aCell[] implies
34cb0 20 74 68 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d   that .** pPage-
34cc0 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20 69 6e  >nOverflow is in
34cd0 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2f 0a 73 74  cremented..*/.st
34ce0 61 74 69 63 20 76 6f 69 64 20 69 6e 73 65 72 74  atic void insert
34cf0 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
34d00 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61 67  *pPage,   /* Pag
34d10 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20  e into which we 
34d20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20  are copying */. 
34d30 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20 20   int i,         
34d40 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62     /* New cell b
34d50 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68 20  ecomes the i-th 
34d60 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67 65  cell of the page
34d70 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
34d80 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
34d90 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63 65  nt of the new ce
34da0 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20  ll */.  int sz, 
34db0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
34dc0 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e  es of content in
34dd0 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a   pCell */.  u8 *
34de0 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a  pTemp,        /*
34df0 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73 70   Temp storage sp
34e00 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69  ace for pCell, i
34e10 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 50 67  f needed */.  Pg
34e20 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20 20  no iChild,      
34e30 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  /* If non-zero, 
34e40 72 65 70 6c 61 63 65 20 66 69 72 73 74 20 34 20  replace first 4 
34e50 62 79 74 65 73 20 77 69 74 68 20 74 68 69 73 20  bytes with this 
34e60 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  value */.  int *
34e70 70 52 43 20 20 20 20 20 20 20 20 20 20 2f 2a 20  pRC          /* 
34e80 52 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 72  Read and write r
34e90 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20  eturn code from 
34ea0 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
34eb0 20 69 64 78 20 3d 20 30 3b 20 20 20 20 20 20 2f   idx = 0;      /
34ec0 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65  * Where to write
34ed0 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   new cell conten
34ee0 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  t in data[] */. 
34ef0 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20   int j;         
34f00 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
34f10 65 72 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61  er */.  u8 *data
34f20 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
34f30 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
34f40 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20  whole page */.  
34f50 75 38 20 2a 70 49 6e 73 3b 20 20 20 20 20 20 20  u8 *pIns;       
34f60 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 20 69    /* The point i
34f70 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64  n pPage->aCellId
34f80 78 5b 5d 20 77 68 65 72 65 20 6e 6f 20 63 65 6c  x[] where no cel
34f90 6c 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 0a 20  l inserted */.. 
34fa0 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75   if( *pRC ) retu
34fb0 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  rn;..  assert( i
34fc0 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61 67 65 2d  >=0 && i<=pPage-
34fd0 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f  >nCell+pPage->nO
34fe0 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73  verflow );.  ass
34ff0 65 72 74 28 20 4d 58 5f 43 45 4c 4c 28 70 50 61  ert( MX_CELL(pPa
35000 67 65 2d 3e 70 42 74 29 3c 3d 31 30 39 32 31 20  ge->pBt)<=10921 
35010 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
35020 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45  ge->nCell<=MX_CE
35030 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 20 7c  LL(pPage->pBt) |
35040 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
35050 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
35060 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41 72 72 61  >nOverflow<=Arra
35070 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f  ySize(pPage->apO
35080 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74  vfl) );.  assert
35090 28 20 41 72 72 61 79 53 69 7a 65 28 70 50 61 67  ( ArraySize(pPag
350a0 65 2d 3e 61 70 4f 76 66 6c 29 3d 3d 41 72 72 61  e->apOvfl)==Arra
350b0 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 69 4f  ySize(pPage->aiO
350c0 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74  vfl) );.  assert
350d0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
350e0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
350f0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20  >mutex) );.  /* 
35100 54 68 65 20 63 65 6c 6c 20 73 68 6f 75 6c 64 20  The cell should 
35110 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 73 69 7a 65  normally be size
35120 64 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 48 6f  d correctly.  Ho
35130 77 65 76 65 72 2c 20 77 68 65 6e 20 6d 6f 76 69  wever, when movi
35140 6e 67 20 61 0a 20 20 2a 2a 20 6d 61 6c 66 6f 72  ng a.  ** malfor
35150 6d 65 64 20 63 65 6c 6c 20 66 72 6f 6d 20 61 20  med cell from a 
35160 6c 65 61 66 20 70 61 67 65 20 74 6f 20 61 6e 20  leaf page to an 
35170 69 6e 74 65 72 69 6f 72 20 70 61 67 65 2c 20 69  interior page, i
35180 66 20 74 68 65 20 63 65 6c 6c 20 73 69 7a 65 0a  f the cell size.
35190 20 20 2a 2a 20 77 61 6e 74 65 64 20 74 6f 20 62    ** wanted to b
351a0 65 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62 75  e less than 4 bu
351b0 74 20 67 6f 74 20 72 6f 75 6e 64 65 64 20 75 70  t got rounded up
351c0 20 74 6f 20 34 20 6f 6e 20 74 68 65 20 6c 65 61   to 4 on the lea
351d0 66 2c 20 74 68 65 6e 20 73 69 7a 65 0a 20 20 2a  f, then size.  *
351e0 2a 20 6d 69 67 68 74 20 62 65 20 6c 65 73 73 20  * might be less 
351f0 74 68 61 6e 20 38 20 28 6c 65 61 66 2d 73 69 7a  than 8 (leaf-siz
35200 65 20 2b 20 70 6f 69 6e 74 65 72 29 20 6f 6e 20  e + pointer) on 
35210 74 68 65 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64  the interior nod
35220 65 2e 20 20 48 65 6e 63 65 0a 20 20 2a 2a 20 74  e.  Hence.  ** t
35230 68 65 20 74 65 72 6d 20 61 66 74 65 72 20 74 68  he term after th
35240 65 20 7c 7c 20 69 6e 20 74 68 65 20 66 6f 6c 6c  e || in the foll
35250 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20  owing assert(). 
35260 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d  */.  assert( sz=
35270 3d 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a  =pPage->xCellSiz
35280 65 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 20  e(pPage, pCell) 
35290 7c 7c 20 28 73 7a 3d 3d 38 20 26 26 20 69 43 68  || (sz==8 && iCh
352a0 69 6c 64 3e 30 29 20 29 3b 0a 20 20 69 66 28 20  ild>0) );.  if( 
352b0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
352c0 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e   || sz+2>pPage->
352d0 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 69 66 28  nFree ){.    if(
352e0 20 70 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20   pTemp ){.      
352f0 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c 20 70 43  memcpy(pTemp, pC
35300 65 6c 6c 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20  ell, sz);.      
35310 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20  pCell = pTemp;. 
35320 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 68     }.    if( iCh
35330 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74  ild ){.      put
35340 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 43 68  4byte(pCell, iCh
35350 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ild);.    }.    
35360 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  j = pPage->nOver
35370 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65  flow++;.    asse
35380 72 74 28 20 6a 3c 28 69 6e 74 29 28 73 69 7a 65  rt( j<(int)(size
35390 6f 66 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c  of(pPage->apOvfl
353a0 29 2f 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e  )/sizeof(pPage->
353b0 61 70 4f 76 66 6c 5b 30 5d 29 29 20 29 3b 0a 20  apOvfl[0])) );. 
353c0 20 20 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c     pPage->apOvfl
353d0 5b 6a 5d 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20  [j] = pCell;.   
353e0 20 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a   pPage->aiOvfl[j
353f0 5d 20 3d 20 28 75 31 36 29 69 3b 0a 0a 20 20 20  ] = (u16)i;..   
35400 20 2f 2a 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c   /* When multipl
35410 65 20 6f 76 65 72 66 6c 6f 77 73 20 6f 63 63 75  e overflows occu
35420 72 2c 20 74 68 65 79 20 61 72 65 20 61 6c 77 61  r, they are alwa
35430 79 73 20 73 65 71 75 65 6e 74 69 61 6c 20 61 6e  ys sequential an
35440 64 20 69 6e 0a 20 20 20 20 2a 2a 20 73 6f 72 74  d in.    ** sort
35450 65 64 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20  ed order.  This 
35460 69 6e 76 61 72 69 61 6e 74 73 20 61 72 69 73 65  invariants arise
35470 20 62 65 63 61 75 73 65 20 6d 75 6c 74 69 70 6c   because multipl
35480 65 20 6f 76 65 72 66 6c 6f 77 73 20 63 61 6e 0a  e overflows can.
35490 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 6f 63 63 75      ** only occu
354a0 72 20 77 68 65 6e 20 69 6e 73 65 72 74 69 6e 67  r when inserting
354b0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69   divider cells i
354c0 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70  nto the parent p
354d0 61 67 65 20 64 75 72 69 6e 67 0a 20 20 20 20 2a  age during.    *
354e0 2a 20 62 61 6c 61 6e 63 69 6e 67 2c 20 61 6e 64  * balancing, and
354f0 20 74 68 65 20 64 69 76 69 64 65 72 73 20 61 72   the dividers ar
35500 65 20 61 64 6a 61 63 65 6e 74 20 61 6e 64 20 73  e adjacent and s
35510 6f 72 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  orted..    */.  
35520 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 30 20 7c    assert( j==0 |
35530 7c 20 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b  | pPage->aiOvfl[
35540 6a 2d 31 5d 3c 28 75 31 36 29 69 20 29 3b 20 2f  j-1]<(u16)i ); /
35550 2a 20 4f 76 65 72 66 6c 6f 77 73 20 69 6e 20 73  * Overflows in s
35560 6f 72 74 65 64 20 6f 72 64 65 72 20 2a 2f 0a 20  orted order */. 
35570 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 30 20     assert( j==0 
35580 7c 7c 20 69 3d 3d 70 50 61 67 65 2d 3e 61 69 4f  || i==pPage->aiO
35590 76 66 6c 5b 6a 2d 31 5d 2b 31 20 29 3b 20 20 20  vfl[j-1]+1 );   
355a0 2f 2a 20 4f 76 65 72 66 6c 6f 77 73 20 61 72 65  /* Overflows are
355b0 20 73 65 71 75 65 6e 74 69 61 6c 20 2a 2f 0a 20   sequential */. 
355c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
355d0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
355e0 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
355f0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
35600 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
35610 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20 72 63  .      *pRC = rc
35620 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
35630 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
35640 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
35650 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
35660 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
35670 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
35680 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74  Data;.    assert
35690 28 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63  ( &data[pPage->c
356a0 65 6c 6c 4f 66 66 73 65 74 5d 3d 3d 70 50 61 67  ellOffset]==pPag
356b0 65 2d 3e 61 43 65 6c 6c 49 64 78 20 29 3b 0a 20  e->aCellIdx );. 
356c0 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
356d0 53 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a 2c  Space(pPage, sz,
356e0 20 26 69 64 78 29 3b 0a 20 20 20 20 69 66 28 20   &idx);.    if( 
356f0 72 63 20 29 7b 20 2a 70 52 43 20 3d 20 72 63 3b  rc ){ *pRC = rc;
35700 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20 20 20 2f   return; }.    /
35710 2a 20 54 68 65 20 61 6c 6c 6f 63 61 74 65 53 70  * The allocateSp
35720 61 63 65 28 29 20 72 6f 75 74 69 6e 65 20 67 75  ace() routine gu
35730 61 72 61 6e 74 65 65 73 20 74 68 65 20 66 6f 6c  arantees the fol
35740 6c 6f 77 69 6e 67 20 70 72 6f 70 65 72 74 69 65  lowing propertie
35750 73 0a 20 20 20 20 2a 2a 20 69 66 20 69 74 20 72  s.    ** if it r
35760 65 74 75 72 6e 73 20 73 75 63 63 65 73 73 66 75  eturns successfu
35770 6c 6c 79 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  lly */.    asser
35780 74 28 20 69 64 78 20 3e 3d 20 30 20 29 3b 0a 20  t( idx >= 0 );. 
35790 20 20 20 61 73 73 65 72 74 28 20 69 64 78 20 3e     assert( idx >
357a0 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
357b0 73 65 74 2b 32 2a 70 50 61 67 65 2d 3e 6e 43 65  set+2*pPage->nCe
357c0 6c 6c 2b 32 20 7c 7c 20 43 4f 52 52 55 50 54 5f  ll+2 || CORRUPT_
357d0 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  DB );.    assert
357e0 28 20 69 64 78 2b 73 7a 20 3c 3d 20 28 69 6e 74  ( idx+sz <= (int
357f0 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  )pPage->pBt->usa
35800 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 70  bleSize );.    p
35810 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28  Page->nFree -= (
35820 75 31 36 29 28 32 20 2b 20 73 7a 29 3b 0a 20 20  u16)(2 + sz);.  
35830 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 69    memcpy(&data[i
35840 64 78 5d 2c 20 70 43 65 6c 6c 2c 20 73 7a 29 3b  dx], pCell, sz);
35850 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c 64 20  .    if( iChild 
35860 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  ){.      put4byt
35870 65 28 26 64 61 74 61 5b 69 64 78 5d 2c 20 69 43  e(&data[idx], iC
35880 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  hild);.    }.   
35890 20 70 49 6e 73 20 3d 20 70 50 61 67 65 2d 3e 61   pIns = pPage->a
358a0 43 65 6c 6c 49 64 78 20 2b 20 69 2a 32 3b 0a 20  CellIdx + i*2;. 
358b0 20 20 20 6d 65 6d 6d 6f 76 65 28 70 49 6e 73 2b     memmove(pIns+
358c0 32 2c 20 70 49 6e 73 2c 20 32 2a 28 70 50 61 67  2, pIns, 2*(pPag
358d0 65 2d 3e 6e 43 65 6c 6c 20 2d 20 69 29 29 3b 0a  e->nCell - i));.
358e0 20 20 20 20 70 75 74 32 62 79 74 65 28 70 49 6e      put2byte(pIn
358f0 73 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 50 61  s, idx);.    pPa
35900 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20  ge->nCell++;.   
35910 20 2f 2a 20 69 6e 63 72 65 6d 65 6e 74 20 74 68   /* increment th
35920 65 20 63 65 6c 6c 20 63 6f 75 6e 74 20 2a 2f 0a  e cell count */.
35930 20 20 20 20 69 66 28 20 28 2b 2b 64 61 74 61 5b      if( (++data[
35940 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
35950 2b 34 5d 29 3d 3d 30 20 29 20 64 61 74 61 5b 70  +4])==0 ) data[p
35960 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
35970 33 5d 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74  3]++;.    assert
35980 28 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  ( get2byte(&data
35990 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
359a0 74 2b 33 5d 29 3d 3d 70 50 61 67 65 2d 3e 6e 43  t+3])==pPage->nC
359b0 65 6c 6c 20 29 3b 0a 23 69 66 6e 64 65 66 20 53  ell );.#ifndef S
359c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
359d0 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50  ACUUM.    if( pP
359e0 61 67 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61  age->pBt->autoVa
359f0 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a  cuum ){.      /*
35a00 20 54 68 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f   The cell may co
35a10 6e 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20  ntain a pointer 
35a20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  to an overflow p
35a30 61 67 65 2e 20 49 66 20 73 6f 2c 20 77 72 69 74  age. If so, writ
35a40 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65  e.      ** the e
35a50 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65  ntry for the ove
35a60 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f 20  rflow page into 
35a70 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
35a80 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
35a90 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
35aa0 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70  (pPage, pCell, p
35ab0 52 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  RC);.    }.#endi
35ac0 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  f.  }.}../*.** A
35ad0 20 43 65 6c 6c 41 72 72 61 79 20 6f 62 6a 65 63   CellArray objec
35ae0 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 63 61 63  t contains a cac
35af0 68 65 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 61  he of pointers a
35b00 6e 64 20 73 69 7a 65 73 20 66 6f 72 20 61 0a 2a  nd sizes for a.*
35b10 2a 20 63 6f 6e 73 65 63 75 74 69 76 65 20 73 65  * consecutive se
35b20 71 75 65 6e 63 65 20 6f 66 20 63 65 6c 6c 73 20  quence of cells 
35b30 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 68 65  that might be he
35b40 6c 64 20 6d 75 6c 74 69 70 6c 65 20 70 61 67 65  ld multiple page
35b50 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  s..*/.typedef st
35b60 72 75 63 74 20 43 65 6c 6c 41 72 72 61 79 20 43  ruct CellArray C
35b70 65 6c 6c 41 72 72 61 79 3b 0a 73 74 72 75 63 74  ellArray;.struct
35b80 20 43 65 6c 6c 41 72 72 61 79 20 7b 0a 20 20 69   CellArray {.  i
35b90 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20  nt nCell;       
35ba0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
35bb0 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 43   of cells in apC
35bc0 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61  ell[] */.  MemPa
35bd0 67 65 20 2a 70 52 65 66 3b 20 20 20 20 20 20 20  ge *pRef;       
35be0 20 20 20 2f 2a 20 52 65 66 65 72 65 6e 63 65 20     /* Reference 
35bf0 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61  page */.  u8 **a
35c00 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pCell;          
35c10 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62    /* All cells b
35c20 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f  egin balanced */
35c30 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20  .  u16 *szCell; 
35c40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
35c50 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20  cal size of all 
35c60 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
35c70 5d 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d  ] */.};../*.** M
35c80 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 65 6c  ake sure the cel
35c90 6c 20 73 69 7a 65 73 20 61 74 20 69 64 78 2c 20  l sizes at idx, 
35ca0 69 64 78 2b 31 2c 20 2e 2e 2e 2c 20 69 64 78 2b  idx+1, ..., idx+
35cb0 4e 2d 31 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a  N-1 have been.**
35cc0 20 63 6f 6d 70 75 74 65 64 2e 0a 2a 2f 0a 73 74   computed..*/.st
35cd0 61 74 69 63 20 76 6f 69 64 20 70 6f 70 75 6c 61  atic void popula
35ce0 74 65 43 65 6c 6c 43 61 63 68 65 28 43 65 6c 6c  teCellCache(Cell
35cf0 41 72 72 61 79 20 2a 70 2c 20 69 6e 74 20 69 64  Array *p, int id
35d00 78 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 61 73 73  x, int N){.  ass
35d10 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69  ert( idx>=0 && i
35d20 64 78 2b 4e 3c 3d 70 2d 3e 6e 43 65 6c 6c 20 29  dx+N<=p->nCell )
35d30 3b 0a 20 20 77 68 69 6c 65 28 20 4e 3e 30 20 29  ;.  while( N>0 )
35d40 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
35d50 3e 61 70 43 65 6c 6c 5b 69 64 78 5d 21 3d 30 20  >apCell[idx]!=0 
35d60 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 7a  );.    if( p->sz
35d70 43 65 6c 6c 5b 69 64 78 5d 3d 3d 30 20 29 7b 0a  Cell[idx]==0 ){.
35d80 20 20 20 20 20 20 70 2d 3e 73 7a 43 65 6c 6c 5b        p->szCell[
35d90 69 64 78 5d 20 3d 20 70 2d 3e 70 52 65 66 2d 3e  idx] = p->pRef->
35da0 78 43 65 6c 6c 53 69 7a 65 28 70 2d 3e 70 52 65  xCellSize(p->pRe
35db0 66 2c 20 70 2d 3e 61 70 43 65 6c 6c 5b 69 64 78  f, p->apCell[idx
35dc0 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
35dd0 20 20 20 20 20 61 73 73 65 72 74 28 20 43 4f 52       assert( COR
35de0 52 55 50 54 5f 44 42 20 7c 7c 0a 20 20 20 20 20  RUPT_DB ||.     
35df0 20 20 20 20 20 20 20 20 20 70 2d 3e 73 7a 43 65           p->szCe
35e00 6c 6c 5b 69 64 78 5d 3d 3d 70 2d 3e 70 52 65 66  ll[idx]==p->pRef
35e10 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 2d 3e 70  ->xCellSize(p->p
35e20 52 65 66 2c 20 70 2d 3e 61 70 43 65 6c 6c 5b 69  Ref, p->apCell[i
35e30 64 78 5d 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20  dx]) );.    }.  
35e40 20 20 69 64 78 2b 2b 3b 0a 20 20 20 20 4e 2d 2d    idx++;.    N--
35e50 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
35e60 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f  eturn the size o
35e70 66 20 74 68 65 20 4e 74 68 20 65 6c 65 6d 65 6e  f the Nth elemen
35e80 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 61 72  t of the cell ar
35e90 72 61 79 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  ray.*/.static SQ
35ea0 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 75 31  LITE_NOINLINE u1
35eb0 36 20 63 6f 6d 70 75 74 65 43 65 6c 6c 53 69 7a  6 computeCellSiz
35ec0 65 28 43 65 6c 6c 41 72 72 61 79 20 2a 70 2c 20  e(CellArray *p, 
35ed0 69 6e 74 20 4e 29 7b 0a 20 20 61 73 73 65 72 74  int N){.  assert
35ee0 28 20 4e 3e 3d 30 20 26 26 20 4e 3c 70 2d 3e 6e  ( N>=0 && N<p->n
35ef0 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Cell );.  assert
35f00 28 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 3d 3d  ( p->szCell[N]==
35f10 30 20 29 3b 0a 20 20 70 2d 3e 73 7a 43 65 6c 6c  0 );.  p->szCell
35f20 5b 4e 5d 20 3d 20 70 2d 3e 70 52 65 66 2d 3e 78  [N] = p->pRef->x
35f30 43 65 6c 6c 53 69 7a 65 28 70 2d 3e 70 52 65 66  CellSize(p->pRef
35f40 2c 20 70 2d 3e 61 70 43 65 6c 6c 5b 4e 5d 29 3b  , p->apCell[N]);
35f50 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 73 7a 43  .  return p->szC
35f60 65 6c 6c 5b 4e 5d 3b 0a 7d 0a 73 74 61 74 69 63  ell[N];.}.static
35f70 20 75 31 36 20 63 61 63 68 65 64 43 65 6c 6c 53   u16 cachedCellS
35f80 69 7a 65 28 43 65 6c 6c 41 72 72 61 79 20 2a 70  ize(CellArray *p
35f90 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 61 73 73 65  , int N){.  asse
35fa0 72 74 28 20 4e 3e 3d 30 20 26 26 20 4e 3c 70 2d  rt( N>=0 && N<p-
35fb0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20  >nCell );.  if( 
35fc0 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 20 29 20 72  p->szCell[N] ) r
35fd0 65 74 75 72 6e 20 70 2d 3e 73 7a 43 65 6c 6c 5b  eturn p->szCell[
35fe0 4e 5d 3b 0a 20 20 72 65 74 75 72 6e 20 63 6f 6d  N];.  return com
35ff0 70 75 74 65 43 65 6c 6c 53 69 7a 65 28 70 2c 20  puteCellSize(p, 
36000 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72  N);.}../*.** Arr
36010 61 79 20 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74  ay apCell[] cont
36020 61 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f  ains pointers to
36030 20 6e 43 65 6c 6c 20 62 2d 74 72 65 65 20 70 61   nCell b-tree pa
36040 67 65 20 63 65 6c 6c 73 2e 20 54 68 65 20 0a 2a  ge cells. The .*
36050 2a 20 73 7a 43 65 6c 6c 5b 5d 20 61 72 72 61 79  * szCell[] array
36060 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 69   contains the si
36070 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 65  ze in bytes of e
36080 61 63 68 20 63 65 6c 6c 2e 20 54 68 69 73 20 66  ach cell. This f
36090 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65 70 6c 61  unction.** repla
360a0 63 65 73 20 74 68 65 20 63 75 72 72 65 6e 74 20  ces the current 
360b0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 61 67 65  contents of page
360c0 20 70 50 67 20 77 69 74 68 20 74 68 65 20 63 6f   pPg with the co
360d0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63 65  ntents of the ce
360e0 6c 6c 0a 2a 2a 20 61 72 72 61 79 2e 0a 2a 2a 0a  ll.** array..**.
360f0 2a 2a 20 53 6f 6d 65 20 6f 66 20 74 68 65 20 63  ** Some of the c
36100 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ells in apCell[]
36110 20 6d 61 79 20 63 75 72 72 65 6e 74 6c 79 20 62   may currently b
36120 65 20 73 74 6f 72 65 64 20 69 6e 20 70 50 67 2e  e stored in pPg.
36130 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
36140 6e 20 77 6f 72 6b 73 20 61 72 6f 75 6e 64 20 70  n works around p
36150 72 6f 62 6c 65 6d 73 20 63 61 75 73 65 64 20 62  roblems caused b
36160 79 20 74 68 69 73 20 62 79 20 6d 61 6b 69 6e 67  y this by making
36170 20 61 20 63 6f 70 79 20 6f 66 20 61 6e 79 20 0a   a copy of any .
36180 2a 2a 20 73 75 63 68 20 63 65 6c 6c 73 20 62 65  ** such cells be
36190 66 6f 72 65 20 6f 76 65 72 77 72 69 74 69 6e 67  fore overwriting
361a0 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a   the page data..
361b0 2a 2a 0a 2a 2a 20 54 68 65 20 4d 65 6d 50 61 67  **.** The MemPag
361c0 65 2e 6e 46 72 65 65 20 66 69 65 6c 64 20 69 73  e.nFree field is
361d0 20 69 6e 76 61 6c 69 64 61 74 65 64 20 62 79 20   invalidated by 
361e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49  this function. I
361f0 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73  t is the .** res
36200 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
36210 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 73 65 74  he caller to set
36220 20 69 74 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a   it correctly..*
36230 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 62  /.static int reb
36240 75 69 6c 64 50 61 67 65 28 0a 20 20 4d 65 6d 50  uildPage(.  MemP
36250 61 67 65 20 2a 70 50 67 2c 20 20 20 20 20 20 20  age *pPg,       
36260 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
36270 64 69 74 20 74 68 69 73 20 70 61 67 65 20 2a 2f  dit this page */
36280 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20  .  int nCell,   
36290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
362a0 20 20 20 2f 2a 20 46 69 6e 61 6c 20 6e 75 6d 62     /* Final numb
362b0 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 70  er of cells on p
362c0 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70  age */.  u8 **ap
362d0 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
362e0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
362f0 79 20 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a 20 20  y of cells */.  
36300 75 31 36 20 2a 73 7a 43 65 6c 6c 20 20 20 20 20  u16 *szCell     
36310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36320 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c  /* Array of cell
36330 20 73 69 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20 63   sizes */.){.  c
36340 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70  onst int hdr = p
36350 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20  Pg->hdrOffset;  
36360 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
36370 74 20 6f 66 20 68 65 61 64 65 72 20 6f 6e 20 70  t of header on p
36380 50 67 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e  Pg */.  u8 * con
36390 73 74 20 61 44 61 74 61 20 3d 20 70 50 67 2d 3e  st aData = pPg->
363a0 61 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  aData;          
363b0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64   /* Pointer to d
363c0 61 74 61 20 66 6f 72 20 70 50 67 20 2a 2f 0a 20  ata for pPg */. 
363d0 20 63 6f 6e 73 74 20 69 6e 74 20 75 73 61 62 6c   const int usabl
363e0 65 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 42 74  eSize = pPg->pBt
363f0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
36400 75 38 20 2a 20 63 6f 6e 73 74 20 70 45 6e 64 20  u8 * const pEnd 
36410 3d 20 26 61 44 61 74 61 5b 75 73 61 62 6c 65 53  = &aData[usableS
36420 69 7a 65 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  ize];.  int i;. 
36430 20 75 38 20 2a 70 43 65 6c 6c 70 74 72 20 3d 20   u8 *pCellptr = 
36440 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 3b 0a 20  pPg->aCellIdx;. 
36450 20 75 38 20 2a 70 54 6d 70 20 3d 20 73 71 6c 69   u8 *pTmp = sqli
36460 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63  te3PagerTempSpac
36470 65 28 70 50 67 2d 3e 70 42 74 2d 3e 70 50 61 67  e(pPg->pBt->pPag
36480 65 72 29 3b 0a 20 20 75 38 20 2a 70 44 61 74 61  er);.  u8 *pData
36490 3b 0a 0a 20 20 69 20 3d 20 67 65 74 32 62 79 74  ;..  i = get2byt
364a0 65 28 26 61 44 61 74 61 5b 68 64 72 2b 35 5d 29  e(&aData[hdr+5])
364b0 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 54 6d 70  ;.  memcpy(&pTmp
364c0 5b 69 5d 2c 20 26 61 44 61 74 61 5b 69 5d 2c 20  [i], &aData[i], 
364d0 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 69 29 3b  usableSize - i);
364e0 0a 0a 20 20 70 44 61 74 61 20 3d 20 70 45 6e 64  ..  pData = pEnd
364f0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
36500 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
36510 75 38 20 2a 70 43 65 6c 6c 20 3d 20 61 70 43 65  u8 *pCell = apCe
36520 6c 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  ll[i];.    if( p
36530 43 65 6c 6c 3e 61 44 61 74 61 20 26 26 20 70 43  Cell>aData && pC
36540 65 6c 6c 3c 70 45 6e 64 20 29 7b 0a 20 20 20 20  ell<pEnd ){.    
36550 20 20 70 43 65 6c 6c 20 3d 20 26 70 54 6d 70 5b    pCell = &pTmp[
36560 70 43 65 6c 6c 20 2d 20 61 44 61 74 61 5d 3b 0a  pCell - aData];.
36570 20 20 20 20 7d 0a 20 20 20 20 70 44 61 74 61 20      }.    pData 
36580 2d 3d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20  -= szCell[i];.  
36590 20 20 70 75 74 32 62 79 74 65 28 70 43 65 6c 6c    put2byte(pCell
365a0 70 74 72 2c 20 28 70 44 61 74 61 20 2d 20 61 44  ptr, (pData - aD
365b0 61 74 61 29 29 3b 0a 20 20 20 20 70 43 65 6c 6c  ata));.    pCell
365c0 70 74 72 20 2b 3d 20 32 3b 0a 20 20 20 20 69 66  ptr += 2;.    if
365d0 28 20 70 44 61 74 61 20 3c 20 70 43 65 6c 6c 70  ( pData < pCellp
365e0 74 72 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  tr ) return SQLI
365f0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
36600 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74  .    memcpy(pDat
36610 61 2c 20 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c  a, pCell, szCell
36620 5b 69 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  [i]);.    assert
36630 28 20 73 7a 43 65 6c 6c 5b 69 5d 3d 3d 70 50 67  ( szCell[i]==pPg
36640 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 67 2c  ->xCellSize(pPg,
36650 20 70 43 65 6c 6c 29 20 7c 7c 20 43 4f 52 52 55   pCell) || CORRU
36660 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 74 65 73  PT_DB );.    tes
36670 74 63 61 73 65 28 20 73 7a 43 65 6c 6c 5b 69 5d  tcase( szCell[i]
36680 21 3d 70 50 67 2d 3e 78 43 65 6c 6c 53 69 7a 65  !=pPg->xCellSize
36690 28 70 50 67 2c 70 43 65 6c 6c 29 20 29 3b 0a 20  (pPg,pCell) );. 
366a0 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 70 50 67   }..  /* The pPg
366b0 2d 3e 6e 46 72 65 65 20 66 69 65 6c 64 20 69 73  ->nFree field is
366c0 20 6e 6f 77 20 73 65 74 20 69 6e 63 6f 72 72 65   now set incorre
366d0 63 74 6c 79 2e 20 54 68 65 20 63 61 6c 6c 65 72  ctly. The caller
366e0 20 77 69 6c 6c 20 66 69 78 20 69 74 2e 20 2a 2f   will fix it. */
366f0 0a 20 20 70 50 67 2d 3e 6e 43 65 6c 6c 20 3d 20  .  pPg->nCell = 
36700 6e 43 65 6c 6c 3b 0a 20 20 70 50 67 2d 3e 6e 4f  nCell;.  pPg->nO
36710 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20  verflow = 0;..  
36720 70 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b  put2byte(&aData[
36730 68 64 72 2b 31 5d 2c 20 30 29 3b 0a 20 20 70 75  hdr+1], 0);.  pu
36740 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 68 64  t2byte(&aData[hd
36750 72 2b 33 5d 2c 20 70 50 67 2d 3e 6e 43 65 6c 6c  r+3], pPg->nCell
36760 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 61  );.  put2byte(&a
36770 44 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 44 61  Data[hdr+5], pDa
36780 74 61 20 2d 20 61 44 61 74 61 29 3b 0a 20 20 61  ta - aData);.  a
36790 44 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 78  Data[hdr+7] = 0x
367a0 30 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  00;.  return SQL
367b0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
367c0 20 41 72 72 61 79 20 61 70 43 65 6c 6c 5b 5d 20   Array apCell[] 
367d0 63 6f 6e 74 61 69 6e 73 20 6e 43 65 6c 6c 20 70  contains nCell p
367e0 6f 69 6e 74 65 72 73 20 74 6f 20 62 2d 74 72 65  ointers to b-tre
367f0 65 20 63 65 6c 6c 73 2e 20 41 72 72 61 79 20 73  e cells. Array s
36800 7a 43 65 6c 6c 0a 2a 2a 20 63 6f 6e 74 61 69 6e  zCell.** contain
36810 73 20 74 68 65 20 73 69 7a 65 20 69 6e 20 62 79  s the size in by
36820 74 65 73 20 6f 66 20 65 61 63 68 20 73 75 63 68  tes of each such
36830 20 63 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63   cell. This func
36840 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
36850 20 0a 2a 2a 20 61 64 64 20 74 68 65 20 63 65 6c   .** add the cel
36860 6c 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ls stored in the
36870 20 61 72 72 61 79 20 74 6f 20 70 61 67 65 20 70   array to page p
36880 50 67 2e 20 49 66 20 69 74 20 63 61 6e 6e 6f 74  Pg. If it cannot
36890 20 28 62 65 63 61 75 73 65 20 0a 2a 2a 20 74 68   (because .** th
368a0 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20  e page needs to 
368b0 62 65 20 64 65 66 72 61 67 6d 65 6e 74 65 64 20  be defragmented 
368c0 62 65 66 6f 72 65 20 74 68 65 20 63 65 6c 6c 73  before the cells
368d0 20 77 69 6c 6c 20 66 69 74 29 2c 20 6e 6f 6e 2d   will fit), non-
368e0 7a 65 72 6f 0a 2a 2a 20 69 73 20 72 65 74 75 72  zero.** is retur
368f0 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
36900 69 66 20 74 68 65 20 63 65 6c 6c 73 20 61 72 65  if the cells are
36910 20 61 64 64 65 64 20 73 75 63 63 65 73 73 66 75   added successfu
36920 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 0a 2a 2a 20  lly, zero is.** 
36930 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
36940 41 72 67 75 6d 65 6e 74 20 70 43 65 6c 6c 70 74  Argument pCellpt
36950 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  r points to the 
36960 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74  first entry in t
36970 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20  he cell-pointer 
36980 61 72 72 61 79 0a 2a 2a 20 28 70 61 72 74 20 6f  array.** (part o
36990 66 20 70 61 67 65 20 70 50 67 29 20 74 6f 20 70  f page pPg) to p
369a0 6f 70 75 6c 61 74 65 2e 20 41 66 74 65 72 20 63  opulate. After c
369b0 65 6c 6c 20 61 70 43 65 6c 6c 5b 30 5d 20 69 73  ell apCell[0] is
369c0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a   written to the.
369d0 2a 2a 20 70 61 67 65 20 62 6f 64 79 2c 20 61 20  ** page body, a 
369e0 31 36 2d 62 69 74 20 6f 66 66 73 65 74 20 69 73  16-bit offset is
369f0 20 77 72 69 74 74 65 6e 20 74 6f 20 70 43 65 6c   written to pCel
36a00 6c 70 74 72 2e 20 41 6e 64 20 73 6f 20 6f 6e 2c  lptr. And so on,
36a10 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 65 6c   for each.** cel
36a20 6c 20 69 6e 20 74 68 65 20 61 72 72 61 79 2e 20  l in the array. 
36a30 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  It is the respon
36a40 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
36a50 63 61 6c 6c 65 72 20 74 6f 20 65 6e 73 75 72 65  caller to ensure
36a60 0a 2a 2a 20 74 68 61 74 20 69 74 20 69 73 20 73  .** that it is s
36a70 61 66 65 20 74 6f 20 6f 76 65 72 77 72 69 74 65  afe to overwrite
36a80 20 74 68 69 73 20 70 61 72 74 20 6f 66 20 74 68   this part of th
36a90 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61  e cell-pointer a
36aa0 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  rray..**.** When
36ab0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
36ac0 73 20 63 61 6c 6c 65 64 2c 20 2a 70 70 44 61 74  s called, *ppDat
36ad0 61 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  a points to the 
36ae0 73 74 61 72 74 20 6f 66 20 74 68 65 20 0a 2a 2a  start of the .**
36af0 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 6f 6e   content area on
36b00 20 70 61 67 65 20 70 50 67 2e 20 49 66 20 74 68   page pPg. If th
36b10 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 63 6f  e size of the co
36b20 6e 74 65 6e 74 20 61 72 65 61 20 69 73 20 65 78  ntent area is ex
36b30 74 65 6e 64 65 64 2c 0a 2a 2a 20 2a 70 70 44 61  tended,.** *ppDa
36b40 74 61 20 69 73 20 75 70 64 61 74 65 64 20 74 6f  ta is updated to
36b50 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65   point to the ne
36b60 77 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63  w start of the c
36b70 6f 6e 74 65 6e 74 20 61 72 65 61 0a 2a 2a 20 62  ontent area.** b
36b80 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
36b90 0a 2a 2a 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20  .**.** Finally, 
36ba0 61 72 67 75 6d 65 6e 74 20 70 42 65 67 69 6e 20  argument pBegin 
36bb0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 62 79  points to the by
36bc0 74 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  te immediately f
36bd0 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 0a 2a 2a 20  ollowing the.** 
36be0 65 6e 64 20 6f 66 20 74 68 65 20 73 70 61 63 65  end of the space
36bf0 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 69   required by thi
36c00 73 20 70 61 67 65 20 66 6f 72 20 74 68 65 20 63  s page for the c
36c10 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 65 61  ell-pointer area
36c20 20 28 66 6f 72 0a 2a 2a 20 61 6c 6c 20 63 65 6c   (for.** all cel
36c30 6c 73 20 2d 20 6e 6f 74 20 6a 75 73 74 20 74 68  ls - not just th
36c40 6f 73 65 20 69 6e 73 65 72 74 65 64 20 62 79 20  ose inserted by 
36c50 74 68 65 20 63 75 72 72 65 6e 74 20 63 61 6c 6c  the current call
36c60 29 2e 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e  ). If the conten
36c70 74 0a 2a 2a 20 61 72 65 61 20 6d 75 73 74 20 62  t.** area must b
36c80 65 20 65 78 74 65 6e 64 65 64 20 74 6f 20 62 65  e extended to be
36c90 66 6f 72 65 20 74 68 69 73 20 70 6f 69 6e 74 20  fore this point 
36ca0 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 63 63 6f  in order to acco
36cb0 6d 6f 64 61 74 65 20 61 6c 6c 0a 2a 2a 20 63 65  modate all.** ce
36cc0 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2c  lls in apCell[],
36cd0 20 74 68 65 6e 20 74 68 65 20 63 65 6c 6c 73 20   then the cells 
36ce0 64 6f 20 6e 6f 74 20 66 69 74 20 61 6e 64 20 6e  do not fit and n
36cf0 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72  on-zero is retur
36d00 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
36d10 6e 74 20 70 61 67 65 49 6e 73 65 72 74 41 72 72  nt pageInsertArr
36d20 61 79 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ay(.  MemPage *p
36d30 50 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg,             
36d40 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74 6f        /* Page to
36d50 20 61 64 64 20 63 65 6c 6c 73 20 74 6f 20 2a 2f   add cells to */
36d60 0a 20 20 75 38 20 2a 70 42 65 67 69 6e 2c 20 20  .  u8 *pBegin,  
36d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36d80 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 63 65 6c     /* End of cel
36d90 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20  l-pointer array 
36da0 2a 2f 0a 20 20 75 38 20 2a 2a 70 70 44 61 74 61  */.  u8 **ppData
36db0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
36dc0 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
36dd0 50 61 67 65 20 63 6f 6e 74 65 6e 74 20 2d 61 72  Page content -ar
36de0 65 61 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  ea pointer */.  
36df0 75 38 20 2a 70 43 65 6c 6c 70 74 72 2c 20 20 20  u8 *pCellptr,   
36e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36e10 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 65  /* Pointer to ce
36e20 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 65 61 20  ll-pointer area 
36e30 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72 73 74 2c  */.  int iFirst,
36e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36e50 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
36e60 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 20 61   first cell to a
36e70 64 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  dd */.  int nCel
36e80 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
36e90 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
36ea0 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 64  r of cells to ad
36eb0 64 20 74 6f 20 70 50 67 20 2a 2f 0a 20 20 43 65  d to pPg */.  Ce
36ec0 6c 6c 41 72 72 61 79 20 2a 70 43 41 72 72 61 79  llArray *pCArray
36ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36ee0 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 73 20   Array of cells 
36ef0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
36f00 20 75 38 20 2a 61 44 61 74 61 20 3d 20 70 50 67   u8 *aData = pPg
36f10 2d 3e 61 44 61 74 61 3b 0a 20 20 75 38 20 2a 70  ->aData;.  u8 *p
36f20 44 61 74 61 20 3d 20 2a 70 70 44 61 74 61 3b 0a  Data = *ppData;.
36f30 20 20 69 6e 74 20 69 45 6e 64 20 3d 20 69 46 69    int iEnd = iFi
36f40 72 73 74 20 2b 20 6e 43 65 6c 6c 3b 0a 20 20 61  rst + nCell;.  a
36f50 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
36f60 42 20 7c 7c 20 70 50 67 2d 3e 68 64 72 4f 66 66  B || pPg->hdrOff
36f70 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20  set==0 );    /* 
36f80 4e 65 76 65 72 20 63 61 6c 6c 65 64 20 6f 6e 20  Never called on 
36f90 70 61 67 65 20 31 20 2a 2f 0a 20 20 66 6f 72 28  page 1 */.  for(
36fa0 69 3d 69 46 69 72 73 74 3b 20 69 3c 69 45 6e 64  i=iFirst; i<iEnd
36fb0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
36fc0 73 7a 2c 20 72 63 3b 0a 20 20 20 20 75 38 20 2a  sz, rc;.    u8 *
36fd0 70 53 6c 6f 74 3b 0a 20 20 20 20 73 7a 20 3d 20  pSlot;.    sz = 
36fe0 63 61 63 68 65 64 43 65 6c 6c 53 69 7a 65 28 70  cachedCellSize(p
36ff0 43 41 72 72 61 79 2c 20 69 29 3b 0a 20 20 20 20  CArray, i);.    
37000 69 66 28 20 28 61 44 61 74 61 5b 31 5d 3d 3d 30  if( (aData[1]==0
37010 20 26 26 20 61 44 61 74 61 5b 32 5d 3d 3d 30 29   && aData[2]==0)
37020 20 7c 7c 20 28 70 53 6c 6f 74 20 3d 20 70 61 67   || (pSlot = pag
37030 65 46 69 6e 64 53 6c 6f 74 28 70 50 67 2c 73 7a  eFindSlot(pPg,sz
37040 2c 26 72 63 29 29 3d 3d 30 20 29 7b 0a 20 20 20  ,&rc))==0 ){.   
37050 20 20 20 70 44 61 74 61 20 2d 3d 20 73 7a 3b 0a     pData -= sz;.
37060 20 20 20 20 20 20 69 66 28 20 70 44 61 74 61 3c        if( pData<
37070 70 42 65 67 69 6e 20 29 20 72 65 74 75 72 6e 20  pBegin ) return 
37080 31 3b 0a 20 20 20 20 20 20 70 53 6c 6f 74 20 3d  1;.      pSlot =
37090 20 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20   pData;.    }.  
370a0 20 20 6d 65 6d 63 70 79 28 70 53 6c 6f 74 2c 20    memcpy(pSlot, 
370b0 70 43 41 72 72 61 79 2d 3e 61 70 43 65 6c 6c 5b  pCArray->apCell[
370c0 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 70 75 74  i], sz);.    put
370d0 32 62 79 74 65 28 70 43 65 6c 6c 70 74 72 2c 20  2byte(pCellptr, 
370e0 28 70 53 6c 6f 74 20 2d 20 61 44 61 74 61 29 29  (pSlot - aData))
370f0 3b 0a 20 20 20 20 70 43 65 6c 6c 70 74 72 20 2b  ;.    pCellptr +
37100 3d 20 32 3b 0a 20 20 7d 0a 20 20 2a 70 70 44 61  = 2;.  }.  *ppDa
37110 74 61 20 3d 20 70 44 61 74 61 3b 0a 20 20 72 65  ta = pData;.  re
37120 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
37130 20 41 72 72 61 79 20 61 70 43 65 6c 6c 5b 5d 20   Array apCell[] 
37140 63 6f 6e 74 61 69 6e 73 20 6e 43 65 6c 6c 20 70  contains nCell p
37150 6f 69 6e 74 65 72 73 20 74 6f 20 62 2d 74 72 65  ointers to b-tre
37160 65 20 63 65 6c 6c 73 2e 20 41 72 72 61 79 20 73  e cells. Array s
37170 7a 43 65 6c 6c 20 0a 2a 2a 20 63 6f 6e 74 61 69  zCell .** contai
37180 6e 73 20 74 68 65 20 73 69 7a 65 20 69 6e 20 62  ns the size in b
37190 79 74 65 73 20 6f 66 20 65 61 63 68 20 73 75 63  ytes of each suc
371a0 68 20 63 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e  h cell. This fun
371b0 63 74 69 6f 6e 20 61 64 64 73 20 74 68 65 0a 2a  ction adds the.*
371c0 2a 20 73 70 61 63 65 20 61 73 73 6f 63 69 61 74  * space associat
371d0 65 64 20 77 69 74 68 20 65 61 63 68 20 63 65 6c  ed with each cel
371e0 6c 20 69 6e 20 74 68 65 20 61 72 72 61 79 20 74  l in the array t
371f0 68 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79  hat is currently
37200 20 73 74 6f 72 65 64 20 0a 2a 2a 20 77 69 74 68   stored .** with
37210 69 6e 20 74 68 65 20 62 6f 64 79 20 6f 66 20 70  in the body of p
37220 50 67 20 74 6f 20 74 68 65 20 70 50 67 20 66 72  Pg to the pPg fr
37230 65 65 2d 6c 69 73 74 2e 20 54 68 65 20 63 65 6c  ee-list. The cel
37240 6c 2d 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 6f  l-pointers and o
37250 74 68 65 72 0a 2a 2a 20 66 69 65 6c 64 73 20 6f  ther.** fields o
37260 66 20 74 68 65 20 70 61 67 65 20 61 72 65 20 6e  f the page are n
37270 6f 74 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a  ot updated..**.*
37280 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
37290 72 65 74 75 72 6e 73 20 74 68 65 20 74 6f 74 61  returns the tota
372a0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  l number of cell
372b0 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66  s added to the f
372c0 72 65 65 2d 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  ree-list..*/.sta
372d0 74 69 63 20 69 6e 74 20 70 61 67 65 46 72 65 65  tic int pageFree
372e0 41 72 72 61 79 28 0a 20 20 4d 65 6d 50 61 67 65  Array(.  MemPage
372f0 20 2a 70 50 67 2c 20 20 20 20 20 20 20 20 20 20   *pPg,          
37300 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
37310 20 74 6f 20 65 64 69 74 20 2a 2f 0a 20 20 69 6e   to edit */.  in
37320 74 20 69 46 69 72 73 74 2c 20 20 20 20 20 20 20  t iFirst,       
37330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
37340 20 46 69 72 73 74 20 63 65 6c 6c 20 74 6f 20 64   First cell to d
37350 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  elete */.  int n
37360 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
37370 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 65             /* Ce
37380 6c 6c 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f  lls to delete */
37390 0a 20 20 43 65 6c 6c 41 72 72 61 79 20 2a 70 43  .  CellArray *pC
373a0 41 72 72 61 79 20 20 20 20 20 20 20 20 20 20 20  Array           
373b0 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63     /* Array of c
373c0 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20  ells */.){.  u8 
373d0 2a 20 63 6f 6e 73 74 20 61 44 61 74 61 20 3d 20  * const aData = 
373e0 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20 75 38  pPg->aData;.  u8
373f0 20 2a 20 63 6f 6e 73 74 20 70 45 6e 64 20 3d 20   * const pEnd = 
37400 26 61 44 61 74 61 5b 70 50 67 2d 3e 70 42 74 2d  &aData[pPg->pBt-
37410 3e 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20  >usableSize];.  
37420 75 38 20 2a 20 63 6f 6e 73 74 20 70 53 74 61 72  u8 * const pStar
37430 74 20 3d 20 26 61 44 61 74 61 5b 70 50 67 2d 3e  t = &aData[pPg->
37440 68 64 72 4f 66 66 73 65 74 20 2b 20 38 20 2b 20  hdrOffset + 8 + 
37450 70 50 67 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  pPg->childPtrSiz
37460 65 5d 3b 0a 20 20 69 6e 74 20 6e 52 65 74 20 3d  e];.  int nRet =
37470 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69   0;.  int i;.  i
37480 6e 74 20 69 45 6e 64 20 3d 20 69 46 69 72 73 74  nt iEnd = iFirst
37490 20 2b 20 6e 43 65 6c 6c 3b 0a 20 20 75 38 20 2a   + nCell;.  u8 *
374a0 70 46 72 65 65 20 3d 20 30 3b 0a 20 20 69 6e 74  pFree = 0;.  int
374b0 20 73 7a 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20   szFree = 0;..  
374c0 66 6f 72 28 69 3d 69 46 69 72 73 74 3b 20 69 3c  for(i=iFirst; i<
374d0 69 45 6e 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  iEnd; i++){.    
374e0 75 38 20 2a 70 43 65 6c 6c 20 3d 20 70 43 41 72  u8 *pCell = pCAr
374f0 72 61 79 2d 3e 61 70 43 65 6c 6c 5b 69 5d 3b 0a  ray->apCell[i];.
37500 20 20 20 20 69 66 28 20 70 43 65 6c 6c 3e 3d 70      if( pCell>=p
37510 53 74 61 72 74 20 26 26 20 70 43 65 6c 6c 3c 70  Start && pCell<p
37520 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  End ){.      int
37530 20 73 7a 3b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f   sz;.      /* No
37540 20 6e 65 65 64 20 74 6f 20 75 73 65 20 63 61 63   need to use cac
37550 68 65 64 43 65 6c 6c 53 69 7a 65 28 29 20 68 65  hedCellSize() he
37560 72 65 2e 20 20 54 68 65 20 73 69 7a 65 73 20 6f  re.  The sizes o
37570 66 20 61 6c 6c 20 63 65 6c 6c 73 20 74 68 61 74  f all cells that
37580 0a 20 20 20 20 20 20 2a 2a 20 61 72 65 20 74 6f  .      ** are to
37590 20 62 65 20 66 72 65 65 64 20 68 61 76 65 20 61   be freed have a
375a0 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6d 70  lready been comp
375b0 75 74 69 6e 67 20 77 68 69 6c 65 20 64 65 63 69  uting while deci
375c0 64 69 6e 67 20 77 68 69 63 68 0a 20 20 20 20 20  ding which.     
375d0 20 2a 2a 20 63 65 6c 6c 73 20 6e 65 65 64 20 66   ** cells need f
375e0 72 65 65 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20  reeing */.      
375f0 73 7a 20 3d 20 70 43 41 72 72 61 79 2d 3e 73 7a  sz = pCArray->sz
37600 43 65 6c 6c 5b 69 5d 3b 20 20 61 73 73 65 72 74  Cell[i];  assert
37610 28 20 73 7a 3e 30 20 29 3b 0a 20 20 20 20 20 20  ( sz>0 );.      
37620 69 66 28 20 70 46 72 65 65 21 3d 28 70 43 65 6c  if( pFree!=(pCel
37630 6c 20 2b 20 73 7a 29 20 29 7b 0a 20 20 20 20 20  l + sz) ){.     
37640 20 20 20 69 66 28 20 70 46 72 65 65 20 29 7b 0a     if( pFree ){.
37650 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
37660 28 20 70 46 72 65 65 3e 61 44 61 74 61 20 26 26  ( pFree>aData &&
37670 20 28 70 46 72 65 65 20 2d 20 61 44 61 74 61 29   (pFree - aData)
37680 3c 36 35 35 33 36 20 29 3b 0a 20 20 20 20 20 20  <65536 );.      
37690 20 20 20 20 66 72 65 65 53 70 61 63 65 28 70 50      freeSpace(pP
376a0 67 2c 20 28 75 31 36 29 28 70 46 72 65 65 20 2d  g, (u16)(pFree -
376b0 20 61 44 61 74 61 29 2c 20 73 7a 46 72 65 65 29   aData), szFree)
376c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
376d0 20 20 20 20 70 46 72 65 65 20 3d 20 70 43 65 6c      pFree = pCel
376e0 6c 3b 0a 20 20 20 20 20 20 20 20 73 7a 46 72 65  l;.        szFre
376f0 65 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20  e = sz;.        
37700 69 66 28 20 70 46 72 65 65 2b 73 7a 3e 70 45 6e  if( pFree+sz>pEn
37710 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  d ) return 0;.  
37720 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
37730 20 20 20 70 46 72 65 65 20 3d 20 70 43 65 6c 6c     pFree = pCell
37740 3b 0a 20 20 20 20 20 20 20 20 73 7a 46 72 65 65  ;.        szFree
37750 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 7d 0a   += sz;.      }.
37760 20 20 20 20 20 20 6e 52 65 74 2b 2b 3b 0a 20 20        nRet++;.  
37770 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 46    }.  }.  if( pF
37780 72 65 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ree ){.    asser
37790 74 28 20 70 46 72 65 65 3e 61 44 61 74 61 20 26  t( pFree>aData &
377a0 26 20 28 70 46 72 65 65 20 2d 20 61 44 61 74 61  & (pFree - aData
377b0 29 3c 36 35 35 33 36 20 29 3b 0a 20 20 20 20 66  )<65536 );.    f
377c0 72 65 65 53 70 61 63 65 28 70 50 67 2c 20 28 75  reeSpace(pPg, (u
377d0 31 36 29 28 70 46 72 65 65 20 2d 20 61 44 61 74  16)(pFree - aDat
377e0 61 29 2c 20 73 7a 46 72 65 65 29 3b 0a 20 20 7d  a), szFree);.  }
377f0 0a 20 20 72 65 74 75 72 6e 20 6e 52 65 74 3b 0a  .  return nRet;.
37800 7d 0a 0a 2f 2a 0a 2a 2a 20 61 70 43 65 6c 6c 5b  }../*.** apCell[
37810 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 63  ] and szCell[] c
37820 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74 65 72 73  ontains pointers
37830 20 74 6f 20 61 6e 64 20 73 69 7a 65 73 20 6f 66   to and sizes of
37840 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 74 68   all cells in th
37850 65 0a 2a 2a 20 70 61 67 65 73 20 62 65 69 6e 67  e.** pages being
37860 20 62 61 6c 61 6e 63 65 64 2e 20 20 54 68 65 20   balanced.  The 
37870 63 75 72 72 65 6e 74 20 70 61 67 65 2c 20 70 50  current page, pP
37880 67 2c 20 68 61 73 20 70 50 67 2d 3e 6e 43 65 6c  g, has pPg->nCel
37890 6c 20 63 65 6c 6c 73 20 73 74 61 72 74 69 6e 67  l cells starting
378a0 0a 2a 2a 20 77 69 74 68 20 61 70 43 65 6c 6c 5b  .** with apCell[
378b0 69 4f 6c 64 5d 2e 20 20 41 66 74 65 72 20 62 61  iOld].  After ba
378c0 6c 61 6e 63 69 6e 67 2c 20 74 68 69 73 20 70 61  lancing, this pa
378d0 67 65 20 73 68 6f 75 6c 64 20 68 6f 6c 64 20 6e  ge should hold n
378e0 4e 65 77 20 63 65 6c 6c 73 0a 2a 2a 20 73 74 61  New cells.** sta
378f0 72 74 69 6e 67 20 61 74 20 61 70 43 65 6c 6c 5b  rting at apCell[
37900 69 4e 65 77 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  iNew]..**.** Thi
37910 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20  s routine makes 
37920 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 61 64  the necessary ad
37930 6a 75 73 74 6d 65 6e 74 73 20 74 6f 20 70 50 67  justments to pPg
37940 20 73 6f 20 74 68 61 74 20 69 74 20 63 6f 6e 74   so that it cont
37950 61 69 6e 73 0a 2a 2a 20 74 68 65 20 63 6f 72 72  ains.** the corr
37960 65 63 74 20 63 65 6c 6c 73 20 61 66 74 65 72 20  ect cells after 
37970 62 65 69 6e 67 20 62 61 6c 61 6e 63 65 64 2e 0a  being balanced..
37980 2a 2a 0a 2a 2a 20 54 68 65 20 70 50 67 2d 3e 6e  **.** The pPg->n
37990 46 72 65 65 20 66 69 65 6c 64 20 69 73 20 69 6e  Free field is in
379a0 76 61 6c 69 64 20 77 68 65 6e 20 74 68 69 73 20  valid when this 
379b0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
379c0 2e 20 49 74 20 69 73 20 74 68 65 0a 2a 2a 20 72  . It is the.** r
379d0 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
379e0 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 73   the caller to s
379f0 65 74 20 69 74 20 63 6f 72 72 65 63 74 6c 79 2e  et it correctly.
37a00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
37a10 64 69 74 50 61 67 65 28 0a 20 20 4d 65 6d 50 61  ditPage(.  MemPa
37a20 67 65 20 2a 70 50 67 2c 20 20 20 20 20 20 20 20  ge *pPg,        
37a30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 64             /* Ed
37a40 69 74 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  it this page */.
37a50 20 20 69 6e 74 20 69 4f 6c 64 2c 20 20 20 20 20    int iOld,     
37a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37a70 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69    /* Index of fi
37a80 72 73 74 20 63 65 6c 6c 20 63 75 72 72 65 6e 74  rst cell current
37a90 6c 79 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20  ly on page */.  
37aa0 69 6e 74 20 69 4e 65 77 2c 20 20 20 20 20 20 20  int iNew,       
37ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37ac0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65 77 20  /* Index of new 
37ad0 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e 20 70 61  first cell on pa
37ae0 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77  ge */.  int nNew
37af0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
37b00 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c          /* Final
37b10 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   number of cells
37b20 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20 43 65   on page */.  Ce
37b30 6c 6c 41 72 72 61 79 20 2a 70 43 41 72 72 61 79  llArray *pCArray
37b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
37b50 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 73 20   Array of cells 
37b60 61 6e 64 20 73 69 7a 65 73 20 2a 2f 0a 29 7b 0a  and sizes */.){.
37b70 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61    u8 * const aDa
37b80 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b  ta = pPg->aData;
37b90 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72  .  const int hdr
37ba0 20 3d 20 70 50 67 2d 3e 68 64 72 4f 66 66 73 65   = pPg->hdrOffse
37bb0 74 3b 0a 20 20 75 38 20 2a 70 42 65 67 69 6e 20  t;.  u8 *pBegin 
37bc0 3d 20 26 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78  = &pPg->aCellIdx
37bd0 5b 6e 4e 65 77 20 2a 20 32 5d 3b 0a 20 20 69 6e  [nNew * 2];.  in
37be0 74 20 6e 43 65 6c 6c 20 3d 20 70 50 67 2d 3e 6e  t nCell = pPg->n
37bf0 43 65 6c 6c 3b 20 20 20 20 20 20 20 2f 2a 20 43  Cell;       /* C
37c00 65 6c 6c 73 20 73 74 6f 72 65 64 20 6f 6e 20 70  ells stored on p
37c10 50 67 20 2a 2f 0a 20 20 75 38 20 2a 70 44 61 74  Pg */.  u8 *pDat
37c20 61 3b 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70 74  a;.  u8 *pCellpt
37c30 72 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  r;.  int i;.  in
37c40 74 20 69 4f 6c 64 45 6e 64 20 3d 20 69 4f 6c 64  t iOldEnd = iOld
37c50 20 2b 20 70 50 67 2d 3e 6e 43 65 6c 6c 20 2b 20   + pPg->nCell + 
37c60 70 50 67 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a  pPg->nOverflow;.
37c70 20 20 69 6e 74 20 69 4e 65 77 45 6e 64 20 3d 20    int iNewEnd = 
37c80 69 4e 65 77 20 2b 20 6e 4e 65 77 3b 0a 0a 23 69  iNew + nNew;..#i
37c90 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
37ca0 47 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d 20 73  G.  u8 *pTmp = s
37cb0 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53  qlite3PagerTempS
37cc0 70 61 63 65 28 70 50 67 2d 3e 70 42 74 2d 3e 70  pace(pPg->pBt->p
37cd0 50 61 67 65 72 29 3b 0a 20 20 6d 65 6d 63 70 79  Pager);.  memcpy
37ce0 28 70 54 6d 70 2c 20 61 44 61 74 61 2c 20 70 50  (pTmp, aData, pP
37cf0 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  g->pBt->usableSi
37d00 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  ze);.#endif..  /
37d10 2a 20 52 65 6d 6f 76 65 20 63 65 6c 6c 73 20 66  * Remove cells f
37d20 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20 61 6e  rom the start an
37d30 64 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67  d end of the pag
37d40 65 20 2a 2f 0a 20 20 69 66 28 20 69 4f 6c 64 3c  e */.  if( iOld<
37d50 69 4e 65 77 20 29 7b 0a 20 20 20 20 69 6e 74 20  iNew ){.    int 
37d60 6e 53 68 69 66 74 20 3d 20 70 61 67 65 46 72 65  nShift = pageFre
37d70 65 41 72 72 61 79 28 70 50 67 2c 20 69 4f 6c 64  eArray(pPg, iOld
37d80 2c 20 69 4e 65 77 2d 69 4f 6c 64 2c 20 70 43 41  , iNew-iOld, pCA
37d90 72 72 61 79 29 3b 0a 20 20 20 20 6d 65 6d 6d 6f  rray);.    memmo
37da0 76 65 28 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78  ve(pPg->aCellIdx
37db0 2c 20 26 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78  , &pPg->aCellIdx
37dc0 5b 6e 53 68 69 66 74 2a 32 5d 2c 20 6e 43 65 6c  [nShift*2], nCel
37dd0 6c 2a 32 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20  l*2);.    nCell 
37de0 2d 3d 20 6e 53 68 69 66 74 3b 0a 20 20 7d 0a 20  -= nShift;.  }. 
37df0 20 69 66 28 20 69 4e 65 77 45 6e 64 20 3c 20 69   if( iNewEnd < i
37e00 4f 6c 64 45 6e 64 20 29 7b 0a 20 20 20 20 6e 43  OldEnd ){.    nC
37e10 65 6c 6c 20 2d 3d 20 70 61 67 65 46 72 65 65 41  ell -= pageFreeA
37e20 72 72 61 79 28 70 50 67 2c 20 69 4e 65 77 45 6e  rray(pPg, iNewEn
37e30 64 2c 20 69 4f 6c 64 45 6e 64 20 2d 20 69 4e 65  d, iOldEnd - iNe
37e40 77 45 6e 64 2c 20 70 43 41 72 72 61 79 29 3b 0a  wEnd, pCArray);.
37e50 20 20 7d 0a 0a 20 20 70 44 61 74 61 20 3d 20 26    }..  pData = &
37e60 61 44 61 74 61 5b 67 65 74 32 62 79 74 65 4e 6f  aData[get2byteNo
37e70 74 5a 65 72 6f 28 26 61 44 61 74 61 5b 68 64 72  tZero(&aData[hdr
37e80 2b 35 5d 29 5d 3b 0a 20 20 69 66 28 20 70 44 61  +5])];.  if( pDa
37e90 74 61 3c 70 42 65 67 69 6e 20 29 20 67 6f 74 6f  ta<pBegin ) goto
37ea0 20 65 64 69 74 70 61 67 65 5f 66 61 69 6c 3b 0a   editpage_fail;.
37eb0 0a 20 20 2f 2a 20 41 64 64 20 63 65 6c 6c 73 20  .  /* Add cells 
37ec0 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
37ed0 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 66  the page */.  if
37ee0 28 20 69 4e 65 77 3c 69 4f 6c 64 20 29 7b 0a 20  ( iNew<iOld ){. 
37ef0 20 20 20 69 6e 74 20 6e 41 64 64 20 3d 20 4d 49     int nAdd = MI
37f00 4e 28 6e 4e 65 77 2c 69 4f 6c 64 2d 69 4e 65 77  N(nNew,iOld-iNew
37f10 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
37f20 69 4f 6c 64 2d 69 4e 65 77 29 3c 6e 4e 65 77 20  iOld-iNew)<nNew 
37f30 7c 7c 20 6e 43 65 6c 6c 3d 3d 30 20 7c 7c 20 43  || nCell==0 || C
37f40 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20  ORRUPT_DB );.   
37f50 20 70 43 65 6c 6c 70 74 72 20 3d 20 70 50 67 2d   pCellptr = pPg-
37f60 3e 61 43 65 6c 6c 49 64 78 3b 0a 20 20 20 20 6d  >aCellIdx;.    m
37f70 65 6d 6d 6f 76 65 28 26 70 43 65 6c 6c 70 74 72  emmove(&pCellptr
37f80 5b 6e 41 64 64 2a 32 5d 2c 20 70 43 65 6c 6c 70  [nAdd*2], pCellp
37f90 74 72 2c 20 6e 43 65 6c 6c 2a 32 29 3b 0a 20 20  tr, nCell*2);.  
37fa0 20 20 69 66 28 20 70 61 67 65 49 6e 73 65 72 74    if( pageInsert
37fb0 41 72 72 61 79 28 0a 20 20 20 20 20 20 20 20 20  Array(.         
37fc0 20 70 50 67 2c 20 70 42 65 67 69 6e 2c 20 26 70   pPg, pBegin, &p
37fd0 44 61 74 61 2c 20 70 43 65 6c 6c 70 74 72 2c 0a  Data, pCellptr,.
37fe0 20 20 20 20 20 20 20 20 20 20 69 4e 65 77 2c 20            iNew, 
37ff0 6e 41 64 64 2c 20 70 43 41 72 72 61 79 0a 20 20  nAdd, pCArray.  
38000 20 20 29 20 29 20 67 6f 74 6f 20 65 64 69 74 70    ) ) goto editp
38010 61 67 65 5f 66 61 69 6c 3b 0a 20 20 20 20 6e 43  age_fail;.    nC
38020 65 6c 6c 20 2b 3d 20 6e 41 64 64 3b 0a 20 20 7d  ell += nAdd;.  }
38030 0a 0a 20 20 2f 2a 20 41 64 64 20 61 6e 79 20 6f  ..  /* Add any o
38040 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 2a 2f  verflow cells */
38050 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50  .  for(i=0; i<pP
38060 67 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 20 69 2b  g->nOverflow; i+
38070 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 65 6c  +){.    int iCel
38080 6c 20 3d 20 28 69 4f 6c 64 20 2b 20 70 50 67 2d  l = (iOld + pPg-
38090 3e 61 69 4f 76 66 6c 5b 69 5d 29 20 2d 20 69 4e  >aiOvfl[i]) - iN
380a0 65 77 3b 0a 20 20 20 20 69 66 28 20 69 43 65 6c  ew;.    if( iCel
380b0 6c 3e 3d 30 20 26 26 20 69 43 65 6c 6c 3c 6e 4e  l>=0 && iCell<nN
380c0 65 77 20 29 7b 0a 20 20 20 20 20 20 70 43 65 6c  ew ){.      pCel
380d0 6c 70 74 72 20 3d 20 26 70 50 67 2d 3e 61 43 65  lptr = &pPg->aCe
380e0 6c 6c 49 64 78 5b 69 43 65 6c 6c 20 2a 20 32 5d  llIdx[iCell * 2]
380f0 3b 0a 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28  ;.      memmove(
38100 26 70 43 65 6c 6c 70 74 72 5b 32 5d 2c 20 70 43  &pCellptr[2], pC
38110 65 6c 6c 70 74 72 2c 20 28 6e 43 65 6c 6c 20 2d  ellptr, (nCell -
38120 20 69 43 65 6c 6c 29 20 2a 20 32 29 3b 0a 20 20   iCell) * 2);.  
38130 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20      nCell++;.   
38140 20 20 20 69 66 28 20 70 61 67 65 49 6e 73 65 72     if( pageInser
38150 74 41 72 72 61 79 28 0a 20 20 20 20 20 20 20 20  tArray(.        
38160 20 20 20 20 70 50 67 2c 20 70 42 65 67 69 6e 2c      pPg, pBegin,
38170 20 26 70 44 61 74 61 2c 20 70 43 65 6c 6c 70 74   &pData, pCellpt
38180 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  r,.            i
38190 43 65 6c 6c 2b 69 4e 65 77 2c 20 31 2c 20 70 43  Cell+iNew, 1, pC
381a0 41 72 72 61 79 0a 20 20 20 20 20 20 29 20 29 20  Array.      ) ) 
381b0 67 6f 74 6f 20 65 64 69 74 70 61 67 65 5f 66 61  goto editpage_fa
381c0 69 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  il;.    }.  }.. 
381d0 20 2f 2a 20 41 70 70 65 6e 64 20 63 65 6c 6c 73   /* Append cells
381e0 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
381f0 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 70 43 65  he page */.  pCe
38200 6c 6c 70 74 72 20 3d 20 26 70 50 67 2d 3e 61 43  llptr = &pPg->aC
38210 65 6c 6c 49 64 78 5b 6e 43 65 6c 6c 2a 32 5d 3b  ellIdx[nCell*2];
38220 0a 20 20 69 66 28 20 70 61 67 65 49 6e 73 65 72  .  if( pageInser
38230 74 41 72 72 61 79 28 0a 20 20 20 20 20 20 20 20  tArray(.        
38240 70 50 67 2c 20 70 42 65 67 69 6e 2c 20 26 70 44  pPg, pBegin, &pD
38250 61 74 61 2c 20 70 43 65 6c 6c 70 74 72 2c 0a 20  ata, pCellptr,. 
38260 20 20 20 20 20 20 20 69 4e 65 77 2b 6e 43 65 6c         iNew+nCel
38270 6c 2c 20 6e 4e 65 77 2d 6e 43 65 6c 6c 2c 20 70  l, nNew-nCell, p
38280 43 41 72 72 61 79 0a 20 20 29 20 29 20 67 6f 74  CArray.  ) ) got
38290 6f 20 65 64 69 74 70 61 67 65 5f 66 61 69 6c 3b  o editpage_fail;
382a0 0a 0a 20 20 70 50 67 2d 3e 6e 43 65 6c 6c 20 3d  ..  pPg->nCell =
382b0 20 6e 4e 65 77 3b 0a 20 20 70 50 67 2d 3e 6e 4f   nNew;.  pPg->nO
382c0 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20  verflow = 0;..  
382d0 70 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b  put2byte(&aData[
382e0 68 64 72 2b 33 5d 2c 20 70 50 67 2d 3e 6e 43 65  hdr+3], pPg->nCe
382f0 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  ll);.  put2byte(
38300 26 61 44 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70  &aData[hdr+5], p
38310 44 61 74 61 20 2d 20 61 44 61 74 61 29 3b 0a 0a  Data - aData);..
38320 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
38330 42 55 47 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  BUG.  for(i=0; i
38340 3c 6e 4e 65 77 20 26 26 20 21 43 4f 52 52 55 50  <nNew && !CORRUP
38350 54 5f 44 42 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  T_DB; i++){.    
38360 75 38 20 2a 70 43 65 6c 6c 20 3d 20 70 43 41 72  u8 *pCell = pCAr
38370 72 61 79 2d 3e 61 70 43 65 6c 6c 5b 69 2b 69 4e  ray->apCell[i+iN
38380 65 77 5d 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66  ew];.    int iOf
38390 66 20 3d 20 67 65 74 32 62 79 74 65 41 6c 69 67  f = get2byteAlig
383a0 6e 65 64 28 26 70 50 67 2d 3e 61 43 65 6c 6c 49  ned(&pPg->aCellI
383b0 64 78 5b 69 2a 32 5d 29 3b 0a 20 20 20 20 69 66  dx[i*2]);.    if
383c0 28 20 70 43 65 6c 6c 3e 3d 61 44 61 74 61 20 26  ( pCell>=aData &
383d0 26 20 70 43 65 6c 6c 3c 26 61 44 61 74 61 5b 70  & pCell<&aData[p
383e0 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  Pg->pBt->usableS
383f0 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20 70 43  ize] ){.      pC
38400 65 6c 6c 20 3d 20 26 70 54 6d 70 5b 70 43 65 6c  ell = &pTmp[pCel
38410 6c 20 2d 20 61 44 61 74 61 5d 3b 0a 20 20 20 20  l - aData];.    
38420 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 3d  }.    assert( 0=
38430 3d 6d 65 6d 63 6d 70 28 70 43 65 6c 6c 2c 20 26  =memcmp(pCel