/ Hex Artifact Content
Login

Artifact cefa8e087e73b2892845b2af2dc980fafd1ac13a:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 23 69 66 20 64 65   enable){.#if de
0b30: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0b40: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
0b50: 49 54 45 5f 54 45 53 54 29 20 26 26 20 21 64 65  ITE_TEST) && !de
0b60: 66 69 6e 65 64 28 54 48 33 5f 43 4f 4d 50 41 54  fined(TH3_COMPAT
0b70: 49 42 49 4c 49 54 59 29 0a 20 20 2f 2a 20 45 6e  IBILITY).  /* En
0b80: 61 62 6c 65 20 67 6c 6f 62 61 6c 20 73 68 61 72  able global shar
0b90: 65 64 20 63 61 63 68 65 20 66 75 6e 63 74 69 6f  ed cache functio
0ba0: 6e 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20  n for debugging 
0bb0: 61 6e 64 20 75 6e 69 74 20 74 65 73 74 73 2c 20  and unit tests, 
0bc0: 0a 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20 66 6f  .  ** but not fo
0bd0: 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 72  r release */.  r
0be0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
0bf0: 55 53 45 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c  USE;.#else.  sql
0c00: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
0c10: 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62  .sharedCacheEnab
0c20: 6c 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20  led = enable;.  
0c30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
0c40: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 23 65 6e 64 69  ;.#endif.}.#endi
0c50: 66 0a 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  f....#ifdef SQLI
0c60: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0c70: 41 43 48 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54  ACHE.  /*.  ** T
0c80: 68 65 20 66 75 6e 63 74 69 6f 6e 73 20 71 75 65  he functions que
0c90: 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62  rySharedCacheTab
0ca0: 6c 65 4c 6f 63 6b 28 29 2c 20 73 65 74 53 68 61  leLock(), setSha
0cb0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0cc0: 6b 28 29 2c 0a 20 20 2a 2a 20 61 6e 64 20 63 6c  k(),.  ** and cl
0cd0: 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
0ce0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 29 0a 20 20  eTableLocks().  
0cf0: 2a 2a 20 6d 61 6e 69 70 75 6c 61 74 65 20 65 6e  ** manipulate en
0d00: 74 72 69 65 73 20 69 6e 20 74 68 65 20 42 74 53  tries in the BtS
0d10: 68 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e 6b  hared.pLock link
0d20: 65 64 20 6c 69 73 74 20 75 73 65 64 20 74 6f 20  ed list used to 
0d30: 73 74 6f 72 65 0a 20 20 2a 2a 20 73 68 61 72 65  store.  ** share
0d40: 64 2d 63 61 63 68 65 20 74 61 62 6c 65 20 6c 65  d-cache table le
0d50: 76 65 6c 20 6c 6f 63 6b 73 2e 20 49 66 20 74 68  vel locks. If th
0d60: 65 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d  e library is com
0d70: 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 0a 20  piled with the. 
0d80: 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65   ** shared-cache
0d90: 20 66 65 61 74 75 72 65 20 64 69 73 61 62 6c 65   feature disable
0da0: 64 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  d, then there is
0db0: 20 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20 75   only ever one u
0dc0: 73 65 72 0a 20 20 2a 2a 20 6f 66 20 65 61 63 68  ser.  ** of each
0dd0: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
0de0: 75 72 65 20 61 6e 64 20 73 6f 20 74 68 69 73 20  ure and so this 
0df0: 6c 6f 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20 6e  locking is not n
0e00: 65 63 65 73 73 61 72 79 2e 20 0a 20 20 2a 2a 20  ecessary. .  ** 
0e10: 53 6f 20 64 65 66 69 6e 65 20 74 68 65 20 6c 6f  So define the lo
0e20: 63 6b 20 72 65 6c 61 74 65 64 20 66 75 6e 63 74  ck related funct
0e30: 69 6f 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e 0a  ions as no-ops..
0e40: 20 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 71    */.  #define q
0e50: 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
0e60: 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29 20  ableLock(a,b,c) 
0e70: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66  SQLITE_OK.  #def
0e80: 69 6e 65 20 73 65 74 53 68 61 72 65 64 43 61 63  ine setSharedCac
0e90: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c  heTableLock(a,b,
0ea0: 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23  c) SQLITE_OK.  #
0eb0: 64 65 66 69 6e 65 20 63 6c 65 61 72 41 6c 6c 53  define clearAllS
0ec0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0ed0: 6f 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e  ocks(a).  #defin
0ee0: 65 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68  e downgradeAllSh
0ef0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0f00: 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e 65  cks(a).  #define
0f10: 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
0f20: 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 2c 64  ableLock(a,b,c,d
0f30: 29 20 31 0a 20 20 23 64 65 66 69 6e 65 20 68 61  ) 1.  #define ha
0f40: 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 61  sReadConflicts(a
0f50: 2c 20 62 29 20 30 0a 23 65 6e 64 69 66 0a 0a 23  , b) 0.#endif..#
0f60: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0f70: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
0f80: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
0f90: 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69  EBUG./*.**** Thi
0fa0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
0fb0: 6c 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20  ly used as part 
0fc0: 6f 66 20 61 6e 20 61 73 73 65 72 74 28 29 20 73  of an assert() s
0fd0: 74 61 74 65 6d 65 6e 74 2e 20 2a 2a 2a 0a 2a 2a  tatement. ***.**
0fe0: 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
0ff0: 20 69 66 20 70 42 74 72 65 65 20 68 6f 6c 64 73   if pBtree holds
1000: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f   the required lo
1010: 63 6b 73 20 74 6f 20 72 65 61 64 20 6f 72 20 77  cks to read or w
1020: 72 69 74 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20  rite to the .** 
1030: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 20  table with root 
1040: 70 61 67 65 20 69 52 6f 6f 74 2e 20 20 20 52 65  page iRoot.   Re
1050: 74 75 72 6e 20 31 20 69 66 20 69 74 20 64 6f 65  turn 1 if it doe
1060: 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a  s and 0 if not..
1070: 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
1080: 65 2c 20 77 68 65 6e 20 77 72 69 74 69 6e 67 20  e, when writing 
1090: 74 6f 20 61 20 74 61 62 6c 65 20 77 69 74 68 20  to a table with 
10a0: 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 20  root-page iRoot 
10b0: 76 69 61 20 0a 2a 2a 20 42 74 72 65 65 20 63 6f  via .** Btree co
10c0: 6e 6e 65 63 74 69 6f 6e 20 70 42 74 72 65 65 3a  nnection pBtree:
10d0: 0a 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74  .**.**    assert
10e0: 28 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65  ( hasSharedCache
10f0: 54 61 62 6c 65 4c 6f 63 6b 28 70 42 74 72 65 65  TableLock(pBtree
1100: 2c 20 69 52 6f 6f 74 2c 20 30 2c 20 57 52 49 54  , iRoot, 0, WRIT
1110: 45 5f 4c 4f 43 4b 29 20 29 3b 0a 2a 2a 0a 2a 2a  E_LOCK) );.**.**
1120: 20 57 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f   When writing to
1130: 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 72   an index that r
1140: 65 73 69 64 65 73 20 69 6e 20 61 20 73 68 61 72  esides in a shar
1150: 61 62 6c 65 20 64 61 74 61 62 61 73 65 2c 20 74  able database, t
1160: 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68  he .** caller sh
1170: 6f 75 6c 64 20 68 61 76 65 20 66 69 72 73 74 20  ould have first 
1180: 6f 62 74 61 69 6e 65 64 20 61 20 6c 6f 63 6b 20  obtained a lock 
1190: 73 70 65 63 69 66 79 69 6e 67 20 74 68 65 20 72  specifying the r
11a0: 6f 6f 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74  oot page of.** t
11b0: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
11c0: 20 74 61 62 6c 65 2e 20 54 68 69 73 20 6d 61 6b   table. This mak
11d0: 65 73 20 74 68 69 6e 67 73 20 61 20 62 69 74 20  es things a bit 
11e0: 6d 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64  more complicated
11f0: 2c 0a 2a 2a 20 61 73 20 74 68 69 73 20 6d 6f 64  ,.** as this mod
1200: 75 6c 65 20 74 72 65 61 74 73 20 65 61 63 68 20  ule treats each 
1210: 74 61 62 6c 65 20 61 73 20 61 20 73 65 70 61 72  table as a separ
1220: 61 74 65 20 73 74 72 75 63 74 75 72 65 2e 20 54  ate structure. T
1230: 6f 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 74  o determine.** t
1240: 68 65 20 74 61 62 6c 65 20 63 6f 72 72 65 73 70  he table corresp
1250: 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 69 6e  onding to the in
1260: 64 65 78 20 62 65 69 6e 67 20 77 72 69 74 74 65  dex being writte
1270: 6e 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  n, this.** funct
1280: 69 6f 6e 20 68 61 73 20 74 6f 20 73 65 61 72 63  ion has to searc
1290: 68 20 74 68 72 6f 75 67 68 20 74 68 65 20 64 61  h through the da
12a0: 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a  tabase schema..*
12b0: 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20  *.** Instead of 
12c0: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61  a lock on the ta
12d0: 62 6c 65 2f 69 6e 64 65 78 20 72 6f 6f 74 65 64  ble/index rooted
12e0: 20 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20   at page iRoot, 
12f0: 74 68 65 20 63 61 6c 6c 65 72 20 6d 61 79 0a 2a  the caller may.*
1300: 2a 20 68 6f 6c 64 20 61 20 77 72 69 74 65 2d 6c  * hold a write-l
1310: 6f 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d  ock on the schem
1320: 61 20 74 61 62 6c 65 20 28 72 6f 6f 74 20 70 61  a table (root pa
1330: 67 65 20 31 29 2e 20 54 68 69 73 20 69 73 20 61  ge 1). This is a
1340: 6c 73 6f 0a 2a 2a 20 61 63 63 65 70 74 61 62 6c  lso.** acceptabl
1350: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1360: 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
1370: 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 42 74 72 65  ableLock(.  Btre
1380: 65 20 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20  e *pBtree,      
1390: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 68 61     /* Handle tha
13a0: 74 20 6d 75 73 74 20 68 6f 6c 64 20 6c 6f 63 6b  t must hold lock
13b0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74   */.  Pgno iRoot
13c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
13d0: 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 62 2d 74  Root page of b-t
13e0: 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49  ree */.  int isI
13f0: 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20  ndex,           
1400: 2f 2a 20 54 72 75 65 20 69 66 20 69 52 6f 6f 74  /* True if iRoot
1410: 20 69 73 20 74 68 65 20 72 6f 6f 74 20 6f 66 20   is the root of 
1420: 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20  an index b-tree 
1430: 2a 2f 0a 20 20 69 6e 74 20 65 4c 6f 63 6b 54 79  */.  int eLockTy
1440: 70 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  pe          /* R
1450: 65 71 75 69 72 65 64 20 6c 6f 63 6b 20 74 79 70  equired lock typ
1460: 65 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20  e (READ_LOCK or 
1470: 57 52 49 54 45 5f 4c 4f 43 4b 29 20 2a 2f 0a 29  WRITE_LOCK) */.)
1480: 7b 0a 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68  {.  Schema *pSch
1490: 65 6d 61 20 3d 20 28 53 63 68 65 6d 61 20 2a 29  ema = (Schema *)
14a0: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 53 63  pBtree->pBt->pSc
14b0: 68 65 6d 61 3b 0a 20 20 50 67 6e 6f 20 69 54 61  hema;.  Pgno iTa
14c0: 62 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20  b = 0;.  BtLock 
14d0: 2a 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66  *pLock;..  /* If
14e0: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69   this database i
14f0: 73 20 6e 6f 74 20 73 68 61 72 65 61 62 6c 65 2c  s not shareable,
1500: 20 6f 72 20 69 66 20 74 68 65 20 63 6c 69 65 6e   or if the clien
1510: 74 20 69 73 20 72 65 61 64 69 6e 67 0a 20 20 2a  t is reading.  *
1520: 2a 20 61 6e 64 20 68 61 73 20 74 68 65 20 72 65  * and has the re
1530: 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66  ad-uncommitted f
1540: 6c 61 67 20 73 65 74 2c 20 74 68 65 6e 20 6e 6f  lag set, then no
1550: 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 69 72 65   lock is require
1560: 64 2e 20 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20  d. .  ** Return 
1570: 74 72 75 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  true immediately
1580: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 42  ..  */.  if( (pB
1590: 74 72 65 65 2d 3e 73 68 61 72 61 62 6c 65 3d 3d  tree->sharable==
15a0: 30 29 0a 20 20 20 7c 7c 20 28 65 4c 6f 63 6b 54  0).   || (eLockT
15b0: 79 70 65 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 26  ype==READ_LOCK &
15c0: 26 20 28 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66  & (pBtree->db->f
15d0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
15e0: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 29 0a  adUncommitted)).
15f0: 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
1600: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  1;.  }..  /* If 
1610: 74 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65  the client is re
1620: 61 64 69 6e 67 20 20 6f 72 20 77 72 69 74 69 6e  ading  or writin
1630: 67 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 74  g an index and t
1640: 68 65 20 73 63 68 65 6d 61 20 69 73 0a 20 20 2a  he schema is.  *
1650: 2a 20 6e 6f 74 20 6c 6f 61 64 65 64 2c 20 74 68  * not loaded, th
1660: 65 6e 20 69 74 20 69 73 20 74 6f 6f 20 64 69 66  en it is too dif
1670: 66 69 63 75 6c 74 20 74 6f 20 61 63 74 75 61 6c  ficult to actual
1680: 6c 79 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  ly check to see 
1690: 69 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 72 72  if.  ** the corr
16a0: 65 63 74 20 6c 6f 63 6b 73 20 61 72 65 20 68 65  ect locks are he
16b0: 6c 64 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 62  ld.  So do not b
16c0: 6f 74 68 65 72 20 2d 20 6a 75 73 74 20 72 65 74  other - just ret
16d0: 75 72 6e 20 74 72 75 65 2e 0a 20 20 2a 2a 20 54  urn true..  ** T
16e0: 68 69 73 20 63 61 73 65 20 64 6f 65 73 20 6e 6f  his case does no
16f0: 74 20 63 6f 6d 65 20 75 70 20 76 65 72 79 20 6f  t come up very o
1700: 66 74 65 6e 20 61 6e 79 68 6f 77 2e 0a 20 20 2a  ften anyhow..  *
1710: 2f 0a 20 20 69 66 28 20 69 73 49 6e 64 65 78 20  /.  if( isIndex 
1720: 26 26 20 28 21 70 53 63 68 65 6d 61 20 7c 7c 20  && (!pSchema || 
1730: 28 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61  (pSchema->schema
1740: 46 6c 61 67 73 26 44 42 5f 53 63 68 65 6d 61 4c  Flags&DB_SchemaL
1750: 6f 61 64 65 64 29 3d 3d 30 29 20 29 7b 0a 20 20  oaded)==0) ){.  
1760: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
1770: 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
1780: 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 74   the root-page t
1790: 68 61 74 20 74 68 65 20 6c 6f 63 6b 20 73 68 6f  hat the lock sho
17a0: 75 6c 64 20 62 65 20 68 65 6c 64 20 6f 6e 2e 20  uld be held on. 
17b0: 46 6f 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 62  For table.  ** b
17c0: 2d 74 72 65 65 73 2c 20 74 68 69 73 20 69 73 20  -trees, this is 
17d0: 6a 75 73 74 20 74 68 65 20 72 6f 6f 74 20 70 61  just the root pa
17e0: 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65  ge of the b-tree
17f0: 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 0a 20   being read or. 
1800: 20 2a 2a 20 77 72 69 74 74 65 6e 2e 20 46 6f 72   ** written. For
1810: 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73 2c 20   index b-trees, 
1820: 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70  it is the root p
1830: 61 67 65 20 6f 66 20 74 68 65 20 61 73 73 6f 63  age of the assoc
1840: 69 61 74 65 64 0a 20 20 2a 2a 20 74 61 62 6c 65  iated.  ** table
1850: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 49 6e  .  */.  if( isIn
1860: 64 65 78 20 29 7b 0a 20 20 20 20 48 61 73 68 45  dex ){.    HashE
1870: 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  lem *p;.    for(
1880: 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  p=sqliteHashFirs
1890: 74 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  t(&pSchema->idxH
18a0: 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69 74  ash); p; p=sqlit
18b0: 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a 20  eHashNext(p)){. 
18c0: 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78       Index *pIdx
18d0: 20 3d 20 28 49 6e 64 65 78 20 2a 29 73 71 6c 69   = (Index *)sqli
18e0: 74 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a 20  teHashData(p);. 
18f0: 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 74       if( pIdx->t
1900: 6e 75 6d 3d 3d 28 69 6e 74 29 69 52 6f 6f 74 20  num==(int)iRoot 
1910: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
1920: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Tab ){.         
1930: 20 2f 2a 20 54 77 6f 20 6f 72 20 6d 6f 72 65 20   /* Two or more 
1940: 69 6e 64 65 78 65 73 20 73 68 61 72 65 20 74 68  indexes share th
1950: 65 20 73 61 6d 65 20 72 6f 6f 74 20 70 61 67 65  e same root page
1960: 2e 20 20 54 68 65 72 65 20 6d 75 73 74 0a 20 20  .  There must.  
1970: 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20 69 6d          ** be im
1980: 70 6f 73 74 65 72 20 74 61 62 6c 65 73 2e 20 20  poster tables.  
1990: 53 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74  So just return t
19a0: 72 75 65 2e 20 20 54 68 65 20 61 73 73 65 72 74  rue.  The assert
19b0: 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20   is not.        
19c0: 20 20 2a 2a 20 75 73 65 66 75 6c 20 69 6e 20 74    ** useful in t
19d0: 68 61 74 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20  hat case. */.   
19e0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
19f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1a00: 20 20 20 69 54 61 62 20 3d 20 70 49 64 78 2d 3e     iTab = pIdx->
1a10: 70 54 61 62 6c 65 2d 3e 74 6e 75 6d 3b 0a 20 20  pTable->tnum;.  
1a20: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
1a30: 6c 73 65 7b 0a 20 20 20 20 69 54 61 62 20 3d 20  lse{.    iTab = 
1a40: 69 52 6f 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  iRoot;.  }..  /*
1a50: 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20   Search for the 
1a60: 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20 45  required lock. E
1a70: 69 74 68 65 72 20 61 20 77 72 69 74 65 2d 6c 6f  ither a write-lo
1a80: 63 6b 20 6f 6e 20 72 6f 6f 74 2d 70 61 67 65 20  ck on root-page 
1a90: 69 54 61 62 2c 20 61 20 0a 20 20 2a 2a 20 77 72  iTab, a .  ** wr
1aa0: 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite-lock on the 
1ab0: 73 63 68 65 6d 61 20 74 61 62 6c 65 2c 20 6f 72  schema table, or
1ac0: 20 28 69 66 20 74 68 65 20 63 6c 69 65 6e 74 20   (if the client 
1ad0: 69 73 20 72 65 61 64 69 6e 67 29 20 61 0a 20 20  is reading) a.  
1ae0: 2a 2a 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20  ** read-lock on 
1af0: 69 54 61 62 20 77 69 6c 6c 20 73 75 66 66 69 63  iTab will suffic
1b00: 65 2e 20 52 65 74 75 72 6e 20 31 20 69 66 20 61  e. Return 1 if a
1b10: 6e 79 20 6f 66 20 74 68 65 73 65 20 61 72 65 20  ny of these are 
1b20: 66 6f 75 6e 64 2e 20 20 2a 2f 0a 20 20 66 6f 72  found.  */.  for
1b30: 28 70 4c 6f 63 6b 3d 70 42 74 72 65 65 2d 3e 70  (pLock=pBtree->p
1b40: 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  Bt->pLock; pLock
1b50: 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70  ; pLock=pLock->p
1b60: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
1b70: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 42  Lock->pBtree==pB
1b80: 74 72 65 65 20 0a 20 20 20 20 20 26 26 20 28 70  tree .     && (p
1b90: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Lock->iTable==iT
1ba0: 61 62 20 7c 7c 20 28 70 4c 6f 63 6b 2d 3e 65 4c  ab || (pLock->eL
1bb0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
1bc0: 26 26 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65  && pLock->iTable
1bd0: 3d 3d 31 29 29 0a 20 20 20 20 20 26 26 20 70 4c  ==1)).     && pL
1be0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f 63  ock->eLock>=eLoc
1bf0: 6b 54 79 70 65 20 0a 20 20 20 20 29 7b 0a 20 20  kType .    ){.  
1c00: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1c10: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 61    }.  }..  /* Fa
1c20: 69 6c 65 64 20 74 6f 20 66 69 6e 64 20 74 68 65  iled to find the
1c30: 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20   required lock. 
1c40: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  */.  return 0;.}
1c50: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1c60: 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64  E_DEBUG */..#ifd
1c70: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1c80: 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e  /*.**** This fun
1c90: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 75 73 65  ction may be use
1ca0: 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73  d as part of ass
1cb0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
1cc0: 20 6f 6e 6c 79 2e 20 2a 2a 2a 2a 0a 2a 2a 0a 2a   only. ****.**.*
1cd0: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
1ce0: 20 69 74 20 77 6f 75 6c 64 20 62 65 20 69 6c 6c   it would be ill
1cf0: 65 67 61 6c 20 66 6f 72 20 70 42 74 72 65 65 20  egal for pBtree 
1d00: 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 74 68  to write into th
1d10: 65 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20 69 6e  e.** table or in
1d20: 64 65 78 20 72 6f 6f 74 65 64 20 61 74 20 69 52  dex rooted at iR
1d30: 6f 6f 74 20 62 65 63 61 75 73 65 20 6f 74 68 65  oot because othe
1d40: 72 20 73 68 61 72 65 64 20 63 6f 6e 6e 65 63 74  r shared connect
1d50: 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 73 69 6d 75  ions are.** simu
1d60: 6c 74 61 6e 65 6f 75 73 6c 79 20 72 65 61 64 69  ltaneously readi
1d70: 6e 67 20 74 68 61 74 20 73 61 6d 65 20 74 61 62  ng that same tab
1d80: 6c 65 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a 0a  le or index..**.
1d90: 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c  ** It is illegal
1da0: 20 66 6f 72 20 70 42 74 72 65 65 20 74 6f 20 77   for pBtree to w
1db0: 72 69 74 65 20 69 66 20 73 6f 6d 65 20 6f 74 68  rite if some oth
1dc0: 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  er Btree object 
1dd0: 74 68 61 74 0a 2a 2a 20 73 68 61 72 65 73 20 74  that.** shares t
1de0: 68 65 20 73 61 6d 65 20 42 74 53 68 61 72 65 64  he same BtShared
1df0: 20 6f 62 6a 65 63 74 20 69 73 20 63 75 72 72 65   object is curre
1e00: 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72 20  ntly reading or 
1e10: 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 69  writing.** the i
1e20: 52 6f 6f 74 20 74 61 62 6c 65 2e 20 20 45 78 63  Root table.  Exc
1e30: 65 70 74 2c 20 69 66 20 74 68 65 20 6f 74 68 65  ept, if the othe
1e40: 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 68  r Btree object h
1e50: 61 73 20 74 68 65 0a 2a 2a 20 72 65 61 64 2d 75  as the.** read-u
1e60: 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20  ncommitted flag 
1e70: 73 65 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20  set, then it is 
1e80: 4f 4b 20 66 6f 72 20 74 68 65 20 6f 74 68 65 72  OK for the other
1e90: 20 6f 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 68 61   object to.** ha
1ea0: 76 65 20 61 20 72 65 61 64 20 63 75 72 73 6f 72  ve a read cursor
1eb0: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
1ec0: 70 6c 65 2c 20 62 65 66 6f 72 65 20 77 72 69 74  ple, before writ
1ed0: 69 6e 67 20 74 6f 20 61 6e 79 20 70 61 72 74 20  ing to any part 
1ee0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  of the table or 
1ef0: 69 6e 64 65 78 0a 2a 2a 20 72 6f 6f 74 65 64 20  index.** rooted 
1f00: 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 6f  at page iRoot, o
1f10: 6e 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c 3a 0a  ne should call:.
1f20: 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28  **.**    assert(
1f30: 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63   !hasReadConflic
1f40: 74 73 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74  ts(pBtree, iRoot
1f50: 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ) );.*/.static i
1f60: 6e 74 20 68 61 73 52 65 61 64 43 6f 6e 66 6c 69  nt hasReadConfli
1f70: 63 74 73 28 42 74 72 65 65 20 2a 70 42 74 72 65  cts(Btree *pBtre
1f80: 65 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 29 7b 0a  e, Pgno iRoot){.
1f90: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
1fa0: 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70   for(p=pBtree->p
1fb0: 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
1fc0: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
1fd0: 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74   if( p->pgnoRoot
1fe0: 3d 3d 69 52 6f 6f 74 20 0a 20 20 20 20 20 26 26  ==iRoot .     &&
1ff0: 20 70 2d 3e 70 42 74 72 65 65 21 3d 70 42 74 72   p->pBtree!=pBtr
2000: 65 65 0a 20 20 20 20 20 26 26 20 30 3d 3d 28 70  ee.     && 0==(p
2010: 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c  ->pBtree->db->fl
2020: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61  ags & SQLITE_Rea
2030: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 0a 20 20  dUncommitted).  
2040: 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72    ){.      retur
2050: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
2060: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
2070: 64 69 66 20 20 20 20 2f 2a 20 23 69 66 64 65 66  dif    /* #ifdef
2080: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
2090: 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 6f  ../*.** Query to
20a0: 20 73 65 65 20 69 66 20 42 74 72 65 65 20 68 61   see if Btree ha
20b0: 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61 69  ndle p may obtai
20c0: 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65  n a lock of type
20d0: 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41 44   eLock .** (READ
20e0: 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c  _LOCK or WRITE_L
20f0: 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62 6c  OCK) on the tabl
2100: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
2110: 20 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a 2a   iTab. Return.**
2120: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68   SQLITE_OK if th
2130: 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f 62  e lock may be ob
2140: 74 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c 69  tained (by calli
2150: 6e 67 0a 2a 2a 20 73 65 74 53 68 61 72 65 64 43  ng.** setSharedC
2160: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 29  acheTableLock())
2170: 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  , or SQLITE_LOCK
2180: 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74  ED if not..*/.st
2190: 61 74 69 63 20 69 6e 74 20 71 75 65 72 79 53 68  atic int querySh
21a0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
21b0: 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e  ck(Btree *p, Pgn
21c0: 6f 20 69 54 61 62 2c 20 75 38 20 65 4c 6f 63 6b  o iTab, u8 eLock
21d0: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
21e0: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
21f0: 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20  tLock *pIter;.. 
2200: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2210: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
2220: 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
2230: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2240: 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45   || eLock==WRITE
2250: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
2260: 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 20  t( p->db!=0 );. 
2270: 20 61 73 73 65 72 74 28 20 21 28 70 2d 3e 64 62   assert( !(p->db
2280: 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52  ->flags&SQLITE_R
2290: 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 7c  eadUncommitted)|
22a0: 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f  |eLock==WRITE_LO
22b0: 43 4b 7c 7c 69 54 61 62 3d 3d 31 20 29 3b 0a 20  CK||iTab==1 );. 
22c0: 20 0a 20 20 2f 2a 20 49 66 20 72 65 71 75 65 73   .  /* If reques
22d0: 74 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63  ting a write-loc
22e0: 6b 2c 20 74 68 65 6e 20 74 68 65 20 42 74 72 65  k, then the Btre
22f0: 65 20 6d 75 73 74 20 68 61 76 65 20 61 6e 20 6f  e must have an o
2300: 70 65 6e 20 77 72 69 74 65 0a 20 20 2a 2a 20 74  pen write.  ** t
2310: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
2320: 69 73 20 66 69 6c 65 2e 20 41 6e 64 2c 20 6f 62  is file. And, ob
2330: 76 69 6f 75 73 6c 79 2c 20 66 6f 72 20 74 68 69  viously, for thi
2340: 73 20 74 6f 20 62 65 20 73 6f 20 74 68 65 72 65  s to be so there
2350: 20 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 61   .  ** must be a
2360: 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
2370: 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  nsaction on the 
2380: 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a  file itself..  *
2390: 2f 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63  /.  assert( eLoc
23a0: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
23b0: 28 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72  (p==pBt->pWriter
23c0: 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d   && p->inTrans==
23d0: 54 52 41 4e 53 5f 57 52 49 54 45 29 20 29 3b 0a  TRANS_WRITE) );.
23e0: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
23f0: 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 42  =READ_LOCK || pB
2400: 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
2410: 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
2420: 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f  .  .  /* This ro
2430: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
2440: 20 69 66 20 74 68 65 20 73 68 61 72 65 64 2d 63   if the shared-c
2450: 61 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61 62  ache is not enab
2460: 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 21 70 2d  led */.  if( !p-
2470: 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
2480: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2490: 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  K;.  }..  /* If 
24a0: 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65  some other conne
24b0: 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67  ction is holding
24c0: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
24d0: 63 6b 2c 20 74 68 65 0a 20 20 2a 2a 20 72 65 71  ck, the.  ** req
24e0: 75 65 73 74 65 64 20 6c 6f 63 6b 20 6d 61 79 20  uested lock may 
24f0: 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e  not be obtained.
2500: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
2510: 3e 70 57 72 69 74 65 72 21 3d 70 20 26 26 20 28  >pWriter!=p && (
2520: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
2530: 42 54 53 5f 45 58 43 4c 55 53 49 56 45 29 21 3d  BTS_EXCLUSIVE)!=
2540: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
2550: 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
2560: 64 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e 70 57  d(p->db, pBt->pW
2570: 72 69 74 65 72 2d 3e 64 62 29 3b 0a 20 20 20 20  riter->db);.    
2580: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
2590: 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
25a0: 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 70 49 74  ;.  }..  for(pIt
25b0: 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70  er=pBt->pLock; p
25c0: 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65  Iter; pIter=pIte
25d0: 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f  r->pNext){.    /
25e0: 2a 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  * The condition 
25f0: 28 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65  (pIter->eLock!=e
2600: 4c 6f 63 6b 29 20 69 6e 20 74 68 65 20 66 6f 6c  Lock) in the fol
2610: 6c 6f 77 69 6e 67 20 69 66 28 2e 2e 2e 29 20 0a  lowing if(...) .
2620: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
2630: 20 69 73 20 61 20 73 69 6d 70 6c 69 66 69 63 61   is a simplifica
2640: 74 69 6f 6e 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a  tion of:.    **.
2650: 20 20 20 20 2a 2a 20 20 20 28 65 4c 6f 63 6b 3d      **   (eLock=
2660: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 20 70  =WRITE_LOCK || p
2670: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Iter->eLock==WRI
2680: 54 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 2a 2a 0a  TE_LOCK).    **.
2690: 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20      ** since we 
26a0: 6b 6e 6f 77 20 74 68 61 74 20 69 66 20 65 4c 6f  know that if eLo
26b0: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 2c 20  ck==WRITE_LOCK, 
26c0: 74 68 65 6e 20 6e 6f 20 6f 74 68 65 72 20 63 6f  then no other co
26d0: 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  nnection.    ** 
26e0: 6d 61 79 20 68 6f 6c 64 20 61 20 57 52 49 54 45  may hold a WRITE
26f0: 5f 4c 4f 43 4b 20 6f 6e 20 61 6e 79 20 74 61 62  _LOCK on any tab
2700: 6c 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20  le in this file 
2710: 28 73 69 6e 63 65 20 74 68 65 72 65 20 63 61 6e  (since there can
2720: 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 62 65 20  .    ** only be 
2730: 61 20 73 69 6e 67 6c 65 20 77 72 69 74 65 72 29  a single writer)
2740: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
2750: 65 72 74 28 20 70 49 74 65 72 2d 3e 65 4c 6f 63  ert( pIter->eLoc
2760: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
2770: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52  pIter->eLock==WR
2780: 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  ITE_LOCK );.    
2790: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
27a0: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65  EAD_LOCK || pIte
27b0: 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 7c 7c 20  r->pBtree==p || 
27c0: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45  pIter->eLock==RE
27d0: 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  AD_LOCK);.    if
27e0: 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21  ( pIter->pBtree!
27f0: 3d 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54 61  =p && pIter->iTa
2800: 62 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 49 74  ble==iTab && pIt
2810: 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b  er->eLock!=eLock
2820: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2830: 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b  3ConnectionBlock
2840: 65 64 28 70 2d 3e 64 62 2c 20 70 49 74 65 72 2d  ed(p->db, pIter-
2850: 3e 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a 20 20  >pBtree->db);.  
2860: 20 20 20 20 69 66 28 20 65 4c 6f 63 6b 3d 3d 57      if( eLock==W
2870: 52 49 54 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  RITE_LOCK ){.   
2880: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d       assert( p==
2890: 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a  pBt->pWriter );.
28a0: 20 20 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73          pBt->bts
28b0: 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 45 4e  Flags |= BTS_PEN
28c0: 44 49 4e 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20  DING;.      }.  
28d0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
28e0: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
28f0: 41 43 48 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ACHE;.    }.  }.
2900: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2910: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
2920: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  !SQLITE_OMIT_SHA
2930: 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69  RED_CACHE */..#i
2940: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2950: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
2960: 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20  *.** Add a lock 
2970: 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  on the table wit
2980: 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62  h root-page iTab
2990: 6c 65 20 74 6f 20 74 68 65 20 73 68 61 72 65 64  le to the shared
29a0: 2d 62 74 72 65 65 20 75 73 65 64 0a 2a 2a 20 62  -btree used.** b
29b0: 79 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70  y Btree handle p
29c0: 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4c 6f 63  . Parameter eLoc
29d0: 6b 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  k must be either
29e0: 20 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a   READ_LOCK or .*
29f0: 2a 20 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a  * WRITE_LOCK..**
2a00: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2a10: 6e 20 61 73 73 75 6d 65 73 20 74 68 65 20 66 6f  n assumes the fo
2a20: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
2a30: 20 28 61 29 20 54 68 65 20 73 70 65 63 69 66 69   (a) The specifi
2a40: 65 64 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  ed Btree object 
2a50: 70 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74  p is connected t
2a60: 6f 20 61 20 73 68 61 72 61 62 6c 65 0a 2a 2a 20  o a sharable.** 
2a70: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28        database (
2a80: 6f 6e 65 20 77 69 74 68 20 74 68 65 20 42 74 53  one with the BtS
2a90: 68 61 72 65 64 2e 73 68 61 72 61 62 6c 65 20 66  hared.sharable f
2aa0: 6c 61 67 20 73 65 74 29 2c 20 61 6e 64 0a 2a 2a  lag set), and.**
2ab0: 0a 2a 2a 20 20 20 28 62 29 20 4e 6f 20 6f 74 68  .**   (b) No oth
2ac0: 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 73  er Btree objects
2ad0: 20 68 6f 6c 64 20 61 20 6c 6f 63 6b 20 74 68 61   hold a lock tha
2ae0: 74 20 63 6f 6e 66 6c 69 63 74 73 0a 2a 2a 20 20  t conflicts.**  
2af0: 20 20 20 20 20 77 69 74 68 20 74 68 65 20 72 65       with the re
2b00: 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 28 69 2e  quested lock (i.
2b10: 65 2e 20 71 75 65 72 79 53 68 61 72 65 64 43 61  e. querySharedCa
2b20: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20 68  cheTableLock() h
2b30: 61 73 0a 2a 2a 20 20 20 20 20 20 20 61 6c 72 65  as.**       alre
2b40: 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  ady been called 
2b50: 61 6e 64 20 72 65 74 75 72 6e 65 64 20 53 51 4c  and returned SQL
2b60: 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 53  ITE_OK)..**.** S
2b70: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2b80: 72 6e 65 64 20 69 66 20 74 68 65 20 6c 6f 63 6b  rned if the lock
2b90: 20 69 73 20 61 64 64 65 64 20 73 75 63 63 65 73   is added succes
2ba0: 73 66 75 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 4e  sfully. SQLITE_N
2bb0: 4f 4d 45 4d 20 0a 2a 2a 20 69 73 20 72 65 74 75  OMEM .** is retu
2bc0: 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63  rned if a malloc
2bd0: 20 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2e 0a   attempt fails..
2be0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
2bf0: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2c00: 65 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20  eLock(Btree *p, 
2c10: 50 67 6e 6f 20 69 54 61 62 6c 65 2c 20 75 38 20  Pgno iTable, u8 
2c20: 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61 72  eLock){.  BtShar
2c30: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
2c40: 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63  ;.  BtLock *pLoc
2c50: 6b 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20  k = 0;.  BtLock 
2c60: 2a 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72  *pIter;..  asser
2c70: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
2c80: 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
2c90: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
2ca0: 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  =READ_LOCK || eL
2cb0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
2cc0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
2cd0: 64 62 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41  db!=0 );..  /* A
2ce0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
2cf0: 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d   the read-uncomm
2d00: 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 20 77  itted flag set w
2d10: 69 6c 6c 20 6e 65 76 65 72 20 74 72 79 20 74 6f  ill never try to
2d20: 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 20 61 20 72  .  ** obtain a r
2d30: 65 61 64 2d 6c 6f 63 6b 20 75 73 69 6e 67 20 74  ead-lock using t
2d40: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68  his function. Th
2d50: 65 20 6f 6e 6c 79 20 72 65 61 64 2d 6c 6f 63 6b  e only read-lock
2d60: 20 6f 62 74 61 69 6e 65 64 0a 20 20 2a 2a 20 62   obtained.  ** b
2d70: 79 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  y a connection i
2d80: 6e 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  n read-uncommitt
2d90: 65 64 20 6d 6f 64 65 20 69 73 20 6f 6e 20 74 68  ed mode is on th
2da0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
2db0: 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 61 6e 64  .  ** table, and
2dc0: 20 74 68 61 74 20 6c 6f 63 6b 20 69 73 20 6f 62   that lock is ob
2dd0: 74 61 69 6e 65 64 20 69 6e 20 42 74 72 65 65 42  tained in BtreeB
2de0: 65 67 69 6e 54 72 61 6e 73 28 29 2e 20 20 2a 2f  eginTrans().  */
2df0: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 28 70  .  assert( 0==(p
2e00: 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  ->db->flags&SQLI
2e10: 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  TE_ReadUncommitt
2e20: 65 64 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52  ed) || eLock==WR
2e30: 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f  ITE_LOCK );..  /
2e40: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2e50: 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63  should only be c
2e60: 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72 61  alled on a shara
2e70: 62 6c 65 20 62 2d 74 72 65 65 20 61 66 74 65 72  ble b-tree after
2e80: 20 69 74 20 0a 20 20 2a 2a 20 68 61 73 20 62 65   it .  ** has be
2e90: 65 6e 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68  en determined th
2ea0: 61 74 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74 72  at no other b-tr
2eb0: 65 65 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66 6c  ee holds a confl
2ec0: 69 63 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a 2f  icting lock.  */
2ed0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 68  .  assert( p->sh
2ee0: 61 72 61 62 6c 65 20 29 3b 0a 20 20 61 73 73 65  arable );.  asse
2ef0: 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71  rt( SQLITE_OK==q
2f00: 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
2f10: 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62  ableLock(p, iTab
2f20: 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20  le, eLock) );.. 
2f30: 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63 68   /* First search
2f40: 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61 6e   the list for an
2f50: 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20 6f   existing lock o
2f60: 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f  n this table. */
2f70: 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74  .  for(pIter=pBt
2f80: 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20  ->pLock; pIter; 
2f90: 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65  pIter=pIter->pNe
2fa0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74  xt){.    if( pIt
2fb0: 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62  er->iTable==iTab
2fc0: 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42 74  le && pIter->pBt
2fd0: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
2fe0: 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a 20  pLock = pIter;. 
2ff0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3000: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
3010: 68 65 20 61 62 6f 76 65 20 73 65 61 72 63 68 20  he above search 
3020: 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 42  did not find a B
3030: 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73 73  tLock struct ass
3040: 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65 20 70  ociating Btree p
3050: 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c 65  .  ** with table
3060: 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61 74   iTable, allocat
3070: 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20 69  e one and link i
3080: 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e  t into the list.
3090: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c 6f  .  */.  if( !pLo
30a0: 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20  ck ){.    pLock 
30b0: 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c 69  = (BtLock *)sqli
30c0: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  te3MallocZero(si
30d0: 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20  zeof(BtLock));. 
30e0: 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b     if( !pLock ){
30f0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
3100: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
3110: 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61  }.    pLock->iTa
3120: 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20  ble = iTable;.  
3130: 20 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20    pLock->pBtree 
3140: 3d 20 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  = p;.    pLock->
3150: 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f  pNext = pBt->pLo
3160: 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f  ck;.    pBt->pLo
3170: 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a  ck = pLock;.  }.
3180: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 42 74  .  /* Set the Bt
3190: 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61  Lock.eLock varia
31a0: 62 6c 65 20 74 6f 20 74 68 65 20 6d 61 78 69 6d  ble to the maxim
31b0: 75 6d 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  um of the curren
31c0: 74 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20  t lock.  ** and 
31d0: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
31e0: 63 6b 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69  ck. This means i
31f0: 66 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77  f a write-lock w
3200: 61 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 0a  as already held.
3210: 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 61 64 2d    ** and a read-
3220: 6c 6f 63 6b 20 72 65 71 75 65 73 74 65 64 2c 20  lock requested, 
3230: 77 65 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65  we don't incorre
3240: 63 74 6c 79 20 64 6f 77 6e 67 72 61 64 65 20 74  ctly downgrade t
3250: 68 65 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  he lock..  */.  
3260: 61 73 73 65 72 74 28 20 57 52 49 54 45 5f 4c 4f  assert( WRITE_LO
3270: 43 4b 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a  CK>READ_LOCK );.
3280: 20 20 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63    if( eLock>pLoc
3290: 6b 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k->eLock ){.    
32a0: 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65  pLock->eLock = e
32b0: 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Lock;.  }..  ret
32c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
32d0: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49  .#endif /* !SQLI
32e0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
32f0: 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  ACHE */..#ifndef
3300: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
3310: 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20  RED_CACHE./*.** 
3320: 52 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20  Release all the 
3330: 74 61 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63  table locks (loc
3340: 6b 73 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20  ks obtained via 
3350: 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20  calls to.** the 
3360: 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61  setSharedCacheTa
3370: 62 6c 65 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64  bleLock() proced
3380: 75 72 65 29 20 68 65 6c 64 20 62 79 20 42 74 72  ure) held by Btr
3390: 65 65 20 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a 0a  ee object p..**.
33a0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
33b0: 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 42 74   assumes that Bt
33c0: 72 65 65 20 70 20 68 61 73 20 61 6e 20 6f 70 65  ree p has an ope
33d0: 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  n read or write 
33e0: 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
33f0: 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c   If it does not,
3400: 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50 45   then the BTS_PE
3410: 4e 44 49 4e 47 20 66 6c 61 67 0a 2a 2a 20 6d 61  NDING flag.** ma
3420: 79 20 62 65 20 69 6e 63 6f 72 72 65 63 74 6c 79  y be incorrectly
3430: 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61   cleared..*/.sta
3440: 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 41 6c  tic void clearAl
3450: 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
3460: 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29  eLocks(Btree *p)
3470: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
3480: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
3490: 4c 6f 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20  Lock **ppIter = 
34a0: 26 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20  &pBt->pLock;..  
34b0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
34c0: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
34d0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
34e0: 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d  ->sharable || 0=
34f0: 3d 2a 70 70 49 74 65 72 20 29 3b 0a 20 20 61 73  =*ppIter );.  as
3500: 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73  sert( p->inTrans
3510: 3e 30 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20  >0 );..  while( 
3520: 2a 70 70 49 74 65 72 20 29 7b 0a 20 20 20 20 42  *ppIter ){.    B
3530: 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a  tLock *pLock = *
3540: 70 70 49 74 65 72 3b 0a 20 20 20 20 61 73 73 65  ppIter;.    asse
3550: 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61  rt( (pBt->btsFla
3560: 67 73 20 26 20 42 54 53 5f 45 58 43 4c 55 53 49  gs & BTS_EXCLUSI
3570: 56 45 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70  VE)==0 || pBt->p
3580: 57 72 69 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e 70  Writer==pLock->p
3590: 42 74 72 65 65 20 29 3b 0a 20 20 20 20 61 73 73  Btree );.    ass
35a0: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72  ert( pLock->pBtr
35b0: 65 65 2d 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c 6f  ee->inTrans>=pLo
35c0: 63 6b 2d 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20 20  ck->eLock );.   
35d0: 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72   if( pLock->pBtr
35e0: 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a  ee==p ){.      *
35f0: 70 70 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e  ppIter = pLock->
3600: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 61 73 73  pNext;.      ass
3610: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62  ert( pLock->iTab
3620: 6c 65 21 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d 3d  le!=1 || pLock==
3630: 26 70 2d 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20 20  &p->lock );.    
3640: 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 69 54 61    if( pLock->iTa
3650: 62 6c 65 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  ble!=1 ){.      
3660: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
3670: 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Lock);.      }. 
3680: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3690: 70 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d  ppIter = &pLock-
36a0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
36b0: 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 42  }..  assert( (pB
36c0: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
36d0: 53 5f 50 45 4e 44 49 4e 47 29 3d 3d 30 20 7c 7c  S_PENDING)==0 ||
36e0: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b   pBt->pWriter );
36f0: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69  .  if( pBt->pWri
3700: 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 70 42  ter==p ){.    pB
3710: 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30 3b 0a  t->pWriter = 0;.
3720: 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
3730: 73 20 26 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55  s &= ~(BTS_EXCLU
3740: 53 49 56 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47  SIVE|BTS_PENDING
3750: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
3760: 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
3770: 3d 3d 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==2 ){.    /* Th
3780: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
3790: 61 6c 6c 65 64 20 77 68 65 6e 20 42 74 72 65 65  alled when Btree
37a0: 20 70 20 69 73 20 63 6f 6e 63 6c 75 64 69 6e 67   p is concluding
37b0: 20 69 74 73 20 0a 20 20 20 20 2a 2a 20 74 72 61   its .    ** tra
37c0: 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 74 68 65  nsaction. If the
37d0: 72 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69  re currently exi
37e0: 73 74 73 20 61 20 77 72 69 74 65 72 2c 20 61 6e  sts a writer, an
37f0: 64 20 70 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a  d p is not.    *
3800: 2a 20 74 68 61 74 20 77 72 69 74 65 72 2c 20 74  * that writer, t
3810: 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
3820: 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  f locks held by 
3830: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65  connections othe
3840: 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 74 68  r.    ** than th
3850: 65 20 77 72 69 74 65 72 20 6d 75 73 74 20 62 65  e writer must be
3860: 20 61 62 6f 75 74 20 74 6f 20 64 72 6f 70 20 74   about to drop t
3870: 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20  o zero. In this 
3880: 63 61 73 65 0a 20 20 20 20 2a 2a 20 73 65 74 20  case.    ** set 
3890: 74 68 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20  the BTS_PENDING 
38a0: 66 6c 61 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a  flag to 0..    *
38b0: 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72  *.    ** If ther
38c0: 65 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74  e is not current
38d0: 6c 79 20 61 20 77 72 69 74 65 72 2c 20 74 68 65  ly a writer, the
38e0: 6e 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 6d 75  n BTS_PENDING mu
38f0: 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 7a 65 72  st.    ** be zer
3900: 6f 20 61 6c 72 65 61 64 79 2e 20 53 6f 20 74 68  o already. So th
3910: 69 73 20 6e 65 78 74 20 6c 69 6e 65 20 69 73 20  is next line is 
3920: 68 61 72 6d 6c 65 73 73 20 69 6e 20 74 68 61 74  harmless in that
3930: 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   case..    */.  
3940: 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
3950: 26 3d 20 7e 42 54 53 5f 50 45 4e 44 49 4e 47 3b  &= ~BTS_PENDING;
3960: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
3970: 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 61 6e  is function chan
3980: 67 65 73 20 61 6c 6c 20 77 72 69 74 65 2d 6c 6f  ges all write-lo
3990: 63 6b 73 20 68 65 6c 64 20 62 79 20 42 74 72 65  cks held by Btre
39a0: 65 20 70 20 69 6e 74 6f 20 72 65 61 64 2d 6c 6f  e p into read-lo
39b0: 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  cks..*/.static v
39c0: 6f 69 64 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c  oid downgradeAll
39d0: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
39e0: 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29 7b  Locks(Btree *p){
39f0: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
3a00: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28   = p->pBt;.  if(
3a10: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70   pBt->pWriter==p
3a20: 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a   ){.    BtLock *
3a30: 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e  pLock;.    pBt->
3a40: 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20 20  pWriter = 0;.   
3a50: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
3a60: 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49 56  = ~(BTS_EXCLUSIV
3a70: 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a  E|BTS_PENDING);.
3a80: 20 20 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42      for(pLock=pB
3a90: 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3b  t->pLock; pLock;
3aa0: 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e   pLock=pLock->pN
3ab0: 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ext){.      asse
3ac0: 72 74 28 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b  rt( pLock->eLock
3ad0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70  ==READ_LOCK || p
3ae0: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Lock->pBtree==p 
3af0: 29 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e  );.      pLock->
3b00: 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43  eLock = READ_LOC
3b10: 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  K;.    }.  }.}..
3b20: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
3b30: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
3b40: 48 45 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f  HE */..static vo
3b50: 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d  id releasePage(M
3b60: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20  emPage *pPage); 
3b70: 20 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65   /* Forward refe
3b80: 72 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a  rence */../*.***
3b90: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3ba0: 69 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f  is used inside o
3bb0: 66 20 61 73 73 65 72 74 28 29 20 6f 6e 6c 79 20  f assert() only 
3bc0: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66  ****.**.** Verif
3bd0: 79 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  y that the curso
3be0: 72 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74 65  r holds the mute
3bf0: 78 20 6f 6e 20 69 74 73 20 42 74 53 68 61 72 65  x on its BtShare
3c00: 64 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  d.*/.#ifdef SQLI
3c10: 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20  TE_DEBUG.static 
3c20: 69 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  int cursorHoldsM
3c30: 75 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a 70  utex(BtCursor *p
3c40: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
3c50: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
3c60: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d  ->pBt->mutex);.}
3c70: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75 72 73  .static int curs
3c80: 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 42  orOwnsBtShared(B
3c90: 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 61  tCursor *p){.  a
3ca0: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
3cb0: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
3cc0: 72 65 74 75 72 6e 20 28 70 2d 3e 70 42 74 72 65  return (p->pBtre
3cd0: 65 2d 3e 64 62 3d 3d 70 2d 3e 70 42 74 2d 3e 64  e->db==p->pBt->d
3ce0: 62 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  b);.}.#endif../*
3cf0: 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74  .** Invalidate t
3d00: 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68  he overflow cach
3d10: 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 20  e of the cursor 
3d20: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
3d30: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  rst argument..**
3d40: 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20 62   on the shared b
3d50: 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 70  tree structure p
3d60: 42 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69  Bt..*/.#define 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 43 75 72 29 20 28 70 43  wCache(pCur) (pC
3d90: 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
3da0: 7e 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  ~BTCF_ValidOvfl)
3db0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61  ../*.** Invalida
3dc0: 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
3dd0: 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
3de0: 66 6f 72 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  for all cursors 
3df0: 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65  opened.** on the
3e00: 20 73 68 61 72 65 64 20 62 74 72 65 65 20 73 74   shared btree st
3e10: 72 75 63 74 75 72 65 20 70 42 74 2e 0a 2a 2f 0a  ructure pBt..*/.
3e20: 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61  static void inva
3e30: 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f  lidateAllOverflo
3e40: 77 43 61 63 68 65 28 42 74 53 68 61 72 65 64 20  wCache(BtShared 
3e50: 2a 70 42 74 29 7b 0a 20 20 42 74 43 75 72 73 6f  *pBt){.  BtCurso
3e60: 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20  r *p;.  assert( 
3e70: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
3e80: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
3e90: 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70  ;.  for(p=pBt->p
3ea0: 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
3eb0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 76 61  pNext){.    inva
3ec0: 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61  lidateOverflowCa
3ed0: 63 68 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23  che(p);.  }.}..#
3ee0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3ef0: 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a  IT_INCRBLOB./*.*
3f00: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
3f10: 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  is called before
3f20: 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63   modifying the c
3f30: 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 74 61 62  ontents of a tab
3f40: 6c 65 0a 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64  le.** to invalid
3f50: 61 74 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62  ate any incrblob
3f60: 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72   cursors that ar
3f70: 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a  e open on the.**
3f80: 20 72 6f 77 20 6f 72 20 6f 6e 65 20 6f 66 20 74   row or one of t
3f90: 68 65 20 72 6f 77 73 20 62 65 69 6e 67 20 6d 6f  he rows being mo
3fa0: 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  dified..**.** If
3fb0: 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61   argument isClea
3fc0: 72 54 61 62 6c 65 20 69 73 20 74 72 75 65 2c 20  rTable is true, 
3fd0: 74 68 65 6e 20 74 68 65 20 65 6e 74 69 72 65 20  then the entire 
3fe0: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a  contents of the.
3ff0: 2a 2a 20 74 61 62 6c 65 20 69 73 20 61 62 6f 75  ** table is abou
4000: 74 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e  t to be deleted.
4010: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e   In this case in
4020: 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 69 6e 63  validate all inc
4030: 72 62 6c 6f 62 0a 2a 2a 20 63 75 72 73 6f 72 73  rblob.** cursors
4040: 20 6f 70 65 6e 20 6f 6e 20 61 6e 79 20 72 6f 77   open on any row
4050: 20 77 69 74 68 69 6e 20 74 68 65 20 74 61 62 6c   within the tabl
4060: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
4070: 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a   pgnoRoot..**.**
4080: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61   Otherwise, if a
4090: 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54  rgument isClearT
40a0: 61 62 6c 65 20 69 73 20 66 61 6c 73 65 2c 20 74  able is false, t
40b0: 68 65 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68  hen the row with
40c0: 0a 2a 2a 20 72 6f 77 69 64 20 69 52 6f 77 20 69  .** rowid iRow i
40d0: 73 20 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64  s being replaced
40e0: 20 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 6e 20   or deleted. In 
40f0: 74 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69  this case invali
4100: 64 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f  date.** only tho
4110: 73 65 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73  se incrblob curs
4120: 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 61 74  ors open on that
4130: 20 73 70 65 63 69 66 69 63 20 72 6f 77 2e 0a 2a   specific row..*
4140: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
4150: 76 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62  validateIncrblob
4160: 43 75 72 73 6f 72 73 28 0a 20 20 42 74 72 65 65  Cursors(.  Btree
4170: 20 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20 20   *pBtree,       
4180: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
4190: 73 65 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b  se file to check
41a0: 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 2c 20   */.  i64 iRow, 
41b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
41c0: 20 54 68 65 20 72 6f 77 69 64 20 74 68 61 74 20   The rowid that 
41d0: 6d 69 67 68 74 20 62 65 20 63 68 61 6e 67 69 6e  might be changin
41e0: 67 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65  g */.  int isCle
41f0: 61 72 54 61 62 6c 65 20 20 20 20 20 20 20 20 2f  arTable        /
4200: 2a 20 54 72 75 65 20 69 66 20 61 6c 6c 20 72 6f  * True if all ro
4210: 77 73 20 61 72 65 20 62 65 69 6e 67 20 64 65 6c  ws are being del
4220: 65 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43  eted */.){.  BtC
4230: 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69 66 28 20  ursor *p;.  if( 
4240: 70 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72 62  pBtree->hasIncrb
4250: 6c 6f 62 43 75 72 3d 3d 30 20 29 20 72 65 74 75  lobCur==0 ) retu
4260: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  rn;.  assert( sq
4270: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
4280: 75 74 65 78 28 70 42 74 72 65 65 29 20 29 3b 0a  utex(pBtree) );.
4290: 20 20 70 42 74 72 65 65 2d 3e 68 61 73 49 6e 63    pBtree->hasInc
42a0: 72 62 6c 6f 62 43 75 72 20 3d 20 30 3b 0a 20 20  rblobCur = 0;.  
42b0: 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42  for(p=pBtree->pB
42c0: 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
42d0: 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
42e0: 69 66 28 20 28 70 2d 3e 63 75 72 46 6c 61 67 73  if( (p->curFlags
42f0: 20 26 20 42 54 43 46 5f 49 6e 63 72 62 6c 6f 62   & BTCF_Incrblob
4300: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42  )!=0 ){.      pB
4310: 74 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f  tree->hasIncrblo
4320: 62 43 75 72 20 3d 20 31 3b 0a 20 20 20 20 20 20  bCur = 1;.      
4330: 69 66 28 20 69 73 43 6c 65 61 72 54 61 62 6c 65  if( isClearTable
4340: 20 7c 7c 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   || p->info.nKey
4350: 3d 3d 69 52 6f 77 20 29 7b 0a 20 20 20 20 20 20  ==iRow ){.      
4360: 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55    p->eState = CU
4370: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
4380: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
4390: 7d 0a 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 53 74  }..#else.  /* St
43a0: 75 62 20 66 75 6e 63 74 69 6f 6e 20 77 68 65 6e  ub function when
43b0: 20 49 4e 43 52 42 4c 4f 42 20 69 73 20 6f 6d 69   INCRBLOB is omi
43c0: 74 74 65 64 20 2a 2f 0a 20 20 23 64 65 66 69 6e  tted */.  #defin
43d0: 65 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72  e invalidateIncr
43e0: 62 6c 6f 62 43 75 72 73 6f 72 73 28 78 2c 79 2c  blobCursors(x,y,
43f0: 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  z).#endif /* SQL
4400: 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
4410: 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  B */../*.** Set 
4420: 62 69 74 20 70 67 6e 6f 20 6f 66 20 74 68 65 20  bit pgno of the 
4430: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
4440: 74 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69  tent bitvec. Thi
4450: 73 20 69 73 20 63 61 6c 6c 65 64 20 0a 2a 2a 20  s is called .** 
4460: 77 68 65 6e 20 61 20 70 61 67 65 20 74 68 61 74  when a page that
4470: 20 70 72 65 76 69 6f 75 73 6c 79 20 63 6f 6e 74   previously cont
4480: 61 69 6e 65 64 20 64 61 74 61 20 62 65 63 6f 6d  ained data becom
4490: 65 73 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  es a free-list l
44a0: 65 61 66 20 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2a  eaf .** page..**
44b0: 0a 2a 2a 20 54 68 65 20 42 74 53 68 61 72 65 64  .** The BtShared
44c0: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
44d0: 76 65 63 20 65 78 69 73 74 73 20 74 6f 20 77 6f  vec exists to wo
44e0: 72 6b 20 61 72 6f 75 6e 64 20 61 6e 20 6f 62 73  rk around an obs
44f0: 63 75 72 65 0a 2a 2a 20 62 75 67 20 63 61 75 73  cure.** bug caus
4500: 65 64 20 62 79 20 74 68 65 20 69 6e 74 65 72 61  ed by the intera
4510: 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20 75 73 65  ction of two use
4520: 66 75 6c 20 49 4f 20 6f 70 74 69 6d 69 7a 61 74  ful IO optimizat
4530: 69 6f 6e 73 20 73 75 72 72 6f 75 6e 64 69 6e 67  ions surrounding
4540: 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  .** free-list le
4550: 61 66 20 70 61 67 65 73 3a 0a 2a 2a 0a 2a 2a 20  af pages:.**.** 
4560: 20 20 31 29 20 57 68 65 6e 20 61 6c 6c 20 64 61    1) When all da
4570: 74 61 20 69 73 20 64 65 6c 65 74 65 64 20 66 72  ta is deleted fr
4580: 6f 6d 20 61 20 70 61 67 65 20 61 6e 64 20 74 68  om a page and th
4590: 65 20 70 61 67 65 20 62 65 63 6f 6d 65 73 0a 2a  e page becomes.*
45a0: 2a 20 20 20 20 20 20 61 20 66 72 65 65 2d 6c 69  *      a free-li
45b0: 73 74 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68  st leaf page, th
45c0: 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 77 72  e page is not wr
45d0: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74  itten to the dat
45e0: 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 28 61  abase.**      (a
45f0: 73 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  s free-list leaf
4600: 20 70 61 67 65 73 20 63 6f 6e 74 61 69 6e 20 6e   pages contain n
4610: 6f 20 6d 65 61 6e 69 6e 67 66 75 6c 20 64 61 74  o meaningful dat
4620: 61 29 2e 20 53 6f 6d 65 74 69 6d 65 73 0a 2a 2a  a). Sometimes.**
4630: 20 20 20 20 20 20 73 75 63 68 20 61 20 70 61 67        such a pag
4640: 65 20 69 73 20 6e 6f 74 20 65 76 65 6e 20 6a 6f  e is not even jo
4650: 75 72 6e 61 6c 6c 65 64 20 28 61 73 20 69 74 20  urnalled (as it 
4660: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6d 6f 64 69  will not be modi
4670: 66 69 65 64 2c 0a 2a 2a 20 20 20 20 20 20 77 68  fied,.**      wh
4680: 79 20 62 6f 74 68 65 72 20 6a 6f 75 72 6e 61 6c  y bother journal
4690: 6c 69 6e 67 20 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a  ling it?)..**.**
46a0: 20 20 20 32 29 20 57 68 65 6e 20 61 20 66 72 65     2) When a fre
46b0: 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
46c0: 20 69 73 20 72 65 75 73 65 64 2c 20 69 74 73 20   is reused, its 
46d0: 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 72  content is not r
46e0: 65 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d  ead.**      from
46f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 72   the database or
4700: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
4710: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 77 68  journal file (wh
4720: 79 20 73 68 6f 75 6c 64 20 69 74 0a 2a 2a 20 20  y should it.**  
4730: 20 20 20 20 62 65 2c 20 69 66 20 69 74 20 69 73      be, if it is
4740: 20 6e 6f 74 20 61 74 20 61 6c 6c 20 6d 65 61 6e   not at all mean
4750: 69 6e 67 66 75 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20  ingful?)..**.** 
4760: 42 79 20 74 68 65 6d 73 65 6c 76 65 73 2c 20 74  By themselves, t
4770: 68 65 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  hese optimizatio
4780: 6e 73 20 77 6f 72 6b 20 66 69 6e 65 20 61 6e 64  ns work fine and
4790: 20 70 72 6f 76 69 64 65 20 61 20 68 61 6e 64 79   provide a handy
47a0: 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  .** performance 
47b0: 62 6f 6f 73 74 20 74 6f 20 62 75 6c 6b 20 64 65  boost to bulk de
47c0: 6c 65 74 65 20 6f 72 20 69 6e 73 65 72 74 20 6f  lete or insert o
47d0: 70 65 72 61 74 69 6f 6e 73 2e 20 48 6f 77 65 76  perations. Howev
47e0: 65 72 2c 20 69 66 0a 2a 2a 20 61 20 70 61 67 65  er, if.** a page
47f0: 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68 65   is moved to the
4800: 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 74   free-list and t
4810: 68 65 6e 20 72 65 75 73 65 64 20 77 69 74 68 69  hen reused withi
4820: 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 72  n the same.** tr
4830: 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20 70 72 6f  ansaction, a pro
4840: 62 6c 65 6d 20 63 6f 6d 65 73 20 75 70 2e 20 49  blem comes up. I
4850: 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
4860: 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65  t journalled whe
4870: 6e 0a 2a 2a 20 69 74 20 69 73 20 6d 6f 76 65 64  n.** it is moved
4880: 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73   to the free-lis
4890: 74 20 61 6e 64 20 69 74 20 69 73 20 61 6c 73 6f  t and it is also
48a0: 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20   not journalled 
48b0: 77 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 65 78  when it.** is ex
48c0: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
48d0: 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 72   free-list and r
48e0: 65 75 73 65 64 2c 20 74 68 65 6e 20 74 68 65 20  eused, then the 
48f0: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 0a 2a 2a  original data.**
4900: 20 6d 61 79 20 62 65 20 6c 6f 73 74 2e 20 49 6e   may be lost. In
4910: 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20   the event of a 
4920: 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 6d 61 79  rollback, it may
4930: 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65   not be possible
4940: 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65 20 74  .** to restore t
4950: 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69  he database to i
4960: 74 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 66  ts original conf
4970: 69 67 75 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  iguration..**.**
4980: 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73   The solution is
4990: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48   the BtShared.pH
49a0: 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63  asContent bitvec
49b0: 2e 20 57 68 65 6e 65 76 65 72 20 61 20 70 61 67  . Whenever a pag
49c0: 65 20 69 73 20 0a 2a 2a 20 6d 6f 76 65 64 20 74  e is .** moved t
49d0: 6f 20 62 65 63 6f 6d 65 20 61 20 66 72 65 65 2d  o become a free-
49e0: 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 2c 20  list leaf page, 
49f0: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
4a00: 67 20 62 69 74 20 69 73 0a 2a 2a 20 73 65 74 20  g bit is.** set 
4a10: 69 6e 20 74 68 65 20 62 69 74 76 65 63 2e 20 57  in the bitvec. W
4a20: 68 65 6e 65 76 65 72 20 61 20 6c 65 61 66 20 70  henever a leaf p
4a30: 61 67 65 20 69 73 20 65 78 74 72 61 63 74 65 64  age is extracted
4a40: 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c   from the free-l
4a50: 69 73 74 2c 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61  ist,.** optimiza
4a60: 74 69 6f 6e 20 32 20 61 62 6f 76 65 20 69 73 20  tion 2 above is 
4a70: 6f 6d 69 74 74 65 64 20 69 66 20 74 68 65 20 63  omitted if the c
4a80: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
4a90: 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 73   is already.** s
4aa0: 65 74 20 69 6e 20 42 74 53 68 61 72 65 64 2e 70  et in BtShared.p
4ab0: 48 61 73 43 6f 6e 74 65 6e 74 2e 20 54 68 65 20  HasContent. The 
4ac0: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
4ad0: 62 69 74 76 65 63 20 61 72 65 20 63 6c 65 61 72  bitvec are clear
4ae0: 65 64 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64  ed.** at the end
4af0: 20 6f 66 20 65 76 65 72 79 20 74 72 61 6e 73 61   of every transa
4b00: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
4b10: 20 69 6e 74 20 62 74 72 65 65 53 65 74 48 61 73   int btreeSetHas
4b20: 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64  Content(BtShared
4b30: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
4b40: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
4b50: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21  LITE_OK;.  if( !
4b60: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
4b70: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
4b80: 70 67 6e 6f 3c 3d 70 42 74 2d 3e 6e 50 61 67 65  pgno<=pBt->nPage
4b90: 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 48 61   );.    pBt->pHa
4ba0: 73 43 6f 6e 74 65 6e 74 20 3d 20 73 71 6c 69 74  sContent = sqlit
4bb0: 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70  e3BitvecCreate(p
4bc0: 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
4bd0: 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f  if( !pBt->pHasCo
4be0: 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 72  ntent ){.      r
4bf0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
4c00: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
4c10: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
4c20: 26 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33  && pgno<=sqlite3
4c30: 42 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e  BitvecSize(pBt->
4c40: 70 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a  pHasContent) ){.
4c50: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
4c60: 42 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70  BitvecSet(pBt->p
4c70: 48 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f  HasContent, pgno
4c80: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
4c90: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65  rc;.}../*.** Que
4ca0: 72 79 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  ry the BtShared.
4cb0: 70 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74  pHasContent vect
4cc0: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  or..**.** This f
4cd0: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
4ce0: 64 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69  d when a free-li
4cf0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20  st leaf page is 
4d00: 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
4d10: 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f  .** free-list fo
4d20: 72 20 72 65 75 73 65 2e 20 49 74 20 72 65 74 75  r reuse. It retu
4d30: 72 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74 20  rns false if it 
4d40: 69 73 20 73 61 66 65 20 74 6f 20 72 65 74 72 69  is safe to retri
4d50: 65 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  eve the.** page 
4d60: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c  from the pager l
4d70: 61 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e  ayer with the 'n
4d80: 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20  o-content' flag 
4d90: 73 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77  set. True otherw
4da0: 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ise..*/.static i
4db0: 6e 74 20 62 74 72 65 65 47 65 74 48 61 73 43 6f  nt btreeGetHasCo
4dc0: 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a  ntent(BtShared *
4dd0: 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  pBt, Pgno pgno){
4de0: 0a 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70  .  Bitvec *p = p
4df0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b  Bt->pHasContent;
4e00: 0a 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20  .  return (p && 
4e10: 28 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74  (pgno>sqlite3Bit
4e20: 76 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71  vecSize(p) || sq
4e30: 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
4e40: 70 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f  p, pgno)));.}../
4e50: 2a 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74  *.** Clear (dest
4e60: 72 6f 79 29 20 74 68 65 20 42 74 53 68 61 72 65  roy) the BtShare
4e70: 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69  d.pHasContent bi
4e80: 74 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c  tvec. This shoul
4e90: 64 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20  d be.** invoked 
4ea0: 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
4eb0: 6e 20 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d  n of each write-
4ec0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a  transaction..*/.
4ed0: 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
4ee0: 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74  eClearHasContent
4ef0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
4f00: 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  .  sqlite3Bitvec
4f10: 44 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61  Destroy(pBt->pHa
4f20: 73 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74  sContent);.  pBt
4f30: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20  ->pHasContent = 
4f40: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  0;.}../*.** Rele
4f50: 61 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 61  ase all of the a
4f60: 70 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66 6f  pPage[] pages fo
4f70: 72 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73  r a cursor..*/.s
4f80: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
4f90: 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72  ReleaseAllCursor
4fa0: 50 61 67 65 73 28 42 74 43 75 72 73 6f 72 20 2a  Pages(BtCursor *
4fb0: 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  pCur){.  int i;.
4fc0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43    for(i=0; i<=pC
4fd0: 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  ur->iPage; i++){
4fe0: 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
4ff0: 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  (pCur->apPage[i]
5000: 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50  );.    pCur->apP
5010: 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a  age[i] = 0;.  }.
5020: 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20    pCur->iPage = 
5030: 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  -1;.}../*.** The
5040: 20 63 75 72 73 6f 72 20 70 61 73 73 65 64 20 61   cursor passed a
5050: 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d  s the only argum
5060: 65 6e 74 20 6d 75 73 74 20 70 6f 69 6e 74 20 74  ent must point t
5070: 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 0a  o a valid entry.
5080: 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ** when this fun
5090: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
50a0: 28 69 2e 65 2e 20 68 61 76 65 20 65 53 74 61 74  (i.e. have eStat
50b0: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29  e==CURSOR_VALID)
50c0: 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
50d0: 6f 6e 20 73 61 76 65 73 20 74 68 65 20 63 75 72  on saves the cur
50e0: 72 65 6e 74 20 63 75 72 73 6f 72 20 6b 65 79 20  rent cursor key 
50f0: 69 6e 20 76 61 72 69 61 62 6c 65 73 20 70 43 75  in variables pCu
5100: 72 2d 3e 6e 4b 65 79 20 61 6e 64 0a 2a 2a 20 70  r->nKey and.** p
5110: 43 75 72 2d 3e 70 4b 65 79 2e 20 53 51 4c 49 54  Cur->pKey. SQLIT
5120: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
5130: 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f   if successful o
5140: 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  r an SQLite erro
5150: 72 20 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72  r .** code other
5160: 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  wise..**.** If t
5170: 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65  he cursor is ope
5180: 6e 20 6f 6e 20 61 6e 20 69 6e 74 6b 65 79 20 74  n on an intkey t
5190: 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 69  able, then the i
51a0: 6e 74 65 67 65 72 20 6b 65 79 0a 2a 2a 20 28 74  nteger key.** (t
51b0: 68 65 20 72 6f 77 69 64 29 20 69 73 20 73 74 6f  he rowid) is sto
51c0: 72 65 64 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65  red in pCur->nKe
51d0: 79 20 61 6e 64 20 70 43 75 72 2d 3e 70 4b 65 79  y and pCur->pKey
51e0: 20 69 73 20 6c 65 66 74 20 73 65 74 20 74 6f 0a   is left set to.
51f0: 2a 2a 20 4e 55 4c 4c 2e 20 49 66 20 74 68 65 20  ** NULL. If the 
5200: 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 20 6f  cursor is open o
5210: 6e 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 74  n a non-intkey t
5220: 61 62 6c 65 2c 20 74 68 65 6e 20 70 43 75 72 2d  able, then pCur-
5230: 3e 70 4b 65 79 20 69 73 20 0a 2a 2a 20 73 65 74  >pKey is .** set
5240: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 6d   to point to a m
5250: 61 6c 6c 6f 63 65 64 20 62 75 66 66 65 72 20 70  alloced buffer p
5260: 43 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20  Cur->nKey bytes 
5270: 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69  in size containi
5280: 6e 67 20 0a 2a 2a 20 74 68 65 20 6b 65 79 2e 0a  ng .** the key..
5290: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  */.static int sa
52a0: 76 65 43 75 72 73 6f 72 4b 65 79 28 42 74 43 75  veCursorKey(BtCu
52b0: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
52c0: 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
52d0: 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70   CURSOR_VALID==p
52e0: 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20  Cur->eState );. 
52f0: 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75 72   assert( 0==pCur
5300: 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73 65  ->pKey );.  asse
5310: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
5320: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20  utex(pCur) );.. 
5330: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
5340: 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20  eeKeySize(pCur, 
5350: 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a 20 20  &pCur->nKey);.  
5360: 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
5370: 54 45 5f 4f 4b 20 29 3b 20 20 2f 2a 20 4b 65 79  TE_OK );  /* Key
5380: 53 69 7a 65 28 29 20 63 61 6e 6e 6f 74 20 66 61  Size() cannot fa
5390: 69 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74  il */..  /* If t
53a0: 68 69 73 20 69 73 20 61 6e 20 69 6e 74 4b 65 79  his is an intKey
53b0: 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 65   table, then the
53c0: 20 61 62 6f 76 65 20 63 61 6c 6c 20 74 6f 20 42   above call to B
53d0: 74 72 65 65 4b 65 79 53 69 7a 65 28 29 0a 20 20  treeKeySize().  
53e0: 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 69 6e  ** stores the in
53f0: 74 65 67 65 72 20 6b 65 79 20 69 6e 20 70 43 75  teger key in pCu
5400: 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74 68 69 73  r->nKey. In this
5410: 20 63 61 73 65 20 74 68 69 73 20 76 61 6c 75 65   case this value
5420: 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 61   is.  ** all tha
5430: 74 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 4f  t is required. O
5440: 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 43 75  therwise, if pCu
5450: 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 6f 6e  r is not open on
5460: 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20 2a 2a 20   an intKey.  ** 
5470: 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61 6c 6c  table, then mall
5480: 6f 63 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64  oc space for and
5490: 20 73 74 6f 72 65 20 74 68 65 20 70 43 75 72 2d   store the pCur-
54a0: 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f 66 20 6b  >nKey bytes of k
54b0: 65 79 20 0a 20 20 2a 2a 20 64 61 74 61 2e 20 20  ey .  ** data.  
54c0: 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 70 43 75 72  */.  if( 0==pCur
54d0: 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29 7b 0a 20  ->curIntKey ){. 
54e0: 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20     void *pKey = 
54f0: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 70  sqlite3Malloc( p
5500: 43 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20 20  Cur->nKey );.   
5510: 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20   if( pKey ){.   
5520: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
5530: 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c  treeKey(pCur, 0,
5540: 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79   (int)pCur->nKey
5550: 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 69  , pKey);.      i
5560: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
5570: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
5580: 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20  ->pKey = pKey;. 
5590: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
55a0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
55b0: 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a  (pKey);.      }.
55c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
55d0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
55e0: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  EM;.    }.  }.  
55f0: 61 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e 63  assert( !pCur->c
5600: 75 72 49 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75  urIntKey || !pCu
5610: 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 72 65 74  r->pKey );.  ret
5620: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
5630: 20 53 61 76 65 20 74 68 65 20 63 75 72 72 65 6e   Save the curren
5640: 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  t cursor positio
5650: 6e 20 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c  n in the variabl
5660: 65 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79  es BtCursor.nKey
5670: 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f   .** and BtCurso
5680: 72 2e 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73  r.pKey. The curs
5690: 6f 72 27 73 20 73 74 61 74 65 20 69 73 20 73 65  or's state is se
56a0: 74 20 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55  t to CURSOR_REQU
56b0: 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54  IRESEEK..**.** T
56c0: 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65  he caller must e
56d0: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 63  nsure that the c
56e0: 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 20 28  ursor is valid (
56f0: 68 61 73 20 65 53 74 61 74 65 3d 3d 43 55 52 53  has eState==CURS
5700: 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69  OR_VALID).** pri
5710: 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68  or to calling th
5720: 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f  is routine.  .*/
5730: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
5740: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42  CursorPosition(B
5750: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
5760: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
5770: 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49  ert( CURSOR_VALI
5780: 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
5790: 7c 7c 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45  || CURSOR_SKIPNE
57a0: 58 54 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  XT==pCur->eState
57b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d   );.  assert( 0=
57c0: 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20  =pCur->pKey );. 
57d0: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
57e0: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
57f0: 29 3b 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  );..  if( pCur->
5800: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53  eState==CURSOR_S
5810: 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 70  KIPNEXT ){.    p
5820: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
5830: 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65  RSOR_VALID;.  }e
5840: 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73  lse{.    pCur->s
5850: 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 7d  kipNext = 0;.  }
5860: 0a 0a 20 20 72 63 20 3d 20 73 61 76 65 43 75 72  ..  rc = saveCur
5870: 73 6f 72 4b 65 79 28 70 43 75 72 29 3b 0a 20 20  sorKey(pCur);.  
5880: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
5890: 4b 20 29 7b 0a 20 20 20 20 62 74 72 65 65 52 65  K ){.    btreeRe
58a0: 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61  leaseAllCursorPa
58b0: 67 65 73 28 70 43 75 72 29 3b 0a 20 20 20 20 70  ges(pCur);.    p
58c0: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
58d0: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
58e0: 3b 0a 20 20 7d 0a 0a 20 20 70 43 75 72 2d 3e 63  ;.  }..  pCur->c
58f0: 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43  urFlags &= ~(BTC
5900: 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46  F_ValidNKey|BTCF
5910: 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f  _ValidOvfl|BTCF_
5920: 41 74 4c 61 73 74 29 3b 0a 20 20 72 65 74 75 72  AtLast);.  retur
5930: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  n rc;.}../* Forw
5940: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
5950: 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
5960: 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65  TE_NOINLINE save
5970: 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 42 74  CursorsOnList(Bt
5980: 43 75 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42 74 43  Cursor*,Pgno,BtC
5990: 75 72 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  ursor*);../*.** 
59a0: 53 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f  Save the positio
59b0: 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72  ns of all cursor
59c0: 73 20 28 65 78 63 65 70 74 20 70 45 78 63 65 70  s (except pExcep
59d0: 74 29 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e  t) that are open
59e0: 20 6f 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   on.** the table
59f0: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
5a00: 69 52 6f 6f 74 2e 20 20 22 53 61 76 69 6e 67 20  iRoot.  "Saving 
5a10: 74 68 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74  the cursor posit
5a20: 69 6f 6e 22 20 6d 65 61 6e 73 20 74 68 61 74 0a  ion" means that.
5a30: 2a 2a 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20  ** the location 
5a40: 69 6e 20 74 68 65 20 62 74 72 65 65 20 69 73 20  in the btree is 
5a50: 72 65 6d 65 6d 62 65 72 65 64 20 69 6e 20 73 75  remembered in su
5a60: 63 68 20 61 20 77 61 79 20 74 68 61 74 20 69 74  ch a way that it
5a70: 20 63 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76 65 64   can be.** moved
5a80: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 73 61 6d   back to the sam
5a90: 65 20 73 70 6f 74 20 61 66 74 65 72 20 74 68 65  e spot after the
5aa0: 20 62 74 72 65 65 20 68 61 73 20 62 65 65 6e 20   btree has been 
5ab0: 6d 6f 64 69 66 69 65 64 2e 20 20 54 68 69 73 0a  modified.  This.
5ac0: 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ** routine is ca
5ad0: 6c 6c 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65  lled just before
5ae0: 20 63 75 72 73 6f 72 20 70 45 78 63 65 70 74 20   cursor pExcept 
5af0: 69 73 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66  is used to modif
5b00: 79 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 2c 20  y the.** table, 
5b10: 66 6f 72 20 65 78 61 6d 70 6c 65 20 69 6e 20 42  for example in B
5b20: 74 72 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20  treeDelete() or 
5b30: 42 74 72 65 65 49 6e 73 65 72 74 28 29 2e 0a 2a  BtreeInsert()..*
5b40: 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
5b50: 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75  e two or more cu
5b60: 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d  rsors on the sam
5b70: 65 20 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c  e btree, then al
5b80: 6c 20 73 75 63 68 20 0a 2a 2a 20 63 75 72 73 6f  l such .** curso
5b90: 72 73 20 73 68 6f 75 6c 64 20 68 61 76 65 20 74  rs should have t
5ba0: 68 65 69 72 20 42 54 43 46 5f 4d 75 6c 74 69 70  heir BTCF_Multip
5bb0: 6c 65 20 66 6c 61 67 20 73 65 74 2e 20 20 54 68  le flag set.  Th
5bc0: 65 20 62 74 72 65 65 43 75 72 73 6f 72 28 29 0a  e btreeCursor().
5bd0: 2a 2a 20 72 6f 75 74 69 6e 65 20 65 6e 66 6f 72  ** routine enfor
5be0: 63 65 73 20 74 68 61 74 20 72 75 6c 65 2e 20 20  ces that rule.  
5bf0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c  This routine onl
5c00: 79 20 6e 65 65 64 73 20 74 6f 20 62 65 20 63 61  y needs to be ca
5c10: 6c 6c 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 75  lled in.** the u
5c20: 6e 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65  ncommon case whe
5c30: 6e 20 70 45 78 70 65 63 74 20 68 61 73 20 74 68  n pExpect has th
5c40: 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20  e BTCF_Multiple 
5c50: 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  flag set..**.** 
5c60: 49 66 20 70 45 78 70 65 63 74 21 3d 4e 55 4c 4c  If pExpect!=NULL
5c70: 20 61 6e 64 20 69 66 20 6e 6f 20 6f 74 68 65 72   and if no other
5c80: 20 63 75 72 73 6f 72 73 20 61 72 65 20 66 6f 75   cursors are fou
5c90: 6e 64 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 72  nd on the same r
5ca0: 6f 6f 74 2d 70 61 67 65 2c 0a 2a 2a 20 74 68 65  oot-page,.** the
5cb0: 6e 20 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69  n the BTCF_Multi
5cc0: 70 6c 65 20 66 6c 61 67 20 6f 6e 20 70 45 78 70  ple flag on pExp
5cd0: 65 63 74 20 69 73 20 63 6c 65 61 72 65 64 2c 20  ect is cleared, 
5ce0: 74 6f 20 61 76 6f 69 64 20 61 6e 6f 74 68 65 72  to avoid another
5cf0: 0a 2a 2a 20 70 6f 69 6e 74 6c 65 73 73 20 63 61  .** pointless ca
5d00: 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ll to this routi
5d10: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  ne..**.** Implem
5d20: 65 6e 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20  entation note:  
5d30: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 65 72  This routine mer
5d40: 65 6c 79 20 63 68 65 63 6b 73 20 74 6f 20 73 65  ely checks to se
5d50: 65 20 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73  e if any cursors
5d60: 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 73  .** need to be s
5d70: 61 76 65 64 2e 20 20 49 74 20 63 61 6c 6c 73 20  aved.  It calls 
5d80: 6f 75 74 20 74 6f 20 73 61 76 65 43 75 72 73 6f  out to saveCurso
5d90: 72 73 4f 6e 4c 69 73 74 28 29 20 69 6e 20 74 68  rsOnList() in th
5da0: 65 20 28 75 6e 75 73 75 61 6c 29 0a 2a 2a 20 65  e (unusual).** e
5db0: 76 65 6e 74 20 74 68 61 74 20 63 75 72 73 6f 72  vent that cursor
5dc0: 73 20 61 72 65 20 69 6e 20 6e 65 65 64 20 74 6f  s are in need to
5dd0: 20 62 65 69 6e 67 20 73 61 76 65 64 2e 0a 2a 2f   being saved..*/
5de0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
5df0: 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61  AllCursors(BtSha
5e00: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69  red *pBt, Pgno i
5e10: 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a  Root, BtCursor *
5e20: 70 45 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75  pExcept){.  BtCu
5e30: 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72  rsor *p;.  asser
5e40: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
5e50: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
5e60: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
5e70: 45 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78  Except==0 || pEx
5e80: 63 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29  cept->pBt==pBt )
5e90: 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70  ;.  for(p=pBt->p
5ea0: 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
5eb0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
5ec0: 70 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30  p!=pExcept && (0
5ed0: 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67  ==iRoot || p->pg
5ee0: 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29  noRoot==iRoot) )
5ef0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
5f00: 28 20 70 20 29 20 72 65 74 75 72 6e 20 73 61 76  ( p ) return sav
5f10: 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 70  eCursorsOnList(p
5f20: 2c 20 69 52 6f 6f 74 2c 20 70 45 78 63 65 70 74  , iRoot, pExcept
5f30: 29 3b 0a 20 20 69 66 28 20 70 45 78 63 65 70 74  );.  if( pExcept
5f40: 20 29 20 70 45 78 63 65 70 74 2d 3e 63 75 72 46   ) pExcept->curF
5f50: 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 4d 75  lags &= ~BTCF_Mu
5f60: 6c 74 69 70 6c 65 3b 0a 20 20 72 65 74 75 72 6e  ltiple;.  return
5f70: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
5f80: 2a 20 54 68 69 73 20 68 65 6c 70 65 72 20 72 6f  * This helper ro
5f90: 75 74 69 6e 65 20 74 6f 20 73 61 76 65 41 6c 6c  utine to saveAll
5fa0: 43 75 72 73 6f 72 73 20 64 6f 65 73 20 74 68 65  Cursors does the
5fb0: 20 61 63 74 75 61 6c 20 77 6f 72 6b 20 6f 66 20   actual work of 
5fc0: 73 61 76 69 6e 67 0a 2a 2a 20 74 68 65 20 63 75  saving.** the cu
5fd0: 72 73 6f 72 73 20 69 66 20 61 6e 64 20 77 68 65  rsors if and whe
5fe0: 6e 20 61 20 63 75 72 73 6f 72 20 69 73 20 66 6f  n a cursor is fo
5ff0: 75 6e 64 20 74 68 61 74 20 61 63 74 75 61 6c 6c  und that actuall
6000: 79 20 72 65 71 75 69 72 65 73 20 73 61 76 69 6e  y requires savin
6010: 67 2e 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e  g..** The common
6020: 20 63 61 73 65 20 69 73 20 74 68 61 74 20 6e 6f   case is that no
6030: 20 63 75 72 73 6f 72 73 20 6e 65 65 64 20 74 6f   cursors need to
6040: 20 62 65 20 73 61 76 65 64 2c 20 73 6f 20 74 68   be saved, so th
6050: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a  is routine is.**
6060: 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d   broken out from
6070: 20 69 74 73 20 63 61 6c 6c 65 72 20 74 6f 20 61   its caller to a
6080: 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79  void unnecessary
6090: 20 73 74 61 63 6b 20 70 6f 69 6e 74 65 72 20 6d   stack pointer m
60a0: 6f 76 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  ovement..*/.stat
60b0: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f  ic int SQLITE_NO
60c0: 49 4e 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f  INLINE saveCurso
60d0: 72 73 4f 6e 4c 69 73 74 28 0a 20 20 42 74 43 75  rsOnList(.  BtCu
60e0: 72 73 6f 72 20 2a 70 2c 20 20 20 20 20 20 20 20  rsor *p,        
60f0: 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 63 75   /* The first cu
6100: 72 73 6f 72 20 74 68 61 74 20 6e 65 65 64 73 20  rsor that needs 
6110: 73 61 76 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f  saving */.  Pgno
6120: 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20   iRoot,         
6130: 20 2f 2a 20 4f 6e 6c 79 20 73 61 76 65 20 63 75   /* Only save cu
6140: 72 73 6f 72 20 77 69 74 68 20 74 68 69 73 20 69  rsor with this i
6150: 52 6f 6f 74 2e 20 53 61 76 65 20 61 6c 6c 20 69  Root. Save all i
6160: 66 20 7a 65 72 6f 20 2a 2f 0a 20 20 42 74 43 75  f zero */.  BtCu
6170: 72 73 6f 72 20 2a 70 45 78 63 65 70 74 20 20 20  rsor *pExcept   
6180: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 61 76 65 20   /* Do not save 
6190: 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 29  this cursor */.)
61a0: 7b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20  {.  do{.    if( 
61b0: 70 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30  p!=pExcept && (0
61c0: 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67  ==iRoot || p->pg
61d0: 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29  noRoot==iRoot) )
61e0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65  {.      if( p->e
61f0: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
6200: 4c 49 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65  LID || p->eState
6210: 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58  ==CURSOR_SKIPNEX
6220: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  T ){.        int
6230: 20 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72   rc = saveCursor
6240: 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20  Position(p);.   
6250: 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
6260: 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20  OK!=rc ){.      
6270: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
6280: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
6290: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65  else{.        te
62a0: 73 74 63 61 73 65 28 20 70 2d 3e 69 50 61 67 65  stcase( p->iPage
62b0: 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 62 74  >0 );.        bt
62c0: 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72  reeReleaseAllCur
62d0: 73 6f 72 50 61 67 65 73 28 70 29 3b 0a 20 20 20  sorPages(p);.   
62e0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
62f0: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
6300: 77 68 69 6c 65 28 20 70 20 29 3b 0a 20 20 72 65  while( p );.  re
6310: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6320: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74  }../*.** Clear t
6330: 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f  he current curso
6340: 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76  r position..*/.v
6350: 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
6360: 43 6c 65 61 72 43 75 72 73 6f 72 28 42 74 43 75  ClearCursor(BtCu
6370: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
6380: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
6390: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
63a0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
63b0: 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70  pCur->pKey);.  p
63c0: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20  Cur->pKey = 0;. 
63d0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
63e0: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
63f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73  }../*.** In this
6400: 20 76 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65   version of Btre
6410: 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73  eMoveto, pKey is
6420: 20 61 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20   a packed index 
6430: 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61  record.** such a
6440: 73 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62  s is generated b
6450: 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63  y the OP_MakeRec
6460: 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70  ord opcode.  Unp
6470: 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72  ack the.** recor
6480: 64 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20  d and then call 
6490: 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63  BtreeMovetoUnpac
64a0: 6b 65 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20  ked() to do the 
64b0: 77 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  work..*/.static 
64c0: 69 6e 74 20 62 74 72 65 65 4d 6f 76 65 74 6f 28  int btreeMoveto(
64d0: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
64e0: 72 2c 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  r,     /* Cursor
64f0: 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72   open on the btr
6500: 65 65 20 74 6f 20 62 65 20 73 65 61 72 63 68 65  ee to be searche
6510: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  d */.  const voi
6520: 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61  d *pKey,   /* Pa
6530: 63 6b 65 64 20 6b 65 79 20 69 66 20 74 68 65 20  cked key if the 
6540: 62 74 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65  btree is an inde
6550: 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c  x */.  i64 nKey,
6560: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
6570: 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61  teger key for ta
6580: 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70  bles.  Size of p
6590: 4b 65 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20  Key for indices 
65a0: 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20  */.  int bias,  
65b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73           /* Bias
65c0: 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68   search to the h
65d0: 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74  igh end */.  int
65e0: 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20   *pRes          
65f0: 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68   /* Write search
6600: 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
6610: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
6620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6630: 20 2f 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20   /* Status code 
6640: 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
6650: 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20  ord *pIdxKey;   
6660: 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65  /* Unpacked inde
6670: 78 20 6b 65 79 20 2a 2f 0a 20 20 63 68 61 72 20  x key */.  char 
6680: 61 53 70 61 63 65 5b 32 30 30 5d 3b 20 20 20 20  aSpace[200];    
6690: 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 70        /* Temp sp
66a0: 61 63 65 20 66 6f 72 20 70 49 64 78 4b 65 79 20  ace for pIdxKey 
66b0: 2d 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 61 6c  - to avoid a mal
66c0: 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70  loc */.  char *p
66d0: 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28  Free = 0;..  if(
66e0: 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 73 73   pKey ){.    ass
66f0: 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29  ert( nKey==(i64)
6700: 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20  (int)nKey );.   
6710: 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74   pIdxKey = sqlit
6720: 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63  e3VdbeAllocUnpac
6730: 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 20 20 20  kedRecord(.     
6740: 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66     pCur->pKeyInf
6750: 6f 2c 20 61 53 70 61 63 65 2c 20 73 69 7a 65 6f  o, aSpace, sizeo
6760: 66 28 61 53 70 61 63 65 29 2c 20 26 70 46 72 65  f(aSpace), &pFre
6770: 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  e.    );.    if(
6780: 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20 72 65   pIdxKey==0 ) re
6790: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
67a0: 4d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  M;.    sqlite3Vd
67b0: 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70  beRecordUnpack(p
67c0: 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28  Cur->pKeyInfo, (
67d0: 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 20  int)nKey, pKey, 
67e0: 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 69 66  pIdxKey);.    if
67f0: 28 20 70 49 64 78 4b 65 79 2d 3e 6e 46 69 65 6c  ( pIdxKey->nFiel
6800: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  d==0 ){.      sq
6810: 6c 69 74 65 33 44 62 46 72 65 65 28 70 43 75 72  lite3DbFree(pCur
6820: 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20  ->pKeyInfo->db, 
6830: 70 46 72 65 65 29 3b 0a 20 20 20 20 20 20 72 65  pFree);.      re
6840: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
6850: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
6860: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64    }else{.    pId
6870: 78 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  xKey = 0;.  }.  
6880: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
6890: 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28  eMovetoUnpacked(
68a0: 70 43 75 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e  pCur, pIdxKey, n
68b0: 4b 65 79 2c 20 62 69 61 73 2c 20 70 52 65 73 29  Key, bias, pRes)
68c0: 3b 0a 20 20 69 66 28 20 70 46 72 65 65 20 29 7b  ;.  if( pFree ){
68d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
68e0: 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  ee(pCur->pKeyInf
68f0: 6f 2d 3e 64 62 2c 20 70 46 72 65 65 29 3b 0a 20  o->db, pFree);. 
6900: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
6910: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65  }../*.** Restore
6920: 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
6930: 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77  he position it w
6940: 61 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f  as in (or as clo
6950: 73 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c  se to as possibl
6960: 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43  e).** when saveC
6970: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20  ursorPosition() 
6980: 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65  was called. Note
6990: 20 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20   that this call 
69a0: 64 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20  deletes the .** 
69b0: 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69  saved position i
69c0: 6e 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61  nfo stored by sa
69d0: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
69e0: 28 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e  (), so there can
69f0: 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f   be.** at most o
6a00: 6e 65 20 65 66 66 65 63 74 69 76 65 20 72 65 73  ne effective res
6a10: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
6a20: 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20  on() call after 
6a30: 65 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72  each .** saveCur
6a40: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a  sorPosition()..*
6a50: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
6a60: 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50  eeRestoreCursorP
6a70: 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72  osition(BtCursor
6a80: 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72   *pCur){.  int r
6a90: 63 3b 0a 20 20 69 6e 74 20 73 6b 69 70 4e 65 78  c;.  int skipNex
6aa0: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  t;.  assert( cur
6ab0: 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
6ac0: 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
6ad0: 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e  t( pCur->eState>
6ae0: 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53  =CURSOR_REQUIRES
6af0: 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75  EEK );.  if( pCu
6b00: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
6b10: 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72  R_FAULT ){.    r
6b20: 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70  eturn pCur->skip
6b30: 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72  Next;.  }.  pCur
6b40: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
6b50: 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20  R_INVALID;.  rc 
6b60: 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 70 43  = btreeMoveto(pC
6b70: 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20  ur, pCur->pKey, 
6b80: 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26  pCur->nKey, 0, &
6b90: 73 6b 69 70 4e 65 78 74 29 3b 0a 20 20 69 66 28  skipNext);.  if(
6ba0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
6bb0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
6bc0: 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a  ee(pCur->pKey);.
6bd0: 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d      pCur->pKey =
6be0: 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
6bf0: 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
6c00: 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43  RSOR_VALID || pC
6c10: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
6c20: 4f 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20  OR_INVALID );.  
6c30: 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
6c40: 20 7c 3d 20 73 6b 69 70 4e 65 78 74 3b 0a 20 20   |= skipNext;.  
6c50: 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
6c60: 4e 65 78 74 20 26 26 20 70 43 75 72 2d 3e 65 53  Next && pCur->eS
6c70: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
6c80: 49 44 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72  ID ){.      pCur
6c90: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
6ca0: 52 5f 53 4b 49 50 4e 45 58 54 3b 0a 20 20 20 20  R_SKIPNEXT;.    
6cb0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
6cc0: 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65  c;.}..#define re
6cd0: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
6ce0: 69 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65  ion(p) \.  (p->e
6cf0: 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45  State>=CURSOR_RE
6d00: 51 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20  QUIRESEEK ? \.  
6d10: 20 20 20 20 20 20 20 62 74 72 65 65 52 65 73 74         btreeRest
6d20: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
6d30: 6e 28 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20  n(p) : \.       
6d40: 20 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a    SQLITE_OK)../*
6d50: 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68  .** Determine wh
6d60: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63  ether or not a c
6d70: 75 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20  ursor has moved 
6d80: 66 72 6f 6d 20 74 68 65 20 70 6f 73 69 74 69 6f  from the positio
6d90: 6e 20 77 68 65 72 65 0a 2a 2a 20 69 74 20 77 61  n where.** it wa
6da0: 73 20 6c 61 73 74 20 70 6c 61 63 65 64 2c 20 6f  s last placed, o
6db0: 72 20 68 61 73 20 62 65 65 6e 20 69 6e 76 61 6c  r has been inval
6dc0: 69 64 61 74 65 64 20 66 6f 72 20 61 6e 79 20 6f  idated for any o
6dd0: 74 68 65 72 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20  ther reason..** 
6de0: 43 75 72 73 6f 72 73 20 63 61 6e 20 6d 6f 76 65  Cursors can move
6df0: 20 77 68 65 6e 20 74 68 65 20 72 6f 77 20 74 68   when the row th
6e00: 65 79 20 61 72 65 20 70 6f 69 6e 74 69 6e 67 20  ey are pointing 
6e10: 61 74 20 69 73 20 64 65 6c 65 74 65 64 20 6f 75  at is deleted ou
6e20: 74 0a 2a 2a 20 66 72 6f 6d 20 75 6e 64 65 72 20  t.** from under 
6e30: 74 68 65 6d 2c 20 66 6f 72 20 65 78 61 6d 70 6c  them, for exampl
6e40: 65 2e 20 20 43 75 72 73 6f 72 20 6d 69 67 68 74  e.  Cursor might
6e50: 20 61 6c 73 6f 20 6d 6f 76 65 20 69 66 20 61 20   also move if a 
6e60: 62 74 72 65 65 0a 2a 2a 20 69 73 20 72 65 62 61  btree.** is reba
6e70: 6c 61 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61  lanced..**.** Ca
6e80: 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
6e90: 6e 65 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 63  ne with a NULL c
6ea0: 75 72 73 6f 72 20 70 6f 69 6e 74 65 72 20 72 65  ursor pointer re
6eb0: 74 75 72 6e 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a  turns false..**.
6ec0: 2a 2a 20 55 73 65 20 74 68 65 20 73 65 70 61 72  ** Use the separ
6ed0: 61 74 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  ate sqlite3Btree
6ee0: 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 29 20  CursorRestore() 
6ef0: 72 6f 75 74 69 6e 65 20 74 6f 20 72 65 73 74 6f  routine to resto
6f00: 72 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 62  re a cursor.** b
6f10: 61 63 6b 20 74 6f 20 77 68 65 72 65 20 69 74 20  ack to where it 
6f20: 6f 75 67 68 74 20 74 6f 20 62 65 20 69 66 20 74  ought to be if t
6f30: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
6f40: 72 6e 73 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74  rns true..*/.int
6f50: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
6f60: 73 6f 72 48 61 73 4d 6f 76 65 64 28 42 74 43 75  sorHasMoved(BtCu
6f70: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72  rsor *pCur){.  r
6f80: 65 74 75 72 6e 20 70 43 75 72 2d 3e 65 53 74 61  eturn pCur->eSta
6f90: 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
6fa0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
6fb0: 72 6f 75 74 69 6e 65 20 72 65 73 74 6f 72 65 73  routine restores
6fc0: 20 61 20 63 75 72 73 6f 72 20 62 61 63 6b 20 74   a cursor back t
6fd0: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 70  o its original p
6fe0: 6f 73 69 74 69 6f 6e 20 61 66 74 65 72 20 69 74  osition after it
6ff0: 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 76  .** has been mov
7000: 65 64 20 62 79 20 73 6f 6d 65 20 6f 75 74 73 69  ed by some outsi
7010: 64 65 20 61 63 74 69 76 69 74 79 20 28 73 75 63  de activity (suc
7020: 68 20 61 73 20 61 20 62 74 72 65 65 20 72 65 62  h as a btree reb
7030: 61 6c 61 6e 63 65 20 6f 72 0a 2a 2a 20 61 20 72  alance or.** a r
7040: 6f 77 20 68 61 76 69 6e 67 20 62 65 65 6e 20 64  ow having been d
7050: 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20  eleted out from 
7060: 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72  under the cursor
7070: 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75  ).  .**.** On su
7080: 63 63 65 73 73 2c 20 74 68 65 20 2a 70 44 69 66  ccess, the *pDif
7090: 66 65 72 65 6e 74 52 6f 77 20 70 61 72 61 6d 65  ferentRow parame
70a0: 74 65 72 20 69 73 20 66 61 6c 73 65 20 69 66 20  ter is false if 
70b0: 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  the cursor is le
70c0: 66 74 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 61  ft.** pointing a
70d0: 74 20 65 78 61 63 74 6c 79 20 74 68 65 20 73 61  t exactly the sa
70e0: 6d 65 20 72 6f 77 2e 20 20 2a 70 44 69 66 66 65  me row.  *pDiffe
70f0: 72 6e 74 52 6f 77 20 69 73 20 74 68 65 20 72 6f  rntRow is the ro
7100: 77 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  w the cursor.** 
7110: 77 61 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  was pointing to 
7120: 68 61 73 20 62 65 65 6e 20 64 65 6c 65 74 65 64  has been deleted
7130: 2c 20 66 6f 72 63 69 6e 67 20 74 68 65 20 63 75  , forcing the cu
7140: 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f  rsor to point to
7150: 20 73 6f 6d 65 0a 2a 2a 20 6e 65 61 72 62 79 20   some.** nearby 
7160: 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  row..**.** This 
7170: 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f  routine should o
7180: 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 66 6f  nly be called fo
7190: 72 20 61 20 63 75 72 73 6f 72 20 74 68 61 74 20  r a cursor that 
71a0: 6a 75 73 74 20 72 65 74 75 72 6e 65 64 0a 2a 2a  just returned.**
71b0: 20 54 52 55 45 20 66 72 6f 6d 20 73 71 6c 69 74   TRUE from sqlit
71c0: 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73  e3BtreeCursorHas
71d0: 4d 6f 76 65 64 28 29 2e 0a 2a 2f 0a 69 6e 74 20  Moved()..*/.int 
71e0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
71f0: 6f 72 52 65 73 74 6f 72 65 28 42 74 43 75 72 73  orRestore(BtCurs
7200: 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
7210: 44 69 66 66 65 72 65 6e 74 52 6f 77 29 7b 0a 20  DifferentRow){. 
7220: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
7230: 72 74 28 20 70 43 75 72 21 3d 30 20 29 3b 0a 20  rt( pCur!=0 );. 
7240: 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
7250: 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
7260: 4c 49 44 20 29 3b 0a 20 20 72 63 20 3d 20 72 65  LID );.  rc = re
7270: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
7280: 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
7290: 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 44 69 66   rc ){.    *pDif
72a0: 66 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20  ferentRow = 1;. 
72b0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
72c0: 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  }.  if( pCur->eS
72d0: 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
72e0: 49 44 20 29 7b 0a 20 20 20 20 2a 70 44 69 66 66  ID ){.    *pDiff
72f0: 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20  erentRow = 1;.  
7300: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
7310: 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  t( pCur->skipNex
7320: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70 44 69  t==0 );.    *pDi
7330: 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 30 3b 0a  fferentRow = 0;.
7340: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
7350: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65  ITE_OK;.}..#ifde
7360: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
7370: 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a  CURSOR_HINTS./*.
7380: 2a 2a 20 50 72 6f 76 69 64 65 20 68 69 6e 74 73  ** Provide hints
7390: 20 74 6f 20 74 68 65 20 63 75 72 73 6f 72 2e 20   to the cursor. 
73a0: 20 54 68 65 20 70 61 72 74 69 63 75 6c 61 72 20   The particular 
73b0: 68 69 6e 74 20 67 69 76 65 6e 20 28 61 6e 64 20  hint given (and 
73c0: 74 68 65 20 74 79 70 65 0a 2a 2a 20 61 6e 64 20  the type.** and 
73d0: 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 76 61  number of the va
73e0: 72 61 72 67 73 20 70 61 72 61 6d 65 74 65 72 73  rargs parameters
73f0: 29 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  ) is determined 
7400: 62 79 20 74 68 65 20 65 48 69 6e 74 54 79 70 65  by the eHintType
7410: 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 2e 20 20  .** parameter.  
7420: 53 65 65 20 74 68 65 20 64 65 66 69 6e 69 74 69  See the definiti
7430: 6f 6e 73 20 6f 66 20 74 68 65 20 42 54 52 45 45  ons of the BTREE
7440: 5f 48 49 4e 54 5f 2a 20 6d 61 63 72 6f 73 20 66  _HINT_* macros f
7450: 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 76  or details..*/.v
7460: 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
7470: 43 75 72 73 6f 72 48 69 6e 74 28 42 74 43 75 72  CursorHint(BtCur
7480: 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 65  sor *pCur, int e
7490: 48 69 6e 74 54 79 70 65 2c 20 2e 2e 2e 29 7b 0a  HintType, ...){.
74a0: 20 20 2f 2a 20 55 73 65 64 20 6f 6e 6c 79 20 62    /* Used only b
74b0: 79 20 73 79 73 74 65 6d 20 74 68 61 74 20 73 75  y system that su
74c0: 62 73 74 69 74 75 74 65 20 74 68 65 69 72 20 6f  bstitute their o
74d0: 77 6e 20 73 74 6f 72 61 67 65 20 65 6e 67 69 6e  wn storage engin
74e0: 65 20 2a 2f 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  e */.}.#endif../
74f0: 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20 66 6c 61  *.** Provide fla
7500: 67 20 68 69 6e 74 73 20 74 6f 20 74 68 65 20 63  g hints to the c
7510: 75 72 73 6f 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ursor..*/.void s
7520: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
7530: 72 48 69 6e 74 46 6c 61 67 73 28 42 74 43 75 72  rHintFlags(BtCur
7540: 73 6f 72 20 2a 70 43 75 72 2c 20 75 6e 73 69 67  sor *pCur, unsig
7550: 6e 65 64 20 78 29 7b 0a 20 20 61 73 73 65 72 74  ned x){.  assert
7560: 28 20 78 3d 3d 42 54 52 45 45 5f 53 45 45 4b 5f  ( x==BTREE_SEEK_
7570: 45 51 20 7c 7c 20 78 3d 3d 42 54 52 45 45 5f 42  EQ || x==BTREE_B
7580: 55 4c 4b 4c 4f 41 44 20 7c 7c 20 78 3d 3d 30 20  ULKLOAD || x==0 
7590: 29 3b 0a 20 20 70 43 75 72 2d 3e 68 69 6e 74 73  );.  pCur->hints
75a0: 20 3d 20 78 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65   = x;.}...#ifnde
75b0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
75c0: 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47  TOVACUUM./*.** G
75d0: 69 76 65 6e 20 61 20 70 61 67 65 20 6e 75 6d 62  iven a page numb
75e0: 65 72 20 6f 66 20 61 20 72 65 67 75 6c 61 72 20  er of a regular 
75f0: 64 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 72  database page, r
7600: 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 0a 2a  eturn the page.*
7610: 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  * number for the
7620: 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
7630: 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
7640: 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68  the entry for th
7650: 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67 65 20  e.** input page 
7660: 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65  number..**.** Re
7670: 74 75 72 6e 20 30 20 28 6e 6f 74 20 61 20 76 61  turn 0 (not a va
7680: 6c 69 64 20 70 61 67 65 29 20 66 6f 72 20 70 67  lid page) for pg
7690: 6e 6f 3d 3d 31 20 73 69 6e 63 65 20 74 68 65 72  no==1 since ther
76a0: 65 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f 69 6e 74  e is.** no point
76b0: 65 72 20 6d 61 70 20 61 73 73 6f 63 69 61 74 65  er map associate
76c0: 64 20 77 69 74 68 20 70 61 67 65 20 31 2e 20 20  d with page 1.  
76d0: 54 68 65 20 69 6e 74 65 67 72 69 74 79 5f 63 68  The integrity_ch
76e0: 65 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20 72 65 71  eck logic.** req
76f0: 75 69 72 65 73 20 74 68 61 74 20 70 74 72 6d 61  uires that ptrma
7700: 70 50 61 67 65 6e 6f 28 2a 2c 31 29 21 3d 31 2e  pPageno(*,1)!=1.
7710: 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20  .*/.static Pgno 
7720: 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 42 74 53  ptrmapPageno(BtS
7730: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
7740: 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50   pgno){.  int nP
7750: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a  agesPerMapPage;.
7760: 20 20 50 67 6e 6f 20 69 50 74 72 4d 61 70 2c 20    Pgno iPtrMap, 
7770: 72 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ret;.  assert( s
7780: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
7790: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
77a0: 0a 20 20 69 66 28 20 70 67 6e 6f 3c 32 20 29 20  .  if( pgno<2 ) 
77b0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 50 61 67  return 0;.  nPag
77c0: 65 73 50 65 72 4d 61 70 50 61 67 65 20 3d 20 28  esPerMapPage = (
77d0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
77e0: 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70 20  5)+1;.  iPtrMap 
77f0: 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65  = (pgno-2)/nPage
7800: 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 72  sPerMapPage;.  r
7810: 65 74 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50  et = (iPtrMap*nP
7820: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 29 20  agesPerMapPage) 
7830: 2b 20 32 3b 20 0a 20 20 69 66 28 20 72 65 74 3d  + 2; .  if( ret=
7840: 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
7850: 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72  GE(pBt) ){.    r
7860: 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  et++;.  }.  retu
7870: 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn ret;.}../*.**
7880: 20 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20   Write an entry 
7890: 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  into the pointer
78a0: 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   map..**.** This
78b0: 20 72 6f 75 74 69 6e 65 20 75 70 64 61 74 65 73   routine updates
78c0: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
78d0: 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20   entry for page 
78e0: 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20  number 'key'.** 
78f0: 73 6f 20 74 68 61 74 20 69 74 20 6d 61 70 73 20  so that it maps 
7900: 74 6f 20 74 79 70 65 20 27 65 54 79 70 65 27 20  to type 'eType' 
7910: 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20  and parent page 
7920: 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a  number 'pgno'..*
7930: 2a 0a 2a 2a 20 49 66 20 2a 70 52 43 20 69 73 20  *.** If *pRC is 
7940: 69 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65  initially non-ze
7950: 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54 45 5f 4f  ro (non-SQLITE_O
7960: 4b 29 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  K) then this rou
7970: 74 69 6e 65 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d  tine is.** a no-
7980: 6f 70 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72  op.  If an error
7990: 20 6f 63 63 75 72 73 2c 20 74 68 65 20 61 70 70   occurs, the app
79a0: 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
79b0: 6f 64 65 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  ode is written.*
79c0: 2a 20 69 6e 74 6f 20 2a 70 52 43 2e 0a 2a 2f 0a  * into *pRC..*/.
79d0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d  static void ptrm
79e0: 61 70 50 75 74 28 42 74 53 68 61 72 65 64 20 2a  apPut(BtShared *
79f0: 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75  pBt, Pgno key, u
7a00: 38 20 65 54 79 70 65 2c 20 50 67 6e 6f 20 70 61  8 eType, Pgno pa
7a10: 72 65 6e 74 2c 20 69 6e 74 20 2a 70 52 43 29 7b  rent, int *pRC){
7a20: 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
7a30: 67 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e  ge;  /* The poin
7a40: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
7a50: 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20    u8 *pPtrmap;  
7a60: 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
7a70: 65 72 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20  er map data */. 
7a80: 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20   Pgno iPtrmap;  
7a90: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
7aa0: 72 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65  r map page numbe
7ab0: 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65  r */.  int offse
7ac0: 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73  t;       /* Offs
7ad0: 65 74 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61  et in pointer ma
7ae0: 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  p page */.  int 
7af0: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  rc;           /*
7b00: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f   Return code fro
7b10: 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a  m subfunctions *
7b20: 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20  /..  if( *pRC ) 
7b30: 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72  return;..  asser
7b40: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
7b50: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
7b60: 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61  ) );.  /* The ma
7b70: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67  ster-journal pag
7b80: 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 6e 65  e number must ne
7b90: 76 65 72 20 62 65 20 75 73 65 64 20 61 73 20 61  ver be used as a
7ba0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
7bb0: 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30  e */.  assert( 0
7bc0: 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ==PTRMAP_ISPAGE(
7bd0: 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  pBt, PENDING_BYT
7be0: 45 5f 50 41 47 45 28 70 42 74 29 29 20 29 3b 0a  E_PAGE(pBt)) );.
7bf0: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
7c00: 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20  autoVacuum );.  
7c10: 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20  if( key==0 ){.  
7c20: 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f    *pRC = SQLITE_
7c30: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
7c40: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
7c50: 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50  iPtrmap = PTRMAP
7c60: 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79  _PAGENO(pBt, key
7c70: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
7c80: 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
7c90: 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20  Pager, iPtrmap, 
7ca0: 26 70 44 62 50 61 67 65 2c 20 30 29 3b 0a 20 20  &pDbPage, 0);.  
7cb0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
7cc0: 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  K ){.    *pRC = 
7cd0: 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  rc;.    return;.
7ce0: 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 50    }.  offset = P
7cf0: 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28  TRMAP_PTROFFSET(
7d00: 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20  iPtrmap, key);. 
7d10: 20 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b   if( offset<0 ){
7d20: 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49  .    *pRC = SQLI
7d30: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
7d40: 0a 20 20 20 20 67 6f 74 6f 20 70 74 72 6d 61 70  .    goto ptrmap
7d50: 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 61 73 73  _exit;.  }.  ass
7d60: 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28  ert( offset <= (
7d70: 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  int)pBt->usableS
7d80: 69 7a 65 2d 35 20 29 3b 0a 20 20 70 50 74 72 6d  ize-5 );.  pPtrm
7d90: 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74  ap = (u8 *)sqlit
7da0: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
7db0: 44 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28 20  DbPage);..  if( 
7dc0: 65 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f  eType!=pPtrmap[o
7dd0: 66 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62 79  ffset] || get4by
7de0: 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73  te(&pPtrmap[offs
7df0: 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20 29  et+1])!=parent )
7e00: 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22 50 54  {.    TRACE(("PT
7e10: 52 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64 2d  RMAP_UPDATE: %d-
7e20: 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79  >(%d,%d)\n", key
7e30: 2c 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74 29  , eType, parent)
7e40: 29 3b 0a 20 20 20 20 2a 70 52 43 3d 20 72 63 20  );.    *pRC= rc 
7e50: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
7e60: 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ite(pDbPage);.  
7e70: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
7e80: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 74  _OK ){.      pPt
7e90: 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65  rmap[offset] = e
7ea0: 54 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74 34  Type;.      put4
7eb0: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
7ec0: 66 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29  fset+1], parent)
7ed0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 70 74 72  ;.    }.  }..ptr
7ee0: 6d 61 70 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69  map_exit:.  sqli
7ef0: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
7f00: 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  bPage);.}../*.**
7f10: 20 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20 66   Read an entry f
7f20: 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72 20  rom the pointer 
7f30: 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  map..**.** This 
7f40: 72 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76 65  routine retrieve
7f50: 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  s the pointer ma
7f60: 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65  p entry for page
7f70: 20 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67 0a   'key', writing.
7f80: 2a 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  ** the type and 
7f90: 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62  parent page numb
7fa0: 65 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61 6e  er to *pEType an
7fb0: 64 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63 74  d *pPgno respect
7fc0: 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72  ively..** An err
7fd0: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
7fe0: 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67  ned if something
7ff0: 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68   goes wrong, oth
8000: 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b  erwise SQLITE_OK
8010: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8020: 70 74 72 6d 61 70 47 65 74 28 42 74 53 68 61 72  ptrmapGet(BtShar
8030: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65  ed *pBt, Pgno ke
8040: 79 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20 50  y, u8 *pEType, P
8050: 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44  gno *pPgno){.  D
8060: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20  bPage *pDbPage; 
8070: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
8080: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69   map page */.  i
8090: 6e 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20  nt iPtrmap;     
80a0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
80b0: 20 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20   page index */. 
80c0: 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20   u8 *pPtrmap;   
80d0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
80e0: 61 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  ap page data */.
80f0: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
8100: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
8110: 66 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74  f entry in point
8120: 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20  er map */.  int 
8130: 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
8140: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
8150: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
8160: 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54  ..  iPtrmap = PT
8170: 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
8180: 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71   key);.  rc = sq
8190: 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
81a0: 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d  t->pPager, iPtrm
81b0: 61 70 2c 20 26 70 44 62 50 61 67 65 2c 20 30 29  ap, &pDbPage, 0)
81c0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b  ;.  if( rc!=0 ){
81d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
81e0: 20 20 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d 20    }.  pPtrmap = 
81f0: 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67  (u8 *)sqlite3Pag
8200: 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
8210: 65 29 3b 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20  e);..  offset = 
8220: 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54  PTRMAP_PTROFFSET
8230: 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a  (iPtrmap, key);.
8240: 20 20 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29    if( offset<0 )
8250: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  {.    sqlite3Pag
8260: 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
8270: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
8280: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
8290: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
82a0: 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29 70  offset <= (int)p
82b0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35  Bt->usableSize-5
82c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
82d0: 54 79 70 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45  Type!=0 );.  *pE
82e0: 54 79 70 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f  Type = pPtrmap[o
82f0: 66 66 73 65 74 5d 3b 0a 20 20 69 66 28 20 70 50  ffset];.  if( pP
8300: 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67  gno ) *pPgno = g
8310: 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70  et4byte(&pPtrmap
8320: 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20  [offset+1]);..  
8330: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
8340: 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  f(pDbPage);.  if
8350: 28 20 2a 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a  ( *pEType<1 || *
8360: 70 45 54 79 70 65 3e 35 20 29 20 72 65 74 75 72  pEType>5 ) retur
8370: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
8380: 5f 42 4b 50 54 3b 0a 20 20 72 65 74 75 72 6e 20  _BKPT;.  return 
8390: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65  SQLITE_OK;.}..#e
83a0: 6c 73 65 20 2f 2a 20 69 66 20 64 65 66 69 6e 65  lse /* if define
83b0: 64 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  d SQLITE_OMIT_AU
83c0: 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64  TOVACUUM */.  #d
83d0: 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74 28  efine ptrmapPut(
83e0: 77 2c 78 2c 79 2c 7a 2c 72 63 29 0a 20 20 23 64  w,x,y,z,rc).  #d
83f0: 65 66 69 6e 65 20 70 74 72 6d 61 70 47 65 74 28  efine ptrmapGet(
8400: 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f  w,x,y,z) SQLITE_
8410: 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72  OK.  #define ptr
8420: 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 78 2c  mapPutOvflPtr(x,
8430: 20 79 2c 20 72 63 29 0a 23 65 6e 64 69 66 0a 0a   y, rc).#endif..
8440: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62 74  /*.** Given a bt
8450: 72 65 65 20 70 61 67 65 20 61 6e 64 20 61 20 63  ree page and a c
8460: 65 6c 6c 20 69 6e 64 65 78 20 28 30 20 6d 65 61  ell index (0 mea
8470: 6e 73 20 74 68 65 20 66 69 72 73 74 20 63 65 6c  ns the first cel
8480: 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65  l on.** the page
8490: 2c 20 31 20 6d 65 61 6e 73 20 74 68 65 20 73 65  , 1 means the se
84a0: 63 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73  cond cell, and s
84b0: 6f 20 66 6f 72 74 68 29 20 72 65 74 75 72 6e 20  o forth) return 
84c0: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
84d0: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
84e0: 2e 0a 2a 2a 0a 2a 2a 20 66 69 6e 64 43 65 6c 6c  ..**.** findCell
84f0: 50 61 73 74 50 74 72 28 29 20 64 6f 65 73 20 74  PastPtr() does t
8500: 68 65 20 73 61 6d 65 20 65 78 63 65 70 74 20 69  he same except i
8510: 74 20 73 6b 69 70 73 20 70 61 73 74 20 74 68 65  t skips past the
8520: 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 34 2d 62 79   initial.** 4-by
8530: 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  te child pointer
8540: 20 66 6f 75 6e 64 20 6f 6e 20 69 6e 74 65 72 69   found on interi
8550: 6f 72 20 70 61 67 65 73 2c 20 69 66 20 74 68 65  or pages, if the
8560: 72 65 20 69 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a  re is one..**.**
8570: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f   This routine wo
8580: 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67  rks only for pag
8590: 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63  es that do not c
85a0: 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20  ontain overflow 
85b0: 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  cells..*/.#defin
85c0: 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20  e findCell(P,I) 
85d0: 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61 20  \.  ((P)->aData 
85e0: 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65  + ((P)->maskPage
85f0: 20 26 20 67 65 74 32 62 79 74 65 41 6c 69 67 6e   & get2byteAlign
8600: 65 64 28 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64  ed(&(P)->aCellId
8610: 78 5b 32 2a 28 49 29 5d 29 29 29 0a 23 64 65 66  x[2*(I)]))).#def
8620: 69 6e 65 20 66 69 6e 64 43 65 6c 6c 50 61 73 74  ine findCellPast
8630: 50 74 72 28 50 2c 49 29 20 5c 0a 20 20 28 28 50  Ptr(P,I) \.  ((P
8640: 29 2d 3e 61 44 61 74 61 4f 66 73 74 20 2b 20 28  )->aDataOfst + (
8650: 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20  (P)->maskPage & 
8660: 67 65 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28  get2byteAligned(
8670: 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32  &(P)->aCellIdx[2
8680: 2a 28 49 29 5d 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a  *(I)]))).../*.**
8690: 20 54 68 69 73 20 69 73 20 63 6f 6d 6d 6f 6e 20   This is common 
86a0: 74 61 69 6c 20 70 72 6f 63 65 73 73 69 6e 67 20  tail processing 
86b0: 66 6f 72 20 62 74 72 65 65 50 61 72 73 65 43 65  for btreeParseCe
86c0: 6c 6c 50 74 72 28 29 20 61 6e 64 0a 2a 2a 20 62  llPtr() and.** b
86d0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
86e0: 49 6e 64 65 78 28 29 20 66 6f 72 20 74 68 65 20  Index() for the 
86f0: 63 61 73 65 20 77 68 65 6e 20 74 68 65 20 63 65  case when the ce
8700: 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 66 69 74 20  ll does not fit 
8710: 65 6e 74 69 72 65 6c 79 0a 2a 2a 20 6f 6e 20 61  entirely.** on a
8720: 20 73 69 6e 67 6c 65 20 42 2d 74 72 65 65 20 70   single B-tree p
8730: 61 67 65 2e 20 20 4d 61 6b 65 20 6e 65 63 65 73  age.  Make neces
8740: 73 61 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 73  sary adjustments
8750: 20 74 6f 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f   to the CellInfo
8760: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  .** structure..*
8770: 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
8780: 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 62 74  NOINLINE void bt
8790: 72 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75  reeParseCellAdju
87a0: 73 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f  stSizeForOverflo
87b0: 77 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  w(.  MemPage *pP
87c0: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
87d0: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
87e0: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  the cell */.  u8
87f0: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
8800: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
8810: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78   to the cell tex
8820: 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  t. */.  CellInfo
8830: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
8840: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
8850: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
8860: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79 6c    /* If the payl
8870: 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74  oad will not fit
8880: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74   completely on t
8890: 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77  he local page, w
88a0: 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64  e have.  ** to d
88b0: 65 63 69 64 65 20 68 6f 77 20 6d 75 63 68 20 74  ecide how much t
88c0: 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20  o store locally 
88d0: 61 6e 64 20 68 6f 77 20 6d 75 63 68 20 74 6f 20  and how much to 
88e0: 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20 2a 2a 20  spill onto.  ** 
88f0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
8900: 20 54 68 65 20 73 74 72 61 74 65 67 79 20 69 73   The strategy is
8910: 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65   to minimize the
8920: 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65   amount of unuse
8930: 64 0a 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20  d.  ** space on 
8940: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77  overflow pages w
8950: 68 69 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65  hile keeping the
8960: 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c   amount of local
8970: 20 73 74 6f 72 61 67 65 0a 20 20 2a 2a 20 69 6e   storage.  ** in
8980: 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61   between minLoca
8990: 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a  l and maxLocal..
89a0: 20 20 2a 2a 0a 20 20 2a 2a 20 57 61 72 6e 69 6e    **.  ** Warnin
89b0: 67 3a 20 20 63 68 61 6e 67 69 6e 67 20 74 68 65  g:  changing the
89c0: 20 77 61 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   way overflow pa
89d0: 79 6c 6f 61 64 20 69 73 20 64 69 73 74 72 69 62  yload is distrib
89e0: 75 74 65 64 20 69 6e 20 61 6e 79 0a 20 20 2a 2a  uted in any.  **
89f0: 20 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74   way will result
8a00: 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69   in an incompati
8a10: 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e  ble file format.
8a20: 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 6d 69 6e 4c  .  */.  int minL
8a30: 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75  ocal;  /* Minimu
8a40: 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c  m amount of payl
8a50: 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79  oad held locally
8a60: 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 4c 6f 63   */.  int maxLoc
8a70: 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20  al;  /* Maximum 
8a80: 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
8a90: 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a  d held locally *
8aa0: 2f 0a 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b  /.  int surplus;
8ab0: 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70     /* Overflow p
8ac0: 61 79 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65  ayload available
8ad0: 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61   for local stora
8ae0: 67 65 20 2a 2f 0a 0a 20 20 6d 69 6e 4c 6f 63 61  ge */..  minLoca
8af0: 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f  l = pPage->minLo
8b00: 63 61 6c 3b 0a 20 20 6d 61 78 4c 6f 63 61 6c 20  cal;.  maxLocal 
8b10: 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  = pPage->maxLoca
8b20: 6c 3b 0a 20 20 73 75 72 70 6c 75 73 20 3d 20 6d  l;.  surplus = m
8b30: 69 6e 4c 6f 63 61 6c 20 2b 20 28 70 49 6e 66 6f  inLocal + (pInfo
8b40: 2d 3e 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e  ->nPayload - min
8b50: 4c 6f 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70  Local)%(pPage->p
8b60: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34  Bt->usableSize-4
8b70: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  );.  testcase( s
8b80: 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c  urplus==maxLocal
8b90: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
8ba0: 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61  surplus==maxLoca
8bb0: 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 73 75 72  l+1 );.  if( sur
8bc0: 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c  plus <= maxLocal
8bd0: 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   ){.    pInfo->n
8be0: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 73 75 72  Local = (u16)sur
8bf0: 70 6c 75 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  plus;.  }else{. 
8c00: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c     pInfo->nLocal
8c10: 20 3d 20 28 75 31 36 29 6d 69 6e 4c 6f 63 61 6c   = (u16)minLocal
8c20: 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e  ;.  }.  pInfo->n
8c30: 53 69 7a 65 20 3d 20 28 75 31 36 29 28 26 70 49  Size = (u16)(&pI
8c40: 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 5b 70 49  nfo->pPayload[pI
8c50: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 5d 20 2d 20 70  nfo->nLocal] - p
8c60: 43 65 6c 6c 29 20 2b 20 34 3b 0a 7d 0a 0a 2f 2a  Cell) + 4;.}../*
8c70: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
8c80: 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 69  g routines are i
8c90: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f  mplementations o
8ca0: 66 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 78 50  f the MemPage.xP
8cb0: 61 72 73 65 43 65 6c 6c 28 29 0a 2a 2a 20 6d 65  arseCell().** me
8cc0: 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 73  thod..**.** Pars
8cd0: 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  e a cell content
8ce0: 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20   block and fill 
8cf0: 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20  in the CellInfo 
8d00: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
8d10: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
8d20: 74 72 28 29 20 20 20 20 20 20 20 20 3d 3e 20 20  tr()        =>  
8d30: 20 74 61 62 6c 65 20 62 74 72 65 65 20 6c 65 61   table btree lea
8d40: 66 20 6e 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65  f nodes.** btree
8d50: 50 61 72 73 65 43 65 6c 6c 4e 6f 50 61 79 6c 6f  ParseCellNoPaylo
8d60: 61 64 28 29 20 20 3d 3e 20 20 20 74 61 62 6c 65  ad()  =>   table
8d70: 20 62 74 72 65 65 20 69 6e 74 65 72 6e 61 6c 20   btree internal 
8d80: 6e 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65 50 61  nodes.** btreePa
8d90: 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28  rseCellPtrIndex(
8da0: 29 20 20 20 3d 3e 20 20 20 69 6e 64 65 78 20 62  )   =>   index b
8db0: 74 72 65 65 20 6e 6f 64 65 73 0a 2a 2a 0a 2a 2a  tree nodes.**.**
8dc0: 20 54 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61   There is also a
8dd0: 20 77 72 61 70 70 65 72 20 66 75 6e 63 74 69 6f   wrapper functio
8de0: 6e 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  n btreeParseCell
8df0: 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f  () that works fo
8e00: 72 0a 2a 2a 20 61 6c 6c 20 4d 65 6d 50 61 67 65  r.** all MemPage
8e10: 20 74 79 70 65 73 20 61 6e 64 20 74 68 61 74 20   types and that 
8e20: 72 65 66 65 72 65 6e 63 65 73 20 74 68 65 20 63  references the c
8e30: 65 6c 6c 20 62 79 20 69 6e 64 65 78 20 72 61 74  ell by index rat
8e40: 68 65 72 20 74 68 61 6e 0a 2a 2a 20 62 79 20 70  her than.** by p
8e50: 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
8e60: 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73  c void btreePars
8e70: 65 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61  eCellPtrNoPayloa
8e80: 64 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  d(.  MemPage *pP
8e90: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
8ea0: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
8eb0: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  the cell */.  u8
8ec0: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
8ed0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
8ee0: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78   to the cell tex
8ef0: 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  t. */.  CellInfo
8f00: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
8f10: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
8f20: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
8f30: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8f40: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
8f50: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
8f60: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
8f70: 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 29 3b 0a 20  ge->leaf==0 );. 
8f80: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
8f90: 6e 6f 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 61  noPayload );.  a
8fa0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68  ssert( pPage->ch
8fb0: 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b  ildPtrSize==4 );
8fc0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
8fd0: 44 45 42 55 47 0a 20 20 55 4e 55 53 45 44 5f 50  DEBUG.  UNUSED_P
8fe0: 41 52 41 4d 45 54 45 52 28 70 50 61 67 65 29 3b  ARAMETER(pPage);
8ff0: 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e 66 6f 2d  .#endif.  pInfo-
9000: 3e 6e 53 69 7a 65 20 3d 20 34 20 2b 20 67 65 74  >nSize = 4 + get
9010: 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34 5d  Varint(&pCell[4]
9020: 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e  , (u64*)&pInfo->
9030: 6e 4b 65 79 29 3b 0a 20 20 70 49 6e 66 6f 2d 3e  nKey);.  pInfo->
9040: 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20  nPayload = 0;.  
9050: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
9060: 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79  0;.  pInfo->pPay
9070: 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 72 65 74 75  load = 0;.  retu
9080: 72 6e 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  rn;.}.static voi
9090: 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  d btreeParseCell
90a0: 50 74 72 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Ptr(.  MemPage *
90b0: 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f  pPage,         /
90c0: 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  * Page containin
90d0: 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  g the cell */.  
90e0: 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  u8 *pCell,      
90f0: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
9100: 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74  er to the cell t
9110: 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  ext. */.  CellIn
9120: 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20  fo *pInfo       
9130: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69    /* Fill in thi
9140: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29  s structure */.)
9150: 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 3b 20 20  {.  u8 *pIter;  
9160: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
9170: 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f  or scanning thro
9180: 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75  ugh pCell */.  u
9190: 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20  32 nPayload;    
91a0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
91b0: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c   of bytes of cel
91c0: 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75  l payload */.  u
91d0: 36 34 20 69 4b 65 79 3b 20 20 20 20 20 20 20 20  64 iKey;        
91e0: 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63         /* Extrac
91f0: 74 65 64 20 4b 65 79 20 76 61 6c 75 65 20 2a 2f  ted Key value */
9200: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
9210: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
9220: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
9230: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
9240: 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c  Page->leaf==0 ||
9250: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20   pPage->leaf==1 
9260: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
9270: 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 7c  ge->intKeyLeaf |
9280: 7c 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f  | pPage->noPaylo
9290: 61 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ad );.  assert( 
92a0: 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64  pPage->noPayload
92b0: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
92c0: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65   pPage->intKeyLe
92d0: 61 66 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  af );.  assert( 
92e0: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
92f0: 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65  ize==0 );.  pIte
9300: 72 20 3d 20 70 43 65 6c 6c 3b 0a 0a 20 20 2f 2a  r = pCell;..  /*
9310: 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20   The next block 
9320: 6f 66 20 63 6f 64 65 20 69 73 20 65 71 75 69 76  of code is equiv
9330: 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20  alent to:.  **. 
9340: 20 2a 2a 20 20 20 20 20 70 49 74 65 72 20 2b 3d   **     pIter +=
9350: 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 49 74   getVarint32(pIt
9360: 65 72 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20  er, nPayload);. 
9370: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 6f 64   **.  ** The cod
9380: 65 20 69 73 20 69 6e 6c 69 6e 65 64 20 74 6f 20  e is inlined to 
9390: 61 76 6f 69 64 20 61 20 66 75 6e 63 74 69 6f 6e  avoid a function
93a0: 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 6e 50   call..  */.  nP
93b0: 61 79 6c 6f 61 64 20 3d 20 2a 70 49 74 65 72 3b  ayload = *pIter;
93c0: 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3e  .  if( nPayload>
93d0: 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 75 38 20  =0x80 ){.    u8 
93e0: 2a 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 38  *pEnd = &pIter[8
93f0: 5d 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20  ];.    nPayload 
9400: 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b  &= 0x7f;.    do{
9410: 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61 64 20  .      nPayload 
9420: 3d 20 28 6e 50 61 79 6c 6f 61 64 3c 3c 37 29 20  = (nPayload<<7) 
9430: 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30 78  | (*++pIter & 0x
9440: 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  7f);.    }while(
9450: 20 28 2a 70 49 74 65 72 29 3e 3d 30 78 38 30 20   (*pIter)>=0x80 
9460: 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b  && pIter<pEnd );
9470: 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a  .  }.  pIter++;.
9480: 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 62  .  /* The next b
9490: 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 69 73 20  lock of code is 
94a0: 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20  equivalent to:. 
94b0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 70 49 74   **.  **     pIt
94c0: 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28  er += getVarint(
94d0: 70 49 74 65 72 2c 20 28 75 36 34 2a 29 26 70 49  pIter, (u64*)&pI
94e0: 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 2a 2a  nfo->nKey);.  **
94f0: 0a 20 20 2a 2a 20 54 68 65 20 63 6f 64 65 20 69  .  ** The code i
9500: 73 20 69 6e 6c 69 6e 65 64 20 74 6f 20 61 76 6f  s inlined to avo
9510: 69 64 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61  id a function ca
9520: 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 69 4b 65 79 20  ll..  */.  iKey 
9530: 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20  = *pIter;.  if( 
9540: 69 4b 65 79 3e 3d 30 78 38 30 20 29 7b 0a 20 20  iKey>=0x80 ){.  
9550: 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49    u8 *pEnd = &pI
9560: 74 65 72 5b 37 5d 3b 0a 20 20 20 20 69 4b 65 79  ter[7];.    iKey
9570: 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 77 68   &= 0x7f;.    wh
9580: 69 6c 65 28 31 29 7b 0a 20 20 20 20 20 20 69 4b  ile(1){.      iK
9590: 65 79 20 3d 20 28 69 4b 65 79 3c 3c 37 29 20 7c  ey = (iKey<<7) |
95a0: 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37   (*++pIter & 0x7
95b0: 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 2a  f);.      if( (*
95c0: 70 49 74 65 72 29 3c 30 78 38 30 20 29 20 62 72  pIter)<0x80 ) br
95d0: 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  eak;.      if( p
95e0: 49 74 65 72 3e 3d 70 45 6e 64 20 29 7b 0a 20 20  Iter>=pEnd ){.  
95f0: 20 20 20 20 20 20 69 4b 65 79 20 3d 20 28 69 4b        iKey = (iK
9600: 65 79 3c 3c 38 29 20 7c 20 2a 2b 2b 70 49 74 65  ey<<8) | *++pIte
9610: 72 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  r;.        break
9620: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9630: 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 0a    }.  pIter++;..
9640: 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20    pInfo->nKey = 
9650: 2a 28 69 36 34 2a 29 26 69 4b 65 79 3b 0a 20 20  *(i64*)&iKey;.  
9660: 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20  pInfo->nPayload 
9670: 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49  = nPayload;.  pI
9680: 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20  nfo->pPayload = 
9690: 70 49 74 65 72 3b 0a 20 20 74 65 73 74 63 61 73  pIter;.  testcas
96a0: 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61  e( nPayload==pPa
96b0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  ge->maxLocal );.
96c0: 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79    testcase( nPay
96d0: 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  load==pPage->max
96e0: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28  Local+1 );.  if(
96f0: 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65   nPayload<=pPage
9700: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20  ->maxLocal ){.  
9710: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
9720: 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63   (easy) common c
9730: 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65 6e  ase where the en
9740: 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74  tire payload fit
9750: 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20  s.    ** on the 
9760: 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20  local page.  No 
9770: 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75  overflow is requ
9780: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
9790: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20   pInfo->nSize = 
97a0: 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75 31 36 29  nPayload + (u16)
97b0: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b  (pIter - pCell);
97c0: 0a 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e  .    if( pInfo->
97d0: 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d  nSize<4 ) pInfo-
97e0: 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20  >nSize = 4;.    
97f0: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
9800: 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20  (u16)nPayload;. 
9810: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 74 72 65   }else{.    btre
9820: 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75 73 74  eParseCellAdjust
9830: 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28  SizeForOverflow(
9840: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49  pPage, pCell, pI
9850: 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  nfo);.  }.}.stat
9860: 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72  ic void btreePar
9870: 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28 0a  seCellPtrIndex(.
9880: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
9890: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67  ,         /* Pag
98a0: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
98b0: 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70   cell */.  u8 *p
98c0: 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
98d0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
98e0: 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20   the cell text. 
98f0: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
9900: 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20  Info         /* 
9910: 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72  Fill in this str
9920: 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75  ucture */.){.  u
9930: 38 20 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20  8 *pIter;       
9940: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 63         /* For sc
9950: 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 70  anning through p
9960: 43 65 6c 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50  Cell */.  u32 nP
9970: 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20  ayload;         
9980: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
9990: 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79  ytes of cell pay
99a0: 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  load */..  asser
99b0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
99c0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
99d0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
99e0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61  sert( pPage->lea
99f0: 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c  f==0 || pPage->l
9a00: 65 61 66 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  eaf==1 );.  asse
9a10: 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  rt( pPage->intKe
9a20: 79 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 61 73  yLeaf==0 );.  as
9a30: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 6f 50  sert( pPage->noP
9a40: 61 79 6c 6f 61 64 3d 3d 30 20 29 3b 0a 20 20 70  ayload==0 );.  p
9a50: 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70  Iter = pCell + p
9a60: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
9a70: 7a 65 3b 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d  ze;.  nPayload =
9a80: 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20 6e   *pIter;.  if( n
9a90: 50 61 79 6c 6f 61 64 3e 3d 30 78 38 30 20 29 7b  Payload>=0x80 ){
9aa0: 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20  .    u8 *pEnd = 
9ab0: 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e  &pIter[8];.    n
9ac0: 50 61 79 6c 6f 61 64 20 26 3d 20 30 78 37 66 3b  Payload &= 0x7f;
9ad0: 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e  .    do{.      n
9ae0: 50 61 79 6c 6f 61 64 20 3d 20 28 6e 50 61 79 6c  Payload = (nPayl
9af0: 6f 61 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49  oad<<7) | (*++pI
9b00: 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20  ter & 0x7f);.   
9b10: 20 7d 77 68 69 6c 65 28 20 2a 28 70 49 74 65 72   }while( *(pIter
9b20: 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74 65 72  )>=0x80 && pIter
9b30: 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70  <pEnd );.  }.  p
9b40: 49 74 65 72 2b 2b 3b 0a 20 20 70 49 6e 66 6f 2d  Iter++;.  pInfo-
9b50: 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f 61 64  >nKey = nPayload
9b60: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c  ;.  pInfo->nPayl
9b70: 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a  oad = nPayload;.
9b80: 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61    pInfo->pPayloa
9b90: 64 20 3d 20 70 49 74 65 72 3b 0a 20 20 74 65 73  d = pIter;.  tes
9ba0: 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d  tcase( nPayload=
9bb0: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
9bc0: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
9bd0: 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d  nPayload==pPage-
9be0: 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
9bf0: 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70   if( nPayload<=p
9c00: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
9c10: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  {.    /* This is
9c20: 20 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d   the (easy) comm
9c30: 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68  on case where th
9c40: 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64  e entire payload
9c50: 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20   fits.    ** on 
9c60: 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20  the local page. 
9c70: 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20   No overflow is 
9c80: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
9c90: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a  .    pInfo->nSiz
9ca0: 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20 28  e = nPayload + (
9cb0: 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65  u16)(pIter - pCe
9cc0: 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  ll);.    if( pIn
9cd0: 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20 70 49  fo->nSize<4 ) pI
9ce0: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a  nfo->nSize = 4;.
9cf0: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
9d00: 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f 61  l = (u16)nPayloa
9d10: 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  d;.  }else{.    
9d20: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 41 64  btreeParseCellAd
9d30: 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65 72 66  justSizeForOverf
9d40: 6c 6f 77 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  low(pPage, pCell
9d50: 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a  , pInfo);.  }.}.
9d60: 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
9d70: 65 50 61 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65  eParseCell(.  Me
9d80: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
9d90: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
9da0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c  ntaining the cel
9db0: 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c  l */.  int iCell
9dc0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
9dd0: 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64 65 78  * The cell index
9de0: 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20 69 73  .  First cell is
9df0: 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f   0 */.  CellInfo
9e00: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
9e10: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
9e20: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
9e30: 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
9e40: 65 6c 6c 28 70 50 61 67 65 2c 20 66 69 6e 64 43  ell(pPage, findC
9e50: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
9e60: 29 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a  ), pInfo);.}../*
9e70: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
9e80: 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 69  g routines are i
9e90: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f  mplementations o
9ea0: 66 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 78 43  f the MemPage.xC
9eb0: 65 6c 6c 53 69 7a 65 0a 2a 2a 20 6d 65 74 68 6f  ellSize.** metho
9ec0: 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  d..**.** Compute
9ed0: 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
9ee0: 72 20 6f 66 20 62 79 74 65 73 20 74 68 61 74 20  r of bytes that 
9ef0: 61 20 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20  a Cell needs in 
9f00: 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61  the cell.** data
9f10: 20 61 72 65 61 20 6f 66 20 74 68 65 20 62 74 72   area of the btr
9f20: 65 65 2d 70 61 67 65 2e 20 20 54 68 65 20 72 65  ee-page.  The re
9f30: 74 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c  turn number incl
9f40: 75 64 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a  udes the cell.**
9f50: 20 64 61 74 61 20 68 65 61 64 65 72 20 61 6e 64   data header and
9f60: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f   the local paylo
9f70: 61 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20  ad, but not any 
9f80: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6f 72  overflow page or
9f90: 0a 2a 2a 20 74 68 65 20 73 70 61 63 65 20 75 73  .** the space us
9fa0: 65 64 20 62 79 20 74 68 65 20 63 65 6c 6c 20 70  ed by the cell p
9fb0: 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 63 65  ointer..**.** ce
9fc0: 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f  llSizePtrNoPaylo
9fd0: 61 64 28 29 20 20 20 20 3d 3e 20 20 20 74 61 62  ad()    =>   tab
9fe0: 6c 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  le internal node
9ff0: 73 0a 2a 2a 20 63 65 6c 6c 53 69 7a 65 50 74 72  s.** cellSizePtr
a000: 28 29 20 20 20 20 20 20 20 20 20 20 20 20 20 3d  ()             =
a010: 3e 20 20 20 61 6c 6c 20 69 6e 64 65 78 20 6e 6f  >   all index no
a020: 64 65 73 20 26 20 74 61 62 6c 65 20 6c 65 61 66  des & table leaf
a030: 20 6e 6f 64 65 73 0a 2a 2f 0a 73 74 61 74 69 63   nodes.*/.static
a040: 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74 72   u16 cellSizePtr
a050: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
a060: 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75   u8 *pCell){.  u
a070: 38 20 2a 70 49 74 65 72 20 3d 20 70 43 65 6c 6c  8 *pIter = pCell
a080: 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   + pPage->childP
a090: 74 72 53 69 7a 65 3b 20 2f 2a 20 46 6f 72 20 6c  trSize; /* For l
a0a0: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 62 79 74 65  ooping over byte
a0b0: 73 20 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  s of pCell */.  
a0c0: 75 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20  u8 *pEnd;       
a0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20           /* End 
a0f0: 6d 61 72 6b 20 66 6f 72 20 61 20 76 61 72 69 6e  mark for a varin
a100: 74 20 2a 2f 0a 20 20 75 33 32 20 6e 53 69 7a 65  t */.  u32 nSize
a110: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a130: 2f 2a 20 53 69 7a 65 20 76 61 6c 75 65 20 74 6f  /* Size value to
a140: 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 23 69 66 64   return */..#ifd
a150: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
a160: 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 72    /* The value r
a170: 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
a180: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
a190: 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 73 61  always be the sa
a1a0: 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 28  me as.  ** the (
a1b0: 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20  CellInfo.nSize) 
a1c0: 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20 64  value found by d
a1d0: 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72 73  oing a full pars
a1e0: 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63 65  e of the.  ** ce
a1f0: 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44 45  ll. If SQLITE_DE
a200: 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c 20  BUG is defined, 
a210: 61 6e 20 61 73 73 65 72 74 28 29 20 61 74 20 74  an assert() at t
a220: 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a  he bottom of.  *
a230: 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
a240: 76 65 72 69 66 69 65 73 20 74 68 61 74 20 74 68  verifies that th
a250: 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20  is invariant is 
a260: 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f  not violated. */
a270: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75  .  CellInfo debu
a280: 67 69 6e 66 6f 3b 0a 20 20 70 50 61 67 65 2d 3e  ginfo;.  pPage->
a290: 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
a2a0: 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69  , pCell, &debugi
a2b0: 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  nfo);.#endif..  
a2c0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
a2d0: 6f 50 61 79 6c 6f 61 64 3d 3d 30 20 29 3b 0a 20  oPayload==0 );. 
a2e0: 20 6e 53 69 7a 65 20 3d 20 2a 70 49 74 65 72 3b   nSize = *pIter;
a2f0: 0a 20 20 69 66 28 20 6e 53 69 7a 65 3e 3d 30 78  .  if( nSize>=0x
a300: 38 30 20 29 7b 0a 20 20 20 20 70 45 6e 64 20 3d  80 ){.    pEnd =
a310: 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20   &pIter[8];.    
a320: 6e 53 69 7a 65 20 26 3d 20 30 78 37 66 3b 0a 20  nSize &= 0x7f;. 
a330: 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 53 69     do{.      nSi
a340: 7a 65 20 3d 20 28 6e 53 69 7a 65 3c 3c 37 29 20  ze = (nSize<<7) 
a350: 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30 78  | (*++pIter & 0x
a360: 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  7f);.    }while(
a370: 20 2a 28 70 49 74 65 72 29 3e 3d 30 78 38 30 20   *(pIter)>=0x80 
a380: 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b  && pIter<pEnd );
a390: 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a  .  }.  pIter++;.
a3a0: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
a3b0: 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20 70 49  Key ){.    /* pI
a3c0: 74 65 72 20 6e 6f 77 20 70 6f 69 6e 74 73 20 61  ter now points a
a3d0: 74 20 74 68 65 20 36 34 2d 62 69 74 20 69 6e 74  t the 64-bit int
a3e0: 65 67 65 72 20 6b 65 79 20 76 61 6c 75 65 2c 20  eger key value, 
a3f0: 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  a variable lengt
a400: 68 20 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65  h .    ** intege
a410: 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  r. The following
a420: 20 62 6c 6f 63 6b 20 6d 6f 76 65 73 20 70 49 74   block moves pIt
a430: 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74  er to point at t
a440: 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 20 20  he first byte.  
a450: 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e    ** past the en
a460: 64 20 6f 66 20 74 68 65 20 6b 65 79 20 76 61 6c  d of the key val
a470: 75 65 2e 20 2a 2f 0a 20 20 20 20 70 45 6e 64 20  ue. */.    pEnd 
a480: 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20 20  = &pIter[9];.   
a490: 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b   while( (*pIter+
a4a0: 2b 29 26 30 78 38 30 20 26 26 20 70 49 74 65 72  +)&0x80 && pIter
a4b0: 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 74  <pEnd );.  }.  t
a4c0: 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d  estcase( nSize==
a4d0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
a4e0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  );.  testcase( n
a4f0: 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  Size==pPage->max
a500: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28  Local+1 );.  if(
a510: 20 6e 53 69 7a 65 3c 3d 70 50 61 67 65 2d 3e 6d   nSize<=pPage->m
a520: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 6e  axLocal ){.    n
a530: 53 69 7a 65 20 2b 3d 20 28 75 33 32 29 28 70 49  Size += (u32)(pI
a540: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
a550: 20 20 69 66 28 20 6e 53 69 7a 65 3c 34 20 29 20    if( nSize<4 ) 
a560: 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 7d 65 6c  nSize = 4;.  }el
a570: 73 65 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c  se{.    int minL
a580: 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69  ocal = pPage->mi
a590: 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 53 69 7a  nLocal;.    nSiz
a5a0: 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28  e = minLocal + (
a5b0: 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c  nSize - minLocal
a5c0: 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d  ) % (pPage->pBt-
a5d0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29  >usableSize - 4)
a5e0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
a5f0: 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61  nSize==pPage->ma
a600: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65  xLocal );.    te
a610: 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70  stcase( nSize==p
a620: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31  Page->maxLocal+1
a630: 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a   );.    if( nSiz
a640: 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  e>pPage->maxLoca
a650: 6c 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65  l ){.      nSize
a660: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20   = minLocal;.   
a670: 20 7d 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20   }.    nSize += 
a680: 34 20 2b 20 28 75 31 36 29 28 70 49 74 65 72 20  4 + (u16)(pIter 
a690: 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20  - pCell);.  }.  
a6a0: 61 73 73 65 72 74 28 20 6e 53 69 7a 65 3d 3d 64  assert( nSize==d
a6b0: 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 20 7c  ebuginfo.nSize |
a6c0: 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
a6d0: 20 20 72 65 74 75 72 6e 20 28 75 31 36 29 6e 53    return (u16)nS
a6e0: 69 7a 65 3b 0a 7d 0a 73 74 61 74 69 63 20 75 31  ize;.}.static u1
a6f0: 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50  6 cellSizePtrNoP
a700: 61 79 6c 6f 61 64 28 4d 65 6d 50 61 67 65 20 2a  ayload(MemPage *
a710: 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c  pPage, u8 *pCell
a720: 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d  ){.  u8 *pIter =
a730: 20 70 43 65 6c 6c 20 2b 20 34 3b 20 2f 2a 20 46   pCell + 4; /* F
a740: 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
a750: 62 79 74 65 73 20 6f 66 20 70 43 65 6c 6c 20 2a  bytes of pCell *
a760: 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20 20 20  /.  u8 *pEnd;   
a770: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e             /* En
a780: 64 20 6d 61 72 6b 20 66 6f 72 20 61 20 76 61 72  d mark for a var
a790: 69 6e 74 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  int */..#ifdef S
a7a0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
a7b0: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
a7c0: 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ned by this func
a7d0: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61  tion should alwa
a7e0: 79 73 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  ys be the same a
a7f0: 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c  s.  ** the (Cell
a800: 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75  Info.nSize) valu
a810: 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67  e found by doing
a820: 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f 66   a full parse of
a830: 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20   the.  ** cell. 
a840: 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  If SQLITE_DEBUG 
a850: 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61  is defined, an a
a860: 73 73 65 72 74 28 29 20 61 74 20 74 68 65 20 62  ssert() at the b
a870: 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68  ottom of.  ** th
a880: 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72 69  is function veri
a890: 66 69 65 73 20 74 68 61 74 20 74 68 69 73 20 69  fies that this i
a8a0: 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74 20  nvariant is not 
a8b0: 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43  violated. */.  C
a8c0: 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e 66  ellInfo debuginf
a8d0: 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72  o;.  pPage->xPar
a8e0: 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  seCell(pPage, pC
a8f0: 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f 29  ell, &debuginfo)
a900: 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  ;.#else.  UNUSED
a910: 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61 67 65  _PARAMETER(pPage
a920: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  );.#endif..  ass
a930: 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c  ert( pPage->chil
a940: 64 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 20  dPtrSize==4 );. 
a950: 20 70 45 6e 64 20 3d 20 70 49 74 65 72 20 2b 20   pEnd = pIter + 
a960: 39 3b 0a 20 20 77 68 69 6c 65 28 20 28 2a 70 49  9;.  while( (*pI
a970: 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70  ter++)&0x80 && p
a980: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 61  Iter<pEnd );.  a
a990: 73 73 65 72 74 28 20 64 65 62 75 67 69 6e 66 6f  ssert( debuginfo
a9a0: 2e 6e 53 69 7a 65 3d 3d 28 75 31 36 29 28 70 49  .nSize==(u16)(pI
a9b0: 74 65 72 20 2d 20 70 43 65 6c 6c 29 20 7c 7c 20  ter - pCell) || 
a9c0: 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
a9d0: 72 65 74 75 72 6e 20 28 75 31 36 29 28 70 49 74  return (u16)(pIt
a9e0: 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 7d 0a 0a  er - pCell);.}..
a9f0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
aa00: 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 76 61 72  EBUG./* This var
aa10: 69 61 74 69 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69  iation on cellSi
aa20: 7a 65 50 74 72 28 29 20 69 73 20 75 73 65 64 20  zePtr() is used 
aa30: 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74  inside of assert
aa40: 28 29 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a  () statements.**
aa50: 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61 74 69 63   only. */.static
aa60: 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65   u16 cellSize(Me
aa70: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
aa80: 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72 65 74 75  t iCell){.  retu
aa90: 72 6e 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53  rn pPage->xCellS
aaa0: 69 7a 65 28 70 50 61 67 65 2c 20 66 69 6e 64 43  ize(pPage, findC
aab0: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
aac0: 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ));.}.#endif..#i
aad0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
aae0: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a  T_AUTOVACUUM./*.
aaf0: 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 70  ** If the cell p
ab00: 43 65 6c 6c 2c 20 70 61 72 74 20 6f 66 20 70 61  Cell, part of pa
ab10: 67 65 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e  ge pPage contain
ab20: 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  s a pointer.** t
ab30: 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
ab40: 67 65 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e  ge, insert an en
ab50: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  try into the poi
ab60: 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20  nter-map.** for 
ab70: 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
ab80: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
ab90: 64 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  d ptrmapPutOvflP
aba0: 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  tr(MemPage *pPag
abb0: 65 2c 20 75 38 20 2a 70 43 65 6c 6c 2c 20 69 6e  e, u8 *pCell, in
abc0: 74 20 2a 70 52 43 29 7b 0a 20 20 43 65 6c 6c 49  t *pRC){.  CellI
abd0: 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 69 66 28 20  nfo info;.  if( 
abe0: 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20  *pRC ) return;. 
abf0: 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c 21 3d   assert( pCell!=
ac00: 30 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50  0 );.  pPage->xP
ac10: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
ac20: 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
ac30: 20 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c   if( info.nLocal
ac40: 3c 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29  <info.nPayload )
ac50: 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20  {.    Pgno ovfl 
ac60: 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  = get4byte(&pCel
ac70: 6c 5b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34 5d 29  l[info.nSize-4])
ac80: 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28  ;.    ptrmapPut(
ac90: 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c  pPage->pBt, ovfl
aca0: 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  , PTRMAP_OVERFLO
acb0: 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  W1, pPage->pgno,
acc0: 20 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e   pRC);.  }.}.#en
acd0: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72  dif.../*.** Defr
ace0: 61 67 6d 65 6e 74 20 74 68 65 20 70 61 67 65 20  agment the page 
acf0: 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43 65 6c 6c  given.  All Cell
ad00: 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 74  s are moved to t
ad10: 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65  he.** end of the
ad20: 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 66 72   page and all fr
ad30: 65 65 20 73 70 61 63 65 20 69 73 20 63 6f 6c 6c  ee space is coll
ad40: 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e 65 0a 2a  ected into one.*
ad50: 2a 20 62 69 67 20 46 72 65 65 42 6c 6b 20 74 68  * big FreeBlk th
ad60: 61 74 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74  at occurs in bet
ad70: 77 65 65 6e 20 74 68 65 20 68 65 61 64 65 72 20  ween the header 
ad80: 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69 6e  and cell.** poin
ad90: 74 65 72 20 61 72 72 61 79 20 61 6e 64 20 74 68  ter array and th
ada0: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
adb0: 72 65 61 2e 0a 2a 2a 0a 2a 2a 20 45 56 49 44 45  rea..**.** EVIDE
adc0: 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 35 38 32 2d  NCE-OF: R-44582-
add0: 36 30 31 33 38 20 53 51 4c 69 74 65 20 6d 61 79  60138 SQLite may
ade0: 20 66 72 6f 6d 20 74 69 6d 65 20 74 6f 20 74 69   from time to ti
adf0: 6d 65 20 72 65 6f 72 67 61 6e 69 7a 65 20 61 0a  me reorganize a.
ae00: 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 20 73  ** b-tree page s
ae10: 6f 20 74 68 61 74 20 74 68 65 72 65 20 61 72 65  o that there are
ae20: 20 6e 6f 20 66 72 65 65 62 6c 6f 63 6b 73 20 6f   no freeblocks o
ae30: 72 20 66 72 61 67 6d 65 6e 74 20 62 79 74 65 73  r fragment bytes
ae40: 2c 20 61 6c 6c 0a 2a 2a 20 75 6e 75 73 65 64 20  , all.** unused 
ae50: 62 79 74 65 73 20 61 72 65 20 63 6f 6e 74 61 69  bytes are contai
ae60: 6e 65 64 20 69 6e 20 74 68 65 20 75 6e 61 6c 6c  ned in the unall
ae70: 6f 63 61 74 65 64 20 73 70 61 63 65 20 72 65 67  ocated space reg
ae80: 69 6f 6e 2c 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20  ion, and all.** 
ae90: 63 65 6c 6c 73 20 61 72 65 20 70 61 63 6b 65 64  cells are packed
aea0: 20 74 69 67 68 74 6c 79 20 61 74 20 74 68 65 20   tightly at the 
aeb0: 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e  end of the page.
aec0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
aed0: 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 4d 65  efragmentPage(Me
aee0: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
aef0: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
af00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
af10: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
af20: 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20   int pc;        
af30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
af40: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 69 2d  ddress of the i-
af50: 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74  th cell */.  int
af60: 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20   hdr;           
af70: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
af80: 74 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65  t to the page he
af90: 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69  ader */.  int si
afa0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
afb0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
afc0: 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  a cell */.  int 
afd0: 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 20  usableSize;     
afe0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
aff0: 20 6f 66 20 75 73 61 62 6c 65 20 62 79 74 65 73   of usable bytes
b000: 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20   on a page */.  
b010: 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20  int cellOffset; 
b020: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
b030: 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c  fset to the cell
b040: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a   pointer array *
b050: 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20 20 20  /.  int cbrk;   
b060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b070: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
b080: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
b090: 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  a */.  int nCell
b0a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b0b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
b0c0: 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65  ells on the page
b0d0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
b0e0: 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20 20 20  har *data;      
b0f0: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 64 61 74   /* The page dat
b100: 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  a */.  unsigned 
b110: 63 68 61 72 20 2a 74 65 6d 70 3b 20 20 20 20 20  char *temp;     
b120: 20 20 2f 2a 20 54 65 6d 70 20 61 72 65 61 20 66    /* Temp area f
b130: 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  or cell content 
b140: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
b150: 61 72 20 2a 73 72 63 3b 20 20 20 20 20 20 20 20  ar *src;        
b160: 2f 2a 20 53 6f 75 72 63 65 20 6f 66 20 63 6f 6e  /* Source of con
b170: 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43  tent */.  int iC
b180: 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 20 20 20  ellFirst;       
b190: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c       /* First al
b1a0: 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64  lowable cell ind
b1b0: 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  ex */.  int iCel
b1c0: 6c 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20 20  lLast;          
b1d0: 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69     /* Last possi
b1e0: 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a  ble cell index *
b1f0: 2f 0a 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  /...  assert( sq
b200: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
b210: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
b220: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
b230: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30  t( pPage->pBt!=0
b240: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
b250: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
b260: 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d  Size <= SQLITE_M
b270: 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a  AX_PAGE_SIZE );.
b280: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
b290: 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b  >nOverflow==0 );
b2a0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
b2b0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
b2c0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
b2d0: 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20 30 3b 0a   );.  temp = 0;.
b2e0: 20 20 73 72 63 20 3d 20 64 61 74 61 20 3d 20 70    src = data = p
b2f0: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68  Page->aData;.  h
b300: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
b310: 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66  ffset;.  cellOff
b320: 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  set = pPage->cel
b330: 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c  lOffset;.  nCell
b340: 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
b350: 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c  .  assert( nCell
b360: 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61  ==get2byte(&data
b370: 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73  [hdr+3]) );.  us
b380: 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65  ableSize = pPage
b390: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
b3a0: 65 3b 0a 20 20 63 62 72 6b 20 3d 20 75 73 61 62  e;.  cbrk = usab
b3b0: 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 46  leSize;.  iCellF
b3c0: 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65  irst = cellOffse
b3d0: 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 69  t + 2*nCell;.  i
b3e0: 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c  CellLast = usabl
b3f0: 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72  eSize - 4;.  for
b400: 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
b410: 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64  ++){.    u8 *pAd
b420: 64 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69  dr;     /* The i
b430: 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  -th cell pointer
b440: 20 2a 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20   */.    pAddr = 
b450: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
b460: 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20   + i*2];.    pc 
b470: 3d 20 67 65 74 32 62 79 74 65 28 70 41 64 64 72  = get2byte(pAddr
b480: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
b490: 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc==iCellFirst 
b4a0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
b4b0: 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29   pc==iCellLast )
b4c0: 3b 0a 20 20 20 20 2f 2a 20 54 68 65 73 65 20 63  ;.    /* These c
b4d0: 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76 65 20 61  onditions have a
b4e0: 6c 72 65 61 64 79 20 62 65 65 6e 20 76 65 72 69  lready been veri
b4f0: 66 69 65 64 20 69 6e 20 62 74 72 65 65 49 6e 69  fied in btreeIni
b500: 74 50 61 67 65 28 29 0a 20 20 20 20 2a 2a 20 69  tPage().    ** i
b510: 66 20 50 52 41 47 4d 41 20 63 65 6c 6c 5f 73 69  f PRAGMA cell_si
b520: 7a 65 5f 63 68 65 63 6b 3d 4f 4e 2e 0a 20 20 20  ze_check=ON..   
b530: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3c 69   */.    if( pc<i
b540: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e  CellFirst || pc>
b550: 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20  iCellLast ){.   
b560: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
b570: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
b580: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
b590: 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc>=iCellFirst 
b5a0: 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c 61 73 74  && pc<=iCellLast
b5b0: 20 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 70   );.    size = p
b5c0: 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28  Page->xCellSize(
b5d0: 70 50 61 67 65 2c 20 26 73 72 63 5b 70 63 5d 29  pPage, &src[pc])
b5e0: 3b 0a 20 20 20 20 63 62 72 6b 20 2d 3d 20 73 69  ;.    cbrk -= si
b5f0: 7a 65 3b 0a 20 20 20 20 69 66 28 20 63 62 72 6b  ze;.    if( cbrk
b600: 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70  <iCellFirst || p
b610: 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a  c+size>usableSiz
b620: 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
b630: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
b640: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
b650: 20 61 73 73 65 72 74 28 20 63 62 72 6b 2b 73 69   assert( cbrk+si
b660: 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20 26  ze<=usableSize &
b670: 26 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72  & cbrk>=iCellFir
b680: 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  st );.    testca
b690: 73 65 28 20 63 62 72 6b 2b 73 69 7a 65 3d 3d 75  se( cbrk+size==u
b6a0: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
b6b0: 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73 69   testcase( pc+si
b6c0: 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29  ze==usableSize )
b6d0: 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70  ;.    put2byte(p
b6e0: 41 64 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20 20  Addr, cbrk);.   
b6f0: 20 69 66 28 20 74 65 6d 70 3d 3d 30 20 29 7b 0a   if( temp==0 ){.
b700: 20 20 20 20 20 20 69 6e 74 20 78 3b 0a 20 20 20        int x;.   
b710: 20 20 20 69 66 28 20 63 62 72 6b 3d 3d 70 63 20     if( cbrk==pc 
b720: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
b730: 20 20 74 65 6d 70 20 3d 20 73 71 6c 69 74 65 33    temp = sqlite3
b740: 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 70  PagerTempSpace(p
b750: 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65  Page->pBt->pPage
b760: 72 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 67 65  r);.      x = ge
b770: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
b780: 2b 35 5d 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  +5]);.      memc
b790: 70 79 28 26 74 65 6d 70 5b 78 5d 2c 20 26 64 61  py(&temp[x], &da
b7a0: 74 61 5b 78 5d 2c 20 28 63 62 72 6b 2b 73 69 7a  ta[x], (cbrk+siz
b7b0: 65 29 20 2d 20 78 29 3b 0a 20 20 20 20 20 20 73  e) - x);.      s
b7c0: 72 63 20 3d 20 74 65 6d 70 3b 0a 20 20 20 20 7d  rc = temp;.    }
b7d0: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74  .    memcpy(&dat
b7e0: 61 5b 63 62 72 6b 5d 2c 20 26 73 72 63 5b 70 63  a[cbrk], &src[pc
b7f0: 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 7d 0a 20 20  ], size);.  }.  
b800: 61 73 73 65 72 74 28 20 63 62 72 6b 3e 3d 69 43  assert( cbrk>=iC
b810: 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 70 75  ellFirst );.  pu
b820: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
b830: 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20 20 64 61  +5], cbrk);.  da
b840: 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20  ta[hdr+1] = 0;. 
b850: 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30   data[hdr+2] = 0
b860: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20  ;.  data[hdr+7] 
b870: 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64  = 0;.  memset(&d
b880: 61 74 61 5b 69 43 65 6c 6c 46 69 72 73 74 5d 2c  ata[iCellFirst],
b890: 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69   0, cbrk-iCellFi
b8a0: 72 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rst);.  assert( 
b8b0: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
b8c0: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
b8d0: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28  DbPage) );.  if(
b8e0: 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74   cbrk-iCellFirst
b8f0: 21 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29  !=pPage->nFree )
b900: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
b910: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
b920: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
b930: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
b940: 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20 66 72  ** Search the fr
b950: 65 65 2d 6c 69 73 74 20 6f 6e 20 70 61 67 65 20  ee-list on page 
b960: 70 50 67 20 66 6f 72 20 73 70 61 63 65 20 74 6f  pPg for space to
b970: 20 73 74 6f 72 65 20 61 20 63 65 6c 6c 20 6e 42   store a cell nB
b980: 79 74 65 20 62 79 74 65 73 20 69 6e 0a 2a 2a 20  yte bytes in.** 
b990: 73 69 7a 65 2e 20 49 66 20 6f 6e 65 20 63 61 6e  size. If one can
b9a0: 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72   be found, retur
b9b0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
b9c0: 68 65 20 73 70 61 63 65 20 61 6e 64 20 72 65 6d  he space and rem
b9d0: 6f 76 65 20 69 74 0a 2a 2a 20 66 72 6f 6d 20 74  ove it.** from t
b9e0: 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a  he free-list..**
b9f0: 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69 74 61 62  .** If no suitab
ba00: 6c 65 20 73 70 61 63 65 20 63 61 6e 20 62 65 20  le space can be 
ba10: 66 6f 75 6e 64 20 6f 6e 20 74 68 65 20 66 72 65  found on the fre
ba20: 65 2d 6c 69 73 74 2c 20 72 65 74 75 72 6e 20 4e  e-list, return N
ba30: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ULL..**.** This 
ba40: 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 64 65 74  function may det
ba50: 65 63 74 20 63 6f 72 72 75 70 74 69 6f 6e 20 77  ect corruption w
ba60: 69 74 68 69 6e 20 70 50 67 2e 20 20 49 66 20 63  ithin pPg.  If c
ba70: 6f 72 72 75 70 74 69 6f 6e 20 69 73 0a 2a 2a 20  orruption is.** 
ba80: 64 65 74 65 63 74 65 64 20 74 68 65 6e 20 2a 70  detected then *p
ba90: 52 63 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  Rc is set to SQL
baa0: 49 54 45 5f 43 4f 52 52 55 50 54 20 61 6e 64 20  ITE_CORRUPT and 
bab0: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
bac0: 2e 0a 2a 2a 0a 2a 2a 20 53 6c 6f 74 73 20 6f 6e  ..**.** Slots on
bad0: 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 20 74   the free list t
bae0: 68 61 74 20 61 72 65 20 62 65 74 77 65 65 6e 20  hat are between 
baf0: 31 20 61 6e 64 20 33 20 62 79 74 65 73 20 6c 61  1 and 3 bytes la
bb00: 72 67 65 72 20 74 68 61 6e 20 6e 42 79 74 65 0a  rger than nByte.
bb10: 2a 2a 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72  ** will be ignor
bb20: 65 64 20 69 66 20 61 64 64 69 6e 67 20 74 68 65  ed if adding the
bb30: 20 65 78 74 72 61 20 73 70 61 63 65 20 74 6f 20   extra space to 
bb40: 74 68 65 20 66 72 61 67 6d 65 6e 74 61 74 69 6f  the fragmentatio
bb50: 6e 20 63 6f 75 6e 74 0a 2a 2a 20 63 61 75 73 65  n count.** cause
bb60: 73 20 74 68 65 20 66 72 61 67 6d 65 6e 74 61 74  s the fragmentat
bb70: 69 6f 6e 20 63 6f 75 6e 74 20 74 6f 20 65 78 63  ion count to exc
bb80: 65 65 64 20 36 30 2e 0a 2a 2f 0a 73 74 61 74 69  eed 60..*/.stati
bb90: 63 20 75 38 20 2a 70 61 67 65 46 69 6e 64 53 6c  c u8 *pageFindSl
bba0: 6f 74 28 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c  ot(MemPage *pPg,
bbb0: 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20   int nByte, int 
bbc0: 2a 70 52 63 29 7b 0a 20 20 63 6f 6e 73 74 20 69  *pRc){.  const i
bbd0: 6e 74 20 68 64 72 20 3d 20 70 50 67 2d 3e 68 64  nt hdr = pPg->hd
bbe0: 72 4f 66 66 73 65 74 3b 0a 20 20 75 38 20 2a 20  rOffset;.  u8 * 
bbf0: 63 6f 6e 73 74 20 61 44 61 74 61 20 3d 20 70 50  const aData = pP
bc00: 67 2d 3e 61 44 61 74 61 3b 0a 20 20 69 6e 74 20  g->aData;.  int 
bc10: 69 41 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b  iAddr = hdr + 1;
bc20: 0a 20 20 69 6e 74 20 70 63 20 3d 20 67 65 74 32  .  int pc = get2
bc30: 62 79 74 65 28 26 61 44 61 74 61 5b 69 41 64 64  byte(&aData[iAdd
bc40: 72 5d 29 3b 0a 20 20 69 6e 74 20 78 3b 0a 20 20  r]);.  int x;.  
bc50: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  int usableSize =
bc60: 20 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c   pPg->pBt->usabl
bc70: 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74  eSize;..  assert
bc80: 28 20 70 63 3e 30 20 29 3b 0a 20 20 64 6f 7b 0a  ( pc>0 );.  do{.
bc90: 20 20 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20      int size;   
bca0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
bcb0: 20 6f 66 20 74 68 65 20 66 72 65 65 20 73 6c 6f   of the free slo
bcc0: 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 45 56 49 44  t */.    /* EVID
bcd0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 36 38 36 36  ENCE-OF: R-06866
bce0: 2d 33 39 31 32 35 20 46 72 65 65 62 6c 6f 63 6b  -39125 Freeblock
bcf0: 73 20 61 72 65 20 61 6c 77 61 79 73 20 63 6f 6e  s are always con
bd00: 6e 65 63 74 65 64 20 69 6e 20 6f 72 64 65 72 20  nected in order 
bd10: 6f 66 0a 20 20 20 20 2a 2a 20 69 6e 63 72 65 61  of.    ** increa
bd20: 73 69 6e 67 20 6f 66 66 73 65 74 2e 20 2a 2f 0a  sing offset. */.
bd30: 20 20 20 20 69 66 28 20 70 63 3e 75 73 61 62 6c      if( pc>usabl
bd40: 65 53 69 7a 65 2d 34 20 7c 7c 20 70 63 3c 69 41  eSize-4 || pc<iA
bd50: 64 64 72 2b 34 20 29 7b 0a 20 20 20 20 20 20 2a  ddr+4 ){.      *
bd60: 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52  pRc = SQLITE_COR
bd70: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
bd80: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
bd90: 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
bda0: 2d 4f 46 3a 20 52 2d 32 32 37 31 30 2d 35 33 33  -OF: R-22710-533
bdb0: 32 38 20 54 68 65 20 74 68 69 72 64 20 61 6e 64  28 The third and
bdc0: 20 66 6f 75 72 74 68 20 62 79 74 65 73 20 6f 66   fourth bytes of
bdd0: 20 65 61 63 68 0a 20 20 20 20 2a 2a 20 66 72 65   each.    ** fre
bde0: 65 62 6c 6f 63 6b 20 66 6f 72 6d 20 61 20 62 69  eblock form a bi
bdf0: 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
be00: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73 69   which is the si
be10: 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65 62 6c  ze of the freebl
be20: 6f 63 6b 0a 20 20 20 20 2a 2a 20 69 6e 20 62 79  ock.    ** in by
be30: 74 65 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74  tes, including t
be40: 68 65 20 34 2d 62 79 74 65 20 68 65 61 64 65 72  he 4-byte header
be50: 2e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 20 3d 20  . */.    size = 
be60: 67 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b  get2byte(&aData[
be70: 70 63 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20  pc+2]);.    if( 
be80: 28 78 20 3d 20 73 69 7a 65 20 2d 20 6e 42 79 74  (x = size - nByt
be90: 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 74  e)>=0 ){.      t
bea0: 65 73 74 63 61 73 65 28 20 78 3d 3d 34 20 29 3b  estcase( x==4 );
beb0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
bec0: 20 78 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 69   x==3 );.      i
bed0: 66 28 20 70 63 20 3c 20 70 50 67 2d 3e 63 65 6c  f( pc < pPg->cel
bee0: 6c 4f 66 66 73 65 74 2b 32 2a 70 50 67 2d 3e 6e  lOffset+2*pPg->n
bef0: 43 65 6c 6c 20 7c 7c 20 73 69 7a 65 2b 70 63 20  Cell || size+pc 
bf00: 3e 20 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  > usableSize ){.
bf10: 20 20 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53          *pRc = S
bf20: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
bf30: 50 54 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  PT;.        retu
bf40: 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rn 0;.      }els
bf50: 65 20 69 66 28 20 78 3c 34 20 29 7b 0a 20 20 20  e if( x<4 ){.   
bf60: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
bf70: 2d 4f 46 3a 20 52 2d 31 31 34 39 38 2d 35 38 30  -OF: R-11498-580
bf80: 32 32 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72  22 In a well-for
bf90: 6d 65 64 20 62 2d 74 72 65 65 20 70 61 67 65 2c  med b-tree page,
bfa0: 20 74 68 65 20 74 6f 74 61 6c 0a 20 20 20 20 20   the total.     
bfb0: 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20     ** number of 
bfc0: 62 79 74 65 73 20 69 6e 20 66 72 61 67 6d 65 6e  bytes in fragmen
bfd0: 74 73 20 6d 61 79 20 6e 6f 74 20 65 78 63 65 65  ts may not excee
bfe0: 64 20 36 30 2e 20 2a 2f 0a 20 20 20 20 20 20 20  d 60. */.       
bff0: 20 69 66 28 20 61 44 61 74 61 5b 68 64 72 2b 37   if( aData[hdr+7
c000: 5d 3e 35 37 20 29 20 72 65 74 75 72 6e 20 30 3b  ]>57 ) return 0;
c010: 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d  ..        /* Rem
c020: 6f 76 65 20 74 68 65 20 73 6c 6f 74 20 66 72 6f  ove the slot fro
c030: 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  m the free-list.
c040: 20 55 70 64 61 74 65 20 74 68 65 20 6e 75 6d 62   Update the numb
c050: 65 72 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a  er of.        **
c060: 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65   fragmented byte
c070: 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67  s within the pag
c080: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65  e. */.        me
c090: 6d 63 70 79 28 26 61 44 61 74 61 5b 69 41 64 64  mcpy(&aData[iAdd
c0a0: 72 5d 2c 20 26 61 44 61 74 61 5b 70 63 5d 2c 20  r], &aData[pc], 
c0b0: 32 29 3b 0a 20 20 20 20 20 20 20 20 61 44 61 74  2);.        aDat
c0c0: 61 5b 68 64 72 2b 37 5d 20 2b 3d 20 28 75 38 29  a[hdr+7] += (u8)
c0d0: 78 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  x;.      }else{.
c0e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
c0f0: 6c 6f 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74  lot remains on t
c100: 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 52 65  he free-list. Re
c110: 64 75 63 65 20 69 74 73 20 73 69 7a 65 20 74 6f  duce its size to
c120: 20 61 63 63 6f 75 6e 74 0a 20 20 20 20 20 20 20   account.       
c130: 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f 72    ** for the por
c140: 74 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68 65  tion used by the
c150: 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e   new allocation.
c160: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 74 32   */.        put2
c170: 62 79 74 65 28 26 61 44 61 74 61 5b 70 63 2b 32  byte(&aData[pc+2
c180: 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ], x);.      }. 
c190: 20 20 20 20 20 72 65 74 75 72 6e 20 26 61 44 61       return &aDa
c1a0: 74 61 5b 70 63 20 2b 20 78 5d 3b 0a 20 20 20 20  ta[pc + x];.    
c1b0: 7d 0a 20 20 20 20 69 41 64 64 72 20 3d 20 70 63  }.    iAddr = pc
c1c0: 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62  ;.    pc = get2b
c1d0: 79 74 65 28 26 61 44 61 74 61 5b 70 63 5d 29 3b  yte(&aData[pc]);
c1e0: 0a 20 20 7d 77 68 69 6c 65 28 20 70 63 20 29 3b  .  }while( pc );
c1f0: 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ..  return 0;.}.
c200: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
c210: 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 73  nByte bytes of s
c220: 70 61 63 65 20 66 72 6f 6d 20 77 69 74 68 69 6e  pace from within
c230: 20 74 68 65 20 42 2d 54 72 65 65 20 70 61 67 65   the B-Tree page
c240: 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68   passed.** as th
c250: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
c260: 2e 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 49  . Write into *pI
c270: 64 78 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74  dx the index int
c280: 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  o pPage->aData[]
c290: 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74  .** of the first
c2a0: 20 62 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74   byte of allocat
c2b0: 65 64 20 73 70 61 63 65 2e 20 52 65 74 75 72 6e  ed space. Return
c2c0: 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4f   either SQLITE_O
c2d0: 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  K or.** an error
c2e0: 20 63 6f 64 65 20 28 75 73 75 61 6c 6c 79 20 53   code (usually S
c2f0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a  QLITE_CORRUPT)..
c300: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
c310: 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74   guarantees that
c320: 20 74 68 65 72 65 20 69 73 20 73 75 66 66 69 63   there is suffic
c330: 69 65 6e 74 20 73 70 61 63 65 20 74 6f 20 6d 61  ient space to ma
c340: 6b 65 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61  ke the.** alloca
c350: 74 69 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74  tion.  This rout
c360: 69 6e 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74  ine might need t
c370: 6f 20 64 65 66 72 61 67 6d 65 6e 74 20 69 6e 20  o defragment in 
c380: 6f 72 64 65 72 20 74 6f 20 62 72 69 6e 67 0a 2a  order to bring.*
c390: 2a 20 61 6c 6c 20 74 68 65 20 73 70 61 63 65 20  * all the space 
c3a0: 74 6f 67 65 74 68 65 72 2c 20 68 6f 77 65 76 65  together, howeve
c3b0: 72 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  r.  This routine
c3c0: 20 77 69 6c 6c 20 61 76 6f 69 64 20 75 73 69 6e   will avoid usin
c3d0: 67 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74  g.** the first t
c3e0: 77 6f 20 62 79 74 65 73 20 70 61 73 74 20 74 68  wo bytes past th
c3f0: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
c400: 72 65 61 20 73 69 6e 63 65 20 70 72 65 73 75 6d  rea since presum
c410: 61 62 6c 79 20 74 68 69 73 0a 2a 2a 20 61 6c 6c  ably this.** all
c420: 6f 63 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  ocation is being
c430: 20 6d 61 64 65 20 69 6e 20 6f 72 64 65 72 20 74   made in order t
c440: 6f 20 69 6e 73 65 72 74 20 61 20 6e 65 77 20 63  o insert a new c
c450: 65 6c 6c 2c 20 73 6f 20 77 65 20 77 69 6c 6c 0a  ell, so we will.
c460: 2a 2a 20 61 6c 73 6f 20 65 6e 64 20 75 70 20 6e  ** also end up n
c470: 65 65 64 69 6e 67 20 61 20 6e 65 77 20 63 65 6c  eeding a new cel
c480: 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74  l pointer..*/.st
c490: 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
c4a0: 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a  eSpace(MemPage *
c4b0: 70 50 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65  pPage, int nByte
c4c0: 2c 20 69 6e 74 20 2a 70 49 64 78 29 7b 0a 20 20  , int *pIdx){.  
c4d0: 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20  const int hdr = 
c4e0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
c4f0: 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61  ;    /* Local ca
c500: 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 68 64  che of pPage->hd
c510: 72 4f 66 66 73 65 74 20 2a 2f 0a 20 20 75 38 20  rOffset */.  u8 
c520: 2a 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70  * const data = p
c530: 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20  Page->aData;    
c540: 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65    /* Local cache
c550: 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61   of pPage->aData
c560: 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20   */.  int top;  
c570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c580: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
c590: 72 73 74 20 62 79 74 65 20 6f 66 20 63 65 6c 6c  rst byte of cell
c5a0: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f   content area */
c5b0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
c5c0: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
c5d0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67          /* Integ
c5e0: 65 72 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  er return code *
c5f0: 2f 0a 20 20 69 6e 74 20 67 61 70 3b 20 20 20 20  /.  int gap;    
c600: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
c610: 65 20 6f 66 20 67 61 70 20 62 65 74 77 65 65 6e  e of gap between
c620: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61   cell pointers a
c630: 6e 64 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  nd cell content 
c640: 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  */.  .  assert( 
c650: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
c660: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
c670: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
c680: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20  ert( pPage->pBt 
c690: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
c6a0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
c6b0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
c6c0: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
c6d0: 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a 20  nByte>=0 );  /* 
c6e0: 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a  Minimum cell siz
c6f0: 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65  e is 4 */.  asse
c700: 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  rt( pPage->nFree
c710: 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61 73 73  >=nByte );.  ass
c720: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
c730: 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73  rflow==0 );.  as
c740: 73 65 72 74 28 20 6e 42 79 74 65 20 3c 20 28 69  sert( nByte < (i
c750: 6e 74 29 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  nt)(pPage->pBt->
c760: 75 73 61 62 6c 65 53 69 7a 65 2d 38 29 20 29 3b  usableSize-8) );
c770: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
c780: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 3d  e->cellOffset ==
c790: 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50   hdr + 12 - 4*pP
c7a0: 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 67  age->leaf );.  g
c7b0: 61 70 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c  ap = pPage->cell
c7c0: 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65  Offset + 2*pPage
c7d0: 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  ->nCell;.  asser
c7e0: 74 28 20 67 61 70 3c 3d 36 35 35 33 36 20 29 3b  t( gap<=65536 );
c7f0: 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
c800: 46 3a 20 52 2d 32 39 33 35 36 2d 30 32 33 39 31  F: R-29356-02391
c810: 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
c820: 20 75 73 65 73 20 61 20 36 35 35 33 36 2d 62 79   uses a 65536-by
c830: 74 65 20 70 61 67 65 20 73 69 7a 65 0a 20 20 2a  te page size.  *
c840: 2a 20 61 6e 64 20 74 68 65 20 72 65 73 65 72 76  * and the reserv
c850: 65 64 20 73 70 61 63 65 20 69 73 20 7a 65 72 6f  ed space is zero
c860: 20 28 74 68 65 20 75 73 75 61 6c 20 76 61 6c 75   (the usual valu
c870: 65 20 66 6f 72 20 72 65 73 65 72 76 65 64 20 73  e for reserved s
c880: 70 61 63 65 29 0a 20 20 2a 2a 20 74 68 65 6e 20  pace).  ** then 
c890: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
c8a0: 20 6f 66 66 73 65 74 20 6f 66 20 61 6e 20 65 6d   offset of an em
c8b0: 70 74 79 20 70 61 67 65 20 77 61 6e 74 73 20 74  pty page wants t
c8c0: 6f 20 62 65 20 36 35 35 33 36 2e 0a 20 20 2a 2a  o be 65536..  **
c8d0: 20 48 6f 77 65 76 65 72 2c 20 74 68 61 74 20 69   However, that i
c8e0: 6e 74 65 67 65 72 20 69 73 20 74 6f 6f 20 6c 61  nteger is too la
c8f0: 72 67 65 20 74 6f 20 62 65 20 73 74 6f 72 65 64  rge to be stored
c900: 20 69 6e 20 61 20 32 2d 62 79 74 65 20 75 6e 73   in a 2-byte uns
c910: 69 67 6e 65 64 0a 20 20 2a 2a 20 69 6e 74 65 67  igned.  ** integ
c920: 65 72 2c 20 73 6f 20 61 20 76 61 6c 75 65 20 6f  er, so a value o
c930: 66 20 30 20 69 73 20 75 73 65 64 20 69 6e 20 69  f 0 is used in i
c940: 74 73 20 70 6c 61 63 65 2e 20 2a 2f 0a 20 20 74  ts place. */.  t
c950: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  op = get2byte(&d
c960: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 61  ata[hdr+5]);.  a
c970: 73 73 65 72 74 28 20 74 6f 70 3c 3d 28 69 6e 74  ssert( top<=(int
c980: 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  )pPage->pBt->usa
c990: 62 6c 65 53 69 7a 65 20 29 3b 20 2f 2a 20 50 72  bleSize ); /* Pr
c9a0: 65 76 65 6e 74 20 62 79 20 67 65 74 41 6e 64 49  event by getAndI
c9b0: 6e 69 74 50 61 67 65 28 29 20 2a 2f 0a 20 20 69  nitPage() */.  i
c9c0: 66 28 20 67 61 70 3e 74 6f 70 20 29 7b 0a 20 20  f( gap>top ){.  
c9d0: 20 20 69 66 28 20 74 6f 70 3d 3d 30 20 26 26 20    if( top==0 && 
c9e0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
c9f0: 6c 65 53 69 7a 65 3d 3d 36 35 35 33 36 20 29 7b  leSize==65536 ){
ca00: 0a 20 20 20 20 20 20 74 6f 70 20 3d 20 36 35 35  .      top = 655
ca10: 33 36 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  36;.    }else{. 
ca20: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
ca30: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
ca40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
ca50: 20 49 66 20 74 68 65 72 65 20 69 73 20 65 6e 6f   If there is eno
ca60: 75 67 68 20 73 70 61 63 65 20 62 65 74 77 65 65  ugh space betwee
ca70: 6e 20 67 61 70 20 61 6e 64 20 74 6f 70 20 66 6f  n gap and top fo
ca80: 72 20 6f 6e 65 20 6d 6f 72 65 20 63 65 6c 6c 20  r one more cell 
ca90: 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 61 72 72  pointer.  ** arr
caa0: 61 79 20 65 6e 74 72 79 20 6f 66 66 73 65 74 2c  ay entry offset,
cab0: 20 61 6e 64 20 69 66 20 74 68 65 20 66 72 65 65   and if the free
cac0: 6c 69 73 74 20 69 73 20 6e 6f 74 20 65 6d 70 74  list is not empt
cad0: 79 2c 20 74 68 65 6e 20 73 65 61 72 63 68 20 74  y, then search t
cae0: 68 65 0a 20 20 2a 2a 20 66 72 65 65 6c 69 73 74  he.  ** freelist
caf0: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 66   looking for a f
cb00: 72 65 65 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f  ree slot big eno
cb10: 75 67 68 20 74 6f 20 73 61 74 69 73 66 79 20 74  ugh to satisfy t
cb20: 68 65 20 72 65 71 75 65 73 74 2e 0a 20 20 2a 2f  he request..  */
cb30: 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70  .  testcase( gap
cb40: 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73  +2==top );.  tes
cb50: 74 63 61 73 65 28 20 67 61 70 2b 31 3d 3d 74 6f  tcase( gap+1==to
cb60: 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  p );.  testcase(
cb70: 20 67 61 70 3d 3d 74 6f 70 20 29 3b 0a 20 20 69   gap==top );.  i
cb80: 66 28 20 28 64 61 74 61 5b 68 64 72 2b 32 5d 20  f( (data[hdr+2] 
cb90: 7c 7c 20 64 61 74 61 5b 68 64 72 2b 31 5d 29 20  || data[hdr+1]) 
cba0: 26 26 20 67 61 70 2b 32 3c 3d 74 6f 70 20 29 7b  && gap+2<=top ){
cbb0: 0a 20 20 20 20 75 38 20 2a 70 53 70 61 63 65 20  .    u8 *pSpace 
cbc0: 3d 20 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 70  = pageFindSlot(p
cbd0: 50 61 67 65 2c 20 6e 42 79 74 65 2c 20 26 72 63  Page, nByte, &rc
cbe0: 29 3b 0a 20 20 20 20 69 66 28 20 70 53 70 61 63  );.    if( pSpac
cbf0: 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  e ){.      asser
cc00: 74 28 20 70 53 70 61 63 65 3e 3d 64 61 74 61 20  t( pSpace>=data 
cc10: 26 26 20 28 70 53 70 61 63 65 20 2d 20 64 61 74  && (pSpace - dat
cc20: 61 29 3c 36 35 35 33 36 20 29 3b 0a 20 20 20 20  a)<65536 );.    
cc30: 20 20 2a 70 49 64 78 20 3d 20 28 69 6e 74 29 28    *pIdx = (int)(
cc40: 70 53 70 61 63 65 20 2d 20 64 61 74 61 29 3b 0a  pSpace - data);.
cc50: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
cc60: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  ITE_OK;.    }els
cc70: 65 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20  e if( rc ){.    
cc80: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
cc90: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
cca0: 20 72 65 71 75 65 73 74 20 63 6f 75 6c 64 20 6e   request could n
ccb0: 6f 74 20 62 65 20 66 75 6c 66 69 6c 6c 65 64 20  ot be fulfilled 
ccc0: 75 73 69 6e 67 20 61 20 66 72 65 65 6c 69 73 74  using a freelist
ccd0: 20 73 6c 6f 74 2e 20 20 43 68 65 63 6b 0a 20 20   slot.  Check.  
cce0: 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 64 65 66  ** to see if def
ccf0: 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20  ragmentation is 
cd00: 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a  necessary..  */.
cd10: 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b    testcase( gap+
cd20: 32 2b 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b 0a  2+nByte==top );.
cd30: 20 20 69 66 28 20 67 61 70 2b 32 2b 6e 42 79 74    if( gap+2+nByt
cd40: 65 3e 74 6f 70 20 29 7b 0a 20 20 20 20 61 73 73  e>top ){.    ass
cd50: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
cd60: 6c 3e 30 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  l>0 || CORRUPT_D
cd70: 42 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 65  B );.    rc = de
cd80: 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61  fragmentPage(pPa
cd90: 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
cda0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
cdb0: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e   top = get2byteN
cdc0: 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72  otZero(&data[hdr
cdd0: 2b 35 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +5]);.    assert
cde0: 28 20 67 61 70 2b 6e 42 79 74 65 3c 3d 74 6f 70  ( gap+nByte<=top
cdf0: 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41   );.  }...  /* A
ce00: 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66  llocate memory f
ce10: 72 6f 6d 20 74 68 65 20 67 61 70 20 69 6e 20 62  rom the gap in b
ce20: 65 74 77 65 65 6e 20 74 68 65 20 63 65 6c 6c 20  etween the cell 
ce30: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 0a 20 20  pointer array.  
ce40: 2a 2a 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20  ** and the cell 
ce50: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 20 54  content area.  T
ce60: 68 65 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  he btreeInitPage
ce70: 28 29 20 63 61 6c 6c 20 68 61 73 20 61 6c 72 65  () call has alre
ce80: 61 64 79 0a 20 20 2a 2a 20 76 61 6c 69 64 61 74  ady.  ** validat
ce90: 65 64 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  ed the freelist.
cea0: 20 20 47 69 76 65 6e 20 74 68 61 74 20 74 68 65    Given that the
ceb0: 20 66 72 65 65 6c 69 73 74 20 69 73 20 76 61 6c   freelist is val
cec0: 69 64 2c 20 74 68 65 72 65 0a 20 20 2a 2a 20 69  id, there.  ** i
ced0: 73 20 6e 6f 20 77 61 79 20 74 68 61 74 20 74 68  s no way that th
cee0: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e  e allocation can
cef0: 20 65 78 74 65 6e 64 20 6f 66 66 20 74 68 65 20   extend off the 
cf00: 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e  end of the page.
cf10: 0a 20 20 2a 2a 20 54 68 65 20 61 73 73 65 72 74  .  ** The assert
cf20: 28 29 20 62 65 6c 6f 77 20 76 65 72 69 66 69 65  () below verifie
cf30: 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73  s the previous s
cf40: 65 6e 74 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20  entence..  */.  
cf50: 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20  top -= nByte;.  
cf60: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
cf70: 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 61  dr+5], top);.  a
cf80: 73 73 65 72 74 28 20 74 6f 70 2b 6e 42 79 74 65  ssert( top+nByte
cf90: 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e   <= (int)pPage->
cfa0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
cfb0: 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 74 6f 70  );.  *pIdx = top
cfc0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
cfd0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
cfe0: 65 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e 20  eturn a section 
cff0: 6f 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44  of the pPage->aD
d000: 61 74 61 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ata to the freel
d010: 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73  ist..** The firs
d020: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e 65  t byte of the ne
d030: 77 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20  w free block is 
d040: 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 69 53 74  pPage->aData[iSt
d050: 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20  art].** and the 
d060: 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 63  size of the bloc
d070: 6b 20 69 73 20 69 53 69 7a 65 20 62 79 74 65 73  k is iSize bytes
d080: 2e 0a 2a 2a 0a 2a 2a 20 41 64 6a 61 63 65 6e 74  ..**.** Adjacent
d090: 20 66 72 65 65 62 6c 6f 63 6b 73 20 61 72 65 20   freeblocks are 
d0a0: 63 6f 61 6c 65 73 63 65 64 2e 0a 2a 2a 0a 2a 2a  coalesced..**.**
d0b0: 20 4e 6f 74 65 20 74 68 61 74 20 65 76 65 6e 20   Note that even 
d0c0: 74 68 6f 75 67 68 20 74 68 65 20 66 72 65 65 62  though the freeb
d0d0: 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73 20 63 68  lock list was ch
d0e0: 65 63 6b 65 64 20 62 79 20 62 74 72 65 65 49 6e  ecked by btreeIn
d0f0: 69 74 50 61 67 65 28 29 2c 0a 2a 2a 20 74 68 61  itPage(),.** tha
d100: 74 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6e  t routine will n
d110: 6f 74 20 64 65 74 65 63 74 20 6f 76 65 72 6c 61  ot detect overla
d120: 70 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 73 20  p between cells 
d130: 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 20  or freeblocks.  
d140: 4e 6f 72 0a 2a 2a 20 64 6f 65 73 20 69 74 20 64  Nor.** does it d
d150: 65 74 65 63 74 20 63 65 6c 6c 73 20 6f 72 20 66  etect cells or f
d160: 72 65 65 62 6c 6f 63 6b 73 20 74 68 61 74 20 65  reeblocks that e
d170: 6e 63 72 6f 75 63 68 20 69 6e 74 6f 20 74 68 65  ncrouch into the
d180: 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73 0a   reserved bytes.
d190: 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ** at the end of
d1a0: 20 74 68 65 20 70 61 67 65 2e 20 20 53 6f 20 64   the page.  So d
d1b0: 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 72  o additional cor
d1c0: 72 75 70 74 69 6f 6e 20 63 68 65 63 6b 73 20 69  ruption checks i
d1d0: 6e 73 69 64 65 20 74 68 69 73 0a 2a 2a 20 72 6f  nside this.** ro
d1e0: 75 74 69 6e 65 20 61 6e 64 20 72 65 74 75 72 6e  utine and return
d1f0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
d200: 69 66 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 20  if any problems 
d210: 61 72 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74  are found..*/.st
d220: 61 74 69 63 20 69 6e 74 20 66 72 65 65 53 70 61  atic int freeSpa
d230: 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ce(MemPage *pPag
d240: 65 2c 20 75 31 36 20 69 53 74 61 72 74 2c 20 75  e, u16 iStart, u
d250: 31 36 20 69 53 69 7a 65 29 7b 0a 20 20 75 31 36  16 iSize){.  u16
d260: 20 69 50 74 72 3b 20 20 20 20 20 20 20 20 20 20   iPtr;          
d270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d280: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
d290: 20 70 74 72 20 74 6f 20 6e 65 78 74 20 66 72 65   ptr to next fre
d2a0: 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 31 36 20  eblock */.  u16 
d2b0: 69 46 72 65 65 42 6c 6b 3b 20 20 20 20 20 20 20  iFreeBlk;       
d2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2d0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
d2e0: 74 68 65 20 6e 65 78 74 20 66 72 65 65 62 6c 6f  the next freeblo
d2f0: 63 6b 20 2a 2f 0a 20 20 75 38 20 68 64 72 3b 20  ck */.  u8 hdr; 
d300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d320: 20 50 61 67 65 20 68 65 61 64 65 72 20 73 69 7a   Page header siz
d330: 65 2e 20 20 30 20 6f 72 20 31 30 30 20 2a 2f 0a  e.  0 or 100 */.
d340: 20 20 75 38 20 6e 46 72 61 67 20 3d 20 30 3b 20    u8 nFrag = 0; 
d350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d360: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 64 75 63          /* Reduc
d370: 74 69 6f 6e 20 69 6e 20 66 72 61 67 6d 65 6e 74  tion in fragment
d380: 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 31 36 20 69  ation */.  u16 i
d390: 4f 72 69 67 53 69 7a 65 20 3d 20 69 53 69 7a 65  OrigSize = iSize
d3a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d3b0: 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c   /* Original val
d3c0: 75 65 20 6f 66 20 69 53 69 7a 65 20 2a 2f 0a 20  ue of iSize */. 
d3d0: 20 75 33 32 20 69 4c 61 73 74 20 3d 20 70 50 61   u32 iLast = pPa
d3e0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
d3f0: 69 7a 65 2d 34 3b 20 2f 2a 20 4c 61 72 67 65 73  ize-4; /* Larges
d400: 74 20 70 6f 73 73 69 62 6c 65 20 66 72 65 65 62  t possible freeb
d410: 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20  lock offset */. 
d420: 20 75 33 32 20 69 45 6e 64 20 3d 20 69 53 74 61   u32 iEnd = iSta
d430: 72 74 20 2b 20 69 53 69 7a 65 3b 20 20 20 20 20  rt + iSize;     
d440: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
d450: 62 79 74 65 20 70 61 73 74 20 74 68 65 20 69 53  byte past the iS
d460: 74 61 72 74 20 62 75 66 66 65 72 20 2a 2f 0a 20  tart buffer */. 
d470: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
d480: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
d490: 61 74 61 3b 20 20 20 2f 2a 20 50 61 67 65 20 63  ata;   /* Page c
d4a0: 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73  ontent */..  ass
d4b0: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21  ert( pPage->pBt!
d4c0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
d4d0: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
d4e0: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
d4f0: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
d500: 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20  ert( CORRUPT_DB 
d510: 7c 7c 20 69 53 74 61 72 74 3e 3d 70 50 61 67 65  || iStart>=pPage
d520: 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 70 50  ->hdrOffset+6+pP
d530: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
d540: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  e );.  assert( C
d550: 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 45 6e  ORRUPT_DB || iEn
d560: 64 20 3c 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  d <= pPage->pBt-
d570: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
d580: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
d590: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
d5a0: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
d5b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 69 7a  ;.  assert( iSiz
d5c0: 65 3e 3d 34 20 29 3b 20 20 20 2f 2a 20 4d 69 6e  e>=4 );   /* Min
d5d0: 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69  imum cell size i
d5e0: 73 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  s 4 */.  assert(
d5f0: 20 69 53 74 61 72 74 3c 3d 69 4c 61 73 74 20 29   iStart<=iLast )
d600: 3b 0a 0a 20 20 2f 2a 20 4f 76 65 72 77 72 69 74  ;..  /* Overwrit
d610: 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d  e deleted inform
d620: 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73  ation with zeros
d630: 20 77 68 65 6e 20 74 68 65 20 73 65 63 75 72 65   when the secure
d640: 5f 64 65 6c 65 74 65 0a 20 20 2a 2a 20 6f 70 74  _delete.  ** opt
d650: 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 2a  ion is enabled *
d660: 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70  /.  if( pPage->p
d670: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
d680: 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
d690: 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   ){.    memset(&
d6a0: 64 61 74 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c  data[iStart], 0,
d6b0: 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20   iSize);.  }..  
d6c0: 2f 2a 20 54 68 65 20 6c 69 73 74 20 6f 66 20 66  /* The list of f
d6d0: 72 65 65 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62  reeblocks must b
d6e0: 65 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  e in ascending o
d6f0: 72 64 65 72 2e 20 20 46 69 6e 64 20 74 68 65 20  rder.  Find the 
d700: 0a 20 20 2a 2a 20 73 70 6f 74 20 6f 6e 20 74 68  .  ** spot on th
d710: 65 20 6c 69 73 74 20 77 68 65 72 65 20 69 53 74  e list where iSt
d720: 61 72 74 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  art should be in
d730: 73 65 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 68  serted..  */.  h
d740: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
d750: 66 66 73 65 74 3b 0a 20 20 69 50 74 72 20 3d 20  ffset;.  iPtr = 
d760: 68 64 72 20 2b 20 31 3b 0a 20 20 69 66 28 20 64  hdr + 1;.  if( d
d770: 61 74 61 5b 69 50 74 72 2b 31 5d 3d 3d 30 20 26  ata[iPtr+1]==0 &
d780: 26 20 64 61 74 61 5b 69 50 74 72 5d 3d 3d 30 20  & data[iPtr]==0 
d790: 29 7b 0a 20 20 20 20 69 46 72 65 65 42 6c 6b 20  ){.    iFreeBlk 
d7a0: 3d 20 30 3b 20 20 2f 2a 20 53 68 6f 72 74 63 75  = 0;  /* Shortcu
d7b0: 74 20 66 6f 72 20 74 68 65 20 63 61 73 65 20 77  t for the case w
d7c0: 68 65 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74  hen the freelist
d7d0: 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20 7d   is empty */.  }
d7e0: 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28  else{.    while(
d7f0: 20 28 69 46 72 65 65 42 6c 6b 20 3d 20 67 65 74   (iFreeBlk = get
d800: 32 62 79 74 65 28 26 64 61 74 61 5b 69 50 74 72  2byte(&data[iPtr
d810: 5d 29 29 3e 30 20 26 26 20 69 46 72 65 65 42 6c  ]))>0 && iFreeBl
d820: 6b 3c 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20  k<iStart ){.    
d830: 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3c 69    if( iFreeBlk<i
d840: 50 74 72 2b 34 20 29 20 72 65 74 75 72 6e 20 53  Ptr+4 ) return S
d850: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
d860: 50 54 3b 0a 20 20 20 20 20 20 69 50 74 72 20 3d  PT;.      iPtr =
d870: 20 69 46 72 65 65 42 6c 6b 3b 0a 20 20 20 20 7d   iFreeBlk;.    }
d880: 0a 20 20 20 20 69 66 28 20 69 46 72 65 65 42 6c  .    if( iFreeBl
d890: 6b 3e 69 4c 61 73 74 20 29 20 72 65 74 75 72 6e  k>iLast ) return
d8a0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
d8b0: 42 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74  BKPT;.    assert
d8c0: 28 20 69 46 72 65 65 42 6c 6b 3e 69 50 74 72 20  ( iFreeBlk>iPtr 
d8d0: 7c 7c 20 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29  || iFreeBlk==0 )
d8e0: 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 41 74 20 74  ;.  .    /* At t
d8f0: 68 69 73 20 70 6f 69 6e 74 3a 0a 20 20 20 20 2a  his point:.    *
d900: 2a 20 20 20 20 69 46 72 65 65 42 6c 6b 3a 20 20  *    iFreeBlk:  
d910: 20 46 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b   First freeblock
d920: 20 61 66 74 65 72 20 69 53 74 61 72 74 2c 20 6f   after iStart, o
d930: 72 20 7a 65 72 6f 20 69 66 20 6e 6f 6e 65 0a 20  r zero if none. 
d940: 20 20 20 2a 2a 20 20 20 20 69 50 74 72 3a 20 20     **    iPtr:  
d950: 20 20 20 20 20 54 68 65 20 61 64 64 72 65 73 73       The address
d960: 20 6f 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   of a pointer to
d970: 20 69 46 72 65 65 42 6c 6b 0a 20 20 20 20 2a 2a   iFreeBlk.    **
d980: 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f  .    ** Check to
d990: 20 73 65 65 20 69 66 20 69 46 72 65 65 42 6c 6b   see if iFreeBlk
d9a0: 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 61 6c 65   should be coale
d9b0: 73 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e  sced onto the en
d9c0: 64 20 6f 66 20 69 53 74 61 72 74 2e 0a 20 20 20  d of iStart..   
d9d0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 46 72 65   */.    if( iFre
d9e0: 65 42 6c 6b 20 26 26 20 69 45 6e 64 2b 33 3e 3d  eBlk && iEnd+3>=
d9f0: 69 46 72 65 65 42 6c 6b 20 29 7b 0a 20 20 20 20  iFreeBlk ){.    
da00: 20 20 6e 46 72 61 67 20 3d 20 69 46 72 65 65 42    nFrag = iFreeB
da10: 6c 6b 20 2d 20 69 45 6e 64 3b 0a 20 20 20 20 20  lk - iEnd;.     
da20: 20 69 66 28 20 69 45 6e 64 3e 69 46 72 65 65 42   if( iEnd>iFreeB
da30: 6c 6b 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  lk ) return SQLI
da40: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
da50: 0a 20 20 20 20 20 20 69 45 6e 64 20 3d 20 69 46  .      iEnd = iF
da60: 72 65 65 42 6c 6b 20 2b 20 67 65 74 32 62 79 74  reeBlk + get2byt
da70: 65 28 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b  e(&data[iFreeBlk
da80: 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  +2]);.      if( 
da90: 69 45 6e 64 20 3e 20 70 50 61 67 65 2d 3e 70 42  iEnd > pPage->pB
daa0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 20  t->usableSize ) 
dab0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
dac0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
dad0: 20 20 69 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d    iSize = iEnd -
dae0: 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 69   iStart;.      i
daf0: 46 72 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79  FreeBlk = get2by
db00: 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 42 6c  te(&data[iFreeBl
db10: 6b 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  k]);.    }.  .  
db20: 20 20 2f 2a 20 49 66 20 69 50 74 72 20 69 73 20    /* If iPtr is 
db30: 61 6e 6f 74 68 65 72 20 66 72 65 65 62 6c 6f 63  another freebloc
db40: 6b 20 28 74 68 61 74 20 69 73 2c 20 69 66 20 69  k (that is, if i
db50: 50 74 72 20 69 73 20 6e 6f 74 20 74 68 65 20 66  Ptr is not the f
db60: 72 65 65 6c 69 73 74 0a 20 20 20 20 2a 2a 20 70  reelist.    ** p
db70: 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20 70 61  ointer in the pa
db80: 67 65 20 68 65 61 64 65 72 29 20 74 68 65 6e 20  ge header) then 
db90: 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  check to see if 
dba0: 69 53 74 61 72 74 20 73 68 6f 75 6c 64 20 62 65  iStart should be
dbb0: 0a 20 20 20 20 2a 2a 20 63 6f 61 6c 65 73 63 65  .    ** coalesce
dbc0: 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f  d onto the end o
dbd0: 66 20 69 50 74 72 2e 0a 20 20 20 20 2a 2f 0a 20  f iPtr..    */. 
dbe0: 20 20 20 69 66 28 20 69 50 74 72 3e 68 64 72 2b     if( iPtr>hdr+
dbf0: 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  1 ){.      int i
dc00: 50 74 72 45 6e 64 20 3d 20 69 50 74 72 20 2b 20  PtrEnd = iPtr + 
dc10: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
dc20: 50 74 72 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69  Ptr+2]);.      i
dc30: 66 28 20 69 50 74 72 45 6e 64 2b 33 3e 3d 69 53  f( iPtrEnd+3>=iS
dc40: 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  tart ){.        
dc50: 69 66 28 20 69 50 74 72 45 6e 64 3e 69 53 74 61  if( iPtrEnd>iSta
dc60: 72 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  rt ) return SQLI
dc70: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
dc80: 0a 20 20 20 20 20 20 20 20 6e 46 72 61 67 20 2b  .        nFrag +
dc90: 3d 20 69 53 74 61 72 74 20 2d 20 69 50 74 72 45  = iStart - iPtrE
dca0: 6e 64 3b 0a 20 20 20 20 20 20 20 20 69 53 69 7a  nd;.        iSiz
dcb0: 65 20 3d 20 69 45 6e 64 20 2d 20 69 50 74 72 3b  e = iEnd - iPtr;
dcc0: 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20  .        iStart 
dcd0: 3d 20 69 50 74 72 3b 0a 20 20 20 20 20 20 7d 0a  = iPtr;.      }.
dce0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 46      }.    if( nF
dcf0: 72 61 67 3e 64 61 74 61 5b 68 64 72 2b 37 5d 20  rag>data[hdr+7] 
dd00: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
dd10: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
dd20: 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d    data[hdr+7] -=
dd30: 20 6e 46 72 61 67 3b 0a 20 20 7d 0a 20 20 69 66   nFrag;.  }.  if
dd40: 28 20 69 53 74 61 72 74 3d 3d 67 65 74 32 62 79  ( iStart==get2by
dd50: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
dd60: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e   ){.    /* The n
dd70: 65 77 20 66 72 65 65 62 6c 6f 63 6b 20 69 73 20  ew freeblock is 
dd80: 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
dd90: 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   of the cell con
dda0: 74 65 6e 74 20 61 72 65 61 2c 0a 20 20 20 20 2a  tent area,.    *
ddb0: 2a 20 73 6f 20 6a 75 73 74 20 65 78 74 65 6e 64  * so just extend
ddc0: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
ddd0: 74 20 61 72 65 61 20 72 61 74 68 65 72 20 74 68  t area rather th
dde0: 61 6e 20 63 72 65 61 74 65 20 61 6e 6f 74 68 65  an create anothe
ddf0: 72 0a 20 20 20 20 2a 2a 20 66 72 65 65 6c 69 73  r.    ** freelis
de00: 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20 69  t entry */.    i
de10: 66 28 20 69 50 74 72 21 3d 68 64 72 2b 31 20 29  f( iPtr!=hdr+1 )
de20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
de30: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
de40: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
de50: 68 64 72 2b 31 5d 2c 20 69 46 72 65 65 42 6c 6b  hdr+1], iFreeBlk
de60: 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
de70: 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 69 45  &data[hdr+5], iE
de80: 6e 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  nd);.  }else{.  
de90: 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20    /* Insert the 
dea0: 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b 20 69 6e  new freeblock in
deb0: 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  to the freelist 
dec0: 2a 2f 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  */.    put2byte(
ded0: 26 64 61 74 61 5b 69 50 74 72 5d 2c 20 69 53 74  &data[iPtr], iSt
dee0: 61 72 74 29 3b 0a 20 20 20 20 70 75 74 32 62 79  art);.    put2by
def0: 74 65 28 26 64 61 74 61 5b 69 53 74 61 72 74 5d  te(&data[iStart]
df00: 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20 20  , iFreeBlk);.   
df10: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
df20: 69 53 74 61 72 74 2b 32 5d 2c 20 69 53 69 7a 65  iStart+2], iSize
df30: 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e  );.  }.  pPage->
df40: 6e 46 72 65 65 20 2b 3d 20 69 4f 72 69 67 53 69  nFree += iOrigSi
df50: 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ze;.  return SQL
df60: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
df70: 20 44 65 63 6f 64 65 20 74 68 65 20 66 6c 61 67   Decode the flag
df80: 73 20 62 79 74 65 20 28 74 68 65 20 66 69 72 73  s byte (the firs
df90: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 68 65  t byte of the he
dfa0: 61 64 65 72 29 20 66 6f 72 20 61 20 70 61 67 65  ader) for a page
dfb0: 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  .** and initiali
dfc0: 7a 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  ze fields of the
dfd0: 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74 75   MemPage structu
dfe0: 72 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a  re accordingly..
dff0: 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66  **.** Only the f
e000: 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61  ollowing combina
e010: 74 69 6f 6e 73 20 61 72 65 20 73 75 70 70 6f 72  tions are suppor
e020: 74 65 64 2e 20 20 41 6e 79 74 68 69 6e 67 20 64  ted.  Anything d
e030: 69 66 66 65 72 65 6e 74 0a 2a 2a 20 69 6e 64 69  ifferent.** indi
e040: 63 61 74 65 73 20 61 20 63 6f 72 72 75 70 74 20  cates a corrupt 
e050: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 3a 0a  database files:.
e060: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54  **.**         PT
e070: 46 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a 20 20 20  F_ZERODATA.**   
e080: 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41        PTF_ZERODA
e090: 54 41 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2a  TA | PTF_LEAF.**
e0a0: 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41           PTF_LEA
e0b0: 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b  FDATA | PTF_INTK
e0c0: 45 59 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54  EY.**         PT
e0d0: 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46  F_LEAFDATA | PTF
e0e0: 5f 49 4e 54 4b 45 59 20 7c 20 50 54 46 5f 4c 45  _INTKEY | PTF_LE
e0f0: 41 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  AF.*/.static int
e100: 20 64 65 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d   decodeFlags(Mem
e110: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
e120: 20 66 6c 61 67 42 79 74 65 29 7b 0a 20 20 42 74   flagByte){.  Bt
e130: 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20  Shared *pBt;    
e140: 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 50   /* A copy of pP
e150: 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61  age->pBt */..  a
e160: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 68 64  ssert( pPage->hd
e170: 72 4f 66 66 73 65 74 3d 3d 28 70 50 61 67 65 2d  rOffset==(pPage-
e180: 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a  >pgno==1 ? 100 :
e190: 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28   0) );.  assert(
e1a0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
e1b0: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
e1c0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67  mutex) );.  pPag
e1d0: 65 2d 3e 6c 65 61 66 20 3d 20 28 75 38 29 28 66  e->leaf = (u8)(f
e1e0: 6c 61 67 42 79 74 65 3e 3e 33 29 3b 20 20 61 73  lagByte>>3);  as
e1f0: 73 65 72 74 28 20 50 54 46 5f 4c 45 41 46 20 3d  sert( PTF_LEAF =
e200: 3d 20 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67  = 1<<3 );.  flag
e210: 42 79 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41  Byte &= ~PTF_LEA
e220: 46 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68 69 6c  F;.  pPage->chil
e230: 64 50 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70  dPtrSize = 4-4*p
e240: 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 50  Page->leaf;.  pP
e250: 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20 3d  age->xCellSize =
e260: 20 63 65 6c 6c 53 69 7a 65 50 74 72 3b 0a 20 20   cellSizePtr;.  
e270: 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
e280: 3b 0a 20 20 69 66 28 20 66 6c 61 67 42 79 74 65  ;.  if( flagByte
e290: 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41 54 41 20  ==(PTF_LEAFDATA 
e2a0: 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b  | PTF_INTKEY) ){
e2b0: 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
e2c0: 2d 4f 46 3a 20 52 2d 30 33 36 34 30 2d 31 33 34  -OF: R-03640-134
e2d0: 31 35 20 41 20 76 61 6c 75 65 20 6f 66 20 35 20  15 A value of 5 
e2e0: 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69  means the page i
e2f0: 73 20 61 6e 20 69 6e 74 65 72 69 6f 72 0a 20 20  s an interior.  
e300: 20 20 2a 2a 20 74 61 62 6c 65 20 62 2d 74 72 65    ** table b-tre
e310: 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61  e page. */.    a
e320: 73 73 65 72 74 28 20 28 50 54 46 5f 4c 45 41 46  ssert( (PTF_LEAF
e330: 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59 29  DATA|PTF_INTKEY)
e340: 3d 3d 35 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56  ==5 );.    /* EV
e350: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 30 35  IDENCE-OF: R-205
e360: 30 31 2d 36 31 37 39 36 20 41 20 76 61 6c 75 65  01-61796 A value
e370: 20 6f 66 20 31 33 20 6d 65 61 6e 73 20 74 68 65   of 13 means the
e380: 20 70 61 67 65 20 69 73 20 61 20 6c 65 61 66 0a   page is a leaf.
e390: 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 62 2d 74      ** table b-t
e3a0: 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  ree page. */.   
e3b0: 20 61 73 73 65 72 74 28 20 28 50 54 46 5f 4c 45   assert( (PTF_LE
e3c0: 41 46 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45  AFDATA|PTF_INTKE
e3d0: 59 7c 50 54 46 5f 4c 45 41 46 29 3d 3d 31 33 20  Y|PTF_LEAF)==13 
e3e0: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  );.    pPage->in
e3f0: 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 69 66  tKey = 1;.    if
e400: 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
e410: 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  .      pPage->in
e420: 74 4b 65 79 4c 65 61 66 20 3d 20 31 3b 0a 20 20  tKeyLeaf = 1;.  
e430: 20 20 20 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79      pPage->noPay
e440: 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  load = 0;.      
e450: 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
e460: 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65 43 65  l = btreeParseCe
e470: 6c 6c 50 74 72 3b 0a 20 20 20 20 7d 65 6c 73 65  llPtr;.    }else
e480: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69  {.      pPage->i
e490: 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20  ntKeyLeaf = 0;. 
e4a0: 20 20 20 20 20 70 50 61 67 65 2d 3e 6e 6f 50 61       pPage->noPa
e4b0: 79 6c 6f 61 64 20 3d 20 31 3b 0a 20 20 20 20 20  yload = 1;.     
e4c0: 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a   pPage->xCellSiz
e4d0: 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e  e = cellSizePtrN
e4e0: 6f 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 20 20  oPayload;.      
e4f0: 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
e500: 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65 43 65  l = btreeParseCe
e510: 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a  llPtrNoPayload;.
e520: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d      }.    pPage-
e530: 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d  >maxLocal = pBt-
e540: 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50  >maxLeaf;.    pP
e550: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  age->minLocal = 
e560: 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20  pBt->minLeaf;.  
e570: 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 42 79  }else if( flagBy
e580: 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41  te==PTF_ZERODATA
e590: 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45   ){.    /* EVIDE
e5a0: 4e 43 45 2d 4f 46 3a 20 52 2d 32 37 32 32 35 2d  NCE-OF: R-27225-
e5b0: 35 33 39 33 36 20 41 20 76 61 6c 75 65 20 6f 66  53936 A value of
e5c0: 20 32 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67   2 means the pag
e5d0: 65 20 69 73 20 61 6e 20 69 6e 74 65 72 69 6f 72  e is an interior
e5e0: 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 62 2d  .    ** index b-
e5f0: 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20  tree page. */.  
e600: 20 20 61 73 73 65 72 74 28 20 28 50 54 46 5f 5a    assert( (PTF_Z
e610: 45 52 4f 44 41 54 41 29 3d 3d 32 20 29 3b 0a 20  ERODATA)==2 );. 
e620: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
e630: 46 3a 20 52 2d 31 36 35 37 31 2d 31 31 36 31 35  F: R-16571-11615
e640: 20 41 20 76 61 6c 75 65 20 6f 66 20 31 30 20 6d   A value of 10 m
e650: 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73  eans the page is
e660: 20 61 20 6c 65 61 66 0a 20 20 20 20 2a 2a 20 69   a leaf.    ** i
e670: 6e 64 65 78 20 62 2d 74 72 65 65 20 70 61 67 65  ndex b-tree page
e680: 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
e690: 20 28 50 54 46 5f 5a 45 52 4f 44 41 54 41 7c 50   (PTF_ZERODATA|P
e6a0: 54 46 5f 4c 45 41 46 29 3d 3d 31 30 20 29 3b 0a  TF_LEAF)==10 );.
e6b0: 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
e6c0: 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  y = 0;.    pPage
e6d0: 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30  ->intKeyLeaf = 0
e6e0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 6f 50  ;.    pPage->noP
e6f0: 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20 20  ayload = 0;.    
e700: 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
e710: 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65 43 65  l = btreeParseCe
e720: 6c 6c 50 74 72 49 6e 64 65 78 3b 0a 20 20 20 20  llPtrIndex;.    
e730: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
e740: 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b  = pBt->maxLocal;
e750: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c  .    pPage->minL
e760: 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c  ocal = pBt->minL
e770: 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ocal;.  }else{. 
e780: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
e790: 46 3a 20 52 2d 34 37 36 30 38 2d 35 36 34 36 39  F: R-47608-56469
e7a0: 20 41 6e 79 20 6f 74 68 65 72 20 76 61 6c 75 65   Any other value
e7b0: 20 66 6f 72 20 74 68 65 20 62 2d 74 72 65 65 20   for the b-tree 
e7c0: 70 61 67 65 20 74 79 70 65 20 69 73 0a 20 20 20  page type is.   
e7d0: 20 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 2a 2f   ** an error. */
e7e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
e7f0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
e800: 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6d 61  .  }.  pPage->ma
e810: 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20  x1bytePayload = 
e820: 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79  pBt->max1bytePay
e830: 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e 20 53  load;.  return S
e840: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
e850: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
e860: 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f  e auxiliary info
e870: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69  rmation for a di
e880: 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  sk block..**.** 
e890: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
e8a0: 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
e8b0: 20 77 65 20 73 65 65 20 74 68 61 74 20 74 68 65   we see that the
e8c0: 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f   page does.** no
e8d0: 74 20 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c  t contain a well
e8e0: 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65  -formed database
e8f0: 20 70 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75   page, then retu
e900: 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f  rn .** SQLITE_CO
e910: 52 52 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61  RRUPT.  Note tha
e920: 74 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51  t a return of SQ
e930: 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74  LITE_OK does not
e940: 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68  .** guarantee th
e950: 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 77  at the page is w
e960: 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20  ell-formed.  It 
e970: 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a  only shows that.
e980: 2a 2a 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20  ** we failed to 
e990: 64 65 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75  detect any corru
e9a0: 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ption..*/.static
e9b0: 20 69 6e 74 20 62 74 72 65 65 49 6e 69 74 50 61   int btreeInitPa
e9c0: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
e9d0: 65 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  e){..  assert( p
e9e0: 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a  Page->pBt!=0 );.
e9f0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
ea00: 3e 70 42 74 2d 3e 64 62 21 3d 30 20 29 3b 0a 20  >pBt->db!=0 );. 
ea10: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
ea20: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
ea30: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
ea40: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
ea50: 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33  e->pgno==sqlite3
ea60: 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28  PagerPagenumber(
ea70: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
ea80: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
ea90: 67 65 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67  ge == sqlite3Pag
eaa0: 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
eab0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
eac0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61  assert( pPage->a
ead0: 44 61 74 61 20 3d 3d 20 73 71 6c 69 74 65 33 50  Data == sqlite3P
eae0: 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
eaf0: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
eb00: 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69 73    if( !pPage->is
eb10: 49 6e 69 74 20 29 7b 0a 20 20 20 20 75 31 36 20  Init ){.    u16 
eb20: 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  pc;            /
eb30: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 20 66  * Address of a f
eb40: 72 65 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20  reeblock within 
eb50: 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a  pPage->aData[] *
eb60: 2f 0a 20 20 20 20 75 38 20 68 64 72 3b 20 20 20  /.    u8 hdr;   
eb70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
eb80: 65 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20  et to beginning 
eb90: 6f 66 20 70 61 67 65 20 68 65 61 64 65 72 20 2a  of page header *
eba0: 2f 0a 20 20 20 20 75 38 20 2a 64 61 74 61 3b 20  /.    u8 *data; 
ebb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61           /* Equa
ebc0: 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74  l to pPage->aDat
ebd0: 61 20 2a 2f 0a 20 20 20 20 42 74 53 68 61 72 65  a */.    BtShare
ebe0: 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f  d *pBt;        /
ebf0: 2a 20 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65  * The main btree
ec00: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
ec10: 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65    int usableSize
ec20: 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f  ;    /* Amount o
ec30: 66 20 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f  f usable space o
ec40: 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20  n each page */. 
ec50: 20 20 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65     u16 cellOffse
ec60: 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20  t;    /* Offset 
ec70: 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20 70 61  from start of pa
ec80: 67 65 20 74 6f 20 66 69 72 73 74 20 63 65 6c 6c  ge to first cell
ec90: 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20   pointer */.    
eca0: 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20  int nFree;      
ecb0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
ecc0: 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20  unused bytes on 
ecd0: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  the page */.    
ece0: 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20  int top;        
ecf0: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
ed00: 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   of the cell con
ed10: 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 20  tent area */.   
ed20: 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b   int iCellFirst;
ed30: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c      /* First all
ed40: 6f 77 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66  owable cell or f
ed50: 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20  reeblock offset 
ed60: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c  */.    int iCell
ed70: 4c 61 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73  Last;     /* Las
ed80: 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20  t possible cell 
ed90: 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66  or freeblock off
eda0: 73 65 74 20 2a 2f 0a 0a 20 20 20 20 70 42 74 20  set */..    pBt 
edb0: 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20  = pPage->pBt;.. 
edc0: 20 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e     hdr = pPage->
edd0: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 64  hdrOffset;.    d
ede0: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
edf0: 74 61 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45  ta;.    /* EVIDE
ee00: 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 35 39 34 2d  NCE-OF: R-28594-
ee10: 30 32 38 39 30 20 54 68 65 20 6f 6e 65 2d 62 79  02890 The one-by
ee20: 74 65 20 66 6c 61 67 20 61 74 20 6f 66 66 73 65  te flag at offse
ee30: 74 20 30 20 69 6e 64 69 63 61 74 69 6e 67 0a 20  t 0 indicating. 
ee40: 20 20 20 2a 2a 20 74 68 65 20 62 2d 74 72 65 65     ** the b-tree
ee50: 20 70 61 67 65 20 74 79 70 65 2e 20 2a 2f 0a 20   page type. */. 
ee60: 20 20 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61     if( decodeFla
ee70: 67 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68  gs(pPage, data[h
ee80: 64 72 5d 29 20 29 20 72 65 74 75 72 6e 20 53 51  dr]) ) return SQ
ee90: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
eea0: 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  T;.    assert( p
eeb0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31  Bt->pageSize>=51
eec0: 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69  2 && pBt->pageSi
eed0: 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 20  ze<=65536 );.   
eee0: 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65   pPage->maskPage
eef0: 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61   = (u16)(pBt->pa
ef00: 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 20  geSize - 1);.   
ef10: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
ef20: 77 20 3d 20 30 3b 0a 20 20 20 20 75 73 61 62 6c  w = 0;.    usabl
ef30: 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  eSize = pBt->usa
ef40: 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 70 50 61  bleSize;.    pPa
ef50: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ge->cellOffset =
ef60: 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64   cellOffset = hd
ef70: 72 20 2b 20 38 20 2b 20 70 50 61 67 65 2d 3e 63  r + 8 + pPage->c
ef80: 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20  hildPtrSize;.   
ef90: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64   pPage->aDataEnd
efa0: 20 3d 20 26 64 61 74 61 5b 75 73 61 62 6c 65 53   = &data[usableS
efb0: 69 7a 65 5d 3b 0a 20 20 20 20 70 50 61 67 65 2d  ize];.    pPage-
efc0: 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74  >aCellIdx = &dat
efd0: 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a 20  a[cellOffset];. 
efe0: 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 4f     pPage->aDataO
eff0: 66 73 74 20 3d 20 26 64 61 74 61 5b 70 50 61 67  fst = &data[pPag
f000: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d  e->childPtrSize]
f010: 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
f020: 45 2d 4f 46 3a 20 52 2d 35 38 30 31 35 2d 34 38  E-OF: R-58015-48
f030: 31 37 35 20 54 68 65 20 74 77 6f 2d 62 79 74 65  175 The two-byte
f040: 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73   integer at offs
f050: 65 74 20 35 20 64 65 73 69 67 6e 61 74 65 73 0a  et 5 designates.
f060: 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 72 74      ** the start
f070: 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   of the cell con
f080: 74 65 6e 74 20 61 72 65 61 2e 20 41 20 7a 65 72  tent area. A zer
f090: 6f 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73  o value for this
f0a0: 20 69 6e 74 65 67 65 72 20 69 73 0a 20 20 20 20   integer is.    
f0b0: 2a 2a 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  ** interpreted a
f0c0: 73 20 36 35 35 33 36 2e 20 2a 2f 0a 20 20 20 20  s 65536. */.    
f0d0: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f  top = get2byteNo
f0e0: 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b  tZero(&data[hdr+
f0f0: 35 5d 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  5]);.    /* EVID
f100: 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 30 30 32  ENCE-OF: R-37002
f110: 2d 33 32 37 37 34 20 54 68 65 20 74 77 6f 2d 62  -32774 The two-b
f120: 79 74 65 20 69 6e 74 65 67 65 72 20 61 74 20 6f  yte integer at o
f130: 66 66 73 65 74 20 33 20 67 69 76 65 73 20 74 68  ffset 3 gives th
f140: 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20  e.    ** number 
f150: 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20  of cells on the 
f160: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 70 50 61  page. */.    pPa
f170: 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32  ge->nCell = get2
f180: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
f190: 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  ]);.    if( pPag
f1a0: 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c  e->nCell>MX_CELL
f1b0: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  (pBt) ){.      /
f1c0: 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20  * To many cells 
f1d0: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 70 61 67  for a single pag
f1e0: 65 2e 20 20 54 68 65 20 70 61 67 65 20 6d 75 73  e.  The page mus
f1f0: 74 20 62 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a  t be corrupt */.
f200: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
f210: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
f220: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74  ;.    }.    test
f230: 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 43 65  case( pPage->nCe
f240: 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42 74 29  ll==MX_CELL(pBt)
f250: 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45   );.    /* EVIDE
f260: 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 30 38 39 2d  NCE-OF: R-24089-
f270: 35 37 39 37 39 20 49 66 20 61 20 70 61 67 65 20  57979 If a page 
f280: 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c  contains no cell
f290: 73 20 28 77 68 69 63 68 20 69 73 20 6f 6e 6c 79  s (which is only
f2a0: 0a 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65  .    ** possible
f2b0: 20 66 6f 72 20 61 20 72 6f 6f 74 20 70 61 67 65   for a root page
f2c0: 20 6f 66 20 61 20 74 61 62 6c 65 20 74 68 61 74   of a table that
f2d0: 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 6f 77   contains no row
f2e0: 73 29 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20  s) then the.    
f2f0: 2a 2a 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65  ** offset to the
f300: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
f310: 65 61 20 77 69 6c 6c 20 65 71 75 61 6c 20 74 68  ea will equal th
f320: 65 20 70 61 67 65 20 73 69 7a 65 20 6d 69 6e 75  e page size minu
f330: 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 62 79 74  s the.    ** byt
f340: 65 73 20 6f 66 20 72 65 73 65 72 76 65 64 20 73  es of reserved s
f350: 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  pace. */.    ass
f360: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
f370: 6c 3e 30 20 7c 7c 20 74 6f 70 3d 3d 75 73 61 62  l>0 || top==usab
f380: 6c 65 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55 50  leSize || CORRUP
f390: 54 5f 44 42 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  T_DB );..    /* 
f3a0: 41 20 6d 61 6c 66 6f 72 6d 65 64 20 64 61 74 61  A malformed data
f3b0: 62 61 73 65 20 70 61 67 65 20 6d 69 67 68 74 20  base page might 
f3c0: 63 61 75 73 65 20 75 73 20 74 6f 20 72 65 61 64  cause us to read
f3d0: 20 70 61 73 74 20 74 68 65 20 65 6e 64 0a 20 20   past the end.  
f3e0: 20 20 2a 2a 20 6f 66 20 70 61 67 65 20 77 68 65    ** of page whe
f3f0: 6e 20 70 61 72 73 69 6e 67 20 61 20 63 65 6c 6c  n parsing a cell
f400: 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  .  .    **.    *
f410: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
f420: 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 63 68  block of code ch
f430: 65 63 6b 73 20 65 61 72 6c 79 20 74 6f 20 73 65  ecks early to se
f440: 65 20 69 66 20 61 20 63 65 6c 6c 20 65 78 74 65  e if a cell exte
f450: 6e 64 73 0a 20 20 20 20 2a 2a 20 70 61 73 74 20  nds.    ** past 
f460: 74 68 65 20 65 6e 64 20 6f 66 20 61 20 70 61 67  the end of a pag
f470: 65 20 62 6f 75 6e 64 61 72 79 20 61 6e 64 20 63  e boundary and c
f480: 61 75 73 65 73 20 53 51 4c 49 54 45 5f 43 4f 52  auses SQLITE_COR
f490: 52 55 50 54 20 74 6f 20 62 65 20 0a 20 20 20 20  RUPT to be .    
f4a0: 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 66 20 69  ** returned if i
f4b0: 74 20 64 6f 65 73 2e 0a 20 20 20 20 2a 2f 0a 20  t does..    */. 
f4c0: 20 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20     iCellFirst = 
f4d0: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70  cellOffset + 2*p
f4e0: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20  Page->nCell;.   
f4f0: 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61   iCellLast = usa
f500: 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20  bleSize - 4;.   
f510: 20 69 66 28 20 70 42 74 2d 3e 64 62 2d 3e 66 6c   if( pBt->db->fl
f520: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43 65 6c  ags & SQLITE_Cel
f530: 6c 53 69 7a 65 43 6b 20 29 7b 0a 20 20 20 20 20  lSizeCk ){.     
f540: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
f550: 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f     /* Index into
f560: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
f570: 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 20  r array */.     
f580: 20 69 6e 74 20 73 7a 3b 20 20 20 20 20 20 20 20   int sz;        
f590: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20     /* Size of a 
f5a0: 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20 20 20 69  cell */..      i
f5b0: 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
f5c0: 29 20 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20  ) iCellLast--;. 
f5d0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
f5e0: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b  pPage->nCell; i+
f5f0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 63 20 3d  +){.        pc =
f600: 20 67 65 74 32 62 79 74 65 41 6c 69 67 6e 65 64   get2byteAligned
f610: 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65  (&data[cellOffse
f620: 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20 20  t+i*2]);.       
f630: 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69   testcase( pc==i
f640: 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20  CellFirst );.   
f650: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
f660: 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a  c==iCellLast );.
f670: 20 20 20 20 20 20 20 20 69 66 28 20 70 63 3c 69          if( pc<i
f680: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e  CellFirst || pc>
f690: 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20  iCellLast ){.   
f6a0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
f6b0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
f6c0: 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  T;.        }.   
f6d0: 20 20 20 20 20 73 7a 20 3d 20 70 50 61 67 65 2d       sz = pPage-
f6e0: 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65  >xCellSize(pPage
f6f0: 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20  , &data[pc]);.  
f700: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
f710: 70 63 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a  pc+sz==usableSiz
f720: 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  e );.        if(
f730: 20 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a   pc+sz>usableSiz
f740: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  e ){.          r
f750: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
f760: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
f770: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
f780: 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
f790: 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b  eaf ) iCellLast+
f7a0: 2b 3b 0a 20 20 20 20 7d 20 20 0a 0a 20 20 20 20  +;.    }  ..    
f7b0: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74  /* Compute the t
f7c0: 6f 74 61 6c 20 66 72 65 65 20 73 70 61 63 65 20  otal free space 
f7d0: 6f 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  on the page.    
f7e0: 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  ** EVIDENCE-OF: 
f7f0: 52 2d 32 33 35 38 38 2d 33 34 34 35 30 20 54 68  R-23588-34450 Th
f800: 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67  e two-byte integ
f810: 65 72 20 61 74 20 6f 66 66 73 65 74 20 31 20 67  er at offset 1 g
f820: 69 76 65 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  ives the.    ** 
f830: 73 74 61 72 74 20 6f 66 20 74 68 65 20 66 69 72  start of the fir
f840: 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 6f 6e 20  st freeblock on 
f850: 74 68 65 20 70 61 67 65 2c 20 6f 72 20 69 73 20  the page, or is 
f860: 7a 65 72 6f 20 69 66 20 74 68 65 72 65 20 61 72  zero if there ar
f870: 65 20 6e 6f 0a 20 20 20 20 2a 2a 20 66 72 65 65  e no.    ** free
f880: 62 6c 6f 63 6b 73 2e 20 2a 2f 0a 20 20 20 20 70  blocks. */.    p
f890: 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  c = get2byte(&da
f8a0: 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20  ta[hdr+1]);.    
f8b0: 6e 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72  nFree = data[hdr
f8c0: 2b 37 5d 20 2b 20 74 6f 70 3b 20 20 2f 2a 20 49  +7] + top;  /* I
f8d0: 6e 69 74 20 6e 46 72 65 65 20 74 6f 20 6e 6f 6e  nit nFree to non
f8e0: 2d 66 72 65 65 62 6c 6f 63 6b 20 66 72 65 65 20  -freeblock free 
f8f0: 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 77 68 69  space */.    whi
f900: 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20  le( pc>0 ){.    
f910: 20 20 75 31 36 20 6e 65 78 74 2c 20 73 69 7a 65    u16 next, size
f920: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 63 3c 69  ;.      if( pc<i
f930: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e  CellFirst || pc>
f940: 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20  iCellLast ){.   
f950: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
f960: 2d 4f 46 3a 20 52 2d 35 35 35 33 30 2d 35 32 39  -OF: R-55530-529
f970: 33 30 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72  30 In a well-for
f980: 6d 65 64 20 62 2d 74 72 65 65 20 70 61 67 65 2c  med b-tree page,
f990: 20 74 68 65 72 65 20 77 69 6c 6c 0a 20 20 20 20   there will.    
f9a0: 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 62 65      ** always be
f9b0: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 63 65   at least one ce
f9c0: 6c 6c 20 62 65 66 6f 72 65 20 74 68 65 20 66 69  ll before the fi
f9d0: 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 2e 0a 20  rst freeblock.. 
f9e0: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
f9f0: 20 20 2a 2a 20 4f 72 2c 20 74 68 65 20 66 72 65    ** Or, the fre
fa00: 65 62 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74 68  eblock is off th
fa10: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67  e end of the pag
fa20: 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  e.        */.   
fa30: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
fa40: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
fa50: 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20   .      }.      
fa60: 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74 65 28  next = get2byte(
fa70: 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20  &data[pc]);.    
fa80: 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74    size = get2byt
fa90: 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a  e(&data[pc+2]);.
faa0: 20 20 20 20 20 20 69 66 28 20 28 6e 65 78 74 3e        if( (next>
fab0: 30 20 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69  0 && next<=pc+si
fac0: 7a 65 2b 33 29 20 7c 7c 20 70 63 2b 73 69 7a 65  ze+3) || pc+size
fad0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
fae0: 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62         /* Free b
faf0: 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e  locks must be in
fb00: 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
fb10: 2e 20 41 6e 64 20 74 68 65 20 6c 61 73 74 20 62  . And the last b
fb20: 79 74 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a  yte of.        *
fb30: 2a 20 74 68 65 20 66 72 65 65 2d 62 6c 6f 63 6b  * the free-block
fb40: 20 6d 75 73 74 20 6c 69 65 20 6f 6e 20 74 68 65   must lie on the
fb50: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20   database page. 
fb60: 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75   */.        retu
fb70: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
fb80: 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d  T_BKPT; .      }
fb90: 0a 20 20 20 20 20 20 6e 46 72 65 65 20 3d 20 6e  .      nFree = n
fba0: 46 72 65 65 20 2b 20 73 69 7a 65 3b 0a 20 20 20  Free + size;.   
fbb0: 20 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20     pc = next;.  
fbc0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74    }..    /* At t
fbd0: 68 69 73 20 70 6f 69 6e 74 2c 20 6e 46 72 65 65  his point, nFree
fbe0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 75   contains the su
fbf0: 6d 20 6f 66 20 74 68 65 20 6f 66 66 73 65 74 20  m of the offset 
fc00: 74 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20 20  to the start.   
fc10: 20 2a 2a 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d   ** of the cell-
fc20: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 70 6c 75  content area plu
fc30: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
fc40: 66 72 65 65 20 62 79 74 65 73 20 77 69 74 68 69  free bytes withi
fc50: 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 65 6c  n.    ** the cel
fc60: 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20  l-content area. 
fc70: 49 66 20 74 68 69 73 20 69 73 20 67 72 65 61 74  If this is great
fc80: 65 72 20 74 68 61 6e 20 74 68 65 20 75 73 61 62  er than the usab
fc90: 6c 65 2d 73 69 7a 65 0a 20 20 20 20 2a 2a 20 6f  le-size.    ** o
fca0: 66 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e  f the page, then
fcb0: 20 74 68 65 20 70 61 67 65 20 6d 75 73 74 20 62   the page must b
fcc0: 65 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69  e corrupted. Thi
fcd0: 73 20 63 68 65 63 6b 20 61 6c 73 6f 0a 20 20 20  s check also.   
fce0: 20 2a 2a 20 73 65 72 76 65 73 20 74 6f 20 76 65   ** serves to ve
fcf0: 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6f 66  rify that the of
fd00: 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72  fset to the star
fd10: 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f  t of the cell-co
fd20: 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20 61 72 65  ntent.    ** are
fd30: 61 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  a, according to 
fd40: 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72 2c  the page header,
fd50: 20 6c 69 65 73 20 77 69 74 68 69 6e 20 74 68 65   lies within the
fd60: 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
fd70: 20 20 69 66 28 20 6e 46 72 65 65 3e 75 73 61 62    if( nFree>usab
fd80: 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
fd90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
fda0: 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20  RRUPT_BKPT; .   
fdb0: 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46   }.    pPage->nF
fdc0: 72 65 65 20 3d 20 28 75 31 36 29 28 6e 46 72 65  ree = (u16)(nFre
fdd0: 65 20 2d 20 69 43 65 6c 6c 46 69 72 73 74 29 3b  e - iCellFirst);
fde0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
fdf0: 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65  it = 1;.  }.  re
fe00: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
fe10: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20  }../*.** Set up 
fe20: 61 20 72 61 77 20 70 61 67 65 20 73 6f 20 74 68  a raw page so th
fe30: 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65  at it looks like
fe40: 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
fe50: 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65   holding.** no e
fe60: 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ntries..*/.stati
fe70: 63 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65 28  c void zeroPage(
fe80: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
fe90: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e  int flags){.  un
fea0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
feb0: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
fec0: 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
fed0: 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
fee0: 20 20 75 38 20 68 64 72 20 3d 20 70 50 61 67 65    u8 hdr = pPage
fef0: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75  ->hdrOffset;.  u
ff00: 31 36 20 66 69 72 73 74 3b 0a 0a 20 20 61 73 73  16 first;..  ass
ff10: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
ff20: 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67  rPagenumber(pPag
ff30: 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61  e->pDbPage)==pPa
ff40: 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73  ge->pgno );.  as
ff50: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
ff60: 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
ff70: 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76  ->pDbPage) == (v
ff80: 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20  oid*)pPage );.  
ff90: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
ffa0: 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
ffb0: 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 64  e->pDbPage) == d
ffc0: 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ata );.  assert(
ffd0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
ffe0: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
fff0: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
10000 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
10010 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
10020 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42  tex) );.  if( pB
10030 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
10040 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  S_SECURE_DELETE 
10050 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64  ){.    memset(&d
10060 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74  ata[hdr], 0, pBt
10070 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 68  ->usableSize - h
10080 64 72 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b  dr);.  }.  data[
10090 68 64 72 5d 20 3d 20 28 63 68 61 72 29 66 6c 61  hdr] = (char)fla
100a0 67 73 3b 0a 20 20 66 69 72 73 74 20 3d 20 68 64  gs;.  first = hd
100b0 72 20 2b 20 28 28 66 6c 61 67 73 26 50 54 46 5f  r + ((flags&PTF_
100c0 4c 45 41 46 29 3d 3d 30 20 3f 20 31 32 20 3a 20  LEAF)==0 ? 12 : 
100d0 38 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61  8);.  memset(&da
100e0 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29  ta[hdr+1], 0, 4)
100f0 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20  ;.  data[hdr+7] 
10100 3d 20 30 3b 0a 20 20 70 75 74 32 62 79 74 65 28  = 0;.  put2byte(
10110 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42  &data[hdr+5], pB
10120 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a  t->usableSize);.
10130 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d    pPage->nFree =
10140 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62   (u16)(pBt->usab
10150 6c 65 53 69 7a 65 20 2d 20 66 69 72 73 74 29 3b  leSize - first);
10160 0a 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70  .  decodeFlags(p
10170 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Page, flags);.  
10180 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
10190 74 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61  t = first;.  pPa
101a0 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20 26  ge->aDataEnd = &
101b0 64 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65  data[pBt->usable
101c0 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e  Size];.  pPage->
101d0 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61  aCellIdx = &data
101e0 5b 66 69 72 73 74 5d 3b 0a 20 20 70 50 61 67 65  [first];.  pPage
101f0 2d 3e 61 44 61 74 61 4f 66 73 74 20 3d 20 26 64  ->aDataOfst = &d
10200 61 74 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64  ata[pPage->child
10210 50 74 72 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67  PtrSize];.  pPag
10220 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  e->nOverflow = 0
10230 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
10240 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26  >pageSize>=512 &
10250 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c  & pBt->pageSize<
10260 3d 36 35 35 33 36 20 29 3b 0a 20 20 70 50 61 67  =65536 );.  pPag
10270 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75  e->maskPage = (u
10280 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  16)(pBt->pageSiz
10290 65 20 2d 20 31 29 3b 0a 20 20 70 50 61 67 65 2d  e - 1);.  pPage-
102a0 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50  >nCell = 0;.  pP
102b0 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b  age->isInit = 1;
102c0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  .}.../*.** Conve
102d0 72 74 20 61 20 44 62 50 61 67 65 20 6f 62 74 61  rt a DbPage obta
102e0 69 6e 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61  ined from the pa
102f0 67 65 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61  ger into a MemPa
10300 67 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68  ge used by.** th
10310 65 20 62 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a  e btree layer..*
10320 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65  /.static MemPage
10330 20 2a 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44   *btreePageFromD
10340 62 50 61 67 65 28 44 62 50 61 67 65 20 2a 70 44  bPage(DbPage *pD
10350 62 50 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f  bPage, Pgno pgno
10360 2c 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  , BtShared *pBt)
10370 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
10380 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73  ge = (MemPage*)s
10390 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
103a0 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20  tra(pDbPage);.  
103b0 69 66 28 20 70 67 6e 6f 21 3d 70 50 61 67 65 2d  if( pgno!=pPage-
103c0 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61  >pgno ){.    pPa
103d0 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69  ge->aData = sqli
103e0 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
103f0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 70 50  pDbPage);.    pP
10400 61 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20 70  age->pDbPage = p
10410 44 62 50 61 67 65 3b 0a 20 20 20 20 70 50 61 67  DbPage;.    pPag
10420 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  e->pBt = pBt;.  
10430 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20    pPage->pgno = 
10440 70 67 6e 6f 3b 0a 20 20 20 20 70 50 61 67 65 2d  pgno;.    pPage-
10450 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 70 67 6e  >hdrOffset = pgn
10460 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a  o==1 ? 100 : 0;.
10470 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
10480 61 67 65 2d 3e 61 44 61 74 61 3d 3d 73 71 6c 69  age->aData==sqli
10490 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
104a0 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65  pDbPage) );.  re
104b0 74 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a  turn pPage; .}..
104c0 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65  /*.** Get a page
104d0 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e   from the pager.
104e0 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65    Initialize the
104f0 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64   MemPage.pBt and
10500 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74  .** MemPage.aDat
10510 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65  a elements if ne
10520 65 64 65 64 2e 20 20 53 65 65 20 61 6c 73 6f 3a  eded.  See also:
10530 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50   btreeGetUnusedP
10540 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  age()..**.** If 
10550 74 68 65 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f  the PAGER_GET_NO
10560 43 4f 4e 54 45 4e 54 20 66 6c 61 67 20 69 73 20  CONTENT flag is 
10570 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  set, it means th
10580 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  at we do not car
10590 65 0a 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 63  e.** about the c
105a0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
105b0 67 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e  ge at this time.
105c0 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74    So do not go t
105d0 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f  o the disk.** to
105e0 20 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65   fetch the conte
105f0 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69  nt.  Just fill i
10600 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69  n the content wi
10610 74 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77  th zeros for now
10620 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66  ..** If in the f
10630 75 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71  uture we call sq
10640 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
10650 29 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20  ) on this page, 
10660 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65  that.** means we
10670 20 68 61 76 65 20 73 74 61 72 74 65 64 20 74 6f   have started to
10680 20 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62   be concerned ab
10690 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20  out content and 
106a0 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64  the disk.** read
106b0 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74   should occur at
106c0 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a   that point..*/.
106d0 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
106e0 47 65 74 50 61 67 65 28 0a 20 20 42 74 53 68 61  GetPage(.  BtSha
106f0 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
10700 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
10710 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
10720 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
10730 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20   of the page to 
10740 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61  fetch */.  MemPa
10750 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
10760 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  /* Return the pa
10770 67 65 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d  ge in this param
10780 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  eter */.  int fl
10790 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
107a0 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f  * PAGER_GET_NOCO
107b0 4e 54 45 4e 54 20 6f 72 20 50 41 47 45 52 5f 47  NTENT or PAGER_G
107c0 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29  ET_READONLY */.)
107d0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62  {.  int rc;.  Db
107e0 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a  Page *pDbPage;..
107f0 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
10800 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47  =0 || flags==PAG
10810 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
10820 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45 52   || flags==PAGER
10830 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 29 3b  _GET_READONLY );
10840 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
10850 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
10860 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
10870 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
10880 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Get(pBt->pPager,
10890 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a   pgno, (DbPage**
108a0 29 26 70 44 62 50 61 67 65 2c 20 66 6c 61 67 73  )&pDbPage, flags
108b0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
108c0 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50 61  turn rc;.  *ppPa
108d0 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 46 72  ge = btreePageFr
108e0 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65  omDbPage(pDbPage
108f0 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20  , pgno, pBt);.  
10900 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10910 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69  ;.}../*.** Retri
10920 65 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20  eve a page from 
10930 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e  the pager cache.
10940 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65   If the requeste
10950 64 20 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a 2a  d page is not.**
10960 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
10970 70 61 67 65 72 20 63 61 63 68 65 20 72 65 74 75  pager cache retu
10980 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61 6c  rn NULL. Initial
10990 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e  ize the MemPage.
109a0 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61  pBt and.** MemPa
109b0 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74  ge.aData element
109c0 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a  s if needed..*/.
109d0 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a  static MemPage *
109e0 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28  btreePageLookup(
109f0 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
10a00 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62 50  gno pgno){.  DbP
10a10 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20  age *pDbPage;.  
10a20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
10a30 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
10a40 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 44 62 50  mutex) );.  pDbP
10a50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  age = sqlite3Pag
10a60 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50  erLookup(pBt->pP
10a70 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69  ager, pgno);.  i
10a80 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20 20  f( pDbPage ){.  
10a90 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50 61    return btreePa
10aa0 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62  geFromDbPage(pDb
10ab0 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29  Page, pgno, pBt)
10ac0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
10ad0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
10ae0 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  n the size of th
10af0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
10b00 69 6e 20 70 61 67 65 73 2e 20 49 66 20 74 68 65  in pages. If the
10b10 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f  re is any kind o
10b20 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74 75  f.** error, retu
10b30 72 6e 20 28 28 75 6e 73 69 67 6e 65 64 20 69 6e  rn ((unsigned in
10b40 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  t)-1)..*/.static
10b50 20 50 67 6e 6f 20 62 74 72 65 65 50 61 67 65 63   Pgno btreePagec
10b60 6f 75 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  ount(BtShared *p
10b70 42 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 42  Bt){.  return pB
10b80 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33 32 20  t->nPage;.}.u32 
10b90 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74  sqlite3BtreeLast
10ba0 50 61 67 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  Page(Btree *p){.
10bb0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
10bc0 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
10bd0 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  (p) );.  assert(
10be0 20 28 28 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65   ((p->pBt->nPage
10bf0 29 26 30 78 38 30 30 30 30 30 30 29 3d 3d 30 20  )&0x8000000)==0 
10c00 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 74 72 65  );.  return btre
10c10 65 50 61 67 65 63 6f 75 6e 74 28 70 2d 3e 70 42  ePagecount(p->pB
10c20 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  t);.}../*.** Get
10c30 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
10c40 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69 74 69   pager and initi
10c50 61 6c 69 7a 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  alize it..**.** 
10c60 49 66 20 70 43 75 72 21 3d 30 20 74 68 65 6e 20  If pCur!=0 then 
10c70 74 68 65 20 70 61 67 65 20 69 73 20 62 65 69 6e  the page is bein
10c80 67 20 66 65 74 63 68 65 64 20 61 73 20 70 61 72  g fetched as par
10c90 74 20 6f 66 20 61 20 6d 6f 76 65 54 6f 43 68 69  t of a moveToChi
10ca0 6c 64 28 29 0a 2a 2a 20 63 61 6c 6c 2e 20 20 44  ld().** call.  D
10cb0 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e  o additional san
10cc0 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20  ity checking on 
10cd0 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73  the page in this
10ce0 20 63 61 73 65 2e 0a 2a 2a 20 41 6e 64 20 69 66   case..** And if
10cf0 20 74 68 65 20 66 65 74 63 68 20 66 61 69 6c 73   the fetch fails
10d00 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  , this routine m
10d10 75 73 74 20 64 65 63 72 65 6d 65 6e 74 20 70 43  ust decrement pC
10d20 75 72 2d 3e 69 50 61 67 65 2e 0a 2a 2a 0a 2a 2a  ur->iPage..**.**
10d30 20 54 68 65 20 70 61 67 65 20 69 73 20 66 65 74   The page is fet
10d40 63 68 65 64 20 61 73 20 72 65 61 64 2d 77 72 69  ched as read-wri
10d50 74 65 20 75 6e 6c 65 73 73 20 70 43 75 72 20 69  te unless pCur i
10d60 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 69  s not NULL and i
10d70 73 0a 2a 2a 20 61 20 72 65 61 64 2d 6f 6e 6c 79  s.** a read-only
10d80 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49   cursor..**.** I
10d90 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
10da0 73 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20  s, then *ppPage 
10db0 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 49 74  is undefined. It
10dc0 0a 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e 20 75  .** may remain u
10dd0 6e 63 68 61 6e 67 65 64 2c 20 6f 72 20 69 74 20  nchanged, or it 
10de0 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 61 6e  may be set to an
10df0 20 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e 0a   invalid value..
10e00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
10e10 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20  tAndInitPage(.  
10e20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
10e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e40 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
10e50 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  file */.  Pgno p
10e60 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  gno,            
10e70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
10e80 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
10e90 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50  to get */.  MemP
10ea0 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
10eb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
10ec0 72 69 74 65 20 74 68 65 20 70 61 67 65 20 70 6f  rite the page po
10ed0 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 20 20  inter here */.  
10ee0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
10ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f00 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 72 65 63  /* Cursor to rec
10f10 65 69 76 65 20 74 68 65 20 70 61 67 65 2c 20 6f  eive the page, o
10f20 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  r NULL */.  int 
10f30 62 52 65 61 64 4f 6e 6c 79 20 20 20 20 20 20 20  bReadOnly       
10f40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
10f50 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d 6f  rue for a read-o
10f60 6e 6c 79 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20  nly page */.){. 
10f70 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67   int rc;.  DbPag
10f80 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73  e *pDbPage;.  as
10f90 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
10fa0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
10fb0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
10fc0 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70 70 50  ( pCur==0 || ppP
10fd0 61 67 65 3d 3d 26 70 43 75 72 2d 3e 61 70 50 61  age==&pCur->apPa
10fe0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
10ff0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
11000 72 3d 3d 30 20 7c 7c 20 62 52 65 61 64 4f 6e 6c  r==0 || bReadOnl
11010 79 3d 3d 70 43 75 72 2d 3e 63 75 72 50 61 67 65  y==pCur->curPage
11020 72 46 6c 61 67 73 20 29 3b 0a 20 20 61 73 73 65  rFlags );.  asse
11030 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70  rt( pCur==0 || p
11040 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a  Cur->iPage>0 );.
11050 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62 74 72 65  .  if( pgno>btre
11060 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  ePagecount(pBt) 
11070 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
11080 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
11090 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64  .    goto getAnd
110a0 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a  InitPage_error;.
110b0 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
110c0 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
110d0 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44  pPager, pgno, (D
110e0 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65  bPage**)&pDbPage
110f0 2c 20 62 52 65 61 64 4f 6e 6c 79 29 3b 0a 20 20  , bReadOnly);.  
11100 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 67 6f  if( rc ){.    go
11110 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67  to getAndInitPag
11120 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 2a  e_error;.  }.  *
11130 70 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67  ppPage = (MemPag
11140 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47  e*)sqlite3PagerG
11150 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29  etExtra(pDbPage)
11160 3b 0a 20 20 69 66 28 20 28 2a 70 70 50 61 67 65  ;.  if( (*ppPage
11170 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 7b 0a  )->isInit==0 ){.
11180 20 20 20 20 62 74 72 65 65 50 61 67 65 46 72 6f      btreePageFro
11190 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c  mDbPage(pDbPage,
111a0 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 20   pgno, pBt);.   
111b0 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50   rc = btreeInitP
111c0 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
111d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
111e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c  _OK ){.      rel
111f0 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
11200 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 67 65  );.      goto ge
11210 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72  tAndInitPage_err
11220 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  or;.    }.  }.  
11230 61 73 73 65 72 74 28 20 28 2a 70 70 50 61 67 65  assert( (*ppPage
11240 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b  )->pgno==pgno );
11250 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70 70 50  .  assert( (*ppP
11260 61 67 65 29 2d 3e 61 44 61 74 61 3d 3d 73 71 6c  age)->aData==sql
11270 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
11280 28 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  (pDbPage) );..  
11290 2f 2a 20 49 66 20 6f 62 74 61 69 6e 69 6e 67 20  /* If obtaining 
112a0 61 20 63 68 69 6c 64 20 70 61 67 65 20 66 6f 72  a child page for
112b0 20 61 20 63 75 72 73 6f 72 2c 20 77 65 20 6d 75   a cursor, we mu
112c0 73 74 20 76 65 72 69 66 79 20 74 68 61 74 20 74  st verify that t
112d0 68 65 20 70 61 67 65 20 69 73 0a 20 20 2a 2a 20  he page is.  ** 
112e0 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20  compatible with 
112f0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 2a  the root page. *
11300 2f 0a 20 20 69 66 28 20 70 43 75 72 20 26 26 20  /.  if( pCur && 
11310 28 28 2a 70 70 50 61 67 65 29 2d 3e 6e 43 65 6c  ((*ppPage)->nCel
11320 6c 3c 31 20 7c 7c 20 28 2a 70 70 50 61 67 65 29  l<1 || (*ppPage)
11330 2d 3e 69 6e 74 4b 65 79 21 3d 70 43 75 72 2d 3e  ->intKey!=pCur->
11340 63 75 72 49 6e 74 4b 65 79 29 20 29 7b 0a 20 20  curIntKey) ){.  
11350 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
11360 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
11370 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
11380 61 67 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 67  age);.    goto g
11390 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72  etAndInitPage_er
113a0 72 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ror;.  }.  retur
113b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 67 65  n SQLITE_OK;..ge
113c0 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72  tAndInitPage_err
113d0 6f 72 3a 0a 20 20 69 66 28 20 70 43 75 72 20 29  or:.  if( pCur )
113e0 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a   pCur->iPage--;.
113f0 20 20 74 65 73 74 63 61 73 65 28 20 70 67 6e 6f    testcase( pgno
11400 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
11410 20 70 67 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d 3d   pgno!=0 || rc==
11420 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29  SQLITE_CORRUPT )
11430 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
11440 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
11450 61 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73  a MemPage.  This
11460 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65   should be calle
11470 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  d once for each 
11480 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f  prior.** call to
11490 20 62 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a   btreeGetPage..*
114a0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
114b0 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c  leasePageNotNull
114c0 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
114d0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  {.  assert( pPag
114e0 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73  e->aData );.  as
114f0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
11500 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
11510 61 67 65 2d 3e 70 44 62 50 61 67 65 21 3d 30 20  age->pDbPage!=0 
11520 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
11530 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
11540 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
11550 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67  ) == (void*)pPag
11560 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
11570 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
11580 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
11590 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  e)==pPage->aData
115a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
115b0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
115c0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
115d0 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
115e0 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c  PagerUnrefNotNul
115f0 6c 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  l(pPage->pDbPage
11600 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
11610 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d   releasePage(Mem
11620 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
11630 69 66 28 20 70 50 61 67 65 20 29 20 72 65 6c 65  if( pPage ) rele
11640 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70  asePageNotNull(p
11650 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
11660 47 65 74 20 61 6e 20 75 6e 75 73 65 64 20 70 61  Get an unused pa
11670 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  ge..**.** This w
11680 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 62  orks just like b
11690 74 72 65 65 47 65 74 50 61 67 65 28 29 20 77 69  treeGetPage() wi
116a0 74 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e 3a  th the addition:
116b0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 49 66 20 74  .**.**   *  If t
116c0 68 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61  he page is alrea
116d0 64 79 20 69 6e 20 75 73 65 20 66 6f 72 20 73 6f  dy in use for so
116e0 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65  me other purpose
116f0 2c 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a  , immediately.**
11700 20 20 20 20 20 20 72 65 6c 65 61 73 65 20 69 74        release it
11710 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 53   and return an S
11720 51 4c 49 54 45 5f 43 55 52 52 55 50 54 20 65 72  QLITE_CURRUPT er
11730 72 6f 72 2e 0a 2a 2a 20 20 20 2a 20 20 4d 61 6b  ror..**   *  Mak
11740 65 20 73 75 72 65 20 74 68 65 20 69 73 49 6e 69  e sure the isIni
11750 74 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 0a  t flag is clear.
11760 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
11770 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65  reeGetUnusedPage
11780 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
11790 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  t,       /* The 
117a0 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  btree */.  Pgno 
117b0 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
117c0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65  /* Number of the
117d0 20 70 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a   page to fetch *
117e0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
117f0 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75  Page,    /* Retu
11800 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  rn the page in t
11810 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f  his parameter */
11820 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
11830 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52          /* PAGER
11840 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f  _GET_NOCONTENT o
11850 72 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  r PAGER_GET_READ
11860 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ONLY */.){.  int
11870 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
11880 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70  ge(pBt, pgno, pp
11890 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Page, flags);.  
118a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
118b0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  K ){.    if( sql
118c0 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
118d0 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d  count((*ppPage)-
118e0 3e 70 44 62 50 61 67 65 29 3e 31 20 29 7b 0a 20  >pDbPage)>1 ){. 
118f0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
11900 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  (*ppPage);.     
11910 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
11920 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
11930 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
11940 20 20 20 20 7d 0a 20 20 20 20 28 2a 70 70 50 61      }.    (*ppPa
11950 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  ge)->isInit = 0;
11960 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
11970 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  pPage = 0;.  }. 
11980 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
11990 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72  /*.** During a r
119a0 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68  ollback, when th
119b0 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20  e pager reloads 
119c0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f  information into
119d0 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f   the cache.** so
119e0 20 74 68 61 74 20 74 68 65 20 63 61 63 68 65 20   that the cache 
119f0 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  is restored to i
11a00 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  ts original stat
11a10 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
11a20 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63  f.** the transac
11a30 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70  tion, for each p
11a40 61 67 65 20 72 65 73 74 6f 72 65 64 20 74 68 69  age restored thi
11a50 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
11a60 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  led..**.** This 
11a70 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f  routine needs to
11a80 20 72 65 73 65 74 20 74 68 65 20 65 78 74 72 61   reset the extra
11a90 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74   data section at
11aa0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
11ab0 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65 65  ** page to agree
11ac0 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72   with the restor
11ad0 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74  ed data..*/.stat
11ae0 69 63 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e  ic void pageRein
11af0 69 74 28 44 62 50 61 67 65 20 2a 70 44 61 74 61  it(DbPage *pData
11b00 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
11b10 61 67 65 3b 0a 20 20 70 50 61 67 65 20 3d 20 28  age;.  pPage = (
11b20 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65  MemPage *)sqlite
11b30 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
11b40 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28  Data);.  assert(
11b50 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
11b60 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29  eRefcount(pData)
11b70 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  >0 );.  if( pPag
11b80 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20  e->isInit ){.   
11b90 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
11ba0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
11bb0 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
11bc0 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  ;.    pPage->isI
11bd0 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  nit = 0;.    if(
11be0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
11bf0 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29  eRefcount(pData)
11c00 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70  >1 ){.      /* p
11c10 50 61 67 65 20 6d 69 67 68 74 20 6e 6f 74 20 62  Page might not b
11c20 65 20 61 20 62 74 72 65 65 20 70 61 67 65 3b 20  e a btree page; 
11c30 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 6e 20   it might be an 
11c40 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20  overflow page.  
11c50 20 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70      ** or ptrmap
11c60 20 70 61 67 65 20 6f 72 20 61 20 66 72 65 65 20   page or a free 
11c70 70 61 67 65 2e 20 20 49 6e 20 74 68 6f 73 65 20  page.  In those 
11c80 63 61 73 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f  cases, the follo
11c90 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63 61  wing.      ** ca
11ca0 6c 6c 20 74 6f 20 62 74 72 65 65 49 6e 69 74 50  ll to btreeInitP
11cb0 61 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b 65 6c  age() will likel
11cc0 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
11cd0 43 4f 52 52 55 50 54 2e 0a 20 20 20 20 20 20 2a  CORRUPT..      *
11ce0 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d 20 69 73  * But no harm is
11cf0 20 64 6f 6e 65 20 62 79 20 74 68 69 73 2e 20 20   done by this.  
11d00 41 6e 64 20 69 74 20 69 73 20 76 65 72 79 20 69  And it is very i
11d10 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 0a 20 20  mportant that.  
11d20 20 20 20 20 2a 2a 20 62 74 72 65 65 49 6e 69 74      ** btreeInit
11d30 50 61 67 65 28 29 20 62 65 20 63 61 6c 6c 65 64  Page() be called
11d40 20 6f 6e 20 65 76 65 72 79 20 62 74 72 65 65 20   on every btree 
11d50 70 61 67 65 20 73 6f 20 77 65 20 6d 61 6b 65 0a  page so we make.
11d60 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c        ** the cal
11d70 6c 20 66 6f 72 20 65 76 65 72 79 20 70 61 67 65  l for every page
11d80 20 74 68 61 74 20 63 6f 6d 65 73 20 69 6e 20 66   that comes in f
11d90 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20 2a  or re-initing. *
11da0 2f 0a 20 20 20 20 20 20 62 74 72 65 65 49 6e 69  /.      btreeIni
11db0 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
11dc0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
11dd0 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   Invoke the busy
11de0 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 62   handler for a b
11df0 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tree..*/.static 
11e00 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b 65 42  int btreeInvokeB
11e10 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20  usyHandler(void 
11e20 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68 61 72  *pArg){.  BtShar
11e30 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68 61  ed *pBt = (BtSha
11e40 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73 73  red*)pArg;.  ass
11e50 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a  ert( pBt->db );.
11e60 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
11e70 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
11e80 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
11e90 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
11ea0 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
11eb0 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79  r(&pBt->db->busy
11ec0 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  Handler);.}../*.
11ed0 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61  ** Open a databa
11ee0 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  se file..** .** 
11ef0 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65  zFilename is the
11f00 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
11f10 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
11f20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
11f30 4c 0a 2a 2a 20 74 68 65 6e 20 61 6e 20 65 70 68  L.** then an eph
11f40 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65 20  emeral database 
11f50 69 73 20 63 72 65 61 74 65 64 2e 20 20 54 68 65  is created.  The
11f60 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62   ephemeral datab
11f70 61 73 65 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20  ase might.** be 
11f80 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 6d  exclusively in m
11f90 65 6d 6f 72 79 2c 20 6f 72 20 69 74 20 6d 69 67  emory, or it mig
11fa0 68 74 20 75 73 65 20 61 20 64 69 73 6b 2d 62 61  ht use a disk-ba
11fb0 73 65 64 20 6d 65 6d 6f 72 79 20 63 61 63 68 65  sed memory cache
11fc0 2e 0a 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c  ..** Either way,
11fd0 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64   the ephemeral d
11fe0 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62 65 20  atabase will be 
11ff0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
12000 6c 65 74 65 64 20 0a 2a 2a 20 77 68 65 6e 20 73  leted .** when s
12010 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
12020 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
12030 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  .** If zFilename
12040 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74   is ":memory:" t
12050 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  hen an in-memory
12060 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65   database is cre
12070 61 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73 20  ated.** that is 
12080 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
12090 73 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74 20  stroyed when it 
120a0 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a  is closed..**.**
120b0 20 54 68 65 20 22 66 6c 61 67 73 22 20 70 61 72   The "flags" par
120c0 61 6d 65 74 65 72 20 69 73 20 61 20 62 69 74 6d  ameter is a bitm
120d0 61 73 6b 20 74 68 61 74 20 6d 69 67 68 74 20 63  ask that might c
120e0 6f 6e 74 61 69 6e 20 62 69 74 73 20 6c 69 6b 65  ontain bits like
120f0 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a  .** BTREE_OMIT_J
12100 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72 20 42 54  OURNAL and/or BT
12110 52 45 45 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a  REE_MEMORY..**.*
12120 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
12130 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  e is already ope
12140 6e 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ned in the same 
12150 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
12160 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20 61 72  ion.** and we ar
12170 65 20 69 6e 20 73 68 61 72 65 64 20 63 61 63 68  e in shared cach
12180 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65  e mode, then the
12190 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c 20   open will fail 
121a0 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54  with an.** SQLIT
121b0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65 72 72  E_CONSTRAINT err
121c0 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20 61  or.  We cannot a
121d0 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72 65  llow two or more
121e0 20 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f 62 6a   BtShared.** obj
121f0 65 63 74 73 20 69 6e 20 74 68 65 20 73 61 6d 65  ects in the same
12200 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
12210 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69 6e 67  tion since doing
12220 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a   so will lead.**
12230 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77 69 74   to problems wit
12240 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e  h locking..*/.in
12250 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70  t sqlite3BtreeOp
12260 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  en(.  sqlite3_vf
12270 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f 2a  s *pVfs,      /*
12280 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72 20   VFS to use for 
12290 74 68 69 73 20 62 2d 74 72 65 65 20 2a 2f 0a 20  this b-tree */. 
122a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
122b0 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65  lename,  /* Name
122c0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e   of the file con
122d0 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65  taining the BTre
122e0 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
122f0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
12300 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63          /* Assoc
12310 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20 68  iated database h
12320 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65  andle */.  Btree
12330 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20   **ppBtree,     
12340 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
12350 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63   new Btree objec
12360 74 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a  t written here *
12370 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
12380 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
12390 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ptions */.  int 
123a0 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20  vfsFlags        
123b0 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
123c0 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73  sed through to s
123d0 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e  qlite3_vfs.xOpen
123e0 28 29 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61  () */.){.  BtSha
123f0 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20 20 20  red *pBt = 0;   
12400 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61            /* Sha
12410 72 65 64 20 70 61 72 74 20 6f 66 20 62 74 72 65  red part of btre
12420 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  e structure */. 
12430 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20 20 20   Btree *p;      
12440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12450 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72 65 74  /* Handle to ret
12460 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  urn */.  sqlite3
12470 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f 70 65  _mutex *mutexOpe
12480 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65 76 65  n = 0;  /* Preve
12490 6e 74 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69  nts a race condi
124a0 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23 33 35  tion. Ticket #35
124b0 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  37 */.  int rc =
124c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
124d0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
124e0 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 69 73 20   code from this 
124f0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38  function */.  u8
12500 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20 20   nReserve;      
12510 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12520 42 79 74 65 20 6f 66 20 75 6e 75 73 65 64 20 73  Byte of unused s
12530 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67  pace on each pag
12540 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  e */.  unsigned 
12550 63 68 61 72 20 7a 44 62 48 65 61 64 65 72 5b 31  char zDbHeader[1
12560 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62 61 73  00];  /* Databas
12570 65 20 68 65 61 64 65 72 20 63 6f 6e 74 65 6e 74  e header content
12580 20 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75 65 20 69   */..  /* True i
12590 66 20 6f 70 65 6e 69 6e 67 20 61 6e 20 65 70 68  f opening an eph
125a0 65 6d 65 72 61 6c 2c 20 74 65 6d 70 6f 72 61 72  emeral, temporar
125b0 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  y database */.  
125c0 63 6f 6e 73 74 20 69 6e 74 20 69 73 54 65 6d 70  const int isTemp
125d0 44 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d  Db = zFilename==
125e0 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  0 || zFilename[0
125f0 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  ]==0;..  /* Set 
12600 74 68 65 20 76 61 72 69 61 62 6c 65 20 69 73 4d  the variable isM
12610 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66 6f 72  emdb to true for
12620 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
12630 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a  tabase, or .  **
12640 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66 69 6c   false for a fil
12650 65 2d 62 61 73 65 64 20 64 61 74 61 62 61 73 65  e-based database
12660 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
12670 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
12680 44 42 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  DB.  const int i
12690 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 23 65 6c 73  sMemdb = 0;.#els
126a0 65 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73  e.  const int is
126b0 4d 65 6d 64 62 20 3d 20 28 7a 46 69 6c 65 6e 61  Memdb = (zFilena
126c0 6d 65 20 26 26 20 73 74 72 63 6d 70 28 7a 46 69  me && strcmp(zFi
126d0 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79  lename, ":memory
126e0 3a 22 29 3d 3d 30 29 0a 20 20 20 20 20 20 20 20  :")==0).        
126f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
12700 7c 20 28 69 73 54 65 6d 70 44 62 20 26 26 20 73  | (isTempDb && s
12710 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f  qlite3TempInMemo
12720 72 79 28 64 62 29 29 0a 20 20 20 20 20 20 20 20  ry(db)).        
12730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
12740 7c 20 28 76 66 73 46 6c 61 67 73 20 26 20 53 51  | (vfsFlags & SQ
12750 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59  LITE_OPEN_MEMORY
12760 29 21 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  )!=0;.#endif..  
12770 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
12780 0a 20 20 61 73 73 65 72 74 28 20 70 56 66 73 21  .  assert( pVfs!
12790 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
127a0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
127b0 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
127c0 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67  .  assert( (flag
127d0 73 26 30 78 66 66 29 3d 3d 66 6c 61 67 73 20 29  s&0xff)==flags )
127e0 3b 20 20 20 2f 2a 20 66 6c 61 67 73 20 66 69 74  ;   /* flags fit
127f0 20 69 6e 20 38 20 62 69 74 73 20 2a 2f 0a 0a 20   in 8 bits */.. 
12800 20 2f 2a 20 4f 6e 6c 79 20 61 20 42 54 52 45 45   /* Only a BTREE
12810 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65  _SINGLE database
12820 20 63 61 6e 20 62 65 20 42 54 52 45 45 5f 55 4e   can be BTREE_UN
12830 4f 52 44 45 52 45 44 20 2a 2f 0a 20 20 61 73 73  ORDERED */.  ass
12840 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42 54  ert( (flags & BT
12850 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3d 3d  REE_UNORDERED)==
12860 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 42 54  0 || (flags & BT
12870 52 45 45 5f 53 49 4e 47 4c 45 29 21 3d 30 20 29  REE_SINGLE)!=0 )
12880 3b 0a 0a 20 20 2f 2a 20 41 20 42 54 52 45 45 5f  ;..  /* A BTREE_
12890 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20  SINGLE database 
128a0 69 73 20 61 6c 77 61 79 73 20 61 20 74 65 6d 70  is always a temp
128b0 6f 72 61 72 79 20 61 6e 64 2f 6f 72 20 65 70 68  orary and/or eph
128c0 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 61 73 73 65  emeral */.  asse
128d0 72 74 28 20 28 66 6c 61 67 73 20 26 20 42 54 52  rt( (flags & BTR
128e0 45 45 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 7c 7c  EE_SINGLE)==0 ||
128f0 20 69 73 54 65 6d 70 44 62 20 29 3b 0a 0a 20 20   isTempDb );..  
12900 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20  if( isMemdb ){. 
12910 20 20 20 66 6c 61 67 73 20 7c 3d 20 42 54 52 45     flags |= BTRE
12920 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20  E_MEMORY;.  }.  
12930 69 66 28 20 28 76 66 73 46 6c 61 67 73 20 26 20  if( (vfsFlags & 
12940 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
12950 5f 44 42 29 21 3d 30 20 26 26 20 28 69 73 4d 65  _DB)!=0 && (isMe
12960 6d 64 62 20 7c 7c 20 69 73 54 65 6d 70 44 62 29  mdb || isTempDb)
12970 20 29 7b 0a 20 20 20 20 76 66 73 46 6c 61 67 73   ){.    vfsFlags
12980 20 3d 20 28 76 66 73 46 6c 61 67 73 20 26 20 7e   = (vfsFlags & ~
12990 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
129a0 5f 44 42 29 20 7c 20 53 51 4c 49 54 45 5f 4f 50  _DB) | SQLITE_OP
129b0 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20 20 7d 0a  EN_TEMP_DB;.  }.
129c0 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c    p = sqlite3Mal
129d0 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42  locZero(sizeof(B
129e0 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21 70  tree));.  if( !p
129f0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
12a00 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
12a10 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20  .  p->inTrans = 
12a20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d  TRANS_NONE;.  p-
12a30 3e 64 62 20 3d 20 64 62 3b 0a 23 69 66 6e 64 65  >db = db;.#ifnde
12a40 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
12a50 41 52 45 44 5f 43 41 43 48 45 0a 20 20 70 2d 3e  ARED_CACHE.  p->
12a60 6c 6f 63 6b 2e 70 42 74 72 65 65 20 3d 20 70 3b  lock.pBtree = p;
12a70 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c  .  p->lock.iTabl
12a80 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 23  e = 1;.#endif..#
12a90 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
12aa0 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
12ab0 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65  ACHE) && !define
12ac0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  d(SQLITE_OMIT_DI
12ad0 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20  SKIO).  /*.  ** 
12ae0 49 66 20 74 68 69 73 20 42 74 72 65 65 20 69 73  If this Btree is
12af0 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72   a candidate for
12b00 20 73 68 61 72 65 64 20 63 61 63 68 65 2c 20 74   shared cache, t
12b10 72 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20  ry to find an.  
12b20 2a 2a 20 65 78 69 73 74 69 6e 67 20 42 74 53 68  ** existing BtSh
12b30 61 72 65 64 20 6f 62 6a 65 63 74 20 74 68 61 74  ared object that
12b40 20 77 65 20 63 61 6e 20 73 68 61 72 65 20 77 69   we can share wi
12b50 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  th.  */.  if( is
12b60 54 65 6d 70 44 62 3d 3d 30 20 26 26 20 28 69 73  TempDb==0 && (is
12b70 4d 65 6d 64 62 3d 3d 30 20 7c 7c 20 28 76 66 73  Memdb==0 || (vfs
12b80 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45  Flags&SQLITE_OPE
12b90 4e 5f 55 52 49 29 21 3d 30 29 20 29 7b 0a 20 20  N_URI)!=0) ){.  
12ba0 20 20 69 66 28 20 76 66 73 46 6c 61 67 73 20 26    if( vfsFlags &
12bb0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41   SQLITE_OPEN_SHA
12bc0 52 45 44 43 41 43 48 45 20 29 7b 0a 20 20 20 20  REDCACHE ){.    
12bd0 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 20    int nFilename 
12be0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
12bf0 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 3b 0a  0(zFilename)+1;.
12c00 20 20 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50        int nFullP
12c10 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e  athname = pVfs->
12c20 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20  mxPathname+1;.  
12c30 20 20 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50      char *zFullP
12c40 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
12c50 33 4d 61 6c 6c 6f 63 28 4d 41 58 28 6e 46 75 6c  3Malloc(MAX(nFul
12c60 6c 50 61 74 68 6e 61 6d 65 2c 6e 46 69 6c 65 6e  lPathname,nFilen
12c70 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 4d 55 54  ame));.      MUT
12c80 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65  EX_LOGIC( sqlite
12c90 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68  3_mutex *mutexSh
12ca0 61 72 65 64 3b 20 29 0a 0a 20 20 20 20 20 20 70  ared; )..      p
12cb0 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a  ->sharable = 1;.
12cc0 20 20 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c        if( !zFull
12cd0 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
12ce0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
12cf0 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  (p);.        ret
12d00 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
12d10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12d20 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20  if( isMemdb ){. 
12d30 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 46         memcpy(zF
12d40 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 69  ullPathname, zFi
12d50 6c 65 6e 61 6d 65 2c 20 6e 46 69 6c 65 6e 61 6d  lename, nFilenam
12d60 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
12d70 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
12d80 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
12d90 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e  ame(pVfs, zFilen
12da0 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
12db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12dc0 20 20 20 20 20 20 20 20 6e 46 75 6c 6c 50 61 74          nFullPat
12dd0 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68  hname, zFullPath
12de0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  name);.        i
12df0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
12e00 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
12e10 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
12e20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
12e30 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
12e40 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
12e50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12e60 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  }.#if SQLITE_THR
12e70 45 41 44 53 41 46 45 0a 20 20 20 20 20 20 6d 75  EADSAFE.      mu
12e80 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65  texOpen = sqlite
12e90 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
12ea0 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
12eb0 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c  OPEN);.      sql
12ec0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
12ed0 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20  (mutexOpen);.   
12ee0 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d     mutexShared =
12ef0 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
12f00 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
12f10 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a  STATIC_MASTER);.
12f20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
12f30 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53  tex_enter(mutexS
12f40 68 61 72 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20  hared);.#endif. 
12f50 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f       for(pBt=GLO
12f60 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
12f70 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
12f80 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42 74 3d  List); pBt; pBt=
12f90 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  pBt->pNext){.   
12fa0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
12fb0 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20  ->nRef>0 );.    
12fc0 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d      if( 0==strcm
12fd0 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  p(zFullPathname,
12fe0 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
12ff0 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65  ename(pBt->pPage
13000 72 2c 20 30 29 29 0a 20 20 20 20 20 20 20 20 20  r, 0)).         
13010 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
13020 65 33 50 61 67 65 72 56 66 73 28 70 42 74 2d 3e  e3PagerVfs(pBt->
13030 70 50 61 67 65 72 29 3d 3d 70 56 66 73 20 29 7b  pPager)==pVfs ){
13040 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
13050 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  Db;.          fo
13060 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b  r(iDb=db->nDb-1;
13070 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b   iDb>=0; iDb--){
13080 0a 20 20 20 20 20 20 20 20 20 20 20 20 42 74 72  .            Btr
13090 65 65 20 2a 70 45 78 69 73 74 69 6e 67 20 3d 20  ee *pExisting = 
130a0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
130b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
130c0 28 20 70 45 78 69 73 74 69 6e 67 20 26 26 20 70  ( pExisting && p
130d0 45 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d 3d 70  Existing->pBt==p
130e0 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
130f0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
13100 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61  x_leave(mutexSha
13110 72 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  red);.          
13120 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
13130 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65  x_leave(mutexOpe
13140 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
13150 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
13160 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
13170 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
13180 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
13190 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
131a0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  rn SQLITE_CONSTR
131b0 41 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 20 20  AINT;.          
131c0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
131d0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74            p->pBt
131e0 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20   = pBt;.        
131f0 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20    pBt->nRef++;. 
13200 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
13210 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13220 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
13230 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
13240 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  xShared);.      
13250 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75  sqlite3_free(zFu
13260 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
13270 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
13280 5f 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b  _DEBUG.    else{
13290 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 64 65 62  .      /* In deb
132a0 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b  ug mode, we mark
132b0 20 61 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20   all persistent 
132c0 64 61 74 61 62 61 73 65 73 20 61 73 20 73 68 61  databases as sha
132d0 72 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65  rable.      ** e
132e0 76 65 6e 20 77 68 65 6e 20 74 68 65 79 20 61 72  ven when they ar
132f0 65 20 6e 6f 74 2e 20 20 54 68 69 73 20 65 78 65  e not.  This exe
13300 72 63 69 73 65 73 20 74 68 65 20 6c 6f 63 6b 69  rcises the locki
13310 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20 20 20 20  ng code and.    
13320 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65 20    ** gives more 
13330 6f 70 70 6f 72 74 75 6e 69 74 79 20 66 6f 72 20  opportunity for 
13340 61 73 73 65 72 74 73 28 73 71 6c 69 74 65 33 5f  asserts(sqlite3_
13350 6d 75 74 65 78 5f 68 65 6c 64 28 29 29 0a 20 20  mutex_held()).  
13360 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
13370 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e  s to find lockin
13380 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20  g problems..    
13390 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68    */.      p->sh
133a0 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  arable = 1;.    
133b0 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e  }.#endif.  }.#en
133c0 64 69 66 0a 20 20 69 66 28 20 70 42 74 3d 3d 30  dif.  if( pBt==0
133d0 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
133e0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
133f0 61 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72  asserts make sur
13400 65 20 74 68 61 74 20 73 74 72 75 63 74 75 72 65  e that structure
13410 73 20 75 73 65 64 20 62 79 20 74 68 65 20 62 74  s used by the bt
13420 72 65 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 74  ree are.    ** t
13430 68 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20  he right size.  
13440 54 68 69 73 20 69 73 20 74 6f 20 67 75 61 72 64  This is to guard
13450 20 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68   against size ch
13460 61 6e 67 65 73 20 74 68 61 74 20 72 65 73 75 6c  anges that resul
13470 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f  t.    ** when co
13480 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66  mpiling on a dif
13490 66 65 72 65 6e 74 20 61 72 63 68 69 74 65 63 74  ferent architect
134a0 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ure..    */.    
134b0 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69  assert( sizeof(i
134c0 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20 20 61 73  64)==8 );.    as
134d0 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36 34  sert( sizeof(u64
134e0 29 3d 3d 38 20 29 3b 0a 20 20 20 20 61 73 73 65  )==8 );.    asse
134f0 72 74 28 20 73 69 7a 65 6f 66 28 75 33 32 29 3d  rt( sizeof(u32)=
13500 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =4 );.    assert
13510 28 20 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32  ( sizeof(u16)==2
13520 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
13530 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20  sizeof(Pgno)==4 
13540 29 3b 0a 20 20 0a 20 20 20 20 70 42 74 20 3d 20  );.  .    pBt = 
13550 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
13560 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42 74 29 20  o( sizeof(*pBt) 
13570 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 3d 3d  );.    if( pBt==
13580 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
13590 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
135a0 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f      goto btree_o
135b0 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  pen_out;.    }. 
135c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
135d0 61 67 65 72 4f 70 65 6e 28 70 56 66 73 2c 20 26  agerOpen(pVfs, &
135e0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69  pBt->pPager, zFi
135f0 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  lename,.        
13600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13610 20 20 45 58 54 52 41 5f 53 49 5a 45 2c 20 66 6c    EXTRA_SIZE, fl
13620 61 67 73 2c 20 76 66 73 46 6c 61 67 73 2c 20 70  ags, vfsFlags, p
13630 61 67 65 52 65 69 6e 69 74 29 3b 0a 20 20 20 20  ageReinit);.    
13640 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
13650 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
13660 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69  e3PagerSetMmapLi
13670 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  mit(pBt->pPager,
13680 20 64 62 2d 3e 73 7a 4d 6d 61 70 29 3b 0a 20 20   db->szMmap);.  
13690 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
136a0 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61  PagerReadFilehea
136b0 64 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  der(pBt->pPager,
136c0 73 69 7a 65 6f 66 28 7a 44 62 48 65 61 64 65 72  sizeof(zDbHeader
136d0 29 2c 7a 44 62 48 65 61 64 65 72 29 3b 0a 20 20  ),zDbHeader);.  
136e0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
136f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13700 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70     goto btree_op
13710 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  en_out;.    }.  
13720 20 20 70 42 74 2d 3e 6f 70 65 6e 46 6c 61 67 73    pBt->openFlags
13730 20 3d 20 28 75 38 29 66 6c 61 67 73 3b 0a 20 20   = (u8)flags;.  
13740 20 20 70 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a    pBt->db = db;.
13750 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
13760 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 70  SetBusyhandler(p
13770 42 74 2d 3e 70 50 61 67 65 72 2c 20 62 74 72 65  Bt->pPager, btre
13780 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  eInvokeBusyHandl
13790 65 72 2c 20 70 42 74 29 3b 0a 20 20 20 20 70 2d  er, pBt);.    p-
137a0 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20  >pBt = pBt;.  . 
137b0 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20     pBt->pCursor 
137c0 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50  = 0;.    pBt->pP
137d0 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 69 66  age1 = 0;.    if
137e0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
137f0 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50  readonly(pBt->pP
13800 61 67 65 72 29 20 29 20 70 42 74 2d 3e 62 74 73  ager) ) pBt->bts
13810 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41  Flags |= BTS_REA
13820 44 5f 4f 4e 4c 59 3b 0a 23 69 66 64 65 66 20 53  D_ONLY;.#ifdef S
13830 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c  QLITE_SECURE_DEL
13840 45 54 45 0a 20 20 20 20 70 42 74 2d 3e 62 74 73  ETE.    pBt->bts
13850 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43  Flags |= BTS_SEC
13860 55 52 45 5f 44 45 4c 45 54 45 3b 0a 23 65 6e 64  URE_DELETE;.#end
13870 69 66 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  if.    /* EVIDEN
13880 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33 2d 33  CE-OF: R-51873-3
13890 39 36 31 38 20 54 68 65 20 70 61 67 65 20 73 69  9618 The page si
138a0 7a 65 20 66 6f 72 20 61 20 64 61 74 61 62 61 73  ze for a databas
138b0 65 20 66 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a  e file is.    **
138c0 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
138d0 68 65 20 32 2d 62 79 74 65 20 69 6e 74 65 67 65  he 2-byte intege
138e0 72 20 6c 6f 63 61 74 65 64 20 61 74 20 61 6e 20  r located at an 
138f0 6f 66 66 73 65 74 20 6f 66 20 31 36 20 62 79 74  offset of 16 byt
13900 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74  es from.    ** t
13910 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
13920 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
13930 65 2e 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 70  e. */.    pBt->p
13940 61 67 65 53 69 7a 65 20 3d 20 28 7a 44 62 48 65  ageSize = (zDbHe
13950 61 64 65 72 5b 31 36 5d 3c 3c 38 29 20 7c 20 28  ader[16]<<8) | (
13960 7a 44 62 48 65 61 64 65 72 5b 31 37 5d 3c 3c 31  zDbHeader[17]<<1
13970 36 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  6);.    if( pBt-
13980 3e 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c  >pageSize<512 ||
13990 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53   pBt->pageSize>S
139a0 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
139b0 49 5a 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  IZE.         || 
139c0 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d  ((pBt->pageSize-
139d0 31 29 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  1)&pBt->pageSize
139e0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42  )!=0 ){.      pB
139f0 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 30 3b  t->pageSize = 0;
13a00 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13a10 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
13a20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
13a30 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d  magic name ":mem
13a40 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72 65 61 74  ory:" will creat
13a50 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  e an in-memory d
13a60 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 20 20  atabase, then.  
13a70 20 20 20 20 2a 2a 20 6c 65 61 76 65 20 74 68 65      ** leave the
13a80 20 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65   autoVacuum mode
13a90 20 61 74 20 30 20 28 64 6f 20 6e 6f 74 20 61 75   at 0 (do not au
13aa0 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76 65 6e  to-vacuum), even
13ab0 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c   if.      ** SQL
13ac0 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
13ad0 56 41 43 55 55 4d 20 69 73 20 74 72 75 65 2e 20  VACUUM is true. 
13ae0 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
13af0 64 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53  d, if.      ** S
13b00 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
13b10 59 44 42 20 68 61 73 20 62 65 65 6e 20 64 65 66  YDB has been def
13b20 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d  ined, then ":mem
13b30 6f 72 79 3a 22 20 69 73 20 6a 75 73 74 20 61 0a  ory:" is just a.
13b40 20 20 20 20 20 20 2a 2a 20 72 65 67 75 6c 61 72        ** regular
13b50 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74   file-name. In t
13b60 68 69 73 20 63 61 73 65 20 74 68 65 20 61 75 74  his case the aut
13b70 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c 69 65 73  o-vacuum applies
13b80 20 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a   as per normal..
13b90 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
13ba0 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  f( zFilename && 
13bb0 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20  !isMemdb ){.    
13bc0 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
13bd0 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45  uum = (SQLITE_DE
13be0 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
13bf0 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20   ? 1 : 0);.     
13c00 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
13c10 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46  um = (SQLITE_DEF
13c20 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d  AULT_AUTOVACUUM=
13c30 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20  =2 ? 1 : 0);.   
13c40 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
13c50 20 20 6e 52 65 73 65 72 76 65 20 3d 20 30 3b 0a    nReserve = 0;.
13c60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13c70 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
13c80 20 52 2d 33 37 34 39 37 2d 34 32 34 31 32 20 54   R-37497-42412 T
13c90 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 72  he size of the r
13ca0 65 73 65 72 76 65 64 20 72 65 67 69 6f 6e 20 69  eserved region i
13cb0 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65 72  s.      ** deter
13cc0 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6f 6e 65  mined by the one
13cd0 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20 69  -byte unsigned i
13ce0 6e 74 65 67 65 72 20 66 6f 75 6e 64 20 61 74 20  nteger found at 
13cf0 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 32 30 0a  an offset of 20.
13d00 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68        ** into th
13d10 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
13d20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20  header. */.     
13d30 20 6e 52 65 73 65 72 76 65 20 3d 20 7a 44 62 48   nReserve = zDbH
13d40 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20  eader[20];.     
13d50 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
13d60 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46  = BTS_PAGESIZE_F
13d70 49 58 45 44 3b 0a 23 69 66 6e 64 65 66 20 53 51  IXED;.#ifndef SQ
13d80 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
13d90 43 55 55 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e  CUUM.      pBt->
13da0 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65  autoVacuum = (ge
13db0 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65  t4byte(&zDbHeade
13dc0 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30  r[36 + 4*4])?1:0
13dd0 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  );.      pBt->in
13de0 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  crVacuum = (get4
13df0 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b  byte(&zDbHeader[
13e00 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 7*4])?1:0);
13e10 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
13e20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
13e30 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
13e40 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
13e50 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73  ->pageSize, nRes
13e60 65 72 76 65 29 3b 0a 20 20 20 20 69 66 28 20 72  erve);.    if( r
13e70 63 20 29 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f  c ) goto btree_o
13e80 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 70 42 74  pen_out;.    pBt
13e90 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  ->usableSize = p
13ea0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e  Bt->pageSize - n
13eb0 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73  Reserve;.    ass
13ec0 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65 53  ert( (pBt->pageS
13ed0 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20 20  ize & 7)==0 );  
13ee0 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d  /* 8-byte alignm
13ef0 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65 20  ent of pageSize 
13f00 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64 65 66 69  */.   .#if !defi
13f10 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
13f20 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26  SHARED_CACHE) &&
13f30 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
13f40 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20  _OMIT_DISKIO).  
13f50 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77    /* Add the new
13f60 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
13f70 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c   to the linked l
13f80 69 73 74 20 73 68 61 72 61 62 6c 65 20 42 74 53  ist sharable BtS
13f90 68 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20  hareds..    */. 
13fa0 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62     if( p->sharab
13fb0 6c 65 20 29 7b 0a 20 20 20 20 20 20 4d 55 54 45  le ){.      MUTE
13fc0 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
13fd0 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61  _mutex *mutexSha
13fe0 72 65 64 3b 20 29 0a 20 20 20 20 20 20 70 42 74  red; ).      pBt
13ff0 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  ->nRef = 1;.    
14000 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 6d    MUTEX_LOGIC( m
14010 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c  utexShared = sql
14020 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
14030 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
14040 49 43 5f 4d 41 53 54 45 52 29 3b 29 0a 20 20 20  IC_MASTER);).   
14050 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48     if( SQLITE_TH
14060 52 45 41 44 53 41 46 45 20 26 26 20 73 71 6c 69  READSAFE && sqli
14070 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
14080 62 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20 20  bCoreMutex ){.  
14090 20 20 20 20 20 20 70 42 74 2d 3e 6d 75 74 65 78        pBt->mutex
140a0 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
140b0 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
140c0 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20 20  X_FAST);.       
140d0 20 69 66 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d   if( pBt->mutex=
140e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
140f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
14100 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  M;.          db-
14110 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
14120 30 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  0;.          got
14130 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
14140 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
14150 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
14160 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75  3_mutex_enter(mu
14170 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
14180 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47    pBt->pNext = G
14190 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
141a0 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
141b0 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 47  heList);.      G
141c0 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
141d0 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
141e0 68 65 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a 20  heList) = pBt;. 
141f0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
14200 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68  ex_leave(mutexSh
14210 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  ared);.    }.#en
14220 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65  dif.  }..#if !de
14230 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
14240 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
14250 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
14260 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
14270 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77 20    /* If the new 
14280 42 74 72 65 65 20 75 73 65 73 20 61 20 73 68 61  Btree uses a sha
14290 72 61 62 6c 65 20 70 42 74 53 68 61 72 65 64 2c  rable pBtShared,
142a0 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e   then link the n
142b0 65 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69 6e  ew.  ** Btree in
142c0 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61  to the list of a
142d0 6c 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72 65  ll sharable Btre
142e0 65 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20  es for the same 
142f0 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a  connection..  **
14300 20 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65 70   The list is kep
14310 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  t in ascending o
14320 72 64 65 72 20 62 79 20 70 42 74 20 61 64 64 72  rder by pBt addr
14330 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ess..  */.  if( 
14340 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
14350 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74     int i;.    Bt
14360 72 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20 66  ree *pSib;.    f
14370 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
14380 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  b; i++){.      i
14390 66 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e 61  f( (pSib = db->a
143a0 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26 26  Db[i].pBt)!=0 &&
143b0 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65 20   pSib->sharable 
143c0 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ){.        while
143d0 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29 7b  ( pSib->pPrev ){
143e0 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 50   pSib = pSib->pP
143f0 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20 69  rev; }.        i
14400 66 28 20 70 2d 3e 70 42 74 3c 70 53 69 62 2d 3e  f( p->pBt<pSib->
14410 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBt ){.         
14420 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62   p->pNext = pSib
14430 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  ;.          p->p
14440 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20  Prev = 0;.      
14450 20 20 20 20 70 53 69 62 2d 3e 70 50 72 65 76 20      pSib->pPrev 
14460 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = p;.        }el
14470 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68  se{.          wh
14480 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65 78 74  ile( pSib->pNext
14490 20 26 26 20 70 53 69 62 2d 3e 70 4e 65 78 74 2d   && pSib->pNext-
144a0 3e 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b 0a 20  >pBt<p->pBt ){. 
144b0 20 20 20 20 20 20 20 20 20 20 20 70 53 69 62 20             pSib 
144c0 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20  = pSib->pNext;. 
144d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
144e0 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20       p->pNext = 
144f0 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pSib->pNext;.   
14500 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20         p->pPrev 
14510 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20  = pSib;.        
14520 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
14530 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d  {.            p-
14540 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
14550 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  p;.          }. 
14560 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70           pSib->p
14570 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  Next = p;.      
14580 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
14590 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
145a0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70  .  }.#endif.  *p
145b0 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72  pBtree = p;..btr
145c0 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69  ee_open_out:.  i
145d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
145e0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74 20   ){.    if( pBt 
145f0 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29  && pBt->pPager )
14600 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
14610 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70  agerClose(pBt->p
14620 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
14630 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
14640 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
14650 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 2a 70  _free(p);.    *p
14660 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65  pBtree = 0;.  }e
14670 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  lse{.    /* If t
14680 68 65 20 42 2d 54 72 65 65 20 77 61 73 20 73 75  he B-Tree was su
14690 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65  ccessfully opene
146a0 64 2c 20 73 65 74 20 74 68 65 20 70 61 67 65 72  d, set the pager
146b0 2d 63 61 63 68 65 20 73 69 7a 65 20 74 6f 20 74  -cache size to t
146c0 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61 75 6c  he.    ** defaul
146d0 74 20 76 61 6c 75 65 2e 20 45 78 63 65 70 74 2c  t value. Except,
146e0 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 6f 6e   when opening on
146f0 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 68 61   an existing sha
14700 72 65 64 20 70 61 67 65 72 2d 63 61 63 68 65 2c  red pager-cache,
14710 0a 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 63  .    ** do not c
14720 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 72 2d  hange the pager-
14730 63 61 63 68 65 20 73 69 7a 65 2e 0a 20 20 20 20  cache size..    
14740 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
14750 65 33 42 74 72 65 65 53 63 68 65 6d 61 28 70 2c  e3BtreeSchema(p,
14760 20 30 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20   0, 0)==0 ){.   
14770 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
14780 65 74 43 61 63 68 65 73 69 7a 65 28 70 2d 3e 70  etCachesize(p->p
14790 42 74 2d 3e 70 50 61 67 65 72 2c 20 53 51 4c 49  Bt->pPager, SQLI
147a0 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45  TE_DEFAULT_CACHE
147b0 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 20 20  _SIZE);.    }.  
147c0 7d 0a 20 20 69 66 28 20 6d 75 74 65 78 4f 70 65  }.  if( mutexOpe
147d0 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  n ){.    assert(
147e0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
147f0 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e 29 20 29  eld(mutexOpen) )
14800 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
14810 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f  tex_leave(mutexO
14820 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pen);.  }.  retu
14830 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
14840 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 42 74  Decrement the Bt
14850 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e  Shared.nRef coun
14860 74 65 72 2e 20 20 57 68 65 6e 20 69 74 20 72 65  ter.  When it re
14870 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72  aches zero,.** r
14880 65 6d 6f 76 65 20 74 68 65 20 42 74 53 68 61 72  emove the BtShar
14890 65 64 20 73 74 72 75 63 74 75 72 65 20 66 72 6f  ed structure fro
148a0 6d 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69  m the sharing li
148b0 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  st.  Return.** t
148c0 72 75 65 20 69 66 20 74 68 65 20 42 74 53 68 61  rue if the BtSha
148d0 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72  red.nRef counter
148e0 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20 61 6e   reaches zero an
148f0 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73  d return.** fals
14900 65 20 69 66 20 69 74 20 69 73 20 73 74 69 6c 6c  e if it is still
14910 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74   positive..*/.st
14920 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76 65 46  atic int removeF
14930 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 42  romSharingList(B
14940 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 23  tShared *pBt){.#
14950 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14960 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
14970 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73    MUTEX_LOGIC( s
14980 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d  qlite3_mutex *pM
14990 61 73 74 65 72 3b 20 29 0a 20 20 42 74 53 68 61  aster; ).  BtSha
149a0 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e  red *pList;.  in
149b0 74 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a  t removed = 0;..
149c0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
149d0 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28  3_mutex_notheld(
149e0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
149f0 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d   MUTEX_LOGIC( pM
14a00 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d  aster = sqlite3M
14a10 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
14a20 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
14a30 53 54 45 52 29 3b 20 29 0a 20 20 73 71 6c 69 74  STER); ).  sqlit
14a40 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
14a50 4d 61 73 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e  Master);.  pBt->
14a60 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42  nRef--;.  if( pB
14a70 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20  t->nRef<=0 ){.  
14a80 20 20 69 66 28 20 47 4c 4f 42 41 4c 28 42 74 53    if( GLOBAL(BtS
14a90 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
14aa0 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3d 3d  aredCacheList)==
14ab0 70 42 74 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f  pBt ){.      GLO
14ac0 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
14ad0 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
14ae0 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65  List) = pBt->pNe
14af0 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  xt;.    }else{. 
14b00 20 20 20 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f       pList = GLO
14b10 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
14b20 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
14b30 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68 69  List);.      whi
14b40 6c 65 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74  le( ALWAYS(pList
14b50 29 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78  ) && pList->pNex
14b60 74 21 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20  t!=pBt ){.      
14b70 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70    pList=pList->p
14b80 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
14b90 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
14ba0 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20  List) ){.       
14bb0 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20   pList->pNext = 
14bc0 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pBt->pNext;.    
14bd0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
14be0 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  ( SQLITE_THREADS
14bf0 41 46 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  AFE ){.      sql
14c00 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28  ite3_mutex_free(
14c10 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  pBt->mutex);.   
14c20 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64 20 3d   }.    removed =
14c30 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   1;.  }.  sqlite
14c40 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d  3_mutex_leave(pM
14c50 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  aster);.  return
14c60 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a   removed;.#else.
14c70 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64    return 1;.#end
14c80 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  if.}../*.** Make
14c90 20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d 70 53   sure pBt->pTmpS
14ca0 70 61 63 65 20 70 6f 69 6e 74 73 20 74 6f 20 61  pace points to a
14cb0 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  n allocation of 
14cc0 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45  .** MX_CELL_SIZE
14cd0 28 70 42 74 29 20 62 79 74 65 73 20 77 69 74 68  (pBt) bytes with
14ce0 20 61 20 34 2d 62 79 74 65 20 70 72 65 66 69 78   a 4-byte prefix
14cf0 20 66 6f 72 20 61 20 6c 65 66 74 2d 63 68 69 6c   for a left-chil
14d00 64 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  d.** pointer..*/
14d10 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 6c 6c  .static void all
14d20 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 42  ocateTempSpace(B
14d30 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
14d40 20 69 66 28 20 21 70 42 74 2d 3e 70 54 6d 70 53   if( !pBt->pTmpS
14d50 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d  pace ){.    pBt-
14d60 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c  >pTmpSpace = sql
14d70 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20  ite3PageMalloc( 
14d80 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b  pBt->pageSize );
14d90 0a 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20  ..    /* One of 
14da0 74 68 65 20 75 73 65 73 20 6f 66 20 70 42 74 2d  the uses of pBt-
14db0 3e 70 54 6d 70 53 70 61 63 65 20 69 73 20 74 6f  >pTmpSpace is to
14dc0 20 66 6f 72 6d 61 74 20 63 65 6c 6c 73 20 62 65   format cells be
14dd0 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 6e 73 65  fore.    ** inse
14de0 72 74 69 6e 67 20 74 68 65 6d 20 69 6e 74 6f 20  rting them into 
14df0 61 20 6c 65 61 66 20 70 61 67 65 20 28 66 75 6e  a leaf page (fun
14e00 63 74 69 6f 6e 20 66 69 6c 6c 49 6e 43 65 6c 6c  ction fillInCell
14e10 28 29 29 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61  ()). If.    ** a
14e20 20 63 65 6c 6c 20 69 73 20 6c 65 73 73 20 74 68   cell is less th
14e30 61 6e 20 34 20 62 79 74 65 73 20 69 6e 20 73 69  an 4 bytes in si
14e40 7a 65 2c 20 69 74 20 69 73 20 72 6f 75 6e 64 65  ze, it is rounde
14e50 64 20 75 70 20 74 6f 20 34 20 62 79 74 65 73 0a  d up to 4 bytes.
14e60 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 76 61      ** by the va
14e70 72 69 6f 75 73 20 72 6f 75 74 69 6e 65 73 20 74  rious routines t
14e80 68 61 74 20 6d 61 6e 69 70 75 6c 61 74 65 20 62  hat manipulate b
14e90 69 6e 61 72 79 20 63 65 6c 6c 73 2e 20 57 68 69  inary cells. Whi
14ea0 63 68 0a 20 20 20 20 2a 2a 20 63 61 6e 20 6d 65  ch.    ** can me
14eb0 61 6e 20 74 68 61 74 20 66 69 6c 6c 49 6e 43 65  an that fillInCe
14ec0 6c 6c 28 29 20 6f 6e 6c 79 20 69 6e 69 74 69 61  ll() only initia
14ed0 6c 69 7a 65 73 20 74 68 65 20 66 69 72 73 74 20  lizes the first 
14ee0 32 20 6f 72 20 33 0a 20 20 20 20 2a 2a 20 62 79  2 or 3.    ** by
14ef0 74 65 73 20 6f 66 20 70 54 6d 70 53 70 61 63 65  tes of pTmpSpace
14f00 2c 20 62 75 74 20 74 68 61 74 20 74 68 65 20 66  , but that the f
14f10 69 72 73 74 20 34 20 62 79 74 65 73 20 61 72 65  irst 4 bytes are
14f20 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 20 20 20   copied from.   
14f30 20 2a 2a 20 69 74 20 69 6e 74 6f 20 61 20 64 61   ** it into a da
14f40 74 61 62 61 73 65 20 70 61 67 65 2e 20 54 68 69  tabase page. Thi
14f50 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c  s is not actuall
14f60 79 20 61 20 70 72 6f 62 6c 65 6d 2c 20 62 75 74  y a problem, but
14f70 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20   it.    ** does 
14f80 63 61 75 73 65 20 61 20 76 61 6c 67 72 69 6e 64  cause a valgrind
14f90 20 65 72 72 6f 72 20 77 68 65 6e 20 74 68 65 20   error when the 
14fa0 31 20 6f 72 20 32 20 62 79 74 65 73 20 6f 66 20  1 or 2 bytes of 
14fb0 75 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20 20 20  unitialized .   
14fc0 20 2a 2a 20 64 61 74 61 20 69 73 20 70 61 73 73   ** data is pass
14fd0 65 64 20 74 6f 20 73 79 73 74 65 6d 20 63 61 6c  ed to system cal
14fe0 6c 20 77 72 69 74 65 28 29 2e 20 53 6f 20 74 6f  l write(). So to
14ff0 20 61 76 6f 69 64 20 74 68 69 73 20 65 72 72 6f   avoid this erro
15000 72 2c 0a 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74  r,.    ** zero t
15010 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  he first 4 bytes
15020 20 6f 66 20 74 65 6d 70 20 73 70 61 63 65 20 68   of temp space h
15030 65 72 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ere..    **.    
15040 2a 2a 20 41 6c 73 6f 3a 20 20 50 72 6f 76 69 64  ** Also:  Provid
15050 65 20 66 6f 75 72 20 62 79 74 65 73 20 6f 66 20  e four bytes of 
15060 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70 61 63  initialized spac
15070 65 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20  e before the.   
15080 20 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66   ** beginning of
15090 20 70 54 6d 70 53 70 61 63 65 20 61 73 20 61 6e   pTmpSpace as an
150a0 20 61 72 65 61 20 61 76 61 69 6c 61 62 6c 65 20   area available 
150b0 74 6f 20 70 72 65 70 65 6e 64 20 74 68 65 0a 20  to prepend the. 
150c0 20 20 20 2a 2a 20 6c 65 66 74 2d 63 68 69 6c 64     ** left-child
150d0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
150e0 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 63  beginning of a c
150f0 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ell..    */.    
15100 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  if( pBt->pTmpSpa
15110 63 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73  ce ){.      mems
15120 65 74 28 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  et(pBt->pTmpSpac
15130 65 2c 20 30 2c 20 38 29 3b 0a 20 20 20 20 20 20  e, 0, 8);.      
15140 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 2b  pBt->pTmpSpace +
15150 3d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 4;.    }.  }.}
15160 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65  ../*.** Free the
15170 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
15180 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74  allocation.*/.st
15190 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 54 65  atic void freeTe
151a0 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65 64  mpSpace(BtShared
151b0 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 70 42   *pBt){.  if( pB
151c0 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a  t->pTmpSpace ){.
151d0 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61      pBt->pTmpSpa
151e0 63 65 20 2d 3d 20 34 3b 0a 20 20 20 20 73 71 6c  ce -= 4;.    sql
151f0 69 74 65 33 50 61 67 65 46 72 65 65 28 70 42 74  ite3PageFree(pBt
15200 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20  ->pTmpSpace);.  
15210 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65    pBt->pTmpSpace
15220 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
15230 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e  ** Close an open
15240 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 6e   database and in
15250 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 63 75 72  validate all cur
15260 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sors..*/.int sql
15270 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 42  ite3BtreeClose(B
15280 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
15290 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
152a0 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  Bt;.  BtCursor *
152b0 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73  pCur;..  /* Clos
152c0 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70  e all cursors op
152d0 65 6e 65 64 20 76 69 61 20 74 68 69 73 20 68 61  ened via this ha
152e0 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65  ndle.  */.  asse
152f0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
15300 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
15310 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
15320 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
15330 20 20 70 43 75 72 20 3d 20 70 42 74 2d 3e 70 43    pCur = pBt->pC
15340 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20  ursor;.  while( 
15350 70 43 75 72 20 29 7b 0a 20 20 20 20 42 74 43 75  pCur ){.    BtCu
15360 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43 75  rsor *pTmp = pCu
15370 72 3b 0a 20 20 20 20 70 43 75 72 20 3d 20 70 43  r;.    pCur = pC
15380 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69  ur->pNext;.    i
15390 66 28 20 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d  f( pTmp->pBtree=
153a0 3d 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =p ){.      sqli
153b0 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72  te3BtreeCloseCur
153c0 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d  sor(pTmp);.    }
153d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62  .  }..  /* Rollb
153e0 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65 20 74  ack any active t
153f0 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 66  ransaction and f
15400 72 65 65 20 74 68 65 20 68 61 6e 64 6c 65 20 73  ree the handle s
15410 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54  tructure..  ** T
15420 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
15430 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
15440 29 20 64 72 6f 70 73 20 61 6e 79 20 74 61 62 6c  ) drops any tabl
15450 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a  e-locks held by.
15460 20 20 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c 65    ** this handle
15470 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
15480 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c  BtreeRollback(p,
15490 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a   SQLITE_OK, 0);.
154a0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
154b0 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  ave(p);..  /* If
154c0 20 74 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c   there are still
154d0 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e 64 69   other outstandi
154e0 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ng references to
154f0 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
15500 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65  e.  ** structure
15510 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68  , return now. Th
15520 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74  e remainder of t
15530 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c  his procedure cl
15540 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74 68  eans .  ** up th
15550 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e 0a  e shared-btree..
15560 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
15570 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20  ->wantToLock==0 
15580 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20  && p->locked==0 
15590 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61  );.  if( !p->sha
155a0 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46  rable || removeF
155b0 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 70  romSharingList(p
155c0 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  Bt) ){.    /* Th
155d0 65 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67  e pBt is no long
155e0 65 72 20 6f 6e 20 74 68 65 20 73 68 61 72 69 6e  er on the sharin
155f0 67 20 6c 69 73 74 2c 20 73 6f 20 77 65 20 63 61  g list, so we ca
15600 6e 20 61 63 63 65 73 73 0a 20 20 20 20 2a 2a 20  n access.    ** 
15610 69 74 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  it without havin
15620 67 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75  g to hold the mu
15630 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  tex..    **.    
15640 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64  ** Clean out and
15650 20 64 65 6c 65 74 65 20 74 68 65 20 42 74 53 68   delete the BtSh
15660 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20  ared object..   
15670 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
15680 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b  !pBt->pCursor );
15690 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
156a0 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67  rClose(pBt->pPag
156b0 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  er);.    if( pBt
156c0 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20 26 26  ->xFreeSchema &&
156d0 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b   pBt->pSchema ){
156e0 0a 20 20 20 20 20 20 70 42 74 2d 3e 78 46 72 65  .      pBt->xFre
156f0 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 70 53 63  eSchema(pBt->pSc
15700 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20  hema);.    }.   
15710 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30   sqlite3DbFree(0
15720 2c 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b  , pBt->pSchema);
15730 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61  .    freeTempSpa
15740 63 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c  ce(pBt);.    sql
15750 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a  ite3_free(pBt);.
15760 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
15770 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
15780 43 41 43 48 45 0a 20 20 61 73 73 65 72 74 28 20  CACHE.  assert( 
15790 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30  p->wantToLock==0
157a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
157b0 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20  >locked==0 );.  
157c0 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 20 70  if( p->pPrev ) p
157d0 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d  ->pPrev->pNext =
157e0 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28   p->pNext;.  if(
157f0 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70   p->pNext ) p->p
15800 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d  Next->pPrev = p-
15810 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a  >pPrev;.#endif..
15820 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
15830 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
15840 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
15850 43 68 61 6e 67 65 20 74 68 65 20 22 73 6f 66 74  Change the "soft
15860 22 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e  " limit on the n
15870 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
15880 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 20  n the cache..** 
15890 55 6e 75 73 65 64 20 61 6e 64 20 75 6e 6d 6f 64  Unused and unmod
158a0 69 66 69 65 64 20 70 61 67 65 73 20 77 69 6c 6c  ified pages will
158b0 20 62 65 20 72 65 63 79 63 6c 65 64 20 77 68 65   be recycled whe
158c0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  n the number of.
158d0 2a 2a 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ** pages in the 
158e0 63 61 63 68 65 20 65 78 63 65 65 64 73 20 74 68  cache exceeds th
158f0 69 73 20 73 6f 66 74 20 6c 69 6d 69 74 2e 20 20  is soft limit.  
15900 42 75 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  But the size of 
15910 74 68 65 0a 2a 2a 20 63 61 63 68 65 20 69 73 20  the.** cache is 
15920 61 6c 6c 6f 77 65 64 20 74 6f 20 67 72 6f 77 20  allowed to grow 
15930 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73  larger than this
15940 20 6c 69 6d 69 74 20 69 66 20 69 74 20 63 6f 6e   limit if it con
15950 74 61 69 6e 73 0a 2a 2a 20 64 69 72 74 79 20 70  tains.** dirty p
15960 61 67 65 73 20 6f 72 20 70 61 67 65 73 20 73 74  ages or pages st
15970 69 6c 6c 20 69 6e 20 61 63 74 69 76 65 20 75 73  ill in active us
15980 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
15990 33 42 74 72 65 65 53 65 74 43 61 63 68 65 53 69  3BtreeSetCacheSi
159a0 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ze(Btree *p, int
159b0 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53 68   mxPage){.  BtSh
159c0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
159d0 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
159e0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
159f0 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
15a00 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
15a10 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69  Enter(p);.  sqli
15a20 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65  te3PagerSetCache
15a30 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
15a40 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c  , mxPage);.  sql
15a50 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
15a60 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
15a70 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
15a80 43 68 61 6e 67 65 20 74 68 65 20 22 73 70 69 6c  Change the "spil
15a90 6c 22 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20  l" limit on the 
15aa0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
15ab0 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a  in the cache..**
15ac0 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   If the number o
15ad0 66 20 70 61 67 65 73 20 65 78 63 65 65 64 73 20  f pages exceeds 
15ae0 74 68 69 73 20 6c 69 6d 69 74 20 64 75 72 69 6e  this limit durin
15af0 67 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61  g a write transa
15b00 63 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65 20 70 61  ction,.** the pa
15b10 67 65 72 20 6d 69 67 68 74 20 61 74 74 65 6d 70  ger might attemp
15b20 74 20 74 6f 20 22 73 70 69 6c 6c 22 20 70 61 67  t to "spill" pag
15b30 65 73 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  es to the journa
15b40 6c 20 65 61 72 6c 79 20 69 6e 0a 2a 2a 20 6f 72  l early in.** or
15b50 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 20 6d  der to free up m
15b60 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  emory..**.** The
15b70 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
15b80 69 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  is the current s
15b90 70 69 6c 6c 20 73 69 7a 65 2e 20 20 49 66 20 7a  pill size.  If z
15ba0 65 72 6f 20 69 73 20 70 61 73 73 65 64 0a 2a 2a  ero is passed.**
15bb0 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2c   as an argument,
15bc0 20 6e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20   no changes are 
15bd0 6d 61 64 65 20 74 6f 20 74 68 65 20 73 70 69 6c  made to the spil
15be0 6c 20 73 69 7a 65 20 73 65 74 74 69 6e 67 2c 20  l size setting, 
15bf0 73 6f 0a 2a 2a 20 75 73 69 6e 67 20 6d 78 50 61  so.** using mxPa
15c00 67 65 20 6f 66 20 30 20 69 73 20 61 20 77 61 79  ge of 0 is a way
15c10 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 63 75   to query the cu
15c20 72 72 65 6e 74 20 73 70 69 6c 6c 20 73 69 7a 65  rrent spill size
15c30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
15c40 42 74 72 65 65 53 65 74 53 70 69 6c 6c 53 69 7a  BtreeSetSpillSiz
15c50 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
15c60 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61  mxPage){.  BtSha
15c70 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
15c80 74 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  t;.  int res;.  
15c90 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
15ca0 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
15cb0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
15cc0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
15cd0 70 29 3b 0a 20 20 72 65 73 20 3d 20 73 71 6c 69  p);.  res = sqli
15ce0 74 65 33 50 61 67 65 72 53 65 74 53 70 69 6c 6c  te3PagerSetSpill
15cf0 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
15d00 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c  , mxPage);.  sql
15d10 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
15d20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b  );.  return res;
15d30 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  .}..#if SQLITE_M
15d40 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f  AX_MMAP_SIZE>0./
15d50 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
15d60 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 61 6d 6f  limit on the amo
15d70 75 6e 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  unt of the datab
15d80 61 73 65 20 66 69 6c 65 20 74 68 61 74 20 6d 61  ase file that ma
15d90 79 20 62 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6d  y be.** memory m
15da0 61 70 70 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  apped..*/.int sq
15db0 6c 69 74 65 33 42 74 72 65 65 53 65 74 4d 6d 61  lite3BtreeSetMma
15dc0 70 4c 69 6d 69 74 28 42 74 72 65 65 20 2a 70 2c  pLimit(Btree *p,
15dd0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73   sqlite3_int64 s
15de0 7a 4d 6d 61 70 29 7b 0a 20 20 42 74 53 68 61 72  zMmap){.  BtShar
15df0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
15e00 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
15e10 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
15e20 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
15e30 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
15e40 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ter(p);.  sqlite
15e50 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d  3PagerSetMmapLim
15e60 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  it(pBt->pPager, 
15e70 73 7a 4d 6d 61 70 29 3b 0a 20 20 73 71 6c 69 74  szMmap);.  sqlit
15e80 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
15e90 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
15ea0 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
15eb0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
15ec0 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a  _SIZE>0 */../*.*
15ed0 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77 61 79  * Change the way
15ee0 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64 20   data is synced 
15ef0 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64 65 72  to disk in order
15f00 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f 72 20   to increase or 
15f10 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20  decrease.** how 
15f20 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73  well the databas
15f30 65 20 72 65 73 69 73 74 73 20 64 61 6d 61 67 65  e resists damage
15f40 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68   due to OS crash
15f50 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20  es and power.** 
15f60 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c  failures.  Level
15f70 20 31 20 69 73 20 74 68 65 20 73 61 6d 65 20 61   1 is the same a
15f80 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28  s asynchronous (
15f90 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63 75 72  no syncs() occur
15fa0 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69 73   and.** there is
15fb0 20 61 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c   a high probabil
15fc0 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29 20 20  ity of damage)  
15fd0 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65 20 64  Level 2 is the d
15fe0 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a  efault.  There.*
15ff0 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f 77 20  * is a very low 
16000 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f  but non-zero pro
16010 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61  bability of dama
16020 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72 65 64  ge.  Level 3 red
16030 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62  uces the.** prob
16040 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67  ability of damag
16050 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62  e to near zero b
16060 75 74 20 77 69 74 68 20 61 20 77 72 69 74 65 20  ut with a write 
16070 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75  performance redu
16080 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ction..*/.#ifnde
16090 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  f SQLITE_OMIT_PA
160a0 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20  GER_PRAGMAS.int 
160b0 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50  sqlite3BtreeSetP
160c0 61 67 65 72 46 6c 61 67 73 28 0a 20 20 42 74 72  agerFlags(.  Btr
160d0 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ee *p,          
160e0 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
160f0 20 74 6f 20 73 65 74 20 74 68 65 20 73 61 66 65   to set the safe
16100 74 79 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f 0a 20  ty level on */. 
16110 20 75 6e 73 69 67 6e 65 64 20 70 67 46 6c 61 67   unsigned pgFlag
16120 73 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f  s       /* Vario
16130 75 73 20 50 41 47 45 52 5f 2a 20 66 6c 61 67 73  us PAGER_* flags
16140 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65   */.){.  BtShare
16150 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
16160 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
16170 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
16180 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
16190 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
161a0 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  er(p);.  sqlite3
161b0 50 61 67 65 72 53 65 74 46 6c 61 67 73 28 70 42  PagerSetFlags(pB
161c0 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 46 6c 61  t->pPager, pgFla
161d0 67 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  gs);.  sqlite3Bt
161e0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
161f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16200 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
16210 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
16220 74 68 65 20 67 69 76 65 6e 20 62 74 72 65 65 20  the given btree 
16230 69 73 20 73 65 74 20 74 6f 20 73 61 66 65 74 79  is set to safety
16240 20 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f 74   level 1.  In ot
16250 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72 65  her.** words, re
16260 74 75 72 6e 20 54 52 55 45 20 69 66 20 6e 6f 20  turn TRUE if no 
16270 73 79 6e 63 28 29 20 6f 63 63 75 72 73 20 6f 6e  sync() occurs on
16280 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 73 2e   the disk files.
16290 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
162a0 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64  treeSyncDisabled
162b0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
162c0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
162d0 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  >pBt;.  int rc;.
162e0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
162f0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
16300 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20 0a  db->mutex) );  .
16310 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
16320 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74  ter(p);.  assert
16330 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50  ( pBt && pBt->pP
16340 61 67 65 72 20 29 3b 0a 20 20 72 63 20 3d 20 73  ager );.  rc = s
16350 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e  qlite3PagerNosyn
16360 63 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  c(pBt->pPager);.
16370 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
16380 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
16390 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68   rc;.}../*.** Ch
163a0 61 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c 74  ange the default
163b0 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e 64 20   pages size and 
163c0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
163d0 73 65 72 76 65 64 20 62 79 74 65 73 20 70 65 72  served bytes per
163e0 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66   page..** Or, if
163f0 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 68   the page size h
16400 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
16410 66 69 78 65 64 2c 20 72 65 74 75 72 6e 20 53 51  fixed, return SQ
16420 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a  LITE_READONLY .*
16430 2a 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69  * without changi
16440 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a  ng anything..**.
16450 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65  ** The page size
16460 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72   must be a power
16470 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35 31   of 2 between 51
16480 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20 49 66  2 and 65536.  If
16490 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a   the page.** siz
164a0 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73 20  e supplied does 
164b0 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63 6f  not meet this co
164c0 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74 68  nstraint then th
164d0 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e  e page size is n
164e0 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a  ot.** changed..*
164f0 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 73 20  *.** Page sizes 
16500 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 64 20  are constrained 
16510 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66  to be a power of
16520 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74 68 65   two so that the
16530 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68   region.** of th
16540 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
16550 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67  used for locking
16560 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 50   (beginning at P
16570 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20  ENDING_BYTE,.** 
16580 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 70  the first byte p
16590 61 73 74 20 74 68 65 20 31 47 42 20 62 6f 75 6e  ast the 1GB boun
165a0 64 61 72 79 2c 20 30 78 34 30 30 30 30 30 30 30  dary, 0x40000000
165b0 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63 75 72  ) needs to occur
165c0 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e  .** at the begin
165d0 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65 2e 0a  ning of a page..
165e0 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74  **.** If paramet
165f0 65 72 20 6e 52 65 73 65 72 76 65 20 69 73 20 6c  er nReserve is l
16600 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ess than zero, t
16610 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
16620 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20 62 79  f reserved.** by
16630 74 65 73 20 70 65 72 20 70 61 67 65 20 69 73 20  tes per page is 
16640 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a  left unchanged..
16650 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 46 69  **.** If the iFi
16660 78 21 3d 30 20 74 68 65 6e 20 74 68 65 20 42 54  x!=0 then the BT
16670 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44  S_PAGESIZE_FIXED
16680 20 66 6c 61 67 20 69 73 20 73 65 74 20 73 6f 20   flag is set so 
16690 74 68 61 74 20 74 68 65 20 70 61 67 65 20 73 69  that the page si
166a0 7a 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f 76 61  ze.** and autova
166b0 63 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20 6e 6f  cuum mode can no
166c0 20 6c 6f 6e 67 65 72 20 62 65 20 63 68 61 6e 67   longer be chang
166d0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
166e0 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69  e3BtreeSetPageSi
166f0 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ze(Btree *p, int
16700 20 70 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e   pageSize, int n
16710 52 65 73 65 72 76 65 2c 20 69 6e 74 20 69 46 69  Reserve, int iFi
16720 78 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  x){.  int rc = S
16730 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68  QLITE_OK;.  BtSh
16740 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
16750 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52  Bt;.  assert( nR
16760 65 73 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e 52  eserve>=-1 && nR
16770 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20  eserve<=255 );. 
16780 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
16790 65 72 28 70 29 3b 0a 23 69 66 20 53 51 4c 49 54  er(p);.#if SQLIT
167a0 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66  E_HAS_CODEC.  if
167b0 28 20 6e 52 65 73 65 72 76 65 3e 70 42 74 2d 3e  ( nReserve>pBt->
167c0 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20 29  optimalReserve )
167d0 20 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73   pBt->optimalRes
167e0 65 72 76 65 20 3d 20 28 75 38 29 6e 52 65 73 65  erve = (u8)nRese
167f0 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  rve;.#endif.  if
16800 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ( pBt->btsFlags 
16810 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46  & BTS_PAGESIZE_F
16820 49 58 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69  IXED ){.    sqli
16830 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
16840 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
16850 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
16860 7d 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76 65  }.  if( nReserve
16870 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65 73 65 72  <0 ){.    nReser
16880 76 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  ve = pBt->pageSi
16890 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze - pBt->usable
168a0 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65  Size;.  }.  asse
168b0 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20  rt( nReserve>=0 
168c0 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35  && nReserve<=255
168d0 20 29 3b 0a 20 20 69 66 28 20 70 61 67 65 53 69   );.  if( pageSi
168e0 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53  ze>=512 && pageS
168f0 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ize<=SQLITE_MAX_
16900 50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20 20 20  PAGE_SIZE &&.   
16910 20 20 20 20 20 28 28 70 61 67 65 53 69 7a 65 2d       ((pageSize-
16920 31 29 26 70 61 67 65 53 69 7a 65 29 3d 3d 30 20  1)&pageSize)==0 
16930 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  ){.    assert( (
16940 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30  pageSize & 7)==0
16950 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
16960 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b  !pBt->pCursor );
16970 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69  .    pBt->pageSi
16980 7a 65 20 3d 20 28 75 33 32 29 70 61 67 65 53 69  ze = (u32)pageSi
16990 7a 65 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70  ze;.    freeTemp
169a0 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 7d 0a  Space(pBt);.  }.
169b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
169c0 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
169d0 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
169e0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73  ->pageSize, nRes
169f0 65 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e 75 73  erve);.  pBt->us
16a00 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
16a10 70 61 67 65 53 69 7a 65 20 2d 20 28 75 31 36 29  pageSize - (u16)
16a20 6e 52 65 73 65 72 76 65 3b 0a 20 20 69 66 28 20  nReserve;.  if( 
16a30 69 46 69 78 20 29 20 70 42 74 2d 3e 62 74 73 46  iFix ) pBt->btsF
16a40 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45  lags |= BTS_PAGE
16a50 53 49 5a 45 5f 46 49 58 45 44 3b 0a 20 20 73 71  SIZE_FIXED;.  sq
16a60 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
16a70 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
16a80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
16a90 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64   the currently d
16aa0 65 66 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65  efined page size
16ab0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
16ac0 74 72 65 65 47 65 74 50 61 67 65 53 69 7a 65 28  treeGetPageSize(
16ad0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74  Btree *p){.  ret
16ae0 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65  urn p->pBt->page
16af0 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Size;.}../*.** T
16b00 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
16b10 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74  similar to sqlit
16b20 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76  e3BtreeGetReserv
16b30 65 28 29 2c 20 65 78 63 65 70 74 20 74 68 61 74  e(), except that
16b40 20 69 74 0a 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20   it.** may only 
16b50 62 65 20 63 61 6c 6c 65 64 20 69 66 20 69 74 20  be called if it 
16b60 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68  is guaranteed th
16b70 61 74 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75  at the b-tree mu
16b80 74 65 78 20 69 73 20 61 6c 72 65 61 64 79 0a 2a  tex is already.*
16b90 2a 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  * held..**.** Th
16ba0 69 73 20 69 73 20 75 73 65 66 75 6c 20 69 6e 20  is is useful in 
16bb0 6f 6e 65 20 73 70 65 63 69 61 6c 20 63 61 73 65  one special case
16bc0 20 69 6e 20 74 68 65 20 62 61 63 6b 75 70 20 41   in the backup A
16bd0 50 49 20 63 6f 64 65 20 77 68 65 72 65 20 69 74  PI code where it
16be0 20 69 73 0a 2a 2a 20 6b 6e 6f 77 6e 20 74 68 61   is.** known tha
16bf0 74 20 74 68 65 20 73 68 61 72 65 64 20 62 2d 74  t the shared b-t
16c00 72 65 65 20 6d 75 74 65 78 20 69 73 20 68 65 6c  ree mutex is hel
16c10 64 2c 20 62 75 74 20 74 68 65 20 6d 75 74 65 78  d, but the mutex
16c20 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61   on the .** data
16c30 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74  base handle that
16c40 20 6f 77 6e 73 20 2a 70 20 69 73 20 6e 6f 74 2e   owns *p is not.
16c50 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 66   In this case if
16c60 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
16c70 65 72 28 29 0a 2a 2a 20 77 65 72 65 20 74 6f 20  er().** were to 
16c80 62 65 20 63 61 6c 6c 65 64 2c 20 69 74 20 6d 69  be called, it mi
16c90 67 68 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68  ght collide with
16ca0 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70 65 72   some other oper
16cb0 61 74 69 6f 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  ation on the.** 
16cc0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
16cd0 74 68 61 74 20 6f 77 6e 73 20 2a 70 2c 20 63 61  that owns *p, ca
16ce0 75 73 69 6e 67 20 75 6e 64 65 66 69 6e 65 64 20  using undefined 
16cf0 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74  behavior..*/.int
16d00 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
16d10 52 65 73 65 72 76 65 4e 6f 4d 75 74 65 78 28 42  ReserveNoMutex(B
16d20 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
16d30 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  n;.  assert( sql
16d40 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
16d50 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  p->pBt->mutex) )
16d60 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e  ;.  n = p->pBt->
16d70 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42  pageSize - p->pB
16d80 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
16d90 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
16da0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
16db0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
16dc0 66 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65  f space at the e
16dd0 6e 64 20 6f 66 20 65 76 65 72 79 20 70 61 67 65  nd of every page
16de0 20 74 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74   that.** are int
16df0 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e  entually left un
16e00 75 73 65 64 2e 20 20 54 68 69 73 20 69 73 20 74  used.  This is t
16e10 68 65 20 22 72 65 73 65 72 76 65 64 22 20 73 70  he "reserved" sp
16e20 61 63 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 73  ace that is.** s
16e30 6f 6d 65 74 69 6d 65 73 20 75 73 65 64 20 62 79  ometimes used by
16e40 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2a 0a   extensions..**.
16e50 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 48 41 53  ** If SQLITE_HAS
16e60 5f 4d 55 54 45 58 20 69 73 20 64 65 66 69 6e 65  _MUTEX is define
16e70 64 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  d then the numbe
16e80 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68  r returned is th
16e90 65 0a 2a 2a 20 67 72 65 61 74 65 72 20 6f 66 20  e.** greater of 
16ea0 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 73 65  the current rese
16eb0 72 76 65 64 20 73 70 61 63 65 20 61 6e 64 20 74  rved space and t
16ec0 68 65 20 6d 61 78 69 6d 75 6d 20 72 65 71 75 65  he maximum reque
16ed0 73 74 65 64 0a 2a 2a 20 72 65 73 65 72 76 65 20  sted.** reserve 
16ee0 73 70 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  space..*/.int sq
16ef0 6c 69 74 65 33 42 74 72 65 65 47 65 74 4f 70 74  lite3BtreeGetOpt
16f00 69 6d 61 6c 52 65 73 65 72 76 65 28 42 74 72 65  imalReserve(Btre
16f10 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  e *p){.  int n;.
16f20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
16f30 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71  ter(p);.  n = sq
16f40 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73  lite3BtreeGetRes
16f50 65 72 76 65 4e 6f 4d 75 74 65 78 28 70 29 3b 0a  erveNoMutex(p);.
16f60 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
16f70 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 6e 3c  S_CODEC.  if( n<
16f80 70 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52  p->pBt->optimalR
16f90 65 73 65 72 76 65 20 29 20 6e 20 3d 20 70 2d 3e  eserve ) n = p->
16fa0 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65  pBt->optimalRese
16fb0 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  rve;.#endif.  sq
16fc0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
16fd0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a  p);.  return n;.
16fe0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  }.../*.** Set th
16ff0 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  e maximum page c
17000 6f 75 6e 74 20 66 6f 72 20 61 20 64 61 74 61 62  ount for a datab
17010 61 73 65 20 69 66 20 6d 78 50 61 67 65 20 69 73  ase if mxPage is
17020 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f   positive..** No
17030 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64   changes are mad
17040 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 30  e if mxPage is 0
17050 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a   or negative..**
17060 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74   Regardless of t
17070 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61  he value of mxPa
17080 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6d  ge, return the m
17090 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
170a0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
170b0 33 42 74 72 65 65 4d 61 78 50 61 67 65 43 6f 75  3BtreeMaxPageCou
170c0 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  nt(Btree *p, int
170d0 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   mxPage){.  int 
170e0 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  n;.  sqlite3Btre
170f0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d  eEnter(p);.  n =
17100 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78   sqlite3PagerMax
17110 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74  PageCount(p->pBt
17120 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65  ->pPager, mxPage
17130 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
17140 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
17150 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
17160 53 65 74 20 74 68 65 20 42 54 53 5f 53 45 43 55  Set the BTS_SECU
17170 52 45 5f 44 45 4c 45 54 45 20 66 6c 61 67 20 69  RE_DELETE flag i
17180 66 20 6e 65 77 46 6c 61 67 20 69 73 20 30 20 6f  f newFlag is 0 o
17190 72 20 31 2e 20 20 49 66 20 6e 65 77 46 6c 61 67  r 1.  If newFlag
171a0 20 69 73 20 2d 31 2c 0a 2a 2a 20 74 68 65 6e 20   is -1,.** then 
171b0 6d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 2e  make no changes.
171c0 20 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20    Always return 
171d0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
171e0 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
171f0 54 45 0a 2a 2a 20 73 65 74 74 69 6e 67 20 61 66  TE.** setting af
17200 74 65 72 20 74 68 65 20 63 68 61 6e 67 65 2e 0a  ter the change..
17210 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
17220 72 65 65 53 65 63 75 72 65 44 65 6c 65 74 65 28  reeSecureDelete(
17230 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e 65  Btree *p, int ne
17240 77 46 6c 61 67 29 7b 0a 20 20 69 6e 74 20 62 3b  wFlag){.  int b;
17250 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
17260 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65  turn 0;.  sqlite
17270 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
17280 20 20 69 66 28 20 6e 65 77 46 6c 61 67 3e 3d 30    if( newFlag>=0
17290 20 29 7b 0a 20 20 20 20 70 2d 3e 70 42 74 2d 3e   ){.    p->pBt->
172a0 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53  btsFlags &= ~BTS
172b0 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a  _SECURE_DELETE;.
172c0 20 20 20 20 69 66 28 20 6e 65 77 46 6c 61 67 20      if( newFlag 
172d0 29 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61  ) p->pBt->btsFla
172e0 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45  gs |= BTS_SECURE
172f0 5f 44 45 4c 45 54 45 3b 0a 20 20 7d 20 0a 20 20  _DELETE;.  } .  
17300 62 20 3d 20 28 70 2d 3e 70 42 74 2d 3e 62 74 73  b = (p->pBt->bts
17310 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55  Flags & BTS_SECU
17320 52 45 5f 44 45 4c 45 54 45 29 21 3d 30 3b 0a 20  RE_DELETE)!=0;. 
17330 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
17340 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
17350 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  b;.}../*.** Chan
17360 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63  ge the 'auto-vac
17370 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20 6f 66  uum' property of
17380 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
17390 66 20 74 68 65 20 27 61 75 74 6f 56 61 63 75 75  f the 'autoVacuu
173a0 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  m'.** parameter 
173b0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
173c0 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f  n auto-vacuum mo
173d0 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 49  de is enabled. I
173e0 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73  f zero, it.** is
173f0 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65 20 64   disabled. The d
17400 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72  efault value for
17410 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d   the auto-vacuum
17420 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a   property is .**
17430 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
17440 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  he SQLITE_DEFAUL
17450 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d 61 63  T_AUTOVACUUM mac
17460 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ro..*/.int sqlit
17470 65 33 42 74 72 65 65 53 65 74 41 75 74 6f 56 61  e3BtreeSetAutoVa
17480 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c 20 69  cuum(Btree *p, i
17490 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a  nt autoVacuum){.
174a0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
174b0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
174c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
174d0 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20  ADONLY;.#else.  
174e0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
174f0 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63  p->pBt;.  int rc
17500 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
17510 75 38 20 61 76 20 3d 20 28 75 38 29 61 75 74 6f  u8 av = (u8)auto
17520 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74  Vacuum;..  sqlit
17530 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
17540 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73  .  if( (pBt->bts
17550 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41 47 45  Flags & BTS_PAGE
17560 53 49 5a 45 5f 46 49 58 45 44 29 21 3d 30 20 26  SIZE_FIXED)!=0 &
17570 26 20 28 61 76 20 3f 31 3a 30 29 21 3d 70 42 74  & (av ?1:0)!=pBt
17580 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
17590 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
175a0 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73  READONLY;.  }els
175b0 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f  e{.    pBt->auto
175c0 56 61 63 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30  Vacuum = av ?1:0
175d0 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56  ;.    pBt->incrV
175e0 61 63 75 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31  acuum = av==2 ?1
175f0 3a 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  :0;.  }.  sqlite
17600 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
17610 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e    return rc;.#en
17620 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  dif.}../*.** Ret
17630 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66  urn the value of
17640 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75   the 'auto-vacuu
17650 6d 27 20 70 72 6f 70 65 72 74 79 2e 20 49 66 20  m' property. If 
17660 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a  auto-vacuum is .
17670 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20 69 73 20  ** enabled 1 is 
17680 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
17690 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ise 0..*/.int sq
176a0 6c 69 74 65 33 42 74 72 65 65 47 65 74 41 75 74  lite3BtreeGetAut
176b0 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70  oVacuum(Btree *p
176c0 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
176d0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
176e0 0a 20 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f  .  return BTREE_
176f0 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b  AUTOVACUUM_NONE;
17700 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b  .#else.  int rc;
17710 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
17720 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20  nter(p);.  rc = 
17730 28 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e  (.    (!p->pBt->
17740 61 75 74 6f 56 61 63 75 75 6d 29 3f 42 54 52 45  autoVacuum)?BTRE
17750 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e  E_AUTOVACUUM_NON
17760 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d  E:.    (!p->pBt-
17770 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f 42 54 52  >incrVacuum)?BTR
17780 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46 55  EE_AUTOVACUUM_FU
17790 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f 41 55  LL:.    BTREE_AU
177a0 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20  TOVACUUM_INCR.  
177b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
177c0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
177d0 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d  urn rc;.#endif.}
177e0 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72  .../*.** Get a r
177f0 65 66 65 72 65 6e 63 65 20 74 6f 20 70 50 61 67  eference to pPag
17800 65 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  e1 of the databa
17810 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20 77  se file.  This w
17820 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75  ill.** also acqu
17830 69 72 65 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f  ire a readlock o
17840 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a  n that file..**.
17850 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
17860 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
17870 65 73 73 2e 20 20 49 66 20 74 68 65 20 66 69 6c  ess.  If the fil
17880 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65  e is not a.** we
17890 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61  ll-formed databa
178a0 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 53 51  se file, then SQ
178b0 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 73 20  LITE_CORRUPT is 
178c0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c  returned..** SQL
178d0 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
178e0 72 6e 65 64 20 69 66 20 74 68 65 20 64 61 74 61  rned if the data
178f0 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20  base is locked. 
17900 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a   SQLITE_NOMEM.**
17910 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
17920 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65  we run out of me
17930 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  mory. .*/.static
17940 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65 28 42   int lockBtree(B
17950 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
17960 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
17970 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
17980 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e  code from subfun
17990 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50  ctions */.  MemP
179a0 61 67 65 20 2a 70 50 61 67 65 31 3b 20 20 20 20  age *pPage1;    
179b0 20 2f 2a 20 50 61 67 65 20 31 20 6f 66 20 74 68   /* Page 1 of th
179c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
179d0 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20  */.  int nPage; 
179e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
179f0 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
17a00 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
17a10 20 20 69 6e 74 20 6e 50 61 67 65 46 69 6c 65 20    int nPageFile 
17a20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72  = 0;   /* Number
17a30 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
17a40 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
17a50 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 48 65 61  /.  int nPageHea
17a60 64 65 72 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  der;     /* Numb
17a70 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
17a80 68 65 20 64 61 74 61 62 61 73 65 20 61 63 63 6f  he database acco
17a90 72 64 69 6e 67 20 74 6f 20 68 64 72 20 2a 2f 0a  rding to hdr */.
17aa0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
17ab0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
17ac0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
17ad0 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
17ae0 65 31 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20  e1==0 );.  rc = 
17af0 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72  sqlite3PagerShar
17b00 65 64 4c 6f 63 6b 28 70 42 74 2d 3e 70 50 61 67  edLock(pBt->pPag
17b10 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  er);.  if( rc!=S
17b20 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
17b30 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 62 74 72  n rc;.  rc = btr
17b40 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31  eeGetPage(pBt, 1
17b50 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3b 0a 20  , &pPage1, 0);. 
17b60 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17b70 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
17b80 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68  .  /* Do some ch
17b90 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20 69  ecking to help i
17ba0 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65 20 77  nsure the file w
17bb0 65 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79 20  e opened really 
17bc0 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64 20  is.  ** a valid 
17bd0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a  database file. .
17be0 20 20 2a 2f 0a 20 20 6e 50 61 67 65 20 3d 20 6e    */.  nPage = n
17bf0 50 61 67 65 48 65 61 64 65 72 20 3d 20 67 65 74  PageHeader = get
17c00 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29 70 50  4byte(28+(u8*)pP
17c10 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20  age1->aData);.  
17c20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
17c30 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
17c40 72 2c 20 26 6e 50 61 67 65 46 69 6c 65 29 3b 0a  r, &nPageFile);.
17c50 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 7c    if( nPage==0 |
17c60 7c 20 6d 65 6d 63 6d 70 28 32 34 2b 28 75 38 2a  | memcmp(24+(u8*
17c70 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20  )pPage1->aData, 
17c80 39 32 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e  92+(u8*)pPage1->
17c90 61 44 61 74 61 2c 34 29 21 3d 30 20 29 7b 0a 20  aData,4)!=0 ){. 
17ca0 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65     nPage = nPage
17cb0 46 69 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  File;.  }.  if( 
17cc0 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 75  nPage>0 ){.    u
17cd0 33 32 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  32 pageSize;.   
17ce0 20 75 33 32 20 75 73 61 62 6c 65 53 69 7a 65 3b   u32 usableSize;
17cf0 0a 20 20 20 20 75 38 20 2a 70 61 67 65 31 20 3d  .    u8 *page1 =
17d00 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a   pPage1->aData;.
17d10 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
17d20 4e 4f 54 41 44 42 3b 0a 20 20 20 20 2f 2a 20 45  NOTADB;.    /* E
17d30 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33  VIDENCE-OF: R-43
17d40 37 33 37 2d 33 39 39 39 39 20 45 76 65 72 79 20  737-39999 Every 
17d50 76 61 6c 69 64 20 53 51 4c 69 74 65 20 64 61 74  valid SQLite dat
17d60 61 62 61 73 65 20 66 69 6c 65 20 62 65 67 69 6e  abase file begin
17d70 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68  s.    ** with th
17d80 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 31 36 20 62  e following 16 b
17d90 79 74 65 73 20 28 69 6e 20 68 65 78 29 3a 20 35  ytes (in hex): 5
17da0 33 20 35 31 20 34 63 20 36 39 20 37 34 20 36 35  3 51 4c 69 74 65
17db0 20 32 30 20 36 36 20 36 66 20 37 32 20 36 64 0a   20 66 6f 72 6d.
17dc0 20 20 20 20 2a 2a 20 36 31 20 37 34 20 32 30 20      ** 61 74 20 
17dd0 33 33 20 30 30 2e 20 2a 2f 0a 20 20 20 20 69 66  33 00. */.    if
17de0 28 20 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c 20  ( memcmp(page1, 
17df0 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 31 36  zMagicHeader, 16
17e00 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  )!=0 ){.      go
17e10 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
17e20 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  iled;.    }..#if
17e30 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17e40 57 41 4c 0a 20 20 20 20 69 66 28 20 70 61 67 65  WAL.    if( page
17e50 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20  1[18]>1 ){.     
17e60 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
17e70 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b  = BTS_READ_ONLY;
17e80 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
17e90 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20  age1[19]>1 ){.  
17ea0 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
17eb0 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
17ec0 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20  }.#else.    if( 
17ed0 70 61 67 65 31 5b 31 38 5d 3e 32 20 29 7b 0a 20  page1[18]>2 ){. 
17ee0 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61       pBt->btsFla
17ef0 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f  gs |= BTS_READ_O
17f00 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  NLY;.    }.    i
17f10 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 32 20 29  f( page1[19]>2 )
17f20 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
17f30 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
17f40 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
17f50 20 74 68 65 20 77 72 69 74 65 20 76 65 72 73 69   the write versi
17f60 6f 6e 20 69 73 20 73 65 74 20 74 6f 20 32 2c 20  on is set to 2, 
17f70 74 68 69 73 20 64 61 74 61 62 61 73 65 20 73 68  this database sh
17f80 6f 75 6c 64 20 62 65 20 61 63 63 65 73 73 65 64  ould be accessed
17f90 0a 20 20 20 20 2a 2a 20 69 6e 20 57 41 4c 20 6d  .    ** in WAL m
17fa0 6f 64 65 2e 20 49 66 20 74 68 65 20 6c 6f 67 20  ode. If the log 
17fb0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f  is not already o
17fc0 70 65 6e 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77  pen, open it now
17fd0 2e 20 54 68 65 6e 20 0a 20 20 20 20 2a 2a 20 72  . Then .    ** r
17fe0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
17ff0 61 6e 64 20 72 65 74 75 72 6e 20 77 69 74 68 6f  and return witho
18000 75 74 20 70 6f 70 75 6c 61 74 69 6e 67 20 42 74  ut populating Bt
18010 53 68 61 72 65 64 2e 70 50 61 67 65 31 2e 0a 20  Shared.pPage1.. 
18020 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72     ** The caller
18030 20 64 65 74 65 63 74 73 20 74 68 69 73 20 61 6e   detects this an
18040 64 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e  d calls this fun
18050 63 74 69 6f 6e 20 61 67 61 69 6e 2e 20 54 68 69  ction again. Thi
18060 73 20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71 75  s is.    ** requ
18070 69 72 65 64 20 61 73 20 74 68 65 20 76 65 72 73  ired as the vers
18080 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 63 75  ion of page 1 cu
18090 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70  rrently in the p
180a0 61 67 65 31 20 62 75 66 66 65 72 0a 20 20 20 20  age1 buffer.    
180b0 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 68  ** may not be th
180c0 65 20 6c 61 74 65 73 74 20 76 65 72 73 69 6f 6e  e latest version
180d0 20 2d 20 74 68 65 72 65 20 6d 61 79 20 62 65 20   - there may be 
180e0 61 20 6e 65 77 65 72 20 6f 6e 65 20 69 6e 20 74  a newer one in t
180f0 68 65 20 6c 6f 67 0a 20 20 20 20 2a 2a 20 66 69  he log.    ** fi
18100 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  le..    */.    i
18110 66 28 20 70 61 67 65 31 5b 31 39 5d 3d 3d 32 20  f( page1[19]==2 
18120 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  && (pBt->btsFlag
18130 73 20 26 20 42 54 53 5f 4e 4f 5f 57 41 4c 29 3d  s & BTS_NO_WAL)=
18140 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
18150 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20  isOpen = 0;.    
18160 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
18170 67 65 72 4f 70 65 6e 57 61 6c 28 70 42 74 2d 3e  gerOpenWal(pBt->
18180 70 50 61 67 65 72 2c 20 26 69 73 4f 70 65 6e 29  pPager, &isOpen)
18190 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
181a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
181b0 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
181c0 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
181d0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4f     }else if( isO
181e0 70 65 6e 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66  pen==0 ){.#ifdef
181f0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
18200 57 41 4c 5f 53 41 46 45 54 59 4c 45 56 45 4c 0a  WAL_SAFETYLEVEL.
18210 20 20 20 20 20 20 20 20 2f 2a 20 44 65 66 61 75          /* Defau
18220 6c 74 20 74 6f 20 73 70 65 63 69 66 69 65 64 20  lt to specified 
18230 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 66 6f 72  safety_level for
18240 20 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a 20 20 20   WAL mode */.   
18250 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 64 62       if( pBt->db
18260 21 3d 30 20 26 26 20 70 42 74 2d 3e 64 62 2d 3e  !=0 && pBt->db->
18270 61 44 62 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  aDb!=0 ){.      
18280 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20      int iDb;.   
18290 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a         sqlite3 *
182a0 64 62 20 3d 20 70 42 74 2d 3e 64 62 3b 0a 20 20  db = pBt->db;.  
182b0 20 20 20 20 20 20 20 20 44 62 20 2a 61 44 62 20          Db *aDb 
182c0 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 20 20 20  = db->aDb;.     
182d0 20 20 20 20 20 75 38 20 6c 65 76 65 6c 20 3d 20       u8 level = 
182e0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  0;.          for
182f0 28 69 44 62 3d 30 3b 20 69 44 62 3c 64 62 2d 3e  (iDb=0; iDb<db->
18300 6e 44 62 3b 20 69 44 62 2b 2b 29 7b 0a 20 20 20  nDb; iDb++){.   
18310 20 20 20 20 20 20 20 20 20 69 66 28 20 61 44 62           if( aDb
18320 5b 69 44 62 5d 2e 70 42 74 20 26 26 20 61 44 62  [iDb].pBt && aDb
18330 5b 69 44 62 5d 2e 70 42 74 2d 3e 70 42 74 3d 3d  [iDb].pBt->pBt==
18340 70 42 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  pBt ) break;.   
18350 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
18360 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 64     assert( iDb<d
18370 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 20 20  b->nDb );.      
18380 20 20 20 20 6c 65 76 65 6c 20 3d 20 64 62 2d 3e      level = db->
18390 61 44 62 5b 69 44 62 5d 2e 73 61 66 65 74 79 5f  aDb[iDb].safety_
183a0 6c 65 76 65 6c 3b 0a 20 20 20 20 20 20 20 20 20  level;.         
183b0 20 69 66 28 20 21 53 51 4c 49 54 45 5f 44 62 53   if( !SQLITE_DbS
183c0 61 66 65 74 79 4c 65 76 65 6c 49 73 46 69 78 65  afetyLevelIsFixe
183d0 64 28 6c 65 76 65 6c 29 20 26 26 20 0a 20 20 20  d(level) && .   
183e0 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54            (SQLIT
183f0 45 5f 44 62 53 61 66 65 74 79 4c 65 76 65 6c 56  E_DbSafetyLevelV
18400 61 6c 75 65 28 6c 65 76 65 6c 29 20 21 3d 20 53  alue(level) != S
18410 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41  QLITE_DEFAULT_WA
18420 4c 5f 53 41 46 45 54 59 4c 45 56 45 4c 29 20 29  L_SAFETYLEVEL) )
18430 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 44  {.            aD
18440 62 5b 69 44 62 5d 2e 73 61 66 65 74 79 5f 6c 65  b[iDb].safety_le
18450 76 65 6c 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  vel = SQLITE_DEF
18460 41 55 4c 54 5f 57 41 4c 5f 53 41 46 45 54 59 4c  AULT_WAL_SAFETYL
18470 45 56 45 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  EVEL;.          
18480 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
18490 74 53 61 66 65 74 79 4c 65 76 65 6c 28 70 42 74  tSafetyLevel(pBt
184a0 2d 3e 70 50 61 67 65 72 2c 20 53 51 4c 49 54 45  ->pPager, SQLITE
184b0 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53 41 46  _DEFAULT_WAL_SAF
184c0 45 54 59 4c 45 56 45 4c 2c 20 0a 20 20 20 20 20  ETYLEVEL, .     
184d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
184e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
184f0 20 20 28 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c    (db->flags&SQL
18500 49 54 45 5f 46 75 6c 6c 46 53 79 6e 63 29 21 3d  ITE_FullFSync)!=
18510 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
18520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18530 20 20 20 20 20 20 20 20 20 20 28 64 62 2d 3e 66            (db->f
18540 6c 61 67 73 26 53 51 4c 49 54 45 5f 43 6b 70 74  lags&SQLITE_Ckpt
18550 46 75 6c 6c 46 53 79 6e 63 29 21 3d 30 29 3b 0a  FullFSync)!=0);.
18560 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
18570 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
18580 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
18590 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20  (pPage1);.      
185a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
185b0 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
185c0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
185d0 54 41 44 42 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  TADB;.    }.#end
185e0 69 66 0a 0a 20 20 20 20 2f 2a 20 45 56 49 44 45  if..    /* EVIDE
185f0 4e 43 45 2d 4f 46 3a 20 52 2d 31 35 34 36 35 2d  NCE-OF: R-15465-
18600 32 30 38 31 33 20 54 68 65 20 6d 61 78 69 6d 75  20813 The maximu
18610 6d 20 61 6e 64 20 6d 69 6e 69 6d 75 6d 20 65 6d  m and minimum em
18620 62 65 64 64 65 64 20 70 61 79 6c 6f 61 64 0a 20  bedded payload. 
18630 20 20 20 2a 2a 20 66 72 61 63 74 69 6f 6e 73 20     ** fractions 
18640 61 6e 64 20 74 68 65 20 6c 65 61 66 20 70 61 79  and the leaf pay
18650 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e 20 76 61  load fraction va
18660 6c 75 65 73 20 6d 75 73 74 20 62 65 20 36 34 2c  lues must be 64,
18670 20 33 32 2c 20 61 6e 64 20 33 32 2e 0a 20 20 20   32, and 32..   
18680 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f   **.    ** The o
18690 72 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 61  riginal design a
186a0 6c 6c 6f 77 65 64 20 74 68 65 73 65 20 61 6d 6f  llowed these amo
186b0 75 6e 74 73 20 74 6f 20 76 61 72 79 2c 20 62 75  unts to vary, bu
186c0 74 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76  t as of.    ** v
186d0 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65  ersion 3.6.0, we
186e0 20 72 65 71 75 69 72 65 20 74 68 65 6d 20 74 6f   require them to
186f0 20 62 65 20 66 69 78 65 64 2e 0a 20 20 20 20 2a   be fixed..    *
18700 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70  /.    if( memcmp
18710 28 26 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31  (&page1[21], "\1
18720 30 30 5c 30 34 30 5c 30 34 30 22 2c 33 29 21 3d  00\040\040",3)!=
18730 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
18740 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
18750 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  d;.    }.    /* 
18760 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
18770 31 38 37 33 2d 33 39 36 31 38 20 54 68 65 20 70  1873-39618 The p
18780 61 67 65 20 73 69 7a 65 20 66 6f 72 20 61 20 64  age size for a d
18790 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a  atabase file is.
187a0 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65      ** determine
187b0 64 20 62 79 20 74 68 65 20 32 2d 62 79 74 65 20  d by the 2-byte 
187c0 69 6e 74 65 67 65 72 20 6c 6f 63 61 74 65 64 20  integer located 
187d0 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20  at an offset of 
187e0 31 36 20 62 79 74 65 73 20 66 72 6f 6d 0a 20 20  16 bytes from.  
187f0 20 20 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e 69    ** the beginni
18800 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ng of the databa
18810 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  se file. */.    
18820 70 61 67 65 53 69 7a 65 20 3d 20 28 70 61 67 65  pageSize = (page
18830 31 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 70 61 67  1[16]<<8) | (pag
18840 65 31 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20  e1[17]<<16);.   
18850 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
18860 20 52 2d 32 35 30 30 38 2d 32 31 36 38 38 20 54   R-25008-21688 T
18870 68 65 20 73 69 7a 65 20 6f 66 20 61 20 70 61 67  he size of a pag
18880 65 20 69 73 20 61 20 70 6f 77 65 72 20 6f 66 20  e is a power of 
18890 74 77 6f 0a 20 20 20 20 2a 2a 20 62 65 74 77 65  two.    ** betwe
188a0 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33 36  en 512 and 65536
188b0 20 69 6e 63 6c 75 73 69 76 65 2e 20 2a 2f 0a 20   inclusive. */. 
188c0 20 20 20 69 66 28 20 28 28 70 61 67 65 53 69 7a     if( ((pageSiz
188d0 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 21 3d  e-1)&pageSize)!=
188e0 30 0a 20 20 20 20 20 7c 7c 20 70 61 67 65 53 69  0.     || pageSi
188f0 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  ze>SQLITE_MAX_PA
18900 47 45 5f 53 49 5a 45 20 0a 20 20 20 20 20 7c 7c  GE_SIZE .     ||
18910 20 70 61 67 65 53 69 7a 65 3c 3d 32 35 36 20 0a   pageSize<=256 .
18920 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74      ){.      got
18930 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
18940 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  led;.    }.    a
18950 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65  ssert( (pageSize
18960 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20   & 7)==0 );.    
18970 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
18980 52 2d 35 39 33 31 30 2d 35 31 32 30 35 20 54 68  R-59310-51205 Th
18990 65 20 22 72 65 73 65 72 76 65 64 20 73 70 61 63  e "reserved spac
189a0 65 22 20 73 69 7a 65 20 69 6e 20 74 68 65 20 31  e" size in the 1
189b0 2d 62 79 74 65 0a 20 20 20 20 2a 2a 20 69 6e 74  -byte.    ** int
189c0 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 32  eger at offset 2
189d0 30 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  0 is the number 
189e0 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  of bytes of spac
189f0 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 0a  e at the end of.
18a00 20 20 20 20 2a 2a 20 65 61 63 68 20 70 61 67 65      ** each page
18a10 20 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20   to reserve for 
18a20 65 78 74 65 6e 73 69 6f 6e 73 2e 20 0a 20 20 20  extensions. .   
18a30 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 56 49 44 45   **.    ** EVIDE
18a40 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37 2d  NCE-OF: R-37497-
18a50 34 32 34 31 32 20 54 68 65 20 73 69 7a 65 20 6f  42412 The size o
18a60 66 20 74 68 65 20 72 65 73 65 72 76 65 64 20 72  f the reserved r
18a70 65 67 69 6f 6e 20 69 73 0a 20 20 20 20 2a 2a 20  egion is.    ** 
18a80 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
18a90 65 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69 67  e one-byte unsig
18aa0 6e 65 64 20 69 6e 74 65 67 65 72 20 66 6f 75 6e  ned integer foun
18ab0 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f  d at an offset o
18ac0 66 20 32 30 0a 20 20 20 20 2a 2a 20 69 6e 74 6f  f 20.    ** into
18ad0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
18ae0 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20  le header. */.  
18af0 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
18b00 61 67 65 53 69 7a 65 20 2d 20 70 61 67 65 31 5b  ageSize - page1[
18b10 32 30 5d 3b 0a 20 20 20 20 69 66 28 20 28 75 33  20];.    if( (u3
18b20 32 29 70 61 67 65 53 69 7a 65 21 3d 70 42 74 2d  2)pageSize!=pBt-
18b30 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20  >pageSize ){.   
18b40 20 20 20 2f 2a 20 41 66 74 65 72 20 72 65 61 64     /* After read
18b50 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61  ing the first pa
18b60 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
18b70 73 65 20 61 73 73 75 6d 69 6e 67 20 61 20 70 61  se assuming a pa
18b80 67 65 20 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a  ge size.      **
18b90 20 6f 66 20 42 74 53 68 61 72 65 64 2e 70 61 67   of BtShared.pag
18ba0 65 53 69 7a 65 2c 20 77 65 20 68 61 76 65 20 64  eSize, we have d
18bb0 69 73 63 6f 76 65 72 65 64 20 74 68 61 74 20 74  iscovered that t
18bc0 68 65 20 70 61 67 65 2d 73 69 7a 65 20 69 73 0a  he page-size is.
18bd0 20 20 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c        ** actuall
18be0 79 20 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c 6f  y pageSize. Unlo
18bf0 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ck the database,
18c00 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67   leave pBt->pPag
18c10 65 31 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 7a  e1 at.      ** z
18c20 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 53  ero and return S
18c30 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61  QLITE_OK. The ca
18c40 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 74  ller will call t
18c50 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20  his function.   
18c60 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68     ** again with
18c70 20 74 68 65 20 63 6f 72 72 65 63 74 20 70 61 67   the correct pag
18c80 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f  e-size..      */
18c90 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
18ca0 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20  ge(pPage1);.    
18cb0 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
18cc0 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  e = usableSize;.
18cd0 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53        pBt->pageS
18ce0 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a  ize = pageSize;.
18cf0 20 20 20 20 20 20 66 72 65 65 54 65 6d 70 53 70        freeTempSp
18d00 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ace(pBt);.      
18d10 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
18d20 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74  rSetPagesize(pBt
18d30 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e  ->pPager, &pBt->
18d40 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20  pageSize,.      
18d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d60 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67               pag
18d70 65 53 69 7a 65 2d 75 73 61 62 6c 65 53 69 7a 65  eSize-usableSize
18d80 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
18d90 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
18da0 28 20 28 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67  ( (pBt->db->flag
18db0 73 20 26 20 53 51 4c 49 54 45 5f 52 65 63 6f 76  s & SQLITE_Recov
18dc0 65 72 79 4d 6f 64 65 29 3d 3d 30 20 26 26 20 6e  eryMode)==0 && n
18dd0 50 61 67 65 3e 6e 50 61 67 65 46 69 6c 65 20 29  Page>nPageFile )
18de0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
18df0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
18e00 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  ;.      goto pag
18e10 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
18e20 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49      }.    /* EVI
18e30 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 33 31  DENCE-OF: R-2831
18e40 32 2d 36 34 37 30 34 20 48 6f 77 65 76 65 72 2c  2-64704 However,
18e50 20 74 68 65 20 75 73 61 62 6c 65 20 73 69 7a 65   the usable size
18e60 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20   is not allowed 
18e70 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6c 65 73  to.    ** be les
18e80 73 20 74 68 61 6e 20 34 38 30 2e 20 49 6e 20 6f  s than 480. In o
18e90 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74  ther words, if t
18ea0 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
18eb0 35 31 32 2c 20 74 68 65 6e 20 74 68 65 0a 20 20  512, then the.  
18ec0 20 20 2a 2a 20 72 65 73 65 72 76 65 64 20 73 70    ** reserved sp
18ed0 61 63 65 20 73 69 7a 65 20 63 61 6e 6e 6f 74 20  ace size cannot 
18ee0 65 78 63 65 65 64 20 33 32 2e 20 2a 2f 0a 20 20  exceed 32. */.  
18ef0 20 20 69 66 28 20 75 73 61 62 6c 65 53 69 7a 65    if( usableSize
18f00 3c 34 38 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  <480 ){.      go
18f10 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
18f20 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
18f30 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
18f40 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 42  pageSize;.    pB
18f50 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
18f60 75 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e  usableSize;.#ifn
18f70 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
18f80 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70  AUTOVACUUM.    p
18f90 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
18fa0 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65   (get4byte(&page
18fb0 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30  1[36 + 4*4])?1:0
18fc0 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72  );.    pBt->incr
18fd0 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
18fe0 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37  te(&page1[36 + 7
18ff0 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69  *4])?1:0);.#endi
19000 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c  f.  }..  /* maxL
19010 6f 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69  ocal is the maxi
19020 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61  mum amount of pa
19030 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c  yload to store l
19040 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20  ocally for.  ** 
19050 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75  a cell.  Make su
19060 72 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65  re it is small e
19070 6e 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61 74  nough so that at
19080 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74   least minFanout
19090 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20  .  ** cells can 
190a0 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20  will fit on one 
190b0 70 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65  page.  We assume
190c0 20 61 20 31 30 2d 62 79 74 65 20 70 61 67 65 20   a 10-byte page 
190d0 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73  header..  ** Bes
190e0 69 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64  ides the payload
190f0 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20  , the cell must 
19100 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20  store:.  **     
19110 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74  2-byte pointer t
19120 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20  o the cell.  ** 
19130 20 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64      4-byte child
19140 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20   pointer.  **   
19150 20 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61    9-byte nKey va
19160 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62  lue.  **     4-b
19170 79 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a  yte nData value.
19180 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20    **     4-byte 
19190 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f  overflow page po
191a0 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20  inter.  ** So a 
191b0 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66  cell consists of
191c0 20 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65   a 2-byte pointe
191d0 72 2c 20 61 20 68 65 61 64 65 72 20 77 68 69 63  r, a header whic
191e0 68 20 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a  h is as much as.
191f0 20 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f    ** 17 bytes lo
19200 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73  ng, 0 to N bytes
19210 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64   of payload, and
19220 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62   an optional 4 b
19230 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a  yte overflow.  *
19240 2a 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a  * page pointer..
19250 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c    */.  pBt->maxL
19260 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42  ocal = (u16)((pB
19270 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32  t->usableSize-12
19280 29 2a 36 34 2f 32 35 35 20 2d 20 32 33 29 3b 0a  )*64/255 - 23);.
19290 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20    pBt->minLocal 
192a0 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73  = (u16)((pBt->us
192b0 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f  ableSize-12)*32/
192c0 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74  255 - 23);.  pBt
192d0 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 28 75 31 36  ->maxLeaf = (u16
192e0 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  )(pBt->usableSiz
192f0 65 20 2d 20 33 35 29 3b 0a 20 20 70 42 74 2d 3e  e - 35);.  pBt->
19300 6d 69 6e 4c 65 61 66 20 3d 20 28 75 31 36 29 28  minLeaf = (u16)(
19310 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
19320 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33  -12)*32/255 - 23
19330 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6d 61  );.  if( pBt->ma
19340 78 4c 6f 63 61 6c 3e 31 32 37 20 29 7b 0a 20 20  xLocal>127 ){.  
19350 20 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50    pBt->max1byteP
19360 61 79 6c 6f 61 64 20 3d 20 31 32 37 3b 0a 20 20  ayload = 127;.  
19370 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e  }else{.    pBt->
19380 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20  max1bytePayload 
19390 3d 20 28 75 38 29 70 42 74 2d 3e 6d 61 78 4c 6f  = (u8)pBt->maxLo
193a0 63 61 6c 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  cal;.  }.  asser
193b0 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20  t( pBt->maxLeaf 
193c0 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f  + 23 <= MX_CELL_
193d0 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 70  SIZE(pBt) );.  p
193e0 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 70 50 61  Bt->pPage1 = pPa
193f0 67 65 31 3b 0a 20 20 70 42 74 2d 3e 6e 50 61 67  ge1;.  pBt->nPag
19400 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74  e = nPage;.  ret
19410 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
19420 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
19430 64 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  d:.  releasePage
19440 28 70 50 61 67 65 31 29 3b 0a 20 20 70 42 74 2d  (pPage1);.  pBt-
19450 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 72  >pPage1 = 0;.  r
19460 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
19470 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a  ndef NDEBUG./*.*
19480 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
19490 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 6f  ber of cursors o
194a0 70 65 6e 20 6f 6e 20 70 42 74 2e 20 54 68 69 73  pen on pBt. This
194b0 20 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69   is for use.** i
194c0 6e 20 61 73 73 65 72 74 28 29 20 65 78 70 72 65  n assert() expre
194d0 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73  ssions, so it is
194e0 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69   only compiled i
194f0 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 0a  f NDEBUG is not.
19500 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a  ** defined..**.*
19510 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20 63 75 72  * Only write cur
19520 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74 65 64  sors are counted
19530 20 69 66 20 77 72 4f 6e 6c 79 20 69 73 20 74 72   if wrOnly is tr
19540 75 65 2e 20 20 49 66 20 77 72 4f 6e 6c 79 20 69  ue.  If wrOnly i
19550 73 0a 2a 2a 20 66 61 6c 73 65 20 74 68 65 6e 20  s.** false then 
19560 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65 20  all cursors are 
19570 63 6f 75 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 46  counted..**.** F
19580 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20  or the purposes 
19590 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  of this routine,
195a0 20 61 20 63 75 72 73 6f 72 20 69 73 20 61 6e 79   a cursor is any
195b0 20 63 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20   cursor that.** 
195c0 69 73 20 63 61 70 61 62 6c 65 20 6f 66 20 72 65  is capable of re
195d0 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
195e0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
195f0 2e 20 20 43 75 72 73 6f 72 73 20 74 68 61 74 0a  .  Cursors that.
19600 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 74 72 69  ** have been tri
19610 70 70 65 64 20 69 6e 74 6f 20 74 68 65 20 43 55  pped into the CU
19620 52 53 4f 52 5f 46 41 55 4c 54 20 73 74 61 74 65  RSOR_FAULT state
19630 20 61 72 65 20 6e 6f 74 20 63 6f 75 6e 74 65 64   are not counted
19640 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
19650 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72  countValidCursor
19660 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  s(BtShared *pBt,
19670 20 69 6e 74 20 77 72 4f 6e 6c 79 29 7b 0a 20 20   int wrOnly){.  
19680 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
19690 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66    int r = 0;.  f
196a0 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75  or(pCur=pBt->pCu
196b0 72 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72  rsor; pCur; pCur
196c0 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pCur->pNext){. 
196d0 20 20 20 69 66 28 20 28 77 72 4f 6e 6c 79 3d 3d     if( (wrOnly==
196e0 30 20 7c 7c 20 28 70 43 75 72 2d 3e 63 75 72 46  0 || (pCur->curF
196f0 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72 69 74  lags & BTCF_Writ
19700 65 46 6c 61 67 29 21 3d 30 29 0a 20 20 20 20 20  eFlag)!=0).     
19710 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  && pCur->eState!
19720 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 20  =CURSOR_FAULT ) 
19730 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75  r++; .  }.  retu
19740 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn r;.}.#endif..
19750 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61  /*.** If there a
19760 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  re no outstandin
19770 67 20 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65  g cursors and we
19780 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20   are not in the 
19790 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74  middle.** of a t
197a0 72 61 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74  ransaction but t
197b0 68 65 72 65 20 69 73 20 61 20 72 65 61 64 20 6c  here is a read l
197c0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
197d0 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69  ase, then.** thi
197e0 73 20 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73  s routine unrefs
197f0 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
19800 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
19810 66 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68  file which .** h
19820 61 73 20 74 68 65 20 65 66 66 65 63 74 20 6f 66  as the effect of
19830 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72   releasing the r
19840 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ead lock..**.** 
19850 49 66 20 74 68 65 72 65 20 69 73 20 61 20 74 72  If there is a tr
19860 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f  ansaction in pro
19870 67 72 65 73 73 2c 20 74 68 69 73 20 72 6f 75 74  gress, this rout
19880 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
19890 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
198a0 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
198b0 65 64 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ed(BtShared *pBt
198c0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
198d0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
198e0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
198f0 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 56 61   assert( countVa
19900 6c 69 64 43 75 72 73 6f 72 73 28 70 42 74 2c 30  lidCursors(pBt,0
19910 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 69 6e 54  )==0 || pBt->inT
19920 72 61 6e 73 61 63 74 69 6f 6e 3e 54 52 41 4e 53  ransaction>TRANS
19930 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 70  _NONE );.  if( p
19940 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
19950 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26  n==TRANS_NONE &&
19960 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20   pBt->pPage1!=0 
19970 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  ){.    MemPage *
19980 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50  pPage1 = pBt->pP
19990 61 67 65 31 3b 0a 20 20 20 20 61 73 73 65 72 74  age1;.    assert
199a0 28 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  ( pPage1->aData 
199b0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
199c0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
199d0 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
199e0 3d 3d 31 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ==1 );.    pBt->
199f0 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20  pPage1 = 0;.    
19a00 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75  releasePageNotNu
19a10 6c 6c 28 70 50 61 67 65 31 29 3b 0a 20 20 7d 0a  ll(pPage1);.  }.
19a20 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42 74 20  }../*.** If pBt 
19a30 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6d 70  points to an emp
19a40 74 79 20 66 69 6c 65 20 74 68 65 6e 20 63 6f 6e  ty file then con
19a50 76 65 72 74 20 74 68 61 74 20 65 6d 70 74 79 20  vert that empty 
19a60 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e  file.** into a n
19a70 65 77 20 65 6d 70 74 79 20 64 61 74 61 62 61 73  ew empty databas
19a80 65 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e  e by initializin
19a90 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  g the first page
19aa0 20 6f 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62   of.** the datab
19ab0 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ase..*/.static i
19ac0 6e 74 20 6e 65 77 44 61 74 61 62 61 73 65 28 42  nt newDatabase(B
19ad0 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
19ae0 20 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20   MemPage *pP1;. 
19af0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
19b00 64 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  data;.  int rc;.
19b10 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
19b20 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
19b30 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
19b40 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20  f( pBt->nPage>0 
19b50 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
19b60 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
19b70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  P1 = pBt->pPage1
19b80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 31 21  ;.  assert( pP1!
19b90 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70  =0 );.  data = p
19ba0 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20  P1->aData;.  rc 
19bb0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
19bc0 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61 67 65  ite(pP1->pDbPage
19bd0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
19be0 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70  turn rc;.  memcp
19bf0 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63 48 65  y(data, zMagicHe
19c00 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61  ader, sizeof(zMa
19c10 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20 20 61  gicHeader));.  a
19c20 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d  ssert( sizeof(zM
19c30 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31 36 20  agicHeader)==16 
19c40 29 3b 0a 20 20 64 61 74 61 5b 31 36 5d 20 3d 20  );.  data[16] = 
19c50 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53  (u8)((pBt->pageS
19c60 69 7a 65 3e 3e 38 29 26 30 78 66 66 29 3b 0a 20  ize>>8)&0xff);. 
19c70 20 64 61 74 61 5b 31 37 5d 20 3d 20 28 75 38 29   data[17] = (u8)
19c80 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  ((pBt->pageSize>
19c90 3e 31 36 29 26 30 78 66 66 29 3b 0a 20 20 64 61  >16)&0xff);.  da
19ca0 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61  ta[18] = 1;.  da
19cb0 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73  ta[19] = 1;.  as
19cc0 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c  sert( pBt->usabl
19cd0 65 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65  eSize<=pBt->page
19ce0 53 69 7a 65 20 26 26 20 70 42 74 2d 3e 75 73 61  Size && pBt->usa
19cf0 62 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74  bleSize+255>=pBt
19d00 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64  ->pageSize);.  d
19d10 61 74 61 5b 32 30 5d 20 3d 20 28 75 38 29 28 70  ata[20] = (u8)(p
19d20 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70  Bt->pageSize - p
19d30 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b  Bt->usableSize);
19d40 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d 20 36 34  .  data[21] = 64
19d50 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 33  ;.  data[22] = 3
19d60 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20  2;.  data[23] = 
19d70 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61  32;.  memset(&da
19d80 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32  ta[24], 0, 100-2
19d90 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70  4);.  zeroPage(p
19da0 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50  P1, PTF_INTKEY|P
19db0 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46  TF_LEAF|PTF_LEAF
19dc0 44 41 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 62  DATA );.  pBt->b
19dd0 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50  tsFlags |= BTS_P
19de0 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23  AGESIZE_FIXED;.#
19df0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
19e00 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
19e10 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74  assert( pBt->aut
19e20 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42  oVacuum==1 || pB
19e30 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30  t->autoVacuum==0
19e40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
19e50 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31  t->incrVacuum==1
19e60 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63   || pBt->incrVac
19e70 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34  uum==0 );.  put4
19e80 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20  byte(&data[36 + 
19e90 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56  4*4], pBt->autoV
19ea0 61 63 75 75 6d 29 3b 0a 20 20 70 75 74 34 62 79  acuum);.  put4by
19eb0 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 37 2a  te(&data[36 + 7*
19ec0 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63  4], pBt->incrVac
19ed0 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70  uum);.#endif.  p
19ee0 42 74 2d 3e 6e 50 61 67 65 20 3d 20 31 3b 0a 20  Bt->nPage = 1;. 
19ef0 20 64 61 74 61 5b 33 31 5d 20 3d 20 31 3b 0a 20   data[31] = 1;. 
19f00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19f10 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  K;.}../*.** Init
19f20 69 61 6c 69 7a 65 20 74 68 65 20 66 69 72 73 74  ialize the first
19f30 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
19f40 61 62 61 73 65 20 66 69 6c 65 20 28 63 72 65 61  abase file (crea
19f50 74 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 0a  ting a database.
19f60 2a 2a 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66  ** consisting of
19f70 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 61   a single page a
19f80 6e 64 20 6e 6f 20 73 63 68 65 6d 61 20 6f 62 6a  nd no schema obj
19f90 65 63 74 73 29 2e 20 52 65 74 75 72 6e 20 53 51  ects). Return SQ
19fa0 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75  LITE_OK.** if su
19fb0 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20  ccessful, or an 
19fc0 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
19fd0 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
19fe0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
19ff0 4e 65 77 44 62 28 42 74 72 65 65 20 2a 70 29 7b  NewDb(Btree *p){
1a000 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
1a010 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1a020 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 6e 50 61  );.  p->pBt->nPa
1a030 67 65 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6e  ge = 0;.  rc = n
1a040 65 77 44 61 74 61 62 61 73 65 28 70 2d 3e 70 42  ewDatabase(p->pB
1a050 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  t);.  sqlite3Btr
1a060 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
1a070 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1a080 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61  * Attempt to sta
1a090 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  rt a new transac
1a0a0 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72  tion. A write-tr
1a0b0 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
1a0c0 73 74 61 72 74 65 64 20 69 66 20 74 68 65 20 73  started if the s
1a0d0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
1a0e0 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72  s nonzero, other
1a0f0 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20  wise a read-.** 
1a100 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66  transaction.  If
1a110 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
1a120 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72  ment is 2 or mor
1a130 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a  e and exclusive.
1a140 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
1a150 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69  s started, meani
1a160 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ng that no other
1a170 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f   process is allo
1a180 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73  wed.** to access
1a190 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
1a1a0 41 20 70 72 65 65 78 69 73 74 69 6e 67 20 74 72  A preexisting tr
1a1b0 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f  ansaction may no
1a1c0 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64  t be.** upgraded
1a1d0 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79   to exclusive by
1a1e0 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
1a1f0 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74  utine a second t
1a200 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63  ime - the.** exc
1a210 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e  lusivity flag on
1a220 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e  ly works for a n
1a230 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ew transaction..
1a240 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72  **.** A write-tr
1a250 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
1a260 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65  e started before
1a270 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20   attempting any 
1a280 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74  .** changes to t
1a290 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f  he database.  No
1a2a0 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ne of the follow
1a2b0 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a  ing routines .**
1a2c0 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73   will work unles
1a2d0 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
1a2e0 69 73 20 73 74 61 72 74 65 64 20 66 69 72 73 74  is started first
1a2f0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c  :.**.**      sql
1a300 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54  ite3BtreeCreateT
1a310 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
1a320 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
1a330 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20  eIndex().**     
1a340 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
1a350 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  arTable().**    
1a360 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72    sqlite3BtreeDr
1a370 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  opTable().**    
1a380 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e    sqlite3BtreeIn
1a390 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73  sert().**      s
1a3a0 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74  qlite3BtreeDelet
1a3b0 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
1a3c0 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65  te3BtreeUpdateMe
1a3d0 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ta().**.** If an
1a3e0 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74   initial attempt
1a3f0 20 74 6f 20 61 63 71 75 69 72 65 20 74 68 65 20   to acquire the 
1a400 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75  lock fails becau
1a410 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65  se of lock conte
1a420 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65  ntion.** and the
1a430 20 64 61 74 61 62 61 73 65 20 77 61 73 20 70 72   database was pr
1a440 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65  eviously unlocke
1a450 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74  d, then invoke t
1a460 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a  he busy handler.
1a470 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ** if there is o
1a480 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68 65 72  ne.  But if ther
1a490 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  e was previously
1a4a0 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f   a read-lock, do
1a4b0 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74   not.** invoke t
1a4c0 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
1a4d0 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51  - just return SQ
1a4e0 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49  LITE_BUSY.  SQLI
1a4f0 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72  TE_BUSY is .** r
1a500 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65  eturned when the
1a510 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
1a520 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64  read-lock in ord
1a530 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65  er to avoid a de
1a540 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75  adlock..**.** Su
1a550 70 70 6f 73 65 20 74 68 65 72 65 20 61 72 65 20  ppose there are 
1a560 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20  two processes A 
1a570 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20 61 20  and B.  A has a 
1a580 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20  read lock and B 
1a590 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65  has.** a reserve
1a5a0 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73  d lock.  B tries
1a5b0 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65   to promote to e
1a5c0 78 63 6c 75 73 69 76 65 20 62 75 74 20 69 73 20  xclusive but is 
1a5d0 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a  blocked because.
1a5e0 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c  ** of A's read l
1a5f0 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f  ock.  A tries to
1a600 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65   promote to rese
1a610 72 76 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63  rved but is bloc
1a620 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65  ked by B..** One
1a630 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66   or the other of
1a640 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73   the two process
1a650 65 73 20 6d 75 73 74 20 67 69 76 65 20 77 61 79  es must give way
1a660 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20 62 65   or there can be
1a670 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e  .** no progress.
1a680 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53    By returning S
1a690 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e  QLITE_BUSY and n
1a6a0 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20  ot invoking the 
1a6b0 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a  busy callback.**
1a6c0 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20   when A already 
1a6d0 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c  has a read lock,
1a6e0 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20   we encourage A 
1a6f0 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c  to give up and l
1a700 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e  et B.** proceed.
1a710 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1a720 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42  treeBeginTrans(B
1a730 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66  tree *p, int wrf
1a740 6c 61 67 29 7b 0a 20 20 42 74 53 68 61 72 65 64  lag){.  BtShared
1a750 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
1a760 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1a770 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74 65 33  E_OK;..  sqlite3
1a780 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
1a790 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
1a7a0 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
1a7b0 20 62 74 72 65 65 20 69 73 20 61 6c 72 65 61 64   btree is alread
1a7c0 79 20 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61  y in a write-tra
1a7d0 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a  nsaction, or it.
1a7e0 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20    ** is already 
1a7f0 69 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  in a read-transa
1a800 63 74 69 6f 6e 20 61 6e 64 20 61 20 72 65 61 64  ction and a read
1a810 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a  -transaction.  *
1a820 2a 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  * is requested, 
1a830 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  this is a no-op.
1a840 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69  .  */.  if( p->i
1a850 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
1a860 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61  ITE || (p->inTra
1a870 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 26  ns==TRANS_READ &
1a880 26 20 21 77 72 66 6c 61 67 29 20 29 7b 0a 20 20  & !wrflag) ){.  
1a890 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67    goto trans_beg
1a8a0 75 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  un;.  }.  assert
1a8b0 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
1a8c0 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
1a8d0 45 20 7c 7c 20 49 66 4e 6f 74 4f 6d 69 74 41 56  E || IfNotOmitAV
1a8e0 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74  (pBt->bDoTruncat
1a8f0 65 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57  e)==0 );..  /* W
1a900 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
1a910 73 20 61 72 65 20 6e 6f 74 20 70 6f 73 73 69 62  s are not possib
1a920 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c  le on a read-onl
1a930 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  y database */.  
1a940 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61  if( (pBt->btsFla
1a950 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e  gs & BTS_READ_ON
1a960 4c 59 29 21 3d 30 20 26 26 20 77 72 66 6c 61 67  LY)!=0 && wrflag
1a970 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
1a980 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
1a990 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67    goto trans_beg
1a9a0 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  un;.  }..#ifndef
1a9b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
1a9c0 52 45 44 5f 43 41 43 48 45 0a 20 20 7b 0a 20 20  RED_CACHE.  {.  
1a9d0 20 20 73 71 6c 69 74 65 33 20 2a 70 42 6c 6f 63    sqlite3 *pBloc
1a9e0 6b 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 49 66  k = 0;.    /* If
1a9f0 20 61 6e 6f 74 68 65 72 20 64 61 74 61 62 61 73   another databas
1aa00 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6c 72  e handle has alr
1aa10 65 61 64 79 20 6f 70 65 6e 65 64 20 61 20 77 72  eady opened a wr
1aa20 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
1aa30 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20  .    ** on this 
1aa40 73 68 61 72 65 64 2d 62 74 72 65 65 20 73 74 72  shared-btree str
1aa50 75 63 74 75 72 65 20 61 6e 64 20 61 20 73 65 63  ucture and a sec
1aa60 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e 73 61  ond write transa
1aa70 63 74 69 6f 6e 20 69 73 0a 20 20 20 20 2a 2a 20  ction is.    ** 
1aa80 72 65 71 75 65 73 74 65 64 2c 20 72 65 74 75 72  requested, retur
1aa90 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e  n SQLITE_LOCKED.
1aaa0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1aab0 28 77 72 66 6c 61 67 20 26 26 20 70 42 74 2d 3e  (wrflag && pBt->
1aac0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
1aad0 52 41 4e 53 5f 57 52 49 54 45 29 0a 20 20 20 20  RANS_WRITE).    
1aae0 20 7c 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c 61   || (pBt->btsFla
1aaf0 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47  gs & BTS_PENDING
1ab00 29 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20  )!=0.    ){.    
1ab10 20 20 70 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e    pBlock = pBt->
1ab20 70 57 72 69 74 65 72 2d 3e 64 62 3b 0a 20 20 20  pWriter->db;.   
1ab30 20 7d 65 6c 73 65 20 69 66 28 20 77 72 66 6c 61   }else if( wrfla
1ab40 67 3e 31 20 29 7b 0a 20 20 20 20 20 20 42 74 4c  g>1 ){.      BtL
1ab50 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20 20  ock *pIter;.    
1ab60 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d    for(pIter=pBt-
1ab70 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70  >pLock; pIter; p
1ab80 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78  Iter=pIter->pNex
1ab90 74 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t){.        if( 
1aba0 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70  pIter->pBtree!=p
1abb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 42   ){.          pB
1abc0 6c 6f 63 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42  lock = pIter->pB
1abd0 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20  tree->db;.      
1abe0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1abf0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1ac00 20 7d 0a 20 20 20 20 69 66 28 20 70 42 6c 6f 63   }.    if( pBloc
1ac10 6b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  k ){.      sqlit
1ac20 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63  e3ConnectionBloc
1ac30 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63  ked(p->db, pBloc
1ac40 6b 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  k);.      rc = S
1ac50 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
1ac60 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20 20 20  REDCACHE;.      
1ac70 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
1ac80 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
1ac90 69 66 0a 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61  if..  /* Any rea
1aca0 64 2d 6f 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77  d-only or read-w
1acb0 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
1acc0 20 69 6d 70 6c 69 65 73 20 61 20 72 65 61 64 2d   implies a read-
1acd0 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61  lock on .  ** pa
1ace0 67 65 20 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65  ge 1. So if some
1acf0 20 6f 74 68 65 72 20 73 68 61 72 65 64 2d 63 61   other shared-ca
1ad00 63 68 65 20 63 6c 69 65 6e 74 20 61 6c 72 65 61  che client alrea
1ad10 64 79 20 68 61 73 20 61 20 77 72 69 74 65 2d 6c  dy has a write-l
1ad20 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67  ock .  ** on pag
1ad30 65 20 31 2c 20 74 68 65 20 74 72 61 6e 73 61 63  e 1, the transac
1ad40 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f  tion cannot be o
1ad50 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 72 63 20 3d  pened. */.  rc =
1ad60 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68   querySharedCach
1ad70 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41  eTableLock(p, MA
1ad80 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f  STER_ROOT, READ_
1ad90 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 53 51 4c  LOCK);.  if( SQL
1ada0 49 54 45 5f 4f 4b 21 3d 72 63 20 29 20 67 6f 74  ITE_OK!=rc ) got
1adb0 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a  o trans_begun;..
1adc0 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
1add0 26 3d 20 7e 42 54 53 5f 49 4e 49 54 49 41 4c 4c  &= ~BTS_INITIALL
1ade0 59 5f 45 4d 50 54 59 3b 0a 20 20 69 66 28 20 70  Y_EMPTY;.  if( p
1adf0 42 74 2d 3e 6e 50 61 67 65 3d 3d 30 20 29 20 70  Bt->nPage==0 ) p
1ae00 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
1ae10 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d  BTS_INITIALLY_EM
1ae20 50 54 59 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20  PTY;.  do {.    
1ae30 2f 2a 20 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65  /* Call lockBtre
1ae40 65 28 29 20 75 6e 74 69 6c 20 65 69 74 68 65 72  e() until either
1ae50 20 70 42 74 2d 3e 70 50 61 67 65 31 20 69 73 20   pBt->pPage1 is 
1ae60 70 6f 70 75 6c 61 74 65 64 20 6f 72 0a 20 20 20  populated or.   
1ae70 20 2a 2a 20 6c 6f 63 6b 42 74 72 65 65 28 29 20   ** lockBtree() 
1ae80 72 65 74 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e  returns somethin
1ae90 67 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c  g other than SQL
1aea0 49 54 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65  ITE_OK. lockBtre
1aeb0 65 28 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72  e().    ** may r
1aec0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
1aed0 62 75 74 20 6c 65 61 76 65 20 70 42 74 2d 3e 70  but leave pBt->p
1aee0 50 61 67 65 31 20 73 65 74 20 74 6f 20 30 20 69  Page1 set to 0 i
1aef0 66 20 61 66 74 65 72 0a 20 20 20 20 2a 2a 20 72  f after.    ** r
1af00 65 61 64 69 6e 67 20 70 61 67 65 20 31 20 69 74  eading page 1 it
1af10 20 64 69 73 63 6f 76 65 72 73 20 74 68 61 74 20   discovers that 
1af20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66  the page-size of
1af30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20   the database . 
1af40 20 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f     ** file is no
1af50 74 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e  t pBt->pageSize.
1af60 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6c 6f   In this case lo
1af70 63 6b 42 74 72 65 65 28 29 20 77 69 6c 6c 20 75  ckBtree() will u
1af80 70 64 61 74 65 0a 20 20 20 20 2a 2a 20 70 42 74  pdate.    ** pBt
1af90 2d 3e 70 61 67 65 53 69 7a 65 20 74 6f 20 74 68  ->pageSize to th
1afa0 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74  e page-size of t
1afb0 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  he file on disk.
1afc0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c  .    */.    whil
1afd0 65 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d  e( pBt->pPage1==
1afe0 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d  0 && SQLITE_OK==
1aff0 28 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28  (rc = lockBtree(
1b000 70 42 74 29 29 20 29 3b 0a 0a 20 20 20 20 69 66  pBt)) );..    if
1b010 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1b020 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  && wrflag ){.   
1b030 20 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73     if( (pBt->bts
1b040 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44  Flags & BTS_READ
1b050 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20  _ONLY)!=0 ){.   
1b060 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1b070 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20  _READONLY;.     
1b080 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1b090 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1b0a0 72 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67  rBegin(pBt->pPag
1b0b0 65 72 2c 77 72 66 6c 61 67 3e 31 2c 73 71 6c 69  er,wrflag>1,sqli
1b0c0 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28  te3TempInMemory(
1b0d0 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20  p->db));.       
1b0e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1b0f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1b100 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65  rc = newDatabase
1b110 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  (pBt);.        }
1b120 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1b130 20 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51   .    if( rc!=SQ
1b140 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1b150 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
1b160 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 7d  used(pBt);.    }
1b170 0a 20 20 7d 77 68 69 6c 65 28 20 28 72 63 26 30  .  }while( (rc&0
1b180 78 46 46 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53  xFF)==SQLITE_BUS
1b190 59 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e  Y && pBt->inTran
1b1a0 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e  saction==TRANS_N
1b1b0 4f 4e 45 20 26 26 0a 20 20 20 20 20 20 20 20 20  ONE &&.         
1b1c0 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79   btreeInvokeBusy
1b1d0 48 61 6e 64 6c 65 72 28 70 42 74 29 20 29 3b 0a  Handler(pBt) );.
1b1e0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1b1f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
1b200 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
1b210 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  S_NONE ){.      
1b220 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
1b230 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  n++;.#ifndef SQL
1b240 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
1b250 43 41 43 48 45 0a 20 20 20 20 20 20 69 66 28 20  CACHE.      if( 
1b260 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
1b270 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1b280 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 3d 3d 70  ->lock.pBtree==p
1b290 20 26 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62   && p->lock.iTab
1b2a0 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20  le==1 );.       
1b2b0 20 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d   p->lock.eLock =
1b2c0 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20   READ_LOCK;.    
1b2d0 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78      p->lock.pNex
1b2e0 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a  t = pBt->pLock;.
1b2f0 20 20 20 20 20 20 20 20 70 42 74 2d 3e 70 4c 6f          pBt->pLo
1b300 63 6b 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20  ck = &p->lock;. 
1b310 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
1b320 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61    }.    p->inTra
1b330 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41  ns = (wrflag?TRA
1b340 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52  NS_WRITE:TRANS_R
1b350 45 41 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  EAD);.    if( p-
1b360 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e  >inTrans>pBt->in
1b370 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20  Transaction ){. 
1b380 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e       pBt->inTran
1b390 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54  saction = p->inT
1b3a0 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rans;.    }.    
1b3b0 69 66 28 20 77 72 66 6c 61 67 20 29 7b 0a 20 20  if( wrflag ){.  
1b3c0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
1b3d0 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
1b3e0 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  1;.#ifndef SQLIT
1b3f0 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
1b400 43 48 45 0a 20 20 20 20 20 20 61 73 73 65 72 74  CHE.      assert
1b410 28 20 21 70 42 74 2d 3e 70 57 72 69 74 65 72 20  ( !pBt->pWriter 
1b420 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 57  );.      pBt->pW
1b430 72 69 74 65 72 20 3d 20 70 3b 0a 20 20 20 20 20  riter = p;.     
1b440 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
1b450 3d 20 7e 42 54 53 5f 45 58 43 4c 55 53 49 56 45  = ~BTS_EXCLUSIVE
1b460 3b 0a 20 20 20 20 20 20 69 66 28 20 77 72 66 6c  ;.      if( wrfl
1b470 61 67 3e 31 20 29 20 70 42 74 2d 3e 62 74 73 46  ag>1 ) pBt->btsF
1b480 6c 61 67 73 20 7c 3d 20 42 54 53 5f 45 58 43 4c  lags |= BTS_EXCL
1b490 55 53 49 56 45 3b 0a 23 65 6e 64 69 66 0a 0a 20  USIVE;.#endif.. 
1b4a0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64       /* If the d
1b4b0 62 2d 73 69 7a 65 20 68 65 61 64 65 72 20 66 69  b-size header fi
1b4c0 65 6c 64 20 69 73 20 69 6e 63 6f 72 72 65 63 74  eld is incorrect
1b4d0 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 69   (as it may be i
1b4e0 66 20 61 6e 20 6f 6c 64 0a 20 20 20 20 20 20 2a  f an old.      *
1b4f0 2a 20 63 6c 69 65 6e 74 20 68 61 73 20 62 65 65  * client has bee
1b500 6e 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61  n writing the da
1b510 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20 75 70  tabase file), up
1b520 64 61 74 65 20 69 74 20 6e 6f 77 2e 20 44 6f 69  date it now. Doi
1b530 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73  ng.      ** this
1b540 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74   sooner rather t
1b550 68 61 6e 20 6c 61 74 65 72 20 6d 65 61 6e 73 20  han later means 
1b560 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
1b570 65 20 63 61 6e 20 73 61 66 65 6c 79 20 0a 20 20  e can safely .  
1b580 20 20 20 20 2a 2a 20 72 65 2d 72 65 61 64 20 74      ** re-read t
1b590 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
1b5a0 20 66 72 6f 6d 20 70 61 67 65 20 31 20 69 66 20   from page 1 if 
1b5b0 61 20 73 61 76 65 70 6f 69 6e 74 20 6f 72 20 74  a savepoint or t
1b5c0 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 20  ransaction.     
1b5d0 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63   ** rollback occ
1b5e0 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 74  urs within the t
1b5f0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20  ransaction..    
1b600 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
1b610 42 74 2d 3e 6e 50 61 67 65 21 3d 67 65 74 34 62  Bt->nPage!=get4b
1b620 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
1b630 74 61 5b 32 38 5d 29 20 29 7b 0a 20 20 20 20 20  ta[28]) ){.     
1b640 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1b650 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31  agerWrite(pPage1
1b660 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1b670 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1b680 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1b690 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
1b6a0 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20  ge1->aData[28], 
1b6b0 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20  pBt->nPage);.   
1b6c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1b6d0 20 20 20 7d 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73     }.  }...trans
1b6e0 5f 62 65 67 75 6e 3a 0a 20 20 69 66 28 20 72 63  _begun:.  if( rc
1b6f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77  ==SQLITE_OK && w
1b700 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 2f 2a 20  rflag ){.    /* 
1b710 54 68 69 73 20 63 61 6c 6c 20 6d 61 6b 65 73 20  This call makes 
1b720 73 75 72 65 20 74 68 61 74 20 74 68 65 20 70 61  sure that the pa
1b730 67 65 72 20 68 61 73 20 74 68 65 20 63 6f 72 72  ger has the corr
1b740 65 63 74 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  ect number of.  
1b750 20 20 2a 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f    ** open savepo
1b760 69 6e 74 73 2e 20 49 66 20 74 68 65 20 73 65 63  ints. If the sec
1b770 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  ond parameter is
1b780 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 20   greater than 0 
1b790 61 6e 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  and.    ** the s
1b7a0 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f  ub-journal is no
1b7b0 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20  t already open, 
1b7c0 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 62 65 20  then it will be 
1b7d0 6f 70 65 6e 65 64 20 68 65 72 65 2e 0a 20 20 20  opened here..   
1b7e0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
1b7f0 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76  ite3PagerOpenSav
1b800 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67  epoint(pBt->pPag
1b810 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65  er, p->db->nSave
1b820 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 62  point);.  }..  b
1b830 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
1b840 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1b850 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
1b860 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
1b870 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1b880 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20  TOVACUUM../*.** 
1b890 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  Set the pointer-
1b8a0 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
1b8b0 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20  all children of 
1b8c0 70 61 67 65 20 70 50 61 67 65 2e 20 41 6c 73 6f  page pPage. Also
1b8d0 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f  , if.** pPage co
1b8e0 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20 74 68 61  ntains cells tha
1b8f0 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66  t point to overf
1b900 6c 6f 77 20 70 61 67 65 73 2c 20 73 65 74 20 74  low pages, set t
1b910 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61  he pointer.** ma
1b920 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68  p entries for th
1b930 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
1b940 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61   as well..*/.sta
1b950 74 69 63 20 69 6e 74 20 73 65 74 43 68 69 6c 64  tic int setChild
1b960 50 74 72 6d 61 70 73 28 4d 65 6d 50 61 67 65 20  Ptrmaps(MemPage 
1b970 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69  *pPage){.  int i
1b980 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b9a0 20 43 6f 75 6e 74 65 72 20 76 61 72 69 61 62 6c   Counter variabl
1b9b0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  e */.  int nCell
1b9c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b9d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1b9e0 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20  ber of cells in 
1b9f0 70 61 67 65 20 70 50 61 67 65 20 2a 2f 0a 20 20  page pPage */.  
1ba00 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1ba10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1ba30 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  e */.  BtShared 
1ba40 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
1ba50 74 3b 0a 20 20 75 38 20 69 73 49 6e 69 74 4f 72  t;.  u8 isInitOr
1ba60 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e  ig = pPage->isIn
1ba70 69 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20  it;.  Pgno pgno 
1ba80 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a  = pPage->pgno;..
1ba90 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1baa0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
1bab0 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
1bac0 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 49  );.  rc = btreeI
1bad0 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  nitPage(pPage);.
1bae0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1baf0 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
1bb00 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70  set_child_ptrmap
1bb10 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e 43 65  s_out;.  }.  nCe
1bb20 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ll = pPage->nCel
1bb30 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  l;..  for(i=0; i
1bb40 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
1bb50 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69    u8 *pCell = fi
1bb60 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29  ndCell(pPage, i)
1bb70 3b 0a 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74  ;..    ptrmapPut
1bb80 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70  OvflPtr(pPage, p
1bb90 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20 20 20  Cell, &rc);..   
1bba0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
1bbb0 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  f ){.      Pgno 
1bbc0 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34  childPgno = get4
1bbd0 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20  byte(pCell);.   
1bbe0 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
1bbf0 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52  , childPgno, PTR
1bc00 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c  MAP_BTREE, pgno,
1bc10 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   &rc);.    }.  }
1bc20 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ..  if( !pPage->
1bc30 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f  leaf ){.    Pgno
1bc40 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74   childPgno = get
1bc50 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
1bc60 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
1bc70 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 74  fset+8]);.    pt
1bc80 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69  rmapPut(pBt, chi
1bc90 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  ldPgno, PTRMAP_B
1bca0 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29  TREE, pgno, &rc)
1bcb0 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64  ;.  }..set_child
1bcc0 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20  _ptrmaps_out:.  
1bcd0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
1bce0 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65  isInitOrig;.  re
1bcf0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1bd00 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70  * Somewhere on p
1bd10 50 61 67 65 20 69 73 20 61 20 70 6f 69 6e 74 65  Page is a pointe
1bd20 72 20 74 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e  r to page iFrom.
1bd30 20 20 4d 6f 64 69 66 79 20 74 68 69 73 20 70 6f    Modify this po
1bd40 69 6e 74 65 72 20 73 6f 0a 2a 2a 20 74 68 61 74  inter so.** that
1bd50 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 69 54   it points to iT
1bd60 6f 2e 20 50 61 72 61 6d 65 74 65 72 20 65 54 79  o. Parameter eTy
1bd70 70 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65  pe describes the
1bd80 20 74 79 70 65 20 6f 66 20 70 6f 69 6e 74 65 72   type of pointer
1bd90 20 74 6f 0a 2a 2a 20 62 65 20 6d 6f 64 69 66 69   to.** be modifi
1bda0 65 64 2c 20 61 73 20 20 66 6f 6c 6c 6f 77 73 3a  ed, as  follows:
1bdb0 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54  .**.** PTRMAP_BT
1bdc0 52 45 45 3a 20 20 20 20 20 70 50 61 67 65 20 69  REE:     pPage i
1bdd0 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20  s a btree-page. 
1bde0 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  The pointer poin
1bdf0 74 73 20 61 74 20 61 20 63 68 69 6c 64 20 0a 2a  ts at a child .*
1be00 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1be10 20 20 20 20 70 61 67 65 20 6f 66 20 70 50 61 67      page of pPag
1be20 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f  e..**.** PTRMAP_
1be30 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50 61 67 65  OVERFLOW1: pPage
1be40 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65   is a btree-page
1be50 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f  . The pointer po
1be60 69 6e 74 73 20 61 74 20 61 6e 20 6f 76 65 72 66  ints at an overf
1be70 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  low.**          
1be80 20 20 20 20 20 20 20 20 20 70 61 67 65 20 70 6f           page po
1be90 69 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e 65 20  inted to by one 
1bea0 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20  of the cells on 
1beb0 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52  pPage..**.** PTR
1bec0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70  MAP_OVERFLOW2: p
1bed0 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66  Page is an overf
1bee0 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65 20 70 6f  low-page. The po
1bef0 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20  inter points at 
1bf00 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20  the next.**     
1bf10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 76                ov
1bf20 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74  erflow page in t
1bf30 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  he list..*/.stat
1bf40 69 63 20 69 6e 74 20 6d 6f 64 69 66 79 50 61 67  ic int modifyPag
1bf50 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67 65  ePointer(MemPage
1bf60 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20 69 46   *pPage, Pgno iF
1bf70 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75  rom, Pgno iTo, u
1bf80 38 20 65 54 79 70 65 29 7b 0a 20 20 61 73 73 65  8 eType){.  asse
1bf90 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1bfa0 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
1bfb0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
1bfc0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
1bfd0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
1bfe0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
1bff0 3b 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50  ;.  if( eType==P
1c000 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20  TRMAP_OVERFLOW2 
1c010 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 6f  ){.    /* The po
1c020 69 6e 74 65 72 20 69 73 20 61 6c 77 61 79 73 20  inter is always 
1c030 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65  the first 4 byte
1c040 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e  s of the page in
1c050 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a   this case.  */.
1c060 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65      if( get4byte
1c070 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 21 3d  (pPage->aData)!=
1c080 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72  iFrom ){.      r
1c090 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1c0a0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
1c0b0 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50  .    put4byte(pP
1c0c0 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29  age->aData, iTo)
1c0d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75  ;.  }else{.    u
1c0e0 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70  8 isInitOrig = p
1c0f0 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20  Page->isInit;.  
1c100 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74    int i;.    int
1c110 20 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 74 20   nCell;.    int 
1c120 72 63 3b 0a 0a 20 20 20 20 72 63 20 3d 20 62 74  rc;..    rc = bt
1c130 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67  reeInitPage(pPag
1c140 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
1c150 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1c160 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e  nCell = pPage->n
1c170 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69  Cell;..    for(i
1c180 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
1c190 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65  ){.      u8 *pCe
1c1a0 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
1c1b0 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 69  age, i);.      i
1c1c0 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
1c1d0 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20  _OVERFLOW1 ){.  
1c1e0 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69        CellInfo i
1c1f0 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 70 50 61  nfo;.        pPa
1c200 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70  ge->xParseCell(p
1c210 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
1c220 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  fo);.        if(
1c230 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66   info.nLocal<inf
1c240 6f 2e 6e 50 61 79 6c 6f 61 64 0a 20 20 20 20 20  o.nPayload.     
1c250 20 20 20 20 26 26 20 70 43 65 6c 6c 2b 69 6e 66      && pCell+inf
1c260 6f 2e 6e 53 69 7a 65 2d 31 3c 3d 70 50 61 67 65  o.nSize-1<=pPage
1c270 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d  ->aData+pPage->m
1c280 61 73 6b 50 61 67 65 0a 20 20 20 20 20 20 20 20  askPage.        
1c290 20 26 26 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62   && iFrom==get4b
1c2a0 79 74 65 28 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e  yte(pCell+info.n
1c2b0 53 69 7a 65 2d 34 29 0a 20 20 20 20 20 20 20 20  Size-4).        
1c2c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  ){.          put
1c2d0 34 62 79 74 65 28 70 43 65 6c 6c 2b 69 6e 66 6f  4byte(pCell+info
1c2e0 2e 6e 53 69 7a 65 2d 34 2c 20 69 54 6f 29 3b 0a  .nSize-4, iTo);.
1c2f0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1c300 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1c310 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1c320 69 66 28 20 67 65 74 34 62 79 74 65 28 70 43 65  if( get4byte(pCe
1c330 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  ll)==iFrom ){.  
1c340 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
1c350 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20  (pCell, iTo);.  
1c360 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1c370 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1c380 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66  .    }.  .    if
1c390 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20  ( i==nCell ){.  
1c3a0 20 20 20 20 69 66 28 20 65 54 79 70 65 21 3d 50      if( eType!=P
1c3b0 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a  TRMAP_BTREE || .
1c3c0 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79            get4by
1c3d0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
1c3e0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
1c3f0 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a  t+8])!=iFrom ){.
1c400 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
1c410 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1c420 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
1c430 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
1c440 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
1c450 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54  hdrOffset+8], iT
1c460 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  o);.    }..    p
1c470 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69  Page->isInit = i
1c480 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20  sInitOrig;.  }. 
1c490 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1c4a0 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  K;.}.../*.** Mov
1c4b0 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  e the open datab
1c4c0 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65  ase page pDbPage
1c4d0 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72   to location iFr
1c4e0 65 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  eePage in the .*
1c4f0 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20  * database. The 
1c500 70 44 62 50 61 67 65 20 72 65 66 65 72 65 6e 63  pDbPage referenc
1c510 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e  e remains valid.
1c520 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 43 6f 6d  .**.** The isCom
1c530 6d 69 74 20 66 6c 61 67 20 69 6e 64 69 63 61 74  mit flag indicat
1c540 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  es that there is
1c550 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d 65   no need to reme
1c560 6d 62 65 72 20 74 68 61 74 0a 2a 2a 20 74 68 65  mber that.** the
1c570 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74   journal needs t
1c580 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20 62 65  o be sync()ed be
1c590 66 6f 72 65 20 64 61 74 61 62 61 73 65 20 70 61  fore database pa
1c5a0 67 65 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f  ge pDbPage->pgno
1c5b0 20 0a 2a 2a 20 63 61 6e 20 62 65 20 77 72 69 74   .** can be writ
1c5c0 74 65 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c  ten to. The call
1c5d0 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 70  er has already p
1c5e0 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20 77  romised not to w
1c5f0 72 69 74 65 20 74 6f 20 74 68 61 74 0a 2a 2a 20  rite to that.** 
1c600 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
1c610 69 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65  int relocatePage
1c620 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
1c630 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
1c640 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61  Btree */.  MemPa
1c650 67 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20  ge *pDbPage,    
1c660 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65      /* Open page
1c670 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38   to move */.  u8
1c680 20 65 54 79 70 65 2c 20 20 20 20 20 20 20 20 20   eType,         
1c690 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
1c6a0 72 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74  r map 'type' ent
1c6b0 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a  ry for pDbPage *
1c6c0 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67  /.  Pgno iPtrPag
1c6d0 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
1c6e0 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67  Pointer map 'pag
1c6f0 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20  e-no' entry for 
1c700 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  pDbPage */.  Pgn
1c710 6f 20 69 46 72 65 65 50 61 67 65 2c 20 20 20 20  o iFreePage,    
1c720 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63        /* The loc
1c730 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44  ation to move pD
1c740 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e  bPage to */.  in
1c750 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20 20 20  t isCommit      
1c760 20 20 20 20 20 20 20 2f 2a 20 69 73 43 6f 6d 6d         /* isComm
1c770 69 74 20 66 6c 61 67 20 70 61 73 73 65 64 20 74  it flag passed t
1c780 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  o sqlite3PagerMo
1c790 76 65 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d  vepage */.){.  M
1c7a0 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67 65  emPage *pPtrPage
1c7b0 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20  ;   /* The page 
1c7c0 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20  that contains a 
1c7d0 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61  pointer to pDbPa
1c7e0 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62  ge */.  Pgno iDb
1c7f0 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e  Page = pDbPage->
1c800 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70  pgno;.  Pager *p
1c810 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61  Pager = pBt->pPa
1c820 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ger;.  int rc;..
1c830 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d    assert( eType=
1c840 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
1c850 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  2 || eType==PTRM
1c860 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20  AP_OVERFLOW1 || 
1c870 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54  .      eType==PT
1c880 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54  RMAP_BTREE || eT
1c890 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
1c8a0 50 41 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74  PAGE );.  assert
1c8b0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1c8c0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
1c8d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44   );.  assert( pD
1c8e0 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20  bPage->pBt==pBt 
1c8f0 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61  );..  /* Move pa
1c900 67 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20  ge iDbPage from 
1c910 69 74 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  its current loca
1c920 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d  tion to page num
1c930 62 65 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f  ber iFreePage */
1c940 0a 20 20 54 52 41 43 45 28 28 22 41 55 54 4f 56  .  TRACE(("AUTOV
1c950 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64  ACUUM: Moving %d
1c960 20 74 6f 20 66 72 65 65 20 70 61 67 65 20 25 64   to free page %d
1c970 20 28 70 74 72 20 70 61 67 65 20 25 64 20 74 79   (ptr page %d ty
1c980 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20  pe %d)\n", .    
1c990 20 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65    iDbPage, iFree
1c9a0 50 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Page, iPtrPage, 
1c9b0 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20  eType));.  rc = 
1c9c0 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
1c9d0 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 44 62  page(pPager, pDb
1c9e0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69  Page->pDbPage, i
1c9f0 46 72 65 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d  FreePage, isComm
1ca00 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  it);.  if( rc!=S
1ca10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ca20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
1ca30 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d   pDbPage->pgno =
1ca40 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f   iFreePage;..  /
1ca50 2a 20 49 66 20 70 44 62 50 61 67 65 20 77 61 73  * If pDbPage was
1ca60 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74   a btree-page, t
1ca70 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20  hen it may have 
1ca80 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f  child pages and/
1ca90 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68  or cells.  ** th
1caa0 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72  at point to over
1cab0 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20  flow pages. The 
1cac0 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
1cad0 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73  ies for all thes
1cae0 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65  e.  ** pages nee
1caf0 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e  d to be changed.
1cb00 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44  .  **.  ** If pD
1cb10 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72  bPage is an over
1cb20 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20  flow page, then 
1cb30 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65  the first 4 byte
1cb40 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20  s may store a.  
1cb50 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20  ** pointer to a 
1cb60 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66  subsequent overf
1cb70 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74 68 69  low page. If thi
1cb80 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  s is the case, t
1cb90 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69  hen.  ** the poi
1cba0 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74  nter map needs t
1cbb0 6f 20 62 65 20 75 70 64 61 74 65 64 20 66 6f 72  o be updated for
1cbc0 20 74 68 65 20 73 75 62 73 65 71 75 65 6e 74 20   the subsequent 
1cbd0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20  overflow page.. 
1cbe0 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d   */.  if( eType=
1cbf0 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
1cc00 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
1cc10 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72  OOTPAGE ){.    r
1cc20 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d  c = setChildPtrm
1cc30 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20  aps(pDbPage);.  
1cc40 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1cc50 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
1cc60 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1cc70 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20  }else{.    Pgno 
1cc80 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62  nextOvfl = get4b
1cc90 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61  yte(pDbPage->aDa
1cca0 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78  ta);.    if( nex
1ccb0 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20  tOvfl!=0 ){.    
1ccc0 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
1ccd0 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41   nextOvfl, PTRMA
1cce0 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72  P_OVERFLOW2, iFr
1ccf0 65 65 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20  eePage, &rc);.  
1cd00 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1cd10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1cd20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1cd30 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
1cd40 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61 74 61   /* Fix the data
1cd50 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20  base pointer on 
1cd60 70 61 67 65 20 69 50 74 72 50 61 67 65 20 74 68  page iPtrPage th
1cd70 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44  at pointed at iD
1cd80 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68  bPage so.  ** th
1cd90 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20  at it points at 
1cda0 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20  iFreePage. Also 
1cdb0 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20  fix the pointer 
1cdc0 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20  map entry for.  
1cdd0 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a  ** iPtrPage..  *
1cde0 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 50  /.  if( eType!=P
1cdf0 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
1ce00 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  {.    rc = btree
1ce10 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 74  GetPage(pBt, iPt
1ce20 72 50 61 67 65 2c 20 26 70 50 74 72 50 61 67 65  rPage, &pPtrPage
1ce30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
1ce40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1ce50 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1ce60 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
1ce70 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1ce80 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62 50 61  (pPtrPage->pDbPa
1ce90 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
1cea0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1ceb0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1cec0 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20  pPtrPage);.     
1ced0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1cee0 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66  }.    rc = modif
1cef0 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74  yPagePointer(pPt
1cf00 72 50 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20  rPage, iDbPage, 
1cf10 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65  iFreePage, eType
1cf20 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  );.    releasePa
1cf30 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20  ge(pPtrPage);.  
1cf40 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1cf50 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 74 72  _OK ){.      ptr
1cf60 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46 72 65  mapPut(pBt, iFre
1cf70 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50  ePage, eType, iP
1cf80 74 72 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20  trPage, &rc);.  
1cf90 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1cfa0 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61   rc;.}../* Forwa
1cfb0 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72  rd declaration r
1cfc0 65 71 75 69 72 65 64 20 62 79 20 69 6e 63 72 56  equired by incrV
1cfd0 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a  acuumStep(). */.
1cfe0 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63  static int alloc
1cff0 61 74 65 42 74 72 65 65 50 61 67 65 28 42 74 53  ateBtreePage(BtS
1d000 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65  hared *, MemPage
1d010 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e   **, Pgno *, Pgn
1d020 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50  o, u8);../*.** P
1d030 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20  erform a single 
1d040 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63 72 65  step of an incre
1d050 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49  mental-vacuum. I
1d060 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65  f successful, re
1d070 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  turn.** SQLITE_O
1d080 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  K. If there is n
1d090 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e  o work to do (an
1d0a0 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 20 70  d therefore no p
1d0b0 6f 69 6e 74 20 69 6e 20 0a 2a 2a 20 63 61 6c 6c  oint in .** call
1d0c0 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
1d0d0 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75 72 6e  n again), return
1d0e0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 4f 72   SQLITE_DONE. Or
1d0f0 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a  , if an error .*
1d100 2a 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  * occurs, return
1d110 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f   some other erro
1d120 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4d 6f  r code..**.** Mo
1d130 72 65 20 73 70 65 63 69 66 69 63 61 6c 6c 79 2c  re specifically,
1d140 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
1d150 74 74 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72  ttempts to re-or
1d160 67 61 6e 69 7a 65 20 74 68 65 20 64 61 74 61 62  ganize the datab
1d170 61 73 65 20 73 6f 20 0a 2a 2a 20 74 68 61 74 20  ase so .** that 
1d180 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 6f 66  the last page of
1d190 20 74 68 65 20 66 69 6c 65 20 63 75 72 72 65 6e   the file curren
1d1a0 74 6c 79 20 69 6e 20 75 73 65 20 69 73 20 6e 6f  tly in use is no
1d1b0 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a   longer in use..
1d1c0 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  **.** Parameter 
1d1d0 6e 46 69 6e 20 69 73 20 74 68 65 20 6e 75 6d 62  nFin is the numb
1d1e0 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  er of pages that
1d1f0 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 77   this database w
1d200 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20  ould contain.** 
1d210 77 65 72 65 20 74 68 69 73 20 66 75 6e 63 74 69  were this functi
1d220 6f 6e 20 63 61 6c 6c 65 64 20 75 6e 74 69 6c 20  on called until 
1d230 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  it returns SQLIT
1d240 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 49 66  E_DONE..**.** If
1d250 20 74 68 65 20 62 43 6f 6d 6d 69 74 20 70 61 72   the bCommit par
1d260 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65  ameter is non-ze
1d270 72 6f 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ro, this functio
1d280 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 74  n assumes that t
1d290 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 77 69  he .** caller wi
1d2a0 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20  ll keep calling 
1d2b0 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29  incrVacuumStep()
1d2c0 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e   until it return
1d2d0 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 0a 2a  s SQLITE_DONE .*
1d2e0 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 2e 20 62  * or an error. b
1d2f0 43 6f 6d 6d 69 74 20 69 73 20 70 61 73 73 65 64  Commit is passed
1d300 20 74 72 75 65 20 66 6f 72 20 61 6e 20 61 75 74   true for an aut
1d310 6f 2d 76 61 63 75 75 6d 2d 6f 6e 2d 63 6f 6d 6d  o-vacuum-on-comm
1d320 69 74 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  it .** operation
1d330 2c 20 6f 72 20 66 61 6c 73 65 20 66 6f 72 20 61  , or false for a
1d340 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
1d350 63 75 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cuum..*/.static 
1d360 69 6e 74 20 69 6e 63 72 56 61 63 75 75 6d 53 74  int incrVacuumSt
1d370 65 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ep(BtShared *pBt
1d380 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e  , Pgno nFin, Pgn
1d390 6f 20 69 4c 61 73 74 50 67 2c 20 69 6e 74 20 62  o iLastPg, int b
1d3a0 43 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 6e 6f 20  Commit){.  Pgno 
1d3b0 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20  nFreeList;      
1d3c0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1d3d0 66 20 70 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e  f pages still on
1d3e0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2a   the free-list *
1d3f0 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  /.  int rc;..  a
1d400 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1d410 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
1d420 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
1d430 74 28 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e 20  t( iLastPg>nFin 
1d440 29 3b 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41  );..  if( !PTRMA
1d450 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c  P_ISPAGE(pBt, iL
1d460 61 73 74 50 67 29 20 26 26 20 69 4c 61 73 74 50  astPg) && iLastP
1d470 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  g!=PENDING_BYTE_
1d480 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
1d490 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 50   u8 eType;.    P
1d4a0 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20  gno iPtrPage;.. 
1d4b0 20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d 20 67     nFreeList = g
1d4c0 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  et4byte(&pBt->pP
1d4d0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
1d4e0 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 4c  ;.    if( nFreeL
1d4f0 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist==0 ){.      
1d500 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
1d510 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72  NE;.    }..    r
1d520 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
1d530 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65 54 79  t, iLastPg, &eTy
1d540 70 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a  pe, &iPtrPage);.
1d550 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1d560 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1d570 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1d580 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
1d590 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
1d5a0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
1d5b0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1d5c0 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  PT;.    }..    i
1d5d0 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
1d5e0 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20  _FREEPAGE ){.   
1d5f0 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d     if( bCommit==
1d600 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
1d610 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20  Remove the page 
1d620 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20 66  from the files f
1d630 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 69  ree-list. This i
1d640 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a 20  s not required. 
1d650 20 20 20 20 20 20 20 2a 2a 20 69 66 20 62 43 6f         ** if bCo
1d660 6d 6d 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  mmit is non-zero
1d670 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20  . In that case, 
1d680 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 77 69  the free-list wi
1d690 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  ll be.        **
1d6a0 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65   truncated to ze
1d6b0 72 6f 20 61 66 74 65 72 20 74 68 69 73 20 66 75  ro after this fu
1d6c0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20  nction returns, 
1d6d0 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 0a 20  so it doesn't . 
1d6e0 20 20 20 20 20 20 20 2a 2a 20 6d 61 74 74 65 72         ** matter
1d6f0 20 69 66 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e   if it still con
1d700 74 61 69 6e 73 20 73 6f 6d 65 20 67 61 72 62 61  tains some garba
1d710 67 65 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20  ge entries..    
1d720 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50      */.        P
1d730 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20 20 20  gno iFreePg;.   
1d740 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46       MemPage *pF
1d750 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72  reePg;.        r
1d760 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
1d770 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65  ePage(pBt, &pFre
1d780 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69  ePg, &iFreePg, i
1d790 4c 61 73 74 50 67 2c 20 42 54 41 4c 4c 4f 43 5f  LastPg, BTALLOC_
1d7a0 45 58 41 43 54 29 3b 0a 20 20 20 20 20 20 20 20  EXACT);.        
1d7b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1d7c0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
1d7d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1d7e0 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
1d7f0 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69 4c 61  rt( iFreePg==iLa
1d800 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20  stPg );.        
1d810 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65  releasePage(pFre
1d820 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ePg);.      }.  
1d830 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
1d840 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 20 20   Pgno iFreePg;  
1d850 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1d860 64 65 78 20 6f 66 20 66 72 65 65 20 70 61 67 65  dex of free page
1d870 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50 67   to move pLastPg
1d880 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d   to */.      Mem
1d890 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a 20  Page *pLastPg;. 
1d8a0 20 20 20 20 20 75 38 20 65 4d 6f 64 65 20 3d 20       u8 eMode = 
1d8b0 42 54 41 4c 4c 4f 43 5f 41 4e 59 3b 20 20 20 2f  BTALLOC_ANY;   /
1d8c0 2a 20 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72  * Mode parameter
1d8d0 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72   for allocateBtr
1d8e0 65 65 50 61 67 65 28 29 20 2a 2f 0a 20 20 20 20  eePage() */.    
1d8f0 20 20 50 67 6e 6f 20 69 4e 65 61 72 20 3d 20 30    Pgno iNear = 0
1d900 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e  ;           /* n
1d910 65 61 72 62 79 20 70 61 72 61 6d 65 74 65 72 20  earby parameter 
1d920 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  for allocateBtre
1d930 65 50 61 67 65 28 29 20 2a 2f 0a 0a 20 20 20 20  ePage() */..    
1d940 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
1d950 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67  age(pBt, iLastPg
1d960 2c 20 26 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a  , &pLastPg, 0);.
1d970 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1d980 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1d990 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1d9a0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
1d9b0 49 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 7a 65  If bCommit is ze
1d9c0 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72 75  ro, this loop ru
1d9d0 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20  ns exactly once 
1d9e0 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74 50 67  and page pLastPg
1d9f0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 77 61  .      ** is swa
1da00 70 70 65 64 20 77 69 74 68 20 74 68 65 20 66 69  pped with the fi
1da10 72 73 74 20 66 72 65 65 20 70 61 67 65 20 70 75  rst free page pu
1da20 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66 72 65  lled off the fre
1da30 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a  e list..      **
1da40 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65  .      ** On the
1da50 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 20   other hand, if 
1da60 62 43 6f 6d 6d 69 74 20 69 73 20 67 72 65 61 74  bCommit is great
1da70 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  er than zero, th
1da80 65 6e 20 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a  en keep.      **
1da90 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61   looping until a
1daa0 20 66 72 65 65 2d 70 61 67 65 20 6c 6f 63 61 74   free-page locat
1dab0 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 66 69  ed within the fi
1dac0 72 73 74 20 6e 46 69 6e 20 70 61 67 65 73 0a 20  rst nFin pages. 
1dad0 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66       ** of the f
1dae0 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20  ile is found..  
1daf0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
1db00 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20   bCommit==0 ){. 
1db10 20 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 42         eMode = B
1db20 54 41 4c 4c 4f 43 5f 4c 45 3b 0a 20 20 20 20 20  TALLOC_LE;.     
1db30 20 20 20 69 4e 65 61 72 20 3d 20 6e 46 69 6e 3b     iNear = nFin;
1db40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64  .      }.      d
1db50 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50  o {.        MemP
1db60 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20  age *pFreePg;.  
1db70 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
1db80 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
1db90 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72  , &pFreePg, &iFr
1dba0 65 65 50 67 2c 20 69 4e 65 61 72 2c 20 65 4d 6f  eePg, iNear, eMo
1dbb0 64 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  de);.        if(
1dbc0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1dbd0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65  {.          rele
1dbe0 61 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29  asePage(pLastPg)
1dbf0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
1dc00 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
1dc10 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
1dc20 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20  Page(pFreePg);. 
1dc30 20 20 20 20 20 7d 77 68 69 6c 65 28 20 62 43 6f       }while( bCo
1dc40 6d 6d 69 74 20 26 26 20 69 46 72 65 65 50 67 3e  mmit && iFreePg>
1dc50 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20 20 61 73  nFin );.      as
1dc60 73 65 72 74 28 20 69 46 72 65 65 50 67 3c 69 4c  sert( iFreePg<iL
1dc70 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 0a  astPg );.      .
1dc80 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63        rc = reloc
1dc90 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c 61  atePage(pBt, pLa
1dca0 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50 74  stPg, eType, iPt
1dcb0 72 50 61 67 65 2c 20 69 46 72 65 65 50 67 2c 20  rPage, iFreePg, 
1dcc0 62 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20  bCommit);.      
1dcd0 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73  releasePage(pLas
1dce0 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tPg);.      if( 
1dcf0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1dd00 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1dd10 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
1dd20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 43 6f  }.  }..  if( bCo
1dd30 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64  mmit==0 ){.    d
1dd40 6f 20 7b 0a 20 20 20 20 20 20 69 4c 61 73 74 50  o {.      iLastP
1dd50 67 2d 2d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  g--;.    }while(
1dd60 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44 49 4e   iLastPg==PENDIN
1dd70 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
1dd80 20 7c 7c 20 50 54 52 4d 41 50 5f 49 53 50 41 47   || PTRMAP_ISPAG
1dd90 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20  E(pBt, iLastPg) 
1dda0 29 3b 0a 20 20 20 20 70 42 74 2d 3e 62 44 6f 54  );.    pBt->bDoT
1ddb0 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20 20  runcate = 1;.   
1ddc0 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 69 4c   pBt->nPage = iL
1ddd0 61 73 74 50 67 3b 0a 20 20 7d 0a 20 20 72 65 74  astPg;.  }.  ret
1dde0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1ddf0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61  ../*.** The data
1de00 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20 74  base opened by t
1de10 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
1de20 74 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63  t is an auto-vac
1de30 75 75 6d 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  uum database.** 
1de40 6e 4f 72 69 67 20 70 61 67 65 73 20 69 6e 20 73  nOrig pages in s
1de50 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e  ize containing n
1de60 46 72 65 65 20 66 72 65 65 20 70 61 67 65 73 2e  Free free pages.
1de70 20 52 65 74 75 72 6e 20 74 68 65 20 65 78 70 65   Return the expe
1de80 63 74 65 64 20 0a 2a 2a 20 73 69 7a 65 20 6f 66  cted .** size of
1de90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   the database in
1dea0 20 70 61 67 65 73 20 66 6f 6c 6c 6f 77 69 6e 67   pages following
1deb0 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
1dec0 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  operation..*/.st
1ded0 61 74 69 63 20 50 67 6e 6f 20 66 69 6e 61 6c 44  atic Pgno finalD
1dee0 62 53 69 7a 65 28 42 74 53 68 61 72 65 64 20 2a  bSize(BtShared *
1def0 70 42 74 2c 20 50 67 6e 6f 20 6e 4f 72 69 67 2c  pBt, Pgno nOrig,
1df00 20 50 67 6e 6f 20 6e 46 72 65 65 29 7b 0a 20 20   Pgno nFree){.  
1df10 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20 20 20 20  int nEntry;     
1df20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df30 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
1df40 72 69 65 73 20 6f 6e 20 6f 6e 65 20 70 74 72 6d  ries on one ptrm
1df50 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e  ap page */.  Pgn
1df60 6f 20 6e 50 74 72 6d 61 70 3b 20 20 20 20 20 20  o nPtrmap;      
1df70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1df80 4e 75 6d 62 65 72 20 6f 66 20 50 74 72 4d 61 70  Number of PtrMap
1df90 20 70 61 67 65 73 20 74 6f 20 62 65 20 66 72 65   pages to be fre
1dfa0 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46 69  ed */.  Pgno nFi
1dfb0 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
1dfc0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1dfd0 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 6e 45  n value */..  nE
1dfe0 6e 74 72 79 20 3d 20 70 42 74 2d 3e 75 73 61 62  ntry = pBt->usab
1dff0 6c 65 53 69 7a 65 2f 35 3b 0a 20 20 6e 50 74 72  leSize/5;.  nPtr
1e000 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72  map = (nFree-nOr
1e010 69 67 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f  ig+PTRMAP_PAGENO
1e020 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b 6e 45 6e  (pBt, nOrig)+nEn
1e030 74 72 79 29 2f 6e 45 6e 74 72 79 3b 0a 20 20 6e  try)/nEntry;.  n
1e040 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46  Fin = nOrig - nF
1e050 72 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20  ree - nPtrmap;. 
1e060 20 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49   if( nOrig>PENDI
1e070 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
1e080 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e  ) && nFin<PENDIN
1e090 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
1e0a0 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a   ){.    nFin--;.
1e0b0 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 50 54 52    }.  while( PTR
1e0c0 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
1e0d0 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50  nFin) || nFin==P
1e0e0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
1e0f0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e 46 69  (pBt) ){.    nFi
1e100 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  n--;.  }..  retu
1e110 72 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn nFin;.}../*.*
1e120 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61  * A write-transa
1e130 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70  ction must be op
1e140 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c  ened before call
1e150 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
1e160 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d  n..** It perform
1e170 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 74 20  s a single unit 
1e180 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64 73 20  of work towards 
1e190 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  an incremental v
1e1a0 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  acuum..**.** If 
1e1b0 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20  the incremental 
1e1c0 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69 73 68  vacuum is finish
1e1d0 65 64 20 61 66 74 65 72 20 74 68 69 73 20 66 75  ed after this fu
1e1e0 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a  nction has run,.
1e1f0 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69  ** SQLITE_DONE i
1e200 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69  s returned. If i
1e210 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73 68 65  t is not finishe
1e220 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20  d, but no error 
1e230 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51 4c  occurred,.** SQL
1e240 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1e250 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 61 6e  ed. Otherwise an
1e260 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
1e270 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  de. .*/.int sqli
1e280 74 65 33 42 74 72 65 65 49 6e 63 72 56 61 63 75  te3BtreeIncrVacu
1e290 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  um(Btree *p){.  
1e2a0 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
1e2b0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
1e2c0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
1e2d0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73  eEnter(p);.  ass
1e2e0 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
1e2f0 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
1e300 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54 72 61  RITE && p->inTra
1e310 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
1e320 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 61  );.  if( !pBt->a
1e330 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
1e340 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
1e350 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  E;.  }else{.    
1e360 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 62 74 72  Pgno nOrig = btr
1e370 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
1e380 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65  ;.    Pgno nFree
1e390 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74   = get4byte(&pBt
1e3a0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
1e3b0 33 36 5d 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e  36]);.    Pgno n
1e3c0 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a  Fin = finalDbSiz
1e3d0 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46  e(pBt, nOrig, nF
1e3e0 72 65 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e  ree);..    if( n
1e3f0 4f 72 69 67 3c 6e 46 69 6e 20 29 7b 0a 20 20 20  Orig<nFin ){.   
1e400 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
1e410 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1e420 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 72 65 65   }else if( nFree
1e430 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  >0 ){.      rc =
1e440 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
1e450 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  pBt, 0, 0);.    
1e460 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1e470 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
1e480 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
1e490 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a  flowCache(pBt);.
1e4a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63          rc = inc
1e4b0 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c  rVacuumStep(pBt,
1e4c0 20 6e 46 69 6e 2c 20 6e 4f 72 69 67 2c 20 30 29   nFin, nOrig, 0)
1e4d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1e4e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1e4f0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
1e500 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1e510 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d  ite(pBt->pPage1-
1e520 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
1e530 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
1e540 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
1e550 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  28], pBt->nPage)
1e560 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
1e570 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
1e580 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
1e590 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
1e5a0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1e5b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1e5c0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1e5d0 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f  e is called prio
1e5e0 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  r to sqlite3Page
1e5f0 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74  rCommit when a t
1e600 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73  ransaction.** is
1e610 20 63 6f 6d 6d 69 74 74 65 64 20 66 6f 72 20 61   committed for a
1e620 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
1e630 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  tabase..**.** If
1e640 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1e650 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e  turned, then *pn
1e660 54 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f 20  Trunc is set to 
1e670 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
1e680 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ges.** the datab
1e690 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20  ase file should 
1e6a0 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  be truncated to 
1e6b0 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69  during the commi
1e6c0 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69  t process. .** i
1e6d0 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61 73 65  .e. the database
1e6e0 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67 61   has been reorga
1e6f0 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f 6e  nized so that on
1e700 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a 70 6e  ly the first *pn
1e710 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61  Trunc.** pages a
1e720 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74  re in use..*/.st
1e730 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61 63  atic int autoVac
1e740 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61 72  uumCommit(BtShar
1e750 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20  ed *pBt){.  int 
1e760 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1e770 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1e780 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20  = pBt->pPager;. 
1e790 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e   VVA_ONLY( int n
1e7a0 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67  Ref = sqlite3Pag
1e7b0 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65  erRefcount(pPage
1e7c0 72 29 3b 20 29 0a 0a 20 20 61 73 73 65 72 74 28  r); )..  assert(
1e7d0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1e7e0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
1e7f0 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 41  );.  invalidateA
1e800 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
1e810 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74 28 70  pBt);.  assert(p
1e820 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b  Bt->autoVacuum);
1e830 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69 6e 63  .  if( !pBt->inc
1e840 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50  rVacuum ){.    P
1e850 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20  gno nFin;       
1e860 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
1e870 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65  ages in database
1e880 20 61 66 74 65 72 20 61 75 74 6f 76 61 63 75 75   after autovacuu
1e890 6d 69 6e 67 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  ming */.    Pgno
1e8a0 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f   nFree;        /
1e8b0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
1e8c0 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
1e8d0 74 20 69 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a 20  t initially */. 
1e8e0 20 20 20 50 67 6e 6f 20 69 46 72 65 65 3b 20 20     Pgno iFree;  
1e8f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78        /* The nex
1e900 74 20 70 61 67 65 20 74 6f 20 62 65 20 66 72 65  t page to be fre
1e910 65 64 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e  ed */.    Pgno n
1e920 4f 72 69 67 3b 20 20 20 20 20 20 20 20 2f 2a 20  Orig;        /* 
1e930 44 61 74 61 62 61 73 65 20 73 69 7a 65 20 62 65  Database size be
1e940 66 6f 72 65 20 66 72 65 65 69 6e 67 20 2a 2f 0a  fore freeing */.
1e950 0a 20 20 20 20 6e 4f 72 69 67 20 3d 20 62 74 72  .    nOrig = btr
1e960 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
1e970 3b 0a 20 20 20 20 69 66 28 20 50 54 52 4d 41 50  ;.    if( PTRMAP
1e980 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 4f 72  _ISPAGE(pBt, nOr
1e990 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45  ig) || nOrig==PE
1e9a0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
1e9b0 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  pBt) ){.      /*
1e9c0 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   It is not possi
1e9d0 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 61 20  ble to create a 
1e9e0 64 61 74 61 62 61 73 65 20 66 6f 72 20 77 68 69  database for whi
1e9f0 63 68 20 74 68 65 20 66 69 6e 61 6c 20 70 61 67  ch the final pag
1ea00 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 69  e.      ** is ei
1ea10 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72 2d 6d  ther a pointer-m
1ea20 61 70 20 70 61 67 65 20 6f 72 20 74 68 65 20 70  ap page or the p
1ea30 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61 67 65  ending-byte page
1ea40 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20 20 20 2a  . If one.      *
1ea50 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  * is encountered
1ea60 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73  , this indicates
1ea70 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20   corruption..   
1ea80 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75     */.      retu
1ea90 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1eaa0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20  T_BKPT;.    }.. 
1eab0 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62     nFree = get4b
1eac0 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
1ead0 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
1eae0 20 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62    nFin = finalDb
1eaf0 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c  Size(pBt, nOrig,
1eb00 20 6e 46 72 65 65 29 3b 0a 20 20 20 20 69 66 28   nFree);.    if(
1eb10 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20 72 65   nFin>nOrig ) re
1eb20 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1eb30 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 69 66  UPT_BKPT;.    if
1eb40 28 20 6e 46 69 6e 3c 6e 4f 72 69 67 20 29 7b 0a  ( nFin<nOrig ){.
1eb50 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 41        rc = saveA
1eb60 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30  llCursors(pBt, 0
1eb70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
1eb80 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69 67 3b  for(iFree=nOrig;
1eb90 20 69 46 72 65 65 3e 6e 46 69 6e 20 26 26 20 72   iFree>nFin && r
1eba0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 46  c==SQLITE_OK; iF
1ebb0 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63  ree--){.      rc
1ebc0 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65   = incrVacuumSte
1ebd0 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69 46 72  p(pBt, nFin, iFr
1ebe0 65 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  ee, 1);.    }.  
1ebf0 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54    if( (rc==SQLIT
1ec00 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53 51  E_DONE || rc==SQ
1ec10 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46 72 65  LITE_OK) && nFre
1ec20 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  e>0 ){.      rc 
1ec30 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1ec40 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d  ite(pBt->pPage1-
1ec50 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
1ec60 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e   put4byte(&pBt->
1ec70 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
1ec80 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74  ], 0);.      put
1ec90 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
1eca0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30  e1->aData[36], 0
1ecb0 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  );.      put4byt
1ecc0 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
1ecd0 61 44 61 74 61 5b 32 38 5d 2c 20 6e 46 69 6e 29  aData[28], nFin)
1ece0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 44 6f  ;.      pBt->bDo
1ecf0 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20  Truncate = 1;.  
1ed00 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d      pBt->nPage =
1ed10 20 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 20   nFin;.    }.   
1ed20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1ed30 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
1ed40 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
1ed50 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
1ed60 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e    }..  assert( n
1ed70 52 65 66 3e 3d 73 71 6c 69 74 65 33 50 61 67 65  Ref>=sqlite3Page
1ed80 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72  rRefcount(pPager
1ed90 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ) );.  return rc
1eda0 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66  ;.}..#else /* if
1edb0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1edc0 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 23  _AUTOVACUUM */.#
1edd0 20 64 65 66 69 6e 65 20 73 65 74 43 68 69 6c 64   define setChild
1ede0 50 74 72 6d 61 70 73 28 78 29 20 53 51 4c 49 54  Ptrmaps(x) SQLIT
1edf0 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  E_OK.#endif../*.
1ee00 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1ee10 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70  does the first p
1ee20 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68  hase of a two-ph
1ee30 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69  ase commit.  Thi
1ee40 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75  s routine.** cau
1ee50 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  ses a rollback j
1ee60 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65  ournal to be cre
1ee70 61 74 65 64 20 28 69 66 20 69 74 20 64 6f 65 73  ated (if it does
1ee80 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69   not already exi
1ee90 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c  st).** and popul
1eea0 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68  ated with enough
1eeb0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20   information so 
1eec0 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 20  that if a power 
1eed0 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74  loss occurs.** t
1eee0 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 20  he database can 
1eef0 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  be restored to i
1ef00 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  ts original stat
1ef10 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63  e by playing bac
1ef20 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  k.** the journal
1ef30 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74  .  Then the cont
1ef40 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  ents of the jour
1ef50 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20  nal are flushed 
1ef60 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69  out to.** the di
1ef70 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a  sk.  After the j
1ef80 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79  ournal is safely
1ef90 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63   on oxide, the c
1efa0 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a  hanges to the.**
1efb0 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77 72   database are wr
1efc0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64  itten into the d
1efd0 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
1efe0 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64   flushed to oxid
1eff0 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64  e..** At the end
1f000 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74   of this call, t
1f010 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
1f020 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73  nal still exists
1f030 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20   on the.** disk 
1f040 61 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c  and we are still
1f050 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63   holding all loc
1f060 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73  ks, so the trans
1f070 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a  action has not.*
1f080 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65  * committed.  Se
1f090 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  e sqlite3BtreeCo
1f0a0 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 66  mmitPhaseTwo() f
1f0b0 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68  or the second ph
1f0c0 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f  ase of the.** co
1f0d0 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a  mmit process..**
1f0e0 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73  .** This call is
1f0f0 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77   a no-op if no w
1f100 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
1f110 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63   is currently ac
1f120 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a  tive on pBt..**.
1f130 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79  ** Otherwise, sy
1f140 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
1f150 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72  file for the btr
1f160 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20  ee pBt. zMaster 
1f170 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65  points to.** the
1f180 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65   name of a maste
1f190 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  r journal file t
1f1a0 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72  hat should be wr
1f1b0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a  itten into the.*
1f1c0 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75  * individual jou
1f1d0 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73  rnal file, or is
1f1e0 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e   NULL, indicatin
1f1f0 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  g no master jour
1f200 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69  nal file .** (si
1f210 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72  ngle database tr
1f220 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a  ansaction)..**.*
1f230 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63  * When this is c
1f240 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65  alled, the maste
1f250 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64  r journal should
1f260 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 62 65   already have be
1f270 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70  en.** created, p
1f280 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68  opulated with th
1f290 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  is journal point
1f2a0 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f  er and synced to
1f2b0 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63   disk..**.** Onc
1f2c0 65 20 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e  e this is routin
1f2d0 65 20 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20  e has returned, 
1f2e0 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72  the only thing r
1f2f0 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69  equired to commi
1f300 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74  t.** the write-t
1f310 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74  ransaction for t
1f320 68 69 73 20 64 61 74 61 62 61 73 65 20 66 69 6c  his database fil
1f330 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74  e is to delete t
1f340 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69  he journal..*/.i
1f350 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
1f360 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 42 74  ommitPhaseOne(Bt
1f370 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  ree *p, const ch
1f380 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
1f390 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1f3a0 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  OK;.  if( p->inT
1f3b0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
1f3c0 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65  E ){.    BtShare
1f3d0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
1f3e0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1f3f0 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 6e 64  eEnter(p);.#ifnd
1f400 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1f410 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
1f420 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
1f430 6d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  m ){.      rc = 
1f440 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74  autoVacuumCommit
1f450 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28  (pBt);.      if(
1f460 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1f470 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1f480 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1f490 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1f4a0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
1f4b0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 62 44  .    if( pBt->bD
1f4c0 6f 54 72 75 6e 63 61 74 65 20 29 7b 0a 20 20 20  oTruncate ){.   
1f4d0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 54     sqlite3PagerT
1f4e0 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74  runcateImage(pBt
1f4f0 2d 3e 70 50 61 67 65 72 2c 20 70 42 74 2d 3e 6e  ->pPager, pBt->n
1f500 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  Page);.    }.#en
1f510 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  dif.    rc = sql
1f520 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
1f530 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61  haseOne(pBt->pPa
1f540 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29  ger, zMaster, 0)
1f550 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
1f560 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a  eeLeave(p);.  }.
1f570 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1f580 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1f590 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 72  ion is called fr
1f5a0 6f 6d 20 62 6f 74 68 20 42 74 72 65 65 43 6f 6d  om both BtreeCom
1f5b0 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 61 6e  mitPhaseTwo() an
1f5c0 64 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  d BtreeRollback(
1f5d0 29 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63  ).** at the conc
1f5e0 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e  lusion of a tran
1f5f0 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  saction..*/.stat
1f600 69 63 20 76 6f 69 64 20 62 74 72 65 65 45 6e 64  ic void btreeEnd
1f610 54 72 61 6e 73 61 63 74 69 6f 6e 28 42 74 72 65  Transaction(Btre
1f620 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
1f630 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
1f640 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1f650 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74   p->db;.  assert
1f660 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
1f670 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 0a  ldsMutex(p) );..
1f680 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1f690 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
1f6a0 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74   pBt->bDoTruncat
1f6b0 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  e = 0;.#endif.  
1f6c0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54  if( p->inTrans>T
1f6d0 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 64 62 2d  RANS_NONE && db-
1f6e0 3e 6e 56 64 62 65 52 65 61 64 3e 31 20 29 7b 0a  >nVdbeRead>1 ){.
1f6f0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
1f700 61 72 65 20 6f 74 68 65 72 20 61 63 74 69 76 65  are other active
1f710 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74   statements that
1f720 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68 69 73 20   belong to this 
1f730 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
1f740 68 61 6e 64 6c 65 2c 20 64 6f 77 6e 67 72 61 64  handle, downgrad
1f750 65 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79  e to a read-only
1f760 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68   transaction. Th
1f770 65 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e  e other statemen
1f780 74 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 73 74  ts.    ** may st
1f790 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20 66  ill be reading f
1f7a0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
1f7b0 2e 20 20 2a 2f 0a 20 20 20 20 64 6f 77 6e 67 72  .  */.    downgr
1f7c0 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
1f7d0 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a  eTableLocks(p);.
1f7e0 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d      p->inTrans =
1f7f0 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d   TRANS_READ;.  }
1f800 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
1f810 74 68 65 20 68 61 6e 64 6c 65 20 68 61 64 20 61  the handle had a
1f820 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73  ny kind of trans
1f830 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63  action open, dec
1f840 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 20 20  rement the .    
1f850 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  ** transaction c
1f860 6f 75 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72  ount of the shar
1f870 65 64 20 62 74 72 65 65 2e 20 49 66 20 74 68 65  ed btree. If the
1f880 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1f890 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65 61 63 68  nt .    ** reach
1f8a0 65 73 20 30 2c 20 73 65 74 20 74 68 65 20 73 68  es 0, set the sh
1f8b0 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52  ared state to TR
1f8c0 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e  ANS_NONE. The un
1f8d0 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
1f8e0 64 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20  d().    ** call 
1f8f0 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63  below will unloc
1f900 6b 20 74 68 65 20 70 61 67 65 72 2e 20 20 2a 2f  k the pager.  */
1f910 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  .    if( p->inTr
1f920 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ans!=TRANS_NONE 
1f930 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72 41 6c  ){.      clearAl
1f940 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
1f950 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 20  eLocks(p);.     
1f960 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
1f970 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20  on--;.      if( 
1f980 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63  0==pBt->nTransac
1f990 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  tion ){.        
1f9a0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1f9b0 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  on = TRANS_NONE;
1f9c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1f9d0 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 63      /* Set the c
1f9e0 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
1f9f0 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e  on state to TRAN
1fa00 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63  S_NONE and unloc
1fa10 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 70 61  k the .    ** pa
1fa20 67 65 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c  ger if this call
1fa30 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79   closed the only
1fa40 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
1fa50 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a  ransaction.  */.
1fa60 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d      p->inTrans =
1fa70 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20   TRANS_NONE;.   
1fa80 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
1fa90 75 73 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a  used(pBt);.  }..
1faa0 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
1fab0 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  (p);.}../*.** Co
1fac0 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
1fad0 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69  tion currently i
1fae0 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a  n progress..**.*
1faf0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
1fb00 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 73 65  mplements the se
1fb10 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 61 20  cond phase of a 
1fb20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20  2-phase commit. 
1fb30 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42   The.** sqlite3B
1fb40 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
1fb50 6e 65 28 29 20 72 6f 75 74 69 6e 65 20 64 6f 65  ne() routine doe
1fb60 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61 73  s the first phas
1fb70 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20  e and should.** 
1fb80 62 65 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f 72  be invoked prior
1fb90 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   to calling this
1fba0 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 73   routine.  The s
1fbb0 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
1fbc0 74 50 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20 72  tPhaseOne().** r
1fbd0 6f 75 74 69 6e 65 20 64 69 64 20 61 6c 6c 20 74  outine did all t
1fbe0 68 65 20 77 6f 72 6b 20 6f 66 20 77 72 69 74 69  he work of writi
1fbf0 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  ng information o
1fc00 75 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 66  ut to disk and f
1fc10 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63  lushing the.** c
1fc20 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68 61 74 20  ontents so that 
1fc30 74 68 65 79 20 61 72 65 20 77 72 69 74 74 65 6e  they are written
1fc40 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 70   onto the disk p
1fc50 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20 74 68 69  latter.  All thi
1fc60 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61 73  s.** routine has
1fc70 20 74 6f 20 64 6f 20 69 73 20 64 65 6c 65 74 65   to do is delete
1fc80 20 6f 72 20 74 72 75 6e 63 61 74 65 20 6f 72 20   or truncate or 
1fc90 7a 65 72 6f 20 74 68 65 20 68 65 61 64 65 72 20  zero the header 
1fca0 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65 20 72 6f  in the.** the ro
1fcb0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 28  llback journal (
1fcc0 77 68 69 63 68 20 63 61 75 73 65 73 20 74 68 65  which causes the
1fcd0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20   transaction to 
1fce0 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20 64  commit) and.** d
1fcf0 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a  rop locks..**.**
1fd00 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 6e   Normally, if an
1fd10 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
1fd20 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 6c 61  ile the pager la
1fd30 79 65 72 20 69 73 20 61 74 74 65 6d 70 74 69 6e  yer is attemptin
1fd40 67 20 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c 69 7a  g to .** finaliz
1fd50 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  e the underlying
1fd60 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
1fd70 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
1fd80 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 61 6e  urns an error an
1fd90 64 0a 2a 2a 20 74 68 65 20 75 70 70 65 72 20 6c  d.** the upper l
1fda0 61 79 65 72 20 77 69 6c 6c 20 61 74 74 65 6d 70  ayer will attemp
1fdb0 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 48 6f  t a rollback. Ho
1fdc0 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 73 65  wever, if the se
1fdd0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a  cond argument.**
1fde0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65   is non-zero the
1fdf0 6e 20 74 68 69 73 20 62 2d 74 72 65 65 20 74 72  n this b-tree tr
1fe00 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 70 61 72  ansaction is par
1fe10 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c  t of a multi-fil
1fe20 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  e .** transactio
1fe30 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  n. In this case,
1fe40 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1fe50 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
1fe60 6e 20 63 6f 6d 6d 69 74 74 65 64 20 0a 2a 2a 20  n committed .** 
1fe70 28 62 79 20 64 65 6c 65 74 69 6e 67 20 61 20 6d  (by deleting a m
1fe80 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1fe90 6c 65 29 20 61 6e 64 20 74 68 65 20 63 61 6c 6c  le) and the call
1fea0 65 72 20 77 69 6c 6c 20 69 67 6e 6f 72 65 20 74  er will ignore t
1feb0 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
1fec0 73 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 20 53  s return code. S
1fed0 6f 2c 20 65 76 65 6e 20 69 66 20 61 6e 20 65 72  o, even if an er
1fee0 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 74 68  ror occurs in th
1fef0 65 20 70 61 67 65 72 20 6c 61 79 65 72 2c 0a 2a  e pager layer,.*
1ff00 2a 20 72 65 73 65 74 20 74 68 65 20 62 2d 74 72  * reset the b-tr
1ff10 65 65 20 6f 62 6a 65 63 74 73 20 69 6e 74 65 72  ee objects inter
1ff20 6e 61 6c 20 73 74 61 74 65 20 74 6f 20 69 6e 64  nal state to ind
1ff30 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 77  icate that the w
1ff40 72 69 74 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  rite.** transact
1ff50 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63 6c 6f  ion has been clo
1ff60 73 65 64 2e 20 54 68 69 73 20 69 73 20 71 75 69  sed. This is qui
1ff70 74 65 20 73 61 66 65 2c 20 61 73 20 74 68 65 20  te safe, as the 
1ff80 70 61 67 65 72 20 77 69 6c 6c 20 68 61 76 65 0a  pager will have.
1ff90 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 65 64 20  ** transitioned 
1ffa0 74 6f 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  to the error sta
1ffb0 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  te..**.** This w
1ffc0 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20  ill release the 
1ffd0 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  write lock on th
1ffe0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1fff0 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72    If there.** ar
20000 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73  e no active curs
20010 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c  ors, it also rel
20020 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c  eases the read l
20030 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ock..*/.int sqli
20040 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
20050 61 73 65 54 77 6f 28 42 74 72 65 65 20 2a 70 2c  aseTwo(Btree *p,
20060 20 69 6e 74 20 62 43 6c 65 61 6e 75 70 29 7b 0a   int bCleanup){.
20070 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
20080 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 20  s==TRANS_NONE ) 
20090 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
200a0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
200b0 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65  Enter(p);.  btre
200c0 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a  eIntegrity(p);..
200d0 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64    /* If the hand
200e0 6c 65 20 68 61 73 20 61 20 77 72 69 74 65 2d 74  le has a write-t
200f0 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c  ransaction open,
20100 20 63 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72   commit the shar
20110 65 64 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20  ed-btrees .  ** 
20120 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
20130 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73  set the shared s
20140 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45  tate to TRANS_RE
20150 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  AD..  */.  if( p
20160 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
20170 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e  _WRITE ){.    in
20180 74 20 72 63 3b 0a 20 20 20 20 42 74 53 68 61 72  t rc;.    BtShar
20190 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
201a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
201b0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
201c0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
201d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
201e0 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30  ->nTransaction>0
201f0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
20200 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
20210 68 61 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61  haseTwo(pBt->pPa
20220 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
20230 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  !=SQLITE_OK && b
20240 43 6c 65 61 6e 75 70 3d 3d 30 20 29 7b 0a 20 20  Cleanup==0 ){.  
20250 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
20260 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
20270 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
20280 0a 20 20 20 20 70 2d 3e 69 44 61 74 61 56 65 72  .    p->iDataVer
20290 73 69 6f 6e 2d 2d 3b 20 20 2f 2a 20 43 6f 6d 70  sion--;  /* Comp
202a0 65 6e 73 61 74 65 20 66 6f 72 20 70 50 61 67 65  ensate for pPage
202b0 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2b  r->iDataVersion+
202c0 2b 3b 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 69  +; */.    pBt->i
202d0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
202e0 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 62  RANS_READ;.    b
202f0 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74  treeClearHasCont
20300 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20  ent(pBt);.  }.. 
20310 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63   btreeEndTransac
20320 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74  tion(p);.  sqlit
20330 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
20340 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
20350 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f  _OK;.}../*.** Do
20360 20 62 6f 74 68 20 70 68 61 73 65 73 20 6f 66 20   both phases of 
20370 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74  a commit..*/.int
20380 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
20390 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  mit(Btree *p){. 
203a0 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
203b0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
203c0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
203d0 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
203e0 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20  ne(p, 0);.  if( 
203f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
20400 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
20410 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
20420 65 54 77 6f 28 70 2c 20 30 29 3b 0a 20 20 7d 0a  eTwo(p, 0);.  }.
20430 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
20440 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
20450 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
20460 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
20470 74 68 65 20 73 74 61 74 65 20 74 6f 20 43 55 52  the state to CUR
20480 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20 74 68  SOR_FAULT and th
20490 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20  e error.** code 
204a0 74 6f 20 65 72 72 43 6f 64 65 20 66 6f 72 20 65  to errCode for e
204b0 76 65 72 79 20 63 75 72 73 6f 72 20 6f 6e 20 61  very cursor on a
204c0 6e 79 20 42 74 53 68 61 72 65 64 20 74 68 61 74  ny BtShared that
204d0 20 70 42 74 72 65 65 0a 2a 2a 20 72 65 66 65 72   pBtree.** refer
204e0 65 6e 63 65 73 2e 20 20 4f 72 20 69 66 20 74 68  ences.  Or if th
204f0 65 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c 61 67  e writeOnly flag
20500 20 69 73 20 73 65 74 20 74 6f 20 31 2c 20 74 68   is set to 1, th
20510 65 6e 20 6f 6e 6c 79 0a 2a 2a 20 74 72 69 70 20  en only.** trip 
20520 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 6e  write cursors an
20530 64 20 6c 65 61 76 65 20 72 65 61 64 20 63 75 72  d leave read cur
20540 73 6f 72 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a  sors unchanged..
20550 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75 72 73  **.** Every curs
20560 6f 72 20 69 73 20 61 20 63 61 6e 64 69 64 61 74  or is a candidat
20570 65 20 74 6f 20 62 65 20 74 72 69 70 70 65 64 2c  e to be tripped,
20580 20 69 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f   including curso
20590 72 73 0a 2a 2a 20 74 68 61 74 20 62 65 6c 6f 6e  rs.** that belon
205a0 67 20 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62  g to other datab
205b0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
205c0 74 68 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62  that happen to b
205d0 65 0a 2a 2a 20 73 68 61 72 69 6e 67 20 74 68 65  e.** sharing the
205e0 20 63 61 63 68 65 20 77 69 74 68 20 70 42 74 72   cache with pBtr
205f0 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ee..**.** This r
20600 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c  outine gets call
20610 65 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61  ed when a rollba
20620 63 6b 20 6f 63 63 75 72 73 2e 20 49 66 20 74 68  ck occurs. If th
20630 65 20 77 72 69 74 65 4f 6e 6c 79 0a 2a 2a 20 66  e writeOnly.** f
20640 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65  lag is true, the
20650 6e 20 6f 6e 6c 79 20 77 72 69 74 65 2d 63 75 72  n only write-cur
20660 73 6f 72 73 20 6e 65 65 64 20 62 65 20 74 72 69  sors need be tri
20670 70 70 65 64 20 2d 20 72 65 61 64 2d 6f 6e 6c 79  pped - read-only
20680 0a 2a 2a 20 63 75 72 73 6f 72 73 20 73 61 76 65  .** cursors save
20690 20 74 68 65 69 72 20 63 75 72 72 65 6e 74 20 70   their current p
206a0 6f 73 69 74 69 6f 6e 73 20 73 6f 20 74 68 61 74  ositions so that
206b0 20 74 68 65 79 20 6d 61 79 20 63 6f 6e 74 69 6e   they may contin
206c0 75 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  ue .** following
206d0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f   the rollback. O
206e0 72 2c 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20  r, if writeOnly 
206f0 69 73 20 66 61 6c 73 65 2c 20 61 6c 6c 20 63 75  is false, all cu
20700 72 73 6f 72 73 20 61 72 65 20 0a 2a 2a 20 74 72  rsors are .** tr
20710 69 70 70 65 64 2e 20 49 6e 20 67 65 6e 65 72 61  ipped. In genera
20720 6c 2c 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20  l, writeOnly is 
20730 66 61 6c 73 65 20 69 66 20 74 68 65 20 74 72 61  false if the tra
20740 6e 73 61 63 74 69 6f 6e 20 62 65 69 6e 67 0a 2a  nsaction being.*
20750 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6d 6f  * rolled back mo
20760 64 69 66 69 65 64 20 74 68 65 20 64 61 74 61 62  dified the datab
20770 61 73 65 20 73 63 68 65 6d 61 2e 20 49 6e 20 74  ase schema. In t
20780 68 69 73 20 63 61 73 65 20 62 2d 74 72 65 65 20  his case b-tree 
20790 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 73 20 6d 61  root.** pages ma
207a0 79 20 62 65 20 6d 6f 76 65 64 20 6f 72 20 64 65  y be moved or de
207b0 6c 65 74 65 64 20 66 72 6f 6d 20 74 68 65 20 64  leted from the d
207c0 61 74 61 62 61 73 65 20 61 6c 74 6f 67 65 74 68  atabase altogeth
207d0 65 72 2c 20 6d 61 6b 69 6e 67 0a 2a 2a 20 69 74  er, making.** it
207e0 20 75 6e 73 61 66 65 20 66 6f 72 20 72 65 61 64   unsafe for read
207f0 20 63 75 72 73 6f 72 73 20 74 6f 20 63 6f 6e 74   cursors to cont
20800 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  inue..**.** If t
20810 68 65 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c 61  he writeOnly fla
20820 67 20 69 73 20 74 72 75 65 20 61 6e 64 20 61 6e  g is true and an
20830 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
20840 74 65 72 65 64 20 77 68 69 6c 65 20 0a 2a 2a 20  tered while .** 
20850 73 61 76 69 6e 67 20 74 68 65 20 63 75 72 72 65  saving the curre
20860 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 61  nt position of a
20870 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f   read-only curso
20880 72 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73 2c 20  r, all cursors, 
20890 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c  .** including al
208a0 6c 20 72 65 61 64 2d 63 75 72 73 6f 72 73 20 61  l read-cursors a
208b0 72 65 20 74 72 69 70 70 65 64 2e 0a 2a 2a 0a 2a  re tripped..**.*
208c0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
208d0 65 74 75 72 6e 65 64 20 69 66 20 73 75 63 63 65  eturned if succe
208e0 73 73 66 75 6c 2c 20 6f 72 20 69 66 20 61 6e 20  ssful, or if an 
208f0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
20900 6c 65 0a 2a 2a 20 73 61 76 69 6e 67 20 61 20 63  le.** saving a c
20910 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2c 20  ursor position, 
20920 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
20930 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  code..*/.int sql
20940 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c  ite3BtreeTripAll
20950 43 75 72 73 6f 72 73 28 42 74 72 65 65 20 2a 70  Cursors(Btree *p
20960 42 74 72 65 65 2c 20 69 6e 74 20 65 72 72 43 6f  Btree, int errCo
20970 64 65 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e 6c  de, int writeOnl
20980 79 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  y){.  BtCursor *
20990 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  p;.  int rc = SQ
209a0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
209b0 72 74 28 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d  rt( (writeOnly==
209c0 30 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79 3d 3d  0 || writeOnly==
209d0 31 29 20 26 26 20 42 54 43 46 5f 57 72 69 74 65  1) && BTCF_Write
209e0 46 6c 61 67 3d 3d 31 20 29 3b 0a 20 20 69 66 28  Flag==1 );.  if(
209f0 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 73   pBtree ){.    s
20a00 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
20a10 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 66 6f  (pBtree);.    fo
20a20 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d  r(p=pBtree->pBt-
20a30 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
20a40 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
20a50 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 66 28  int i;.      if(
20a60 20 77 72 69 74 65 4f 6e 6c 79 20 26 26 20 28 70   writeOnly && (p
20a70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
20a80 46 5f 57 72 69 74 65 46 6c 61 67 29 3d 3d 30 20  F_WriteFlag)==0 
20a90 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
20aa0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
20ab0 5f 56 41 4c 49 44 20 7c 7c 20 70 2d 3e 65 53 74  _VALID || p->eSt
20ac0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50  ate==CURSOR_SKIP
20ad0 4e 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20  NEXT ){.        
20ae0 20 20 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f    rc = saveCurso
20af0 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20  rPosition(p);.  
20b00 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
20b10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20b20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 29 73           (void)s
20b30 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41  qlite3BtreeTripA
20b40 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 72 65 65  llCursors(pBtree
20b50 2c 20 72 63 2c 20 30 29 3b 0a 20 20 20 20 20 20  , rc, 0);.      
20b60 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
20b70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
20b80 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
20b90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
20ba0 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28  treeClearCursor(
20bb0 70 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  p);.        p->e
20bc0 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 46  State = CURSOR_F
20bd0 41 55 4c 54 3b 0a 20 20 20 20 20 20 20 20 70 2d  AULT;.        p-
20be0 3e 73 6b 69 70 4e 65 78 74 20 3d 20 65 72 72 43  >skipNext = errC
20bf0 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ode;.      }.   
20c00 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70     for(i=0; i<=p
20c10 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  ->iPage; i++){. 
20c20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
20c30 67 65 28 70 2d 3e 61 70 50 61 67 65 5b 69 5d 29  ge(p->apPage[i])
20c40 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70 50  ;.        p->apP
20c50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  age[i] = 0;.    
20c60 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
20c70 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
20c80 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72  pBtree);.  }.  r
20c90 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
20ca0 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20  ** Rollback the 
20cb0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70  transaction in p
20cc0 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49  rogress..**.** I
20cd0 66 20 74 72 69 70 43 6f 64 65 20 69 73 20 6e 6f  f tripCode is no
20ce0 74 20 53 51 4c 49 54 45 5f 4f 4b 20 74 68 65 6e  t SQLITE_OK then
20cf0 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65   cursors will be
20d00 20 69 6e 76 61 6c 69 64 61 74 65 64 20 28 74 72   invalidated (tr
20d10 69 70 70 65 64 29 2e 0a 2a 2a 20 4f 6e 6c 79 20  ipped)..** Only 
20d20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 72  write cursors ar
20d30 65 20 74 72 69 70 70 65 64 20 69 66 20 77 72 69  e tripped if wri
20d40 74 65 4f 6e 6c 79 20 69 73 20 74 72 75 65 20 62  teOnly is true b
20d50 75 74 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61  ut all cursors a
20d60 72 65 0a 2a 2a 20 74 72 69 70 70 65 64 20 69 66  re.** tripped if
20d70 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61   writeOnly is fa
20d80 6c 73 65 2e 20 20 41 6e 79 20 61 74 74 65 6d 70  lse.  Any attemp
20d90 74 20 74 6f 20 75 73 65 0a 2a 2a 20 61 20 74 72  t to use.** a tr
20da0 69 70 70 65 64 20 63 75 72 73 6f 72 20 77 69 6c  ipped cursor wil
20db0 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 65  l result in an e
20dc0 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rror..**.** This
20dd0 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68   will release th
20de0 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
20df0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
20e00 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  e.  If there.** 
20e10 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75  are no active cu
20e20 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72  rsors, it also r
20e30 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64  eleases the read
20e40 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   lock..*/.int sq
20e50 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
20e60 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ck(Btree *p, int
20e70 20 74 72 69 70 43 6f 64 65 2c 20 69 6e 74 20 77   tripCode, int w
20e80 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74  riteOnly){.  int
20e90 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
20ea0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
20eb0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
20ec0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 77 72 69  ;..  assert( wri
20ed0 74 65 4f 6e 6c 79 3d 3d 31 20 7c 7c 20 77 72 69  teOnly==1 || wri
20ee0 74 65 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 61  teOnly==0 );.  a
20ef0 73 73 65 72 74 28 20 74 72 69 70 43 6f 64 65 3d  ssert( tripCode=
20f00 3d 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f  =SQLITE_ABORT_RO
20f10 4c 4c 42 41 43 4b 20 7c 7c 20 74 72 69 70 43 6f  LLBACK || tripCo
20f20 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  de==SQLITE_OK );
20f30 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
20f40 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 74  nter(p);.  if( t
20f50 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  ripCode==SQLITE_
20f60 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 74  OK ){.    rc = t
20f70 72 69 70 43 6f 64 65 20 3d 20 73 61 76 65 41 6c  ripCode = saveAl
20f80 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c  lCursors(pBt, 0,
20f90 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
20fa0 29 20 77 72 69 74 65 4f 6e 6c 79 20 3d 20 30 3b  ) writeOnly = 0;
20fb0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
20fc0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
20fd0 7d 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64 65  }.  if( tripCode
20fe0 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 20   ){.    int rc2 
20ff0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72  = sqlite3BtreeTr
21000 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20  ipAllCursors(p, 
21010 74 72 69 70 43 6f 64 65 2c 20 77 72 69 74 65 4f  tripCode, writeO
21020 6e 6c 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74  nly);.    assert
21030 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
21040 7c 7c 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d 30  || (writeOnly==0
21050 20 26 26 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f   && rc2==SQLITE_
21060 4f 4b 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72  OK) );.    if( r
21070 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  c2!=SQLITE_OK ) 
21080 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 20 20  rc = rc2;.  }.  
21090 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
210a0 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  );..  if( p->inT
210b0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
210c0 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32  E ){.    int rc2
210d0 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 54  ;..    assert( T
210e0 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d  RANS_WRITE==pBt-
210f0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  >inTransaction )
21100 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69  ;.    rc2 = sqli
21110 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
21120 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
21130 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49     if( rc2!=SQLI
21140 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
21150 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a  c = rc2;.    }..
21160 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62      /* The rollb
21170 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73  ack may have des
21180 74 72 6f 79 65 64 20 74 68 65 20 70 50 61 67 65  troyed the pPage
21190 31 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20  1->aData value. 
211a0 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20   So.    ** call 
211b0 62 74 72 65 65 47 65 74 50 61 67 65 28 29 20 6f  btreeGetPage() o
211c0 6e 20 70 61 67 65 20 31 20 61 67 61 69 6e 20 74  n page 1 again t
211d0 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75  o make.    ** su
211e0 72 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61  re pPage1->aData
211f0 20 69 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c   is set correctl
21200 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 74  y. */.    if( bt
21210 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
21220 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d  1, &pPage1, 0)==
21230 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21240 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 67     int nPage = g
21250 65 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29  et4byte(28+(u8*)
21260 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a  pPage1->aData);.
21270 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
21280 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20  nPage==0 );.    
21290 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29    if( nPage==0 )
212a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
212b0 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
212c0 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20  er, &nPage);.   
212d0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 42 74     testcase( pBt
212e0 2d 3e 6e 50 61 67 65 21 3d 6e 50 61 67 65 20 29  ->nPage!=nPage )
212f0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61  ;.      pBt->nPa
21300 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20  ge = nPage;.    
21310 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
21320 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  age1);.    }.   
21330 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 56 61   assert( countVa
21340 6c 69 64 43 75 72 73 6f 72 73 28 70 42 74 2c 20  lidCursors(pBt, 
21350 31 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74  1)==0 );.    pBt
21360 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
21370 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
21380 20 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43    btreeClearHasC
21390 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d  ontent(pBt);.  }
213a0 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e  ..  btreeEndTran
213b0 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71  saction(p);.  sq
213c0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
213d0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
213e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20  .}../*.** Start 
213f0 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74  a statement subt
21400 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20  ransaction. The 
21410 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  subtransaction c
21420 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20  an be rolled.** 
21430 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74  back independent
21440 6c 79 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 74  ly of the main t
21450 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59 6f 75 20  ransaction. You 
21460 6d 75 73 74 20 73 74 61 72 74 20 61 20 74 72 61  must start a tra
21470 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 62 65 66  nsaction .** bef
21480 6f 72 65 20 73 74 61 72 74 69 6e 67 20 61 20 73  ore starting a s
21490 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  ubtransaction. T
214a0 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  he subtransactio
214b0 6e 20 69 73 20 65 6e 64 65 64 20 61 75 74 6f 6d  n is ended autom
214c0 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 69 66 20  atically .** if 
214d0 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63  the main transac
214e0 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f 72 20  tion commits or 
214f0 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  rolls back..**.*
21500 2a 20 53 74 61 74 65 6d 65 6e 74 20 73 75 62 74  * Statement subt
21510 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20  ransactions are 
21520 75 73 65 64 20 61 72 6f 75 6e 64 20 69 6e 64 69  used around indi
21530 76 69 64 75 61 6c 20 53 51 4c 20 73 74 61 74 65  vidual SQL state
21540 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61 72  ments.** that ar
21550 65 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68  e contained with
21560 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d  in a BEGIN...COM
21570 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61  MIT block.  If a
21580 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65   constraint.** e
21590 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68  rror occurs with
215a0 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
215b0 2c 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20  , the effect of 
215c0 74 68 61 74 20 6f 6e 65 20 73 74 61 74 65 6d 65  that one stateme
215d0 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c  nt.** can be rol
215e0 6c 65 64 20 62 61 63 6b 20 77 69 74 68 6f 75 74  led back without
215f0 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62   having to rollb
21600 61 63 6b 20 74 68 65 20 65 6e 74 69 72 65 20 74  ack the entire t
21610 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
21620 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20 73 75  * A statement su
21630 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  b-transaction is
21640 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20   implemented as 
21650 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76  an anonymous sav
21660 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a 20 76  epoint. The.** v
21670 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74  alue passed as t
21680 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65  he second parame
21690 74 65 72 20 69 73 20 74 68 65 20 74 6f 74 61 6c  ter is the total
216a0 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70   number of savep
216b0 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64  oints,.** includ
216c0 69 6e 67 20 74 68 65 20 6e 65 77 20 61 6e 6f 6e  ing the new anon
216d0 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2c  ymous savepoint,
216e0 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 42 2d 54   open on the B-T
216f0 72 65 65 2e 20 69 2e 65 2e 20 69 66 20 74 68 65  ree. i.e. if the
21700 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74  re.** are no act
21710 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61  ive savepoints a
21720 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73 74 61 74  nd no other stat
21730 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f  ement-transactio
21740 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74 61  ns open,.** iSta
21750 74 65 6d 65 6e 74 20 69 73 20 31 2e 20 54 68 69  tement is 1. Thi
21760 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65  s anonymous save
21770 70 6f 69 6e 74 20 63 61 6e 20 62 65 20 72 65 6c  point can be rel
21780 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  eased or rolled 
21790 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 74 68  back.** using th
217a0 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61  e sqlite3BtreeSa
217b0 76 65 70 6f 69 6e 74 28 29 20 66 75 6e 63 74 69  vepoint() functi
217c0 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
217d0 65 33 42 74 72 65 65 42 65 67 69 6e 53 74 6d 74  e3BtreeBeginStmt
217e0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69  (Btree *p, int i
217f0 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20 20 69 6e  Statement){.  in
21800 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
21810 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
21820 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
21830 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74  ter(p);.  assert
21840 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
21850 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61  ANS_WRITE );.  a
21860 73 73 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73  ssert( (pBt->bts
21870 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44  Flags & BTS_READ
21880 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 20 20 61  _ONLY)==0 );.  a
21890 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e  ssert( iStatemen
218a0 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  t>0 );.  assert(
218b0 20 69 53 74 61 74 65 6d 65 6e 74 3e 70 2d 3e 64   iStatement>p->d
218c0 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29 3b  b->nSavepoint );
218d0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
218e0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
218f0 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
21900 2f 2a 20 41 74 20 74 68 65 20 70 61 67 65 72 20  /* At the pager 
21910 6c 65 76 65 6c 2c 20 61 20 73 74 61 74 65 6d 65  level, a stateme
21920 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
21930 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20 77 69  s a savepoint wi
21940 74 68 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78  th.  ** an index
21950 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 61 6c   greater than al
21960 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 63 72 65  l savepoints cre
21970 61 74 65 64 20 65 78 70 6c 69 63 69 74 6c 79 20  ated explicitly 
21980 75 73 69 6e 67 0a 20 20 2a 2a 20 53 51 4c 20 73  using.  ** SQL s
21990 74 61 74 65 6d 65 6e 74 73 2e 20 49 74 20 69 73  tatements. It is
219a0 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f 70 65 6e   illegal to open
219b0 2c 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c  , release or rol
219c0 6c 62 61 63 6b 20 61 6e 79 0a 20 20 2a 2a 20 73  lback any.  ** s
219d0 75 63 68 20 73 61 76 65 70 6f 69 6e 74 73 20 77  uch savepoints w
219e0 68 69 6c 65 20 74 68 65 20 73 74 61 74 65 6d 65  hile the stateme
219f0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  nt transaction s
21a00 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69  avepoint is acti
21a10 76 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ve..  */.  rc = 
21a20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
21a30 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70  Savepoint(pBt->p
21a40 50 61 67 65 72 2c 20 69 53 74 61 74 65 6d 65 6e  Pager, iStatemen
21a50 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  t);.  sqlite3Btr
21a60 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
21a70 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
21a80 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67  * The second arg
21a90 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
21aa0 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20 61  nction, op, is a
21ab0 6c 77 61 79 73 20 53 41 56 45 50 4f 49 4e 54 5f  lways SAVEPOINT_
21ac0 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20 53  ROLLBACK.** or S
21ad0 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
21ae0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
21af0 65 69 74 68 65 72 20 72 65 6c 65 61 73 65 73 20  either releases 
21b00 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68  or rolls back th
21b10 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 69  e.** savepoint i
21b20 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61 72  dentified by par
21b30 61 6d 65 74 65 72 20 69 53 61 76 65 70 6f 69 6e  ameter iSavepoin
21b40 74 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  t, depending on 
21b50 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66  the value .** of
21b60 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61   op..**.** Norma
21b70 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e 74 20  lly, iSavepoint 
21b80 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
21b90 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f  or equal to zero
21ba0 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 6f 70  . However, if op
21bb0 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54   is.** SAVEPOINT
21bc0 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20  _ROLLBACK, then 
21bd0 69 53 61 76 65 70 6f 69 6e 74 20 6d 61 79 20 61  iSavepoint may a
21be0 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74 68  lso be -1. In th
21bf0 69 73 20 63 61 73 65 20 74 68 65 20 0a 2a 2a 20  is case the .** 
21c00 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
21c10 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69  entire transacti
21c20 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20 62 61  on are rolled ba
21c30 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69 66 66  ck. This is diff
21c40 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61 20  erent.** from a 
21c50 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63 74 69  normal transacti
21c60 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20  on rollback, as 
21c70 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72 65 6c  no locks are rel
21c80 65 61 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a  eased and the.**
21c90 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 65 6d   transaction rem
21ca0 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e  ains open..*/.in
21cb0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61  t sqlite3BtreeSa
21cc0 76 65 70 6f 69 6e 74 28 42 74 72 65 65 20 2a 70  vepoint(Btree *p
21cd0 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53  , int op, int iS
21ce0 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74  avepoint){.  int
21cf0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
21d00 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 69  .  if( p && p->i
21d10 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
21d20 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61  ITE ){.    BtSha
21d30 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
21d40 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f  t;.    assert( o
21d50 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  p==SAVEPOINT_REL
21d60 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45  EASE || op==SAVE
21d70 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29  POINT_ROLLBACK )
21d80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 53  ;.    assert( iS
21d90 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28  avepoint>=0 || (
21da0 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20 26  iSavepoint==-1 &
21db0 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  & op==SAVEPOINT_
21dc0 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20 20  ROLLBACK) );.   
21dd0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
21de0 65 72 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20  er(p);.    rc = 
21df0 73 71 6c 69 74 65 33 50 61 67 65 72 53 61 76 65  sqlite3PagerSave
21e00 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  point(pBt->pPage
21e10 72 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e  r, op, iSavepoin
21e20 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  t);.    if( rc==
21e30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21e40 20 20 20 69 66 28 20 69 53 61 76 65 70 6f 69 6e     if( iSavepoin
21e50 74 3c 30 20 26 26 20 28 70 42 74 2d 3e 62 74 73  t<0 && (pBt->bts
21e60 46 6c 61 67 73 20 26 20 42 54 53 5f 49 4e 49 54  Flags & BTS_INIT
21e70 49 41 4c 4c 59 5f 45 4d 50 54 59 29 21 3d 30 20  IALLY_EMPTY)!=0 
21e80 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  ){.        pBt->
21e90 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  nPage = 0;.     
21ea0 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 65   }.      rc = ne
21eb0 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a  wDatabase(pBt);.
21ec0 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
21ed0 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 20 2b   = get4byte(28 +
21ee0 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
21ef0 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ata);..      /* 
21f00 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  The database siz
21f10 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e  e was written in
21f20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 32 38  to the offset 28
21f30 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 0a 20   of the header. 
21f40 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65       ** when the
21f50 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61   transaction sta
21f60 72 74 65 64 2c 20 73 6f 20 77 65 20 6b 6e 6f 77  rted, so we know
21f70 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 20   that the value 
21f80 61 74 20 6f 66 66 73 65 74 0a 20 20 20 20 20 20  at offset.      
21f90 2a 2a 20 32 38 20 69 73 20 6e 6f 6e 7a 65 72 6f  ** 28 is nonzero
21fa0 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
21fb0 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20  t( pBt->nPage>0 
21fc0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
21fd0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
21fe0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
21ff0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  rc;.}../*.** Cre
22000 61 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72  ate a new cursor
22010 20 66 6f 72 20 74 68 65 20 42 54 72 65 65 20 77   for the BTree w
22020 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20  hose root is on 
22030 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54 61 62  the page.** iTab
22040 6c 65 2e 20 49 66 20 61 20 72 65 61 64 2d 6f 6e  le. If a read-on
22050 6c 79 20 63 75 72 73 6f 72 20 69 73 20 72 65 71  ly cursor is req
22060 75 65 73 74 65 64 2c 20 69 74 20 69 73 20 61 73  uested, it is as
22070 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68  sumed that.** th
22080 65 20 63 61 6c 6c 65 72 20 61 6c 72 65 61 64 79  e caller already
22090 20 68 61 73 20 61 74 20 6c 65 61 73 74 20 61 20   has at least a 
220a0 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61  read-only transa
220b0 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e  ction open.** on
220c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6c   the database al
220d0 72 65 61 64 79 2e 20 49 66 20 61 20 77 72 69 74  ready. If a writ
220e0 65 2d 63 75 72 73 6f 72 20 69 73 20 72 65 71 75  e-cursor is requ
220f0 65 73 74 65 64 2c 20 74 68 65 6e 0a 2a 2a 20 74  ested, then.** t
22100 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61 73 73  he caller is ass
22110 75 6d 65 64 20 74 6f 20 68 61 76 65 20 61 6e 20  umed to have an 
22120 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73  open write trans
22130 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  action..**.** If
22140 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e   wrFlag==0, then
22150 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20   the cursor can 
22160 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 66 6f 72  only be used for
22170 20 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49 66 20   reading..** If 
22180 77 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65 6e 20  wrFlag==1, then 
22190 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 62  the cursor can b
221a0 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69  e used for readi
221b0 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77 72 69  ng or for.** wri
221c0 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63 6f  ting if other co
221d0 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72 69  nditions for wri
221e0 74 69 6e 67 20 61 72 65 20 61 6c 73 6f 20 6d 65  ting are also me
221f0 74 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61 72 65  t.  These.** are
22200 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20   the conditions 
22210 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65 74  that must be met
22220 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 77 72   in order for wr
22230 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 61  iting to.** be a
22240 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a  llowed:.**.** 1:
22250 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73    The cursor mus
22260 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e  t have been open
22270 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d  ed with wrFlag==
22280 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65  1.**.** 2:  Othe
22290 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
222a0 63 74 69 6f 6e 73 20 74 68 61 74 20 73 68 61 72  ctions that shar
222b0 65 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72  e the same pager
222c0 20 63 61 63 68 65 0a 2a 2a 20 20 20 20 20 62 75   cache.**     bu
222d0 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20  t which are not 
222e0 69 6e 20 74 68 65 20 52 45 41 44 5f 55 4e 43 4f  in the READ_UNCO
222f0 4d 4d 49 54 54 45 44 20 73 74 61 74 65 20 6d 61  MMITTED state ma
22300 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20  y not have.**   
22310 20 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 77    cursors open w
22320 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e  ith wrFlag==0 on
22330 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e   the same table.
22340 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 20    Otherwise.**  
22350 20 20 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d     the changes m
22360 61 64 65 20 62 79 20 74 68 69 73 20 77 72 69 74  ade by this writ
22370 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 62  e cursor would b
22380 65 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20  e visible to.** 
22390 20 20 20 20 74 68 65 20 72 65 61 64 20 63 75 72      the read cur
223a0 73 6f 72 73 20 69 6e 20 74 68 65 20 6f 74 68 65  sors in the othe
223b0 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
223c0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20  ction..**.** 3: 
223d0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   The database mu
223e0 73 74 20 62 65 20 77 72 69 74 61 62 6c 65 20 28  st be writable (
223f0 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79  not on read-only
22400 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a   media).**.** 4:
22410 20 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20    There must be 
22420 61 6e 20 61 63 74 69 76 65 20 74 72 61 6e 73 61  an active transa
22430 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20  ction..**.** No 
22440 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65  checking is done
22450 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
22460 61 74 20 70 61 67 65 20 69 54 61 62 6c 65 20 72  at page iTable r
22470 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20  eally is the.** 
22480 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62  root page of a b
22490 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20 69 73  -tree.  If it is
224a0 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 63   not, then the c
224b0 75 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a 2a  ursor acquired.*
224c0 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20  * will not work 
224d0 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a  correctly..**.**
224e0 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
224f0 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 42  hat the sqlite3B
22500 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 29  treeCursorZero()
22510 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64   has been called
22520 0a 2a 2a 20 6f 6e 20 70 43 75 72 20 74 6f 20 69  .** on pCur to i
22530 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 65  nitialize the me
22540 6d 6f 72 79 20 73 70 61 63 65 20 70 72 69 6f 72  mory space prior
22550 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69   to invoking thi
22560 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74  s routine..*/.st
22570 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 43 75  atic int btreeCu
22580 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70  rsor(.  Btree *p
22590 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
225a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
225b0 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
225c0 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
225d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225e0 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
225f0 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f  page of table to
22600 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77   open */.  int w
22610 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20  rFlag,          
22620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22630 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e    /* 1 to write.
22640 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a   0 read-only */.
22650 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f    struct KeyInfo
22660 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
22670 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
22680 74 20 61 72 67 20 74 6f 20 63 6f 6d 70 61 72 69  t arg to compari
22690 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  son function */.
226a0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
226b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226c0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
226d0 65 20 66 6f 72 20 6e 65 77 20 63 75 72 73 6f 72  e for new cursor
226e0 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65   */.){.  BtShare
226f0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
22700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22710 2f 2a 20 53 68 61 72 65 64 20 62 2d 74 72 65 65  /* Shared b-tree
22720 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 43   handle */.  BtC
22730 75 72 73 6f 72 20 2a 70 58 3b 20 20 20 20 20 20  ursor *pX;      
22740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22750 20 20 20 20 2f 2a 20 4c 6f 6f 70 69 6e 67 20 6f      /* Looping o
22760 76 65 72 20 6f 74 68 65 72 20 61 6c 6c 20 63 75  ver other all cu
22770 72 73 6f 72 73 20 2a 2f 0a 0a 20 20 61 73 73 65  rsors */..  asse
22780 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
22790 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
227a0 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61  .  assert( wrFla
227b0 67 3d 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20  g==0 .       || 
227c0 77 72 46 6c 61 67 3d 3d 42 54 52 45 45 5f 57 52  wrFlag==BTREE_WR
227d0 43 53 52 20 0a 20 20 20 20 20 20 20 7c 7c 20 77  CSR .       || w
227e0 72 46 6c 61 67 3d 3d 28 42 54 52 45 45 5f 57 52  rFlag==(BTREE_WR
227f0 43 53 52 7c 42 54 52 45 45 5f 46 4f 52 44 45 4c  CSR|BTREE_FORDEL
22800 45 54 45 29 20 0a 20 20 29 3b 0a 0a 20 20 2f 2a  ETE) .  );..  /*
22810 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
22820 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73  ssert statements
22830 20 76 65 72 69 66 79 20 74 68 61 74 20 69 66 20   verify that if 
22840 74 68 69 73 20 69 73 20 61 20 73 68 61 72 61 62  this is a sharab
22850 6c 65 20 0a 20 20 2a 2a 20 62 2d 74 72 65 65 20  le .  ** b-tree 
22860 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 63 6f  database, the co
22870 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64  nnection is hold
22880 69 6e 67 20 74 68 65 20 72 65 71 75 69 72 65 64  ing the required
22890 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20   table locks, . 
228a0 20 2a 2a 20 61 6e 64 20 74 68 61 74 20 6e 6f 20   ** and that no 
228b0 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
228c0 20 68 61 73 20 61 6e 79 20 6f 70 65 6e 20 63 75   has any open cu
228d0 72 73 6f 72 20 74 68 61 74 20 63 6f 6e 66 6c 69  rsor that confli
228e0 63 74 73 20 77 69 74 68 20 0a 20 20 2a 2a 20 74  cts with .  ** t
228f0 68 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20  his lock.  */.  
22900 61 73 73 65 72 74 28 20 68 61 73 53 68 61 72 65  assert( hasShare
22910 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
22920 70 2c 20 69 54 61 62 6c 65 2c 20 70 4b 65 79 49  p, iTable, pKeyI
22930 6e 66 6f 21 3d 30 2c 20 28 77 72 46 6c 61 67 3f  nfo!=0, (wrFlag?
22940 32 3a 31 29 29 20 29 3b 0a 20 20 61 73 73 65 72  2:1)) );.  asser
22950 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20  t( wrFlag==0 || 
22960 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74  !hasReadConflict
22970 73 28 70 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a  s(p, iTable) );.
22980 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61  .  /* Assert tha
22990 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73  t the caller has
229a0 20 6f 70 65 6e 65 64 20 74 68 65 20 72 65 71 75   opened the requ
229b0 69 72 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  ired transaction
229c0 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
229d0 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f  ->inTrans>TRANS_
229e0 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74  NONE );.  assert
229f0 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70  ( wrFlag==0 || p
22a00 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
22a10 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65  _WRITE );.  asse
22a20 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20  rt( pBt->pPage1 
22a30 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  && pBt->pPage1->
22a40 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72  aData );.  asser
22a50 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20  t( wrFlag==0 || 
22a60 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
22a70 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d   BTS_READ_ONLY)=
22a80 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 77 72 46  =0 );..  if( wrF
22a90 6c 61 67 20 29 7b 0a 20 20 20 20 61 6c 6c 6f 63  lag ){.    alloc
22aa0 61 74 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  ateTempSpace(pBt
22ab0 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  );.    if( pBt->
22ac0 70 54 6d 70 53 70 61 63 65 3d 3d 30 20 29 20 72  pTmpSpace==0 ) r
22ad0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
22ae0 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54  EM;.  }.  if( iT
22af0 61 62 6c 65 3d 3d 31 20 26 26 20 62 74 72 65 65  able==1 && btree
22b00 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d  Pagecount(pBt)==
22b10 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
22b20 20 77 72 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20   wrFlag==0 );.  
22b30 20 20 69 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20    iTable = 0;.  
22b40 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74  }..  /* Now that
22b50 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73   no other errors
22b60 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69   can occur, fini
22b70 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68  sh filling in th
22b80 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20  e BtCursor.  ** 
22b90 76 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6c 69  variables and li
22ba0 6e 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e  nk the cursor in
22bb0 74 6f 20 74 68 65 20 42 74 53 68 61 72 65 64 20  to the BtShared 
22bc0 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72  list.  */.  pCur
22bd0 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67  ->pgnoRoot = (Pg
22be0 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70 43 75  no)iTable;.  pCu
22bf0 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20  r->iPage = -1;. 
22c00 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20   pCur->pKeyInfo 
22c10 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43  = pKeyInfo;.  pC
22c20 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a  ur->pBtree = p;.
22c30 20 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42    pCur->pBt = pB
22c40 74 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  t;.  pCur->curFl
22c50 61 67 73 20 3d 20 77 72 46 6c 61 67 20 3f 20 42  ags = wrFlag ? B
22c60 54 43 46 5f 57 72 69 74 65 46 6c 61 67 20 3a 20  TCF_WriteFlag : 
22c70 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 50 61  0;.  pCur->curPa
22c80 67 65 72 46 6c 61 67 73 20 3d 20 77 72 46 6c 61  gerFlags = wrFla
22c90 67 20 3f 20 30 20 3a 20 50 41 47 45 52 5f 47 45  g ? 0 : PAGER_GE
22ca0 54 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 2f 2a  T_READONLY;.  /*
22cb0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 74 77   If there are tw
22cc0 6f 20 6f 72 20 6d 6f 72 65 20 63 75 72 73 6f 72  o or more cursor
22cd0 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 62 74  s on the same bt
22ce0 72 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20 73 75  ree, then all su
22cf0 63 68 0a 20 20 2a 2a 20 63 75 72 73 6f 72 73 20  ch.  ** cursors 
22d00 2a 6d 75 73 74 2a 20 68 61 76 65 20 74 68 65 20  *must* have the 
22d10 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c  BTCF_Multiple fl
22d20 61 67 20 73 65 74 2e 20 2a 2f 0a 20 20 66 6f 72  ag set. */.  for
22d30 28 70 58 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  (pX=pBt->pCursor
22d40 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65  ; pX; pX=pX->pNe
22d50 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 58 2d  xt){.    if( pX-
22d60 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 28 50 67 6e 6f  >pgnoRoot==(Pgno
22d70 29 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  )iTable ){.     
22d80 20 70 58 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d   pX->curFlags |=
22d90 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a   BTCF_Multiple;.
22da0 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46        pCur->curF
22db0 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 4d 75 6c  lags |= BTCF_Mul
22dc0 74 69 70 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d  tiple;.    }.  }
22dd0 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d  .  pCur->pNext =
22de0 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20   pBt->pCursor;. 
22df0 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
22e00 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53  pCur;.  pCur->eS
22e10 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
22e20 56 41 4c 49 44 3b 0a 20 20 72 65 74 75 72 6e 20  VALID;.  return 
22e30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74  SQLITE_OK;.}.int
22e40 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
22e50 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c  sor(.  Btree *p,
22e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e80 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
22e90 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
22ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ec0 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66   /* Root page of
22ed0 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a   table to open *
22ee0 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20  /.  int wrFlag, 
22ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f10 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30  /* 1 to write. 0
22f20 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20   read-only */.  
22f30 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a  struct KeyInfo *
22f40 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20  pKeyInfo,       
22f50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
22f60 69 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d  irst arg to xCom
22f70 70 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75  pare() */.  BtCu
22f80 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20  rsor *pCur      
22f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fa0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
22fb0 20 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72 65   new cursor here
22fc0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
22fd0 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3c 31 20  .  if( iTable<1 
22fe0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
22ff0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
23000 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
23010 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
23020 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72  p);.    rc = btr
23030 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54 61 62  eeCursor(p, iTab
23040 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65 79  le, wrFlag, pKey
23050 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20 20  Info, pCur);.   
23060 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
23070 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ve(p);.  }.  ret
23080 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
23090 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   Return the size
230a0 20 6f 66 20 61 20 42 74 43 75 72 73 6f 72 20 6f   of a BtCursor o
230b0 62 6a 65 63 74 20 69 6e 20 62 79 74 65 73 2e 0a  bject in bytes..
230c0 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65 72  **.** This inter
230d0 66 61 63 65 73 20 69 73 20 6e 65 65 64 65 64 20  faces is needed 
230e0 73 6f 20 74 68 61 74 20 75 73 65 72 73 20 6f 66  so that users of
230f0 20 63 75 72 73 6f 72 73 20 63 61 6e 20 70 72 65   cursors can pre
23100 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66  allocate.** suff
23110 69 63 69 65 6e 74 20 73 74 6f 72 61 67 65 20 74  icient storage t
23120 6f 20 68 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e  o hold a cursor.
23130 20 20 54 68 65 20 42 74 43 75 72 73 6f 72 20 6f    The BtCursor o
23140 62 6a 65 63 74 20 69 73 20 6f 70 61 71 75 65 0a  bject is opaque.
23150 2a 2a 20 74 6f 20 75 73 65 72 73 20 73 6f 20 74  ** to users so t
23160 68 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68  hey cannot do th
23170 65 20 73 69 7a 65 6f 66 28 29 20 74 68 65 6d 73  e sizeof() thems
23180 65 6c 76 65 73 20 2d 20 74 68 65 79 20 6d 75 73  elves - they mus
23190 74 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72  t call.** this r
231a0 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73  outine..*/.int s
231b0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
231c0 72 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72  rSize(void){.  r
231d0 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 73 69 7a  eturn ROUND8(siz
231e0 65 6f 66 28 42 74 43 75 72 73 6f 72 29 29 3b 0a  eof(BtCursor));.
231f0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
23200 69 7a 65 20 6d 65 6d 6f 72 79 20 74 68 61 74 20  ize memory that 
23210 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65  will be converte
23220 64 20 69 6e 74 6f 20 61 20 42 74 43 75 72 73 6f  d into a BtCurso
23230 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  r object..**.** 
23240 54 68 65 20 73 69 6d 70 6c 65 20 61 70 70 72 6f  The simple appro
23250 61 63 68 20 68 65 72 65 20 77 6f 75 6c 64 20 62  ach here would b
23260 65 20 74 6f 20 6d 65 6d 73 65 74 28 29 20 74 68  e to memset() th
23270 65 20 65 6e 74 69 72 65 20 6f 62 6a 65 63 74 0a  e entire object.
23280 2a 2a 20 74 6f 20 7a 65 72 6f 2e 20 20 42 75 74  ** to zero.  But
23290 20 69 74 20 74 75 72 6e 73 20 6f 75 74 20 74 68   it turns out th
232a0 61 74 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20  at the apPage[] 
232b0 61 6e 64 20 61 69 49 64 78 5b 5d 20 61 72 72 61  and aiIdx[] arra
232c0 79 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 65  ys.** do not nee
232d0 64 20 74 6f 20 62 65 20 7a 65 72 6f 65 64 20 61  d to be zeroed a
232e0 6e 64 20 74 68 65 79 20 61 72 65 20 6c 61 72 67  nd they are larg
232f0 65 2c 20 73 6f 20 77 65 20 63 61 6e 20 73 61 76  e, so we can sav
23300 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75  e a lot.** of ru
23310 6e 2d 74 69 6d 65 20 62 79 20 73 6b 69 70 70 69  n-time by skippi
23320 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a  ng the initializ
23330 61 74 69 6f 6e 20 6f 66 20 74 68 6f 73 65 20 65  ation of those e
23340 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64  lements..*/.void
23350 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
23360 73 6f 72 5a 65 72 6f 28 42 74 43 75 72 73 6f 72  sorZero(BtCursor
23370 20 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70   *p){.  memset(p
23380 2c 20 30 2c 20 6f 66 66 73 65 74 6f 66 28 42 74  , 0, offsetof(Bt
23390 43 75 72 73 6f 72 2c 20 69 50 61 67 65 29 29 3b  Cursor, iPage));
233a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
233b0 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 72  a cursor.  The r
233c0 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead lock on the 
233d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
233e0 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65   released.** whe
233f0 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72 73 6f  n the last curso
23400 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a  r is closed..*/.
23410 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
23420 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74 43 75  CloseCursor(BtCu
23430 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 42  rsor *pCur){.  B
23440 74 72 65 65 20 2a 70 42 74 72 65 65 20 3d 20 70  tree *pBtree = p
23450 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69  Cur->pBtree;.  i
23460 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20  f( pBtree ){.   
23470 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 53 68   int i;.    BtSh
23480 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72  ared *pBt = pCur
23490 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74  ->pBt;.    sqlit
234a0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74  e3BtreeEnter(pBt
234b0 72 65 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ree);.    sqlite
234c0 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f  3BtreeClearCurso
234d0 72 28 70 43 75 72 29 3b 0a 20 20 20 20 61 73 73  r(pCur);.    ass
234e0 65 72 74 28 20 70 42 74 2d 3e 70 43 75 72 73 6f  ert( pBt->pCurso
234f0 72 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  r!=0 );.    if( 
23500 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d 70 43  pBt->pCursor==pC
23510 75 72 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  ur ){.      pBt-
23520 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 2d  >pCursor = pCur-
23530 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73  >pNext;.    }els
23540 65 7b 0a 20 20 20 20 20 20 42 74 43 75 72 73 6f  e{.      BtCurso
23550 72 20 2a 70 50 72 65 76 20 3d 20 70 42 74 2d 3e  r *pPrev = pBt->
23560 70 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 64  pCursor;.      d
23570 6f 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  o{.        if( p
23580 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 43 75  Prev->pNext==pCu
23590 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  r ){.          p
235a0 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43  Prev->pNext = pC
235b0 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ur->pNext;.     
235c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
235d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
235e0 72 65 76 20 3d 20 70 50 72 65 76 2d 3e 70 4e 65  rev = pPrev->pNe
235f0 78 74 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65  xt;.      }while
23600 28 20 41 4c 57 41 59 53 28 70 50 72 65 76 29 20  ( ALWAYS(pPrev) 
23610 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
23620 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69  (i=0; i<=pCur->i
23630 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
23640 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
23650 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a  ur->apPage[i]);.
23660 20 20 20 20 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b      }.    unlock
23670 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
23680 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
23690 66 72 65 65 28 70 43 75 72 2d 3e 61 4f 76 65 72  free(pCur->aOver
236a0 66 6c 6f 77 29 3b 0a 20 20 20 20 2f 2a 20 73 71  flow);.    /* sq
236b0 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 29  lite3_free(pCur)
236c0 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  ; */.    sqlite3
236d0 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65  BtreeLeave(pBtre
236e0 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
236f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
23700 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  *.** Make sure t
23710 68 65 20 42 74 43 75 72 73 6f 72 2a 20 67 69 76  he BtCursor* giv
23720 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  en in the argume
23730 6e 74 20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a  nt has a valid.*
23740 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20  * BtCursor.info 
23750 73 74 72 75 63 74 75 72 65 2e 20 20 49 66 20 69  structure.  If i
23760 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
23770 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20   valid, call.** 
23780 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29  btreeParseCell()
23790 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a   to fill it in..
237a0 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69  **.** BtCursor.i
237b0 6e 66 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f  nfo is a cache o
237c0 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  f the informatio
237d0 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  n in the current
237e0 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20   cell..** Using 
237f0 74 68 69 73 20 63 61 63 68 65 20 72 65 64 75 63  this cache reduc
23800 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  es the number of
23810 20 63 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 50   calls to btreeP
23820 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2f 0a 23  arseCell()..*/.#
23830 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
23840 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
23850 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72  rtCellInfo(BtCur
23860 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20  sor *pCur){.    
23870 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
23880 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70     int iPage = p
23890 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20  Cur->iPage;.    
238a0 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c  memset(&info, 0,
238b0 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a   sizeof(info));.
238c0 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
238d0 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ll(pCur->apPage[
238e0 69 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69  iPage], pCur->ai
238f0 49 64 78 5b 69 50 61 67 65 5d 2c 20 26 69 6e 66  Idx[iPage], &inf
23900 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  o);.    assert( 
23910 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 6d 65  CORRUPT_DB || me
23920 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43 75  mcmp(&info, &pCu
23930 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28  r->info, sizeof(
23940 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d  info))==0 );.  }
23950 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65  .#else.  #define
23960 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
23970 78 29 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63  x).#endif.static
23980 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
23990 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e 66   void getCellInf
239a0 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  o(BtCursor *pCur
239b0 29 7b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69  ){.  if( pCur->i
239c0 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a  nfo.nSize==0 ){.
239d0 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20      int iPage = 
239e0 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20  pCur->iPage;.   
239f0 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
23a00 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65  |= BTCF_ValidNKe
23a10 79 3b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73  y;.    btreePars
23a20 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61  eCell(pCur->apPa
23a30 67 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e  ge[iPage],pCur->
23a40 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43  aiIdx[iPage],&pC
23a50 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d 65 6c  ur->info);.  }el
23a60 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 43 65  se{.    assertCe
23a70 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
23a80 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  }.}..#ifndef NDE
23a90 42 55 47 20 20 2f 2a 20 54 68 65 20 6e 65 78 74  BUG  /* The next
23aa0 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 6f 6e   routine used on
23ab0 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65 72 74  ly within assert
23ac0 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f  () statements */
23ad0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
23ae0 75 65 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  ue if the given 
23af0 42 74 43 75 72 73 6f 72 20 69 73 20 76 61 6c 69  BtCursor is vali
23b00 64 2e 20 20 41 20 76 61 6c 69 64 20 63 75 72 73  d.  A valid curs
23b10 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20 74 68 61  or is one.** tha
23b20 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
23b30 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 72 6f 77  ointing to a row
23b40 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70 74 79   in a (non-empty
23b50 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73  ) table..** This
23b60 20 69 73 20 61 20 76 65 72 69 66 69 63 61 74 69   is a verificati
23b70 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  on routine is us
23b80 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61  ed only within a
23b90 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
23ba0 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ts..*/.int sqlit
23bb0 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56  e3BtreeCursorIsV
23bc0 61 6c 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70  alid(BtCursor *p
23bd0 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  Cur){.  return p
23be0 43 75 72 20 26 26 20 70 43 75 72 2d 3e 65 53 74  Cur && pCur->eSt
23bf0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
23c00 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4e  D;.}.#endif /* N
23c10 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
23c20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68  Set *pSize to th
23c30 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75  e size of the bu
23c40 66 66 65 72 20 6e 65 65 64 65 64 20 74 6f 20 68  ffer needed to h
23c50 6f 6c 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  old the value of
23c60 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f 72 20  .** the key for 
23c70 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72  the current entr
23c80 79 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  y.  If the curso
23c90 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e  r is not pointin
23ca0 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64 20  g.** to a valid 
23cb0 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20 69 73  entry, *pSize is
23cc0 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a   set to 0. .**.*
23cd0 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20 77 69  * For a table wi
23ce0 74 68 20 74 68 65 20 49 4e 54 4b 45 59 20 66 6c  th the INTKEY fl
23cf0 61 67 20 73 65 74 2c 20 74 68 69 73 20 72 6f 75  ag set, this rou
23d00 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
23d10 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66 2c 20   key.** itself, 
23d20 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  not the number o
23d30 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6b  f bytes in the k
23d40 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  ey..**.** The ca
23d50 6c 6c 65 72 20 6d 75 73 74 20 70 6f 73 69 74 69  ller must positi
23d60 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 20 70 72  on the cursor pr
23d70 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20  ior to invoking 
23d80 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
23d90 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e   .** This routin
23da0 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 20  e cannot fail.  
23db0 49 74 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e  It always return
23dc0 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 0a 2a  s SQLITE_OK.  .*
23dd0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
23de0 65 65 4b 65 79 53 69 7a 65 28 42 74 43 75 72 73  eeKeySize(BtCurs
23df0 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 70  or *pCur, i64 *p
23e00 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Size){.  assert(
23e10 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
23e20 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
23e30 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
23e40 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
23e50 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f  );.  getCellInfo
23e60 28 70 43 75 72 29 3b 0a 20 20 2a 70 53 69 7a 65  (pCur);.  *pSize
23e70 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b   = pCur->info.nK
23e80 65 79 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ey;.  return SQL
23e90 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
23ea0 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74   Set *pSize to t
23eb0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
23ec0 65 73 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68  es of data in th
23ed0 65 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a 20 63  e entry the.** c
23ee0 75 72 73 6f 72 20 63 75 72 72 65 6e 74 6c 79 20  ursor currently 
23ef0 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a  points to..**.**
23f00 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
23f10 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20   guarantee that 
23f20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f  the cursor is po
23f30 69 6e 74 69 6e 67 20 74 6f 20 61 20 6e 6f 6e 2d  inting to a non-
23f40 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64 20 65 6e  NULL.** valid en
23f50 74 72 79 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  try.  In other w
23f60 6f 72 64 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e  ords, the callin
23f70 67 20 70 72 6f 63 65 64 75 72 65 20 6d 75 73 74  g procedure must
23f80 20 67 75 61 72 61 6e 74 65 65 0a 2a 2a 20 74 68   guarantee.** th
23f90 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 68 61  at the cursor ha
23fa0 73 20 43 75 72 73 6f 72 2e 65 53 74 61 74 65 3d  s Cursor.eState=
23fb0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a  =CURSOR_VALID..*
23fc0 2a 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69 73 20  *.** Failure is 
23fd0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20 20 54  not possible.  T
23fe0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77  his function alw
23ff0 61 79 73 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ays returns SQLI
24000 54 45 5f 4f 4b 2e 0a 2a 2a 20 49 74 20 6d 69 67  TE_OK..** It mig
24010 68 74 20 6a 75 73 74 20 61 73 20 77 65 6c 6c 20  ht just as well 
24020 62 65 20 61 20 70 72 6f 63 65 64 75 72 65 20 28  be a procedure (
24030 72 65 74 75 72 6e 69 6e 67 20 76 6f 69 64 29 20  returning void) 
24040 62 75 74 20 77 65 20 63 6f 6e 74 69 6e 75 65 0a  but we continue.
24050 2a 2a 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20  ** to return an 
24060 69 6e 74 65 67 65 72 20 72 65 73 75 6c 74 20 63  integer result c
24070 6f 64 65 20 66 6f 72 20 68 69 73 74 6f 72 69 63  ode for historic
24080 61 6c 20 72 65 61 73 6f 6e 73 2e 0a 2a 2f 0a 69  al reasons..*/.i
24090 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  nt sqlite3BtreeD
240a0 61 74 61 53 69 7a 65 28 42 74 43 75 72 73 6f 72  ataSize(BtCursor
240b0 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 53 69   *pCur, u32 *pSi
240c0 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ze){.  assert( c
240d0 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
240e0 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
240f0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
24100 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
24110 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
24120 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20  r->iPage>=0 );. 
24130 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
24140 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41  Page<BTCURSOR_MA
24150 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73  X_DEPTH );.  ass
24160 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
24170 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
24180 69 6e 74 4b 65 79 4c 65 61 66 3d 3d 31 20 29 3b  intKeyLeaf==1 );
24190 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  .  getCellInfo(p
241a0 43 75 72 29 3b 0a 20 20 2a 70 53 69 7a 65 20 3d  Cur);.  *pSize =
241b0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79   pCur->info.nPay
241c0 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e 20 53  load;.  return S
241d0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
241e0 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61 67  ** Given the pag
241f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f  e number of an o
24200 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
24210 74 68 65 20 64 61 74 61 62 61 73 65 20 28 70 61  the database (pa
24220 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29  rameter.** ovfl)
24230 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
24240 66 69 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e  finds the page n
24250 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78  umber of the nex
24260 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  t page in the .*
24270 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  * linked list of
24280 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
24290 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74   If possible, it
242a0 20 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76   uses the auto-v
242b0 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72  acuum.** pointer
242c0 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65 61  -map data instea
242d0 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65  d of reading the
242e0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65   content of page
242f0 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20   ovfl to do so. 
24300 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
24310 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c  or occurs an SQL
24320 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
24330 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
24340 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65  rwise:.**.** The
24350 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
24360 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f  the next overflo
24370 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  w page in the li
24380 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a  nked list is .**
24390 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67   written to *pPg
243a0 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20  noNext. If page 
243b0 6f 76 66 6c 20 69 73 20 74 68 65 20 6c 61 73 74  ovfl is the last
243c0 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69 6e   page in its lin
243d0 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70  ked .** list, *p
243e0 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74 20  PgnoNext is set 
243f0 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20  to zero. .**.** 
24400 49 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f 74  If ppPage is not
24410 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66   NULL, and a ref
24420 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 4d 65  erence to the Me
24430 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 63 6f 72  mPage object cor
24440 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f  responding.** to
24450 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 4f 76   page number pOv
24460 66 6c 20 77 61 73 20 6f 62 74 61 69 6e 65 64 2c  fl was obtained,
24470 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73   then *ppPage is
24480 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
24490 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e   that.** referen
244a0 63 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65  ce. It is the re
244b0 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
244c0 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63 61  the caller to ca
244d0 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28 29  ll releasePage()
244e0 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20 74  .** on *ppPage t
244f0 6f 20 66 72 65 65 20 74 68 65 20 72 65 66 65 72  o free the refer
24500 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65  ence. In no refe
24510 72 65 6e 63 65 20 77 61 73 20 6f 62 74 61 69 6e  rence was obtain
24520 65 64 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74  ed (because.** t
24530 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77  he pointer-map w
24540 61 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69  as used to obtai
24550 6e 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20  n the value for 
24560 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65  *pPgnoNext), the
24570 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73 20  n.** *ppPage is 
24580 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a  set to zero..*/.
24590 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76  static int getOv
245a0 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74  erflowPage(.  Bt
245b0 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
245c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
245d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
245e0 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20  */.  Pgno ovfl, 
245f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24600 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76 65    /* Current ove
24610 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65  rflow page numbe
24620 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  r */.  MemPage *
24630 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20  *ppPage,        
24640 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50      /* OUT: MemP
24650 61 67 65 20 68 61 6e 64 6c 65 20 28 6d 61 79 20  age handle (may 
24660 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67  be NULL) */.  Pg
24670 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20  no *pPgnoNext   
24680 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
24690 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77  T: Next overflow
246a0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
246b0 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d  ){.  Pgno next =
246c0 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
246d0 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Page = 0;.  int 
246e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
246f0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
24700 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
24710 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
24720 73 73 65 72 74 28 70 50 67 6e 6f 4e 65 78 74 29  ssert(pPgnoNext)
24730 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
24740 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
24750 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69  M.  /* Try to fi
24760 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  nd the next page
24770 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
24780 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a   list using the.
24790 20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20    ** autovacuum 
247a0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
247b0 73 2e 20 47 75 65 73 73 20 74 68 61 74 20 74 68  s. Guess that th
247c0 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a  e next page in .
247d0 20 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f    ** the overflo
247e0 77 20 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e  w list is page n
247f0 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20  umber (ovfl+1). 
24800 49 66 20 74 68 61 74 20 67 75 65 73 73 20 74 75  If that guess tu
24810 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f  rns .  ** out to
24820 20 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20   be wrong, fall 
24830 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20  back to loading 
24840 74 68 65 20 64 61 74 61 20 6f 66 20 70 61 67 65  the data of page
24850 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76   .  ** number ov
24860 66 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  fl to determine 
24870 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75  the next page nu
24880 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  mber..  */.  if(
24890 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
248a0 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e   ){.    Pgno pgn
248b0 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65  o;.    Pgno iGue
248c0 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20  ss = ovfl+1;.   
248d0 20 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20   u8 eType;..    
248e0 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53  while( PTRMAP_IS
248f0 50 41 47 45 28 70 42 74 2c 20 69 47 75 65 73 73  PAGE(pBt, iGuess
24900 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e  ) || iGuess==PEN
24910 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
24920 42 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75  Bt) ){.      iGu
24930 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20  ess++;.    }..  
24940 20 20 69 66 28 20 69 47 75 65 73 73 3c 3d 62 74    if( iGuess<=bt
24950 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
24960 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
24970 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69  ptrmapGet(pBt, i
24980 47 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26  Guess, &eType, &
24990 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  pgno);.      if(
249a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
249b0 26 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  & eType==PTRMAP_
249c0 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e  OVERFLOW2 && pgn
249d0 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20  o==ovfl ){.     
249e0 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73     next = iGuess
249f0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  ;.        rc = S
24a00 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
24a10 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
24a20 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
24a30 6e 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53  next==0 || rc==S
24a40 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
24a50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
24a60 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74  K ){.    rc = bt
24a70 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
24a80 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 28 70  ovfl, &pPage, (p
24a90 70 50 61 67 65 3d 3d 30 29 20 3f 20 50 41 47 45  pPage==0) ? PAGE
24aa0 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a  R_GET_READONLY :
24ab0 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
24ac0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
24ad0 7c 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20  | pPage==0 );.  
24ae0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
24af0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78  _OK ){.      nex
24b00 74 20 3d 20 67 65 74 34 62 79 74 65 28 70 50 61  t = get4byte(pPa
24b10 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  ge->aData);.    
24b20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e  }.  }..  *pPgnoN
24b30 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66  ext = next;.  if
24b40 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20  ( ppPage ){.    
24b50 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b  *ppPage = pPage;
24b60 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
24b70 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
24b80 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  ;.  }.  return (
24b90 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
24ba0 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63  ? SQLITE_OK : rc
24bb0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79  );.}../*.** Copy
24bc0 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66   data from a buf
24bd0 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20 6f  fer to a page, o
24be0 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74 6f  r from a page to
24bf0 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a   a buffer..**.**
24c00 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20 70   pPayload is a p
24c10 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 73  ointer to data s
24c20 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61 73  tored on databas
24c30 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2e 0a  e page pDbPage..
24c40 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 65  ** If argument e
24c50 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65  Op is false, the
24c60 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66  n nByte bytes of
24c70 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64   data are copied
24c80 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61  .** from pPayloa
24c90 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  d to the buffer 
24ca0 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70 42  pointed at by pB
24cb0 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74 72  uf. If eOp is tr
24cc0 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69  ue,.** then sqli
24cd0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
24ce0 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62  is called on pDb
24cf0 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20 62  Page and nByte b
24d00 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20  ytes.** of data 
24d10 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20  are copied from 
24d20 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66 20  the buffer pBuf 
24d30 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a  to pPayload..**.
24d40 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
24d50 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
24d60 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20 61  ess, otherwise a
24d70 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  n error code..*/
24d80 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70 79  .static int copy
24d90 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20  Payload(.  void 
24da0 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20 20  *pPayload,      
24db0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
24dc0 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  to page data */.
24dd0 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20    void *pBuf,   
24de0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
24df0 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
24e00 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c   */.  int nByte,
24e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
24e30 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20  es to copy */.  
24e40 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20 20  int eOp,        
24e50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2d            /* 0 -
24e60 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67 65  > copy from page
24e70 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70  , 1 -> copy to p
24e80 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65 20  age */.  DbPage 
24e90 2a 70 44 62 50 61 67 65 20 20 20 20 20 20 20 20  *pDbPage        
24ea0 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
24eb0 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a  ining pPayload *
24ec0 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20 29  /.){.  if( eOp )
24ed0 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61  {.    /* Copy da
24ee0 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20 74  ta from buffer t
24ef0 6f 20 70 61 67 65 20 28 61 20 77 72 69 74 65 20  o page (a write 
24f00 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20  operation) */.  
24f10 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
24f20 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62  e3PagerWrite(pDb
24f30 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
24f40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
24f50 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
24f60 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70  .    }.    memcp
24f70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75 66  y(pPayload, pBuf
24f80 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73  , nByte);.  }els
24f90 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64  e{.    /* Copy d
24fa0 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74 6f  ata from page to
24fb0 20 62 75 66 66 65 72 20 28 61 20 72 65 61 64 20   buffer (a read 
24fc0 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20  operation) */.  
24fd0 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 70    memcpy(pBuf, p
24fe0 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b  Payload, nByte);
24ff0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
25000 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
25010 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
25020 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20  is used to read 
25030 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70 61 79  or overwrite pay
25040 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  load information
25050 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74 72  .** for the entr
25060 79 20 74 68 61 74 20 74 68 65 20 70 43 75 72 20  y that the pCur 
25070 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
25080 6e 67 20 74 6f 2e 20 54 68 65 20 65 4f 70 0a 2a  ng to. The eOp.*
25090 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69 6e  * argument is in
250a0 74 65 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c  terpreted as fol
250b0 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 3a  lows:.**.**   0:
250c0 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69   The operation i
250d0 73 20 61 20 72 65 61 64 2e 20 50 6f 70 75 6c 61  s a read. Popula
250e0 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
250f0 63 61 63 68 65 2e 0a 2a 2a 20 20 20 31 3a 20 54  cache..**   1: T
25100 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  he operation is 
25110 61 20 77 72 69 74 65 2e 20 50 6f 70 75 6c 61 74  a write. Populat
25120 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
25130 61 63 68 65 2e 0a 2a 2a 20 20 20 32 3a 20 54 68  ache..**   2: Th
25140 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61  e operation is a
25150 20 72 65 61 64 2e 20 44 6f 20 6e 6f 74 20 70 6f   read. Do not po
25160 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66  pulate the overf
25170 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a  low cache..**.**
25180 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74   A total of "amt
25190 22 20 62 79 74 65 73 20 61 72 65 20 72 65 61 64  " bytes are read
251a0 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67 69   or written begi
251b0 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65 74  nning at "offset
251c0 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72 65  "..** Data is re
251d0 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68  ad to or from th
251e0 65 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a  e buffer pBuf..*
251f0 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74  *.** The content
25200 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 20 77   being read or w
25210 72 69 74 74 65 6e 20 6d 69 67 68 74 20 61 70 70  ritten might app
25220 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ear on the main 
25230 70 61 67 65 0a 2a 2a 20 6f 72 20 62 65 20 73 63  page.** or be sc
25240 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d  attered out on m
25250 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77  ultiple overflow
25260 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   pages..**.** If
25270 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
25280 73 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20 6f  sor entry uses o
25290 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66  ne or more overf
252a0 6c 6f 77 20 70 61 67 65 73 20 61 6e 64 20 74 68  low pages and th
252b0 65 0a 2a 2a 20 65 4f 70 20 61 72 67 75 6d 65 6e  e.** eOp argumen
252c0 74 20 69 73 20 6e 6f 74 20 32 2c 20 74 68 69 73  t is not 2, this
252d0 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61 6c   function may al
252e0 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
252f0 20 61 6e 64 20 6c 61 7a 69 6c 79 20 0a 2a 2a 20   and lazily .** 
25300 70 6f 70 75 6c 61 74 65 73 20 74 68 65 20 6f 76  populates the ov
25310 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
25320 20 63 61 63 68 65 20 61 72 72 61 79 20 28 42 74   cache array (Bt
25330 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77  Cursor.aOverflow
25340 29 2e 20 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e  ). .** Subsequen
25350 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69 73  t calls use this
25360 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20 73   cache to make s
25370 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73 75  eeking to the su
25380 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20 0a 2a  pplied offset .*
25390 2a 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74  * more efficient
253a0 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20  ..**.** Once an 
253b0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
253c0 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65  st cache has bee
253d0 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20  n allocated, it 
253e0 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69  may be.** invali
253f0 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74  dated if some ot
25400 68 65 72 20 63 75 72 73 6f 72 20 77 72 69 74 65  her cursor write
25410 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74 61  s to the same ta
25420 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68  ble, or if.** th
25430 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65  e cursor is move
25440 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74  d to a different
25450 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c   row. Additional
25460 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63 75  ly, in auto-vacu
25470 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20  um.** mode, the 
25480 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73  following events
25490 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65 20   may invalidate 
254a0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
254b0 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a  -list cache..**.
254c0 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d  **   * An increm
254d0 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a  ental vacuum,.**
254e0 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e     * A commit in
254f0 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75   auto_vacuum="fu
25500 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a  ll" mode,.**   *
25510 20 43 72 65 61 74 69 6e 67 20 61 20 74 61 62 6c   Creating a tabl
25520 65 20 28 6d 61 79 20 72 65 71 75 69 72 65 20 6d  e (may require m
25530 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f  oving an overflo
25540 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74  w page)..*/.stat
25550 69 63 20 69 6e 74 20 61 63 63 65 73 73 50 61 79  ic int accessPay
25560 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72  load(.  BtCursor
25570 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20   *pCur,      /* 
25580 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  Cursor pointing 
25590 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64  to entry to read
255a0 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 6f   from */.  u32 o
255b0 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20  ffset,          
255c0 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67  /* Begin reading
255d0 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20 70   this far into p
255e0 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32 20  ayload */.  u32 
255f0 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  amt,            
25600 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d 61   /* Read this ma
25610 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e  ny bytes */.  un
25620 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42 75  signed char *pBu
25630 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  f, /* Write the 
25640 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73 20  bytes into this 
25650 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74  buffer */ .  int
25660 20 65 4f 70 20 20 20 20 20 20 20 20 20 20 20 20   eOp            
25670 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61    /* zero to rea
25680 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77  d. non-zero to w
25690 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e  rite. */.){.  un
256a0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61  signed char *aPa
256b0 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20  yload;.  int rc 
256c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
256d0 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d  nt iIdx = 0;.  M
256e0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
256f0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
25700 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 42 74  r->iPage]; /* Bt
25710 72 65 65 20 70 61 67 65 20 6f 66 20 63 75 72 72  ree page of curr
25720 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42  ent entry */.  B
25730 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
25740 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20 20 20  Cur->pBt;       
25750 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74             /* Bt
25760 72 65 65 20 74 68 69 73 20 63 75 72 73 6f 72 20  ree this cursor 
25770 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 23 69  belongs to */.#i
25780 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45  fdef SQLITE_DIRE
25790 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44  CT_OVERFLOW_READ
257a0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
257b0 20 2a 20 63 6f 6e 73 74 20 70 42 75 66 53 74 61   * const pBufSta
257c0 72 74 20 3d 20 70 42 75 66 3b 0a 20 20 69 6e 74  rt = pBuf;.  int
257d0 20 62 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20   bEnd;          
257e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
257f0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
25800 66 20 72 65 61 64 69 6e 67 20 74 6f 20 65 6e 64  f reading to end
25810 20 6f 66 20 64 61 74 61 20 2a 2f 0a 23 65 6e 64   of data */.#end
25820 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  if..  assert( pP
25830 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
25840 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
25850 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
25860 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
25870 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
25880 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ]<pPage->nCell )
25890 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
258a0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
258b0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
258c0 65 4f 70 21 3d 32 20 7c 7c 20 6f 66 66 73 65 74  eOp!=2 || offset
258d0 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20 41 6c 77  ==0 );    /* Alw
258e0 61 79 73 20 73 74 61 72 74 20 66 72 6f 6d 20 62  ays start from b
258f0 65 67 69 6e 6e 69 6e 67 20 66 6f 72 20 65 4f 70  eginning for eOp
25900 3d 3d 32 20 2a 2f 0a 0a 20 20 67 65 74 43 65 6c  ==2 */..  getCel
25910 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61  lInfo(pCur);.  a
25920 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e  Payload = pCur->
25930 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 23  info.pPayload;.#
25940 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52  ifdef SQLITE_DIR
25950 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41  ECT_OVERFLOW_REA
25960 44 0a 20 20 62 45 6e 64 20 3d 20 6f 66 66 73 65  D.  bEnd = offse
25970 74 2b 61 6d 74 3d 3d 70 43 75 72 2d 3e 69 6e 66  t+amt==pCur->inf
25980 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a 23 65 6e 64  o.nPayload;.#end
25990 69 66 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66  if.  assert( off
259a0 73 65 74 2b 61 6d 74 20 3c 3d 20 70 43 75 72 2d  set+amt <= pCur-
259b0 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29  >info.nPayload )
259c0 3b 0a 0a 20 20 69 66 28 20 26 61 50 61 79 6c 6f  ;..  if( &aPaylo
259d0 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  ad[pCur->info.nL
259e0 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d 3e  ocal] > &pPage->
259f0 61 44 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c  aData[pBt->usabl
25a00 65 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 2f 2a  eSize] ){.    /*
25a10 20 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20   Trying to read 
25a20 6f 72 20 77 72 69 74 65 20 70 61 73 74 20 74 68  or write past th
25a30 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74  e end of the dat
25a40 61 20 69 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f  a is an error */
25a50 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
25a60 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
25a70 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
25a80 20 69 66 20 64 61 74 61 20 6d 75 73 74 20 62 65   if data must be
25a90 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74 6f   read/written to
25aa0 2f 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65 20  /from the btree 
25ab0 70 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a  page itself. */.
25ac0 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43 75    if( offset<pCu
25ad0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  r->info.nLocal )
25ae0 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d  {.    int a = am
25af0 74 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66 66  t;.    if( a+off
25b00 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  set>pCur->info.n
25b10 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 61  Local ){.      a
25b20 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c   = pCur->info.nL
25b30 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20  ocal - offset;. 
25b40 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f     }.    rc = co
25b50 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c  pyPayload(&aPayl
25b60 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75  oad[offset], pBu
25b70 66 2c 20 61 2c 20 28 65 4f 70 20 26 20 30 78 30  f, a, (eOp & 0x0
25b80 31 29 2c 20 70 50 61 67 65 2d 3e 70 44 62 50 61  1), pPage->pDbPa
25b90 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74 20  ge);.    offset 
25ba0 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d  = 0;.    pBuf +=
25bb0 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61   a;.    amt -= a
25bc0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
25bd0 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69  ffset -= pCur->i
25be0 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a  nfo.nLocal;.  }.
25bf0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
25c00 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29  TE_OK && amt>0 )
25c10 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32 20  {.    const u32 
25c20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ovflSize = pBt->
25c30 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20  usableSize - 4; 
25c40 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e   /* Bytes conten
25c50 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20  t per ovfl page 
25c60 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74  */.    Pgno next
25c70 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50  Page;..    nextP
25c80 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
25c90 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69  aPayload[pCur->i
25ca0 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 20  nfo.nLocal]);.. 
25cb0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 74 43     /* If the BtC
25cc0 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b  ursor.aOverflow[
25cd0 5d 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61  ] has not been a
25ce0 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61  llocated, alloca
25cf0 74 65 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 2a  te it now..    *
25d00 2a 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74  * Except, do not
25d10 20 61 6c 6c 6f 63 61 74 65 20 61 4f 76 65 72 66   allocate aOverf
25d20 6c 6f 77 5b 5d 20 66 6f 72 20 65 4f 70 3d 3d 32  low[] for eOp==2
25d30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
25d40 54 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20  The aOverflow[] 
25d50 61 72 72 61 79 20 69 73 20 73 69 7a 65 64 20 61  array is sized a
25d60 74 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20  t one entry for 
25d70 65 61 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61  each overflow pa
25d80 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  ge.    ** in the
25d90 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e   overflow chain.
25da0 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
25db0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 76   of the first ov
25dc0 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 0a 20  erflow page is. 
25dd0 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20     ** stored in 
25de0 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 20 65 74  aOverflow[0], et
25df0 63 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20  c. A value of 0 
25e00 69 6e 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77  in the aOverflow
25e10 5b 5d 20 61 72 72 61 79 0a 20 20 20 20 2a 2a 20  [] array.    ** 
25e20 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b  means "not yet k
25e30 6e 6f 77 6e 22 20 28 74 68 65 20 63 61 63 68 65  nown" (the cache
25e40 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c   is lazily popul
25e50 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  ated)..    */.  
25e60 20 20 69 66 28 20 65 4f 70 21 3d 32 20 26 26 20    if( eOp!=2 && 
25e70 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
25e80 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  & BTCF_ValidOvfl
25e90 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
25ea0 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d  t nOvfl = (pCur-
25eb0 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70  >info.nPayload-p
25ec0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
25ed0 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66  +ovflSize-1)/ovf
25ee0 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28  lSize;.      if(
25ef0 20 6e 4f 76 66 6c 3e 70 43 75 72 2d 3e 6e 4f 76   nOvfl>pCur->nOv
25f00 66 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20  flAlloc ){.     
25f10 20 20 20 50 67 6e 6f 20 2a 61 4e 65 77 20 3d 20     Pgno *aNew = 
25f20 28 50 67 6e 6f 2a 29 73 71 6c 69 74 65 33 52 65  (Pgno*)sqlite3Re
25f30 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 20  alloc(.         
25f40 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c     pCur->aOverfl
25f50 6f 77 2c 20 6e 4f 76 66 6c 2a 32 2a 73 69 7a 65  ow, nOvfl*2*size
25f60 6f 66 28 50 67 6e 6f 29 0a 20 20 20 20 20 20 20  of(Pgno).       
25f70 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
25f80 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  aNew==0 ){.     
25f90 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
25fa0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
25fb0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
25fc0 20 70 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f   pCur->nOvflAllo
25fd0 63 20 3d 20 6e 4f 76 66 6c 2a 32 3b 0a 20 20 20  c = nOvfl*2;.   
25fe0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76         pCur->aOv
25ff0 65 72 66 6c 6f 77 20 3d 20 61 4e 65 77 3b 0a 20  erflow = aNew;. 
26000 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
26010 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
26020 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
26030 20 20 20 20 6d 65 6d 73 65 74 28 70 43 75 72 2d      memset(pCur-
26040 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 30 2c 20 6e  >aOverflow, 0, n
26050 4f 76 66 6c 2a 73 69 7a 65 6f 66 28 50 67 6e 6f  Ovfl*sizeof(Pgno
26060 29 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72  ));.        pCur
26070 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54  ->curFlags |= BT
26080 43 46 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a 20 20  CF_ValidOvfl;.  
26090 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
260a0 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65 72 66   /* If the overf
260b0 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
260c0 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c  che has been all
260d0 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 0a 20  ocated and the. 
260e0 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20     ** entry for 
260f0 74 68 65 20 66 69 72 73 74 20 72 65 71 75 69 72  the first requir
26100 65 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ed overflow page
26110 20 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a   is valid, skip.
26120 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20      ** directly 
26130 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  to it..    */.  
26140 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72    if( (pCur->cur
26150 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c  Flags & BTCF_Val
26160 69 64 4f 76 66 6c 29 21 3d 30 0a 20 20 20 20 20  idOvfl)!=0.     
26170 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  && pCur->aOverfl
26180 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69  ow[offset/ovflSi
26190 7a 65 5d 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ze].    ){.     
261a0 20 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74 2f   iIdx = (offset/
261b0 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20  ovflSize);.     
261c0 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72   nextPage = pCur
261d0 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
261e0 5d 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20  ];.      offset 
261f0 3d 20 28 6f 66 66 73 65 74 25 6f 76 66 6c 53 69  = (offset%ovflSi
26200 7a 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ze);.    }..    
26210 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49 54  for( ; rc==SQLIT
26220 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26 26  E_OK && amt>0 &&
26230 20 6e 65 78 74 50 61 67 65 3b 20 69 49 64 78 2b   nextPage; iIdx+
26240 2b 29 7b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66  +){..      /* If
26250 20 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c   required, popul
26260 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ate the overflow
26270 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
26280 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28  . */.      if( (
26290 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
262a0 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29   BTCF_ValidOvfl)
262b0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  !=0 ){.        a
262c0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 4f 76  ssert( pCur->aOv
262d0 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 30 0a  erflow[iIdx]==0.
262e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
262f0 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  || pCur->aOverfl
26300 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61  ow[iIdx]==nextPa
26310 67 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ge.             
26320 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42     || CORRUPT_DB
26330 20 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72   );.        pCur
26340 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
26350 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a 20 20  ] = nextPage;.  
26360 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
26370 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a   offset>=ovflSiz
26380 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
26390 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20  The only reason 
263a0 74 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67  to read this pag
263b0 65 20 69 73 20 74 6f 20 6f 62 74 61 69 6e 20 74  e is to obtain t
263c0 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
263d0 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ** number for th
263e0 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
263f0 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69  he overflow chai
26400 6e 2e 20 54 68 65 20 70 61 67 65 0a 20 20 20 20  n. The page.    
26410 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 6e      ** data is n
26420 6f 74 20 72 65 71 75 69 72 65 64 2e 20 53 6f 20  ot required. So 
26430 66 69 72 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f  first try to loo
26440 6b 75 70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  kup the overflow
26450 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
26460 2d 6c 69 73 74 20 63 61 63 68 65 2c 20 69 66 20  -list cache, if 
26470 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62  any, then fall b
26480 61 63 6b 20 74 6f 20 74 68 65 20 67 65 74 4f 76  ack to the getOv
26490 65 72 66 6c 6f 77 50 61 67 65 28 29 0a 20 20 20  erflowPage().   
264a0 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
264b0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
264c0 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61       ** Note tha
264d0 74 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b  t the aOverflow[
264e0 5d 20 61 72 72 61 79 20 6d 75 73 74 20 62 65 20  ] array must be 
264f0 61 6c 6c 6f 63 61 74 65 64 20 62 65 63 61 75 73  allocated becaus
26500 65 20 65 4f 70 21 3d 32 0a 20 20 20 20 20 20 20  e eOp!=2.       
26510 20 2a 2a 20 68 65 72 65 2e 20 20 49 66 20 65 4f   ** here.  If eO
26520 70 3d 3d 32 2c 20 74 68 65 6e 20 6f 66 66 73 65  p==2, then offse
26530 74 3d 3d 30 20 61 6e 64 20 74 68 69 73 20 62 72  t==0 and this br
26540 61 6e 63 68 20 69 73 20 6e 65 76 65 72 20 74 61  anch is never ta
26550 6b 65 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ken..        */.
26560 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
26570 65 4f 70 21 3d 32 20 29 3b 0a 20 20 20 20 20 20  eOp!=2 );.      
26580 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
26590 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
265a0 56 61 6c 69 64 4f 76 66 6c 20 29 3b 0a 20 20 20  ValidOvfl );.   
265b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
265c0 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d 3d 70  r->pBtree->db==p
265d0 42 74 2d 3e 64 62 20 29 3b 0a 20 20 20 20 20 20  Bt->db );.      
265e0 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65    if( pCur->aOve
265f0 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b  rflow[iIdx+1] ){
26600 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50  .          nextP
26610 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65  age = pCur->aOve
26620 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20  rflow[iIdx+1];. 
26630 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
26640 20 20 20 20 20 20 20 20 72 63 20 3d 20 67 65 74          rc = get
26650 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74  OverflowPage(pBt
26660 2c 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20 26  , nextPage, 0, &
26670 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20  nextPage);.     
26680 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6f 66 66     }.        off
26690 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b  set -= ovflSize;
266a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
266b0 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f        /* Need to
266c0 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20   read this page 
266d0 70 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e  properly. It con
266e0 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68  tains some of th
266f0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61 6e  e.        ** ran
26700 67 65 20 6f 66 20 64 61 74 61 20 74 68 61 74 20  ge of data that 
26710 69 73 20 62 65 69 6e 67 20 72 65 61 64 20 28 65  is being read (e
26720 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74 65  Op==0) or writte
26730 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20  n (eOp!=0)..    
26740 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51      */.#ifdef SQ
26750 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52  LITE_DIRECT_OVER
26760 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20  FLOW_READ.      
26770 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
26780 66 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  fd;.#endif.     
26790 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a     int a = amt;.
267a0 20 20 20 20 20 20 20 20 69 66 28 20 61 20 2b 20          if( a + 
267b0 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a  offset > ovflSiz
267c0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  e ){.          a
267d0 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66   = ovflSize - of
267e0 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  fset;.        }.
267f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
26800 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52  IRECT_OVERFLOW_R
26810 45 41 44 0a 20 20 20 20 20 20 20 20 2f 2a 20 49  EAD.        /* I
26820 66 20 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77  f all the follow
26830 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20  ing are true:.  
26840 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
26850 20 2a 2a 20 20 20 31 29 20 74 68 69 73 20 69 73   **   1) this is
26860 20 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f   a read operatio
26870 6e 2c 20 61 6e 64 20 0a 20 20 20 20 20 20 20 20  n, and .        
26880 2a 2a 20 20 20 32 29 20 64 61 74 61 20 69 73 20  **   2) data is 
26890 72 65 71 75 69 72 65 64 20 66 72 6f 6d 20 74 68  required from th
268a0 65 20 73 74 61 72 74 20 6f 66 20 74 68 69 73 20  e start of this 
268b0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 61  overflow page, a
268c0 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  nd.        **   
268d0 33 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20  3) the database 
268e0 69 73 20 66 69 6c 65 2d 62 61 63 6b 65 64 2c 20  is file-backed, 
268f0 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  and.        **  
26900 20 34 29 20 74 68 65 72 65 20 69 73 20 6e 6f 20   4) there is no 
26910 6f 70 65 6e 20 77 72 69 74 65 2d 74 72 61 6e 73  open write-trans
26920 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20  action, and.    
26930 20 20 20 20 2a 2a 20 20 20 35 29 20 74 68 65 20      **   5) the 
26940 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
26950 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c 0a  a WAL database,.
26960 20 20 20 20 20 20 20 20 2a 2a 20 20 20 36 29 20          **   6) 
26970 61 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68  all data from th
26980 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  e page is being 
26990 72 65 61 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a  read..        **
269a0 20 20 20 37 29 20 61 74 20 6c 65 61 73 74 20 34     7) at least 4
269b0 20 62 79 74 65 73 20 68 61 76 65 20 61 6c 72 65   bytes have alre
269c0 61 64 79 20 62 65 65 6e 20 72 65 61 64 20 69 6e  ady been read in
269d0 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  to the output bu
269e0 66 66 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a  ffer .        **
269f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
26a00 20 64 61 74 61 20 63 61 6e 20 62 65 20 72 65 61   data can be rea
26a10 64 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20  d directly from 
26a20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
26a30 65 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20  e into the.     
26a40 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 62 75 66     ** output buf
26a50 66 65 72 2c 20 62 79 70 61 73 73 69 6e 67 20 74  fer, bypassing t
26a60 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 61 6c  he page-cache al
26a70 74 6f 67 65 74 68 65 72 2e 20 54 68 69 73 20 73  together. This s
26a80 70 65 65 64 73 0a 20 20 20 20 20 20 20 20 2a 2a  peeds.        **
26a90 20 75 70 20 6c 6f 61 64 69 6e 67 20 6c 61 72 67   up loading larg
26aa0 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 73  e records that s
26ab0 70 61 6e 20 6d 61 6e 79 20 6f 76 65 72 66 6c 6f  pan many overflo
26ac0 77 20 70 61 67 65 73 2e 0a 20 20 20 20 20 20 20  w pages..       
26ad0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
26ae0 28 65 4f 70 26 30 78 30 31 29 3d 3d 30 20 20 20  (eOp&0x01)==0   
26af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b10 20 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20     /* (1) */.   
26b20 20 20 20 20 20 20 26 26 20 6f 66 66 73 65 74 3d        && offset=
26b30 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =0              
26b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
26b60 32 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26  2) */.         &
26b70 26 20 28 62 45 6e 64 20 7c 7c 20 61 3d 3d 6f 76  & (bEnd || a==ov
26b80 66 6c 53 69 7a 65 29 20 20 20 20 20 20 20 20 20  flSize)         
26b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ba0 20 20 20 20 20 2f 2a 20 28 36 29 20 2a 2f 0a 20       /* (6) */. 
26bb0 20 20 20 20 20 20 20 20 26 26 20 70 42 74 2d 3e          && pBt->
26bc0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
26bd0 52 41 4e 53 5f 52 45 41 44 20 20 20 20 20 20 20  RANS_READ       
26be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26bf0 20 28 34 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (4) */.        
26c00 20 26 26 20 28 66 64 20 3d 20 73 71 6c 69 74 65   && (fd = sqlite
26c10 33 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e  3PagerFile(pBt->
26c20 70 50 61 67 65 72 29 29 2d 3e 70 4d 65 74 68 6f  pPager))->pMetho
26c30 64 73 20 20 20 20 20 2f 2a 20 28 33 29 20 2a 2f  ds     /* (3) */
26c40 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 42 74  .         && pBt
26c50 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
26c60 31 39 5d 3d 3d 30 78 30 31 20 20 20 20 20 20 20  19]==0x01       
26c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c80 2f 2a 20 28 35 29 20 2a 2f 0a 20 20 20 20 20 20  /* (5) */.      
26c90 20 20 20 26 26 20 26 70 42 75 66 5b 2d 34 5d 3e     && &pBuf[-4]>
26ca0 3d 70 42 75 66 53 74 61 72 74 20 20 20 20 20 20  =pBufStart      
26cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26cc0 20 20 20 20 20 20 20 20 20 2f 2a 20 28 37 29 20           /* (7) 
26cd0 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  */.        ){.  
26ce0 20 20 20 20 20 20 20 20 75 38 20 61 53 61 76 65          u8 aSave
26cf0 5b 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 75  [4];.          u
26d00 38 20 2a 61 57 72 69 74 65 20 3d 20 26 70 42 75  8 *aWrite = &pBu
26d10 66 5b 2d 34 5d 3b 0a 20 20 20 20 20 20 20 20 20  f[-4];.         
26d20 20 61 73 73 65 72 74 28 20 61 57 72 69 74 65 3e   assert( aWrite>
26d30 3d 70 42 75 66 53 74 61 72 74 20 29 3b 20 20 20  =pBufStart );   
26d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d50 20 20 20 20 20 20 2f 2a 20 68 65 6e 63 65 20 28        /* hence (
26d60 37 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  7) */.          
26d70 6d 65 6d 63 70 79 28 61 53 61 76 65 2c 20 61 57  memcpy(aSave, aW
26d80 72 69 74 65 2c 20 34 29 3b 0a 20 20 20 20 20 20  rite, 4);.      
26d90 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
26da0 4f 73 52 65 61 64 28 66 64 2c 20 61 57 72 69 74  OsRead(fd, aWrit
26db0 65 2c 20 61 2b 34 2c 20 28 69 36 34 29 70 42 74  e, a+4, (i64)pBt
26dc0 2d 3e 70 61 67 65 53 69 7a 65 2a 28 6e 65 78 74  ->pageSize*(next
26dd0 50 61 67 65 2d 31 29 29 3b 0a 20 20 20 20 20 20  Page-1));.      
26de0 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67      nextPage = g
26df0 65 74 34 62 79 74 65 28 61 57 72 69 74 65 29 3b  et4byte(aWrite);
26e00 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
26e10 79 28 61 57 72 69 74 65 2c 20 61 53 61 76 65 2c  y(aWrite, aSave,
26e20 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   4);.        }el
26e30 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20  se.#endif..     
26e40 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 44     {.          D
26e50 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
26e60 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
26e70 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
26e80 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74  Bt->pPager, next
26e90 50 61 67 65 2c 20 26 70 44 62 50 61 67 65 2c 0a  Page, &pDbPage,.
26ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28                ((
26eb0 65 4f 70 26 30 78 30 31 29 3d 3d 30 20 3f 20 50  eOp&0x01)==0 ? P
26ec0 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c  AGER_GET_READONL
26ed0 59 20 3a 20 30 29 0a 20 20 20 20 20 20 20 20 20  Y : 0).         
26ee0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
26ef0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
26f00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
26f10 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65  Payload = sqlite
26f20 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
26f30 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
26f40 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67      nextPage = g
26f50 65 74 34 62 79 74 65 28 61 50 61 79 6c 6f 61 64  et4byte(aPayload
26f60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
26f70 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  c = copyPayload(
26f80 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74  &aPayload[offset
26f90 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20 28 65  +4], pBuf, a, (e
26fa0 4f 70 26 30 78 30 31 29 2c 20 70 44 62 50 61 67  Op&0x01), pDbPag
26fb0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
26fc0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
26fd0 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  f(pDbPage);.    
26fe0 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d          offset =
26ff0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   0;.          }.
27000 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27010 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20    amt -= a;.    
27020 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20      pBuf += a;. 
27030 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
27040 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
27050 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29  TE_OK && amt>0 )
27060 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
27070 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
27080 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
27090 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  c;.}../*.** Read
270a0 20 70 61 72 74 20 6f 66 20 74 68 65 20 6b 65 79   part of the key
270b0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
270c0 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45   cursor pCur.  E
270d0 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20  xactly.** "amt" 
270e0 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72  bytes will be tr
270f0 61 6e 73 66 65 72 72 65 64 20 69 6e 74 6f 20 70  ansferred into p
27100 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e  Buf[].  The tran
27110 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61  sfer.** begins a
27120 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a  t "offset"..**.*
27130 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  * The caller mus
27140 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 70 43  t ensure that pC
27150 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  ur is pointing t
27160 6f 20 61 20 76 61 6c 69 64 20 72 6f 77 0a 2a 2a  o a valid row.**
27170 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   in the table..*
27180 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
27190 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
271a0 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
271b0 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  e if anything go
271c0 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e  es.** wrong.  An
271d0 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
271e0 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d  ed if "offset+am
271f0 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  t" is larger tha
27200 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62  n.** the availab
27210 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69  le payload..*/.i
27220 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b  nt sqlite3BtreeK
27230 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ey(BtCursor *pCu
27240 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75  r, u32 offset, u
27250 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42  32 amt, void *pB
27260 75 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  uf){.  assert( c
27270 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
27280 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
27290 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
272a0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
272b0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
272c0 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75  >iPage>=0 && pCu
272d0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
272e0 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65  iPage] );.  asse
272f0 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
27300 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75  pCur->iPage]<pCu
27310 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
27320 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  iPage]->nCell );
27330 0a 20 20 72 65 74 75 72 6e 20 61 63 63 65 73 73  .  return access
27340 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66  Payload(pCur, of
27350 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69  fset, amt, (unsi
27360 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66 2c  gned char*)pBuf,
27370 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   0);.}../*.** Re
27380 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  ad part of the d
27390 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77  ata associated w
273a0 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e  ith cursor pCur.
273b0 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d    Exactly.** "am
273c0 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65  t" bytes will be
273d0 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f   transfered into
273e0 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72   pBuf[].  The tr
273f0 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73  ansfer.** begins
27400 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a   at "offset"..**
27410 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
27420 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
27430 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
27440 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
27450 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20  s.** wrong.  An 
27460 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
27470 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74  d if "offset+amt
27480 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  " is larger than
27490 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c  .** the availabl
274a0 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e  e payload..*/.in
274b0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61  t sqlite3BtreeDa
274c0 74 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ta(BtCursor *pCu
274d0 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75  r, u32 offset, u
274e0 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42  32 amt, void *pB
274f0 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  uf){.  int rc;..
27500 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
27510 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 69  MIT_INCRBLOB.  i
27520 66 20 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  f ( pCur->eState
27530 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
27540 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
27550 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d  QLITE_ABORT;.  }
27560 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
27570 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
27580 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
27590 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
275a0 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
275b0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
275c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
275d0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
275e0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
275f0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
27600 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26  pCur->iPage>=0 &
27610 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  & pCur->apPage[p
27620 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20  Cur->iPage] );. 
27630 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
27640 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
27650 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65  ge]<pCur->apPage
27660 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
27670 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d  Cell );.    rc =
27680 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
27690 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74  Cur, offset, amt
276a0 2c 20 70 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a  , pBuf, 0);.  }.
276b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
276c0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
276d0 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f 61  ointer to payloa
276e0 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  d information fr
276f0 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  om the entry tha
27700 74 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20 63  t the .** pCur c
27710 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
27720 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74  g to.  The point
27730 65 72 20 69 73 20 74 6f 20 74 68 65 20 62 65 67  er is to the beg
27740 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65  inning of.** the
27750 20 6b 65 79 20 69 66 20 69 6e 64 65 78 20 62 74   key if index bt
27760 72 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74  rees (pPage->int
27770 4b 65 79 3d 3d 30 29 20 61 6e 64 20 69 73 20 74  Key==0) and is t
27780 68 65 20 64 61 74 61 20 66 6f 72 0a 2a 2a 20 74  he data for.** t
27790 61 62 6c 65 20 62 74 72 65 65 73 20 28 70 50 61  able btrees (pPa
277a0 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 31 29 2e 20  ge->intKey==1). 
277b0 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  The number of by
277c0 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  tes of available
277d0 0a 2a 2a 20 6b 65 79 2f 64 61 74 61 20 69 73 20  .** key/data is 
277e0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 41  written into *pA
277f0 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30  mt.  If *pAmt==0
27800 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
27810 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 69 6c  .** returned wil
27820 6c 20 6e 6f 74 20 62 65 20 61 20 76 61 6c 69 64  l not be a valid
27830 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20   pointer..**.** 
27840 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
27850 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  an optimization.
27860 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66    It is common f
27870 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65  or the entire ke
27880 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74 6f  y.** and data to
27890 20 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61   fit on the loca
278a0 6c 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20 74  l page and for t
278b0 68 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76  here to be no ov
278c0 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e  erflow.** pages.
278d0 20 20 57 68 65 6e 20 74 68 61 74 20 69 73 20 73    When that is s
278e0 6f 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  o, this routine 
278f0 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61  can be used to a
27900 63 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79  ccess the.** key
27910 20 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f 75   and data withou
27920 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e  t making a copy.
27930 20 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e 64    If the key and
27940 2f 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73 0a  /or data spills.
27950 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77  ** onto overflow
27960 20 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63 63   pages, then acc
27970 65 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75 73  essPayload() mus
27980 74 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 61  t be used to rea
27990 73 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b  ssemble.** the k
279a0 65 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79  ey/data and copy
279b0 20 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c   it into a preal
279c0 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a  located buffer..
279d0 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65  **.** The pointe
279e0 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  r returned by th
279f0 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73  is routine looks
27a00 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74   directly into t
27a10 68 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67  he cached.** pag
27a20 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
27a30 65 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69 67  e.  The data mig
27a40 68 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76  ht change or mov
27a50 65 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a  e the next time.
27a60 2a 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75  ** any btree rou
27a70 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
27a80 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
27a90 76 6f 69 64 20 2a 66 65 74 63 68 50 61 79 6c 6f  void *fetchPaylo
27aa0 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  ad(.  BtCursor *
27ab0 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75  pCur,      /* Cu
27ac0 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f  rsor pointing to
27ad0 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66   entry to read f
27ae0 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 2a 70 41  rom */.  u32 *pA
27af0 6d 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  mt            /*
27b00 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65   Write the numbe
27b10 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62  r of available b
27b20 79 74 65 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ytes here */.){.
27b30 20 20 75 33 32 20 61 6d 74 3b 0a 20 20 61 73 73    u32 amt;.  ass
27b40 65 72 74 28 20 70 43 75 72 21 3d 30 20 26 26 20  ert( pCur!=0 && 
27b50 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26  pCur->iPage>=0 &
27b60 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  & pCur->apPage[p
27b70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20  Cur->iPage]);.  
27b80 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
27b90 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
27ba0 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
27bb0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
27bc0 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
27bd0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
27be0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
27bf0 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
27c00 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
27c10 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
27c20 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70  >iPage]<pCur->ap
27c30 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
27c40 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  ]->nCell );.  as
27c50 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f  sert( pCur->info
27c60 2e 6e 53 69 7a 65 3e 30 20 29 3b 0a 20 20 61 73  .nSize>0 );.  as
27c70 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f  sert( pCur->info
27c80 2e 70 50 61 79 6c 6f 61 64 3e 70 43 75 72 2d 3e  .pPayload>pCur->
27c90 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
27ca0 67 65 5d 2d 3e 61 44 61 74 61 20 7c 7c 20 43 4f  ge]->aData || CO
27cb0 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73  RRUPT_DB );.  as
27cc0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f  sert( pCur->info
27cd0 2e 70 50 61 79 6c 6f 61 64 3c 70 43 75 72 2d 3e  .pPayload<pCur->
27ce0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
27cf0 67 65 5d 2d 3e 61 44 61 74 61 45 6e 64 20 7c 7c  ge]->aDataEnd ||
27d00 43 4f 52 52 55 50 54 5f 44 42 29 3b 0a 20 20 61  CORRUPT_DB);.  a
27d10 6d 74 20 3d 20 28 69 6e 74 29 28 70 43 75 72 2d  mt = (int)(pCur-
27d20 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
27d30 61 67 65 5d 2d 3e 61 44 61 74 61 45 6e 64 20 2d  age]->aDataEnd -
27d40 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79   pCur->info.pPay
27d50 6c 6f 61 64 29 3b 0a 20 20 69 66 28 20 70 43 75  load);.  if( pCu
27d60 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 61  r->info.nLocal<a
27d70 6d 74 20 29 20 61 6d 74 20 3d 20 70 43 75 72 2d  mt ) amt = pCur-
27d80 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20  >info.nLocal;.  
27d90 2a 70 41 6d 74 20 3d 20 61 6d 74 3b 0a 20 20 72  *pAmt = amt;.  r
27da0 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 70 43 75  eturn (void*)pCu
27db0 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  r->info.pPayload
27dc0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20  ;.}.../*.** For 
27dd0 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 63  the entry that c
27de0 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f  ursor pCur is po
27df0 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61  int to, return a
27e00 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20  s.** many bytes 
27e10 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61  of the key or da
27e20 74 61 20 61 73 20 61 72 65 20 61 76 61 69 6c 61  ta as are availa
27e30 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ble on the local
27e40 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e  .** b-tree page.
27e50 20 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62    Write the numb
27e60 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  er of available 
27e70 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74  bytes into *pAmt
27e80 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e  ..**.** The poin
27e90 74 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20  ter returned is 
27ea0 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20  ephemeral.  The 
27eb0 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76  key/data may mov
27ec0 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72  e.** or be destr
27ed0 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74  oyed on the next
27ee0 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72   call to any Btr
27ef0 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69  ee routine,.** i
27f00 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66  ncluding calls f
27f10 72 6f 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64  rom other thread
27f20 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 73 61  s against the sa
27f30 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e  me cache..** Hen
27f40 63 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74  ce, a mutex on t
27f50 68 65 20 42 74 53 68 61 72 65 64 20 73 68 6f 75  he BtShared shou
27f60 6c 64 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72  ld be held prior
27f70 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74   to calling.** t
27f80 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  his routine..**.
27f90 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
27fa0 73 20 69 73 20 75 73 65 64 20 74 6f 20 67 65 74  s is used to get
27fb0 20 71 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f   quick access to
27fc0 20 6b 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a   key and data.**
27fd0 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   in the common c
27fe0 61 73 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65  ase where no ove
27ff0 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20  rflow pages are 
28000 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76  used..*/.const v
28010 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65  oid *sqlite3Btre
28020 65 4b 65 79 46 65 74 63 68 28 42 74 43 75 72 73  eKeyFetch(BtCurs
28030 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70  or *pCur, u32 *p
28040 41 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 66  Amt){.  return f
28050 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72  etchPayload(pCur
28060 2c 20 70 41 6d 74 29 3b 0a 7d 0a 63 6f 6e 73 74  , pAmt);.}.const
28070 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74   void *sqlite3Bt
28080 72 65 65 44 61 74 61 46 65 74 63 68 28 42 74 43  reeDataFetch(BtC
28090 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
280a0 20 2a 70 41 6d 74 29 7b 0a 20 20 72 65 74 75 72   *pAmt){.  retur
280b0 6e 20 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70  n fetchPayload(p
280c0 43 75 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a 0a 0a  Cur, pAmt);.}...
280d0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
280e0 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20  ursor down to a 
280f0 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20  new child page. 
28100 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67   The newPgno arg
28110 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20  ument is the.** 
28120 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
28130 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f  he child page to
28140 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20   move to..**.** 
28150 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
28160 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52  turns SQLITE_COR
28170 52 55 50 54 20 69 66 20 74 68 65 20 70 61 67 65  RUPT if the page
28180 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20 66 69  -header flags fi
28190 65 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  eld of.** the ne
281a0 77 20 63 68 69 6c 64 20 70 61 67 65 20 64 6f 65  w child page doe
281b0 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
281c0 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 20 74  flags field of t
281d0 68 65 20 70 61 72 65 6e 74 20 28 69 2e 65 2e 0a  he parent (i.e..
281e0 2a 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65 79 20  ** if an intkey 
281f0 70 61 67 65 20 61 70 70 65 61 72 73 20 74 6f 20  page appears to 
28200 62 65 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66  be the parent of
28210 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70 61   a non-intkey pa
28220 67 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65 2d 76  ge, or.** vice-v
28230 65 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ersa)..*/.static
28240 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64   int moveToChild
28250 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
28260 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20   u32 newPgno){. 
28270 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
28280 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61   pCur->pBt;..  a
28290 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
282a0 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
282b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
282c0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
282d0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
282e0 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
282f0 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45  <BTCURSOR_MAX_DE
28300 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28  PTH );.  assert(
28310 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
28320 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69  );.  if( pCur->i
28330 50 61 67 65 3e 3d 28 42 54 43 55 52 53 4f 52 5f  Page>=(BTCURSOR_
28340 4d 41 58 5f 44 45 50 54 48 2d 31 29 20 29 7b 0a  MAX_DEPTH-1) ){.
28350 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
28360 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
28370 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f    }.  pCur->info
28380 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
28390 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
283a0 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  ~(BTCF_ValidNKey
283b0 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  |BTCF_ValidOvfl)
283c0 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2b  ;.  pCur->iPage+
283d0 2b 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78  +;.  pCur->aiIdx
283e0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
283f0 30 3b 0a 20 20 72 65 74 75 72 6e 20 67 65 74 41  0;.  return getA
28400 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
28410 6e 65 77 50 67 6e 6f 2c 20 26 70 43 75 72 2d 3e  newPgno, &pCur->
28420 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
28430 67 65 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ge],.           
28440 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 75               pCu
28450 72 2c 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65  r, pCur->curPage
28460 72 46 6c 61 67 73 29 3b 0a 7d 0a 0a 23 69 66 20  rFlags);.}..#if 
28470 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
28480 2a 2a 20 50 61 67 65 20 70 50 61 72 65 6e 74 20  ** Page pParent 
28490 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28  is an internal (
284a0 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65 20 70  non-leaf) tree p
284b0 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  age. This functi
284c0 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73 20 74  on .** asserts t
284d0 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  hat page number 
284e0 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 6c 65  iChild is the le
284f0 66 74 2d 63 68 69 6c 64 20 69 66 20 74 68 65 20  ft-child if the 
28500 69 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20  iIdx'th.** cell 
28510 69 6e 20 70 61 67 65 20 70 50 61 72 65 6e 74 2e  in page pParent.
28520 20 4f 72 2c 20 69 66 20 69 49 64 78 20 69 73 20   Or, if iIdx is 
28530 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 6f 74  equal to the tot
28540 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  al number of.** 
28550 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74  cells in pParent
28560 2c 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62  , that page numb
28570 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65  er iChild is the
28580 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a   right-child of.
28590 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  ** the page..*/.
285a0 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
285b0 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 4d 65  rtParentIndex(Me
285c0 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20  mPage *pParent, 
285d0 69 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f 20 69  int iIdx, Pgno i
285e0 43 68 69 6c 64 29 7b 0a 20 20 69 66 28 20 43 4f  Child){.  if( CO
285f0 52 52 55 50 54 5f 44 42 20 29 20 72 65 74 75 72  RRUPT_DB ) retur
28600 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6e 64 69  n;  /* The condi
28610 74 69 6f 6e 73 20 74 65 73 74 65 64 20 62 65 6c  tions tested bel
28620 6f 77 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20  ow might not be 
28630 74 72 75 65 0a 20 20 20 20 20 20 20 20 20 20 20  true.           
28640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28650 20 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74   ** in a corrupt
28660 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 61   database */.  a
28670 73 73 65 72 74 28 20 69 49 64 78 3c 3d 70 50 61  ssert( iIdx<=pPa
28680 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  rent->nCell );. 
28690 20 69 66 28 20 69 49 64 78 3d 3d 70 50 61 72 65   if( iIdx==pPare
286a0 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  nt->nCell ){.   
286b0 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74   assert( get4byt
286c0 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
286d0 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
286e0 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c 64  fset+8])==iChild
286f0 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
28700 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74   assert( get4byt
28710 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65  e(findCell(pPare
28720 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69 43 68 69  nt, iIdx))==iChi
28730 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73  ld );.  }.}.#els
28740 65 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73 65  e.#  define asse
28750 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 78 2c  rtParentIndex(x,
28760 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a  y,z) .#endif../*
28770 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
28780 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70 61  sor up to the pa
28790 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  rent page..**.**
287a0 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65   pCur->idx is se
287b0 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e  t to the cell in
287c0 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  dex that contain
287d0 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a  s the pointer.**
287e0 20 74 6f 20 74 68 65 20 70 61 67 65 20 77 65 20   to the page we 
287f0 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e  are coming from.
28800 20 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d 69    If we are comi
28810 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72  ng from the.** r
28820 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20  ight-most child 
28830 70 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d 3e  page then pCur->
28840 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f 6e  idx is set to on
28850 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74  e more than.** t
28860 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c 20  he largest cell 
28870 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  index..*/.static
28880 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72 65   void moveToPare
28890 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  nt(BtCursor *pCu
288a0 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  r){.  assert( cu
288b0 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
288c0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
288d0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
288e0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
288f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
28900 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20 61  ->iPage>0 );.  a
28910 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
28920 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
28930 20 29 3b 0a 20 20 61 73 73 65 72 74 50 61 72 65   );.  assertPare
28940 6e 74 49 6e 64 65 78 28 0a 20 20 20 20 70 43 75  ntIndex(.    pCu
28950 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
28960 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70  iPage-1], .    p
28970 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
28980 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20  >iPage-1], .    
28990 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
289a0 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a  r->iPage]->pgno.
289b0 20 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28    );.  testcase(
289c0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
289d0 72 2d 3e 69 50 61 67 65 2d 31 5d 20 3e 20 70 43  r->iPage-1] > pC
289e0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
289f0 3e 69 50 61 67 65 2d 31 5d 2d 3e 6e 43 65 6c 6c  >iPage-1]->nCell
28a00 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f   );.  pCur->info
28a10 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
28a20 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
28a30 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  ~(BTCF_ValidNKey
28a40 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  |BTCF_ValidOvfl)
28a50 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e  ;.  releasePageN
28a60 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 61 70 50  otNull(pCur->apP
28a70 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  age[pCur->iPage-
28a80 2d 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  -]);.}../*.** Mo
28a90 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
28aa0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f   point to the ro
28ab0 6f 74 20 70 61 67 65 20 6f 66 20 69 74 73 20 62  ot page of its b
28ac0 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e  -tree structure.
28ad0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 61  .**.** If the ta
28ae0 62 6c 65 20 68 61 73 20 61 20 76 69 72 74 75 61  ble has a virtua
28af0 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65  l root page, the
28b00 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  n the cursor is 
28b10 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74 0a 2a  moved to point.*
28b20 2a 20 74 6f 20 74 68 65 20 76 69 72 74 75 61 6c  * to the virtual
28b30 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 73 74 65   root page inste
28b40 61 64 20 6f 66 20 74 68 65 20 61 63 74 75 61 6c  ad of the actual
28b50 20 72 6f 6f 74 20 70 61 67 65 2e 20 41 20 74 61   root page. A ta
28b60 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76 69 72  ble has a.** vir
28b70 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 77  tual root page w
28b80 68 65 6e 20 74 68 65 20 61 63 74 75 61 6c 20 72  hen the actual r
28b90 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  oot page contain
28ba0 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64 20 61  s no cells and a
28bb0 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68 69 6c   .** single chil
28bc0 64 20 70 61 67 65 2e 20 54 68 69 73 20 63 61 6e  d page. This can
28bd0 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77 69 74   only happen wit
28be0 68 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74  h the table root
28bf0 65 64 20 61 74 20 70 61 67 65 20 31 2e 0a 2a 2a  ed at page 1..**
28c00 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d 74 72 65  .** If the b-tre
28c10 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65  e structure is e
28c20 6d 70 74 79 2c 20 74 68 65 20 63 75 72 73 6f 72  mpty, the cursor
28c30 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f   state is set to
28c40 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e 56 41   .** CURSOR_INVA
28c50 4c 49 44 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  LID. Otherwise, 
28c60 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 73 65  the cursor is se
28c70 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
28c80 65 20 66 69 72 73 74 0a 2a 2a 20 63 65 6c 6c 20  e first.** cell 
28c90 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20 72  located on the r
28ca0 6f 6f 74 20 28 6f 72 20 76 69 72 74 75 61 6c 20  oot (or virtual 
28cb0 72 6f 6f 74 29 20 70 61 67 65 20 61 6e 64 20 74  root) page and t
28cc0 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 0a  he cursor state.
28cd0 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 43 55 52  ** is set to CUR
28ce0 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a  SOR_VALID..**.**
28cf0 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   If this functio
28d00 6e 20 72 65 74 75 72 6e 73 20 73 75 63 63 65 73  n returns succes
28d10 73 66 75 6c 6c 79 2c 20 69 74 20 6d 61 79 20 62  sfully, it may b
28d20 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  e assumed that t
28d30 68 65 0a 2a 2a 20 70 61 67 65 2d 68 65 61 64 65  he.** page-heade
28d40 72 20 66 6c 61 67 73 20 69 6e 64 69 63 61 74 65  r flags indicate
28d50 20 74 68 61 74 20 74 68 65 20 5b 76 69 72 74 75   that the [virtu
28d60 61 6c 5d 20 72 6f 6f 74 2d 70 61 67 65 20 69 73  al] root-page is
28d70 20 74 68 65 20 65 78 70 65 63 74 65 64 20 0a 2a   the expected .*
28d80 2a 20 6b 69 6e 64 20 6f 66 20 62 2d 74 72 65 65  * kind of b-tree
28d90 20 70 61 67 65 20 28 69 2e 65 2e 20 69 66 20 77   page (i.e. if w
28da0 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65 20  hen opening the 
28db0 63 75 72 73 6f 72 20 74 68 65 20 63 61 6c 6c 65  cursor the calle
28dc0 72 20 64 69 64 20 6e 6f 74 0a 2a 2a 20 73 70 65  r did not.** spe
28dd0 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 73  cify a KeyInfo s
28de0 74 72 75 63 74 75 72 65 20 74 68 65 20 66 6c 61  tructure the fla
28df0 67 73 20 62 79 74 65 20 69 73 20 73 65 74 20 74  gs byte is set t
28e00 6f 20 30 78 30 35 20 6f 72 20 30 78 30 44 2c 0a  o 0x05 or 0x0D,.
28e10 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 61 20  ** indicating a 
28e20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 20 6f 72  table b-tree, or
28e30 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72 20 64   if the caller d
28e40 69 64 20 73 70 65 63 69 66 79 20 61 20 4b 65 79  id specify a Key
28e50 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74 75  Info .** structu
28e60 72 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74  re the flags byt
28e70 65 20 69 73 20 73 65 74 20 74 6f 20 30 78 30 32  e is set to 0x02
28e80 20 6f 72 20 30 78 30 41 2c 20 69 6e 64 69 63 61   or 0x0A, indica
28e90 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 0a 2a 2a  ting an index.**
28ea0 20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73 74 61   b-tree)..*/.sta
28eb0 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f  tic int moveToRo
28ec0 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ot(BtCursor *pCu
28ed0 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  r){.  MemPage *p
28ee0 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Root;.  int rc =
28ef0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
28f00 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
28f10 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
28f20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
28f30 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55  SOR_INVALID < CU
28f40 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
28f50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
28f60 52 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43  RSOR_VALID   < C
28f70 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
28f80 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  K );.  assert( C
28f90 55 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20  URSOR_FAULT   > 
28fa0 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
28fb0 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  EK );.  if( pCur
28fc0 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52  ->eState>=CURSOR
28fd0 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a  _REQUIRESEEK ){.
28fe0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53      if( pCur->eS
28ff0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55  tate==CURSOR_FAU
29000 4c 54 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  LT ){.      asse
29010 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  rt( pCur->skipNe
29020 78 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  xt!=SQLITE_OK );
29030 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43  .      return pC
29040 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20  ur->skipNext;.  
29050 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
29060 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28  treeClearCursor(
29070 70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  pCur);.  }..  if
29080 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  ( pCur->iPage>=0
29090 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70   ){.    while( p
290a0 43 75 72 2d 3e 69 50 61 67 65 20 29 7b 0a 20 20  Cur->iPage ){.  
290b0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
290c0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
290d0 50 61 67 65 5d 21 3d 30 20 29 3b 0a 20 20 20 20  Page]!=0 );.    
290e0 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74    releasePageNot
290f0 4e 75 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67  Null(pCur->apPag
29100 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 5d  e[pCur->iPage--]
29110 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
29120 20 69 66 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52   if( pCur->pgnoR
29130 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43  oot==0 ){.    pC
29140 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
29150 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
29160 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
29170 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
29180 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
29190 61 67 65 3d 3d 28 2d 31 29 20 29 3b 0a 20 20 20  age==(-1) );.   
291a0 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74   rc = getAndInit
291b0 50 61 67 65 28 70 43 75 72 2d 3e 70 42 74 72 65  Page(pCur->pBtre
291c0 65 2d 3e 70 42 74 2c 20 70 43 75 72 2d 3e 70 67  e->pBt, pCur->pg
291d0 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61  noRoot, &pCur->a
291e0 70 50 61 67 65 5b 30 5d 2c 0a 20 20 20 20 20 20  pPage[0],.      
291f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29200 20 20 30 2c 20 70 43 75 72 2d 3e 63 75 72 50 61    0, pCur->curPa
29210 67 65 72 46 6c 61 67 73 29 3b 0a 20 20 20 20 69  gerFlags);.    i
29220 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
29230 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
29240 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
29250 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 72  INVALID;.      r
29260 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
29270 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20      pCur->iPage 
29280 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 63  = 0;.    pCur->c
29290 75 72 49 6e 74 4b 65 79 20 3d 20 70 43 75 72 2d  urIntKey = pCur-
292a0 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b  >apPage[0]->intK
292b0 65 79 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f 74 20  ey;.  }.  pRoot 
292c0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  = pCur->apPage[0
292d0 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f  ];.  assert( pRo
292e0 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e  ot->pgno==pCur->
292f0 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20 20 2f  pgnoRoot );..  /
29300 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b 65 79 49  * If pCur->pKeyI
29310 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  nfo is not NULL,
29320 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72   then the caller
29330 20 74 68 61 74 20 6f 70 65 6e 65 64 20 74 68 69   that opened thi
29340 73 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 65 78  s cursor.  ** ex
29350 70 65 63 74 65 64 20 74 6f 20 6f 70 65 6e 20 69  pected to open i
29360 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d  t on an index b-
29370 74 72 65 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  tree. Otherwise,
29380 20 69 66 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a   if pKeyInfo is.
29390 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63    ** NULL, the c
293a0 61 6c 6c 65 72 20 65 78 70 65 63 74 73 20 61 20  aller expects a 
293b0 74 61 62 6c 65 20 62 2d 74 72 65 65 2e 20 49 66  table b-tree. If
293c0 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65   this is not the
293d0 20 63 61 73 65 2c 0a 20 20 2a 2a 20 72 65 74 75   case,.  ** retu
293e0 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52  rn an SQLITE_COR
293f0 52 55 50 54 20 65 72 72 6f 72 2e 20 0a 20 20 2a  RUPT error. .  *
29400 2a 0a 20 20 2a 2a 20 45 61 72 6c 69 65 72 20 76  *.  ** Earlier v
29410 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
29420 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  e assumed that t
29430 68 69 73 20 74 65 73 74 20 63 6f 75 6c 64 20 6e  his test could n
29440 6f 74 20 66 61 69 6c 0a 20 20 2a 2a 20 69 66 20  ot fail.  ** if 
29450 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 77 61  the root page wa
29460 73 20 61 6c 72 65 61 64 79 20 6c 6f 61 64 65 64  s already loaded
29470 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
29480 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 28  ion was called (
29490 69 2e 65 2e 0a 20 20 2a 2a 20 69 66 20 70 43 75  i.e..  ** if pCu
294a0 72 2d 3e 69 50 61 67 65 3e 3d 30 29 2e 20 42 75  r->iPage>=0). Bu
294b0 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20 73 6f  t this is not so
294c0 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
294d0 20 69 73 20 63 6f 72 72 75 70 74 65 64 20 0a 20   is corrupted . 
294e0 20 2a 2a 20 69 6e 20 73 75 63 68 20 61 20 77 61   ** in such a wa
294f0 79 20 74 68 61 74 20 70 61 67 65 20 70 52 6f 6f  y that page pRoo
29500 74 20 69 73 20 6c 69 6e 6b 65 64 20 69 6e 74 6f  t is linked into
29510 20 61 20 73 65 63 6f 6e 64 20 62 2d 74 72 65 65   a second b-tree
29520 20 74 61 62 6c 65 20 0a 20 20 2a 2a 20 28 6f 72   table .  ** (or
29530 20 74 68 65 20 66 72 65 65 6c 69 73 74 29 2e 20   the freelist). 
29540 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 52   */.  assert( pR
29550 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c  oot->intKey==1 |
29560 7c 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d  | pRoot->intKey=
29570 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 52 6f 6f  =0 );.  if( pRoo
29580 74 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20  t->isInit==0 || 
29590 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d  (pCur->pKeyInfo=
295a0 3d 30 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b  =0)!=pRoot->intK
295b0 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ey ){.    return
295c0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
295d0 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 70 43 75  BKPT;.  }..  pCu
295e0 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b  r->aiIdx[0] = 0;
295f0 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
29600 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
29610 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42  >curFlags &= ~(B
29620 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f  TCF_AtLast|BTCF_
29630 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
29640 61 6c 69 64 4f 76 66 6c 29 3b 0a 0a 20 20 69 66  alidOvfl);..  if
29650 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30  ( pRoot->nCell>0
29660 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53   ){.    pCur->eS
29670 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41  tate = CURSOR_VA
29680 4c 49 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  LID;.  }else if(
29690 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b   !pRoot->leaf ){
296a0 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70 61 67  .    Pgno subpag
296b0 65 3b 0a 20 20 20 20 69 66 28 20 70 52 6f 6f 74  e;.    if( pRoot
296c0 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72 65 74 75  ->pgno!=1 ) retu
296d0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
296e0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 73 75 62 70  T_BKPT;.    subp
296f0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
29700 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f  pRoot->aData[pRo
29710 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ot->hdrOffset+8]
29720 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  );.    pCur->eSt
29730 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
29740 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ID;.    rc = mov
29750 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73  eToChild(pCur, s
29760 75 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65  ubpage);.  }else
29770 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  {.    pCur->eSta
29780 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
29790 4c 49 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  LID;.  }.  retur
297a0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
297b0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
297c0 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d  own to the left-
297d0 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20  most leaf entry 
297e0 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65  beneath the.** e
297f0 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 69 74  ntry to which it
29800 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
29810 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  inting..**.** Th
29820 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66  e left-most leaf
29830 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68   is the one with
29840 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65   the smallest ke
29850 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a  y - the first.**
29860 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
29870 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
29880 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  nt moveToLeftmos
29890 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
298a0 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  ){.  Pgno pgno;.
298b0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
298c0 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20  E_OK;.  MemPage 
298d0 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  *pPage;..  asser
298e0 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
298f0 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
29900 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
29910 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
29920 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  LID );.  while( 
29930 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
29940 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d   !(pPage = pCur-
29950 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
29960 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20  age])->leaf ){. 
29970 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
29980 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
29990 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ge]<pPage->nCell
299a0 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67   );.    pgno = g
299b0 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
299c0 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 61 69  (pPage, pCur->ai
299d0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
299e0 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ));.    rc = mov
299f0 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70  eToChild(pCur, p
29a00 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  gno);.  }.  retu
29a10 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
29a20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
29a30 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68  down to the righ
29a40 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72  t-most leaf entr
29a50 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a  y beneath the.**
29a60 20 70 61 67 65 20 74 6f 20 77 68 69 63 68 20 69   page to which i
29a70 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
29a80 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65  ointing.  Notice
29a90 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a   the difference.
29aa0 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54  ** between moveT
29ab0 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20  oLeftmost() and 
29ac0 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
29ad0 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  ).  moveToLeftmo
29ae0 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68  st().** finds th
29af0 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72  e left-most entr
29b00 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65  y beneath the *e
29b10 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f  ntry* whereas mo
29b20 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a  veToRightmost().
29b30 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69 67  ** finds the rig
29b40 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65  ht-most entry be
29b50 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a  neath the *page*
29b60 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68  ..**.** The righ
29b70 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73 20  t-most entry is 
29b80 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65  the one with the
29b90 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20 74   largest key - t
29ba0 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69  he last.** key i
29bb0 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
29bc0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
29bd0 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
29be0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
29bf0 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20  {.  Pgno pgno;. 
29c00 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
29c10 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  _OK;.  MemPage *
29c20 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73  pPage = 0;..  as
29c30 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
29c40 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
29c50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
29c60 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
29c70 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c  _VALID );.  whil
29c80 65 28 20 21 28 70 50 61 67 65 20 3d 20 70 43 75  e( !(pPage = pCu
29c90 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
29ca0 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b  iPage])->leaf ){
29cb0 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34  .    pgno = get4
29cc0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
29cd0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
29ce0 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75  set+8]);.    pCu
29cf0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
29d00 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e  Page] = pPage->n
29d10 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d  Cell;.    rc = m
29d20 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
29d30 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20   pgno);.    if( 
29d40 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
29d50 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 69 49 64    }.  pCur->aiId
29d60 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
29d70 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b   pPage->nCell-1;
29d80 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
29d90 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29  >info.nSize==0 )
29da0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 43 75  ;.  assert( (pCu
29db0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
29dc0 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3d 3d 30  CF_ValidNKey)==0
29dd0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   );.  return SQL
29de0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f  ITE_OK;.}../* Mo
29df0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
29e00 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
29e10 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
29e20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
29e30 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  .** on success. 
29e40 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20   Set *pRes to 0 
29e50 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  if the cursor ac
29e60 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f  tually points to
29e70 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72   something.** or
29e80 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20   set *pRes to 1 
29e90 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
29ea0 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
29eb0 6c 69 74 65 33 42 74 72 65 65 46 69 72 73 74 28  lite3BtreeFirst(
29ec0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
29ed0 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
29ee0 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
29ef0 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
29f00 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
29f10 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
29f20 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
29f30 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
29f40 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76  x) );.  rc = mov
29f50 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
29f60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
29f70 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43  OK ){.    if( pC
29f80 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
29f90 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
29fa0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
29fb0 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c  ->pgnoRoot==0 ||
29fc0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
29fd0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
29fe0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70  l==0 );.      *p
29ff0 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  Res = 1;.    }el
2a000 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
2a010 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
2a020 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
2a030 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 2a 70  ll>0 );.      *p
2a040 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
2a050 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  c = moveToLeftmo
2a060 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  st(pCur);.    }.
2a070 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2a080 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
2a090 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61  cursor to the la
2a0a0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
2a0b0 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53  table.  Return S
2a0c0 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
2a0d0 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52  uccess.  Set *pR
2a0e0 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63  es to 0 if the c
2a0f0 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70  ursor actually p
2a100 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69  oints to somethi
2a110 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52  ng.** or set *pR
2a120 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74  es to 1 if the t
2a130 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
2a140 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
2a150 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72 20  eeLast(BtCursor 
2a160 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
2a170 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20  ){.  int rc;. . 
2a180 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
2a190 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
2a1a0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2a1b0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2a1c0 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
2a1d0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  db->mutex) );.. 
2a1e0 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f   /* If the curso
2a1f0 72 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 73  r already points
2a200 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
2a210 72 79 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  ry, this is a no
2a220 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55  -op. */.  if( CU
2a230 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72  RSOR_VALID==pCur
2a240 2d 3e 65 53 74 61 74 65 20 26 26 20 28 70 43 75  ->eState && (pCu
2a250 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
2a260 43 46 5f 41 74 4c 61 73 74 29 21 3d 30 20 29 7b  CF_AtLast)!=0 ){
2a270 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
2a280 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 69 73  EBUG.    /* This
2a290 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 74 6f   block serves to
2a2a0 20 61 73 73 65 72 74 28 29 20 74 68 61 74 20 74   assert() that t
2a2b0 68 65 20 63 75 72 73 6f 72 20 72 65 61 6c 6c 79  he cursor really
2a2c0 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20 20   does point .   
2a2d0 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73 74 20   ** to the last 
2a2e0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 62 2d 74  entry in the b-t
2a2f0 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ree. */.    int 
2a300 69 69 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30  ii;.    for(ii=0
2a310 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50 61 67 65  ; ii<pCur->iPage
2a320 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61  ; ii++){.      a
2a330 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
2a340 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70  dx[ii]==pCur->ap
2a350 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20  Page[ii]->nCell 
2a360 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
2a370 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
2a380 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 70  [pCur->iPage]==p
2a390 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2a3a0 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d  ->iPage]->nCell-
2a3b0 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
2a3c0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2a3d0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66  ur->iPage]->leaf
2a3e0 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72   );.#endif.    r
2a3f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2a400 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76  .  }..  rc = mov
2a410 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
2a420 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2a430 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 43 55  OK ){.    if( CU
2a440 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43  RSOR_INVALID==pC
2a450 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
2a460 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2a470 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c  ->pgnoRoot==0 ||
2a480 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2a490 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
2a4a0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70  l==0 );.      *p
2a4b0 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  Res = 1;.    }el
2a4c0 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
2a4d0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2a4e0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2a4f0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
2a500 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
2a510 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72  ToRightmost(pCur
2a520 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
2a530 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2a540 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46        pCur->curF
2a550 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 41 74 4c  lags |= BTCF_AtL
2a560 61 73 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ast;.      }else
2a570 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
2a580 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43  curFlags &= ~BTC
2a590 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20 20 20  F_AtLast;.      
2a5a0 7d 0a 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a  }.   .    }.  }.
2a5b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2a5c0 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
2a5d0 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f  or so that it po
2a5e0 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79  ints to an entry
2a5f0 20 6e 65 61 72 20 74 68 65 20 6b 65 79 20 0a 2a   near the key .*
2a600 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  * specified by p
2a610 49 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79  IdxKey or intKey
2a620 2e 20 20 20 52 65 74 75 72 6e 20 61 20 73 75 63  .   Return a suc
2a630 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  cess code..**.**
2a640 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c   For INTKEY tabl
2a650 65 73 2c 20 74 68 65 20 69 6e 74 4b 65 79 20 70  es, the intKey p
2a660 61 72 61 6d 65 74 65 72 20 69 73 20 75 73 65 64  arameter is used
2a670 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d  .  pIdxKey .** m
2a680 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f  ust be NULL.  Fo
2a690 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20  r index tables, 
2a6a0 70 49 64 78 4b 65 79 20 69 73 20 75 73 65 64 20  pIdxKey is used 
2a6b0 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73  and intKey.** is
2a6c0 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   ignored..**.** 
2a6d0 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63  If an exact matc
2a6e0 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20  h is not found, 
2a6f0 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
2a700 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66  is always.** lef
2a710 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20  t pointing at a 
2a720 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20  leaf page which 
2a730 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65  would hold the e
2a740 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65  ntry if it.** we
2a750 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65  re present.  The
2a760 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f   cursor might po
2a770 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  int to an entry 
2a780 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65  that comes.** be
2a790 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74 68  fore or after th
2a7a0 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  e key..**.** An 
2a7b0 69 6e 74 65 67 65 72 20 69 73 20 77 72 69 74 74  integer is writt
2a7c0 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20 77 68  en into *pRes wh
2a7d0 69 63 68 20 69 73 20 74 68 65 20 72 65 73 75 6c  ich is the resul
2a7e0 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e  t of.** comparin
2a7f0 67 20 74 68 65 20 6b 65 79 20 77 69 74 68 20 74  g the key with t
2a800 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63  he entry to whic
2a810 68 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  h the cursor is 
2a820 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54  .** pointing.  T
2a830 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68  he meaning of th
2a840 65 20 69 6e 74 65 67 65 72 20 77 72 69 74 74 65  e integer writte
2a850 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20  n into.** *pRes 
2a860 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  is as follows:.*
2a870 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30  *.**     *pRes<0
2a880 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72        The cursor
2a890 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
2a8a0 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  g at an entry th
2a8b0 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
2a8c0 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65         is smalle
2a8d0 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49  r than intKey/pI
2a8e0 64 78 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20  dxKey or if the 
2a8f0 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a  table is empty.*
2a900 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
2a910 20 20 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f     and the curso
2a920 72 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c  r is therefore l
2a930 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74  eft point to not
2a940 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  hing..**.**     
2a950 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65  *pRes==0     The
2a960 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
2a970 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
2a980 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
2a990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78                ex
2a9a0 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 69 6e  actly matches in
2a9b0 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a  tKey/pIdxKey..**
2a9c0 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20  .**     *pRes>0 
2a9d0 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
2a9e0 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
2a9f0 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
2aa00 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
2aa10 20 20 20 20 20 20 69 73 20 6c 61 72 67 65 72 20        is larger 
2aa20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78  than intKey/pIdx
2aa30 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 69  Key..**.** For i
2aa40 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 74 68 65  ndex tables, the
2aa50 20 70 49 64 78 4b 65 79 2d 3e 65 71 53 65 65 6e   pIdxKey->eqSeen
2aa60 20 66 69 65 6c 64 20 69 73 20 73 65 74 20 74 6f   field is set to
2aa70 20 31 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 65   1 if there.** e
2aa80 78 69 73 74 73 20 61 6e 20 65 6e 74 72 79 20 69  xists an entry i
2aa90 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  n the table that
2aaa0 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73   exactly matches
2aab0 20 70 49 64 78 4b 65 79 2e 20 20 0a 2a 2f 0a 69   pIdxKey.  .*/.i
2aac0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d  nt sqlite3BtreeM
2aad0 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20  ovetoUnpacked(. 
2aae0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
2aaf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2ab00 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f   cursor to be mo
2ab10 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  ved */.  Unpacke
2ab20 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79  dRecord *pIdxKey
2ab30 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e  , /* Unpacked in
2ab40 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34  dex key */.  i64
2ab50 20 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20   intKey,        
2ab60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62        /* The tab
2ab70 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  le key */.  int 
2ab80 62 69 61 73 52 69 67 68 74 2c 20 20 20 20 20 20  biasRight,      
2ab90 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c       /* If true,
2aba0 20 62 69 61 73 20 74 68 65 20 73 65 61 72 63 68   bias the search
2abb0 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64   to the high end
2abc0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20   */.  int *pRes 
2abd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2abe0 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72  * Write search r
2abf0 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29  esults here */.)
2ac00 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 52 65  {.  int rc;.  Re
2ac10 63 6f 72 64 43 6f 6d 70 61 72 65 20 78 52 65 63  cordCompare xRec
2ac20 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 0a 20 20 61  ordCompare;..  a
2ac30 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
2ac40 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
2ac50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
2ac60 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2ac70 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
2ac80 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
2ac90 73 65 72 74 28 20 70 52 65 73 20 29 3b 0a 20 20  sert( pRes );.  
2aca0 61 73 73 65 72 74 28 20 28 70 49 64 78 4b 65 79  assert( (pIdxKey
2acb0 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65  ==0)==(pCur->pKe
2acc0 79 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a 0a 20 20  yInfo==0) );..  
2acd0 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  /* If the cursor
2ace0 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 73 69   is already posi
2acf0 74 69 6f 6e 65 64 20 61 74 20 74 68 65 20 70 6f  tioned at the po
2ad00 69 6e 74 20 77 65 20 61 72 65 20 74 72 79 69 6e  int we are tryin
2ad10 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74  g.  ** to move t
2ad20 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74  o, then just ret
2ad30 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e  urn without doin
2ad40 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20  g any work */.  
2ad50 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
2ad60 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 26  ==CURSOR_VALID &
2ad70 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  & (pCur->curFlag
2ad80 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b  s & BTCF_ValidNK
2ad90 65 79 29 21 3d 30 0a 20 20 20 26 26 20 70 43 75  ey)!=0.   && pCu
2ada0 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 0a 20 20  r->curIntKey .  
2adb0 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
2adc0 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b  >info.nKey==intK
2add0 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  ey ){.      *pRe
2ade0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  s = 0;.      ret
2adf0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2ae00 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 43     }.    if( (pC
2ae10 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
2ae20 54 43 46 5f 41 74 4c 61 73 74 29 21 3d 30 20 26  TCF_AtLast)!=0 &
2ae30 26 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  & pCur->info.nKe
2ae40 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  y<intKey ){.    
2ae50 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20    *pRes = -1;.  
2ae60 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2ae70 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
2ae80 0a 20 20 69 66 28 20 70 49 64 78 4b 65 79 20 29  .  if( pIdxKey )
2ae90 7b 0a 20 20 20 20 78 52 65 63 6f 72 64 43 6f 6d  {.    xRecordCom
2aea0 70 61 72 65 20 3d 20 73 71 6c 69 74 65 33 56 64  pare = sqlite3Vd
2aeb0 62 65 46 69 6e 64 43 6f 6d 70 61 72 65 28 70 49  beFindCompare(pI
2aec0 64 78 4b 65 79 29 3b 0a 20 20 20 20 70 49 64 78  dxKey);.    pIdx
2aed0 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30  Key->errCode = 0
2aee0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
2aef0 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72  dxKey->default_r
2af00 63 3d 3d 31 20 0a 20 20 20 20 20 20 20 20 20 7c  c==1 .         |
2af10 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75  | pIdxKey->defau
2af20 6c 74 5f 72 63 3d 3d 30 20 0a 20 20 20 20 20 20  lt_rc==0 .      
2af30 20 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64     || pIdxKey->d
2af40 65 66 61 75 6c 74 5f 72 63 3d 3d 2d 31 0a 20 20  efault_rc==-1.  
2af50 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20    );.  }else{.  
2af60 20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65    xRecordCompare
2af70 20 3d 20 30 3b 20 2f 2a 20 41 6c 6c 20 6b 65 79   = 0; /* All key
2af80 73 20 61 72 65 20 69 6e 74 65 67 65 72 73 20 2a  s are integers *
2af90 2f 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f  /.  }..  rc = mo
2afa0 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
2afb0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2afc0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
2afd0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
2afe0 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43  gnoRoot==0 || pC
2aff0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2b000 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73  >iPage] );.  ass
2b010 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52  ert( pCur->pgnoR
2b020 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  oot==0 || pCur->
2b030 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2b040 67 65 5d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  ge]->isInit );. 
2b050 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
2b060 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
2b070 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 61  VALID || pCur->a
2b080 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2b090 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20  e]->nCell>0 );. 
2b0a0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
2b0b0 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
2b0c0 44 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d  D ){.    *pRes =
2b0d0 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28   -1;.    assert(
2b0e0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
2b0f0 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  =0 || pCur->apPa
2b100 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2b110 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
2b120 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2b130 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  K;.  }.  assert(
2b140 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
2b150 2d 3e 69 6e 74 4b 65 79 3d 3d 70 43 75 72 2d 3e  ->intKey==pCur->
2b160 63 75 72 49 6e 74 4b 65 79 20 29 3b 0a 20 20 61  curIntKey );.  a
2b170 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72  ssert( pCur->cur
2b180 49 6e 74 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65  IntKey || pIdxKe
2b190 79 20 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a  y );.  for(;;){.
2b1a0 20 20 20 20 69 6e 74 20 6c 77 72 2c 20 75 70 72      int lwr, upr
2b1b0 2c 20 69 64 78 2c 20 63 3b 0a 20 20 20 20 50 67  , idx, c;.    Pg
2b1c0 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d  no chldPg;.    M
2b1d0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
2b1e0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2b1f0 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 75  r->iPage];.    u
2b200 38 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20 20  8 *pCell;       
2b210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b220 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
2b230 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e   current cell in
2b240 20 70 50 61 67 65 20 2a 2f 0a 0a 20 20 20 20 2f   pPage */..    /
2b250 2a 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d  * pPage->nCell m
2b260 75 73 74 20 62 65 20 67 72 65 61 74 65 72 20 74  ust be greater t
2b270 68 61 6e 20 7a 65 72 6f 2e 20 49 66 20 74 68 69  han zero. If thi
2b280 73 20 69 73 20 74 68 65 20 72 6f 6f 74 2d 70 61  s is the root-pa
2b290 67 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75  ge.    ** the cu
2b2a0 72 73 6f 72 20 77 6f 75 6c 64 20 68 61 76 65 20  rsor would have 
2b2b0 62 65 65 6e 20 49 4e 56 41 4c 49 44 20 61 62 6f  been INVALID abo
2b2c0 76 65 20 61 6e 64 20 74 68 69 73 20 66 6f 72 28  ve and this for(
2b2d0 3b 3b 29 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20  ;;) loop.    ** 
2b2e0 6e 6f 74 20 72 75 6e 2e 20 49 66 20 74 68 69 73  not run. If this
2b2f0 20 69 73 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74   is not the root
2b300 2d 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20  -page, then the 
2b310 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 72 6f  moveToChild() ro
2b320 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 77 6f 75  utine.    ** wou
2b330 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ld have already 
2b340 64 65 74 65 63 74 65 64 20 64 62 20 63 6f 72 72  detected db corr
2b350 75 70 74 69 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c  uption. Similarl
2b360 79 2c 20 70 50 61 67 65 20 6d 75 73 74 0a 20 20  y, pPage must.  
2b370 20 20 2a 2a 20 62 65 20 74 68 65 20 72 69 67 68    ** be the righ
2b380 74 20 6b 69 6e 64 20 28 69 6e 64 65 78 20 6f 72  t kind (index or
2b390 20 74 61 62 6c 65 29 20 6f 66 20 62 2d 74 72 65   table) of b-tre
2b3a0 65 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73  e page. Otherwis
2b3b0 65 0a 20 20 20 20 2a 2a 20 61 20 6d 6f 76 65 54  e.    ** a moveT
2b3c0 6f 43 68 69 6c 64 28 29 20 6f 72 20 6d 6f 76 65  oChild() or move
2b3d0 54 6f 52 6f 6f 74 28 29 20 63 61 6c 6c 20 77 6f  ToRoot() call wo
2b3e0 75 6c 64 20 68 61 76 65 20 64 65 74 65 63 74 65  uld have detecte
2b3f0 64 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a  d corruption.  *
2b400 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
2b410 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a  age->nCell>0 );.
2b420 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2b430 65 2d 3e 69 6e 74 4b 65 79 3d 3d 28 70 49 64 78  e->intKey==(pIdx
2b440 4b 65 79 3d 3d 30 29 20 29 3b 0a 20 20 20 20 6c  Key==0) );.    l
2b450 77 72 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20  wr = 0;.    upr 
2b460 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31  = pPage->nCell-1
2b470 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 62 69  ;.    assert( bi
2b480 61 73 52 69 67 68 74 3d 3d 30 20 7c 7c 20 62 69  asRight==0 || bi
2b490 61 73 52 69 67 68 74 3d 3d 31 20 29 3b 0a 20 20  asRight==1 );.  
2b4a0 20 20 69 64 78 20 3d 20 75 70 72 3e 3e 28 31 2d    idx = upr>>(1-
2b4b0 62 69 61 73 52 69 67 68 74 29 3b 20 2f 2a 20 69  biasRight); /* i
2b4c0 64 78 20 3d 20 62 69 61 73 52 69 67 68 74 20 3f  dx = biasRight ?
2b4d0 20 75 70 72 20 3a 20 28 6c 77 72 2b 75 70 72 29   upr : (lwr+upr)
2b4e0 2f 32 3b 20 2a 2f 0a 20 20 20 20 70 43 75 72 2d  /2; */.    pCur-
2b4f0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2b500 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a  ge] = (u16)idx;.
2b510 20 20 20 20 69 66 28 20 78 52 65 63 6f 72 64 43      if( xRecordC
2b520 6f 6d 70 61 72 65 3d 3d 30 20 29 7b 0a 20 20 20  ompare==0 ){.   
2b530 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20     for(;;){.    
2b540 20 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79      i64 nCellKey
2b550 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20  ;.        pCell 
2b560 3d 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74  = findCellPastPt
2b570 72 28 70 50 61 67 65 2c 20 69 64 78 29 3b 0a 20  r(pPage, idx);. 
2b580 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
2b590 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a  ->intKeyLeaf ){.
2b5a0 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
2b5b0 20 30 78 38 30 20 3c 3d 20 2a 28 70 43 65 6c 6c   0x80 <= *(pCell
2b5c0 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ++) ){.         
2b5d0 20 20 20 69 66 28 20 70 43 65 6c 6c 3e 3d 70 50     if( pCell>=pP
2b5e0 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 20  age->aDataEnd ) 
2b5f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
2b600 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2b610 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2b620 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56 61 72  }.        getVar
2b630 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a  int(pCell, (u64*
2b640 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20  )&nCellKey);.   
2b650 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65       if( nCellKe
2b660 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  y<intKey ){.    
2b670 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b        lwr = idx+
2b680 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  1;.          if(
2b690 20 6c 77 72 3e 75 70 72 20 29 7b 20 63 20 3d 20   lwr>upr ){ c = 
2b6a0 2d 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20  -1; break; }.   
2b6b0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
2b6c0 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29  CellKey>intKey )
2b6d0 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70 72 20  {.          upr 
2b6e0 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 20  = idx-1;.       
2b6f0 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29     if( lwr>upr )
2b700 7b 20 63 20 3d 20 2b 31 3b 20 62 72 65 61 6b 3b  { c = +1; break;
2b710 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
2b720 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
2b730 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e  rt( nCellKey==in
2b740 74 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20  tKey );.        
2b750 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
2b760 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b   |= BTCF_ValidNK
2b770 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43  ey;.          pC
2b780 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20  ur->info.nKey = 
2b790 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  nCellKey;.      
2b7a0 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
2b7b0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
2b7c0 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20  u16)idx;.       
2b7d0 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
2b7e0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
2b7f0 20 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20     lwr = idx;.  
2b800 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
2b810 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72  oveto_next_layer
2b820 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
2b830 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  e{.            *
2b840 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
2b850 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2b860 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
2b870 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
2b880 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20  nish;.          
2b890 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2b8a0 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 2b      assert( lwr+
2b8b0 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  upr>=0 );.      
2b8c0 20 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72    idx = (lwr+upr
2b8d0 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20  )>>1;  /* idx = 
2b8e0 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a  (lwr+upr)/2; */.
2b8f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
2b900 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29  e{.      for(;;)
2b910 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43  {.        int nC
2b920 65 6c 6c 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66  ell;  /* Size of
2b930 20 74 68 65 20 70 43 65 6c 6c 20 63 65 6c 6c 20   the pCell cell 
2b940 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  in bytes */.    
2b950 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
2b960 43 65 6c 6c 50 61 73 74 50 74 72 28 70 50 61 67  CellPastPtr(pPag
2b970 65 2c 20 69 64 78 29 3b 0a 0a 20 20 20 20 20 20  e, idx);..      
2b980 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d    /* The maximum
2b990 20 73 75 70 70 6f 72 74 65 64 20 70 61 67 65 2d   supported page-
2b9a0 73 69 7a 65 20 69 73 20 36 35 35 33 36 20 62 79  size is 65536 by
2b9b0 74 65 73 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  tes. This means 
2b9c0 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
2b9d0 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
2b9e0 65 72 20 6f 66 20 72 65 63 6f 72 64 20 62 79 74  er of record byt
2b9f0 65 73 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20  es stored on an 
2ba00 69 6e 64 65 78 20 42 2d 54 72 65 65 0a 20 20 20  index B-Tree.   
2ba10 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20       ** page is 
2ba20 6c 65 73 73 20 74 68 61 6e 20 31 36 33 38 34 20  less than 16384 
2ba30 62 79 74 65 73 20 61 6e 64 20 6d 61 79 20 62 65  bytes and may be
2ba40 20 73 74 6f 72 65 64 20 61 73 20 61 20 32 2d 62   stored as a 2-b
2ba50 79 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 76  yte.        ** v
2ba60 61 72 69 6e 74 2e 20 54 68 69 73 20 69 6e 66 6f  arint. This info
2ba70 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  rmation is used 
2ba80 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61 76  to attempt to av
2ba90 6f 69 64 20 70 61 72 73 69 6e 67 20 0a 20 20 20  oid parsing .   
2baa0 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69       ** the enti
2bab0 72 65 20 63 65 6c 6c 20 62 79 20 63 68 65 63 6b  re cell by check
2bac0 69 6e 67 20 66 6f 72 20 74 68 65 20 63 61 73 65  ing for the case
2bad0 73 20 77 68 65 72 65 20 74 68 65 20 72 65 63 6f  s where the reco
2bae0 72 64 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a  rd is .        *
2baf0 2a 20 73 74 6f 72 65 64 20 65 6e 74 69 72 65 6c  * stored entirel
2bb00 79 20 77 69 74 68 69 6e 20 74 68 65 20 62 2d 74  y within the b-t
2bb10 72 65 65 20 70 61 67 65 20 62 79 20 69 6e 73 70  ree page by insp
2bb20 65 63 74 69 6e 67 20 74 68 65 20 66 69 72 73 74  ecting the first
2bb30 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 32 20 62   .        ** 2 b
2bb40 79 74 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c  ytes of the cell
2bb50 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
2bb60 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 43 65       nCell = pCe
2bb70 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69  ll[0];.        i
2bb80 66 28 20 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d  f( nCell<=pPage-
2bb90 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64  >max1bytePayload
2bba0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
2bbb0 20 54 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e   This branch run
2bbc0 73 20 69 66 20 74 68 65 20 72 65 63 6f 72 64 2d  s if the record-
2bbd0 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68  size field of th
2bbe0 65 20 63 65 6c 6c 20 69 73 20 61 0a 20 20 20 20  e cell is a.    
2bbf0 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20        ** single 
2bc00 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20  byte varint and 
2bc10 74 68 65 20 72 65 63 6f 72 64 20 66 69 74 73 20  the record fits 
2bc20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20  entirely on the 
2bc30 6d 61 69 6e 0a 20 20 20 20 20 20 20 20 20 20 2a  main.          *
2bc40 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20  * b-tree page.  
2bc50 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  */.          tes
2bc60 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65  tcase( pCell+nCe
2bc70 6c 6c 2b 31 3d 3d 70 50 61 67 65 2d 3e 61 44 61  ll+1==pPage->aDa
2bc80 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20  taEnd );.       
2bc90 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f     c = xRecordCo
2bca0 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f  mpare(nCell, (vo
2bcb0 69 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20 70  id*)&pCell[1], p
2bcc0 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  IdxKey);.       
2bcd0 20 7d 65 6c 73 65 20 69 66 28 20 21 28 70 43 65   }else if( !(pCe
2bce0 6c 6c 5b 31 5d 20 26 20 30 78 38 30 29 20 0a 20  ll[1] & 0x80) . 
2bcf0 20 20 20 20 20 20 20 20 20 26 26 20 28 6e 43 65           && (nCe
2bd00 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78 37  ll = ((nCell&0x7
2bd10 66 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b 31  f)<<7) + pCell[1
2bd20 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ])<=pPage->maxLo
2bd30 63 61 6c 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  cal.        ){. 
2bd40 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2bd50 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c  record-size fiel
2bd60 64 20 69 73 20 61 20 32 20 62 79 74 65 20 76 61  d is a 2 byte va
2bd70 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63  rint and the rec
2bd80 6f 72 64 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ord .          *
2bd90 2a 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20  * fits entirely 
2bda0 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d 74 72  on the main b-tr
2bdb0 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20  ee page.  */.   
2bdc0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2bdd0 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d   pCell+nCell+2==
2bde0 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
2bdf0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  );.          c =
2be00 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28   xRecordCompare(
2be10 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70  nCell, (void*)&p
2be20 43 65 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79  Cell[2], pIdxKey
2be30 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
2be40 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
2be50 68 65 20 72 65 63 6f 72 64 20 66 6c 6f 77 73 20  he record flows 
2be60 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72  over onto one or
2be70 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70   more overflow p
2be80 61 67 65 73 2e 20 49 6e 0a 20 20 20 20 20 20 20  ages. In.       
2be90 20 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65 20     ** this case 
2bea0 74 68 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e  the whole cell n
2beb0 65 65 64 73 20 74 6f 20 62 65 20 70 61 72 73 65  eeds to be parse
2bec0 64 2c 20 61 20 62 75 66 66 65 72 20 61 6c 6c 6f  d, a buffer allo
2bed0 63 61 74 65 64 0a 20 20 20 20 20 20 20 20 20 20  cated.          
2bee0 2a 2a 20 61 6e 64 20 61 63 63 65 73 73 50 61 79  ** and accessPay
2bef0 6c 6f 61 64 28 29 20 75 73 65 64 20 74 6f 20 72  load() used to r
2bf00 65 74 72 69 65 76 65 20 74 68 65 20 72 65 63 6f  etrieve the reco
2bf10 72 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20  rd into the.    
2bf20 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20        ** buffer 
2bf30 62 65 66 6f 72 65 20 56 64 62 65 52 65 63 6f 72  before VdbeRecor
2bf40 64 43 6f 6d 70 61 72 65 28 29 20 63 61 6e 20 62  dCompare() can b
2bf50 65 20 63 61 6c 6c 65 64 2e 20 0a 20 20 20 20 20  e called. .     
2bf60 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2bf70 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65 63 6f    ** If the reco
2bf80 72 64 20 69 73 20 63 6f 72 72 75 70 74 2c 20 74  rd is corrupt, t
2bf90 68 65 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72  he xRecordCompar
2bfa0 65 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 72 65  e routine may re
2bfb0 61 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ad.          ** 
2bfc0 75 70 20 74 6f 20 74 77 6f 20 76 61 72 69 6e 74  up to two varint
2bfd0 73 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  s past the end o
2bfe0 66 20 74 68 65 20 62 75 66 66 65 72 2e 20 41 6e  f the buffer. An
2bff0 20 65 78 74 72 61 20 31 38 20 0a 20 20 20 20 20   extra 18 .     
2c000 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66       ** bytes of
2c010 20 70 61 64 64 69 6e 67 20 69 73 20 61 6c 6c 6f   padding is allo
2c020 63 61 74 65 64 20 61 74 20 74 68 65 20 65 6e 64  cated at the end
2c030 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 69   of the buffer i
2c040 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  n.          ** c
2c050 61 73 65 20 74 68 69 73 20 68 61 70 70 65 6e 73  ase this happens
2c060 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
2c070 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a  void *pCellKey;.
2c080 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 20 63            u8 * c
2c090 6f 6e 73 74 20 70 43 65 6c 6c 42 6f 64 79 20 3d  onst pCellBody =
2c0a0 20 70 43 65 6c 6c 20 2d 20 70 50 61 67 65 2d 3e   pCell - pPage->
2c0b0 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
2c0c0 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78          pPage->x
2c0d0 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  ParseCell(pPage,
2c0e0 20 70 43 65 6c 6c 42 6f 64 79 2c 20 26 70 43 75   pCellBody, &pCu
2c0f0 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  r->info);.      
2c100 20 20 20 20 6e 43 65 6c 6c 20 3d 20 28 69 6e 74      nCell = (int
2c110 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79  )pCur->info.nKey
2c120 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
2c130 63 61 73 65 28 20 6e 43 65 6c 6c 3c 30 20 29 3b  case( nCell<0 );
2c140 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6b 65     /* True if ke
2c150 79 20 73 69 7a 65 20 69 73 20 32 5e 33 32 20 6f  y size is 2^32 o
2c160 72 20 6d 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20  r more */.      
2c170 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43      testcase( nC
2c180 65 6c 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20 49 6e  ell==0 );  /* In
2c190 76 61 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a 20  valid key size: 
2c1a0 20 30 78 38 30 20 30 78 38 30 20 30 78 30 30 20   0x80 0x80 0x00 
2c1b0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  */.          tes
2c1c0 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 31 20  tcase( nCell==1 
2c1d0 29 3b 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6b  );  /* Invalid k
2c1e0 65 79 20 73 69 7a 65 3a 20 20 30 78 38 30 20 30  ey size:  0x80 0
2c1f0 78 38 30 20 30 78 30 31 20 2a 2f 0a 20 20 20 20  x80 0x01 */.    
2c200 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2c210 6e 43 65 6c 6c 3d 3d 32 20 29 3b 20 20 2f 2a 20  nCell==2 );  /* 
2c220 4d 69 6e 69 6d 75 6d 20 6c 65 67 61 6c 20 69 6e  Minimum legal in
2c230 64 65 78 20 6b 65 79 20 73 69 7a 65 20 2a 2f 0a  dex key size */.
2c240 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 43            if( nC
2c250 65 6c 6c 3c 32 20 29 7b 0a 20 20 20 20 20 20 20  ell<2 ){.       
2c260 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2c270 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2c280 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
2c290 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
2c2a0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2c2b0 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20       pCellKey = 
2c2c0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e  sqlite3Malloc( n
2c2d0 43 65 6c 6c 2b 31 38 20 29 3b 0a 20 20 20 20 20  Cell+18 );.     
2c2e0 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65       if( pCellKe
2c2f0 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  y==0 ){.        
2c300 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2c310 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
2c320 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
2c330 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20  inish;.         
2c340 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43 75   }.          pCu
2c350 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2c360 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78  Page] = (u16)idx
2c370 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
2c380 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
2c390 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28  Cur, 0, nCell, (
2c3a0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70  unsigned char*)p
2c3b0 43 65 6c 6c 4b 65 79 2c 20 32 29 3b 0a 20 20 20  CellKey, 2);.   
2c3c0 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
2c3d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
2c3e0 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b  ite3_free(pCellK
2c3f0 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ey);.           
2c400 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
2c410 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ish;.          }
2c420 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78  .          c = x
2c430 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43  RecordCompare(nC
2c440 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70  ell, pCellKey, p
2c450 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  IdxKey);.       
2c460 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2c470 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20  pCellKey);.     
2c480 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
2c490 65 72 74 28 20 0a 20 20 20 20 20 20 20 20 20 20  ert( .          
2c4a0 20 20 28 70 49 64 78 4b 65 79 2d 3e 65 72 72 43    (pIdxKey->errC
2c4b0 6f 64 65 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52  ode!=SQLITE_CORR
2c4c0 55 50 54 20 7c 7c 20 63 3d 3d 30 29 0a 20 20 20  UPT || c==0).   
2c4d0 20 20 20 20 20 20 26 26 20 28 70 49 64 78 4b 65        && (pIdxKe
2c4e0 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  y->errCode!=SQLI
2c4f0 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 70 43 75 72  TE_NOMEM || pCur
2c500 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 61  ->pBtree->db->ma
2c510 6c 6c 6f 63 46 61 69 6c 65 64 29 0a 20 20 20 20  llocFailed).    
2c520 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
2c530 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( c<0 ){.      
2c540 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b      lwr = idx+1;
2c550 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
2c560 66 28 20 63 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( c>0 ){.      
2c570 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b      upr = idx-1;
2c580 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2c590 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2c5a0 28 20 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ( c==0 );.      
2c5b0 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
2c5c0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
2c5d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
2c5e0 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
2c5f0 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75  Cur->iPage] = (u
2c600 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20  16)idx;.        
2c610 20 20 69 66 28 20 70 49 64 78 4b 65 79 2d 3e 65    if( pIdxKey->e
2c620 72 72 43 6f 64 65 20 29 20 72 63 20 3d 20 53 51  rrCode ) rc = SQ
2c630 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20  LITE_CORRUPT;.  
2c640 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
2c650 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
2c660 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
2c670 28 20 6c 77 72 3e 75 70 72 20 29 20 62 72 65 61  ( lwr>upr ) brea
2c680 6b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  k;.        asser
2c690 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b  t( lwr+upr>=0 );
2c6a0 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d 20 28  .        idx = (
2c6b0 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a  lwr+upr)>>1;  /*
2c6c0 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29   idx = (lwr+upr)
2c6d0 2f 32 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  /2 */.      }.  
2c6e0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
2c6f0 6c 77 72 3d 3d 75 70 72 2b 31 20 7c 7c 20 28 70  lwr==upr+1 || (p
2c700 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20  Page->intKey && 
2c710 21 70 50 61 67 65 2d 3e 6c 65 61 66 29 20 29 3b  !pPage->leaf) );
2c720 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2c730 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
2c740 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
2c750 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  f ){.      asser
2c760 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
2c770 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72  Cur->iPage]<pCur
2c780 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2c790 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  Page]->nCell );.
2c7a0 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64        pCur->aiId
2c7b0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
2c7c0 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20   (u16)idx;.     
2c7d0 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20   *pRes = c;.    
2c7e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
2c7f0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76  ;.      goto mov
2c800 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
2c810 7d 0a 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61  }.moveto_next_la
2c820 79 65 72 3a 0a 20 20 20 20 69 66 28 20 6c 77 72  yer:.    if( lwr
2c830 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
2c840 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d  {.      chldPg =
2c850 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
2c860 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
2c870 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
2c880 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
2c890 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65  hldPg = get4byte
2c8a0 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
2c8b0 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20   lwr));.    }.  
2c8c0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
2c8d0 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
2c8e0 36 29 6c 77 72 3b 0a 20 20 20 20 72 63 20 3d 20  6)lwr;.    rc = 
2c8f0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
2c900 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69  , chldPg);.    i
2c910 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20  f( rc ) break;. 
2c920 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68   }.moveto_finish
2c930 3a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  :.  pCur->info.n
2c940 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
2c950 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28  ->curFlags &= ~(
2c960 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42  BTCF_ValidNKey|B
2c970 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a  TCF_ValidOvfl);.
2c980 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2c990 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
2c9a0 55 45 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  UE if the cursor
2c9b0 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67   is not pointing
2c9c0 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20   at an entry of 
2c9d0 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
2c9e0 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65   TRUE will be re
2c9f0 74 75 72 6e 65 64 20 61 66 74 65 72 20 61 20 63  turned after a c
2ca00 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74  all to sqlite3Bt
2ca10 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a  reeNext() moves.
2ca20 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73 74  ** past the last
2ca30 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
2ca40 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74  ble or sqlite3Bt
2ca50 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20  reePrev() moves 
2ca60 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73  past.** the firs
2ca70 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69  t entry.  TRUE i
2ca80 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20  s also returned 
2ca90 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
2caa0 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
2cab0 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28 42 74  lite3BtreeEof(Bt
2cac0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
2cad0 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69   /* TODO: What i
2cae0 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
2caf0 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  in CURSOR_REQUIR
2cb00 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61  ESEEK but all ta
2cb10 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a  ble entries.  **
2cb20 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74   have been delet
2cb30 65 64 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c  ed? This API wil
2cb40 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65  l need to change
2cb50 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72   to return an er
2cb60 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73  ror code.  ** as
2cb70 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f   well as the boo
2cb80 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75  lean result valu
2cb90 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  e..  */.  return
2cba0 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d   (CURSOR_VALID!=
2cbb0 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d  pCur->eState);.}
2cbc0 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ../*.** Advance 
2cbd0 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
2cbe0 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20  e next entry in 
2cbf0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
2cc00 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20  f.** successful 
2cc10 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30  then set *pRes=0
2cc20 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  .  If the cursor
2cc30 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20  .** was already 
2cc40 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
2cc50 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
2cc60 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  e database befor
2cc70 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  e.** this routin
2cc80 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68  e was called, th
2cc90 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a  en set *pRes=1..
2cca0 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65  **.** The main e
2ccb0 6e 74 72 79 20 70 6f 69 6e 74 20 69 73 20 73 71  ntry point is sq
2ccc0 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29  lite3BtreeNext()
2ccd0 2e 20 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20  .  That routine 
2cce0 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20  is optimized.** 
2ccf0 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63  for the common c
2cd00 61 73 65 20 6f 66 20 6d 65 72 65 6c 79 20 69 6e  ase of merely in
2cd10 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63  crementing the c
2cd20 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75  ell counter BtCu
2cd30 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f  rsor.aiIdx.** to
2cd40 20 74 68 65 20 6e 65 78 74 20 63 65 6c 6c 20 6f   the next cell o
2cd50 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  n the current pa
2cd60 67 65 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72  ge.  The (slower
2cd70 29 20 62 74 72 65 65 4e 65 78 74 28 29 20 68 65  ) btreeNext() he
2cd80 6c 70 65 72 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  lper.** routine 
2cd90 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69  is called when i
2cda0 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  t is necessary t
2cdb0 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66  o move to a diff
2cdc0 65 72 65 6e 74 20 70 61 67 65 20 6f 72 0a 2a 2a  erent page or.**
2cdd0 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
2cde0 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  cursor..**.** Th
2cdf0 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
2ce00 6f 6e 20 77 69 6c 6c 20 73 65 74 20 2a 70 52 65  on will set *pRe
2ce10 73 20 74 6f 20 30 20 6f 72 20 31 2e 20 20 54 68  s to 0 or 1.  Th
2ce20 65 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20  e initial *pRes 
2ce30 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65  value.** will be
2ce40 20 31 20 69 66 20 74 68 65 20 63 75 72 73 6f 72   1 if the cursor
2ce50 20 62 65 69 6e 67 20 73 74 65 70 70 65 64 20 63   being stepped c
2ce60 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e  orresponds to an
2ce70 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 0a 2a   SQL index and.*
2ce80 2a 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  * if this routin
2ce90 65 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65  e could have bee
2cea0 6e 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 61  n skipped if tha
2ceb0 74 20 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20  t SQL index had 
2cec0 62 65 65 6e 0a 2a 2a 20 61 20 75 6e 69 71 75 65  been.** a unique
2ced0 20 69 6e 64 65 78 2e 20 20 4f 74 68 65 72 77 69   index.  Otherwi
2cee0 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  se the caller wi
2cef0 6c 6c 20 68 61 76 65 20 73 65 74 20 2a 70 52 65  ll have set *pRe
2cf00 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65  s to zero..** Ze
2cf10 72 6f 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e  ro is the common
2cf20 20 63 61 73 65 2e 20 54 68 65 20 62 74 72 65 65   case. The btree
2cf30 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2cf40 69 73 20 66 72 65 65 20 74 6f 20 75 73 65 20 74  is free to use t
2cf50 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 2a 70  he.** initial *p
2cf60 52 65 73 20 76 61 6c 75 65 20 61 73 20 61 20 68  Res value as a h
2cf70 69 6e 74 20 74 6f 20 69 6d 70 72 6f 76 65 20 70  int to improve p
2cf80 65 72 66 6f 72 6d 61 6e 63 65 2c 20 62 75 74 20  erformance, but 
2cf90 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 53  the current.** S
2cfa0 51 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c  QLite btree impl
2cfb0 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20  ementation does 
2cfc0 6e 6f 74 2e 20 28 4e 6f 74 65 20 74 68 61 74 20  not. (Note that 
2cfd0 74 68 65 20 63 6f 6d 64 62 32 20 62 74 72 65 65  the comdb2 btree
2cfe0 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  .** implementati
2cff0 6f 6e 20 64 6f 65 73 20 75 73 65 20 74 68 69 73  on does use this
2d000 20 68 69 6e 74 2c 20 68 6f 77 65 76 65 72 2e 29   hint, however.)
2d010 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
2d020 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62  E_NOINLINE int b
2d030 74 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f  treeNext(BtCurso
2d040 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
2d050 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  es){.  int rc;. 
2d060 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50   int idx;.  MemP
2d070 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
2d080 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
2d090 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
2d0a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2d0b0 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c  r->skipNext==0 |
2d0c0 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  | pCur->eState!=
2d0d0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2d0e0 20 20 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d    assert( *pRes=
2d0f0 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  =0 );.  if( pCur
2d100 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
2d110 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 61 73  _VALID ){.    as
2d120 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72  sert( (pCur->cur
2d130 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c  Flags & BTCF_Val
2d140 69 64 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a 20 20  idOvfl)==0 );.  
2d150 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
2d160 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
2d170 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
2d180 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2d190 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2d1a0 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53    }.    if( CURS
2d1b0 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
2d1c0 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
2d1d0 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
2d1e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2d1f0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  _OK;.    }.    i
2d200 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  f( pCur->skipNex
2d210 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t ){.      asser
2d220 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
2d230 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c  =CURSOR_VALID ||
2d240 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2d250 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29  URSOR_SKIPNEXT )
2d260 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53  ;.      pCur->eS
2d270 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41  tate = CURSOR_VA
2d280 4c 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70  LID;.      if( p
2d290 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3e 30 20  Cur->skipNext>0 
2d2a0 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
2d2b0 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20  >skipNext = 0;. 
2d2c0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2d2d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
2d2e0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69  .      pCur->ski
2d2f0 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d  pNext = 0;.    }
2d300 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20  .  }..  pPage = 
2d310 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2d320 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64 78  r->iPage];.  idx
2d330 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78   = ++pCur->aiIdx
2d340 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
2d350 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2d360 69 73 49 6e 69 74 20 29 3b 0a 0a 20 20 2f 2a 20  isInit );..  /* 
2d370 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
2d380 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74 2c  file is corrupt,
2d390 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
2d3a0 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 6f 66  for the value of
2d3b0 20 69 64 78 20 0a 20 20 2a 2a 20 74 6f 20 62 65   idx .  ** to be
2d3c0 20 69 6e 76 61 6c 69 64 20 68 65 72 65 2e 20 54   invalid here. T
2d3d0 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63  his can only occ
2d3e0 75 72 20 69 66 20 61 20 73 65 63 6f 6e 64 20 63  ur if a second c
2d3f0 75 72 73 6f 72 20 6d 6f 64 69 66 69 65 73 0a 20  ursor modifies. 
2d400 20 2a 2a 20 74 68 65 20 70 61 67 65 20 77 68 69   ** the page whi
2d410 6c 65 20 63 75 72 73 6f 72 20 70 43 75 72 20 69  le cursor pCur i
2d420 73 20 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65  s holding a refe
2d430 72 65 6e 63 65 20 74 6f 20 69 74 2e 20 57 68 69  rence to it. Whi
2d440 63 68 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79  ch can.  ** only
2d450 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20 64   happen if the d
2d460 61 74 61 62 61 73 65 20 69 73 20 63 6f 72 72 75  atabase is corru
2d470 70 74 20 69 6e 20 73 75 63 68 20 61 20 77 61 79  pt in such a way
2d480 20 61 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 0a   as to link the.
2d490 20 20 2a 2a 20 70 61 67 65 20 69 6e 74 6f 20 6d    ** page into m
2d4a0 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 2d 74  ore than one b-t
2d4b0 72 65 65 20 73 74 72 75 63 74 75 72 65 2e 20 2a  ree structure. *
2d4c0 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 69 64  /.  testcase( id
2d4d0 78 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  x>pPage->nCell )
2d4e0 3b 0a 0a 20 20 69 66 28 20 69 64 78 3e 3d 70 50  ;..  if( idx>=pP
2d4f0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  age->nCell ){.  
2d500 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
2d510 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  af ){.      rc =
2d520 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
2d530 72 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61  r, get4byte(&pPa
2d540 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
2d550 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b  >hdrOffset+8]));
2d560 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
2d570 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2d580 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65   return moveToLe
2d590 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
2d5a0 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20    }.    do{.    
2d5b0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
2d5c0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
2d5d0 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
2d5e0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
2d5f0 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
2d600 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2d610 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2d620 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f    }.      moveTo
2d630 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20  Parent(pCur);.  
2d640 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72      pPage = pCur
2d650 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2d660 50 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c  Page];.    }whil
2d670 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  e( pCur->aiIdx[p
2d680 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 50 61  Cur->iPage]>=pPa
2d690 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
2d6a0 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
2d6b0 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ey ){.      retu
2d6c0 72 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  rn sqlite3BtreeN
2d6d0 65 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b  ext(pCur, pRes);
2d6e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2d6f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2d700 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
2d710 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
2d720 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2d730 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
2d740 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76  {.    return mov
2d750 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
2d760 29 3b 0a 20 20 7d 0a 7d 0a 69 6e 74 20 73 71 6c  );.  }.}.int sql
2d770 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 42 74  ite3BtreeNext(Bt
2d780 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
2d790 74 20 2a 70 52 65 73 29 7b 0a 20 20 4d 65 6d 50  t *pRes){.  MemP
2d7a0 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 61 73  age *pPage;.  as
2d7b0 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
2d7c0 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
2d7d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73  ;.  assert( pRes
2d7e0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
2d7f0 20 2a 70 52 65 73 3d 3d 30 20 7c 7c 20 2a 70 52   *pRes==0 || *pR
2d800 65 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  es==1 );.  asser
2d810 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  t( pCur->skipNex
2d820 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53  t==0 || pCur->eS
2d830 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
2d840 49 44 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e  ID );.  pCur->in
2d850 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
2d860 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2d870 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b  = ~(BTCF_ValidNK
2d880 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  ey|BTCF_ValidOvf
2d890 6c 29 3b 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b  l);.  *pRes = 0;
2d8a0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
2d8b0 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
2d8c0 44 20 29 20 72 65 74 75 72 6e 20 62 74 72 65 65  D ) return btree
2d8d0 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65 73 29  Next(pCur, pRes)
2d8e0 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ;.  pPage = pCur
2d8f0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2d900 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 28 2b 2b  Page];.  if( (++
2d910 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2d920 2d 3e 69 50 61 67 65 5d 29 3e 3d 70 50 61 67 65  ->iPage])>=pPage
2d930 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70  ->nCell ){.    p
2d940 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2d950 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 72  >iPage]--;.    r
2d960 65 74 75 72 6e 20 62 74 72 65 65 4e 65 78 74 28  eturn btreeNext(
2d970 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 7d  pCur, pRes);.  }
2d980 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65  .  if( pPage->le
2d990 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  af ){.    return
2d9a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
2d9b0 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
2d9c0 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
2d9d0 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Cur);.  }.}../*.
2d9e0 2a 2a 20 53 74 65 70 20 74 68 65 20 63 75 72 73  ** Step the curs
2d9f0 6f 72 20 74 6f 20 74 68 65 20 62 61 63 6b 20 74  or to the back t
2da00 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65  o the previous e
2da10 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
2da20 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63  base.  If.** suc
2da30 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74  cessful then set
2da40 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68   *pRes=0.  If th
2da50 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20  e cursor.** was 
2da60 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67  already pointing
2da70 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e   to the first en
2da80 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
2da90 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  ase before.** th
2daa0 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63  is routine was c
2dab0 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20  alled, then set 
2dac0 2a 70 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54  *pRes=1..**.** T
2dad0 68 65 20 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f  he main entry po
2dae0 69 6e 74 20 69 73 20 73 71 6c 69 74 65 33 42 74  int is sqlite3Bt
2daf0 72 65 65 50 72 65 76 69 6f 75 73 28 29 2e 20 20  reePrevious().  
2db00 54 68 61 74 20 72 6f 75 74 69 6e 65 20 69 73 20  That routine is 
2db10 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72  optimized.** for
2db20 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
2db30 20 6f 66 20 6d 65 72 65 6c 79 20 64 65 63 72 65   of merely decre
2db40 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 65 6c 6c  menting the cell
2db50 20 63 6f 75 6e 74 65 72 20 42 74 43 75 72 73 6f   counter BtCurso
2db60 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68  r.aiIdx.** to th
2db70 65 20 70 72 65 76 69 6f 75 73 20 63 65 6c 6c 20  e previous cell 
2db80 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  on the current p
2db90 61 67 65 2e 20 20 54 68 65 20 28 73 6c 6f 77 65  age.  The (slowe
2dba0 72 29 20 62 74 72 65 65 50 72 65 76 69 6f 75 73  r) btreePrevious
2dbb0 28 29 0a 2a 2a 20 68 65 6c 70 65 72 20 72 6f 75  ().** helper rou
2dbc0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
2dbd0 68 65 6e 20 69 74 20 69 73 20 6e 65 63 65 73 73  hen it is necess
2dbe0 61 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61  ary to move to a
2dbf0 20 64 69 66 66 65 72 65 6e 74 20 70 61 67 65 0a   different page.
2dc00 2a 2a 20 6f 72 20 74 6f 20 72 65 73 74 6f 72 65  ** or to restore
2dc10 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a   the cursor..**.
2dc20 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  ** The calling f
2dc30 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73 65 74  unction will set
2dc40 20 2a 70 52 65 73 20 74 6f 20 30 20 6f 72 20 31   *pRes to 0 or 1
2dc50 2e 20 20 54 68 65 20 69 6e 69 74 69 61 6c 20 2a  .  The initial *
2dc60 70 52 65 73 20 76 61 6c 75 65 0a 2a 2a 20 77 69  pRes value.** wi
2dc70 6c 6c 20 62 65 20 31 20 69 66 20 74 68 65 20 63  ll be 1 if the c
2dc80 75 72 73 6f 72 20 62 65 69 6e 67 20 73 74 65 70  ursor being step
2dc90 70 65 64 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  ped corresponds 
2dca0 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20  to an SQL index 
2dcb0 61 6e 64 0a 2a 2a 20 69 66 20 74 68 69 73 20 72  and.** if this r
2dcc0 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76  outine could hav
2dcd0 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64 20 69  e been skipped i
2dce0 66 20 74 68 61 74 20 53 51 4c 20 69 6e 64 65 78  f that SQL index
2dcf0 20 68 61 64 20 62 65 65 6e 0a 2a 2a 20 61 20 75   had been.** a u
2dd00 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20 4f 74  nique index.  Ot
2dd10 68 65 72 77 69 73 65 20 74 68 65 20 63 61 6c 6c  herwise the call
2dd20 65 72 20 77 69 6c 6c 20 68 61 76 65 20 73 65 74  er will have set
2dd30 20 2a 70 52 65 73 20 74 6f 20 7a 65 72 6f 2e 0a   *pRes to zero..
2dd40 2a 2a 20 5a 65 72 6f 20 69 73 20 74 68 65 20 63  ** Zero is the c
2dd50 6f 6d 6d 6f 6e 20 63 61 73 65 2e 20 54 68 65 20  ommon case. The 
2dd60 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61  btree implementa
2dd70 74 69 6f 6e 20 69 73 20 66 72 65 65 20 74 6f 20  tion is free to 
2dd80 75 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69  use the.** initi
2dd90 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 20 61  al *pRes value a
2dda0 73 20 61 20 68 69 6e 74 20 74 6f 20 69 6d 70 72  s a hint to impr
2ddb0 6f 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c  ove performance,
2ddc0 20 62 75 74 20 74 68 65 20 63 75 72 72 65 6e 74   but the current
2ddd0 0a 2a 2a 20 53 51 4c 69 74 65 20 62 74 72 65 65  .** SQLite btree
2dde0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2ddf0 64 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f 74 65 20  does not. (Note 
2de00 74 68 61 74 20 74 68 65 20 63 6f 6d 64 62 32 20  that the comdb2 
2de10 62 74 72 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65  btree.** impleme
2de20 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 75 73 65  ntation does use
2de30 20 74 68 69 73 20 68 69 6e 74 2c 20 68 6f 77 65   this hint, howe
2de40 76 65 72 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20  ver.).*/.static 
2de50 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
2de60 69 6e 74 20 62 74 72 65 65 50 72 65 76 69 6f 75  int btreePreviou
2de70 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  s(BtCursor *pCur
2de80 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
2de90 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67  int rc;.  MemPag
2dea0 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73  e *pPage;..  ass
2deb0 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
2dec0 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
2ded0 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73 21  .  assert( pRes!
2dee0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2def0 2a 70 52 65 73 3d 3d 30 20 29 3b 0a 20 20 61 73  *pRes==0 );.  as
2df00 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70  sert( pCur->skip
2df10 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Next==0 || pCur-
2df20 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
2df30 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
2df40 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  t( (pCur->curFla
2df50 67 73 20 26 20 28 42 54 43 46 5f 41 74 4c 61 73  gs & (BTCF_AtLas
2df60 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  t|BTCF_ValidOvfl
2df70 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29  |BTCF_ValidNKey)
2df80 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
2df90 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69  ( pCur->info.nSi
2dfa0 7a 65 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ze==0 );.  if( p
2dfb0 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
2dfc0 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
2dfd0 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
2dfe0 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
2dff0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2e000 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2e010 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2e020 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f   }.    if( CURSO
2e030 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
2e040 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20  >eState ){.     
2e050 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
2e060 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2e070 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OK;.    }.    if
2e080 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
2e090 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2e0a0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2e0b0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
2e0c0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2e0d0 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b  RSOR_SKIPNEXT );
2e0e0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74  .      pCur->eSt
2e0f0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
2e100 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43  ID;.      if( pC
2e110 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20 29  ur->skipNext<0 )
2e120 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
2e130 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  skipNext = 0;.  
2e140 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2e150 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
2e160 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70        pCur->skip
2e170 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Next = 0;.    }.
2e180 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70    }..  pPage = p
2e190 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2e1a0 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65  ->iPage];.  asse
2e1b0 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
2e1c0 74 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67  t );.  if( !pPag
2e1d0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 69  e->leaf ){.    i
2e1e0 6e 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61  nt idx = pCur->a
2e1f0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2e200 5d 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  ];.    rc = move
2e210 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65  ToChild(pCur, ge
2e220 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
2e230 70 50 61 67 65 2c 20 69 64 78 29 29 29 3b 0a 20  pPage, idx)));. 
2e240 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
2e250 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20  rn rc;.    rc = 
2e260 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
2e270 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pCur);.  }else{.
2e280 20 20 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d      while( pCur-
2e290 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2e2a0 67 65 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ge]==0 ){.      
2e2b0 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d  if( pCur->iPage=
2e2c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  =0 ){.        pC
2e2d0 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
2e2e0 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
2e2f0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
2e300 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2e310 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2e320 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61  }.      moveToPa
2e330 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20  rent(pCur);.    
2e340 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  }.    assert( pC
2e350 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
2e360 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2e370 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
2e380 20 26 20 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b   & (BTCF_ValidNK
2e390 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  ey|BTCF_ValidOvf
2e3a0 6c 29 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 70  l))==0 );..    p
2e3b0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2e3c0 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 70  >iPage]--;.    p
2e3d0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
2e3e0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2e3f0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
2e400 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67  >intKey && !pPag
2e410 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
2e420 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2e430 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c  eePrevious(pCur,
2e440 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73   pRes);.    }els
2e450 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
2e460 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
2e470 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2e480 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  }.int sqlite3Btr
2e490 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72  eePrevious(BtCur
2e4a0 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
2e4b0 70 52 65 73 29 7b 0a 20 20 61 73 73 65 72 74 28  pRes){.  assert(
2e4c0 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
2e4d0 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
2e4e0 73 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29  ssert( pRes!=0 )
2e4f0 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52 65  ;.  assert( *pRe
2e500 73 3d 3d 30 20 7c 7c 20 2a 70 52 65 73 3d 3d 31  s==0 || *pRes==1
2e510 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2e520 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20  ur->skipNext==0 
2e530 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  || pCur->eState!
2e540 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
2e550 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20  .  *pRes = 0;.  
2e560 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2e570 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61 73 74 7c  = ~(BTCF_AtLast|
2e580 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42  BTCF_ValidOvfl|B
2e590 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3b 0a  TCF_ValidNKey);.
2e5a0 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
2e5b0 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 43  ze = 0;.  if( pC
2e5c0 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2e5d0 4f 52 5f 56 41 4c 49 44 0a 20 20 20 7c 7c 20 70  OR_VALID.   || p
2e5e0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2e5f0 3e 69 50 61 67 65 5d 3d 3d 30 0a 20 20 20 7c 7c  >iPage]==0.   ||
2e600 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2e610 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66  ur->iPage]->leaf
2e620 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  ==0.  ){.    ret
2e630 75 72 6e 20 62 74 72 65 65 50 72 65 76 69 6f 75  urn btreePreviou
2e640 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  s(pCur, pRes);. 
2e650 20 7d 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78   }.  pCur->aiIdx
2e660 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b  [pCur->iPage]--;
2e670 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2e680 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  _OK;.}../*.** Al
2e690 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67  locate a new pag
2e6a0 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  e from the datab
2e6b0 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
2e6c0 54 68 65 20 6e 65 77 20 70 61 67 65 20 69 73 20  The new page is 
2e6d0 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e  marked as dirty.
2e6e0 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64    (In other word
2e6f0 73 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  s, sqlite3PagerW
2e700 72 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c  rite().** has al
2e710 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65  ready been calle
2e720 64 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67  d on the new pag
2e730 65 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61 67  e.)  The new pag
2e740 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65  e has also.** be
2e750 65 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61 6e  en referenced an
2e760 64 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f  d the calling ro
2e770 75 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e 73  utine is respons
2e780 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67  ible for calling
2e790 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72  .** sqlite3Pager
2e7a0 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20 6e  Unref() on the n
2e7b0 65 77 20 70 61 67 65 20 77 68 65 6e 20 69 74 20  ew page when it 
2e7c0 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53  is done..**.** S
2e7d0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2e7e0 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e  rned on success.
2e7f0 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75    Any other retu
2e800 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74  rn value indicat
2e810 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20  es.** an error. 
2e820 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
2e830 74 6f 20 4e 55 4c 4c 20 69 6e 20 74 68 65 20 65  to NULL in the e
2e840 76 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72  vent of an error
2e850 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22  ..**.** If the "
2e860 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65 74 65  nearby" paramete
2e870 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e  r is not 0, then
2e880 20 61 6e 20 65 66 66 6f 72 74 20 69 73 20 6d 61   an effort is ma
2e890 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65  de to .** locate
2e8a0 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f   a page close to
2e8b0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
2e8c0 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73   "nearby".  This
2e8d0 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20   can be used in 
2e8e0 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f  an.** attempt to
2e8f0 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20 70 61   keep related pa
2e900 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63  ges close to eac
2e910 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64  h other in the d
2e920 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a  atabase file,.**
2e930 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63   which in turn c
2e940 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65  an make database
2e950 20 61 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a   access faster..
2e960 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 4d 6f  **.** If the eMo
2e970 64 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  de parameter is 
2e980 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e  BTALLOC_EXACT an
2e990 64 20 74 68 65 20 6e 65 61 72 62 79 20 70 61 67  d the nearby pag
2e9a0 65 20 65 78 69 73 74 73 0a 2a 2a 20 61 6e 79 77  e exists.** anyw
2e9b0 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65  here on the free
2e9c0 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69  -list, then it i
2e9d0 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
2e9e0 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66  be returned.  If
2e9f0 0a 2a 2a 20 65 4d 6f 64 65 20 69 73 20 42 54 41  .** eMode is BTA
2ea00 4c 4c 4f 43 5f 4c 54 20 74 68 65 6e 20 74 68 65  LLOC_LT then the
2ea10 20 70 61 67 65 20 72 65 74 75 72 6e 65 64 20 77   page returned w
2ea20 69 6c 6c 20 62 65 20 6c 65 73 73 20 74 68 61 6e  ill be less than
2ea30 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74 6f 20   or equal.** to 
2ea40 6e 65 61 72 62 79 20 69 66 20 61 6e 79 20 73 75  nearby if any su
2ea50 63 68 20 70 61 67 65 20 65 78 69 73 74 73 2e 20  ch page exists. 
2ea60 20 49 66 20 65 4d 6f 64 65 20 69 73 20 42 54 41   If eMode is BTA
2ea70 4c 4c 4f 43 5f 41 4e 59 20 74 68 65 6e 20 74 68  LLOC_ANY then th
2ea80 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 72 65  ere.** are no re
2ea90 73 74 72 69 63 74 69 6f 6e 73 20 6f 6e 20 77 68  strictions on wh
2eaa0 69 63 68 20 70 61 67 65 20 69 73 20 72 65 74 75  ich page is retu
2eab0 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
2eac0 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  int allocateBtre
2ead0 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  ePage(.  BtShare
2eae0 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
2eaf0 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
2eb00 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
2eb10 67 65 2c 20 20 20 20 20 20 2f 2a 20 53 74 6f 72  ge,      /* Stor
2eb20 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
2eb30 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
2eb40 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a  here */.  Pgno *
2eb50 70 50 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20  pPgno,          
2eb60 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 70 61   /* Store the pa
2eb70 67 65 20 6e 75 6d 62 65 72 20 68 65 72 65 20 2a  ge number here *
2eb80 2f 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c  /.  Pgno nearby,
2eb90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
2eba0 61 72 63 68 20 66 6f 72 20 61 20 70 61 67 65 20  arch for a page 
2ebb0 6e 65 61 72 20 74 68 69 73 20 6f 6e 65 20 2a 2f  near this one */
2ebc0 0a 20 20 75 38 20 65 4d 6f 64 65 20 20 20 20 20  .  u8 eMode     
2ebd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 54 41            /* BTA
2ebe0 4c 4c 4f 43 5f 45 58 41 43 54 2c 20 42 54 41 4c  LLOC_EXACT, BTAL
2ebf0 4c 4f 43 5f 4c 54 2c 20 6f 72 20 42 54 41 4c 4c  LOC_LT, or BTALL
2ec00 4f 43 5f 41 4e 59 20 2a 2f 0a 29 7b 0a 20 20 4d  OC_ANY */.){.  M
2ec10 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a  emPage *pPage1;.
2ec20 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20    int rc;.  u32 
2ec30 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  n;     /* Number
2ec40 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65   of pages on the
2ec50 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75   freelist */.  u
2ec60 33 32 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d  32 k;     /* Num
2ec70 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e  ber of leaves on
2ec80 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68   the trunk of th
2ec90 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20  e freelist */.  
2eca0 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20  MemPage *pTrunk 
2ecb0 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
2ecc0 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a  pPrevTrunk = 0;.
2ecd0 20 20 50 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20    Pgno mxPage;  
2ece0 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65     /* Total size
2ecf0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2ed00 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65   file */..  asse
2ed10 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2ed20 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
2ed30 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
2ed40 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 41  eMode==BTALLOC_A
2ed50 4e 59 20 7c 7c 20 28 6e 65 61 72 62 79 3e 30 20  NY || (nearby>0 
2ed60 26 26 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70  && IfNotOmitAV(p
2ed70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 29  Bt->autoVacuum))
2ed80 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20 70   );.  pPage1 = p
2ed90 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d 78  Bt->pPage1;.  mx
2eda0 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65  Page = btreePage
2edb0 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 2f 2a  count(pBt);.  /*
2edc0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
2edd0 30 35 31 31 39 2d 30 32 36 33 37 20 54 68 65 20  05119-02637 The 
2ede0 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4-byte big-endia
2edf0 6e 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66  n integer at off
2ee00 73 65 74 20 33 36 0a 20 20 2a 2a 20 73 74 6f 72  set 36.  ** stor
2ee10 65 73 20 73 74 6f 72 65 73 20 74 68 65 20 74 6f  es stores the to
2ee20 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
2ee30 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
2ee40 69 73 74 2e 20 2a 2f 0a 20 20 6e 20 3d 20 67 65  ist. */.  n = ge
2ee50 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
2ee60 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 74 65  aData[36]);.  te
2ee70 73 74 63 61 73 65 28 20 6e 3d 3d 6d 78 50 61 67  stcase( n==mxPag
2ee80 65 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 3e 3d  e-1 );.  if( n>=
2ee90 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65  mxPage ){.    re
2eea0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
2eeb0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
2eec0 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f  if( n>0 ){.    /
2eed0 2a 20 54 68 65 72 65 20 61 72 65 20 70 61 67 65  * There are page
2eee0 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
2eef0 74 2e 20 20 52 65 75 73 65 20 6f 6e 65 20 6f 66  t.  Reuse one of
2ef00 20 74 68 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f   those pages. */
2ef10 0a 20 20 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b  .    Pgno iTrunk
2ef20 3b 0a 20 20 20 20 75 38 20 73 65 61 72 63 68 4c  ;.    u8 searchL
2ef30 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74  ist = 0; /* If t
2ef40 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6d 75 73  he free-list mus
2ef50 74 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f  t be searched fo
2ef60 72 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20  r 'nearby' */.  
2ef70 20 20 75 33 32 20 6e 53 65 61 72 63 68 20 3d 20    u32 nSearch = 
2ef80 30 3b 20 20 20 2f 2a 20 43 6f 75 6e 74 20 6f 66  0;   /* Count of
2ef90 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
2efa0 65 61 72 63 68 20 61 74 74 65 6d 70 74 73 20 2a  earch attempts *
2efb0 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66  /.    .    /* If
2efc0 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
2efd0 45 58 41 43 54 20 61 6e 64 20 61 20 71 75 65 72  EXACT and a quer
2efe0 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72  y of the pointer
2eff0 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77  -map.    ** show
2f000 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  s that the page 
2f010 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65  'nearby' is some
2f020 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65  where on the fre
2f030 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20  e-list, then.   
2f040 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c   ** the entire-l
2f050 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72  ist will be sear
2f060 63 68 65 64 20 66 6f 72 20 74 68 61 74 20 70 61  ched for that pa
2f070 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64  ge..    */.#ifnd
2f080 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2f090 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
2f0a0 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  ( eMode==BTALLOC
2f0b0 5f 45 58 41 43 54 20 29 7b 0a 20 20 20 20 20 20  _EXACT ){.      
2f0c0 69 66 28 20 6e 65 61 72 62 79 3c 3d 6d 78 50 61  if( nearby<=mxPa
2f0d0 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38  ge ){.        u8
2f0e0 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20   eType;.        
2f0f0 61 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30  assert( nearby>0
2f100 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
2f110 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
2f120 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 72  uum );.        r
2f130 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
2f140 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79 70  t, nearby, &eTyp
2f150 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  e, 0);.        i
2f160 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2f170 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  c;.        if( e
2f180 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45  Type==PTRMAP_FRE
2f190 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20  EPAGE ){.       
2f1a0 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
2f1b0 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
2f1c0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
2f1d0 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  f( eMode==BTALLO
2f1e0 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 73 65  C_LE ){.      se
2f1f0 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20  archList = 1;.  
2f200 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
2f210 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
2f220 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74   free-list count
2f230 20 62 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e   by 1. Set iTrun
2f240 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  k to the index o
2f250 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72  f the.    ** fir
2f260 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  st free-list tru
2f270 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54 72  nk page. iPrevTr
2f280 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79  unk is initially
2f290 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72   1..    */.    r
2f2a0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2f2b0 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
2f2c0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
2f2d0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2f2e0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
2f2f0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
2f300 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54   n-1);..    /* T
2f310 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74  he code within t
2f320 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20  his loop is run 
2f330 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65  only once if the
2f340 20 27 73 65 61 72 63 68 4c 69 73 74 27 20 76 61   'searchList' va
2f350 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73  riable.    ** is
2f360 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72   not true. Other
2f370 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e  wise, it runs on
2f380 63 65 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e  ce for each trun
2f390 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20  k-page on the.  
2f3a0 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75    ** free-list u
2f3b0 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e  ntil the page 'n
2f3c0 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65  earby' is locate
2f3d0 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  d (eMode==BTALLO
2f3e0 43 5f 45 58 41 43 54 29 0a 20 20 20 20 2a 2a 20  C_EXACT).    ** 
2f3f0 6f 72 20 75 6e 74 69 6c 20 61 20 70 61 67 65 20  or until a page 
2f400 6c 65 73 73 20 74 68 61 6e 20 27 6e 65 61 72 62  less than 'nearb
2f410 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65  y' is located (e
2f420 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 54  Mode==BTALLOC_LT
2f430 29 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20  ).    */.    do 
2f440 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75  {.      pPrevTru
2f450 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  nk = pTrunk;.   
2f460 20 20 20 69 66 28 20 70 50 72 65 76 54 72 75 6e     if( pPrevTrun
2f470 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  k ){.        /* 
2f480 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
2f490 31 35 30 36 2d 31 31 30 35 33 20 54 68 65 20 66  1506-11053 The f
2f4a0 69 72 73 74 20 69 6e 74 65 67 65 72 20 6f 6e 20  irst integer on 
2f4b0 61 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b  a freelist trunk
2f4c0 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
2f4d0 20 69 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d   is the page num
2f4e0 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ber of the next 
2f4f0 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
2f500 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 20  age in the list 
2f510 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 7a 65  or.        ** ze
2f520 72 6f 20 69 66 20 74 68 69 73 20 69 73 20 74 68  ro if this is th
2f530 65 20 6c 61 73 74 20 66 72 65 65 6c 69 73 74 20  e last freelist 
2f540 74 72 75 6e 6b 20 70 61 67 65 2e 20 2a 2f 0a 20  trunk page. */. 
2f550 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20         iTrunk = 
2f560 67 65 74 34 62 79 74 65 28 26 70 50 72 65 76 54  get4byte(&pPrevT
2f570 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b  runk->aData[0]);
2f580 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2f590 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
2f5a0 45 2d 4f 46 3a 20 52 2d 35 39 38 34 31 2d 31 33  E-OF: R-59841-13
2f5b0 37 39 38 20 54 68 65 20 34 2d 62 79 74 65 20 62  798 The 4-byte b
2f5c0 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
2f5d0 72 20 61 74 20 6f 66 66 73 65 74 20 33 32 0a 20  r at offset 32. 
2f5e0 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 73         ** stores
2f5f0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
2f600 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61   of the first pa
2f610 67 65 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  ge of the freeli
2f620 73 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66 0a 20  st, or zero if. 
2f630 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 72         ** the fr
2f640 65 65 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2e  eelist is empty.
2f650 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 54 72 75   */.        iTru
2f660 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
2f670 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
2f680 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2f690 20 74 65 73 74 63 61 73 65 28 20 69 54 72 75 6e   testcase( iTrun
2f6a0 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  k==mxPage );.   
2f6b0 20 20 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d 78     if( iTrunk>mx
2f6c0 50 61 67 65 20 7c 7c 20 6e 53 65 61 72 63 68 2b  Page || nSearch+
2f6d0 2b 20 3e 20 6e 20 29 7b 0a 20 20 20 20 20 20 20  + > n ){.       
2f6e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
2f6f0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
2f700 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2f710 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75  rc = btreeGetUnu
2f720 73 65 64 50 61 67 65 28 70 42 74 2c 20 69 54 72  sedPage(pBt, iTr
2f730 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29  unk, &pTrunk, 0)
2f740 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2f750 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
2f760 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
2f770 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2f780 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
2f790 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
2f7a0 72 74 28 20 70 54 72 75 6e 6b 21 3d 30 20 29 3b  rt( pTrunk!=0 );
2f7b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2f7c0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 21 3d 30 20  Trunk->aData!=0 
2f7d0 29 3b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44  );.      /* EVID
2f7e0 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 33 35 32 33  ENCE-OF: R-13523
2f7f0 2d 30 34 33 39 34 20 54 68 65 20 73 65 63 6f 6e  -04394 The secon
2f800 64 20 69 6e 74 65 67 65 72 20 6f 6e 20 61 20 66  d integer on a f
2f810 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  reelist trunk pa
2f820 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74  ge.      ** is t
2f830 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61  he number of lea
2f840 66 20 70 61 67 65 20 70 6f 69 6e 74 65 72 73 20  f page pointers 
2f850 74 6f 20 66 6f 6c 6c 6f 77 2e 20 2a 2f 0a 20 20  to follow. */.  
2f860 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74 65      k = get4byte
2f870 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
2f880 34 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6b  4]);.      if( k
2f890 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68 4c 69  ==0 && !searchLi
2f8a0 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  st ){.        /*
2f8b0 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73 20 6e   The trunk has n
2f8c0 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74 68 65  o leaves and the
2f8d0 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62 65 69   list is not bei
2f8e0 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a 20 20  ng searched. .  
2f8f0 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78 74 72        ** So extr
2f900 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61  act the trunk pa
2f910 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20 75 73  ge itself and us
2f920 65 20 69 74 20 61 73 20 74 68 65 20 6e 65 77 6c  e it as the newl
2f930 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  y .        ** al
2f940 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a  located page */.
2f950 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2f960 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b  pPrevTrunk==0 );
2f970 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
2f980 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2f990 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
2f9a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2f9b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
2f9c0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
2f9d0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
2f9e0 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d          *pPgno =
2f9f0 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   iTrunk;.       
2fa00 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d   memcpy(&pPage1-
2fa10 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72  >aData[32], &pTr
2fa20 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
2fa30 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61  );.        *ppPa
2fa40 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  ge = pTrunk;.   
2fa50 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b       pTrunk = 0;
2fa60 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28  .        TRACE((
2fa70 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72  "ALLOCATE: %d tr
2fa80 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61  unk - %d free pa
2fa90 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50  ges left\n", *pP
2faa0 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20  gno, n-1));.    
2fab0 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 28 75    }else if( k>(u
2fac0 33 32 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  32)(pBt->usableS
2fad0 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a 20 20  ize/4 - 2) ){.  
2fae0 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
2faf0 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72 61  f k is out of ra
2fb00 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65 20 63  nge.  Database c
2fb10 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  orruption */.   
2fb20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2fb30 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2fb40 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
2fb50 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23  allocate_page;.#
2fb60 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2fb70 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
2fb80 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65      }else if( se
2fb90 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20  archList .      
2fba0 20 20 20 20 20 20 26 26 20 28 6e 65 61 72 62 79        && (nearby
2fbb0 3d 3d 69 54 72 75 6e 6b 20 7c 7c 20 28 69 54 72  ==iTrunk || (iTr
2fbc0 75 6e 6b 3c 6e 65 61 72 62 79 20 26 26 20 65 4d  unk<nearby && eM
2fbd0 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29  ode==BTALLOC_LE)
2fbe0 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  ) .      ){.    
2fbf0 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20      /* The list 
2fc00 69 73 20 62 65 69 6e 67 20 73 65 61 72 63 68 65  is being searche
2fc10 64 20 61 6e 64 20 74 68 69 73 20 74 72 75 6e 6b  d and this trunk
2fc20 20 70 61 67 65 20 69 73 20 74 68 65 20 70 61 67   page is the pag
2fc30 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  e.        ** to 
2fc40 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61 72 64  allocate, regard
2fc50 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
2fc60 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e 0a 20  it has leaves.. 
2fc70 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2fc80 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e    *pPgno = iTrun
2fc90 6b 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61  k;.        *ppPa
2fca0 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  ge = pTrunk;.   
2fcb0 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
2fcc0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 0;.        rc 
2fcd0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2fce0 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
2fcf0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
2fd00 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
2fd10 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
2fd20 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
2fd30 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2fd40 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
2fd50 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e    if( !pPrevTrun
2fd60 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  k ){.           
2fd70 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d   memcpy(&pPage1-
2fd80 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72  >aData[32], &pTr
2fd90 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
2fda0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
2fdb0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2fdc0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2fdd0 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75 6e  rWrite(pPrevTrun
2fde0 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
2fdf0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
2fe00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2fe10 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
2fe20 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
2fe30 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ge;.            
2fe40 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  }.            me
2fe50 6d 63 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b  mcpy(&pPrevTrunk
2fe60 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72  ->aData[0], &pTr
2fe70 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
2fe80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
2fe90 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2fea0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
2feb0 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71  runk page is req
2fec0 75 69 72 65 64 20 62 79 20 74 68 65 20 63 61 6c  uired by the cal
2fed0 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61  ler but it conta
2fee0 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ins .          *
2fef0 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72  * pointers to fr
2ff00 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20  ee-list leaves. 
2ff10 54 68 65 20 66 69 72 73 74 20 6c 65 61 66 20 62  The first leaf b
2ff20 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20  ecomes a trunk. 
2ff30 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65           ** page
2ff40 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
2ff50 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
2ff60 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
2ff70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  NewTrunk;.      
2ff80 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75      Pgno iNewTru
2ff90 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
2ffa0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29  Trunk->aData[8])
2ffb0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2ffc0 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65  iNewTrunk>mxPage
2ffd0 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20   ){ .           
2ffe0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
2fff0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
30000 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
30010 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
30020 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
30030 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
30040 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65  NewTrunk==mxPage
30050 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   );.          rc
30060 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65   = btreeGetUnuse
30070 64 50 61 67 65 28 70 42 74 2c 20 69 4e 65 77 54  dPage(pBt, iNewT
30080 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b  runk, &pNewTrunk
30090 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
300a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
300b0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
300c0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
300d0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
300e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
300f0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
30100 57 72 69 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d  Write(pNewTrunk-
30110 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
30120 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
30130 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
30140 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
30150 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  e(pNewTrunk);.  
30160 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
30170 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
30180 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
30190 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
301a0 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
301b0 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  [0], &pTrunk->aD
301c0 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
301d0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
301e0 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
301f0 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20  [4], k-1);.     
30200 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65       memcpy(&pNe
30210 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d  wTrunk->aData[8]
30220 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
30230 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a  [12], (k-1)*4);.
30240 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
30250 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29  ePage(pNewTrunk)
30260 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
30270 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20  !pPrevTrunk ){. 
30280 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
30290 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
302a0 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
302b0 31 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  1->pDbPage) );. 
302c0 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
302d0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
302e0 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e  ta[32], iNewTrun
302f0 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  k);.          }e
30300 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
30310 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
30320 65 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75  erWrite(pPrevTru
30330 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
30340 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
30350 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
30360 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
30370 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
30380 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30390 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
303a0 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  revTrunk->aData[
303b0 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a  0], iNewTrunk);.
303c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
303d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54      }.        pT
303e0 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
303f0 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
30400 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25  TE: %d trunk - %
30410 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66  d free pages lef
30420 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d  t\n", *pPgno, n-
30430 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  1));.#endif.    
30440 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 30 20    }else if( k>0 
30450 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 78  ){.        /* Ex
30460 74 72 61 63 74 20 61 20 6c 65 61 66 20 66 72 6f  tract a leaf fro
30470 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20  m the trunk */. 
30480 20 20 20 20 20 20 20 75 33 32 20 63 6c 6f 73 65         u32 close
30490 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f  st;.        Pgno
304a0 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20   iPage;.        
304b0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
304c0 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61  Data = pTrunk->a
304d0 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 69 66  Data;.        if
304e0 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20 20  ( nearby>0 ){.  
304f0 20 20 20 20 20 20 20 20 75 33 32 20 69 3b 0a 20          u32 i;. 
30500 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
30510 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
30520 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  if( eMode==BTALL
30530 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 20  OC_LE ){.       
30540 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
30550 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  k; i++){.       
30560 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20 67         iPage = g
30570 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
30580 2b 69 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20  +i*4]);.        
30590 20 20 20 20 20 20 69 66 28 20 69 50 61 67 65 3c        if( iPage<
305a0 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20 20  =nearby ){.     
305b0 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65             close
305c0 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  st = i;.        
305d0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
305e0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
305f0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
30600 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
30610 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 69            int di
30620 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  st;.            
30630 64 69 73 74 20 3d 20 73 71 6c 69 74 65 33 41 62  dist = sqlite3Ab
30640 73 49 6e 74 33 32 28 67 65 74 34 62 79 74 65 28  sInt32(get4byte(
30650 26 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61  &aData[8]) - nea
30660 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rby);.          
30670 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20    for(i=1; i<k; 
30680 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
30690 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c      int d2 = sql
306a0 69 74 65 33 41 62 73 49 6e 74 33 32 28 67 65 74  ite3AbsInt32(get
306b0 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69  4byte(&aData[8+i
306c0 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a  *4]) - nearby);.
306d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
306e0 28 20 64 32 3c 64 69 73 74 20 29 7b 0a 20 20 20  ( d2<dist ){.   
306f0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f               clo
30700 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20  sest = i;.      
30710 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d            dist =
30720 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20   d2;.           
30730 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
30740 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
30750 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
30760 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
30770 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  = 0;.        }..
30780 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20          iPage = 
30790 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
307a0 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20  8+closest*4]);. 
307b0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
307c0 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29   iPage==mxPage )
307d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 50  ;.        if( iP
307e0 61 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20  age>mxPage ){.  
307f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
30800 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
30810 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
30820 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
30830 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
30840 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
30850 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b  iPage==mxPage );
30860 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 73 65  .        if( !se
30870 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20  archList .      
30880 20 20 20 7c 7c 20 28 69 50 61 67 65 3d 3d 6e 65     || (iPage==ne
30890 61 72 62 79 20 7c 7c 20 28 69 50 61 67 65 3c 6e  arby || (iPage<n
308a0 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d  earby && eMode==
308b0 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20  BTALLOC_LE)) .  
308c0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
308d0 20 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74     int noContent
308e0 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50 67  ;.          *pPg
308f0 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20  no = iPage;.    
30900 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
30910 4c 4f 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c  LOCATE: %d was l
30920 65 61 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20  eaf %d of %d on 
30930 74 72 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20  trunk %d".      
30940 20 20 20 20 20 20 20 20 20 20 20 22 3a 20 25 64             ": %d
30950 20 6d 6f 72 65 20 66 72 65 65 20 70 61 67 65 73   more free pages
30960 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
30970 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c        *pPgno, cl
30980 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75  osest+1, k, pTru
30990 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b  nk->pgno, n-1));
309a0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
309b0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
309c0 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
309d0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
309e0 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f  ( rc ) goto end_
309f0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
30a00 20 20 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f           if( clo
30a10 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20  sest<k-1 ){.    
30a20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
30a30 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a  aData[8+closest*
30a40 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34  4], &aData[4+k*4
30a50 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
30a60 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75 74   }.          put
30a70 34 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c  4byte(&aData[4],
30a80 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20   k-1);.         
30a90 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74   noContent = !bt
30aa0 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74  reeGetHasContent
30ab0 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29 3f 20 50  (pBt, *pPgno)? P
30ac0 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
30ad0 4e 54 20 3a 20 30 3b 0a 20 20 20 20 20 20 20 20  NT : 0;.        
30ae0 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55    rc = btreeGetU
30af0 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 2a  nusedPage(pBt, *
30b00 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e  pPgno, ppPage, n
30b10 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20  oContent);.     
30b20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
30b30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
30b40 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
30b50 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70  e3PagerWrite((*p
30b60 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
30b70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
30b80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
30b90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
30ba0 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
30bb0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
30bc0 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30       *ppPage = 0
30bd0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
30be0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
30bf0 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
30c00 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
30c10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
30c20 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54  leasePage(pPrevT
30c30 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50 72  runk);.      pPr
30c40 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20  evTrunk = 0;.   
30c50 20 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68 4c   }while( searchL
30c60 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ist );.  }else{.
30c70 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65      /* There are
30c80 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65   no pages on the
30c90 20 66 72 65 65 6c 69 73 74 2c 20 73 6f 20 61 70   freelist, so ap
30ca0 70 65 6e 64 20 61 20 6e 65 77 20 70 61 67 65 20  pend a new page 
30cb0 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  to the.    ** da
30cc0 74 61 62 61 73 65 20 69 6d 61 67 65 2e 0a 20 20  tabase image..  
30cd0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 72 6d    **.    ** Norm
30ce0 61 6c 6c 79 2c 20 6e 65 77 20 70 61 67 65 73 20  ally, new pages 
30cf0 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69  allocated by thi
30d00 73 20 62 6c 6f 63 6b 20 63 61 6e 20 62 65 20 72  s block can be r
30d10 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68  equested from th
30d20 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 6c  e.    ** pager l
30d30 61 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e  ayer with the 'n
30d40 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20  o-content' flag 
30d50 73 65 74 2e 20 54 68 69 73 20 70 72 65 76 65 6e  set. This preven
30d60 74 73 20 74 68 65 20 70 61 67 65 72 0a 20 20 20  ts the pager.   
30d70 20 2a 2a 20 66 72 6f 6d 20 74 72 79 69 6e 67 20   ** from trying 
30d80 74 6f 20 72 65 61 64 20 74 68 65 20 70 61 67 65  to read the page
30d90 73 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64  s content from d
30da0 69 73 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  isk. However, if
30db0 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72   the.    ** curr
30dc0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
30dd0 68 61 73 20 61 6c 72 65 61 64 79 20 72 75 6e 20  has already run 
30de0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 69 6e 63 72  one or more incr
30df0 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 0a 20  emental-vacuum. 
30e00 20 20 20 2a 2a 20 73 74 65 70 73 2c 20 74 68 65     ** steps, the
30e10 6e 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72  n the page we ar
30e20 65 20 61 62 6f 75 74 20 74 6f 20 61 6c 6c 6f 63  e about to alloc
30e30 61 74 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20  ate may contain 
30e40 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20 74  content.    ** t
30e50 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64 20  hat is required 
30e60 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20  in the event of 
30e70 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 6e 20 74  a rollback. In t
30e80 68 69 73 20 63 61 73 65 2c 20 64 6f 0a 20 20 20  his case, do.   
30e90 20 2a 2a 20 6e 6f 74 20 73 65 74 20 74 68 65 20   ** not set the 
30ea0 6e 6f 2d 63 6f 6e 74 65 6e 74 20 66 6c 61 67 2e  no-content flag.
30eb0 20 54 68 69 73 20 63 61 75 73 65 73 20 74 68 65   This causes the
30ec0 20 70 61 67 65 72 20 74 6f 20 6c 6f 61 64 20 61   pager to load a
30ed0 6e 64 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  nd journal.    *
30ee0 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  * the current pa
30ef0 67 65 20 63 6f 6e 74 65 6e 74 20 62 65 66 6f 72  ge content befor
30f00 65 20 6f 76 65 72 77 72 69 74 69 6e 67 20 69 74  e overwriting it
30f10 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
30f20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 70 61  Note that the pa
30f30 67 65 72 20 77 69 6c 6c 20 6e 6f 74 20 61 63 74  ger will not act
30f40 75 61 6c 6c 79 20 61 74 74 65 6d 70 74 20 74 6f  ually attempt to
30f50 20 6c 6f 61 64 20 6f 72 20 6a 6f 75 72 6e 61 6c   load or journal
30f60 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74   .    ** content
30f70 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20 74 68   for any page th
30f80 61 74 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 6c  at really does l
30f90 69 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  ie past the end 
30fa0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  of the database.
30fb0 20 20 20 20 2a 2a 20 66 69 6c 65 20 6f 6e 20 64      ** file on d
30fc0 69 73 6b 2e 20 53 6f 20 74 68 65 20 65 66 66 65  isk. So the effe
30fd0 63 74 73 20 6f 66 20 64 69 73 61 62 6c 69 6e 67  cts of disabling
30fe0 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20   the no-content 
30ff0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20  optimization.   
31000 20 2a 2a 20 68 65 72 65 20 61 72 65 20 63 6f 6e   ** here are con
31010 66 69 6e 65 64 20 74 6f 20 74 68 6f 73 65 20 70  fined to those p
31020 61 67 65 73 20 74 68 61 74 20 6c 69 65 20 62 65  ages that lie be
31030 74 77 65 65 6e 20 74 68 65 20 65 6e 64 20 6f 66  tween the end of
31040 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
31050 62 61 73 65 20 69 6d 61 67 65 20 61 6e 64 20 74  base image and t
31060 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61  he end of the da
31070 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
31080 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4e 6f 43   */.    int bNoC
31090 6f 6e 74 65 6e 74 20 3d 20 28 30 3d 3d 49 66 4e  ontent = (0==IfN
310a0 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62 44  otOmitAV(pBt->bD
310b0 6f 54 72 75 6e 63 61 74 65 29 29 3f 20 50 41 47  oTruncate))? PAG
310c0 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
310d0 3a 30 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71  :0;..    rc = sq
310e0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
310f0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62  pBt->pPage1->pDb
31100 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
31110 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
31120 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b     pBt->nPage++;
31130 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50  .    if( pBt->nP
31140 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  age==PENDING_BYT
31150 45 5f 50 41 47 45 28 70 42 74 29 20 29 20 70 42  E_PAGE(pBt) ) pB
31160 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69 66  t->nPage++;..#if
31170 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
31180 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
31190 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
311a0 75 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53  uum && PTRMAP_IS
311b0 50 41 47 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e  PAGE(pBt, pBt->n
311c0 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 2f  Page) ){.      /
311d0 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65  * If *pPgno refe
311e0 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d  rs to a pointer-
311f0 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61  map page, alloca
31200 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73  te two new pages
31210 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65  .      ** at the
31220 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
31230 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e   instead of one.
31240 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63   The first alloc
31250 61 74 65 64 20 70 61 67 65 0a 20 20 20 20 20 20  ated page.      
31260 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77  ** becomes a new
31270 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
31280 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73  e, the second is
31290 20 75 73 65 64 20 62 79 20 74 68 65 20 63 61 6c   used by the cal
312a0 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ler..      */.  
312b0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67      MemPage *pPg
312c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43   = 0;.      TRAC
312d0 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
312e0 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c   from end of fil
312f0 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  e (pointer-map p
31300 61 67 65 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50  age)\n", pBt->nP
31310 61 67 65 29 29 3b 0a 20 20 20 20 20 20 61 73 73  age));.      ass
31320 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 21  ert( pBt->nPage!
31330 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
31340 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20  GE(pBt) );.     
31350 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e   rc = btreeGetUn
31360 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 70 42  usedPage(pBt, pB
31370 74 2d 3e 6e 50 61 67 65 2c 20 26 70 50 67 2c 20  t->nPage, &pPg, 
31380 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20  bNoContent);.   
31390 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
313a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
313b0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
313c0 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50  rWrite(pPg->pDbP
313d0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  age);.        re
313e0 6c 65 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a  leasePage(pPg);.
313f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
31400 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
31410 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61  ;.      pBt->nPa
31420 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ge++;.      if( 
31430 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44  pBt->nPage==PEND
31440 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
31450 74 29 20 29 7b 20 70 42 74 2d 3e 6e 50 61 67 65  t) ){ pBt->nPage
31460 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64  ++; }.    }.#end
31470 69 66 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  if.    put4byte(
31480 32 38 20 2b 20 28 75 38 2a 29 70 42 74 2d 3e 70  28 + (u8*)pBt->p
31490 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 70 42  Page1->aData, pB
314a0 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 2a  t->nPage);.    *
314b0 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50 61  pPgno = pBt->nPa
314c0 67 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  ge;..    assert(
314d0 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47   *pPgno!=PENDING
314e0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
314f0 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  );.    rc = btre
31500 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70  eGetUnusedPage(p
31510 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61  Bt, *pPgno, ppPa
31520 67 65 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b  ge, bNoContent);
31530 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
31540 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20  turn rc;.    rc 
31550 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
31560 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  ite((*ppPage)->p
31570 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
31580 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
31590 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
315a0 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
315b0 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
315c0 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45  .    }.    TRACE
315d0 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
315e0 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65  from end of file
315f0 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20  \n", *pPgno));. 
31600 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70   }..  assert( *p
31610 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno!=PENDING_BY
31620 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
31630 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61  .end_allocate_pa
31640 67 65 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  ge:.  releasePag
31650 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c  e(pTrunk);.  rel
31660 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72  easePage(pPrevTr
31670 75 6e 6b 29 3b 0a 20 20 61 73 73 65 72 74 28 20  unk);.  assert( 
31680 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
31690 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
316a0 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61  eRefcount((*ppPa
316b0 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3c 3d 31  ge)->pDbPage)<=1
316c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63   );.  assert( rc
316d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28  !=SQLITE_OK || (
316e0 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74  *ppPage)->isInit
316f0 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
31700 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
31710 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
31720 65 64 20 74 6f 20 61 64 64 20 70 61 67 65 20 69  ed to add page i
31730 50 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  Page to the data
31740 62 61 73 65 20 66 69 6c 65 20 66 72 65 65 2d 6c  base file free-l
31750 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20 61  ist. .** It is a
31760 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
31770 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
31780 61 64 79 20 61 20 70 61 72 74 20 6f 66 20 74 68  ady a part of th
31790 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a  e free-list..**.
317a0 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 70 61 73  ** The value pas
317b0 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
317c0 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
317d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
317e0 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74  ptional..** If t
317f0 68 65 20 63 61 6c 6c 65 72 20 68 61 70 70 65 6e  he caller happen
31800 73 20 74 6f 20 68 61 76 65 20 61 20 70 6f 69 6e  s to have a poin
31810 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50 61  ter to the MemPa
31820 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f  ge object .** co
31830 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70  rresponding to p
31840 61 67 65 20 69 50 61 67 65 20 68 61 6e 64 79 2c  age iPage handy,
31850 20 69 74 20 6d 61 79 20 70 61 73 73 20 69 74 20   it may pass it 
31860 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 76 61  as the second va
31870 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69  lue. .** Otherwi
31880 73 65 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20  se, it may pass 
31890 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  NULL..**.** If a
318a0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d 65   pointer to a Me
318b0 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20  mPage object is 
318c0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
318d0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a  cond argument,.*
318e0 2a 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20  * its reference 
318f0 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c 74  count is not alt
31900 65 72 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ered by this fun
31910 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
31920 20 69 6e 74 20 66 72 65 65 50 61 67 65 32 28 42   int freePage2(B
31930 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 4d 65  tShared *pBt, Me
31940 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61 67 65 2c  mPage *pMemPage,
31950 20 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20   Pgno iPage){.  
31960 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20  MemPage *pTrunk 
31970 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
31980 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73 74      /* Free-list
31990 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20   trunk page */. 
319a0 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 30   Pgno iTrunk = 0
319b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
319c0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
319d0 62 65 72 20 6f 66 20 66 72 65 65 2d 6c 69 73 74  ber of free-list
319e0 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20 0a   trunk page */ .
319f0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
31a00 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
31a10 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 72        /* Local r
31a20 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65  eference to page
31a30 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20   1 */.  MemPage 
31a40 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  *pPage;         
31a50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
31a60 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 2e  age being freed.
31a70 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f   May be NULL. */
31a80 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
31a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31aa0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
31ab0 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   Code */.  int n
31ac0 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20  Free;           
31ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31ae0 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72  * Initial number
31af0 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 66 72 65   of pages on fre
31b00 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73  e-list */..  ass
31b10 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
31b20 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
31b30 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
31b40 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69   CORRUPT_DB || i
31b50 50 61 67 65 3e 31 20 29 3b 0a 20 20 61 73 73 65  Page>1 );.  asse
31b60 72 74 28 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c  rt( !pMemPage ||
31b70 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d   pMemPage->pgno=
31b80 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20 69 66 28  =iPage );..  if(
31b90 20 69 50 61 67 65 3c 32 20 29 20 72 65 74 75 72   iPage<2 ) retur
31ba0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
31bb0 5f 42 4b 50 54 3b 0a 20 20 69 66 28 20 70 4d 65  _BKPT;.  if( pMe
31bc0 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61  mPage ){.    pPa
31bd0 67 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20  ge = pMemPage;. 
31be0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
31bf0 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ef(pPage->pDbPag
31c00 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
31c10 20 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61   pPage = btreePa
31c20 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50  geLookup(pBt, iP
31c30 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  age);.  }..  /* 
31c40 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72  Increment the fr
31c50 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e  ee page count on
31c60 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20   pPage1 */.  rc 
31c70 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
31c80 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ite(pPage1->pDbP
31c90 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
31ca0 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
31cb0 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67 65  ut;.  nFree = ge
31cc0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
31cd0 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75  aData[36]);.  pu
31ce0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
31cf0 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65  aData[36], nFree
31d00 2b 31 29 3b 0a 0a 20 20 69 66 28 20 70 42 74 2d  +1);..  if( pBt-
31d10 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
31d20 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b  SECURE_DELETE ){
31d30 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
31d40 65 63 75 72 65 5f 64 65 6c 65 74 65 20 6f 70 74  ecure_delete opt
31d50 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20  ion is enabled, 
31d60 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c 77 61  then.    ** alwa
31d70 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69  ys fully overwri
31d80 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72  te deleted infor
31d90 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f  mation with zero
31da0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
31db0 28 20 28 21 70 50 61 67 65 20 26 26 20 28 28 72  ( (!pPage && ((r
31dc0 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
31dd0 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50  (pBt, iPage, &pP
31de0 61 67 65 2c 20 30 29 29 21 3d 30 29 20 29 0a 20  age, 0))!=0) ). 
31df0 20 20 20 20 7c 7c 20 20 20 20 20 20 20 20 20 20      ||          
31e00 20 20 28 28 72 63 20 3d 20 73 71 6c 69 74 65 33    ((rc = sqlite3
31e10 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
31e20 2d 3e 70 44 62 50 61 67 65 29 29 21 3d 30 29 0a  ->pDbPage))!=0).
31e30 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74      ){.      got
31e40 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
31e50 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74      }.    memset
31e60 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30  (pPage->aData, 0
31e70 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61  , pPage->pBt->pa
31e80 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20  geSize);.  }..  
31e90 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
31ea0 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f  se supports auto
31eb0 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20 61  -vacuum, write a
31ec0 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70  n entry in the p
31ed0 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20  ointer-map.  ** 
31ee0 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
31ef0 20 74 68 65 20 70 61 67 65 20 69 73 20 66 72 65   the page is fre
31f00 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 53  e..  */.  if( IS
31f10 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20  AUTOVACUUM ){.  
31f20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
31f30 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46   iPage, PTRMAP_F
31f40 52 45 45 50 41 47 45 2c 20 30 2c 20 26 72 63 29  REEPAGE, 0, &rc)
31f50 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
31f60 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
31f70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20  ;.  }..  /* Now 
31f80 6d 61 6e 69 70 75 6c 61 74 65 20 74 68 65 20 61  manipulate the a
31f90 63 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 66  ctual database f
31fa0 72 65 65 2d 6c 69 73 74 20 73 74 72 75 63 74 75  ree-list structu
31fb0 72 65 2e 20 54 68 65 72 65 20 61 72 65 20 74 77  re. There are tw
31fc0 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69  o.  ** possibili
31fd0 74 69 65 73 2e 20 49 66 20 74 68 65 20 66 72 65  ties. If the fre
31fe0 65 2d 6c 69 73 74 20 69 73 20 63 75 72 72 65 6e  e-list is curren
31ff0 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20 69 66  tly empty, or if
32000 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20   the first.  ** 
32010 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
32020 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66  e free-list is f
32030 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 70  ull, then this p
32040 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  age will become 
32050 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65 65 2d  a.  ** new free-
32060 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e  list trunk page.
32070 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 77   Otherwise, it w
32080 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65 61  ill become a lea
32090 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66 69  f of the.  ** fi
320a0 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69  rst trunk page i
320b0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 72  n the current fr
320c0 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 62 6c  ee-list. This bl
320d0 6f 63 6b 20 74 65 73 74 73 20 69 66 20 69 74 0a  ock tests if it.
320e0 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65    ** is possible
320f0 20 74 6f 20 61 64 64 20 74 68 65 20 70 61 67 65   to add the page
32100 20 61 73 20 61 20 6e 65 77 20 66 72 65 65 2d 6c   as a new free-l
32110 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20  ist leaf..  */. 
32120 20 69 66 28 20 6e 46 72 65 65 21 3d 30 20 29 7b   if( nFree!=0 ){
32130 0a 20 20 20 20 75 33 32 20 6e 4c 65 61 66 3b 20  .    u32 nLeaf; 
32140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32150 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72  * Initial number
32160 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73 20 6f   of leaf cells o
32170 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a  n trunk page */.
32180 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65  .    iTrunk = ge
32190 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
321a0 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20  aData[32]);.    
321b0 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
321c0 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26  e(pBt, iTrunk, &
321d0 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  pTrunk, 0);.    
321e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
321f0 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
32200 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
32210 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66 20 3d    }..    nLeaf =
32220 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
32230 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20  k->aData[4]);.  
32240 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75    assert( pBt->u
32250 73 61 62 6c 65 53 69 7a 65 3e 33 32 20 29 3b 0a  sableSize>32 );.
32260 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3e 20      if( nLeaf > 
32270 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65  (u32)pBt->usable
32280 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20 20  Size/4 - 2 ){.  
32290 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
322a0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
322b0 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
322c0 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  e_out;.    }.   
322d0 20 69 66 28 20 6e 4c 65 61 66 20 3c 20 28 75 33   if( nLeaf < (u3
322e0 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  2)pBt->usableSiz
322f0 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20  e/4 - 8 ){.     
32300 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   /* In this case
32310 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 6f   there is room o
32320 6e 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65  n the trunk page
32330 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20 70   to insert the p
32340 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 69  age.      ** bei
32350 6e 67 20 66 72 65 65 64 20 61 73 20 61 20 6e 65  ng freed as a ne
32360 77 20 6c 65 61 66 2e 0a 20 20 20 20 20 20 2a 2a  w leaf..      **
32370 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74  .      ** Note t
32380 68 61 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61  hat the trunk pa
32390 67 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79  ge is not really
323a0 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63   full until it c
323b0 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a  ontains.      **
323c0 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
323d0 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75  2 entries, not u
323e0 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20  sableSize/4 - 8 
323f0 65 6e 74 72 69 65 73 20 61 73 20 77 65 20 68 61  entries as we ha
32400 76 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65  ve.      ** code
32410 64 2e 20 20 42 75 74 20 64 75 65 20 74 6f 20 61  d.  But due to a
32420 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20 69 6e   coding error in
32430 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
32440 69 74 65 20 70 72 69 6f 72 20 74 6f 0a 20 20 20  ite prior to.   
32450 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74     ** 3.6.0, dat
32460 61 62 61 73 65 73 20 77 69 74 68 20 66 72 65 65  abases with free
32470 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 73  list trunk pages
32480 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68   holding more th
32490 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62  an.      ** usab
324a0 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74  leSize/4 - 8 ent
324b0 72 69 65 73 20 77 69 6c 6c 20 62 65 20 72 65 70  ries will be rep
324c0 6f 72 74 65 64 20 61 73 20 63 6f 72 72 75 70 74  orted as corrupt
324d0 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20 20 20 20  .  In order.    
324e0 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e    ** to maintain
324f0 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61   backwards compa
32500 74 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c  tibility with ol
32510 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  der versions of 
32520 53 51 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a  SQLite,.      **
32530 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75   we will continu
32540 65 20 74 6f 20 72 65 73 74 72 69 63 74 20 74 68  e to restrict th
32550 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
32560 69 65 73 20 74 6f 20 75 73 61 62 6c 65 53 69 7a  ies to usableSiz
32570 65 2f 34 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a  e/4 - 8.      **
32580 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f   for now.  At so
32590 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  me point in the 
325a0 66 75 74 75 72 65 20 28 6f 6e 63 65 20 65 76 65  future (once eve
325b0 72 79 6f 6e 65 20 68 61 73 20 75 70 67 72 61 64  ryone has upgrad
325c0 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 33  ed.      ** to 3
325d0 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72 29 20 77  .6.0 or later) w
325e0 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65  e should conside
325f0 72 20 66 69 78 69 6e 67 20 74 68 65 20 63 6f 6e  r fixing the con
32600 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20  ditional above. 
32610 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 61 64 20       ** to read 
32620 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22  "usableSize/4-2"
32630 20 69 6e 73 74 65 61 64 20 6f 66 20 22 75 73 61   instead of "usa
32640 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20  bleSize/4-8"..  
32650 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
32660 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
32670 39 39 32 30 2d 31 31 35 37 36 20 48 6f 77 65 76  9920-11576 Howev
32680 65 72 2c 20 6e 65 77 65 72 20 76 65 72 73 69 6f  er, newer versio
32690 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 73 74 69  ns of SQLite sti
326a0 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61 76 6f 69  ll.      ** avoi
326b0 64 20 75 73 69 6e 67 20 74 68 65 20 6c 61 73 74  d using the last
326c0 20 73 69 78 20 65 6e 74 72 69 65 73 20 69 6e 20   six entries in 
326d0 74 68 65 20 66 72 65 65 6c 69 73 74 20 74 72 75  the freelist tru
326e0 6e 6b 20 70 61 67 65 20 61 72 72 61 79 20 69 6e  nk page array in
326f0 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 20  .      ** order 
32700 74 68 61 74 20 64 61 74 61 62 61 73 65 20 66 69  that database fi
32710 6c 65 73 20 63 72 65 61 74 65 64 20 62 79 20 6e  les created by n
32720 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  ewer versions of
32730 20 53 51 4c 69 74 65 20 63 61 6e 20 62 65 0a 20   SQLite can be. 
32740 20 20 20 20 20 2a 2a 20 72 65 61 64 20 62 79 20       ** read by 
32750 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  older versions o
32760 66 20 53 51 4c 69 74 65 2e 0a 20 20 20 20 20 20  f SQLite..      
32770 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
32780 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
32790 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
327a0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
327b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
327c0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
327d0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c  Trunk->aData[4],
327e0 20 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20 20 20   nLeaf+1);.     
327f0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72     put4byte(&pTr
32800 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c 65  unk->aData[8+nLe
32810 61 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b 0a 20  af*4], iPage);. 
32820 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
32830 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61   && (pBt->btsFla
32840 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f  gs & BTS_SECURE_
32850 44 45 4c 45 54 45 29 3d 3d 30 20 29 7b 0a 20 20  DELETE)==0 ){.  
32860 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
32870 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70 50  agerDontWrite(pP
32880 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
32890 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
328a0 20 72 63 20 3d 20 62 74 72 65 65 53 65 74 48 61   rc = btreeSetHa
328b0 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 69 50  sContent(pBt, iP
328c0 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
328d0 20 20 20 20 54 52 41 43 45 28 28 22 46 52 45 45      TRACE(("FREE
328e0 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f  -PAGE: %d leaf o
328f0 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c  n trunk page %d\
32900 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70  n",pPage->pgno,p
32910 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20  Trunk->pgno));. 
32920 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
32930 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
32940 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72  }..  /* If contr
32950 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68 69 73  ol flows to this
32960 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69 74 20   point, then it 
32970 77 61 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65  was not possible
32980 20 74 6f 20 61 64 64 20 74 68 65 0a 20 20 2a 2a   to add the.  **
32990 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20   the page being 
329a0 66 72 65 65 64 20 61 73 20 61 20 6c 65 61 66 20  freed as a leaf 
329b0 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 72 73  page of the firs
329c0 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66  t trunk in the f
329d0 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20 50  ree-list..  ** P
329e0 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20  ossibly because 
329f0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
32a00 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73 73 69   empty, or possi
32a10 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20  bly because the 
32a20 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e  .  ** first trun
32a30 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  k in the free-li
32a40 73 74 20 69 73 20 66 75 6c 6c 2e 20 45 69 74 68  st is full. Eith
32a50 65 72 20 77 61 79 2c 20 74 68 65 20 70 61 67 65  er way, the page
32a60 20 62 65 69 6e 67 20 66 72 65 65 64 0a 20 20 2a   being freed.  *
32a70 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  * will become th
32a80 65 20 6e 65 77 20 66 69 72 73 74 20 74 72 75 6e  e new first trun
32a90 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72  k page in the fr
32aa0 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  ee-list..  */.  
32ab0 69 66 28 20 70 50 61 67 65 3d 3d 30 20 26 26 20  if( pPage==0 && 
32ac0 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
32ad0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
32ae0 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67 65  t, iPage, &pPage
32af0 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 67 6f 74  , 0)) ){.    got
32b00 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
32b10 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
32b20 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
32b30 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
32b40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
32b50 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72  K ){.    goto fr
32b60 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  eepage_out;.  }.
32b70 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65    put4byte(pPage
32b80 2d 3e 61 44 61 74 61 2c 20 69 54 72 75 6e 6b 29  ->aData, iTrunk)
32b90 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50  ;.  put4byte(&pP
32ba0 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30  age->aData[4], 0
32bb0 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
32bc0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
32bd0 2c 20 69 50 61 67 65 29 3b 0a 20 20 54 52 41 43  , iPage);.  TRAC
32be0 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25  E(("FREE-PAGE: %
32bf0 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65  d new trunk page
32c00 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22   replacing %d\n"
32c10 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 69  , pPage->pgno, i
32c20 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70 61  Trunk));..freepa
32c30 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 50  ge_out:.  if( pP
32c40 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65  age ){.    pPage
32c50 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
32c60 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  }.  releasePage(
32c70 70 50 61 67 65 29 3b 0a 20 20 72 65 6c 65 61 73  pPage);.  releas
32c80 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20  ePage(pTrunk);. 
32c90 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74   return rc;.}.st
32ca0 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 50 61  atic void freePa
32cb0 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
32cc0 65 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20  e, int *pRC){.  
32cd0 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49  if( (*pRC)==SQLI
32ce0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52  TE_OK ){.    *pR
32cf0 43 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 50  C = freePage2(pP
32d00 61 67 65 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c  age->pBt, pPage,
32d10 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
32d20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
32d30 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
32d40 67 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ges associated w
32d50 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 43 65  ith the given Ce
32d60 6c 6c 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a  ll.  Write the.*
32d70 2a 20 6c 6f 63 61 6c 20 43 65 6c 6c 20 73 69 7a  * local Cell siz
32d80 65 20 28 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  e (the number of
32d90 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20 6f 72   bytes on the or
32da0 69 67 69 6e 61 6c 20 70 61 67 65 2c 20 6f 6d 69  iginal page, omi
32db0 74 74 69 6e 67 0a 2a 2a 20 6f 76 65 72 66 6c 6f  tting.** overflo
32dc0 77 29 20 69 6e 74 6f 20 2a 70 6e 53 69 7a 65 2e  w) into *pnSize.
32dd0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
32de0 6c 65 61 72 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  learCell(.  MemP
32df0 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
32e00 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
32e10 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
32e20 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73  he Cell */.  uns
32e30 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c  igned char *pCel
32e40 6c 2c 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62  l,    /* First b
32e50 79 74 65 20 6f 66 20 74 68 65 20 43 65 6c 6c 20  yte of the Cell 
32e60 2a 2f 0a 20 20 75 31 36 20 2a 70 6e 53 69 7a 65  */.  u16 *pnSize
32e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32e80 20 57 72 69 74 65 20 74 68 65 20 73 69 7a 65 20   Write the size 
32e90 6f 66 20 74 68 65 20 43 65 6c 6c 20 68 65 72 65  of the Cell here
32ea0 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65   */.){.  BtShare
32eb0 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
32ec0 70 42 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  pBt;.  CellInfo 
32ed0 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76 66  info;.  Pgno ovf
32ee0 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b  lPgno;.  int rc;
32ef0 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20  .  int nOvfl;.  
32f00 75 33 32 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  u32 ovflPageSize
32f10 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
32f20 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
32f30 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
32f40 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 78  x) );.  pPage->x
32f50 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  ParseCell(pPage,
32f60 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
32f70 20 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e 66 6f    *pnSize = info
32f80 2e 6e 53 69 7a 65 3b 0a 20 20 69 66 28 20 69 6e  .nSize;.  if( in
32f90 66 6f 2e 6e 4c 6f 63 61 6c 3d 3d 69 6e 66 6f 2e  fo.nLocal==info.
32fa0 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20  nPayload ){.    
32fb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
32fc0 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f  ;  /* No overflo
32fd0 77 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20  w pages. Return 
32fe0 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e  without doing an
32ff0 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20  ything */.  }.  
33000 69 66 28 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e  if( pCell+info.n
33010 53 69 7a 65 2d 31 20 3e 20 70 50 61 67 65 2d 3e  Size-1 > pPage->
33020 61 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73  aData+pPage->mas
33030 6b 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74  kPage ){.    ret
33040 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
33050 50 54 5f 42 4b 50 54 3b 20 20 2f 2a 20 43 65 6c  PT_BKPT;  /* Cel
33060 6c 20 65 78 74 65 6e 64 73 20 70 61 73 74 20 65  l extends past e
33070 6e 64 20 6f 66 20 70 61 67 65 20 2a 2f 0a 20 20  nd of page */.  
33080 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67  }.  ovflPgno = g
33090 65 74 34 62 79 74 65 28 70 43 65 6c 6c 20 2b 20  et4byte(pCell + 
330a0 69 6e 66 6f 2e 6e 53 69 7a 65 20 2d 20 34 29 3b  info.nSize - 4);
330b0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
330c0 75 73 61 62 6c 65 53 69 7a 65 20 3e 20 34 20 29  usableSize > 4 )
330d0 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  ;.  ovflPageSize
330e0 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
330f0 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20  ze - 4;.  nOvfl 
33100 3d 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  = (info.nPayload
33110 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b   - info.nLocal +
33120 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 2d 20   ovflPageSize - 
33130 31 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b  1)/ovflPageSize;
33140 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 76 66 6c  .  assert( nOvfl
33150 3e 30 20 7c 7c 20 0a 20 20 20 20 28 43 4f 52 52  >0 || .    (CORR
33160 55 50 54 5f 44 42 20 26 26 20 28 69 6e 66 6f 2e  UPT_DB && (info.
33170 6e 50 61 79 6c 6f 61 64 20 2b 20 6f 76 66 6c 50  nPayload + ovflP
33180 61 67 65 53 69 7a 65 29 3c 6f 76 66 6c 50 61 67  ageSize)<ovflPag
33190 65 53 69 7a 65 29 0a 20 20 29 3b 0a 20 20 77 68  eSize).  );.  wh
331a0 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a  ile( nOvfl-- ){.
331b0 20 20 20 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d      Pgno iNext =
331c0 20 30 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   0;.    MemPage 
331d0 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20  *pOvfl = 0;.    
331e0 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c  if( ovflPgno<2 |
331f0 7c 20 6f 76 66 6c 50 67 6e 6f 3e 62 74 72 65 65  | ovflPgno>btree
33200 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29  Pagecount(pBt) )
33210 7b 0a 20 20 20 20 20 20 2f 2a 20 30 20 69 73 20  {.      /* 0 is 
33220 6e 6f 74 20 61 20 6c 65 67 61 6c 20 70 61 67 65  not a legal page
33230 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65   number and page
33240 20 31 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20   1 cannot be an 
33250 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c  .      ** overfl
33260 6f 77 20 70 61 67 65 2e 20 54 68 65 72 65 66 6f  ow page. Therefo
33270 72 65 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c 32  re if ovflPgno<2
33280 20 6f 72 20 70 61 73 74 20 74 68 65 20 65 6e 64   or past the end
33290 20 6f 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a   of the .      *
332a0 2a 20 66 69 6c 65 20 74 68 65 20 64 61 74 61 62  * file the datab
332b0 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72  ase must be corr
332c0 75 70 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65  upt. */.      re
332d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
332e0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
332f0 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b      if( nOvfl ){
33300 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f  .      rc = getO
33310 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c  verflowPage(pBt,
33320 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66   ovflPgno, &pOvf
33330 6c 2c 20 26 69 4e 65 78 74 29 3b 0a 20 20 20 20  l, &iNext);.    
33340 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
33350 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
33360 20 69 66 28 20 28 20 70 4f 76 66 6c 20 7c 7c 20   if( ( pOvfl || 
33370 28 28 70 4f 76 66 6c 20 3d 20 62 74 72 65 65 50  ((pOvfl = btreeP
33380 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 6f  ageLookup(pBt, o
33390 76 66 6c 50 67 6e 6f 29 29 21 3d 30 29 20 29 0a  vflPgno))!=0) ).
333a0 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50       && sqlite3P
333b0 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
333c0 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29  (pOvfl->pDbPage)
333d0 21 3d 31 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  !=1.    ){.     
333e0 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20   /* There is no 
333f0 72 65 61 73 6f 6e 20 61 6e 79 20 63 75 72 73 6f  reason any curso
33400 72 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6e  r should have an
33410 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
33420 65 72 65 6e 63 65 20 0a 20 20 20 20 20 20 2a 2a  erence .      **
33430 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   to an overflow 
33440 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74  page belonging t
33450 6f 20 61 20 63 65 6c 6c 20 74 68 61 74 20 69 73  o a cell that is
33460 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2f 75   being deleted/u
33470 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20 2a 2a  pdated..      **
33480 20 53 6f 20 69 66 20 74 68 65 72 65 20 65 78 69   So if there exi
33490 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  sts more than on
334a0 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  e reference to t
334b0 68 69 73 20 70 61 67 65 2c 20 74 68 65 6e 20 69  his page, then i
334c0 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 75 73 74  t .      ** must
334d0 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65 20 61   not really be a
334e0 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  n overflow page 
334f0 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
33500 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
33510 2e 20 0a 20 20 20 20 20 20 2a 2a 20 49 74 20 69  . .      ** It i
33520 73 20 68 65 6c 70 66 75 6c 20 74 6f 20 64 65 74  s helpful to det
33530 65 63 74 20 74 68 69 73 20 62 65 66 6f 72 65 20  ect this before 
33540 63 61 6c 6c 69 6e 67 20 66 72 65 65 50 61 67 65  calling freePage
33550 32 28 29 2c 20 61 73 20 0a 20 20 20 20 20 20 2a  2(), as .      *
33560 2a 20 66 72 65 65 50 61 67 65 32 28 29 20 6d 61  * freePage2() ma
33570 79 20 7a 65 72 6f 20 74 68 65 20 70 61 67 65 20  y zero the page 
33580 63 6f 6e 74 65 6e 74 73 20 69 66 20 73 65 63 75  contents if secu
33590 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 20 69  re-delete mode i
335a0 73 0a 20 20 20 20 20 20 2a 2a 20 65 6e 61 62 6c  s.      ** enabl
335b0 65 64 2e 20 49 66 20 74 68 69 73 20 27 6f 76 65  ed. If this 'ove
335c0 72 66 6c 6f 77 27 20 70 61 67 65 20 68 61 70 70  rflow' page happ
335d0 65 6e 73 20 74 6f 20 62 65 20 61 20 70 61 67 65  ens to be a page
335e0 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20   that the.      
335f0 2a 2a 20 63 61 6c 6c 65 72 20 69 73 20 69 74 65  ** caller is ite
33600 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 6f  rating through o
33610 72 20 75 73 69 6e 67 20 69 6e 20 73 6f 6d 65 20  r using in some 
33620 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69 73 0a  other way, this.
33630 20 20 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20        ** can be 
33640 70 72 6f 62 6c 65 6d 61 74 69 63 2e 0a 20 20 20  problematic..   
33650 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
33660 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
33670 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  BKPT;.    }else{
33680 0a 20 20 20 20 20 20 72 63 20 3d 20 66 72 65 65  .      rc = free
33690 50 61 67 65 32 28 70 42 74 2c 20 70 4f 76 66 6c  Page2(pBt, pOvfl
336a0 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20  , ovflPgno);.   
336b0 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f 76 66   }..    if( pOvf
336c0 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
336d0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76  e3PagerUnref(pOv
336e0 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  fl->pDbPage);.  
336f0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29    }.    if( rc )
33700 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
33710 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e 65 78 74  ovflPgno = iNext
33720 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
33730 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
33740 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20 62 79  ** Create the by
33750 74 65 20 73 65 71 75 65 6e 63 65 20 75 73 65 64  te sequence used
33760 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20   to represent a 
33770 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61  cell on page pPa
33780 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20  ge.** and write 
33790 74 68 61 74 20 62 79 74 65 20 73 65 71 75 65 6e  that byte sequen
337a0 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e  ce into pCell[].
337b0 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73    Overflow pages
337c0 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65   are.** allocate
337d0 64 20 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20  d and filled in 
337e0 61 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54  as necessary.  T
337f0 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65  he calling proce
33800 64 75 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f  dure.** is respo
33810 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e  nsible for makin
33820 67 20 73 75 72 65 20 73 75 66 66 69 63 69 65 6e  g sure sufficien
33830 74 20 73 70 61 63 65 20 68 61 73 20 62 65 65 6e  t space has been
33840 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f   allocated.** fo
33850 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a  r pCell[]..**.**
33860 20 4e 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c   Note that pCell
33870 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73   does not necess
33880 61 72 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e  ary need to poin
33890 74 20 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e  t to the pPage->
338a0 61 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20  aData.** area.  
338b0 70 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e  pCell might poin
338c0 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72  t to some tempor
338d0 61 72 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68  ary storage.  Th
338e0 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62  e cell will.** b
338f0 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e  e constructed in
33900 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20   this temporary 
33910 61 72 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64  area then copied
33920 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61   into pPage->aDa
33930 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a  ta.** later..*/.
33940 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49  static int fillI
33950 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65  nCell(.  MemPage
33960 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
33970 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
33980 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
33990 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  s the cell */.  
339a0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
339b0 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f  Cell,          /
339c0 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20  * Complete text 
339d0 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  of the cell */. 
339e0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
339f0 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20  y, i64 nKey,    
33a00 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20  /* The key */.  
33a10 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74  const void *pDat
33a20 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f  a,int nData,   /
33a30 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20  * The data */.  
33a40 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20  int nZero,      
33a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
33a60 2a 20 45 78 74 72 61 20 7a 65 72 6f 20 62 79 74  * Extra zero byt
33a70 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20  es to append to 
33a80 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a  pData */.  int *
33a90 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  pnSize          
33aa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
33ab0 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72  te cell size her
33ac0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50  e */.){.  int nP
33ad0 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20  ayload;.  const 
33ae0 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20  u8 *pSrc;.  int 
33af0 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69  nSrc, n, rc;.  i
33b00 6e 74 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20  nt spaceLeft;.  
33b10 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d  MemPage *pOvfl =
33b20 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
33b30 54 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20  ToRelease = 0;. 
33b40 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
33b50 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e  pPrior;.  unsign
33b60 65 64 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61  ed char *pPayloa
33b70 64 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  d;.  BtShared *p
33b80 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
33b90 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c  .  Pgno pgnoOvfl
33ba0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61   = 0;.  int nHea
33bb0 64 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  der;..  assert( 
33bc0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
33bd0 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
33be0 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 70  utex) );..  /* p
33bf0 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 63 65  Page is not nece
33c00 73 73 61 72 69 6c 79 20 77 72 69 74 65 61 62 6c  ssarily writeabl
33c10 65 20 73 69 6e 63 65 20 70 43 65 6c 6c 20 6d 69  e since pCell mi
33c20 67 68 74 20 62 65 20 61 75 78 69 6c 69 61 72 79  ght be auxiliary
33c30 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 73 70 61  .  ** buffer spa
33c40 63 65 20 74 68 61 74 20 69 73 20 73 65 70 61 72  ce that is separ
33c50 61 74 65 20 66 72 6f 6d 20 74 68 65 20 70 50 61  ate from the pPa
33c60 67 65 20 62 75 66 66 65 72 20 61 72 65 61 20 2a  ge buffer area *
33c70 2f 0a 20 20 61 73 73 65 72 74 28 20 70 43 65 6c  /.  assert( pCel
33c80 6c 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c  l<pPage->aData |
33c90 7c 20 70 43 65 6c 6c 3e 3d 26 70 50 61 67 65 2d  | pCell>=&pPage-
33ca0 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65  >aData[pBt->page
33cb0 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20  Size].          
33cc0 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65    || sqlite3Page
33cd0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
33ce0 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
33cf0 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68  .  /* Fill in th
33d00 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e  e header. */.  n
33d10 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 2d 3e  Header = pPage->
33d20 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
33d30 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61  nPayload = nData
33d40 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20   + nZero;.  if( 
33d50 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61  pPage->intKeyLea
33d60 66 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72  f ){.    nHeader
33d70 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 33 32 28   += putVarint32(
33d80 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c  &pCell[nHeader],
33d90 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 7d 65   nPayload);.  }e
33da0 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
33db0 20 6e 44 61 74 61 3d 3d 30 20 29 3b 0a 20 20 20   nData==0 );.   
33dc0 20 61 73 73 65 72 74 28 20 6e 5a 65 72 6f 3d 3d   assert( nZero==
33dd0 30 20 29 3b 0a 20 20 7d 0a 20 20 6e 48 65 61 64  0 );.  }.  nHead
33de0 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28  er += putVarint(
33df0 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c  &pCell[nHeader],
33e00 20 2a 28 75 36 34 2a 29 26 6e 4b 65 79 29 3b 0a   *(u64*)&nKey);.
33e10 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20    .  /* Fill in 
33e20 74 68 65 20 70 61 79 6c 6f 61 64 20 73 69 7a 65  the payload size
33e30 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d   */.  if( pPage-
33e40 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 70  >intKey ){.    p
33e50 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20  Src = pData;.   
33e60 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20   nSrc = nData;. 
33e70 20 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20     nData = 0;.  
33e80 7d 65 6c 73 65 7b 20 0a 20 20 20 20 61 73 73 65  }else{ .    asse
33e90 72 74 28 20 6e 4b 65 79 3c 3d 30 78 37 66 66 66  rt( nKey<=0x7fff
33ea0 66 66 66 66 20 26 26 20 70 4b 65 79 21 3d 30 20  ffff && pKey!=0 
33eb0 29 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20  );.    nPayload 
33ec0 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 20  = (int)nKey;.   
33ed0 20 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20   pSrc = pKey;.  
33ee0 20 20 6e 53 72 63 20 3d 20 28 69 6e 74 29 6e 4b    nSrc = (int)nK
33ef0 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50  ey;.  }.  if( nP
33f00 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d  ayload<=pPage->m
33f10 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 6e  axLocal ){.    n
33f20 20 3d 20 6e 48 65 61 64 65 72 20 2b 20 6e 50 61   = nHeader + nPa
33f30 79 6c 6f 61 64 3b 0a 20 20 20 20 74 65 73 74 63  yload;.    testc
33f40 61 73 65 28 20 6e 3d 3d 33 20 29 3b 0a 20 20 20  ase( n==3 );.   
33f50 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 34 20   testcase( n==4 
33f60 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c 34 20 29  );.    if( n<4 )
33f70 20 6e 20 3d 20 34 3b 0a 20 20 20 20 2a 70 6e 53   n = 4;.    *pnS
33f80 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 73 70 61  ize = n;.    spa
33f90 63 65 4c 65 66 74 20 3d 20 6e 50 61 79 6c 6f 61  ceLeft = nPayloa
33fa0 64 3b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20  d;.    pPrior = 
33fb0 70 43 65 6c 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pCell;.  }else{.
33fc0 20 20 20 20 69 6e 74 20 6d 6e 20 3d 20 70 50 61      int mn = pPa
33fd0 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  ge->minLocal;.  
33fe0 20 20 6e 20 3d 20 6d 6e 20 2b 20 28 6e 50 61 79    n = mn + (nPay
33ff0 6c 6f 61 64 20 2d 20 6d 6e 29 20 25 20 28 70 50  load - mn) % (pP
34000 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
34010 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74  Size - 4);.    t
34020 65 73 74 63 61 73 65 28 20 6e 3d 3d 70 50 61 67  estcase( n==pPag
34030 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  e->maxLocal );. 
34040 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d     testcase( n==
34050 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  pPage->maxLocal+
34060 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 20 3e  1 );.    if( n >
34070 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
34080 20 29 20 6e 20 3d 20 6d 6e 3b 0a 20 20 20 20 73   ) n = mn;.    s
34090 70 61 63 65 4c 65 66 74 20 3d 20 6e 3b 0a 20 20  paceLeft = n;.  
340a0 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 20 2b 20    *pnSize = n + 
340b0 6e 48 65 61 64 65 72 20 2b 20 34 3b 0a 20 20 20  nHeader + 4;.   
340c0 20 70 50 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c   pPrior = &pCell
340d0 5b 6e 48 65 61 64 65 72 2b 6e 5d 3b 0a 20 20 7d  [nHeader+n];.  }
340e0 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70  .  pPayload = &p
340f0 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 0a  Cell[nHeader];..
34100 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
34110 6e 74 20 76 61 72 69 61 62 6c 65 73 20 73 68 6f  nt variables sho
34120 75 6c 64 20 62 65 20 73 65 74 20 61 73 20 66 6f  uld be set as fo
34130 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  llows:.  **.  **
34140 20 20 20 6e 50 61 79 6c 6f 61 64 20 20 20 20 20     nPayload     
34150 20 20 20 20 20 20 54 6f 74 61 6c 20 70 61 79 6c        Total payl
34160 6f 61 64 20 73 69 7a 65 20 69 6e 20 62 79 74 65  oad size in byte
34170 73 0a 20 20 2a 2a 20 20 20 70 50 61 79 6c 6f 61  s.  **   pPayloa
34180 64 20 20 20 20 20 20 20 20 20 20 20 42 65 67 69  d           Begi
34190 6e 20 77 72 69 74 69 6e 67 20 70 61 79 6c 6f 61  n writing payloa
341a0 64 20 68 65 72 65 0a 20 20 2a 2a 20 20 20 73 70  d here.  **   sp
341b0 61 63 65 4c 65 66 74 20 20 20 20 20 20 20 20 20  aceLeft         
341c0 20 53 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65   Space available
341d0 20 61 74 20 70 50 61 79 6c 6f 61 64 2e 20 20 49   at pPayload.  I
341e0 66 20 6e 50 61 79 6c 6f 61 64 3e 73 70 61 63 65  f nPayload>space
341f0 4c 65 66 74 2c 0a 20 20 2a 2a 20 20 20 20 20 20  Left,.  **      
34200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34210 74 68 61 74 20 6d 65 61 6e 73 20 63 6f 6e 74 65  that means conte
34220 6e 74 20 6d 75 73 74 20 73 70 69 6c 6c 20 69 6e  nt must spill in
34230 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
34240 73 2e 0a 20 20 2a 2a 20 20 20 2a 70 6e 53 69 7a  s..  **   *pnSiz
34250 65 20 20 20 20 20 20 20 20 20 20 20 20 53 69 7a  e            Siz
34260 65 20 6f 66 20 74 68 65 20 6c 6f 63 61 6c 20 63  e of the local c
34270 65 6c 6c 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e  ell (not countin
34280 67 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  g overflow pages
34290 29 0a 20 20 2a 2a 20 20 20 70 50 72 69 6f 72 20  ).  **   pPrior 
342a0 20 20 20 20 20 20 20 20 20 20 20 20 57 68 65 72              Wher
342b0 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 70  e to write the p
342c0 67 6e 6f 20 6f 66 20 74 68 65 20 66 69 72 73 74  gno of the first
342d0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20   overflow page. 
342e0 20 2a 2a 0a 20 20 2a 2a 20 55 73 65 20 61 20 63   **.  ** Use a c
342f0 61 6c 6c 20 74 6f 20 62 74 72 65 65 50 61 72 73  all to btreePars
34300 65 43 65 6c 6c 50 74 72 28 29 20 74 6f 20 76 65  eCellPtr() to ve
34310 72 69 66 79 20 74 68 61 74 20 74 68 65 20 76 61  rify that the va
34320 6c 75 65 73 20 61 62 6f 76 65 0a 20 20 2a 2a 20  lues above.  ** 
34330 77 65 72 65 20 63 6f 6d 70 75 74 65 64 20 63 6f  were computed co
34340 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 23 69  rrectly..  */.#i
34350 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
34360 20 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20   {.    CellInfo 
34370 69 6e 66 6f 3b 0a 20 20 20 20 70 50 61 67 65 2d  info;.    pPage-
34380 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67  >xParseCell(pPag
34390 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
343a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 48  ;.    assert( nH
343b0 65 61 64 65 72 3d 28 69 6e 74 29 28 69 6e 66 6f  eader=(int)(info
343c0 2e 70 50 61 79 6c 6f 61 64 20 2d 20 70 43 65 6c  .pPayload - pCel
343d0 6c 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  l) );.    assert
343e0 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65  ( info.nKey==nKe
343f0 79 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  y );.    assert(
34400 20 2a 70 6e 53 69 7a 65 20 3d 3d 20 69 6e 66 6f   *pnSize == info
34410 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73  .nSize );.    as
34420 73 65 72 74 28 20 73 70 61 63 65 4c 65 66 74 20  sert( spaceLeft 
34430 3d 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  == info.nLocal )
34440 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
34450 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 79  /* Write the pay
34460 6c 6f 61 64 20 69 6e 74 6f 20 74 68 65 20 6c 6f  load into the lo
34470 63 61 6c 20 43 65 6c 6c 20 61 6e 64 20 61 6e 79  cal Cell and any
34480 20 65 78 74 72 61 20 69 6e 74 6f 20 6f 76 65 72   extra into over
34490 66 6c 6f 77 20 70 61 67 65 73 20 2a 2f 0a 20 20  flow pages */.  
344a0 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e  while( nPayload>
344b0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61  0 ){.    if( spa
344c0 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66  ceLeft==0 ){.#if
344d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
344e0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
344f0 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61    Pgno pgnoPtrma
34500 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a  p = pgnoOvfl; /*
34510 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70   Overflow page p
34520 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79  ointer-map entry
34530 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69   page */.      i
34540 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
34550 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f  um ){.        do
34560 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f  {.          pgno
34570 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20  Ovfl++;.        
34580 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20  } while( .      
34590 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47      PTRMAP_ISPAG
345a0 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29  E(pBt, pgnoOvfl)
345b0 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45   || pgnoOvfl==PE
345c0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
345d0 70 42 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b  pBt) .        );
345e0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
345f0 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
34600 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
34610 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f  , &pOvfl, &pgnoO
34620 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30  vfl, pgnoOvfl, 0
34630 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
34640 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
34650 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  M.      /* If th
34660 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f  e database suppo
34670 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c  rts auto-vacuum,
34680 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20   and the second 
34690 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20  or subsequent.  
346a0 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20      ** overflow 
346b0 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c  page is being al
346c0 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20  located, add an 
346d0 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69  entry to the poi
346e0 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a  nter-map.      *
346f0 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 20  * for that page 
34700 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20  now. .      **. 
34710 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20       ** If this 
34720 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 76 65  is the first ove
34730 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e  rflow page, then
34740 20 77 72 69 74 65 20 61 20 70 61 72 74 69 61 6c   write a partial
34750 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a   entry .      **
34760 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   to the pointer-
34770 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69 74 65  map. If we write
34780 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73   nothing to this
34790 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f   pointer-map slo
347a0 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  t,.      ** then
347b0 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20   the optimistic 
347c0 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70  overflow chain p
347d0 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65  rocessing in cle
347e0 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a  arCell().      *
347f0 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72  * may misinterpr
34800 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c  et the uninitial
34810 69 7a 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20  ized values and 
34820 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20  delete the.     
34830 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20   ** wrong pages 
34840 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
34850 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
34860 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
34870 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c  acuum && rc==SQL
34880 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
34890 20 20 75 38 20 65 54 79 70 65 20 3d 20 28 70 67    u8 eType = (pg
348a0 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f  noPtrmap?PTRMAP_
348b0 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50  OVERFLOW2:PTRMAP
348c0 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20  _OVERFLOW1);.   
348d0 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
348e0 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54  Bt, pgnoOvfl, eT
348f0 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 2c  ype, pgnoPtrmap,
34900 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69   &rc);.        i
34910 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
34920 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
34930 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  Ovfl);.        }
34940 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
34950 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
34960 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
34970 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b  age(pToRelease);
34980 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
34990 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rc;.      }..   
349a0 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65     /* If pToRele
349b0 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20  ase is not zero 
349c0 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e  than pPrior poin
349d0 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ts into the data
349e0 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f   area.      ** o
349f0 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d  f pToRelease.  M
34a00 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65  ake sure pToRele
34a10 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69  ase is still wri
34a20 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20  teable. */.     
34a30 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65   assert( pToRele
34a40 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase==0 || sqlite
34a50 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
34a60 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44  e(pToRelease->pD
34a70 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20  bPage) );..     
34a80 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69 73   /* If pPrior is
34a90 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
34aa0 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c  a area of pPage,
34ab0 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20   then make sure 
34ac0 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69  pPage.      ** i
34ad0 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
34ae0 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  e */.      asser
34af0 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65 2d  t( pPrior<pPage-
34b00 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f 72  >aData || pPrior
34b10 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  >=&pPage->aData[
34b20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20  pBt->pageSize]. 
34b30 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
34b40 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
34b50 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
34b60 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20  Page) );..      
34b70 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c  put4byte(pPrior,
34b80 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20   pgnoOvfl);.    
34b90 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
34ba0 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20  oRelease);.     
34bb0 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f   pToRelease = pO
34bc0 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  vfl;.      pPrio
34bd0 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61  r = pOvfl->aData
34be0 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
34bf0 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20  (pPrior, 0);.   
34c00 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70     pPayload = &p
34c10 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a  Ovfl->aData[4];.
34c20 20 20 20 20 20 20 73 70 61 63 65 4c 65 66 74 20        spaceLeft 
34c30 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
34c40 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20  e - 4;.    }.   
34c50 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20   n = nPayload;. 
34c60 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65     if( n>spaceLe
34c70 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65  ft ) n = spaceLe
34c80 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70  ft;..    /* If p
34c90 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74  ToRelease is not
34ca0 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61 79 6c   zero than pPayl
34cb0 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20  oad points into 
34cc0 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20  the data area.  
34cd0 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61    ** of pToRelea
34ce0 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70  se.  Make sure p
34cf0 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74 69  ToRelease is sti
34d00 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f  ll writeable. */
34d10 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f  .    assert( pTo
34d20 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71  Release==0 || sq
34d30 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
34d40 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65  eable(pToRelease
34d50 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
34d60 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61     /* If pPayloa
34d70 64 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  d is part of the
34d80 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70 50   data area of pP
34d90 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73  age, then make s
34da0 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 2a 2a  ure pPage.    **
34db0 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
34dc0 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ble */.    asser
34dd0 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50 61 67  t( pPayload<pPag
34de0 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 61 79  e->aData || pPay
34df0 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44  load>=&pPage->aD
34e00 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  ata[pBt->pageSiz
34e10 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  e].            |
34e20 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
34e30 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
34e40 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
34e50 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a    if( nSrc>0 ){.
34e60 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72 63        if( n>nSrc
34e70 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20   ) n = nSrc;.   
34e80 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20     assert( pSrc 
34e90 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
34ea0 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20  pPayload, pSrc, 
34eb0 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
34ec0 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79       memset(pPay
34ed0 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20  load, 0, n);.   
34ee0 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20   }.    nPayload 
34ef0 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f  -= n;.    pPaylo
34f00 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72  ad += n;.    pSr
34f10 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63  c += n;.    nSrc
34f20 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65   -= n;.    space
34f30 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69  Left -= n;.    i
34f40 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20  f( nSrc==0 ){.  
34f50 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61      nSrc = nData
34f60 3b 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 70  ;.      pSrc = p
34f70 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Data;.    }.  }.
34f80 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
34f90 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74  oRelease);.  ret
34fa0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
34fb0 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  ../*.** Remove t
34fc0 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f  he i-th cell fro
34fd0 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73 20 72  m pPage.  This r
34fe0 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73 20 70  outine effects p
34ff0 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68  Page only..** Th
35000 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  e cell content i
35010 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64  s not freed or d
35020 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20  eallocated.  It 
35030 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a  is assumed that.
35040 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  ** the cell cont
35050 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70  ent has been cop
35060 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c  ied someplace el
35070 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  se.  This routin
35080 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65  e just.** remove
35090 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  s the reference 
350a0 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d  to the cell from
350b0 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73   pPage..**.** "s
350c0 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e  z" must be the n
350d0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
350e0 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73  n the cell..*/.s
350f0 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70 43  tatic void dropC
35100 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
35110 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74  ge, int idx, int
35120 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a   sz, int *pRC){.
35130 20 20 75 33 32 20 70 63 3b 20 20 20 20 20 20 20    u32 pc;       
35140 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63    /* Offset to c
35150 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63  ell content of c
35160 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65  ell being delete
35170 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  d */.  u8 *data;
35180 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d         /* pPage-
35190 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a  >aData */.  u8 *
351a0 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55  ptr;        /* U
351b0 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65  sed to move byte
351c0 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20  s around within 
351d0 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  data[] */.  int 
351e0 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  rc;         /* T
351f0 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  he return code *
35200 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
35210 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67      /* Beginning
35220 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 2e 20   of the header. 
35230 20 30 20 6d 6f 73 74 20 70 61 67 65 73 2e 20 20   0 most pages.  
35240 31 30 30 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20  100 page 1 */.. 
35250 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75   if( *pRC ) retu
35260 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  rn;..  assert( i
35270 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50 61  dx>=0 && idx<pPa
35280 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61  ge->nCell );.  a
35290 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
352a0 42 20 7c 7c 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a  B || sz==cellSiz
352b0 65 28 70 50 61 67 65 2c 20 69 64 78 29 20 29 3b  e(pPage, idx) );
352c0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
352d0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
352e0 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
352f0 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
35300 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
35310 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
35320 75 74 65 78 29 20 29 3b 0a 20 20 64 61 74 61 20  utex) );.  data 
35330 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
35340 20 20 70 74 72 20 3d 20 26 70 50 61 67 65 2d 3e    ptr = &pPage->
35350 61 43 65 6c 6c 49 64 78 5b 32 2a 69 64 78 5d 3b  aCellIdx[2*idx];
35360 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65  .  pc = get2byte
35370 28 70 74 72 29 3b 0a 20 20 68 64 72 20 3d 20 70  (ptr);.  hdr = p
35380 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
35390 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d  .  testcase( pc=
353a0 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b  =get2byte(&data[
353b0 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20 74 65 73  hdr+5]) );.  tes
353c0 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 70 50  tcase( pc+sz==pP
353d0 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
353e0 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 70 63  Size );.  if( pc
353f0 20 3c 20 28 75 33 32 29 67 65 74 32 62 79 74 65   < (u32)get2byte
35400 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 7c  (&data[hdr+5]) |
35410 7c 20 70 63 2b 73 7a 20 3e 20 70 50 61 67 65 2d  | pc+sz > pPage-
35420 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
35430 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53   ){.    *pRC = S
35440 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
35450 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  PT;.    return;.
35460 20 20 7d 0a 20 20 72 63 20 3d 20 66 72 65 65 53    }.  rc = freeS
35470 70 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c 20  pace(pPage, pc, 
35480 73 7a 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  sz);.  if( rc ){
35490 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a  .    *pRC = rc;.
354a0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
354b0 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d    pPage->nCell--
354c0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e  ;.  if( pPage->n
354d0 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 6d  Cell==0 ){.    m
354e0 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b  emset(&data[hdr+
354f0 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 20 20 64  1], 0, 4);.    d
35500 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
35510 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
35520 74 61 5b 68 64 72 2b 35 5d 2c 20 70 50 61 67 65  ta[hdr+5], pPage
35530 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
35540 65 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e  e);.    pPage->n
35550 46 72 65 65 20 3d 20 70 50 61 67 65 2d 3e 70 42  Free = pPage->pB
35560 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
35570 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
35580 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
35590 20 20 20 20 20 20 20 20 2d 20 70 50 61 67 65 2d          - pPage-
355a0 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 2d 20  >childPtrSize - 
355b0 38 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  8;.  }else{.    
355c0 6d 65 6d 6d 6f 76 65 28 70 74 72 2c 20 70 74 72  memmove(ptr, ptr
355d0 2b 32 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e 43  +2, 2*(pPage->nC
355e0 65 6c 6c 20 2d 20 69 64 78 29 29 3b 0a 20 20 20  ell - idx));.   
355f0 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
35600 68 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e  hdr+3], pPage->n
35610 43 65 6c 6c 29 3b 0a 20 20 20 20 70 50 61 67 65  Cell);.    pPage
35620 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20  ->nFree += 2;.  
35630 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72  }.}../*.** Inser
35640 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20  t a new cell on 
35650 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e  pPage at cell in
35660 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20  dex "i".  pCell 
35670 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a  points to the.**
35680 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
35690 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  cell..**.** If t
356a0 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
356b0 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20  will fit on the 
356c0 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69  page, then put i
356d0 74 20 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a  t there.  If it.
356e0 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c  ** will not fit,
356f0 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70   then make a cop
35700 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  y of the cell co
35710 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70  ntent into pTemp
35720 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20   if.** pTemp is 
35730 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72  not null.  Regar
35740 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20  dless of pTemp, 
35750 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65  allocate a new e
35760 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65  ntry.** in pPage
35770 2d 3e 61 70 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d  ->apOvfl[] and m
35780 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20  ake it point to 
35790 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
357a0 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70   (either.** in p
357b0 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67  Temp or the orig
357c0 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20  inal pCell) and 
357d0 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20  also record its 
357e0 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63  index. .** Alloc
357f0 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72  ating a new entr
35800 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c  y in pPage->aCel
35810 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74  l[] implies that
35820 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65   .** pPage->nOve
35830 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65  rflow is increme
35840 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nted..*/.static 
35850 76 6f 69 64 20 69 6e 73 65 72 74 43 65 6c 6c 28  void insertCell(
35860 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
35870 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e 74  e,   /* Page int
35880 6f 20 77 68 69 63 68 20 77 65 20 61 72 65 20 63  o which we are c
35890 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  opying */.  int 
358a0 69 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i,            /*
358b0 20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65   New cell become
358c0 73 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20  s the i-th cell 
358d0 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  of the page */. 
358e0 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
358f0 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66     /* Content of
35900 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f   the new cell */
35910 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20 20  .  int sz,      
35920 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
35930 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c   content in pCel
35940 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70  l */.  u8 *pTemp
35950 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70  ,        /* Temp
35960 20 73 74 6f 72 61 67 65 20 73 70 61 63 65 20 66   storage space f
35970 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65  or pCell, if nee
35980 64 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43  ded */.  Pgno iC
35990 68 69 6c 64 2c 20 20 20 20 20 20 2f 2a 20 49 66  hild,      /* If
359a0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70 6c 61   non-zero, repla
359b0 63 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  ce first 4 bytes
359c0 20 77 69 74 68 20 74 68 69 73 20 76 61 6c 75 65   with this value
359d0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 43 20 20   */.  int *pRC  
359e0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20          /* Read 
359f0 61 6e 64 20 77 72 69 74 65 20 72 65 74 75 72 6e  and write return
35a00 20 63 6f 64 65 20 66 72 6f 6d 20 68 65 72 65 20   code from here 
35a10 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78 20  */.){.  int idx 
35a20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 57 68 65  = 0;      /* Whe
35a30 72 65 20 74 6f 20 77 72 69 74 65 20 6e 65 77 20  re to write new 
35a40 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20  cell content in 
35a50 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  data[] */.  int 
35a60 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  j;            /*
35a70 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
35a80 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20  .  u8 *data;    
35a90 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74       /* The cont
35aa0 65 6e 74 20 6f 66 20 74 68 65 20 77 68 6f 6c 65  ent of the whole
35ab0 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70   page */.  u8 *p
35ac0 49 6e 73 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Ins;         /* 
35ad0 54 68 65 20 70 6f 69 6e 74 20 69 6e 20 70 50 61  The point in pPa
35ae0 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 5d 20 77  ge->aCellIdx[] w
35af0 68 65 72 65 20 6e 6f 20 63 65 6c 6c 20 69 6e 73  here no cell ins
35b00 65 72 74 65 64 20 2a 2f 0a 0a 20 20 69 66 28 20  erted */..  if( 
35b10 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a  *pRC ) return;..
35b20 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26    assert( i>=0 &
35b30 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  & i<=pPage->nCel
35b40 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  l+pPage->nOverfl
35b50 6f 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ow );.  assert( 
35b60 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70  MX_CELL(pPage->p
35b70 42 74 29 3c 3d 31 30 39 32 31 20 29 3b 0a 20 20  Bt)<=10921 );.  
35b80 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
35b90 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50  Cell<=MX_CELL(pP
35ba0 61 67 65 2d 3e 70 42 74 29 20 7c 7c 20 43 4f 52  age->pBt) || COR
35bb0 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73  RUPT_DB );.  ass
35bc0 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
35bd0 72 66 6c 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65  rflow<=ArraySize
35be0 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 20  (pPage->apOvfl) 
35bf0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 41 72 72  );.  assert( Arr
35c00 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 70  aySize(pPage->ap
35c10 4f 76 66 6c 29 3d 3d 41 72 72 61 79 53 69 7a 65  Ovfl)==ArraySize
35c20 28 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 29 20  (pPage->aiOvfl) 
35c30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
35c40 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
35c50 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
35c60 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 63  x) );.  /* The c
35c70 65 6c 6c 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61  ell should norma
35c80 6c 6c 79 20 62 65 20 73 69 7a 65 64 20 63 6f 72  lly be sized cor
35c90 72 65 63 74 6c 79 2e 20 20 48 6f 77 65 76 65 72  rectly.  However
35ca0 2c 20 77 68 65 6e 20 6d 6f 76 69 6e 67 20 61 0a  , when moving a.
35cb0 20 20 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 63    ** malformed c
35cc0 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66 20  ell from a leaf 
35cd0 70 61 67 65 20 74 6f 20 61 6e 20 69 6e 74 65 72  page to an inter
35ce0 69 6f 72 20 70 61 67 65 2c 20 69 66 20 74 68 65  ior page, if the
35cf0 20 63 65 6c 6c 20 73 69 7a 65 0a 20 20 2a 2a 20   cell size.  ** 
35d00 77 61 6e 74 65 64 20 74 6f 20 62 65 20 6c 65 73  wanted to be les
35d10 73 20 74 68 61 6e 20 34 20 62 75 74 20 67 6f 74  s than 4 but got
35d20 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 34   rounded up to 4
35d30 20 6f 6e 20 74 68 65 20 6c 65 61 66 2c 20 74 68   on the leaf, th
35d40 65 6e 20 73 69 7a 65 0a 20 20 2a 2a 20 6d 69 67  en size.  ** mig
35d50 68 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20  ht be less than 
35d60 38 20 28 6c 65 61 66 2d 73 69 7a 65 20 2b 20 70  8 (leaf-size + p
35d70 6f 69 6e 74 65 72 29 20 6f 6e 20 74 68 65 20 69  ointer) on the i
35d80 6e 74 65 72 69 6f 72 20 6e 6f 64 65 2e 20 20 48  nterior node.  H
35d90 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20 74 65  ence.  ** the te
35da0 72 6d 20 61 66 74 65 72 20 74 68 65 20 7c 7c 20  rm after the || 
35db0 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
35dc0 20 61 73 73 65 72 74 28 29 2e 20 2a 2f 0a 20 20   assert(). */.  
35dd0 61 73 73 65 72 74 28 20 73 7a 3d 3d 70 50 61 67  assert( sz==pPag
35de0 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61  e->xCellSize(pPa
35df0 67 65 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 28 73  ge, pCell) || (s
35e00 7a 3d 3d 38 20 26 26 20 69 43 68 69 6c 64 3e 30  z==8 && iChild>0
35e10 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ) );.  if( pPage
35e20 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73  ->nOverflow || s
35e30 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65  z+2>pPage->nFree
35e40 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d   ){.    if( pTem
35e50 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  p ){.      memcp
35e60 79 28 70 54 65 6d 70 2c 20 70 43 65 6c 6c 2c 20  y(pTemp, pCell, 
35e70 73 7a 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c  sz);.      pCell
35e80 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a   = pTemp;.    }.
35e90 20 20 20 20 69 66 28 20 69 43 68 69 6c 64 20 29      if( iChild )
35ea0 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  {.      put4byte
35eb0 28 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64 29 3b  (pCell, iChild);
35ec0 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70  .    }.    j = p
35ed0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b  Page->nOverflow+
35ee0 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a  +;.    assert( j
35ef0 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 70 50  <(int)(sizeof(pP
35f00 61 67 65 2d 3e 61 70 4f 76 66 6c 29 2f 73 69 7a  age->apOvfl)/siz
35f10 65 6f 66 28 70 50 61 67 65 2d 3e 61 70 4f 76 66  eof(pPage->apOvf
35f20 6c 5b 30 5d 29 29 20 29 3b 0a 20 20 20 20 70 50  l[0])) );.    pP
35f30 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 6a 5d 20 3d  age->apOvfl[j] =
35f40 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67   pCell;.    pPag
35f50 65 2d 3e 61 69 4f 76 66 6c 5b 6a 5d 20 3d 20 28  e->aiOvfl[j] = (
35f60 75 31 36 29 69 3b 0a 0a 20 20 20 20 2f 2a 20 57  u16)i;..    /* W
35f70 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65  hen multiple ove
35f80 72 66 6c 6f 77 73 20 6f 63 63 75 72 2c 20 74 68  rflows occur, th
35f90 65 79 20 61 72 65 20 61 6c 77 61 79 73 20 73 65  ey are always se
35fa0 71 75 65 6e 74 69 61 6c 20 61 6e 64 20 69 6e 0a  quential and in.
35fb0 20 20 20 20 2a 2a 20 73 6f 72 74 65 64 20 6f 72      ** sorted or
35fc0 64 65 72 2e 20 20 54 68 69 73 20 69 6e 76 61 72  der.  This invar
35fd0 69 61 6e 74 73 20 61 72 69 73 65 20 62 65 63 61  iants arise beca
35fe0 75 73 65 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65  use multiple ove
35ff0 72 66 6c 6f 77 73 20 63 61 6e 0a 20 20 20 20 2a  rflows can.    *
36000 2a 20 6f 6e 6c 79 20 6f 63 63 75 72 20 77 68 65  * only occur whe
36010 6e 20 69 6e 73 65 72 74 69 6e 67 20 64 69 76 69  n inserting divi
36020 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74  der cells into t
36030 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 64  he parent page d
36040 75 72 69 6e 67 0a 20 20 20 20 2a 2a 20 62 61 6c  uring.    ** bal
36050 61 6e 63 69 6e 67 2c 20 61 6e 64 20 74 68 65 20  ancing, and the 
36060 64 69 76 69 64 65 72 73 20 61 72 65 20 61 64 6a  dividers are adj
36070 61 63 65 6e 74 20 61 6e 64 20 73 6f 72 74 65 64  acent and sorted
36080 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
36090 65 72 74 28 20 6a 3d 3d 30 20 7c 7c 20 70 50 61  ert( j==0 || pPa
360a0 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 2d 31 5d 3c  ge->aiOvfl[j-1]<
360b0 28 75 31 36 29 69 20 29 3b 20 2f 2a 20 4f 76 65  (u16)i ); /* Ove
360c0 72 66 6c 6f 77 73 20 69 6e 20 73 6f 72 74 65 64  rflows in sorted
360d0 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 61 73   order */.    as
360e0 73 65 72 74 28 20 6a 3d 3d 30 20 7c 7c 20 69 3d  sert( j==0 || i=
360f0 3d 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a  =pPage->aiOvfl[j
36100 2d 31 5d 2b 31 20 29 3b 20 20 20 2f 2a 20 4f 76  -1]+1 );   /* Ov
36110 65 72 66 6c 6f 77 73 20 61 72 65 20 73 65 71 75  erflows are sequ
36120 65 6e 74 69 61 6c 20 2a 2f 0a 20 20 7d 65 6c 73  ential */.  }els
36130 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  e{.    int rc = 
36140 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
36150 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
36160 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
36170 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
36180 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20    *pRC = rc;.   
36190 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
361a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
361b0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
361c0 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
361d0 61 67 65 29 20 29 3b 0a 20 20 20 20 64 61 74 61  age) );.    data
361e0 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
361f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 26 64 61  .    assert( &da
36200 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  ta[pPage->cellOf
36210 66 73 65 74 5d 3d 3d 70 50 61 67 65 2d 3e 61 43  fset]==pPage->aC
36220 65 6c 6c 49 64 78 20 29 3b 0a 20 20 20 20 72 63  ellIdx );.    rc
36230 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65   = allocateSpace
36240 28 70 50 61 67 65 2c 20 73 7a 2c 20 26 69 64 78  (pPage, sz, &idx
36250 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
36260 20 2a 70 52 43 20 3d 20 72 63 3b 20 72 65 74 75   *pRC = rc; retu
36270 72 6e 3b 20 7d 0a 20 20 20 20 2f 2a 20 54 68 65  rn; }.    /* The
36280 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 29   allocateSpace()
36290 20 72 6f 75 74 69 6e 65 20 67 75 61 72 61 6e 74   routine guarant
362a0 65 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ees the followin
362b0 67 20 70 72 6f 70 65 72 74 69 65 73 0a 20 20 20  g properties.   
362c0 20 2a 2a 20 69 66 20 69 74 20 72 65 74 75 72 6e   ** if it return
362d0 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 2a  s successfully *
362e0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64  /.    assert( id
362f0 78 20 3e 3d 20 30 20 29 3b 0a 20 20 20 20 61 73  x >= 0 );.    as
36300 73 65 72 74 28 20 69 64 78 20 3e 3d 20 70 50 61  sert( idx >= pPa
36310 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32  ge->cellOffset+2
36320 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 32 20  *pPage->nCell+2 
36330 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
36340 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78  .    assert( idx
36350 2b 73 7a 20 3c 3d 20 28 69 6e 74 29 70 50 61 67  +sz <= (int)pPag
36360 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
36370 7a 65 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  ze );.    pPage-
36380 3e 6e 46 72 65 65 20 2d 3d 20 28 75 31 36 29 28  >nFree -= (u16)(
36390 32 20 2b 20 73 7a 29 3b 0a 20 20 20 20 6d 65 6d  2 + sz);.    mem
363a0 63 70 79 28 26 64 61 74 61 5b 69 64 78 5d 2c 20  cpy(&data[idx], 
363b0 70 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20 20 20 20  pCell, sz);.    
363c0 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20  if( iChild ){.  
363d0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 64 61      put4byte(&da
363e0 74 61 5b 69 64 78 5d 2c 20 69 43 68 69 6c 64 29  ta[idx], iChild)
363f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 73  ;.    }.    pIns
36400 20 3d 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49   = pPage->aCellI
36410 64 78 20 2b 20 69 2a 32 3b 0a 20 20 20 20 6d 65  dx + i*2;.    me
36420 6d 6d 6f 76 65 28 70 49 6e 73 2b 32 2c 20 70 49  mmove(pIns+2, pI
36430 6e 73 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e 43  ns, 2*(pPage->nC
36440 65 6c 6c 20 2d 20 69 29 29 3b 0a 20 20 20 20 70  ell - i));.    p
36450 75 74 32 62 79 74 65 28 70 49 6e 73 2c 20 69 64  ut2byte(pIns, id
36460 78 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e  x);.    pPage->n
36470 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 2f 2a 20 69  Cell++;.    /* i
36480 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 63 65 6c  ncrement the cel
36490 6c 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 69  l count */.    i
364a0 66 28 20 28 2b 2b 64 61 74 61 5b 70 50 61 67 65  f( (++data[pPage
364b0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 34 5d 29 3d  ->hdrOffset+4])=
364c0 3d 30 20 29 20 64 61 74 61 5b 70 50 61 67 65 2d  =0 ) data[pPage-
364d0 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2b 2b 3b  >hdrOffset+3]++;
364e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74  .    assert( get
364f0 32 62 79 74 65 28 26 64 61 74 61 5b 70 50 61 67  2byte(&data[pPag
36500 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 29  e->hdrOffset+3])
36510 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ==pPage->nCell )
36520 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
36530 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
36540 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
36550 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
36560 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
36570 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e  cell may contain
36580 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
36590 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
365a0 49 66 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20  If so, write.   
365b0 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20     ** the entry 
365c0 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
365d0 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70   page into the p
365e0 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20  ointer map..    
365f0 20 20 2a 2f 0a 20 20 20 20 20 20 70 74 72 6d 61    */.      ptrma
36600 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67  pPutOvflPtr(pPag
36610 65 2c 20 70 43 65 6c 6c 2c 20 70 52 43 29 3b 0a  e, pCell, pRC);.
36620 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
36630 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 43 65 6c 6c  .}../*.** A Cell
36640 41 72 72 61 79 20 6f 62 6a 65 63 74 20 63 6f 6e  Array object con
36650 74 61 69 6e 73 20 61 20 63 61 63 68 65 20 6f 66  tains a cache of
36660 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 73 69   pointers and si
36670 7a 65 73 20 66 6f 72 20 61 0a 2a 2a 20 63 6f 6e  zes for a.** con
36680 73 65 63 75 74 69 76 65 20 73 65 71 75 65 6e 63  secutive sequenc
36690 65 20 6f 66 20 63 65 6c 6c 73 20 74 68 61 74 20  e of cells that 
366a0 6d 69 67 68 74 20 62 65 20 68 65 6c 64 20 6d 75  might be held mu
366b0 6c 74 69 70 6c 65 20 70 61 67 65 73 2e 0a 2a 2f  ltiple pages..*/
366c0 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
366d0 43 65 6c 6c 41 72 72 61 79 20 43 65 6c 6c 41 72  CellArray CellAr
366e0 72 61 79 3b 0a 73 74 72 75 63 74 20 43 65 6c 6c  ray;.struct Cell
366f0 41 72 72 61 79 20 7b 0a 20 20 69 6e 74 20 6e 43  Array {.  int nC
36700 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
36710 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
36720 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ells in apCell[]
36730 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
36740 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Ref;          /*
36750 20 52 65 66 65 72 65 6e 63 65 20 70 61 67 65 20   Reference page 
36760 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c  */.  u8 **apCell
36770 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
36780 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e 20  All cells begin 
36790 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31  balanced */.  u1
367a0 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20  6 *szCell;      
367b0 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73        /* Local s
367c0 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73  ize of all cells
367d0 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a   in apCell[] */.
367e0 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  };../*.** Make s
367f0 75 72 65 20 74 68 65 20 63 65 6c 6c 20 73 69 7a  ure the cell siz
36800 65 73 20 61 74 20 69 64 78 2c 20 69 64 78 2b 31  es at idx, idx+1
36810 2c 20 2e 2e 2e 2c 20 69 64 78 2b 4e 2d 31 20 68  , ..., idx+N-1 h
36820 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 6f 6d 70  ave been.** comp
36830 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uted..*/.static 
36840 76 6f 69 64 20 70 6f 70 75 6c 61 74 65 43 65 6c  void populateCel
36850 6c 43 61 63 68 65 28 43 65 6c 6c 41 72 72 61 79  lCache(CellArray
36860 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e   *p, int idx, in
36870 74 20 4e 29 7b 0a 20 20 61 73 73 65 72 74 28 20  t N){.  assert( 
36880 69 64 78 3e 3d 30 20 26 26 20 69 64 78 2b 4e 3c  idx>=0 && idx+N<
36890 3d 70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 77  =p->nCell );.  w
368a0 68 69 6c 65 28 20 4e 3e 30 20 29 7b 0a 20 20 20  hile( N>0 ){.   
368b0 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43 65   assert( p->apCe
368c0 6c 6c 5b 69 64 78 5d 21 3d 30 20 29 3b 0a 20 20  ll[idx]!=0 );.  
368d0 20 20 69 66 28 20 70 2d 3e 73 7a 43 65 6c 6c 5b    if( p->szCell[
368e0 69 64 78 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  idx]==0 ){.     
368f0 20 70 2d 3e 73 7a 43 65 6c 6c 5b 69 64 78 5d 20   p->szCell[idx] 
36900 3d 20 70 2d 3e 70 52 65 66 2d 3e 78 43 65 6c 6c  = p->pRef->xCell
36910 53 69 7a 65 28 70 2d 3e 70 52 65 66 2c 20 70 2d  Size(p->pRef, p-
36920 3e 61 70 43 65 6c 6c 5b 69 64 78 5d 29 3b 0a 20  >apCell[idx]);. 
36930 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
36940 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
36950 44 42 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  DB ||.          
36960 20 20 20 20 70 2d 3e 73 7a 43 65 6c 6c 5b 69 64      p->szCell[id
36970 78 5d 3d 3d 70 2d 3e 70 52 65 66 2d 3e 78 43 65  x]==p->pRef->xCe
36980 6c 6c 53 69 7a 65 28 70 2d 3e 70 52 65 66 2c 20  llSize(p->pRef, 
36990 70 2d 3e 61 70 43 65 6c 6c 5b 69 64 78 5d 29 20  p->apCell[idx]) 
369a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 64 78  );.    }.    idx
369b0 2b 2b 3b 0a 20 20 20 20 4e 2d 2d 3b 0a 20 20 7d  ++;.    N--;.  }
369c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
369d0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
369e0 20 4e 74 68 20 65 6c 65 6d 65 6e 74 20 6f 66 20   Nth element of 
369f0 74 68 65 20 63 65 6c 6c 20 61 72 72 61 79 0a 2a  the cell array.*
36a00 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
36a10 4e 4f 49 4e 4c 49 4e 45 20 75 31 36 20 63 6f 6d  NOINLINE u16 com
36a20 70 75 74 65 43 65 6c 6c 53 69 7a 65 28 43 65 6c  puteCellSize(Cel
36a30 6c 41 72 72 61 79 20 2a 70 2c 20 69 6e 74 20 4e  lArray *p, int N
36a40 29 7b 0a 20 20 61 73 73 65 72 74 28 20 4e 3e 3d  ){.  assert( N>=
36a50 30 20 26 26 20 4e 3c 70 2d 3e 6e 43 65 6c 6c 20  0 && N<p->nCell 
36a60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
36a70 73 7a 43 65 6c 6c 5b 4e 5d 3d 3d 30 20 29 3b 0a  szCell[N]==0 );.
36a80 20 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 20 3d    p->szCell[N] =
36a90 20 70 2d 3e 70 52 65 66 2d 3e 78 43 65 6c 6c 53   p->pRef->xCellS
36aa0 69 7a 65 28 70 2d 3e 70 52 65 66 2c 20 70 2d 3e  ize(p->pRef, p->
36ab0 61 70 43 65 6c 6c 5b 4e 5d 29 3b 0a 20 20 72 65  apCell[N]);.  re
36ac0 74 75 72 6e 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e  turn p->szCell[N
36ad0 5d 3b 0a 7d 0a 73 74 61 74 69 63 20 75 31 36 20  ];.}.static u16 
36ae0 63 61 63 68 65 64 43 65 6c 6c 53 69 7a 65 28 43  cachedCellSize(C
36af0 65 6c 6c 41 72 72 61 79 20 2a 70 2c 20 69 6e 74  ellArray *p, int
36b00 20 4e 29 7b 0a 20 20 61 73 73 65 72 74 28 20 4e   N){.  assert( N
36b10 3e 3d 30 20 26 26 20 4e 3c 70 2d 3e 6e 43 65 6c  >=0 && N<p->nCel
36b20 6c 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73 7a  l );.  if( p->sz
36b30 43 65 6c 6c 5b 4e 5d 20 29 20 72 65 74 75 72 6e  Cell[N] ) return
36b40 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 3b 0a 20   p->szCell[N];. 
36b50 20 72 65 74 75 72 6e 20 63 6f 6d 70 75 74 65 43   return computeC
36b60 65 6c 6c 53 69 7a 65 28 70 2c 20 4e 29 3b 0a 7d  ellSize(p, N);.}
36b70 0a 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79 20 61 70  ../*.** Array ap
36b80 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20  Cell[] contains 
36b90 70 6f 69 6e 74 65 72 73 20 74 6f 20 6e 43 65 6c  pointers to nCel
36ba0 6c 20 62 2d 74 72 65 65 20 70 61 67 65 20 63 65  l b-tree page ce
36bb0 6c 6c 73 2e 20 54 68 65 20 0a 2a 2a 20 73 7a 43  lls. The .** szC
36bc0 65 6c 6c 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74  ell[] array cont
36bd0 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 69 6e  ains the size in
36be0 20 62 79 74 65 73 20 6f 66 20 65 61 63 68 20 63   bytes of each c
36bf0 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ell. This functi
36c00 6f 6e 0a 2a 2a 20 72 65 70 6c 61 63 65 73 20 74  on.** replaces t
36c10 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65  he current conte
36c20 6e 74 73 20 6f 66 20 70 61 67 65 20 70 50 67 20  nts of page pPg 
36c30 77 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74  with the content
36c40 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 0a 2a 2a  s of the cell.**
36c50 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 53 6f   array..**.** So
36c60 6d 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20  me of the cells 
36c70 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6d 61 79 20  in apCell[] may 
36c80 63 75 72 72 65 6e 74 6c 79 20 62 65 20 73 74 6f  currently be sto
36c90 72 65 64 20 69 6e 20 70 50 67 2e 20 54 68 69 73  red in pPg. This
36ca0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72  .** function wor
36cb0 6b 73 20 61 72 6f 75 6e 64 20 70 72 6f 62 6c 65  ks around proble
36cc0 6d 73 20 63 61 75 73 65 64 20 62 79 20 74 68 69  ms caused by thi
36cd0 73 20 62 79 20 6d 61 6b 69 6e 67 20 61 20 63 6f  s by making a co
36ce0 70 79 20 6f 66 20 61 6e 79 20 0a 2a 2a 20 73 75  py of any .** su
36cf0 63 68 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 20  ch cells before 
36d00 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65 20  overwriting the 
36d10 70 61 67 65 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a  page data..**.**
36d20 20 54 68 65 20 4d 65 6d 50 61 67 65 2e 6e 46 72   The MemPage.nFr
36d30 65 65 20 66 69 65 6c 64 20 69 73 20 69 6e 76 61  ee field is inva
36d40 6c 69 64 61 74 65 64 20 62 79 20 74 68 69 73 20  lidated by this 
36d50 66 75 6e 63 74 69 6f 6e 2e 20 49 74 20 69 73 20  function. It is 
36d60 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69  the .** responsi
36d70 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
36d80 6c 6c 65 72 20 74 6f 20 73 65 74 20 69 74 20 63  ller to set it c
36d90 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61  orrectly..*/.sta
36da0 74 69 63 20 69 6e 74 20 72 65 62 75 69 6c 64 50  tic int rebuildP
36db0 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  age(.  MemPage *
36dc0 70 50 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  pPg,            
36dd0 20 20 20 20 20 20 20 2f 2a 20 45 64 69 74 20 74         /* Edit t
36de0 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  his page */.  in
36df0 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20  t nCell,        
36e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36e10 20 46 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Final number of
36e20 20 63 65 6c 6c 73 20 6f 6e 20 70 61 67 65 20 2a   cells on page *
36e30 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c  /.  u8 **apCell,
36e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36e50 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
36e60 63 65 6c 6c 73 20 2a 2f 0a 20 20 75 31 36 20 2a  cells */.  u16 *
36e70 73 7a 43 65 6c 6c 20 20 20 20 20 20 20 20 20 20  szCell          
36e80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
36e90 72 61 79 20 6f 66 20 63 65 6c 6c 20 73 69 7a 65  ray of cell size
36ea0 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  s */.){.  const 
36eb0 69 6e 74 20 68 64 72 20 3d 20 70 50 67 2d 3e 68  int hdr = pPg->h
36ec0 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20  drOffset;       
36ed0 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
36ee0 68 65 61 64 65 72 20 6f 6e 20 70 50 67 20 2a 2f  header on pPg */
36ef0 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44  .  u8 * const aD
36f00 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61  ata = pPg->aData
36f10 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ;           /* P
36f20 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 66  ointer to data f
36f30 6f 72 20 70 50 67 20 2a 2f 0a 20 20 63 6f 6e 73  or pPg */.  cons
36f40 74 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65  t int usableSize
36f50 20 3d 20 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61   = pPg->pBt->usa
36f60 62 6c 65 53 69 7a 65 3b 0a 20 20 75 38 20 2a 20  bleSize;.  u8 * 
36f70 63 6f 6e 73 74 20 70 45 6e 64 20 3d 20 26 61 44  const pEnd = &aD
36f80 61 74 61 5b 75 73 61 62 6c 65 53 69 7a 65 5d 3b  ata[usableSize];
36f90 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 38 20 2a  .  int i;.  u8 *
36fa0 70 43 65 6c 6c 70 74 72 20 3d 20 70 50 67 2d 3e  pCellptr = pPg->
36fb0 61 43 65 6c 6c 49 64 78 3b 0a 20 20 75 38 20 2a  aCellIdx;.  u8 *
36fc0 70 54 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61  pTmp = sqlite3Pa
36fd0 67 65 72 54 65 6d 70 53 70 61 63 65 28 70 50 67  gerTempSpace(pPg
36fe0 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  ->pBt->pPager);.
36ff0 20 20 75 38 20 2a 70 44 61 74 61 3b 0a 0a 20 20    u8 *pData;..  
37000 69 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44  i = get2byte(&aD
37010 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d  ata[hdr+5]);.  m
37020 65 6d 63 70 79 28 26 70 54 6d 70 5b 69 5d 2c 20  emcpy(&pTmp[i], 
37030 26 61 44 61 74 61 5b 69 5d 2c 20 75 73 61 62 6c  &aData[i], usabl
37040 65 53 69 7a 65 20 2d 20 69 29 3b 0a 0a 20 20 70  eSize - i);..  p
37050 44 61 74 61 20 3d 20 70 45 6e 64 3b 0a 20 20 66  Data = pEnd;.  f
37060 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
37070 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70   i++){.    u8 *p
37080 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 69 5d  Cell = apCell[i]
37090 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ;.    if( SQLITE
370a0 5f 57 49 54 48 49 4e 28 70 43 65 6c 6c 2c 61 44  _WITHIN(pCell,aD
370b0 61 74 61 2c 70 45 6e 64 29 20 29 7b 0a 20 20 20  ata,pEnd) ){.   
370c0 20 20 20 70 43 65 6c 6c 20 3d 20 26 70 54 6d 70     pCell = &pTmp
370d0 5b 70 43 65 6c 6c 20 2d 20 61 44 61 74 61 5d 3b  [pCell - aData];
370e0 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 61 74 61  .    }.    pData
370f0 20 2d 3d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20   -= szCell[i];. 
37100 20 20 20 70 75 74 32 62 79 74 65 28 70 43 65 6c     put2byte(pCel
37110 6c 70 74 72 2c 20 28 70 44 61 74 61 20 2d 20 61  lptr, (pData - a
37120 44 61 74 61 29 29 3b 0a 20 20 20 20 70 43 65 6c  Data));.    pCel
37130 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20 20 20 69  lptr += 2;.    i
37140 66 28 20 70 44 61 74 61 20 3c 20 70 43 65 6c 6c  f( pData < pCell
37150 70 74 72 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ptr ) return SQL
37160 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
37170 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61  ;.    memcpy(pDa
37180 74 61 2c 20 70 43 65 6c 6c 2c 20 73 7a 43 65 6c  ta, pCell, szCel
37190 6c 5b 69 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  l[i]);.    asser
371a0 74 28 20 73 7a 43 65 6c 6c 5b 69 5d 3d 3d 70 50  t( szCell[i]==pP
371b0 67 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 67  g->xCellSize(pPg
371c0 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 43 4f 52 52  , pCell) || CORR
371d0 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 74 65  UPT_DB );.    te
371e0 73 74 63 61 73 65 28 20 73 7a 43 65 6c 6c 5b 69  stcase( szCell[i
371f0 5d 21 3d 70 50 67 2d 3e 78 43 65 6c 6c 53 69 7a  ]!=pPg->xCellSiz
37200 65 28 70 50 67 2c 70 43 65 6c 6c 29 20 29 3b 0a  e(pPg,pCell) );.
37210 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 70 50    }..  /* The pP
37220 67 2d 3e 6e 46 72 65 65 20 66 69 65 6c 64 20 69  g->nFree field i
37230 73 20 6e 6f 77 20 73 65 74 20 69 6e 63 6f 72 72  s now set incorr
37240 65 63 74 6c 79 2e 20 54 68 65 20 63 61 6c 6c 65  ectly. The calle
37250 72 20 77 69 6c 6c 20 66 69 78 20 69 74 2e 20 2a  r will fix it. *
37260 2f 0a 20 20 70 50 67 2d 3e 6e 43 65 6c 6c 20 3d  /.  pPg->nCell =
37270 20 6e 43 65 6c 6c 3b 0a 20 20 70 50 67 2d 3e 6e   nCell;.  pPg->n
37280 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20  Overflow = 0;.. 
37290 20 70 75 74 32 62 79 74 65 28 26 61 44 61 74 61   put2byte(&aData
372a0 5b 68 64 72 2b 31 5d 2c 20 30 29 3b 0a 20 20 70  [hdr+1], 0);.  p
372b0 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 68  ut2byte(&aData[h
372c0 64 72 2b 33 5d 2c 20 70 50 67 2d 3e 6e 43 65 6c  dr+3], pPg->nCel
372d0 6c 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  l);.  put2byte(&
372e0 61 44 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 44  aData[hdr+5], pD
372f0 61 74 61 20 2d 20 61 44 61 74 61 29 3b 0a 20 20  ata - aData);.  
37300 61 44 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30  aData[hdr+7] = 0
37310 78 30 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  x00;.  return SQ
37320 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
37330 2a 20 41 72 72 61 79 20 61 70 43 65 6c 6c 5b 5d  * Array apCell[]
37340 20 63 6f 6e 74 61 69 6e 73 20 6e 43 65 6c 6c 20   contains nCell 
37350 70 6f 69 6e 74 65 72 73 20 74 6f 20 62 2d 74 72  pointers to b-tr
37360 65 65 20 63 65 6c 6c 73 2e 20 41 72 72 61 79 20  ee cells. Array 
37370 73 7a 43 65 6c 6c 0a 2a 2a 20 63 6f 6e 74 61 69  szCell.** contai
37380 6e 73 20 74 68 65 20 73 69 7a 65 20 69 6e 20 62  ns the size in b
37390 79 74 65 73 20 6f 66 20 65 61 63 68 20 73 75 63  ytes of each suc
373a0 68 20 63 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e  h cell. This fun
373b0 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
373c0 6f 20 0a 2a 2a 20 61 64 64 20 74 68 65 20 63 65  o .** add the ce
373d0 6c 6c 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68  lls stored in th
373e0 65 20 61 72 72 61 79 20 74 6f 20 70 61 67 65 20  e array to page 
373f0 70 50 67 2e 20 49 66 20 69 74 20 63 61 6e 6e 6f  pPg. If it canno
37400 74 20 28 62 65 63 61 75 73 65 20 0a 2a 2a 20 74  t (because .** t
37410 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f  he page needs to
37420 20 62 65 20 64 65 66 72 61 67 6d 65 6e 74 65 64   be defragmented
37430 20 62 65 66 6f 72 65 20 74 68 65 20 63 65 6c 6c   before the cell
37440 73 20 77 69 6c 6c 20 66 69 74 29 2c 20 6e 6f 6e  s will fit), non
37450 2d 7a 65 72 6f 0a 2a 2a 20 69 73 20 72 65 74 75  -zero.** is retu
37460 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
37470 20 69 66 20 74 68 65 20 63 65 6c 6c 73 20 61 72   if the cells ar
37480 65 20 61 64 64 65 64 20 73 75 63 63 65 73 73 66  e added successf
37490 75 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 0a 2a 2a  ully, zero is.**
374a0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
374b0 20 41 72 67 75 6d 65 6e 74 20 70 43 65 6c 6c 70   Argument pCellp
374c0 74 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  tr points to the
374d0 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
374e0 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72  the cell-pointer
374f0 20 61 72 72 61 79 0a 2a 2a 20 28 70 61 72 74 20   array.** (part 
37500 6f 66 20 70 61 67 65 20 70 50 67 29 20 74 6f 20  of page pPg) to 
37510 70 6f 70 75 6c 61 74 65 2e 20 41 66 74 65 72 20  populate. After 
37520 63 65 6c 6c 20 61 70 43 65 6c 6c 5b 30 5d 20 69  cell apCell[0] i
37530 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
37540 0a 2a 2a 20 70 61 67 65 20 62 6f 64 79 2c 20 61  .** page body, a
37550 20 31 36 2d 62 69 74 20 6f 66 66 73 65 74 20 69   16-bit offset i
37560 73 20 77 72 69 74 74 65 6e 20 74 6f 20 70 43 65  s written to pCe
37570 6c 6c 70 74 72 2e 20 41 6e 64 20 73 6f 20 6f 6e  llptr. And so on
37580 2c 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 65  , for each.** ce
37590 6c 6c 20 69 6e 20 74 68 65 20 61 72 72 61 79 2e  ll in the array.
375a0 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   It is the respo
375b0 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
375c0 20 63 61 6c 6c 65 72 20 74 6f 20 65 6e 73 75 72   caller to ensur
375d0 65 0a 2a 2a 20 74 68 61 74 20 69 74 20 69 73 20  e.** that it is 
375e0 73 61 66 65 20 74 6f 20 6f 76 65 72 77 72 69 74  safe to overwrit
375f0 65 20 74 68 69 73 20 70 61 72 74 20 6f 66 20 74  e this part of t
37600 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20  he cell-pointer 
37610 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  array..**.** Whe
37620 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
37630 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70 70 44 61  is called, *ppDa
37640 74 61 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ta points to the
37650 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 0a 2a   start of the .*
37660 2a 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 6f  * content area o
37670 6e 20 70 61 67 65 20 70 50 67 2e 20 49 66 20 74  n page pPg. If t
37680 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 63  he size of the c
37690 6f 6e 74 65 6e 74 20 61 72 65 61 20 69 73 20 65  ontent area is e
376a0 78 74 65 6e 64 65 64 2c 0a 2a 2a 20 2a 70 70 44  xtended,.** *ppD
376b0 61 74 61 20 69 73 20 75 70 64 61 74 65 64 20 74  ata is updated t
376c0 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e  o point to the n
376d0 65 77 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  ew start of the 
376e0 63 6f 6e 74 65 6e 74 20 61 72 65 61 0a 2a 2a 20  content area.** 
376f0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
37700 2e 0a 2a 2a 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c  ..**.** Finally,
37710 20 61 72 67 75 6d 65 6e 74 20 70 42 65 67 69 6e   argument pBegin
37720 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 62   points to the b
37730 79 74 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  yte immediately 
37740 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 0a 2a 2a  following the.**
37750 20 65 6e 64 20 6f 66 20 74 68 65 20 73 70 61 63   end of the spac
37760 65 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68  e required by th
37770 69 73 20 70 61 67 65 20 66 6f 72 20 74 68 65 20  is page for the 
37780 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 65  cell-pointer are
37790 61 20 28 66 6f 72 0a 2a 2a 20 61 6c 6c 20 63 65  a (for.** all ce
377a0 6c 6c 73 20 2d 20 6e 6f 74 20 6a 75 73 74 20 74  lls - not just t
377b0 68 6f 73 65 20 69 6e 73 65 72 74 65 64 20 62 79  hose inserted by
377c0 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 61 6c   the current cal
377d0 6c 29 2e 20 49 66 20 74 68 65 20 63 6f 6e 74 65  l). If the conte
377e0 6e 74 0a 2a 2a 20 61 72 65 61 20 6d 75 73 74 20  nt.** area must 
377f0 62 65 20 65 78 74 65 6e 64 65 64 20 74 6f 20 62  be extended to b
37800 65 66 6f 72 65 20 74 68 69 73 20 70 6f 69 6e 74  efore this point
37810 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 63 63   in order to acc
37820 6f 6d 6f 64 61 74 65 20 61 6c 6c 0a 2a 2a 20 63  omodate all.** c
37830 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ells in apCell[]
37840 2c 20 74 68 65 6e 20 74 68 65 20 63 65 6c 6c 73  , then the cells
37850 20 64 6f 20 6e 6f 74 20 66 69 74 20 61 6e 64 20   do not fit and 
37860 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75  non-zero is retu
37870 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
37880 69 6e 74 20 70 61 67 65 49 6e 73 65 72 74 41 72  int pageInsertAr
37890 72 61 79 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ray(.  MemPage *
378a0 70 50 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  pPg,            
378b0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74         /* Page t
378c0 6f 20 61 64 64 20 63 65 6c 6c 73 20 74 6f 20 2a  o add cells to *
378d0 2f 0a 20 20 75 38 20 2a 70 42 65 67 69 6e 2c 20  /.  u8 *pBegin, 
378e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
378f0 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 63 65      /* End of ce
37900 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll-pointer array
37910 20 2a 2f 0a 20 20 75 38 20 2a 2a 70 70 44 61 74   */.  u8 **ppDat
37920 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a,              
37930 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
37940 20 50 61 67 65 20 63 6f 6e 74 65 6e 74 20 2d 61   Page content -a
37950 72 65 61 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  rea pointer */. 
37960 20 75 38 20 2a 70 43 65 6c 6c 70 74 72 2c 20 20   u8 *pCellptr,  
37970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37980 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63   /* Pointer to c
37990 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 65 61  ell-pointer area
379a0 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72 73 74   */.  int iFirst
379b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
379c0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
379d0 66 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 20  f first cell to 
379e0 61 64 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  add */.  int nCe
379f0 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
37a00 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
37a10 65 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61  er of cells to a
37a20 64 64 20 74 6f 20 70 50 67 20 2a 2f 0a 20 20 43  dd to pPg */.  C
37a30 65 6c 6c 41 72 72 61 79 20 2a 70 43 41 72 72 61  ellArray *pCArra
37a40 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  y              /
37a50 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 73  * Array of cells
37a60 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
37a70 20 20 75 38 20 2a 61 44 61 74 61 20 3d 20 70 50    u8 *aData = pP
37a80 67 2d 3e 61 44 61 74 61 3b 0a 20 20 75 38 20 2a  g->aData;.  u8 *
37a90 70 44 61 74 61 20 3d 20 2a 70 70 44 61 74 61 3b  pData = *ppData;
37aa0 0a 20 20 69 6e 74 20 69 45 6e 64 20 3d 20 69 46  .  int iEnd = iF
37ab0 69 72 73 74 20 2b 20 6e 43 65 6c 6c 3b 0a 20 20  irst + nCell;.  
37ac0 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
37ad0 44 42 20 7c 7c 20 70 50 67 2d 3e 68 64 72 4f 66  DB || pPg->hdrOf
37ae0 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 2f 2a  fset==0 );    /*
37af0 20 4e 65 76 65 72 20 63 61 6c 6c 65 64 20 6f 6e   Never called on
37b00 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 66 6f 72   page 1 */.  for
37b10 28 69 3d 69 46 69 72 73 74 3b 20 69 3c 69 45 6e  (i=iFirst; i<iEn
37b20 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  d; i++){.    int
37b30 20 73 7a 2c 20 72 63 3b 0a 20 20 20 20 75 38 20   sz, rc;.    u8 
37b40 2a 70 53 6c 6f 74 3b 0a 20 20 20 20 73 7a 20 3d  *pSlot;.    sz =
37b50 20 63 61 63 68 65 64 43 65 6c 6c 53 69 7a 65 28   cachedCellSize(
37b60 70 43 41 72 72 61 79 2c 20 69 29 3b 0a 20 20 20  pCArray, i);.   
37b70 20 69 66 28 20 28 61 44 61 74 61 5b 31 5d 3d 3d   if( (aData[1]==
37b80 30 20 26 26 20 61 44 61 74 61 5b 32 5d 3d 3d 30  0 && aData[2]==0
37b90 29 20 7c 7c 20 28 70 53 6c 6f 74 20 3d 20 70 61  ) || (pSlot = pa
37ba0 67 65 46 69 6e 64 53 6c 6f 74 28 70 50 67 2c 73  geFindSlot(pPg,s
37bb0 7a 2c 26 72 63 29 29 3d 3d 30 20 29 7b 0a 20 20  z,&rc))==0 ){.  
37bc0 20 20 20 20 70 44 61 74 61 20 2d 3d 20 73 7a 3b      pData -= sz;
37bd0 0a 20 20 20 20 20 20 69 66 28 20 70 44 61 74 61  .      if( pData
37be0 3c 70 42 65 67 69 6e 20 29 20 72 65 74 75 72 6e  <pBegin ) return
37bf0 20 31 3b 0a 20 20 20 20 20 20 70 53 6c 6f 74 20   1;.      pSlot 
37c00 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20  = pData;.    }. 
37c10 20 20 20 2f 2a 20 70 53 6c 6f 74 20 61 6e 64 20     /* pSlot and 
37c20 70 43 41 72 72 61 79 2d 3e 61 70 43 65 6c 6c 5b  pCArray->apCell[
37c30 69 5d 20 77 69 6c 6c 20 6e 65 76 65 72 20 6f 76  i] will never ov
37c40 65 72 6c 61 70 20 6f 6e 20 61 20 77 65 6c 6c 2d  erlap on a well-
37c50 66 6f 72 6d 65 64 0a 20 20 20 20 2a 2a 20 64 61  formed.    ** da
37c60 74 61 62 61 73 65 2e 20 20 42 75 74 20 74 68 65  tabase.  But the
37c70 79 20 6d 69 67 68 74 20 66 6f 72 20 61 20 63 6f  y might for a co
37c80 72 72 75 70 74 20 64 61 74 61 62 61 73 65 2e 20  rrupt database. 
37c90 20 48 65 6e 63 65 20 75 73 65 20 6d 65 6d 6d 6f   Hence use memmo
37ca0 76 65 28 29 0a 20 20 20 20 2a 2a 20 73 69 6e 63  ve().    ** sinc
37cb0 65 20 6d 65 6d 63 70 79 28 29 20 73 65 6e 64 73  e memcpy() sends
37cc0 20 53 49 47 41 42 4f 52 54 20 77 69 74 68 20 6f   SIGABORT with o
37cd0 76 65 72 6c 61 70 70 69 6e 67 20 62 75 66 66 65  verlapping buffe
37ce0 72 73 20 6f 6e 20 4f 70 65 6e 42 53 44 20 2a 2f  rs on OpenBSD */
37cf0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 53  .    assert( (pS
37d00 6c 6f 74 2b 73 7a 29 3c 3d 70 43 41 72 72 61 79  lot+sz)<=pCArray
37d10 2d 3e 61 70 43 65 6c 6c 5b 69 5d 0a 20 20 20 20  ->apCell[i].    
37d20 20 20 20 20 20 7c 7c 20 70 53 6c 6f 74 3e 3d 28       || pSlot>=(
37d30 70 43 41 72 72 61 79 2d 3e 61 70 43 65 6c 6c 5b  pCArray->apCell[
37d40 69 5d 2b 73 7a 29 0a 20 20 20 20 20 20 20 20 20  i]+sz).         
37d50 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
37d60 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 53 6c  .    memmove(pSl
37d70 6f 74 2c 20 70 43 41 72 72 61 79 2d 3e 61 70 43  ot, pCArray->apC
37d80 65 6c 6c 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 20  ell[i], sz);.   
37d90 20 70 75 74 32 62 79 74 65 28 70 43 65 6c 6c 70   put2byte(pCellp
37da0 74 72 2c 20 28 70 53 6c 6f 74 20 2d 20 61 44 61  tr, (pSlot - aDa
37db0 74 61 29 29 3b 0a 20 20 20 20 70 43 65 6c 6c 70  ta));.    pCellp
37dc0 74 72 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20 2a  tr += 2;.  }.  *
37dd0 70 70 44 61 74 61 20 3d 20 70 44 61 74 61 3b 0a  ppData = pData;.
37de0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
37df0 2a 0a 2a 2a 20 41 72 72 61 79 20 61 70 43 65 6c  *.** Array apCel
37e00 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 6e 43 65  l[] contains nCe
37e10 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 62  ll pointers to b
37e20 2d 74 72 65 65 20 63 65 6c 6c 73 2e 20 41 72 72  -tree cells. Arr
37e30 61 79 20 73 7a 43 65 6c 6c 20 0a 2a 2a 20 63 6f  ay szCell .** co
37e40 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20  ntains the size 
37e50 69 6e 20 62 79 74 65 73 20 6f 66 20 65 61 63 68  in bytes of each
37e60 20 73 75 63 68 20 63 65 6c 6c 2e 20 54 68 69 73   such cell. This
37e70 20 66 75 6e 63 74 69 6f 6e 20 61 64 64 73 20 74   function adds t
37e80 68 65 0a 2a 2a 20 73 70 61 63 65 20 61 73 73 6f  he.** space asso
37e90 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68  ciated with each
37ea0 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 61 72 72   cell in the arr
37eb0 61 79 20 74 68 61 74 20 69 73 20 63 75 72 72 65  ay that is curre
37ec0 6e 74 6c 79 20 73 74 6f 72 65 64 20 0a 2a 2a 20  ntly stored .** 
37ed0 77 69 74 68 69 6e 20 74 68 65 20 62 6f 64 79 20  within the body 
37ee0 6f 66 20 70 50 67 20 74 6f 20 74 68 65 20 70 50  of pPg to the pP
37ef0 67 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 65  g free-list. The
37f00 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 73 20 61   cell-pointers a
37f10 6e 64 20 6f 74 68 65 72 0a 2a 2a 20 66 69 65 6c  nd other.** fiel
37f20 64 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 61  ds of the page a
37f30 72 65 20 6e 6f 74 20 75 70 64 61 74 65 64 2e 0a  re not updated..
37f40 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
37f50 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  ion returns the 
37f60 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
37f70 63 65 6c 6c 73 20 61 64 64 65 64 20 74 6f 20 74  cells added to t
37f80 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2f  he free-list..*/
37f90 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
37fa0 46 72 65 65 41 72 72 61 79 28 0a 20 20 4d 65 6d  FreeArray(.  Mem
37fb0 50 61 67 65 20 2a 70 50 67 2c 20 20 20 20 20 20  Page *pPg,      
37fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37fd0 50 61 67 65 20 74 6f 20 65 64 69 74 20 2a 2f 0a  Page to edit */.
37fe0 20 20 69 6e 74 20 69 46 69 72 73 74 2c 20 20 20    int iFirst,   
37ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38000 20 20 2f 2a 20 46 69 72 73 74 20 63 65 6c 6c 20    /* First cell 
38010 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69  to delete */.  i
38020 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20  nt nCell,       
38030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
38040 2a 20 43 65 6c 6c 73 20 74 6f 20 64 65 6c 65 74  * Cells to delet
38050 65 20 2a 2f 0a 20 20 43 65 6c 6c 41 72 72 61 79  e */.  CellArray
38060 20 2a 70 43 41 72 72 61 79 20 20 20 20 20 20 20   *pCArray       
38070 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
38080 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20  of cells */.){. 
38090 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61 74   u8 * const aDat
380a0 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a  a = pPg->aData;.
380b0 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 45 6e    u8 * const pEn
380c0 64 20 3d 20 26 61 44 61 74 61 5b 70 50 67 2d 3e  d = &aData[pPg->
380d0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d  pBt->usableSize]
380e0 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70  ;.  u8 * const p
380f0 53 74 61 72 74 20 3d 20 26 61 44 61 74 61 5b 70  Start = &aData[p
38100 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 20 2b 20  Pg->hdrOffset + 
38110 38 20 2b 20 70 50 67 2d 3e 63 68 69 6c 64 50 74  8 + pPg->childPt
38120 72 53 69 7a 65 5d 3b 0a 20 20 69 6e 74 20 6e 52  rSize];.  int nR
38130 65 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  et = 0;.  int i;
38140 0a 20 20 69 6e 74 20 69 45 6e 64 20 3d 20 69 46  .  int iEnd = iF
38150 69 72 73 74 20 2b 20 6e 43 65 6c 6c 3b 0a 20 20  irst + nCell;.  
38160 75 38 20 2a 70 46 72 65 65 20 3d 20 30 3b 0a 20  u8 *pFree = 0;. 
38170 20 69 6e 74 20 73 7a 46 72 65 65 20 3d 20 30 3b   int szFree = 0;
38180 0a 0a 20 20 66 6f 72 28 69 3d 69 46 69 72 73 74  ..  for(i=iFirst
38190 3b 20 69 3c 69 45 6e 64 3b 20 69 2b 2b 29 7b 0a  ; i<iEnd; i++){.
381a0 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20      u8 *pCell = 
381b0 70 43 41 72 72 61 79 2d 3e 61 70 43 65 6c 6c 5b  pCArray->apCell[
381c0 69 5d 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49  i];.    if( SQLI
381d0 54 45 5f 57 49 54 48 49 4e 28 70 43 65 6c 6c 2c  TE_WITHIN(pCell,
381e0 20 70 53 74 61 72 74 2c 20 70 45 6e 64 29 20 29   pStart, pEnd) )
381f0 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a  {.      int sz;.
38200 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6e 65 65 64        /* No need
38210 20 74 6f 20 75 73 65 20 63 61 63 68 65 64 43 65   to use cachedCe
38220 6c 6c 53 69 7a 65 28 29 20 68 65 72 65 2e 20 20  llSize() here.  
38230 54 68 65 20 73 69 7a 65 73 20 6f 66 20 61 6c 6c  The sizes of all
38240 20 63 65 6c 6c 73 20 74 68 61 74 0a 20 20 20 20   cells that.    
38250 20 20 2a 2a 20 61 72 65 20 74 6f 20 62 65 20 66    ** are to be f
38260 72 65 65 64 20 68 61 76 65 20 61 6c 72 65 61 64  reed have alread
38270 79 20 62 65 65 6e 20 63 6f 6d 70 75 74 69 6e 67  y been computing
38280 20 77 68 69 6c 65 20 64 65 63 69 64 69 6e 67 20   while deciding 
38290 77 68 69 63 68 0a 20 20 20 20 20 20 2a 2a 20 63  which.      ** c
382a0 65 6c 6c 73 20 6e 65 65 64 20 66 72 65 65 69 6e  ells need freein
382b0 67 20 2a 2f 0a 20 20 20 20 20 20 73 7a 20 3d 20  g */.      sz = 
382c0 70 43 41 72 72 61 79 2d 3e 73 7a 43 65 6c 6c 5b  pCArray->szCell[
382d0 69 5d 3b 20 20 61 73 73 65 72 74 28 20 73 7a 3e  i];  assert( sz>
382e0 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
382f0 46 72 65 65 21 3d 28 70 43 65 6c 6c 20 2b 20 73  Free!=(pCell + s
38300 7a 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  z) ){.        if
38310 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20 20 20  ( pFree ){.     
38320 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72       assert( pFr
38330 65 65 3e 61 44 61 74 61 20 26 26 20 28 70 46 72  ee>aData && (pFr
38340 65 65 20 2d 20 61 44 61 74 61 29 3c 36 35 35 33  ee - aData)<6553
38350 36 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66  6 );.          f
38360 72 65 65 53 70 61 63 65 28 70 50 67 2c 20 28 75  reeSpace(pPg, (u
38370 31 36 29 28 70 46 72 65 65 20 2d 20 61 44 61 74  16)(pFree - aDat
38380 61 29 2c 20 73 7a 46 72 65 65 29 3b 0a 20 20 20  a), szFree);.   
38390 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
383a0 46 72 65 65 20 3d 20 70 43 65 6c 6c 3b 0a 20 20  Free = pCell;.  
383b0 20 20 20 20 20 20 73 7a 46 72 65 65 20 3d 20 73        szFree = s
383c0 7a 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  z;.        if( p
383d0 46 72 65 65 2b 73 7a 3e 70 45 6e 64 20 29 20 72  Free+sz>pEnd ) r
383e0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
383f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46  else{.        pF
38400 72 65 65 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20  ree = pCell;.   
38410 20 20 20 20 20 73 7a 46 72 65 65 20 2b 3d 20 73       szFree += s
38420 7a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  z;.      }.     
38430 20 6e 52 65 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20   nRet++;.    }. 
38440 20 7d 0a 20 20 69 66 28 20 70 46 72 65 65 20 29   }.  if( pFree )
38450 7b 0a