/ Hex Artifact Content
Login

Artifact 66e482529d76e74634db5499d997c16c8bdee221:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 23 69 66 20 64 65   enable){.#if de
0b30: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0b40: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
0b50: 49 54 45 5f 54 45 53 54 29 20 26 26 20 21 64 65  ITE_TEST) && !de
0b60: 66 69 6e 65 64 28 54 48 33 5f 43 4f 4d 50 41 54  fined(TH3_COMPAT
0b70: 49 42 49 4c 49 54 59 29 0a 20 20 2f 2a 20 45 6e  IBILITY).  /* En
0b80: 61 62 6c 65 20 67 6c 6f 62 61 6c 20 73 68 61 72  able global shar
0b90: 65 64 20 63 61 63 68 65 20 66 75 6e 63 74 69 6f  ed cache functio
0ba0: 6e 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20  n for debugging 
0bb0: 61 6e 64 20 75 6e 69 74 20 74 65 73 74 73 2c 20  and unit tests, 
0bc0: 0a 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20 66 6f  .  ** but not fo
0bd0: 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 72  r release */.  r
0be0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
0bf0: 55 53 45 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c  USE;.#else.  sql
0c00: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
0c10: 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62  .sharedCacheEnab
0c20: 6c 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20  led = enable;.  
0c30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
0c40: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 23 65 6e 64 69  ;.#endif.}.#endi
0c50: 66 0a 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  f....#ifdef SQLI
0c60: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0c70: 41 43 48 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54  ACHE.  /*.  ** T
0c80: 68 65 20 66 75 6e 63 74 69 6f 6e 73 20 71 75 65  he functions que
0c90: 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62  rySharedCacheTab
0ca0: 6c 65 4c 6f 63 6b 28 29 2c 20 73 65 74 53 68 61  leLock(), setSha
0cb0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0cc0: 6b 28 29 2c 0a 20 20 2a 2a 20 61 6e 64 20 63 6c  k(),.  ** and cl
0cd0: 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
0ce0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 29 0a 20 20  eTableLocks().  
0cf0: 2a 2a 20 6d 61 6e 69 70 75 6c 61 74 65 20 65 6e  ** manipulate en
0d00: 74 72 69 65 73 20 69 6e 20 74 68 65 20 42 74 53  tries in the BtS
0d10: 68 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e 6b  hared.pLock link
0d20: 65 64 20 6c 69 73 74 20 75 73 65 64 20 74 6f 20  ed list used to 
0d30: 73 74 6f 72 65 0a 20 20 2a 2a 20 73 68 61 72 65  store.  ** share
0d40: 64 2d 63 61 63 68 65 20 74 61 62 6c 65 20 6c 65  d-cache table le
0d50: 76 65 6c 20 6c 6f 63 6b 73 2e 20 49 66 20 74 68  vel locks. If th
0d60: 65 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d  e library is com
0d70: 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 0a 20  piled with the. 
0d80: 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65   ** shared-cache
0d90: 20 66 65 61 74 75 72 65 20 64 69 73 61 62 6c 65   feature disable
0da0: 64 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  d, then there is
0db0: 20 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20 75   only ever one u
0dc0: 73 65 72 0a 20 20 2a 2a 20 6f 66 20 65 61 63 68  ser.  ** of each
0dd0: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
0de0: 75 72 65 20 61 6e 64 20 73 6f 20 74 68 69 73 20  ure and so this 
0df0: 6c 6f 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20 6e  locking is not n
0e00: 65 63 65 73 73 61 72 79 2e 20 0a 20 20 2a 2a 20  ecessary. .  ** 
0e10: 53 6f 20 64 65 66 69 6e 65 20 74 68 65 20 6c 6f  So define the lo
0e20: 63 6b 20 72 65 6c 61 74 65 64 20 66 75 6e 63 74  ck related funct
0e30: 69 6f 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e 0a  ions as no-ops..
0e40: 20 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 71    */.  #define q
0e50: 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
0e60: 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29 20  ableLock(a,b,c) 
0e70: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66  SQLITE_OK.  #def
0e80: 69 6e 65 20 73 65 74 53 68 61 72 65 64 43 61 63  ine setSharedCac
0e90: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c  heTableLock(a,b,
0ea0: 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23  c) SQLITE_OK.  #
0eb0: 64 65 66 69 6e 65 20 63 6c 65 61 72 41 6c 6c 53  define clearAllS
0ec0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0ed0: 6f 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e  ocks(a).  #defin
0ee0: 65 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68  e downgradeAllSh
0ef0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0f00: 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e 65  cks(a).  #define
0f10: 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
0f20: 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 2c 64  ableLock(a,b,c,d
0f30: 29 20 31 0a 20 20 23 64 65 66 69 6e 65 20 68 61  ) 1.  #define ha
0f40: 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 61  sReadConflicts(a
0f50: 2c 20 62 29 20 30 0a 23 65 6e 64 69 66 0a 0a 23  , b) 0.#endif..#
0f60: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0f70: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
0f80: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
0f90: 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69  EBUG./*.**** Thi
0fa0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
0fb0: 6c 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20  ly used as part 
0fc0: 6f 66 20 61 6e 20 61 73 73 65 72 74 28 29 20 73  of an assert() s
0fd0: 74 61 74 65 6d 65 6e 74 2e 20 2a 2a 2a 0a 2a 2a  tatement. ***.**
0fe0: 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
0ff0: 20 69 66 20 70 42 74 72 65 65 20 68 6f 6c 64 73   if pBtree holds
1000: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f   the required lo
1010: 63 6b 73 20 74 6f 20 72 65 61 64 20 6f 72 20 77  cks to read or w
1020: 72 69 74 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20  rite to the .** 
1030: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 20  table with root 
1040: 70 61 67 65 20 69 52 6f 6f 74 2e 20 20 20 52 65  page iRoot.   Re
1050: 74 75 72 6e 20 31 20 69 66 20 69 74 20 64 6f 65  turn 1 if it doe
1060: 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a  s and 0 if not..
1070: 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
1080: 65 2c 20 77 68 65 6e 20 77 72 69 74 69 6e 67 20  e, when writing 
1090: 74 6f 20 61 20 74 61 62 6c 65 20 77 69 74 68 20  to a table with 
10a0: 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 20  root-page iRoot 
10b0: 76 69 61 20 0a 2a 2a 20 42 74 72 65 65 20 63 6f  via .** Btree co
10c0: 6e 6e 65 63 74 69 6f 6e 20 70 42 74 72 65 65 3a  nnection pBtree:
10d0: 0a 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74  .**.**    assert
10e0: 28 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65  ( hasSharedCache
10f0: 54 61 62 6c 65 4c 6f 63 6b 28 70 42 74 72 65 65  TableLock(pBtree
1100: 2c 20 69 52 6f 6f 74 2c 20 30 2c 20 57 52 49 54  , iRoot, 0, WRIT
1110: 45 5f 4c 4f 43 4b 29 20 29 3b 0a 2a 2a 0a 2a 2a  E_LOCK) );.**.**
1120: 20 57 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f   When writing to
1130: 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 72   an index that r
1140: 65 73 69 64 65 73 20 69 6e 20 61 20 73 68 61 72  esides in a shar
1150: 61 62 6c 65 20 64 61 74 61 62 61 73 65 2c 20 74  able database, t
1160: 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68  he .** caller sh
1170: 6f 75 6c 64 20 68 61 76 65 20 66 69 72 73 74 20  ould have first 
1180: 6f 62 74 61 69 6e 65 64 20 61 20 6c 6f 63 6b 20  obtained a lock 
1190: 73 70 65 63 69 66 79 69 6e 67 20 74 68 65 20 72  specifying the r
11a0: 6f 6f 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74  oot page of.** t
11b0: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
11c0: 20 74 61 62 6c 65 2e 20 54 68 69 73 20 6d 61 6b   table. This mak
11d0: 65 73 20 74 68 69 6e 67 73 20 61 20 62 69 74 20  es things a bit 
11e0: 6d 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64  more complicated
11f0: 2c 0a 2a 2a 20 61 73 20 74 68 69 73 20 6d 6f 64  ,.** as this mod
1200: 75 6c 65 20 74 72 65 61 74 73 20 65 61 63 68 20  ule treats each 
1210: 74 61 62 6c 65 20 61 73 20 61 20 73 65 70 61 72  table as a separ
1220: 61 74 65 20 73 74 72 75 63 74 75 72 65 2e 20 54  ate structure. T
1230: 6f 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 74  o determine.** t
1240: 68 65 20 74 61 62 6c 65 20 63 6f 72 72 65 73 70  he table corresp
1250: 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 69 6e  onding to the in
1260: 64 65 78 20 62 65 69 6e 67 20 77 72 69 74 74 65  dex being writte
1270: 6e 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  n, this.** funct
1280: 69 6f 6e 20 68 61 73 20 74 6f 20 73 65 61 72 63  ion has to searc
1290: 68 20 74 68 72 6f 75 67 68 20 74 68 65 20 64 61  h through the da
12a0: 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a  tabase schema..*
12b0: 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20  *.** Instead of 
12c0: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61  a lock on the ta
12d0: 62 6c 65 2f 69 6e 64 65 78 20 72 6f 6f 74 65 64  ble/index rooted
12e0: 20 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20   at page iRoot, 
12f0: 74 68 65 20 63 61 6c 6c 65 72 20 6d 61 79 0a 2a  the caller may.*
1300: 2a 20 68 6f 6c 64 20 61 20 77 72 69 74 65 2d 6c  * hold a write-l
1310: 6f 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d  ock on the schem
1320: 61 20 74 61 62 6c 65 20 28 72 6f 6f 74 20 70 61  a table (root pa
1330: 67 65 20 31 29 2e 20 54 68 69 73 20 69 73 20 61  ge 1). This is a
1340: 6c 73 6f 0a 2a 2a 20 61 63 63 65 70 74 61 62 6c  lso.** acceptabl
1350: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1360: 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
1370: 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 42 74 72 65  ableLock(.  Btre
1380: 65 20 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20  e *pBtree,      
1390: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 68 61     /* Handle tha
13a0: 74 20 6d 75 73 74 20 68 6f 6c 64 20 6c 6f 63 6b  t must hold lock
13b0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74   */.  Pgno iRoot
13c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
13d0: 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 62 2d 74  Root page of b-t
13e0: 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49  ree */.  int isI
13f0: 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20  ndex,           
1400: 2f 2a 20 54 72 75 65 20 69 66 20 69 52 6f 6f 74  /* True if iRoot
1410: 20 69 73 20 74 68 65 20 72 6f 6f 74 20 6f 66 20   is the root of 
1420: 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20  an index b-tree 
1430: 2a 2f 0a 20 20 69 6e 74 20 65 4c 6f 63 6b 54 79  */.  int eLockTy
1440: 70 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  pe          /* R
1450: 65 71 75 69 72 65 64 20 6c 6f 63 6b 20 74 79 70  equired lock typ
1460: 65 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20  e (READ_LOCK or 
1470: 57 52 49 54 45 5f 4c 4f 43 4b 29 20 2a 2f 0a 29  WRITE_LOCK) */.)
1480: 7b 0a 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68  {.  Schema *pSch
1490: 65 6d 61 20 3d 20 28 53 63 68 65 6d 61 20 2a 29  ema = (Schema *)
14a0: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 53 63  pBtree->pBt->pSc
14b0: 68 65 6d 61 3b 0a 20 20 50 67 6e 6f 20 69 54 61  hema;.  Pgno iTa
14c0: 62 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20  b = 0;.  BtLock 
14d0: 2a 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66  *pLock;..  /* If
14e0: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69   this database i
14f0: 73 20 6e 6f 74 20 73 68 61 72 65 61 62 6c 65 2c  s not shareable,
1500: 20 6f 72 20 69 66 20 74 68 65 20 63 6c 69 65 6e   or if the clien
1510: 74 20 69 73 20 72 65 61 64 69 6e 67 0a 20 20 2a  t is reading.  *
1520: 2a 20 61 6e 64 20 68 61 73 20 74 68 65 20 72 65  * and has the re
1530: 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66  ad-uncommitted f
1540: 6c 61 67 20 73 65 74 2c 20 74 68 65 6e 20 6e 6f  lag set, then no
1550: 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 69 72 65   lock is require
1560: 64 2e 20 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20  d. .  ** Return 
1570: 74 72 75 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  true immediately
1580: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 42  ..  */.  if( (pB
1590: 74 72 65 65 2d 3e 73 68 61 72 61 62 6c 65 3d 3d  tree->sharable==
15a0: 30 29 0a 20 20 20 7c 7c 20 28 65 4c 6f 63 6b 54  0).   || (eLockT
15b0: 79 70 65 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 26  ype==READ_LOCK &
15c0: 26 20 28 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66  & (pBtree->db->f
15d0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
15e0: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 29 0a  adUncommitted)).
15f0: 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
1600: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  1;.  }..  /* If 
1610: 74 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65  the client is re
1620: 61 64 69 6e 67 20 20 6f 72 20 77 72 69 74 69 6e  ading  or writin
1630: 67 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 74  g an index and t
1640: 68 65 20 73 63 68 65 6d 61 20 69 73 0a 20 20 2a  he schema is.  *
1650: 2a 20 6e 6f 74 20 6c 6f 61 64 65 64 2c 20 74 68  * not loaded, th
1660: 65 6e 20 69 74 20 69 73 20 74 6f 6f 20 64 69 66  en it is too dif
1670: 66 69 63 75 6c 74 20 74 6f 20 61 63 74 75 61 6c  ficult to actual
1680: 6c 79 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  ly check to see 
1690: 69 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 72 72  if.  ** the corr
16a0: 65 63 74 20 6c 6f 63 6b 73 20 61 72 65 20 68 65  ect locks are he
16b0: 6c 64 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 62  ld.  So do not b
16c0: 6f 74 68 65 72 20 2d 20 6a 75 73 74 20 72 65 74  other - just ret
16d0: 75 72 6e 20 74 72 75 65 2e 0a 20 20 2a 2a 20 54  urn true..  ** T
16e0: 68 69 73 20 63 61 73 65 20 64 6f 65 73 20 6e 6f  his case does no
16f0: 74 20 63 6f 6d 65 20 75 70 20 76 65 72 79 20 6f  t come up very o
1700: 66 74 65 6e 20 61 6e 79 68 6f 77 2e 0a 20 20 2a  ften anyhow..  *
1710: 2f 0a 20 20 69 66 28 20 69 73 49 6e 64 65 78 20  /.  if( isIndex 
1720: 26 26 20 28 21 70 53 63 68 65 6d 61 20 7c 7c 20  && (!pSchema || 
1730: 28 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61  (pSchema->schema
1740: 46 6c 61 67 73 26 44 42 5f 53 63 68 65 6d 61 4c  Flags&DB_SchemaL
1750: 6f 61 64 65 64 29 3d 3d 30 29 20 29 7b 0a 20 20  oaded)==0) ){.  
1760: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
1770: 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
1780: 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 74   the root-page t
1790: 68 61 74 20 74 68 65 20 6c 6f 63 6b 20 73 68 6f  hat the lock sho
17a0: 75 6c 64 20 62 65 20 68 65 6c 64 20 6f 6e 2e 20  uld be held on. 
17b0: 46 6f 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 62  For table.  ** b
17c0: 2d 74 72 65 65 73 2c 20 74 68 69 73 20 69 73 20  -trees, this is 
17d0: 6a 75 73 74 20 74 68 65 20 72 6f 6f 74 20 70 61  just the root pa
17e0: 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65  ge of the b-tree
17f0: 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 0a 20   being read or. 
1800: 20 2a 2a 20 77 72 69 74 74 65 6e 2e 20 46 6f 72   ** written. For
1810: 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73 2c 20   index b-trees, 
1820: 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70  it is the root p
1830: 61 67 65 20 6f 66 20 74 68 65 20 61 73 73 6f 63  age of the assoc
1840: 69 61 74 65 64 0a 20 20 2a 2a 20 74 61 62 6c 65  iated.  ** table
1850: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 49 6e  .  */.  if( isIn
1860: 64 65 78 20 29 7b 0a 20 20 20 20 48 61 73 68 45  dex ){.    HashE
1870: 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  lem *p;.    for(
1880: 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  p=sqliteHashFirs
1890: 74 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  t(&pSchema->idxH
18a0: 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69 74  ash); p; p=sqlit
18b0: 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a 20  eHashNext(p)){. 
18c0: 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78       Index *pIdx
18d0: 20 3d 20 28 49 6e 64 65 78 20 2a 29 73 71 6c 69   = (Index *)sqli
18e0: 74 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a 20  teHashData(p);. 
18f0: 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 74       if( pIdx->t
1900: 6e 75 6d 3d 3d 28 69 6e 74 29 69 52 6f 6f 74 20  num==(int)iRoot 
1910: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
1920: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Tab ){.         
1930: 20 2f 2a 20 54 77 6f 20 6f 72 20 6d 6f 72 65 20   /* Two or more 
1940: 69 6e 64 65 78 65 73 20 73 68 61 72 65 20 74 68  indexes share th
1950: 65 20 73 61 6d 65 20 72 6f 6f 74 20 70 61 67 65  e same root page
1960: 2e 20 20 54 68 65 72 65 20 6d 75 73 74 0a 20 20  .  There must.  
1970: 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20 69 6d          ** be im
1980: 70 6f 73 74 65 72 20 74 61 62 6c 65 73 2e 20 20  poster tables.  
1990: 53 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74  So just return t
19a0: 72 75 65 2e 20 20 54 68 65 20 61 73 73 65 72 74  rue.  The assert
19b0: 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20   is not.        
19c0: 20 20 2a 2a 20 75 73 65 66 75 6c 20 69 6e 20 74    ** useful in t
19d0: 68 61 74 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20  hat case. */.   
19e0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
19f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1a00: 20 20 20 69 54 61 62 20 3d 20 70 49 64 78 2d 3e     iTab = pIdx->
1a10: 70 54 61 62 6c 65 2d 3e 74 6e 75 6d 3b 0a 20 20  pTable->tnum;.  
1a20: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
1a30: 6c 73 65 7b 0a 20 20 20 20 69 54 61 62 20 3d 20  lse{.    iTab = 
1a40: 69 52 6f 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  iRoot;.  }..  /*
1a50: 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20   Search for the 
1a60: 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20 45  required lock. E
1a70: 69 74 68 65 72 20 61 20 77 72 69 74 65 2d 6c 6f  ither a write-lo
1a80: 63 6b 20 6f 6e 20 72 6f 6f 74 2d 70 61 67 65 20  ck on root-page 
1a90: 69 54 61 62 2c 20 61 20 0a 20 20 2a 2a 20 77 72  iTab, a .  ** wr
1aa0: 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite-lock on the 
1ab0: 73 63 68 65 6d 61 20 74 61 62 6c 65 2c 20 6f 72  schema table, or
1ac0: 20 28 69 66 20 74 68 65 20 63 6c 69 65 6e 74 20   (if the client 
1ad0: 69 73 20 72 65 61 64 69 6e 67 29 20 61 0a 20 20  is reading) a.  
1ae0: 2a 2a 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20  ** read-lock on 
1af0: 69 54 61 62 20 77 69 6c 6c 20 73 75 66 66 69 63  iTab will suffic
1b00: 65 2e 20 52 65 74 75 72 6e 20 31 20 69 66 20 61  e. Return 1 if a
1b10: 6e 79 20 6f 66 20 74 68 65 73 65 20 61 72 65 20  ny of these are 
1b20: 66 6f 75 6e 64 2e 20 20 2a 2f 0a 20 20 66 6f 72  found.  */.  for
1b30: 28 70 4c 6f 63 6b 3d 70 42 74 72 65 65 2d 3e 70  (pLock=pBtree->p
1b40: 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  Bt->pLock; pLock
1b50: 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70  ; pLock=pLock->p
1b60: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
1b70: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 42  Lock->pBtree==pB
1b80: 74 72 65 65 20 0a 20 20 20 20 20 26 26 20 28 70  tree .     && (p
1b90: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Lock->iTable==iT
1ba0: 61 62 20 7c 7c 20 28 70 4c 6f 63 6b 2d 3e 65 4c  ab || (pLock->eL
1bb0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
1bc0: 26 26 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65  && pLock->iTable
1bd0: 3d 3d 31 29 29 0a 20 20 20 20 20 26 26 20 70 4c  ==1)).     && pL
1be0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f 63  ock->eLock>=eLoc
1bf0: 6b 54 79 70 65 20 0a 20 20 20 20 29 7b 0a 20 20  kType .    ){.  
1c00: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1c10: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 61    }.  }..  /* Fa
1c20: 69 6c 65 64 20 74 6f 20 66 69 6e 64 20 74 68 65  iled to find the
1c30: 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20   required lock. 
1c40: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  */.  return 0;.}
1c50: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1c60: 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64  E_DEBUG */..#ifd
1c70: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1c80: 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e  /*.**** This fun
1c90: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 75 73 65  ction may be use
1ca0: 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73  d as part of ass
1cb0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
1cc0: 20 6f 6e 6c 79 2e 20 2a 2a 2a 2a 0a 2a 2a 0a 2a   only. ****.**.*
1cd0: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
1ce0: 20 69 74 20 77 6f 75 6c 64 20 62 65 20 69 6c 6c   it would be ill
1cf0: 65 67 61 6c 20 66 6f 72 20 70 42 74 72 65 65 20  egal for pBtree 
1d00: 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 74 68  to write into th
1d10: 65 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20 69 6e  e.** table or in
1d20: 64 65 78 20 72 6f 6f 74 65 64 20 61 74 20 69 52  dex rooted at iR
1d30: 6f 6f 74 20 62 65 63 61 75 73 65 20 6f 74 68 65  oot because othe
1d40: 72 20 73 68 61 72 65 64 20 63 6f 6e 6e 65 63 74  r shared connect
1d50: 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 73 69 6d 75  ions are.** simu
1d60: 6c 74 61 6e 65 6f 75 73 6c 79 20 72 65 61 64 69  ltaneously readi
1d70: 6e 67 20 74 68 61 74 20 73 61 6d 65 20 74 61 62  ng that same tab
1d80: 6c 65 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a 0a  le or index..**.
1d90: 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c  ** It is illegal
1da0: 20 66 6f 72 20 70 42 74 72 65 65 20 74 6f 20 77   for pBtree to w
1db0: 72 69 74 65 20 69 66 20 73 6f 6d 65 20 6f 74 68  rite if some oth
1dc0: 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  er Btree object 
1dd0: 74 68 61 74 0a 2a 2a 20 73 68 61 72 65 73 20 74  that.** shares t
1de0: 68 65 20 73 61 6d 65 20 42 74 53 68 61 72 65 64  he same BtShared
1df0: 20 6f 62 6a 65 63 74 20 69 73 20 63 75 72 72 65   object is curre
1e00: 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72 20  ntly reading or 
1e10: 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 69  writing.** the i
1e20: 52 6f 6f 74 20 74 61 62 6c 65 2e 20 20 45 78 63  Root table.  Exc
1e30: 65 70 74 2c 20 69 66 20 74 68 65 20 6f 74 68 65  ept, if the othe
1e40: 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 68  r Btree object h
1e50: 61 73 20 74 68 65 0a 2a 2a 20 72 65 61 64 2d 75  as the.** read-u
1e60: 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20  ncommitted flag 
1e70: 73 65 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20  set, then it is 
1e80: 4f 4b 20 66 6f 72 20 74 68 65 20 6f 74 68 65 72  OK for the other
1e90: 20 6f 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 68 61   object to.** ha
1ea0: 76 65 20 61 20 72 65 61 64 20 63 75 72 73 6f 72  ve a read cursor
1eb0: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
1ec0: 70 6c 65 2c 20 62 65 66 6f 72 65 20 77 72 69 74  ple, before writ
1ed0: 69 6e 67 20 74 6f 20 61 6e 79 20 70 61 72 74 20  ing to any part 
1ee0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  of the table or 
1ef0: 69 6e 64 65 78 0a 2a 2a 20 72 6f 6f 74 65 64 20  index.** rooted 
1f00: 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 6f  at page iRoot, o
1f10: 6e 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c 3a 0a  ne should call:.
1f20: 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28  **.**    assert(
1f30: 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63   !hasReadConflic
1f40: 74 73 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74  ts(pBtree, iRoot
1f50: 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ) );.*/.static i
1f60: 6e 74 20 68 61 73 52 65 61 64 43 6f 6e 66 6c 69  nt hasReadConfli
1f70: 63 74 73 28 42 74 72 65 65 20 2a 70 42 74 72 65  cts(Btree *pBtre
1f80: 65 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 29 7b 0a  e, Pgno iRoot){.
1f90: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
1fa0: 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70   for(p=pBtree->p
1fb0: 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
1fc0: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
1fd0: 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74   if( p->pgnoRoot
1fe0: 3d 3d 69 52 6f 6f 74 20 0a 20 20 20 20 20 26 26  ==iRoot .     &&
1ff0: 20 70 2d 3e 70 42 74 72 65 65 21 3d 70 42 74 72   p->pBtree!=pBtr
2000: 65 65 0a 20 20 20 20 20 26 26 20 30 3d 3d 28 70  ee.     && 0==(p
2010: 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c  ->pBtree->db->fl
2020: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61  ags & SQLITE_Rea
2030: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 0a 20 20  dUncommitted).  
2040: 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72    ){.      retur
2050: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
2060: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
2070: 64 69 66 20 20 20 20 2f 2a 20 23 69 66 64 65 66  dif    /* #ifdef
2080: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
2090: 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 6f  ../*.** Query to
20a0: 20 73 65 65 20 69 66 20 42 74 72 65 65 20 68 61   see if Btree ha
20b0: 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61 69  ndle p may obtai
20c0: 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65  n a lock of type
20d0: 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41 44   eLock .** (READ
20e0: 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c  _LOCK or WRITE_L
20f0: 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62 6c  OCK) on the tabl
2100: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
2110: 20 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a 2a   iTab. Return.**
2120: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68   SQLITE_OK if th
2130: 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f 62  e lock may be ob
2140: 74 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c 69  tained (by calli
2150: 6e 67 0a 2a 2a 20 73 65 74 53 68 61 72 65 64 43  ng.** setSharedC
2160: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 29  acheTableLock())
2170: 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  , or SQLITE_LOCK
2180: 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74  ED if not..*/.st
2190: 61 74 69 63 20 69 6e 74 20 71 75 65 72 79 53 68  atic int querySh
21a0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
21b0: 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e  ck(Btree *p, Pgn
21c0: 6f 20 69 54 61 62 2c 20 75 38 20 65 4c 6f 63 6b  o iTab, u8 eLock
21d0: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
21e0: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
21f0: 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20  tLock *pIter;.. 
2200: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2210: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
2220: 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
2230: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2240: 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45   || eLock==WRITE
2250: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
2260: 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 20  t( p->db!=0 );. 
2270: 20 61 73 73 65 72 74 28 20 21 28 70 2d 3e 64 62   assert( !(p->db
2280: 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52  ->flags&SQLITE_R
2290: 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 7c  eadUncommitted)|
22a0: 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f  |eLock==WRITE_LO
22b0: 43 4b 7c 7c 69 54 61 62 3d 3d 31 20 29 3b 0a 20  CK||iTab==1 );. 
22c0: 20 0a 20 20 2f 2a 20 49 66 20 72 65 71 75 65 73   .  /* If reques
22d0: 74 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63  ting a write-loc
22e0: 6b 2c 20 74 68 65 6e 20 74 68 65 20 42 74 72 65  k, then the Btre
22f0: 65 20 6d 75 73 74 20 68 61 76 65 20 61 6e 20 6f  e must have an o
2300: 70 65 6e 20 77 72 69 74 65 0a 20 20 2a 2a 20 74  pen write.  ** t
2310: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
2320: 69 73 20 66 69 6c 65 2e 20 41 6e 64 2c 20 6f 62  is file. And, ob
2330: 76 69 6f 75 73 6c 79 2c 20 66 6f 72 20 74 68 69  viously, for thi
2340: 73 20 74 6f 20 62 65 20 73 6f 20 74 68 65 72 65  s to be so there
2350: 20 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 61   .  ** must be a
2360: 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
2370: 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  nsaction on the 
2380: 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a  file itself..  *
2390: 2f 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63  /.  assert( eLoc
23a0: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
23b0: 28 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72  (p==pBt->pWriter
23c0: 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d   && p->inTrans==
23d0: 54 52 41 4e 53 5f 57 52 49 54 45 29 20 29 3b 0a  TRANS_WRITE) );.
23e0: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
23f0: 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 42  =READ_LOCK || pB
2400: 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
2410: 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
2420: 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f  .  .  /* This ro
2430: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
2440: 20 69 66 20 74 68 65 20 73 68 61 72 65 64 2d 63   if the shared-c
2450: 61 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61 62  ache is not enab
2460: 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 21 70 2d  led */.  if( !p-
2470: 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
2480: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2490: 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  K;.  }..  /* If 
24a0: 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65  some other conne
24b0: 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67  ction is holding
24c0: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
24d0: 63 6b 2c 20 74 68 65 0a 20 20 2a 2a 20 72 65 71  ck, the.  ** req
24e0: 75 65 73 74 65 64 20 6c 6f 63 6b 20 6d 61 79 20  uested lock may 
24f0: 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e  not be obtained.
2500: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
2510: 3e 70 57 72 69 74 65 72 21 3d 70 20 26 26 20 28  >pWriter!=p && (
2520: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
2530: 42 54 53 5f 45 58 43 4c 55 53 49 56 45 29 21 3d  BTS_EXCLUSIVE)!=
2540: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
2550: 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
2560: 64 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e 70 57  d(p->db, pBt->pW
2570: 72 69 74 65 72 2d 3e 64 62 29 3b 0a 20 20 20 20  riter->db);.    
2580: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
2590: 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
25a0: 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 70 49 74  ;.  }..  for(pIt
25b0: 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70  er=pBt->pLock; p
25c0: 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65  Iter; pIter=pIte
25d0: 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f  r->pNext){.    /
25e0: 2a 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  * The condition 
25f0: 28 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65  (pIter->eLock!=e
2600: 4c 6f 63 6b 29 20 69 6e 20 74 68 65 20 66 6f 6c  Lock) in the fol
2610: 6c 6f 77 69 6e 67 20 69 66 28 2e 2e 2e 29 20 0a  lowing if(...) .
2620: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
2630: 20 69 73 20 61 20 73 69 6d 70 6c 69 66 69 63 61   is a simplifica
2640: 74 69 6f 6e 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a  tion of:.    **.
2650: 20 20 20 20 2a 2a 20 20 20 28 65 4c 6f 63 6b 3d      **   (eLock=
2660: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 20 70  =WRITE_LOCK || p
2670: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Iter->eLock==WRI
2680: 54 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 2a 2a 0a  TE_LOCK).    **.
2690: 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20      ** since we 
26a0: 6b 6e 6f 77 20 74 68 61 74 20 69 66 20 65 4c 6f  know that if eLo
26b0: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 2c 20  ck==WRITE_LOCK, 
26c0: 74 68 65 6e 20 6e 6f 20 6f 74 68 65 72 20 63 6f  then no other co
26d0: 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  nnection.    ** 
26e0: 6d 61 79 20 68 6f 6c 64 20 61 20 57 52 49 54 45  may hold a WRITE
26f0: 5f 4c 4f 43 4b 20 6f 6e 20 61 6e 79 20 74 61 62  _LOCK on any tab
2700: 6c 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20  le in this file 
2710: 28 73 69 6e 63 65 20 74 68 65 72 65 20 63 61 6e  (since there can
2720: 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 62 65 20  .    ** only be 
2730: 61 20 73 69 6e 67 6c 65 20 77 72 69 74 65 72 29  a single writer)
2740: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
2750: 65 72 74 28 20 70 49 74 65 72 2d 3e 65 4c 6f 63  ert( pIter->eLoc
2760: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
2770: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52  pIter->eLock==WR
2780: 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  ITE_LOCK );.    
2790: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
27a0: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65  EAD_LOCK || pIte
27b0: 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 7c 7c 20  r->pBtree==p || 
27c0: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45  pIter->eLock==RE
27d0: 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  AD_LOCK);.    if
27e0: 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21  ( pIter->pBtree!
27f0: 3d 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54 61  =p && pIter->iTa
2800: 62 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 49 74  ble==iTab && pIt
2810: 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b  er->eLock!=eLock
2820: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2830: 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b  3ConnectionBlock
2840: 65 64 28 70 2d 3e 64 62 2c 20 70 49 74 65 72 2d  ed(p->db, pIter-
2850: 3e 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a 20 20  >pBtree->db);.  
2860: 20 20 20 20 69 66 28 20 65 4c 6f 63 6b 3d 3d 57      if( eLock==W
2870: 52 49 54 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  RITE_LOCK ){.   
2880: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d       assert( p==
2890: 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a  pBt->pWriter );.
28a0: 20 20 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73          pBt->bts
28b0: 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 45 4e  Flags |= BTS_PEN
28c0: 44 49 4e 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20  DING;.      }.  
28d0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
28e0: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
28f0: 41 43 48 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ACHE;.    }.  }.
2900: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2910: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
2920: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  !SQLITE_OMIT_SHA
2930: 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69  RED_CACHE */..#i
2940: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2950: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
2960: 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20  *.** Add a lock 
2970: 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  on the table wit
2980: 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62  h root-page iTab
2990: 6c 65 20 74 6f 20 74 68 65 20 73 68 61 72 65 64  le to the shared
29a0: 2d 62 74 72 65 65 20 75 73 65 64 0a 2a 2a 20 62  -btree used.** b
29b0: 79 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70  y Btree handle p
29c0: 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4c 6f 63  . Parameter eLoc
29d0: 6b 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  k must be either
29e0: 20 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a   READ_LOCK or .*
29f0: 2a 20 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a  * WRITE_LOCK..**
2a00: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2a10: 6e 20 61 73 73 75 6d 65 73 20 74 68 65 20 66 6f  n assumes the fo
2a20: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
2a30: 20 28 61 29 20 54 68 65 20 73 70 65 63 69 66 69   (a) The specifi
2a40: 65 64 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  ed Btree object 
2a50: 70 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74  p is connected t
2a60: 6f 20 61 20 73 68 61 72 61 62 6c 65 0a 2a 2a 20  o a sharable.** 
2a70: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28        database (
2a80: 6f 6e 65 20 77 69 74 68 20 74 68 65 20 42 74 53  one with the BtS
2a90: 68 61 72 65 64 2e 73 68 61 72 61 62 6c 65 20 66  hared.sharable f
2aa0: 6c 61 67 20 73 65 74 29 2c 20 61 6e 64 0a 2a 2a  lag set), and.**
2ab0: 0a 2a 2a 20 20 20 28 62 29 20 4e 6f 20 6f 74 68  .**   (b) No oth
2ac0: 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 73  er Btree objects
2ad0: 20 68 6f 6c 64 20 61 20 6c 6f 63 6b 20 74 68 61   hold a lock tha
2ae0: 74 20 63 6f 6e 66 6c 69 63 74 73 0a 2a 2a 20 20  t conflicts.**  
2af0: 20 20 20 20 20 77 69 74 68 20 74 68 65 20 72 65       with the re
2b00: 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 28 69 2e  quested lock (i.
2b10: 65 2e 20 71 75 65 72 79 53 68 61 72 65 64 43 61  e. querySharedCa
2b20: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20 68  cheTableLock() h
2b30: 61 73 0a 2a 2a 20 20 20 20 20 20 20 61 6c 72 65  as.**       alre
2b40: 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  ady been called 
2b50: 61 6e 64 20 72 65 74 75 72 6e 65 64 20 53 51 4c  and returned SQL
2b60: 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 53  ITE_OK)..**.** S
2b70: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2b80: 72 6e 65 64 20 69 66 20 74 68 65 20 6c 6f 63 6b  rned if the lock
2b90: 20 69 73 20 61 64 64 65 64 20 73 75 63 63 65 73   is added succes
2ba0: 73 66 75 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 4e  sfully. SQLITE_N
2bb0: 4f 4d 45 4d 20 0a 2a 2a 20 69 73 20 72 65 74 75  OMEM .** is retu
2bc0: 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63  rned if a malloc
2bd0: 20 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2e 0a   attempt fails..
2be0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
2bf0: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2c00: 65 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20  eLock(Btree *p, 
2c10: 50 67 6e 6f 20 69 54 61 62 6c 65 2c 20 75 38 20  Pgno iTable, u8 
2c20: 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61 72  eLock){.  BtShar
2c30: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
2c40: 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63  ;.  BtLock *pLoc
2c50: 6b 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20  k = 0;.  BtLock 
2c60: 2a 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72  *pIter;..  asser
2c70: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
2c80: 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
2c90: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
2ca0: 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  =READ_LOCK || eL
2cb0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
2cc0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
2cd0: 64 62 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41  db!=0 );..  /* A
2ce0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
2cf0: 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d   the read-uncomm
2d00: 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 20 77  itted flag set w
2d10: 69 6c 6c 20 6e 65 76 65 72 20 74 72 79 20 74 6f  ill never try to
2d20: 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 20 61 20 72  .  ** obtain a r
2d30: 65 61 64 2d 6c 6f 63 6b 20 75 73 69 6e 67 20 74  ead-lock using t
2d40: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68  his function. Th
2d50: 65 20 6f 6e 6c 79 20 72 65 61 64 2d 6c 6f 63 6b  e only read-lock
2d60: 20 6f 62 74 61 69 6e 65 64 0a 20 20 2a 2a 20 62   obtained.  ** b
2d70: 79 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  y a connection i
2d80: 6e 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  n read-uncommitt
2d90: 65 64 20 6d 6f 64 65 20 69 73 20 6f 6e 20 74 68  ed mode is on th
2da0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
2db0: 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 61 6e 64  .  ** table, and
2dc0: 20 74 68 61 74 20 6c 6f 63 6b 20 69 73 20 6f 62   that lock is ob
2dd0: 74 61 69 6e 65 64 20 69 6e 20 42 74 72 65 65 42  tained in BtreeB
2de0: 65 67 69 6e 54 72 61 6e 73 28 29 2e 20 20 2a 2f  eginTrans().  */
2df0: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 28 70  .  assert( 0==(p
2e00: 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  ->db->flags&SQLI
2e10: 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  TE_ReadUncommitt
2e20: 65 64 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52  ed) || eLock==WR
2e30: 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f  ITE_LOCK );..  /
2e40: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2e50: 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63  should only be c
2e60: 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72 61  alled on a shara
2e70: 62 6c 65 20 62 2d 74 72 65 65 20 61 66 74 65 72  ble b-tree after
2e80: 20 69 74 20 0a 20 20 2a 2a 20 68 61 73 20 62 65   it .  ** has be
2e90: 65 6e 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68  en determined th
2ea0: 61 74 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74 72  at no other b-tr
2eb0: 65 65 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66 6c  ee holds a confl
2ec0: 69 63 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a 2f  icting lock.  */
2ed0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 68  .  assert( p->sh
2ee0: 61 72 61 62 6c 65 20 29 3b 0a 20 20 61 73 73 65  arable );.  asse
2ef0: 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71  rt( SQLITE_OK==q
2f00: 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
2f10: 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62  ableLock(p, iTab
2f20: 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20  le, eLock) );.. 
2f30: 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63 68   /* First search
2f40: 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61 6e   the list for an
2f50: 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20 6f   existing lock o
2f60: 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f  n this table. */
2f70: 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74  .  for(pIter=pBt
2f80: 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20  ->pLock; pIter; 
2f90: 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65  pIter=pIter->pNe
2fa0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74  xt){.    if( pIt
2fb0: 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62  er->iTable==iTab
2fc0: 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42 74  le && pIter->pBt
2fd0: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
2fe0: 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a 20  pLock = pIter;. 
2ff0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3000: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
3010: 68 65 20 61 62 6f 76 65 20 73 65 61 72 63 68 20  he above search 
3020: 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 42  did not find a B
3030: 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73 73  tLock struct ass
3040: 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65 20 70  ociating Btree p
3050: 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c 65  .  ** with table
3060: 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61 74   iTable, allocat
3070: 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20 69  e one and link i
3080: 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e  t into the list.
3090: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c 6f  .  */.  if( !pLo
30a0: 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20  ck ){.    pLock 
30b0: 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c 69  = (BtLock *)sqli
30c0: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  te3MallocZero(si
30d0: 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20  zeof(BtLock));. 
30e0: 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b     if( !pLock ){
30f0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
3100: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
3110: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63 6b  .    }.    pLock
3120: 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 6c  ->iTable = iTabl
3130: 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 42  e;.    pLock->pB
3140: 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 70 4c  tree = p;.    pL
3150: 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  ock->pNext = pBt
3160: 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74  ->pLock;.    pBt
3170: 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b  ->pLock = pLock;
3180: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
3190: 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b 20  he BtLock.eLock 
31a0: 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65 20  variable to the 
31b0: 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20 63  maximum of the c
31c0: 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a 2a  urrent lock.  **
31d0: 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74   and the request
31e0: 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73 20 6d 65  ed lock. This me
31f0: 61 6e 73 20 69 66 20 61 20 77 72 69 74 65 2d 6c  ans if a write-l
3200: 6f 63 6b 20 77 61 73 20 61 6c 72 65 61 64 79 20  ock was already 
3210: 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64 20 61 20  held.  ** and a 
3220: 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71 75 65 73  read-lock reques
3230: 74 65 64 2c 20 77 65 20 64 6f 6e 27 74 20 69 6e  ted, we don't in
3240: 63 6f 72 72 65 63 74 6c 79 20 64 6f 77 6e 67 72  correctly downgr
3250: 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20  ade the lock..  
3260: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 57 52 49  */.  assert( WRI
3270: 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f 43  TE_LOCK>READ_LOC
3280: 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63 6b  K );.  if( eLock
3290: 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 7b  >pLock->eLock ){
32a0: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  .    pLock->eLoc
32b0: 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a  k = eLock;.  }..
32c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
32d0: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
32e0: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  !SQLITE_OMIT_SHA
32f0: 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69  RED_CACHE */..#i
3300: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
3310: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
3320: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c  *.** Release all
3330: 20 74 68 65 20 74 61 62 6c 65 20 6c 6f 63 6b 73   the table locks
3340: 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64   (locks obtained
3350: 20 76 69 61 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a   via calls to.**
3360: 20 74 68 65 20 73 65 74 53 68 61 72 65 64 43 61   the setSharedCa
3370: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20 70  cheTableLock() p
3380: 72 6f 63 65 64 75 72 65 29 20 68 65 6c 64 20 62  rocedure) held b
3390: 79 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 70  y Btree object p
33a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
33b0: 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
33c0: 61 74 20 42 74 72 65 65 20 70 20 68 61 73 20 61  at Btree p has a
33d0: 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f 72 20 77  n open read or w
33e0: 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63  rite .** transac
33f0: 74 69 6f 6e 2e 20 49 66 20 69 74 20 64 6f 65 73  tion. If it does
3400: 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 42   not, then the B
3410: 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c 61 67 0a  TS_PENDING flag.
3420: 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63 6f 72 72  ** may be incorr
3430: 65 63 74 6c 79 20 63 6c 65 61 72 65 64 2e 0a 2a  ectly cleared..*
3440: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c  /.static void cl
3450: 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
3460: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72 65  eTableLocks(Btre
3470: 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
3480: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
3490: 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70 70 49 74  .  BtLock **ppIt
34a0: 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c 6f 63 6b  er = &pBt->pLock
34b0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
34c0: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
34d0: 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
34e0: 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  rt( p->sharable 
34f0: 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72 20 29 3b  || 0==*ppIter );
3500: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e  .  assert( p->in
3510: 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20 20 77 68  Trans>0 );..  wh
3520: 69 6c 65 28 20 2a 70 70 49 74 65 72 20 29 7b 0a  ile( *ppIter ){.
3530: 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63      BtLock *pLoc
3540: 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a 20 20 20  k = *ppIter;.   
3550: 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 62   assert( (pBt->b
3560: 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58  tsFlags & BTS_EX
3570: 43 4c 55 53 49 56 45 29 3d 3d 30 20 7c 7c 20 70  CLUSIVE)==0 || p
3580: 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 4c 6f  Bt->pWriter==pLo
3590: 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b 0a 20 20  ck->pBtree );.  
35a0: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
35b0: 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72 61 6e 73  >pBtree->inTrans
35c0: 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29  >=pLock->eLock )
35d0: 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d  ;.    if( pLock-
35e0: 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20  >pBtree==p ){.  
35f0: 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20 70 4c      *ppIter = pL
3600: 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ock->pNext;.    
3610: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
3620: 3e 69 54 61 62 6c 65 21 3d 31 20 7c 7c 20 70 4c  >iTable!=1 || pL
3630: 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b 20 29 3b  ock==&p->lock );
3640: 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 63 6b  .      if( pLock
3650: 2d 3e 69 54 61 62 6c 65 21 3d 31 20 29 7b 0a 20  ->iTable!=1 ){. 
3660: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
3670: 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20  ree(pLock);.    
3680: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
3690: 20 20 20 20 20 70 70 49 74 65 72 20 3d 20 26 70       ppIter = &p
36a0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Lock->pNext;.   
36b0: 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
36c0: 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  ( (pBt->btsFlags
36d0: 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29 3d   & BTS_PENDING)=
36e0: 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69 74  =0 || pBt->pWrit
36f0: 65 72 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  er );.  if( pBt-
3700: 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20  >pWriter==p ){. 
3710: 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20     pBt->pWriter 
3720: 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74  = 0;.    pBt->bt
3730: 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53 5f  sFlags &= ~(BTS_
3740: 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50 45  EXCLUSIVE|BTS_PE
3750: 4e 44 49 4e 47 29 3b 0a 20 20 7d 65 6c 73 65 20  NDING);.  }else 
3760: 69 66 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61  if( pBt->nTransa
3770: 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20 20 20 20  ction==2 ){.    
3780: 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
3790: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
37a0: 42 74 72 65 65 20 70 20 69 73 20 63 6f 6e 63 6c  Btree p is concl
37b0: 75 64 69 6e 67 20 69 74 73 20 0a 20 20 20 20 2a  uding its .    *
37c0: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49  * transaction. I
37d0: 66 20 74 68 65 72 65 20 63 75 72 72 65 6e 74 6c  f there currentl
37e0: 79 20 65 78 69 73 74 73 20 61 20 77 72 69 74 65  y exists a write
37f0: 72 2c 20 61 6e 64 20 70 20 69 73 20 6e 6f 74 0a  r, and p is not.
3800: 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72 69 74      ** that writ
3810: 65 72 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d  er, then the num
3820: 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c  ber of locks hel
3830: 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  d by connections
3840: 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 74 68   other.    ** th
3850: 61 6e 20 74 68 65 20 77 72 69 74 65 72 20 6d 75  an the writer mu
3860: 73 74 20 62 65 20 61 62 6f 75 74 20 74 6f 20 64  st be about to d
3870: 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20 49 6e 20  rop to zero. In 
3880: 74 68 69 73 20 63 61 73 65 0a 20 20 20 20 2a 2a  this case.    **
3890: 20 73 65 74 20 74 68 65 20 42 54 53 5f 50 45 4e   set the BTS_PEN
38a0: 44 49 4e 47 20 66 6c 61 67 20 74 6f 20 30 2e 0a  DING flag to 0..
38b0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
38c0: 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 63 75   there is not cu
38d0: 72 72 65 6e 74 6c 79 20 61 20 77 72 69 74 65 72  rrently a writer
38e0: 2c 20 74 68 65 6e 20 42 54 53 5f 50 45 4e 44 49  , then BTS_PENDI
38f0: 4e 47 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62  NG must.    ** b
3900: 65 20 7a 65 72 6f 20 61 6c 72 65 61 64 79 2e 20  e zero already. 
3910: 53 6f 20 74 68 69 73 20 6e 65 78 74 20 6c 69 6e  So this next lin
3920: 65 20 69 73 20 68 61 72 6d 6c 65 73 73 20 69 6e  e is harmless in
3930: 20 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20 20   that case..    
3940: 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46  */.    pBt->btsF
3950: 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 50 45 4e  lags &= ~BTS_PEN
3960: 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  DING;.  }.}../*.
3970: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
3980: 20 63 68 61 6e 67 65 73 20 61 6c 6c 20 77 72 69   changes all wri
3990: 74 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  te-locks held by
39a0: 20 42 74 72 65 65 20 70 20 69 6e 74 6f 20 72 65   Btree p into re
39b0: 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74 61  ad-locks..*/.sta
39c0: 74 69 63 20 76 6f 69 64 20 64 6f 77 6e 67 72 61  tic void downgra
39d0: 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  deAllSharedCache
39e0: 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72 65 65  TableLocks(Btree
39f0: 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
3a00: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
3a10: 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74    if( pBt->pWrit
3a20: 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 42 74 4c  er==p ){.    BtL
3a30: 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20 20 20 20  ock *pLock;.    
3a40: 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30  pBt->pWriter = 0
3a50: 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c  ;.    pBt->btsFl
3a60: 61 67 73 20 26 3d 20 7e 28 42 54 53 5f 45 58 43  ags &= ~(BTS_EXC
3a70: 4c 55 53 49 56 45 7c 42 54 53 5f 50 45 4e 44 49  LUSIVE|BTS_PENDI
3a80: 4e 47 29 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f  NG);.    for(pLo
3a90: 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70  ck=pBt->pLock; p
3aa0: 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63  Lock; pLock=pLoc
3ab0: 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  k->pNext){.     
3ac0: 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e   assert( pLock->
3ad0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
3ae0: 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65   || pLock->pBtre
3af0: 65 3d 3d 70 20 29 3b 0a 20 20 20 20 20 20 70 4c  e==p );.      pL
3b00: 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 52 45 41  ock->eLock = REA
3b10: 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20  D_LOCK;.    }.  
3b20: 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53  }.}..#endif /* S
3b30: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
3b40: 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73 74 61 74  D_CACHE */..stat
3b50: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50  ic void releaseP
3b60: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
3b70: 67 65 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72 64  ge);  /* Forward
3b80: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 0a 2f   reference */../
3b90: 2a 0a 2a 2a 2a 2a 2a 20 54 68 69 73 20 72 6f 75  *.***** This rou
3ba0: 74 69 6e 65 20 69 73 20 75 73 65 64 20 69 6e 73  tine is used ins
3bb0: 69 64 65 20 6f 66 20 61 73 73 65 72 74 28 29 20  ide of assert() 
3bc0: 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  only ****.**.** 
3bd0: 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
3be0: 63 75 72 73 6f 72 20 68 6f 6c 64 73 20 74 68 65  cursor holds the
3bf0: 20 6d 75 74 65 78 20 6f 6e 20 69 74 73 20 42 74   mutex on its Bt
3c00: 53 68 61 72 65 64 0a 2a 2f 0a 23 69 66 64 65 66  Shared.*/.#ifdef
3c10: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74   SQLITE_DEBUG.st
3c20: 61 74 69 63 20 69 6e 74 20 63 75 72 73 6f 72 48  atic int cursorH
3c30: 6f 6c 64 73 4d 75 74 65 78 28 42 74 43 75 72 73  oldsMutex(BtCurs
3c40: 6f 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  or *p){.  return
3c50: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
3c60: 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65  eld(p->pBt->mute
3c70: 78 29 3b 0a 7d 0a 0a 2f 2a 20 56 65 72 69 66 79  x);.}../* Verify
3c80: 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
3c90: 20 61 6e 64 20 74 68 65 20 42 74 53 68 61 72 65   and the BtShare
3ca0: 64 20 61 67 72 65 65 20 61 62 6f 75 74 20 77 68  d agree about wh
3cb0: 61 74 20 69 73 20 74 68 65 20 63 75 72 72 65 6e  at is the curren
3cc0: 74 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f  t.** database co
3cd0: 6e 6e 65 74 69 6f 6e 2e 20 54 68 69 73 20 69 73  nnetion. This is
3ce0: 20 69 6d 70 6f 72 74 61 6e 74 20 69 6e 20 73 68   important in sh
3cf0: 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2e  ared-cache mode.
3d00: 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
3d10: 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   .** connection 
3d20: 70 6f 69 6e 74 65 72 73 20 67 65 74 20 6f 75 74  pointers get out
3d30: 2d 6f 66 2d 73 79 6e 63 2c 20 69 74 20 69 73 20  -of-sync, it is 
3d40: 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 72 6f 75  possible for rou
3d50: 74 69 6e 65 73 20 6c 69 6b 65 0a 2a 2a 20 62 74  tines like.** bt
3d60: 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 74 6f  reeInitPage() to
3d70: 20 72 65 66 65 72 65 6e 63 65 20 61 6e 20 73 74   reference an st
3d80: 61 6c 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  ale connection p
3d90: 6f 69 6e 74 65 72 20 74 68 61 74 20 72 65 66 65  ointer that refe
3da0: 72 65 6e 63 65 73 20 61 0a 2a 2a 20 61 20 63 6f  rences a.** a co
3db0: 6e 6e 65 63 74 69 6f 6e 20 74 68 61 74 20 68 61  nnection that ha
3dc0: 73 20 61 6c 72 65 61 64 79 20 63 6c 6f 73 65 64  s already closed
3dd0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
3de0: 69 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 61  is used inside a
3df0: 73 73 65 72 74 28 29 0a 2a 2a 20 73 74 61 74 65  ssert().** state
3e00: 6d 65 6e 74 73 20 6f 6e 6c 79 20 61 6e 64 20 66  ments only and f
3e10: 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 20 6f  or the purpose o
3e20: 66 20 64 6f 75 62 6c 65 2d 63 68 65 63 6b 69 6e  f double-checkin
3e30: 67 20 74 68 61 74 20 74 68 65 20 62 74 72 65 65  g that the btree
3e40: 20 63 6f 64 65 0a 2a 2a 20 64 6f 65 73 20 6b 65   code.** does ke
3e50: 65 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ep the database 
3e60: 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74  connection point
3e70: 65 72 73 20 75 70 2d 74 6f 2d 64 61 74 65 2e 0a  ers up-to-date..
3e80: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75  */.static int cu
3e90: 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
3ea0: 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20  (BtCursor *p){. 
3eb0: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
3ec0: 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
3ed0: 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 70 42 74    return (p->pBt
3ee0: 72 65 65 2d 3e 64 62 3d 3d 70 2d 3e 70 42 74 2d  ree->db==p->pBt-
3ef0: 3e 64 62 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  >db);.}.#endif..
3f00: 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65  /*.** Invalidate
3f10: 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61   the overflow ca
3f20: 63 68 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f  che of the curso
3f30: 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  r passed as the 
3f40: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a  first argument..
3f50: 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64  ** on the shared
3f60: 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
3f70: 20 70 42 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65   pBt..*/.#define
3f80: 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66   invalidateOverf
3f90: 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 20 28  lowCache(pCur) (
3fa0: 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
3fb0: 3d 20 7e 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  = ~BTCF_ValidOvf
3fc0: 6c 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69  l)../*.** Invali
3fd0: 64 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f  date the overflo
3fe0: 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
3ff0: 65 20 66 6f 72 20 61 6c 6c 20 63 75 72 73 6f 72  e for all cursor
4000: 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20 74  s opened.** on t
4010: 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65 20  he shared btree 
4020: 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a 2a  structure pBt..*
4030: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
4040: 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66  validateAllOverf
4050: 6c 6f 77 43 61 63 68 65 28 42 74 53 68 61 72 65  lowCache(BtShare
4060: 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75 72  d *pBt){.  BtCur
4070: 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74  sor *p;.  assert
4080: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
4090: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
40a0: 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d   );.  for(p=pBt-
40b0: 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
40c0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e  ->pNext){.    in
40d0: 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77  validateOverflow
40e0: 43 61 63 68 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a  Cache(p);.  }.}.
40f0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
4100: 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a  OMIT_INCRBLOB./*
4110: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
4120: 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f  n is called befo
4130: 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65  re modifying the
4140: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 74   contents of a t
4150: 61 62 6c 65 0a 2a 2a 20 74 6f 20 69 6e 76 61 6c  able.** to inval
4160: 69 64 61 74 65 20 61 6e 79 20 69 6e 63 72 62 6c  idate any incrbl
4170: 6f 62 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  ob cursors that 
4180: 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a  are open on the.
4190: 2a 2a 20 72 6f 77 20 6f 72 20 6f 6e 65 20 6f 66  ** row or one of
41a0: 20 74 68 65 20 72 6f 77 73 20 62 65 69 6e 67 20   the rows being 
41b0: 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  modified..**.** 
41c0: 49 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c  If argument isCl
41d0: 65 61 72 54 61 62 6c 65 20 69 73 20 74 72 75 65  earTable is true
41e0: 2c 20 74 68 65 6e 20 74 68 65 20 65 6e 74 69 72  , then the entir
41f0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
4200: 65 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 61 62  e.** table is ab
4210: 6f 75 74 20 74 6f 20 62 65 20 64 65 6c 65 74 65  out to be delete
4220: 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  d. In this case 
4230: 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 69  invalidate all i
4240: 6e 63 72 62 6c 6f 62 0a 2a 2a 20 63 75 72 73 6f  ncrblob.** curso
4250: 72 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 79 20 72  rs open on any r
4260: 6f 77 20 77 69 74 68 69 6e 20 74 68 65 20 74 61  ow within the ta
4270: 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  ble with root-pa
4280: 67 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 0a  ge pgnoRoot..**.
4290: 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
42a0: 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61   argument isClea
42b0: 72 54 61 62 6c 65 20 69 73 20 66 61 6c 73 65 2c  rTable is false,
42c0: 20 74 68 65 6e 20 74 68 65 20 72 6f 77 20 77 69   then the row wi
42d0: 74 68 0a 2a 2a 20 72 6f 77 69 64 20 69 52 6f 77  th.** rowid iRow
42e0: 20 69 73 20 62 65 69 6e 67 20 72 65 70 6c 61 63   is being replac
42f0: 65 64 20 6f 72 20 64 65 6c 65 74 65 64 2e 20 49  ed or deleted. I
4300: 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e 76 61  n this case inva
4310: 6c 69 64 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20 74  lidate.** only t
4320: 68 6f 73 65 20 69 6e 63 72 62 6c 6f 62 20 63 75  hose incrblob cu
4330: 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68  rsors open on th
4340: 61 74 20 73 70 65 63 69 66 69 63 20 72 6f 77 2e  at specific row.
4350: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4360: 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62 6c  invalidateIncrbl
4370: 6f 62 43 75 72 73 6f 72 73 28 0a 20 20 42 74 72  obCursors(.  Btr
4380: 65 65 20 2a 70 42 74 72 65 65 2c 20 20 20 20 20  ee *pBtree,     
4390: 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
43a0: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 68 65  base file to che
43b0: 63 6b 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77  ck */.  i64 iRow
43c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
43d0: 2f 2a 20 54 68 65 20 72 6f 77 69 64 20 74 68 61  /* The rowid tha
43e0: 74 20 6d 69 67 68 74 20 62 65 20 63 68 61 6e 67  t might be chang
43f0: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43  ing */.  int isC
4400: 6c 65 61 72 54 61 62 6c 65 20 20 20 20 20 20 20  learTable       
4410: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6c 6c 20   /* True if all 
4420: 72 6f 77 73 20 61 72 65 20 62 65 69 6e 67 20 64  rows are being d
4430: 65 6c 65 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 42  eleted */.){.  B
4440: 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69 66  tCursor *p;.  if
4450: 28 20 70 42 74 72 65 65 2d 3e 68 61 73 49 6e 63  ( pBtree->hasInc
4460: 72 62 6c 6f 62 43 75 72 3d 3d 30 20 29 20 72 65  rblobCur==0 ) re
4470: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
4480: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
4490: 73 4d 75 74 65 78 28 70 42 74 72 65 65 29 20 29  sMutex(pBtree) )
44a0: 3b 0a 20 20 70 42 74 72 65 65 2d 3e 68 61 73 49  ;.  pBtree->hasI
44b0: 6e 63 72 62 6c 6f 62 43 75 72 20 3d 20 30 3b 0a  ncrblobCur = 0;.
44c0: 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e    for(p=pBtree->
44d0: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
44e0: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
44f0: 20 20 69 66 28 20 28 70 2d 3e 63 75 72 46 6c 61    if( (p->curFla
4500: 67 73 20 26 20 42 54 43 46 5f 49 6e 63 72 62 6c  gs & BTCF_Incrbl
4510: 6f 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ob)!=0 ){.      
4520: 70 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72 62  pBtree->hasIncrb
4530: 6c 6f 62 43 75 72 20 3d 20 31 3b 0a 20 20 20 20  lobCur = 1;.    
4540: 20 20 69 66 28 20 69 73 43 6c 65 61 72 54 61 62    if( isClearTab
4550: 6c 65 20 7c 7c 20 70 2d 3e 69 6e 66 6f 2e 6e 4b  le || p->info.nK
4560: 65 79 3d 3d 69 52 6f 77 20 29 7b 0a 20 20 20 20  ey==iRow ){.    
4570: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20      p->eState = 
4580: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
4590: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
45a0: 7d 0a 7d 0a 0a 23 65 6c 73 65 0a 20 20 2f 2a 20  }.}..#else.  /* 
45b0: 53 74 75 62 20 66 75 6e 63 74 69 6f 6e 20 77 68  Stub function wh
45c0: 65 6e 20 49 4e 43 52 42 4c 4f 42 20 69 73 20 6f  en INCRBLOB is o
45d0: 6d 69 74 74 65 64 20 2a 2f 0a 20 20 23 64 65 66  mitted */.  #def
45e0: 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 49 6e  ine invalidateIn
45f0: 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 78 2c  crblobCursors(x,
4600: 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53  y,z).#endif /* S
4610: 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
4620: 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65  LOB */../*.** Se
4630: 74 20 62 69 74 20 70 67 6e 6f 20 6f 66 20 74 68  t bit pgno of th
4640: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
4650: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20 54  ontent bitvec. T
4660: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 0a 2a  his is called .*
4670: 2a 20 77 68 65 6e 20 61 20 70 61 67 65 20 74 68  * when a page th
4680: 61 74 20 70 72 65 76 69 6f 75 73 6c 79 20 63 6f  at previously co
4690: 6e 74 61 69 6e 65 64 20 64 61 74 61 20 62 65 63  ntained data bec
46a0: 6f 6d 65 73 20 61 20 66 72 65 65 2d 6c 69 73 74  omes a free-list
46b0: 20 6c 65 61 66 20 0a 2a 2a 20 70 61 67 65 2e 0a   leaf .** page..
46c0: 2a 2a 0a 2a 2a 20 54 68 65 20 42 74 53 68 61 72  **.** The BtShar
46d0: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
46e0: 69 74 76 65 63 20 65 78 69 73 74 73 20 74 6f 20  itvec exists to 
46f0: 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 6e 20 6f  work around an o
4700: 62 73 63 75 72 65 0a 2a 2a 20 62 75 67 20 63 61  bscure.** bug ca
4710: 75 73 65 64 20 62 79 20 74 68 65 20 69 6e 74 65  used by the inte
4720: 72 61 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20 75  raction of two u
4730: 73 65 66 75 6c 20 49 4f 20 6f 70 74 69 6d 69 7a  seful IO optimiz
4740: 61 74 69 6f 6e 73 20 73 75 72 72 6f 75 6e 64 69  ations surroundi
4750: 6e 67 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20  ng.** free-list 
4760: 6c 65 61 66 20 70 61 67 65 73 3a 0a 2a 2a 0a 2a  leaf pages:.**.*
4770: 2a 20 20 20 31 29 20 57 68 65 6e 20 61 6c 6c 20  *   1) When all 
4780: 64 61 74 61 20 69 73 20 64 65 6c 65 74 65 64 20  data is deleted 
4790: 66 72 6f 6d 20 61 20 70 61 67 65 20 61 6e 64 20  from a page and 
47a0: 74 68 65 20 70 61 67 65 20 62 65 63 6f 6d 65 73  the page becomes
47b0: 0a 2a 2a 20 20 20 20 20 20 61 20 66 72 65 65 2d  .**      a free-
47c0: 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 2c 20  list leaf page, 
47d0: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
47e0: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
47f0: 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20  atabase.**      
4800: 28 61 73 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  (as free-list le
4810: 61 66 20 70 61 67 65 73 20 63 6f 6e 74 61 69 6e  af pages contain
4820: 20 6e 6f 20 6d 65 61 6e 69 6e 67 66 75 6c 20 64   no meaningful d
4830: 61 74 61 29 2e 20 53 6f 6d 65 74 69 6d 65 73 0a  ata). Sometimes.
4840: 2a 2a 20 20 20 20 20 20 73 75 63 68 20 61 20 70  **      such a p
4850: 61 67 65 20 69 73 20 6e 6f 74 20 65 76 65 6e 20  age is not even 
4860: 6a 6f 75 72 6e 61 6c 6c 65 64 20 28 61 73 20 69  journalled (as i
4870: 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6d 6f  t will not be mo
4880: 64 69 66 69 65 64 2c 0a 2a 2a 20 20 20 20 20 20  dified,.**      
4890: 77 68 79 20 62 6f 74 68 65 72 20 6a 6f 75 72 6e  why bother journ
48a0: 61 6c 6c 69 6e 67 20 69 74 3f 29 2e 0a 2a 2a 0a  alling it?)..**.
48b0: 2a 2a 20 20 20 32 29 20 57 68 65 6e 20 61 20 66  **   2) When a f
48c0: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
48d0: 67 65 20 69 73 20 72 65 75 73 65 64 2c 20 69 74  ge is reused, it
48e0: 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74  s content is not
48f0: 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66 72   read.**      fr
4900: 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
4910: 6f 72 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  or written to th
4920: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
4930: 77 68 79 20 73 68 6f 75 6c 64 20 69 74 0a 2a 2a  why should it.**
4940: 20 20 20 20 20 20 62 65 2c 20 69 66 20 69 74 20        be, if it 
4950: 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 6d 65  is not at all me
4960: 61 6e 69 6e 67 66 75 6c 3f 29 2e 0a 2a 2a 0a 2a  aningful?)..**.*
4970: 2a 20 42 79 20 74 68 65 6d 73 65 6c 76 65 73 2c  * By themselves,
4980: 20 74 68 65 73 65 20 6f 70 74 69 6d 69 7a 61 74   these optimizat
4990: 69 6f 6e 73 20 77 6f 72 6b 20 66 69 6e 65 20 61  ions work fine a
49a0: 6e 64 20 70 72 6f 76 69 64 65 20 61 20 68 61 6e  nd provide a han
49b0: 64 79 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63  dy.** performanc
49c0: 65 20 62 6f 6f 73 74 20 74 6f 20 62 75 6c 6b 20  e boost to bulk 
49d0: 64 65 6c 65 74 65 20 6f 72 20 69 6e 73 65 72 74  delete or insert
49e0: 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 48 6f 77   operations. How
49f0: 65 76 65 72 2c 20 69 66 0a 2a 2a 20 61 20 70 61  ever, if.** a pa
4a00: 67 65 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74  ge is moved to t
4a10: 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64  he free-list and
4a20: 20 74 68 65 6e 20 72 65 75 73 65 64 20 77 69 74   then reused wit
4a30: 68 69 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20  hin the same.** 
4a40: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20 70  transaction, a p
4a50: 72 6f 62 6c 65 6d 20 63 6f 6d 65 73 20 75 70 2e  roblem comes up.
4a60: 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
4a70: 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77  not journalled w
4a80: 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20 6d 6f 76  hen.** it is mov
4a90: 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c  ed to the free-l
4aa0: 69 73 74 20 61 6e 64 20 69 74 20 69 73 20 61 6c  ist and it is al
4ab0: 73 6f 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65  so not journalle
4ac0: 64 20 77 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20  d when it.** is 
4ad0: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74  extracted from t
4ae0: 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64  he free-list and
4af0: 20 72 65 75 73 65 64 2c 20 74 68 65 6e 20 74 68   reused, then th
4b00: 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 0a  e original data.
4b10: 2a 2a 20 6d 61 79 20 62 65 20 6c 6f 73 74 2e 20  ** may be lost. 
4b20: 49 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20  In the event of 
4b30: 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 6d  a rollback, it m
4b40: 61 79 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62  ay not be possib
4b50: 6c 65 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65  le.** to restore
4b60: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
4b70: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f   its original co
4b80: 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a 2a 2a 0a  nfiguration..**.
4b90: 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20  ** The solution 
4ba0: 69 73 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  is the BtShared.
4bb0: 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76  pHasContent bitv
4bc0: 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20 70  ec. Whenever a p
4bd0: 61 67 65 20 69 73 20 0a 2a 2a 20 6d 6f 76 65 64  age is .** moved
4be0: 20 74 6f 20 62 65 63 6f 6d 65 20 61 20 66 72 65   to become a fre
4bf0: 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
4c00: 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  , the correspond
4c10: 69 6e 67 20 62 69 74 20 69 73 0a 2a 2a 20 73 65  ing bit is.** se
4c20: 74 20 69 6e 20 74 68 65 20 62 69 74 76 65 63 2e  t in the bitvec.
4c30: 20 57 68 65 6e 65 76 65 72 20 61 20 6c 65 61 66   Whenever a leaf
4c40: 20 70 61 67 65 20 69 73 20 65 78 74 72 61 63 74   page is extract
4c50: 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ed from the free
4c60: 2d 6c 69 73 74 2c 0a 2a 2a 20 6f 70 74 69 6d 69  -list,.** optimi
4c70: 7a 61 74 69 6f 6e 20 32 20 61 62 6f 76 65 20 69  zation 2 above i
4c80: 73 20 6f 6d 69 74 74 65 64 20 69 66 20 74 68 65  s omitted if the
4c90: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62   corresponding b
4ca0: 69 74 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a  it is already.**
4cb0: 20 73 65 74 20 69 6e 20 42 74 53 68 61 72 65 64   set in BtShared
4cc0: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 2e 20 54 68  .pHasContent. Th
4cd0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
4ce0: 65 20 62 69 74 76 65 63 20 61 72 65 20 63 6c 65  e bitvec are cle
4cf0: 61 72 65 64 0a 2a 2a 20 61 74 20 74 68 65 20 65  ared.** at the e
4d00: 6e 64 20 6f 66 20 65 76 65 72 79 20 74 72 61 6e  nd of every tran
4d10: 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  saction..*/.stat
4d20: 69 63 20 69 6e 74 20 62 74 72 65 65 53 65 74 48  ic int btreeSetH
4d30: 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72  asContent(BtShar
4d40: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67  ed *pBt, Pgno pg
4d50: 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  no){.  int rc = 
4d60: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
4d70: 20 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65   !pBt->pHasConte
4d80: 6e 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  nt ){.    assert
4d90: 28 20 70 67 6e 6f 3c 3d 70 42 74 2d 3e 6e 50 61  ( pgno<=pBt->nPa
4da0: 67 65 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70  ge );.    pBt->p
4db0: 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 73 71 6c  HasContent = sql
4dc0: 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
4dd0: 28 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20  (pBt->nPage);.  
4de0: 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73    if( !pBt->pHas
4df0: 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20  Content ){.     
4e00: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
4e10: 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
4e20: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
4e30: 49 54 45 5f 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d  ITE_OK && pgno<=
4e40: 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a  sqlite3BitvecSiz
4e50: 65 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65  e(pBt->pHasConte
4e60: 6e 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  nt) ){.    rc = 
4e70: 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
4e80: 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  (pBt->pHasConten
4e90: 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  t, pgno);.  }.  
4ea0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
4eb0: 0a 2a 2a 20 51 75 65 72 79 20 74 68 65 20 42 74  .** Query the Bt
4ec0: 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65  Shared.pHasConte
4ed0: 6e 74 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a  nt vector..**.**
4ee0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
4ef0: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
4f00: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
4f10: 61 67 65 20 69 73 20 72 65 6d 6f 76 65 64 20 66  age is removed f
4f20: 72 6f 6d 20 74 68 65 0a 2a 2a 20 66 72 65 65 2d  rom the.** free-
4f30: 6c 69 73 74 20 66 6f 72 20 72 65 75 73 65 2e 20  list for reuse. 
4f40: 49 74 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65  It returns false
4f50: 20 69 66 20 69 74 20 69 73 20 73 61 66 65 20 74   if it is safe t
4f60: 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 0a 2a  o retrieve the.*
4f70: 2a 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  * page from the 
4f80: 70 61 67 65 72 20 6c 61 79 65 72 20 77 69 74 68  pager layer with
4f90: 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74   the 'no-content
4fa0: 27 20 66 6c 61 67 20 73 65 74 2e 20 54 72 75 65  ' flag set. True
4fb0: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
4fc0: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47  tatic int btreeG
4fd0: 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53  etHasContent(BtS
4fe0: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
4ff0: 20 70 67 6e 6f 29 7b 0a 20 20 42 69 74 76 65 63   pgno){.  Bitvec
5000: 20 2a 70 20 3d 20 70 42 74 2d 3e 70 48 61 73 43   *p = pBt->pHasC
5010: 6f 6e 74 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e  ontent;.  return
5020: 20 28 70 20 26 26 20 28 70 67 6e 6f 3e 73 71 6c   (p && (pgno>sql
5030: 69 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70  ite3BitvecSize(p
5040: 29 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76  ) || sqlite3Bitv
5050: 65 63 54 65 73 74 28 70 2c 20 70 67 6e 6f 29 29  ecTest(p, pgno))
5060: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  );.}../*.** Clea
5070: 72 20 28 64 65 73 74 72 6f 79 29 20 74 68 65 20  r (destroy) the 
5080: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
5090: 74 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69  tent bitvec. Thi
50a0: 73 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69  s should be.** i
50b0: 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f  nvoked at the co
50c0: 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 65 61 63 68  nclusion of each
50d0: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
50e0: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
50f0: 69 64 20 62 74 72 65 65 43 6c 65 61 72 48 61 73  id btreeClearHas
5100: 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64  Content(BtShared
5110: 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65   *pBt){.  sqlite
5120: 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
5130: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29  Bt->pHasContent)
5140: 3b 0a 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e  ;.  pBt->pHasCon
5150: 74 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  tent = 0;.}../*.
5160: 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 6f  ** Release all o
5170: 66 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20 70  f the apPage[] p
5180: 61 67 65 73 20 66 6f 72 20 61 20 63 75 72 73 6f  ages for a curso
5190: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
51a0: 64 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c  d btreeReleaseAl
51b0: 6c 43 75 72 73 6f 72 50 61 67 65 73 28 42 74 43  lCursorPages(BtC
51c0: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
51d0: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
51e0: 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65  ; i<=pCur->iPage
51f0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65  ; i++){.    rele
5200: 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70  asePage(pCur->ap
5210: 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 70 43  Page[i]);.    pC
5220: 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20  ur->apPage[i] = 
5230: 30 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69  0;.  }.  pCur->i
5240: 50 61 67 65 20 3d 20 2d 31 3b 0a 7d 0a 0a 2f 2a  Page = -1;.}../*
5250: 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70  .** The cursor p
5260: 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c  assed as the onl
5270: 79 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20  y argument must 
5280: 70 6f 69 6e 74 20 74 6f 20 61 20 76 61 6c 69 64  point to a valid
5290: 20 65 6e 74 72 79 0a 2a 2a 20 77 68 65 6e 20 74   entry.** when t
52a0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
52b0: 63 61 6c 6c 65 64 20 28 69 2e 65 2e 20 68 61 76  called (i.e. hav
52c0: 65 20 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  e eState==CURSOR
52d0: 5f 56 41 4c 49 44 29 2e 20 54 68 69 73 0a 2a 2a  _VALID). This.**
52e0: 20 66 75 6e 63 74 69 6f 6e 20 73 61 76 65 73 20   function saves 
52f0: 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73  the current curs
5300: 6f 72 20 6b 65 79 20 69 6e 20 76 61 72 69 61 62  or key in variab
5310: 6c 65 73 20 70 43 75 72 2d 3e 6e 4b 65 79 20 61  les pCur->nKey a
5320: 6e 64 0a 2a 2a 20 70 43 75 72 2d 3e 70 4b 65 79  nd.** pCur->pKey
5330: 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  . SQLITE_OK is r
5340: 65 74 75 72 6e 65 64 20 69 66 20 73 75 63 63 65  eturned if succe
5350: 73 73 66 75 6c 20 6f 72 20 61 6e 20 53 51 4c 69  ssful or an SQLi
5360: 74 65 20 65 72 72 6f 72 20 0a 2a 2a 20 63 6f 64  te error .** cod
5370: 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a  e otherwise..**.
5380: 2a 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  ** If the cursor
5390: 20 69 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69   is open on an i
53a0: 6e 74 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65  ntkey table, the
53b0: 6e 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65  n the integer ke
53c0: 79 0a 2a 2a 20 28 74 68 65 20 72 6f 77 69 64 29  y.** (the rowid)
53d0: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 43   is stored in pC
53e0: 75 72 2d 3e 6e 4b 65 79 20 61 6e 64 20 70 43 75  ur->nKey and pCu
53f0: 72 2d 3e 70 4b 65 79 20 69 73 20 6c 65 66 74 20  r->pKey is left 
5400: 73 65 74 20 74 6f 0a 2a 2a 20 4e 55 4c 4c 2e 20  set to.** NULL. 
5410: 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  If the cursor is
5420: 20 6f 70 65 6e 20 6f 6e 20 61 20 6e 6f 6e 2d 69   open on a non-i
5430: 6e 74 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65  ntkey table, the
5440: 6e 20 70 43 75 72 2d 3e 70 4b 65 79 20 69 73 20  n pCur->pKey is 
5450: 0a 2a 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e 74  .** set to point
5460: 20 74 6f 20 61 20 6d 61 6c 6c 6f 63 65 64 20 62   to a malloced b
5470: 75 66 66 65 72 20 70 43 75 72 2d 3e 6e 4b 65 79  uffer pCur->nKey
5480: 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 20 63   bytes in size c
5490: 6f 6e 74 61 69 6e 69 6e 67 20 0a 2a 2a 20 74 68  ontaining .** th
54a0: 65 20 6b 65 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  e key..*/.static
54b0: 20 69 6e 74 20 73 61 76 65 43 75 72 73 6f 72 4b   int saveCursorK
54c0: 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ey(BtCursor *pCu
54d0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
54e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
54f0: 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  rt( CURSOR_VALID
5500: 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
5510: 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70  ;.  assert( 0==p
5520: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61  Cur->pKey );.  a
5530: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
5540: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
5550: 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 63 75  ..  if( pCur->cu
5560: 72 49 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f  rIntKey ){.    /
5570: 2a 20 4f 6e 6c 79 20 74 68 65 20 72 6f 77 69 64  * Only the rowid
5580: 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72   is required for
5590: 20 61 20 74 61 62 6c 65 20 62 74 72 65 65 20 2a   a table btree *
55a0: 2f 0a 20 20 20 20 70 43 75 72 2d 3e 6e 4b 65 79  /.    pCur->nKey
55b0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49   = sqlite3BtreeI
55c0: 6e 74 65 67 65 72 4b 65 79 28 70 43 75 72 29 3b  ntegerKey(pCur);
55d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
55e0: 20 46 6f 72 20 61 6e 20 69 6e 64 65 78 20 62 74   For an index bt
55f0: 72 65 65 2c 20 73 61 76 65 20 74 68 65 20 63 6f  ree, save the co
5600: 6d 70 6c 65 74 65 20 6b 65 79 20 63 6f 6e 74 65  mplete key conte
5610: 6e 74 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a  nt */.    void *
5620: 70 4b 65 79 3b 0a 20 20 20 20 70 43 75 72 2d 3e  pKey;.    pCur->
5630: 6e 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 42 74  nKey = sqlite3Bt
5640: 72 65 65 50 61 79 6c 6f 61 64 53 69 7a 65 28 70  reePayloadSize(p
5650: 43 75 72 29 3b 0a 20 20 20 20 70 4b 65 79 20 3d  Cur);.    pKey =
5660: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20   sqlite3Malloc( 
5670: 70 43 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20  pCur->nKey );.  
5680: 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20    if( pKey ){.  
5690: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
56a0: 42 74 72 65 65 50 61 79 6c 6f 61 64 28 70 43 75  BtreePayload(pCu
56b0: 72 2c 20 30 2c 20 28 69 6e 74 29 70 43 75 72 2d  r, 0, (int)pCur-
56c0: 3e 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20  >nKey, pKey);.  
56d0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
56e0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
56f0: 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70 4b   pCur->pKey = pK
5700: 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ey;.      }else{
5710: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5720: 5f 66 72 65 65 28 70 4b 65 79 29 3b 0a 20 20 20  _free(pKey);.   
5730: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
5740: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
5750: 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
5760: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
5770: 28 20 21 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b  ( !pCur->curIntK
5780: 65 79 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65  ey || !pCur->pKe
5790: 79 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  y );.  return rc
57a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20  ;.}../*.** Save 
57b0: 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73  the current curs
57c0: 6f 72 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74  or position in t
57d0: 68 65 20 76 61 72 69 61 62 6c 65 73 20 42 74 43  he variables BtC
57e0: 75 72 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61  ursor.nKey .** a
57f0: 6e 64 20 42 74 43 75 72 73 6f 72 2e 70 4b 65 79  nd BtCursor.pKey
5800: 2e 20 54 68 65 20 63 75 72 73 6f 72 27 73 20 73  . The cursor's s
5810: 74 61 74 65 20 69 73 20 73 65 74 20 74 6f 20 43  tate is set to C
5820: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
5830: 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  K..**.** The cal
5840: 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20  ler must ensure 
5850: 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
5860: 69 73 20 76 61 6c 69 64 20 28 68 61 73 20 65 53  is valid (has eS
5870: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
5880: 49 44 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20  ID).** prior to 
5890: 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
58a0: 74 69 6e 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69  tine.  .*/.stati
58b0: 63 20 69 6e 74 20 73 61 76 65 43 75 72 73 6f 72  c int saveCursor
58c0: 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f  Position(BtCurso
58d0: 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  r *pCur){.  int 
58e0: 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 43  rc;..  assert( C
58f0: 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75  URSOR_VALID==pCu
5900: 72 2d 3e 65 53 74 61 74 65 20 7c 7c 20 43 55 52  r->eState || CUR
5910: 53 4f 52 5f 53 4b 49 50 4e 45 58 54 3d 3d 70 43  SOR_SKIPNEXT==pC
5920: 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20 20  ur->eState );.  
5930: 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75 72 2d  assert( 0==pCur-
5940: 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72  >pKey );.  asser
5950: 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
5960: 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20  tex(pCur) );..  
5970: 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
5980: 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58  ==CURSOR_SKIPNEX
5990: 54 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65  T ){.    pCur->e
59a0: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56  State = CURSOR_V
59b0: 41 4c 49 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ALID;.  }else{. 
59c0: 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78     pCur->skipNex
59d0: 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 63  t = 0;.  }..  rc
59e0: 20 3d 20 73 61 76 65 43 75 72 73 6f 72 4b 65 79   = saveCursorKey
59f0: 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
5a00: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
5a10: 20 20 20 62 74 72 65 65 52 65 6c 65 61 73 65 41     btreeReleaseA
5a20: 6c 6c 43 75 72 73 6f 72 50 61 67 65 73 28 70 43  llCursorPages(pC
5a30: 75 72 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65  ur);.    pCur->e
5a40: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 52  State = CURSOR_R
5a50: 45 51 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a  EQUIRESEEK;.  }.
5a60: 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
5a70: 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69  s &= ~(BTCF_Vali
5a80: 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64  dNKey|BTCF_Valid
5a90: 4f 76 66 6c 7c 42 54 43 46 5f 41 74 4c 61 73 74  Ovfl|BTCF_AtLast
5aa0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
5ab0: 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  }../* Forward re
5ac0: 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69  ference */.stati
5ad0: 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49  c int SQLITE_NOI
5ae0: 4e 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f 72  NLINE saveCursor
5af0: 73 4f 6e 4c 69 73 74 28 42 74 43 75 72 73 6f 72  sOnList(BtCursor
5b00: 2a 2c 50 67 6e 6f 2c 42 74 43 75 72 73 6f 72 2a  *,Pgno,BtCursor*
5b10: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74  );../*.** Save t
5b20: 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20  he positions of 
5b30: 61 6c 6c 20 63 75 72 73 6f 72 73 20 28 65 78 63  all cursors (exc
5b40: 65 70 74 20 70 45 78 63 65 70 74 29 20 74 68 61  ept pExcept) tha
5b50: 74 20 61 72 65 20 6f 70 65 6e 20 6f 6e 0a 2a 2a  t are open on.**
5b60: 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
5b70: 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e  root-page iRoot.
5b80: 20 20 22 53 61 76 69 6e 67 20 74 68 65 20 63 75    "Saving the cu
5b90: 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 22 20 6d  rsor position" m
5ba0: 65 61 6e 73 20 74 68 61 74 0a 2a 2a 20 74 68 65  eans that.** the
5bb0: 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65   location in the
5bc0: 20 62 74 72 65 65 20 69 73 20 72 65 6d 65 6d 62   btree is rememb
5bd0: 65 72 65 64 20 69 6e 20 73 75 63 68 20 61 20 77  ered in such a w
5be0: 61 79 20 74 68 61 74 20 69 74 20 63 61 6e 20 62  ay that it can b
5bf0: 65 0a 2a 2a 20 6d 6f 76 65 64 20 62 61 63 6b 20  e.** moved back 
5c00: 74 6f 20 74 68 65 20 73 61 6d 65 20 73 70 6f 74  to the same spot
5c10: 20 61 66 74 65 72 20 74 68 65 20 62 74 72 65 65   after the btree
5c20: 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69   has been modifi
5c30: 65 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  ed.  This.** rou
5c40: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6a  tine is called j
5c50: 75 73 74 20 62 65 66 6f 72 65 20 63 75 72 73 6f  ust before curso
5c60: 72 20 70 45 78 63 65 70 74 20 69 73 20 75 73 65  r pExcept is use
5c70: 64 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 0a  d to modify the.
5c80: 2a 2a 20 74 61 62 6c 65 2c 20 66 6f 72 20 65 78  ** table, for ex
5c90: 61 6d 70 6c 65 20 69 6e 20 42 74 72 65 65 44 65  ample in BtreeDe
5ca0: 6c 65 74 65 28 29 20 6f 72 20 42 74 72 65 65 49  lete() or BtreeI
5cb0: 6e 73 65 72 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  nsert()..**.** I
5cc0: 66 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20  f there are two 
5cd0: 6f 72 20 6d 6f 72 65 20 63 75 72 73 6f 72 73 20  or more cursors 
5ce0: 6f 6e 20 74 68 65 20 73 61 6d 65 20 62 74 72 65  on the same btre
5cf0: 65 2c 20 74 68 65 6e 20 61 6c 6c 20 73 75 63 68  e, then all such
5d00: 20 0a 2a 2a 20 63 75 72 73 6f 72 73 20 73 68 6f   .** cursors sho
5d10: 75 6c 64 20 68 61 76 65 20 74 68 65 69 72 20 42  uld have their B
5d20: 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61  TCF_Multiple fla
5d30: 67 20 73 65 74 2e 20 20 54 68 65 20 62 74 72 65  g set.  The btre
5d40: 65 43 75 72 73 6f 72 28 29 0a 2a 2a 20 72 6f 75  eCursor().** rou
5d50: 74 69 6e 65 20 65 6e 66 6f 72 63 65 73 20 74 68  tine enforces th
5d60: 61 74 20 72 75 6c 65 2e 20 20 54 68 69 73 20 72  at rule.  This r
5d70: 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 6e 65 65 64  outine only need
5d80: 73 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 69  s to be called i
5d90: 6e 0a 2a 2a 20 74 68 65 20 75 6e 63 6f 6d 6d 6f  n.** the uncommo
5da0: 6e 20 63 61 73 65 20 77 68 65 6e 20 70 45 78 70  n case when pExp
5db0: 65 63 74 20 68 61 73 20 74 68 65 20 42 54 43 46  ect has the BTCF
5dc0: 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67 20 73  _Multiple flag s
5dd0: 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78  et..**.** If pEx
5de0: 70 65 63 74 21 3d 4e 55 4c 4c 20 61 6e 64 20 69  pect!=NULL and i
5df0: 66 20 6e 6f 20 6f 74 68 65 72 20 63 75 72 73 6f  f no other curso
5e00: 72 73 20 61 72 65 20 66 6f 75 6e 64 20 6f 6e 20  rs are found on 
5e10: 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 2d 70 61  the same root-pa
5e20: 67 65 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  ge,.** then the 
5e30: 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c  BTCF_Multiple fl
5e40: 61 67 20 6f 6e 20 70 45 78 70 65 63 74 20 69 73  ag on pExpect is
5e50: 20 63 6c 65 61 72 65 64 2c 20 74 6f 20 61 76 6f   cleared, to avo
5e60: 69 64 20 61 6e 6f 74 68 65 72 0a 2a 2a 20 70 6f  id another.** po
5e70: 69 6e 74 6c 65 73 73 20 63 61 6c 6c 20 74 6f 20  intless call to 
5e80: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
5e90: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
5ea0: 6f 6e 20 6e 6f 74 65 3a 20 20 54 68 69 73 20 72  on note:  This r
5eb0: 6f 75 74 69 6e 65 20 6d 65 72 65 6c 79 20 63 68  outine merely ch
5ec0: 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 61  ecks to see if a
5ed0: 6e 79 20 63 75 72 73 6f 72 73 0a 2a 2a 20 6e 65  ny cursors.** ne
5ee0: 65 64 20 74 6f 20 62 65 20 73 61 76 65 64 2e 20  ed to be saved. 
5ef0: 20 49 74 20 63 61 6c 6c 73 20 6f 75 74 20 74 6f   It calls out to
5f00: 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69   saveCursorsOnLi
5f10: 73 74 28 29 20 69 6e 20 74 68 65 20 28 75 6e 75  st() in the (unu
5f20: 73 75 61 6c 29 0a 2a 2a 20 65 76 65 6e 74 20 74  sual).** event t
5f30: 68 61 74 20 63 75 72 73 6f 72 73 20 61 72 65 20  hat cursors are 
5f40: 69 6e 20 6e 65 65 64 20 74 6f 20 62 65 69 6e 67  in need to being
5f50: 20 73 61 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69   saved..*/.stati
5f60: 63 20 69 6e 74 20 73 61 76 65 41 6c 6c 43 75 72  c int saveAllCur
5f70: 73 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70  sors(BtShared *p
5f80: 42 74 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20  Bt, Pgno iRoot, 
5f90: 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70  BtCursor *pExcep
5fa0: 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  t){.  BtCursor *
5fb0: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  p;.  assert( sql
5fc0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
5fd0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
5fe0: 20 61 73 73 65 72 74 28 20 70 45 78 63 65 70 74   assert( pExcept
5ff0: 3d 3d 30 20 7c 7c 20 70 45 78 63 65 70 74 2d 3e  ==0 || pExcept->
6000: 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20 66 6f  pBt==pBt );.  fo
6010: 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  r(p=pBt->pCursor
6020: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
6030: 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 70 45 78  {.    if( p!=pEx
6040: 63 65 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f  cept && (0==iRoo
6050: 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74  t || p->pgnoRoot
6060: 3d 3d 69 52 6f 6f 74 29 20 29 20 62 72 65 61 6b  ==iRoot) ) break
6070: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 20 29 20  ;.  }.  if( p ) 
6080: 72 65 74 75 72 6e 20 73 61 76 65 43 75 72 73 6f  return saveCurso
6090: 72 73 4f 6e 4c 69 73 74 28 70 2c 20 69 52 6f 6f  rsOnList(p, iRoo
60a0: 74 2c 20 70 45 78 63 65 70 74 29 3b 0a 20 20 69  t, pExcept);.  i
60b0: 66 28 20 70 45 78 63 65 70 74 20 29 20 70 45 78  f( pExcept ) pEx
60c0: 63 65 70 74 2d 3e 63 75 72 46 6c 61 67 73 20 26  cept->curFlags &
60d0: 3d 20 7e 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65  = ~BTCF_Multiple
60e0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
60f0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 69 73  E_OK;.}../* This
6100: 20 68 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20   helper routine 
6110: 74 6f 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72  to saveAllCursor
6120: 73 20 64 6f 65 73 20 74 68 65 20 61 63 74 75 61  s does the actua
6130: 6c 20 77 6f 72 6b 20 6f 66 20 73 61 76 69 6e 67  l work of saving
6140: 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 73 20  .** the cursors 
6150: 69 66 20 61 6e 64 20 77 68 65 6e 20 61 20 63 75  if and when a cu
6160: 72 73 6f 72 20 69 73 20 66 6f 75 6e 64 20 74 68  rsor is found th
6170: 61 74 20 61 63 74 75 61 6c 6c 79 20 72 65 71 75  at actually requ
6180: 69 72 65 73 20 73 61 76 69 6e 67 2e 0a 2a 2a 20  ires saving..** 
6190: 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  The common case 
61a0: 69 73 20 74 68 61 74 20 6e 6f 20 63 75 72 73 6f  is that no curso
61b0: 72 73 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61  rs need to be sa
61c0: 76 65 64 2c 20 73 6f 20 74 68 69 73 20 72 6f 75  ved, so this rou
61d0: 74 69 6e 65 20 69 73 0a 2a 2a 20 62 72 6f 6b 65  tine is.** broke
61e0: 6e 20 6f 75 74 20 66 72 6f 6d 20 69 74 73 20 63  n out from its c
61f0: 61 6c 6c 65 72 20 74 6f 20 61 76 6f 69 64 20 75  aller to avoid u
6200: 6e 6e 65 63 65 73 73 61 72 79 20 73 74 61 63 6b  nnecessary stack
6210: 20 70 6f 69 6e 74 65 72 20 6d 6f 76 65 6d 65 6e   pointer movemen
6220: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
6230: 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
6240: 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69   saveCursorsOnLi
6250: 73 74 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  st(.  BtCursor *
6260: 70 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  p,         /* Th
6270: 65 20 66 69 72 73 74 20 63 75 72 73 6f 72 20 74  e first cursor t
6280: 68 61 74 20 6e 65 65 64 73 20 73 61 76 69 6e 67  hat needs saving
6290: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74   */.  Pgno iRoot
62a0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e  ,          /* On
62b0: 6c 79 20 73 61 76 65 20 63 75 72 73 6f 72 20 77  ly save cursor w
62c0: 69 74 68 20 74 68 69 73 20 69 52 6f 6f 74 2e 20  ith this iRoot. 
62d0: 53 61 76 65 20 61 6c 6c 20 69 66 20 7a 65 72 6f  Save all if zero
62e0: 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a   */.  BtCursor *
62f0: 70 45 78 63 65 70 74 20 20 20 20 2f 2a 20 44 6f  pExcept    /* Do
6300: 20 6e 6f 74 20 73 61 76 65 20 74 68 69 73 20 63   not save this c
6310: 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 64 6f  ursor */.){.  do
6320: 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 70 45 78  {.    if( p!=pEx
6330: 63 65 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f  cept && (0==iRoo
6340: 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74  t || p->pgnoRoot
6350: 3d 3d 69 52 6f 6f 74 29 20 29 7b 0a 20 20 20 20  ==iRoot) ){.    
6360: 20 20 69 66 28 20 70 2d 3e 65 53 74 61 74 65 3d    if( p->eState=
6370: 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c  =CURSOR_VALID ||
6380: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53   p->eState==CURS
6390: 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20  OR_SKIPNEXT ){. 
63a0: 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20         int rc = 
63b0: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
63c0: 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69  on(p);.        i
63d0: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
63e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
63f0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
6400: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
6410: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
6420: 28 20 70 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a  ( p->iPage>0 );.
6430: 20 20 20 20 20 20 20 20 62 74 72 65 65 52 65 6c          btreeRel
6440: 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67  easeAllCursorPag
6450: 65 73 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20  es(p);.      }. 
6460: 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e     }.    p = p->
6470: 70 4e 65 78 74 3b 0a 20 20 7d 77 68 69 6c 65 28  pNext;.  }while(
6480: 20 70 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53   p );.  return S
6490: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
64a0: 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 75 72  ** Clear the cur
64b0: 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69  rent cursor posi
64c0: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
64d0: 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43  lite3BtreeClearC
64e0: 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a  ursor(BtCursor *
64f0: 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
6500: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
6510: 78 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71 6c  x(pCur) );.  sql
6520: 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e  ite3_free(pCur->
6530: 70 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 70  pKey);.  pCur->p
6540: 4b 65 79 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  Key = 0;.  pCur-
6550: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
6560: 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a  _INVALID;.}../*.
6570: 2a 2a 20 49 6e 20 74 68 69 73 20 76 65 72 73 69  ** In this versi
6580: 6f 6e 20 6f 66 20 42 74 72 65 65 4d 6f 76 65 74  on of BtreeMovet
6590: 6f 2c 20 70 4b 65 79 20 69 73 20 61 20 70 61 63  o, pKey is a pac
65a0: 6b 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64  ked index record
65b0: 0a 2a 2a 20 73 75 63 68 20 61 73 20 69 73 20 67  .** such as is g
65c0: 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 65 20  enerated by the 
65d0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  OP_MakeRecord op
65e0: 63 6f 64 65 2e 20 20 55 6e 70 61 63 6b 20 74 68  code.  Unpack th
65f0: 65 0a 2a 2a 20 72 65 63 6f 72 64 20 61 6e 64 20  e.** record and 
6600: 74 68 65 6e 20 63 61 6c 6c 20 42 74 72 65 65 4d  then call BtreeM
6610: 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29 20  ovetoUnpacked() 
6620: 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 2e 0a  to do the work..
6630: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
6640: 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43  reeMoveto(.  BtC
6650: 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
6660: 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 20   /* Cursor open 
6670: 6f 6e 20 74 68 65 20 62 74 72 65 65 20 74 6f 20  on the btree to 
6680: 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20  be searched */. 
6690: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
66a0: 79 2c 20 20 20 2f 2a 20 50 61 63 6b 65 64 20 6b  y,   /* Packed k
66b0: 65 79 20 69 66 20 74 68 65 20 62 74 72 65 65 20  ey if the btree 
66c0: 69 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 20  is an index */. 
66d0: 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 20 20   i64 nKey,      
66e0: 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20       /* Integer 
66f0: 6b 65 79 20 66 6f 72 20 74 61 62 6c 65 73 2e 20  key for tables. 
6700: 20 53 69 7a 65 20 6f 66 20 70 4b 65 79 20 66 6f   Size of pKey fo
6710: 72 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69  r indices */.  i
6720: 6e 74 20 62 69 61 73 2c 20 20 20 20 20 20 20 20  nt bias,        
6730: 20 20 20 2f 2a 20 42 69 61 73 20 73 65 61 72 63     /* Bias searc
6740: 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e  h to the high en
6750: 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73  d */.  int *pRes
6760: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
6770: 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c  ite search resul
6780: 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ts here */.){.  
6790: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
67a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
67b0: 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a 20 20 55  atus code */.  U
67c0: 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
67d0: 49 64 78 4b 65 79 3b 20 20 20 2f 2a 20 55 6e 70  IdxKey;   /* Unp
67e0: 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20  acked index key 
67f0: 2a 2f 0a 20 20 63 68 61 72 20 61 53 70 61 63 65  */.  char aSpace
6800: 5b 33 38 34 5d 3b 20 20 20 20 20 20 20 20 20 20  [384];          
6810: 2f 2a 20 54 65 6d 70 20 73 70 61 63 65 20 66 6f  /* Temp space fo
6820: 72 20 70 49 64 78 4b 65 79 20 2d 20 74 6f 20 61  r pIdxKey - to a
6830: 76 6f 69 64 20 61 20 6d 61 6c 6c 6f 63 20 2a 2f  void a malloc */
6840: 0a 20 20 63 68 61 72 20 2a 70 46 72 65 65 20 3d  .  char *pFree =
6850: 20 30 3b 0a 0a 20 20 69 66 28 20 70 4b 65 79 20   0;..  if( pKey 
6860: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  ){.    assert( n
6870: 4b 65 79 3d 3d 28 69 36 34 29 28 69 6e 74 29 6e  Key==(i64)(int)n
6880: 4b 65 79 20 29 3b 0a 20 20 20 20 70 49 64 78 4b  Key );.    pIdxK
6890: 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ey = sqlite3Vdbe
68a0: 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63  AllocUnpackedRec
68b0: 6f 72 64 28 0a 20 20 20 20 20 20 20 20 70 43 75  ord(.        pCu
68c0: 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 61 53 70  r->pKeyInfo, aSp
68d0: 61 63 65 2c 20 73 69 7a 65 6f 66 28 61 53 70 61  ace, sizeof(aSpa
68e0: 63 65 29 2c 20 26 70 46 72 65 65 0a 20 20 20 20  ce), &pFree.    
68f0: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 4b  );.    if( pIdxK
6900: 65 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ey==0 ) return S
6910: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
6920: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6930: 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43  eRecordUnpack(pC
6940: 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69  ur->pKeyInfo, (i
6950: 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 20 70  nt)nKey, pKey, p
6960: 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 69 66 28  IdxKey);.    if(
6970: 20 70 49 64 78 4b 65 79 2d 3e 6e 46 69 65 6c 64   pIdxKey->nField
6980: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
6990: 69 74 65 33 44 62 46 72 65 65 28 70 43 75 72 2d  ite3DbFree(pCur-
69a0: 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70  >pKeyInfo->db, p
69b0: 46 72 65 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Free);.      ret
69c0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
69d0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
69e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64 78   }else{.    pIdx
69f0: 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  Key = 0;.  }.  r
6a00: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
6a10: 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70  MovetoUnpacked(p
6a20: 43 75 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b  Cur, pIdxKey, nK
6a30: 65 79 2c 20 62 69 61 73 2c 20 70 52 65 73 29 3b  ey, bias, pRes);
6a40: 0a 20 20 69 66 28 20 70 46 72 65 65 20 29 7b 0a  .  if( pFree ){.
6a50: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
6a60: 65 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  e(pCur->pKeyInfo
6a70: 2d 3e 64 62 2c 20 70 46 72 65 65 29 3b 0a 20 20  ->db, pFree);.  
6a80: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
6a90: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20  ../*.** Restore 
6aa0: 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
6ab0: 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61  e position it wa
6ac0: 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73  s in (or as clos
6ad0: 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65  e to as possible
6ae0: 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75  ).** when saveCu
6af0: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77  rsorPosition() w
6b00: 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20  as called. Note 
6b10: 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64  that this call d
6b20: 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73  eletes the .** s
6b30: 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e  aved position in
6b40: 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61 76  fo stored by sav
6b50: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
6b60: 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20  ), so there can 
6b70: 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e  be.** at most on
6b80: 65 20 65 66 66 65 63 74 69 76 65 20 72 65 73 74  e effective rest
6b90: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
6ba0: 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65  n() call after e
6bb0: 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73  ach .** saveCurs
6bc0: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f  orPosition()..*/
6bd0: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
6be0: 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f  eRestoreCursorPo
6bf0: 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20  sition(BtCursor 
6c00: 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
6c10: 3b 0a 20 20 69 6e 74 20 73 6b 69 70 4e 65 78 74  ;.  int skipNext
6c20: 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
6c30: 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
6c40: 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
6c50: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d  ( pCur->eState>=
6c60: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
6c70: 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  EK );.  if( pCur
6c80: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
6c90: 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65  _FAULT ){.    re
6ca0: 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e  turn pCur->skipN
6cb0: 65 78 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  ext;.  }.  pCur-
6cc0: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
6cd0: 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d  _INVALID;.  rc =
6ce0: 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75   btreeMoveto(pCu
6cf0: 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70  r, pCur->pKey, p
6d00: 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 73  Cur->nKey, 0, &s
6d10: 6b 69 70 4e 65 78 74 29 3b 0a 20 20 69 66 28 20  kipNext);.  if( 
6d20: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
6d30: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
6d40: 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20  e(pCur->pKey);. 
6d50: 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20     pCur->pKey = 
6d60: 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  0;.    assert( p
6d70: 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
6d80: 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75  SOR_VALID || pCu
6d90: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
6da0: 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20  R_INVALID );.   
6db0: 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
6dc0: 7c 3d 20 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20  |= skipNext;.   
6dd0: 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e   if( pCur->skipN
6de0: 65 78 74 20 26 26 20 70 43 75 72 2d 3e 65 53 74  ext && pCur->eSt
6df0: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
6e00: 44 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  D ){.      pCur-
6e10: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
6e20: 5f 53 4b 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d  _SKIPNEXT;.    }
6e30: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
6e40: 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73  ;.}..#define res
6e50: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
6e60: 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53  on(p) \.  (p->eS
6e70: 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
6e80: 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20  UIRESEEK ? \.   
6e90: 20 20 20 20 20 20 62 74 72 65 65 52 65 73 74 6f        btreeResto
6ea0: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
6eb0: 28 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20  (p) : \.        
6ec0: 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a   SQLITE_OK)../*.
6ed0: 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65  ** Determine whe
6ee0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75  ther or not a cu
6ef0: 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66  rsor has moved f
6f00: 72 6f 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  rom the position
6f10: 20 77 68 65 72 65 0a 2a 2a 20 69 74 20 77 61 73   where.** it was
6f20: 20 6c 61 73 74 20 70 6c 61 63 65 64 2c 20 6f 72   last placed, or
6f30: 20 68 61 73 20 62 65 65 6e 20 69 6e 76 61 6c 69   has been invali
6f40: 64 61 74 65 64 20 66 6f 72 20 61 6e 79 20 6f 74  dated for any ot
6f50: 68 65 72 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20 43  her reason..** C
6f60: 75 72 73 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20  ursors can move 
6f70: 77 68 65 6e 20 74 68 65 20 72 6f 77 20 74 68 65  when the row the
6f80: 79 20 61 72 65 20 70 6f 69 6e 74 69 6e 67 20 61  y are pointing a
6f90: 74 20 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74  t is deleted out
6fa0: 0a 2a 2a 20 66 72 6f 6d 20 75 6e 64 65 72 20 74  .** from under t
6fb0: 68 65 6d 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  hem, for example
6fc0: 2e 20 20 43 75 72 73 6f 72 20 6d 69 67 68 74 20  .  Cursor might 
6fd0: 61 6c 73 6f 20 6d 6f 76 65 20 69 66 20 61 20 62  also move if a b
6fe0: 74 72 65 65 0a 2a 2a 20 69 73 20 72 65 62 61 6c  tree.** is rebal
6ff0: 61 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c  anced..**.** Cal
7000: 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
7010: 65 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 63 75  e with a NULL cu
7020: 72 73 6f 72 20 70 6f 69 6e 74 65 72 20 72 65 74  rsor pointer ret
7030: 75 72 6e 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a  urns false..**.*
7040: 2a 20 55 73 65 20 74 68 65 20 73 65 70 61 72 61  * Use the separa
7050: 74 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  te sqlite3BtreeC
7060: 75 72 73 6f 72 52 65 73 74 6f 72 65 28 29 20 72  ursorRestore() r
7070: 6f 75 74 69 6e 65 20 74 6f 20 72 65 73 74 6f 72  outine to restor
7080: 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 62 61  e a cursor.** ba
7090: 63 6b 20 74 6f 20 77 68 65 72 65 20 69 74 20 6f  ck to where it o
70a0: 75 67 68 74 20 74 6f 20 62 65 20 69 66 20 74 68  ught to be if th
70b0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
70c0: 6e 73 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20  ns true..*/.int 
70d0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
70e0: 6f 72 48 61 73 4d 6f 76 65 64 28 42 74 43 75 72  orHasMoved(BtCur
70f0: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65  sor *pCur){.  re
7100: 74 75 72 6e 20 70 43 75 72 2d 3e 65 53 74 61 74  turn pCur->eStat
7110: 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b  e!=CURSOR_VALID;
7120: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
7130: 6f 75 74 69 6e 65 20 72 65 73 74 6f 72 65 73 20  outine restores 
7140: 61 20 63 75 72 73 6f 72 20 62 61 63 6b 20 74 6f  a cursor back to
7150: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 70 6f   its original po
7160: 73 69 74 69 6f 6e 20 61 66 74 65 72 20 69 74 0a  sition after it.
7170: 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 76 65  ** has been move
7180: 64 20 62 79 20 73 6f 6d 65 20 6f 75 74 73 69 64  d by some outsid
7190: 65 20 61 63 74 69 76 69 74 79 20 28 73 75 63 68  e activity (such
71a0: 20 61 73 20 61 20 62 74 72 65 65 20 72 65 62 61   as a btree reba
71b0: 6c 61 6e 63 65 20 6f 72 0a 2a 2a 20 61 20 72 6f  lance or.** a ro
71c0: 77 20 68 61 76 69 6e 67 20 62 65 65 6e 20 64 65  w having been de
71d0: 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75  leted out from u
71e0: 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 29  nder the cursor)
71f0: 2e 20 20 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63  .  .**.** On suc
7200: 63 65 73 73 2c 20 74 68 65 20 2a 70 44 69 66 66  cess, the *pDiff
7210: 65 72 65 6e 74 52 6f 77 20 70 61 72 61 6d 65 74  erentRow paramet
7220: 65 72 20 69 73 20 66 61 6c 73 65 20 69 66 20 74  er is false if t
7230: 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
7240: 74 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 61 74  t.** pointing at
7250: 20 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d   exactly the sam
7260: 65 20 72 6f 77 2e 20 20 2a 70 44 69 66 66 65 72  e row.  *pDiffer
7270: 6e 74 52 6f 77 20 69 73 20 74 68 65 20 72 6f 77  ntRow is the row
7280: 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77   the cursor.** w
7290: 61 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 68  as pointing to h
72a0: 61 73 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2c  as been deleted,
72b0: 20 66 6f 72 63 69 6e 67 20 74 68 65 20 63 75 72   forcing the cur
72c0: 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  sor to point to 
72d0: 73 6f 6d 65 0a 2a 2a 20 6e 65 61 72 62 79 20 72  some.** nearby r
72e0: 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ow..**.** This r
72f0: 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e  outine should on
7300: 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 66 6f 72  ly be called for
7310: 20 61 20 63 75 72 73 6f 72 20 74 68 61 74 20 6a   a cursor that j
7320: 75 73 74 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20  ust returned.** 
7330: 54 52 55 45 20 66 72 6f 6d 20 73 71 6c 69 74 65  TRUE from sqlite
7340: 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d  3BtreeCursorHasM
7350: 6f 76 65 64 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  oved()..*/.int s
7360: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
7370: 72 52 65 73 74 6f 72 65 28 42 74 43 75 72 73 6f  rRestore(BtCurso
7380: 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 44  r *pCur, int *pD
7390: 69 66 66 65 72 65 6e 74 52 6f 77 29 7b 0a 20 20  ifferentRow){.  
73a0: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
73b0: 74 28 20 70 43 75 72 21 3d 30 20 29 3b 0a 20 20  t( pCur!=0 );.  
73c0: 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
73d0: 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
73e0: 49 44 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  ID );.  rc = res
73f0: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
7400: 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
7410: 72 63 20 29 7b 0a 20 20 20 20 2a 70 44 69 66 66  rc ){.    *pDiff
7420: 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20  erentRow = 1;.  
7430: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
7440: 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
7450: 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
7460: 44 20 29 7b 0a 20 20 20 20 2a 70 44 69 66 66 65  D ){.    *pDiffe
7470: 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20 7d  rentRow = 1;.  }
7480: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
7490: 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
74a0: 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70 44 69 66  ==0 );.    *pDif
74b0: 66 65 72 65 6e 74 52 6f 77 20 3d 20 30 3b 0a 20  ferentRow = 0;. 
74c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
74d0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66  TE_OK;.}..#ifdef
74e0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
74f0: 55 52 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a  URSOR_HINTS./*.*
7500: 2a 20 50 72 6f 76 69 64 65 20 68 69 6e 74 73 20  * Provide hints 
7510: 74 6f 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20  to the cursor.  
7520: 54 68 65 20 70 61 72 74 69 63 75 6c 61 72 20 68  The particular h
7530: 69 6e 74 20 67 69 76 65 6e 20 28 61 6e 64 20 74  int given (and t
7540: 68 65 20 74 79 70 65 0a 2a 2a 20 61 6e 64 20 6e  he type.** and n
7550: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 76 61 72  umber of the var
7560: 61 72 67 73 20 70 61 72 61 6d 65 74 65 72 73 29  args parameters)
7570: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62   is determined b
7580: 79 20 74 68 65 20 65 48 69 6e 74 54 79 70 65 0a  y the eHintType.
7590: 2a 2a 20 70 61 72 61 6d 65 74 65 72 2e 20 20 53  ** parameter.  S
75a0: 65 65 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f  ee the definitio
75b0: 6e 73 20 6f 66 20 74 68 65 20 42 54 52 45 45 5f  ns of the BTREE_
75c0: 48 49 4e 54 5f 2a 20 6d 61 63 72 6f 73 20 66 6f  HINT_* macros fo
75d0: 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 76 6f  r details..*/.vo
75e0: 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
75f0: 75 72 73 6f 72 48 69 6e 74 28 42 74 43 75 72 73  ursorHint(BtCurs
7600: 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 65 48  or *pCur, int eH
7610: 69 6e 74 54 79 70 65 2c 20 2e 2e 2e 29 7b 0a 20  intType, ...){. 
7620: 20 2f 2a 20 55 73 65 64 20 6f 6e 6c 79 20 62 79   /* Used only by
7630: 20 73 79 73 74 65 6d 20 74 68 61 74 20 73 75 62   system that sub
7640: 73 74 69 74 75 74 65 20 74 68 65 69 72 20 6f 77  stitute their ow
7650: 6e 20 73 74 6f 72 61 67 65 20 65 6e 67 69 6e 65  n storage engine
7660: 20 2a 2f 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   */.}.#endif../*
7670: 0a 2a 2a 20 50 72 6f 76 69 64 65 20 66 6c 61 67  .** Provide flag
7680: 20 68 69 6e 74 73 20 74 6f 20 74 68 65 20 63 75   hints to the cu
7690: 72 73 6f 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  rsor..*/.void sq
76a0: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
76b0: 48 69 6e 74 46 6c 61 67 73 28 42 74 43 75 72 73  HintFlags(BtCurs
76c0: 6f 72 20 2a 70 43 75 72 2c 20 75 6e 73 69 67 6e  or *pCur, unsign
76d0: 65 64 20 78 29 7b 0a 20 20 61 73 73 65 72 74 28  ed x){.  assert(
76e0: 20 78 3d 3d 42 54 52 45 45 5f 53 45 45 4b 5f 45   x==BTREE_SEEK_E
76f0: 51 20 7c 7c 20 78 3d 3d 42 54 52 45 45 5f 42 55  Q || x==BTREE_BU
7700: 4c 4b 4c 4f 41 44 20 7c 7c 20 78 3d 3d 30 20 29  LKLOAD || x==0 )
7710: 3b 0a 20 20 70 43 75 72 2d 3e 68 69 6e 74 73 20  ;.  pCur->hints 
7720: 3d 20 78 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66  = x;.}...#ifndef
7730: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
7740: 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69  OVACUUM./*.** Gi
7750: 76 65 6e 20 61 20 70 61 67 65 20 6e 75 6d 62 65  ven a page numbe
7760: 72 20 6f 66 20 61 20 72 65 67 75 6c 61 72 20 64  r of a regular d
7770: 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 72 65  atabase page, re
7780: 74 75 72 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a  turn the page.**
7790: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
77a0: 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
77b0: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
77c0: 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  he entry for the
77d0: 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67 65 20 6e  .** input page n
77e0: 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  umber..**.** Ret
77f0: 75 72 6e 20 30 20 28 6e 6f 74 20 61 20 76 61 6c  urn 0 (not a val
7800: 69 64 20 70 61 67 65 29 20 66 6f 72 20 70 67 6e  id page) for pgn
7810: 6f 3d 3d 31 20 73 69 6e 63 65 20 74 68 65 72 65  o==1 since there
7820: 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65   is.** no pointe
7830: 72 20 6d 61 70 20 61 73 73 6f 63 69 61 74 65 64  r map associated
7840: 20 77 69 74 68 20 70 61 67 65 20 31 2e 20 20 54   with page 1.  T
7850: 68 65 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  he integrity_che
7860: 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20 72 65 71 75  ck logic.** requ
7870: 69 72 65 73 20 74 68 61 74 20 70 74 72 6d 61 70  ires that ptrmap
7880: 50 61 67 65 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a  Pageno(*,1)!=1..
7890: 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70  */.static Pgno p
78a0: 74 72 6d 61 70 50 61 67 65 6e 6f 28 42 74 53 68  trmapPageno(BtSh
78b0: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
78c0: 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61  pgno){.  int nPa
78d0: 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20  gesPerMapPage;. 
78e0: 20 50 67 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72   Pgno iPtrMap, r
78f0: 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  et;.  assert( sq
7900: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
7910: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
7920: 20 20 69 66 28 20 70 67 6e 6f 3c 32 20 29 20 72    if( pgno<2 ) r
7930: 65 74 75 72 6e 20 30 3b 0a 20 20 6e 50 61 67 65  eturn 0;.  nPage
7940: 73 50 65 72 4d 61 70 50 61 67 65 20 3d 20 28 70  sPerMapPage = (p
7950: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35  Bt->usableSize/5
7960: 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d  )+1;.  iPtrMap =
7970: 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73   (pgno-2)/nPages
7980: 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 72 65  PerMapPage;.  re
7990: 74 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50 61  t = (iPtrMap*nPa
79a0: 67 65 73 50 65 72 4d 61 70 50 61 67 65 29 20 2b  gesPerMapPage) +
79b0: 20 32 3b 20 0a 20 20 69 66 28 20 72 65 74 3d 3d   2; .  if( ret==
79c0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
79d0: 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 65  E(pBt) ){.    re
79e0: 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  t++;.  }.  retur
79f0: 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n ret;.}../*.** 
7a00: 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69  Write an entry i
7a10: 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20  nto the pointer 
7a20: 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  map..**.** This 
7a30: 72 6f 75 74 69 6e 65 20 75 70 64 61 74 65 73 20  routine updates 
7a40: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
7a50: 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 6e  entry for page n
7a60: 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73  umber 'key'.** s
7a70: 6f 20 74 68 61 74 20 69 74 20 6d 61 70 73 20 74  o that it maps t
7a80: 6f 20 74 79 70 65 20 27 65 54 79 70 65 27 20 61  o type 'eType' a
7a90: 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e  nd parent page n
7aa0: 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a  umber 'pgno'..**
7ab0: 0a 2a 2a 20 49 66 20 2a 70 52 43 20 69 73 20 69  .** If *pRC is i
7ac0: 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72  nitially non-zer
7ad0: 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b  o (non-SQLITE_OK
7ae0: 29 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  ) then this rout
7af0: 69 6e 65 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f  ine is.** a no-o
7b00: 70 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20  p.  If an error 
7b10: 6f 63 63 75 72 73 2c 20 74 68 65 20 61 70 70 72  occurs, the appr
7b20: 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
7b30: 64 65 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a  de is written.**
7b40: 20 69 6e 74 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73   into *pRC..*/.s
7b50: 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61  tatic void ptrma
7b60: 70 50 75 74 28 42 74 53 68 61 72 65 64 20 2a 70  pPut(BtShared *p
7b70: 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38  Bt, Pgno key, u8
7b80: 20 65 54 79 70 65 2c 20 50 67 6e 6f 20 70 61 72   eType, Pgno par
7b90: 65 6e 74 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  ent, int *pRC){.
7ba0: 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
7bb0: 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74  e;  /* The point
7bc0: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
7bd0: 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20   u8 *pPtrmap;   
7be0: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
7bf0: 72 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20 20  r map data */.  
7c00: 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20 20  Pgno iPtrmap;   
7c10: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
7c20: 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72   map page number
7c30: 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74   */.  int offset
7c40: 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65  ;       /* Offse
7c50: 74 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70  t in pointer map
7c60: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72   page */.  int r
7c70: 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  c;           /* 
7c80: 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d  Return code from
7c90: 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f   subfunctions */
7ca0: 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72  ..  if( *pRC ) r
7cb0: 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74  eturn;..  assert
7cc0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
7cd0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
7ce0: 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73   );.  /* The mas
7cf0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65  ter-journal page
7d00: 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 6e 65 76   number must nev
7d10: 65 72 20 62 65 20 75 73 65 64 20 61 73 20 61 20  er be used as a 
7d20: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
7d30: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d   */.  assert( 0=
7d40: 3d 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70  =PTRMAP_ISPAGE(p
7d50: 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  Bt, PENDING_BYTE
7d60: 5f 50 41 47 45 28 70 42 74 29 29 20 29 3b 0a 0a  _PAGE(pBt)) );..
7d70: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
7d80: 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 69  utoVacuum );.  i
7d90: 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20  f( key==0 ){.   
7da0: 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43   *pRC = SQLITE_C
7db0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
7dc0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
7dd0: 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f  Ptrmap = PTRMAP_
7de0: 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29  PAGENO(pBt, key)
7df0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
7e00: 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
7e10: 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26  ager, iPtrmap, &
7e20: 70 44 62 50 61 67 65 2c 20 30 29 3b 0a 20 20 69  pDbPage, 0);.  i
7e30: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
7e40: 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72   ){.    *pRC = r
7e50: 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  c;.    return;. 
7e60: 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54   }.  offset = PT
7e70: 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69  RMAP_PTROFFSET(i
7e80: 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20  Ptrmap, key);.  
7e90: 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a  if( offset<0 ){.
7ea0: 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54      *pRC = SQLIT
7eb0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
7ec0: 20 20 20 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f      goto ptrmap_
7ed0: 65 78 69 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65  exit;.  }.  asse
7ee0: 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69  rt( offset <= (i
7ef0: 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  nt)pBt->usableSi
7f00: 7a 65 2d 35 20 29 3b 0a 20 20 70 50 74 72 6d 61  ze-5 );.  pPtrma
7f10: 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  p = (u8 *)sqlite
7f20: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
7f30: 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28 20 65  bPage);..  if( e
7f40: 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66  Type!=pPtrmap[of
7f50: 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62 79 74  fset] || get4byt
7f60: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
7f70: 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b  t+1])!=parent ){
7f80: 0a 20 20 20 20 54 52 41 43 45 28 28 22 50 54 52  .    TRACE(("PTR
7f90: 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e  MAP_UPDATE: %d->
7fa0: 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c  (%d,%d)\n", key,
7fb0: 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74 29 29   eType, parent))
7fc0: 3b 0a 20 20 20 20 2a 70 52 43 3d 20 72 63 20 3d  ;.    *pRC= rc =
7fd0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
7fe0: 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  te(pDbPage);.   
7ff0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
8000: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 74 72  OK ){.      pPtr
8010: 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54  map[offset] = eT
8020: 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ype;.      put4b
8030: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
8040: 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b  set+1], parent);
8050: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d  .    }.  }..ptrm
8060: 61 70 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74  ap_exit:.  sqlit
8070: 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
8080: 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
8090: 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20 66 72  Read an entry fr
80a0: 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  om the pointer m
80b0: 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ap..**.** This r
80c0: 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76 65 73  outine retrieves
80d0: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
80e0: 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20   entry for page 
80f0: 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a  'key', writing.*
8100: 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 70  * the type and p
8110: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
8120: 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61 6e 64  r to *pEType and
8130: 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63 74 69   *pPgno respecti
8140: 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f  vely..** An erro
8150: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
8160: 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20  ed if something 
8170: 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65  goes wrong, othe
8180: 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e  rwise SQLITE_OK.
8190: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
81a0: 74 72 6d 61 70 47 65 74 28 42 74 53 68 61 72 65  trmapGet(BtShare
81b0: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79  d *pBt, Pgno key
81c0: 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20 50 67  , u8 *pEType, Pg
81d0: 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62  no *pPgno){.  Db
81e0: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
81f0: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
8200: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  map page */.  in
8210: 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 20  t iPtrmap;      
8220: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
8230: 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20  page index */.  
8240: 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20  u8 *pPtrmap;    
8250: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
8260: 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  p page data */. 
8270: 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20   int offset;    
8280: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
8290: 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74 65   entry in pointe
82a0: 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72  r map */.  int r
82b0: 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  c;..  assert( sq
82c0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
82d0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
82e0: 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52  .  iPtrmap = PTR
82f0: 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
8300: 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  key);.  rc = sql
8310: 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
8320: 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61  ->pPager, iPtrma
8330: 70 2c 20 26 70 44 62 50 61 67 65 2c 20 30 29 3b  p, &pDbPage, 0);
8340: 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a  .  if( rc!=0 ){.
8350: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
8360: 20 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28   }.  pPtrmap = (
8370: 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  u8 *)sqlite3Page
8380: 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
8390: 29 3b 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20 50  );..  offset = P
83a0: 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28  TRMAP_PTROFFSET(
83b0: 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20  iPtrmap, key);. 
83c0: 20 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b   if( offset<0 ){
83d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
83e0: 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
83f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
8400: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
8410: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f  .  }.  assert( o
8420: 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42  ffset <= (int)pB
8430: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20  t->usableSize-5 
8440: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 54  );.  assert( pET
8450: 79 70 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54  ype!=0 );.  *pET
8460: 79 70 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66  ype = pPtrmap[of
8470: 66 73 65 74 5d 3b 0a 20 20 69 66 28 20 70 50 67  fset];.  if( pPg
8480: 6e 6f 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65  no ) *pPgno = ge
8490: 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b  t4byte(&pPtrmap[
84a0: 6f 66 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73  offset+1]);..  s
84b0: 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
84c0: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  (pDbPage);.  if(
84d0: 20 2a 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70   *pEType<1 || *p
84e0: 45 54 79 70 65 3e 35 20 29 20 72 65 74 75 72 6e  EType>5 ) return
84f0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
8500: 42 4b 50 54 3b 0a 20 20 72 65 74 75 72 6e 20 53  BKPT;.  return S
8510: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c  QLITE_OK;.}..#el
8520: 73 65 20 2f 2a 20 69 66 20 64 65 66 69 6e 65 64  se /* if defined
8530: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
8540: 4f 56 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65  OVACUUM */.  #de
8550: 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74 28 77  fine ptrmapPut(w
8560: 2c 78 2c 79 2c 7a 2c 72 63 29 0a 20 20 23 64 65  ,x,y,z,rc).  #de
8570: 66 69 6e 65 20 70 74 72 6d 61 70 47 65 74 28 77  fine ptrmapGet(w
8580: 2c 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f  ,x,y,z) SQLITE_O
8590: 4b 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d  K.  #define ptrm
85a0: 61 70 50 75 74 4f 76 66 6c 50 74 72 28 78 2c 20  apPutOvflPtr(x, 
85b0: 79 2c 20 72 63 29 0a 23 65 6e 64 69 66 0a 0a 2f  y, rc).#endif../
85c0: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62 74 72  *.** Given a btr
85d0: 65 65 20 70 61 67 65 20 61 6e 64 20 61 20 63 65  ee page and a ce
85e0: 6c 6c 20 69 6e 64 65 78 20 28 30 20 6d 65 61 6e  ll index (0 mean
85f0: 73 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c  s the first cell
8600: 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c   on.** the page,
8610: 20 31 20 6d 65 61 6e 73 20 74 68 65 20 73 65 63   1 means the sec
8620: 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f  ond cell, and so
8630: 20 66 6f 72 74 68 29 20 72 65 74 75 72 6e 20 61   forth) return a
8640: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
8650: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e  he cell content.
8660: 0a 2a 2a 0a 2a 2a 20 66 69 6e 64 43 65 6c 6c 50  .**.** findCellP
8670: 61 73 74 50 74 72 28 29 20 64 6f 65 73 20 74 68  astPtr() does th
8680: 65 20 73 61 6d 65 20 65 78 63 65 70 74 20 69 74  e same except it
8690: 20 73 6b 69 70 73 20 70 61 73 74 20 74 68 65 20   skips past the 
86a0: 69 6e 69 74 69 61 6c 0a 2a 2a 20 34 2d 62 79 74  initial.** 4-byt
86b0: 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20  e child pointer 
86c0: 66 6f 75 6e 64 20 6f 6e 20 69 6e 74 65 72 69 6f  found on interio
86d0: 72 20 70 61 67 65 73 2c 20 69 66 20 74 68 65 72  r pages, if ther
86e0: 65 20 69 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20  e is one..**.** 
86f0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72  This routine wor
8700: 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65  ks only for page
8710: 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f  s that do not co
8720: 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63  ntain overflow c
8730: 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ells..*/.#define
8740: 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c   findCell(P,I) \
8750: 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61 20 2b  .  ((P)->aData +
8760: 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20   ((P)->maskPage 
8770: 26 20 67 65 74 32 62 79 74 65 41 6c 69 67 6e 65  & get2byteAligne
8780: 64 28 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78  d(&(P)->aCellIdx
8790: 5b 32 2a 28 49 29 5d 29 29 29 0a 23 64 65 66 69  [2*(I)]))).#defi
87a0: 6e 65 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50  ne findCellPastP
87b0: 74 72 28 50 2c 49 29 20 5c 0a 20 20 28 28 50 29  tr(P,I) \.  ((P)
87c0: 2d 3e 61 44 61 74 61 4f 66 73 74 20 2b 20 28 28  ->aDataOfst + ((
87d0: 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67  P)->maskPage & g
87e0: 65 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28 26  et2byteAligned(&
87f0: 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a  (P)->aCellIdx[2*
8800: 28 49 29 5d 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a 20  (I)]))).../*.** 
8810: 54 68 69 73 20 69 73 20 63 6f 6d 6d 6f 6e 20 74  This is common t
8820: 61 69 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 66  ail processing f
8830: 6f 72 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  or btreeParseCel
8840: 6c 50 74 72 28 29 20 61 6e 64 0a 2a 2a 20 62 74  lPtr() and.** bt
8850: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49  reeParseCellPtrI
8860: 6e 64 65 78 28 29 20 66 6f 72 20 74 68 65 20 63  ndex() for the c
8870: 61 73 65 20 77 68 65 6e 20 74 68 65 20 63 65 6c  ase when the cel
8880: 6c 20 64 6f 65 73 20 6e 6f 74 20 66 69 74 20 65  l does not fit e
8890: 6e 74 69 72 65 6c 79 0a 2a 2a 20 6f 6e 20 61 20  ntirely.** on a 
88a0: 73 69 6e 67 6c 65 20 42 2d 74 72 65 65 20 70 61  single B-tree pa
88b0: 67 65 2e 20 20 4d 61 6b 65 20 6e 65 63 65 73 73  ge.  Make necess
88c0: 61 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 73 20  ary adjustments 
88d0: 74 6f 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 0a  to the CellInfo.
88e0: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  ** structure..*/
88f0: 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
8900: 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 62 74 72  OINLINE void btr
8910: 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75 73  eeParseCellAdjus
8920: 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77  tSizeForOverflow
8930: 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
8940: 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ge,         /* P
8950: 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
8960: 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  he cell */.  u8 
8970: 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
8980: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
8990: 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74  to the cell text
89a0: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
89b0: 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f  *pInfo         /
89c0: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73  * Fill in this s
89d0: 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20  tructure */.){. 
89e0: 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79 6c 6f   /* If the paylo
89f0: 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20  ad will not fit 
8a00: 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68  completely on th
8a10: 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77 65  e local page, we
8a20: 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64 65   have.  ** to de
8a30: 63 69 64 65 20 68 6f 77 20 6d 75 63 68 20 74 6f  cide how much to
8a40: 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61   store locally a
8a50: 6e 64 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73  nd how much to s
8a60: 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20 2a 2a 20 6f  pill onto.  ** o
8a70: 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 20  verflow pages.  
8a80: 54 68 65 20 73 74 72 61 74 65 67 79 20 69 73 20  The strategy is 
8a90: 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20  to minimize the 
8aa0: 61 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65 64  amount of unused
8ab0: 0a 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f  .  ** space on o
8ac0: 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77 68  verflow pages wh
8ad0: 69 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65 20  ile keeping the 
8ae0: 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20  amount of local 
8af0: 73 74 6f 72 61 67 65 0a 20 20 2a 2a 20 69 6e 20  storage.  ** in 
8b00: 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c  between minLocal
8b10: 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20   and maxLocal.. 
8b20: 20 2a 2a 0a 20 20 2a 2a 20 57 61 72 6e 69 6e 67   **.  ** Warning
8b30: 3a 20 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  :  changing the 
8b40: 77 61 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 79  way overflow pay
8b50: 6c 6f 61 64 20 69 73 20 64 69 73 74 72 69 62 75  load is distribu
8b60: 74 65 64 20 69 6e 20 61 6e 79 0a 20 20 2a 2a 20  ted in any.  ** 
8b70: 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74 20  way will result 
8b80: 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62  in an incompatib
8b90: 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a  le file format..
8ba0: 20 20 2a 2f 0a 20 20 69 6e 74 20 6d 69 6e 4c 6f    */.  int minLo
8bb0: 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d  cal;  /* Minimum
8bc0: 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f   amount of paylo
8bd0: 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20  ad held locally 
8be0: 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61  */.  int maxLoca
8bf0: 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61  l;  /* Maximum a
8c00: 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64  mount of payload
8c10: 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f   held locally */
8c20: 0a 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b 20  .  int surplus; 
8c30: 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61    /* Overflow pa
8c40: 79 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65 20  yload available 
8c50: 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67  for local storag
8c60: 65 20 2a 2f 0a 0a 20 20 6d 69 6e 4c 6f 63 61 6c  e */..  minLocal
8c70: 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63   = pPage->minLoc
8c80: 61 6c 3b 0a 20 20 6d 61 78 4c 6f 63 61 6c 20 3d  al;.  maxLocal =
8c90: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
8ca0: 3b 0a 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69  ;.  surplus = mi
8cb0: 6e 4c 6f 63 61 6c 20 2b 20 28 70 49 6e 66 6f 2d  nLocal + (pInfo-
8cc0: 3e 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c  >nPayload - minL
8cd0: 6f 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70 42  ocal)%(pPage->pB
8ce0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 29  t->usableSize-4)
8cf0: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 75  ;.  testcase( su
8d00: 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20  rplus==maxLocal 
8d10: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  );.  testcase( s
8d20: 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c  urplus==maxLocal
8d30: 2b 31 20 29 3b 0a 20 20 69 66 28 20 73 75 72 70  +1 );.  if( surp
8d40: 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20  lus <= maxLocal 
8d50: 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  ){.    pInfo->nL
8d60: 6f 63 61 6c 20 3d 20 28 75 31 36 29 73 75 72 70  ocal = (u16)surp
8d70: 6c 75 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  lus;.  }else{.  
8d80: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
8d90: 3d 20 28 75 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b  = (u16)minLocal;
8da0: 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53  .  }.  pInfo->nS
8db0: 69 7a 65 20 3d 20 28 75 31 36 29 28 26 70 49 6e  ize = (u16)(&pIn
8dc0: 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 5b 70 49 6e  fo->pPayload[pIn
8dd0: 66 6f 2d 3e 6e 4c 6f 63 61 6c 5d 20 2d 20 70 43  fo->nLocal] - pC
8de0: 65 6c 6c 29 20 2b 20 34 3b 0a 7d 0a 0a 2f 2a 0a  ell) + 4;.}../*.
8df0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
8e00: 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 69 6d   routines are im
8e10: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66  plementations of
8e20: 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 78 50 61   the MemPage.xPa
8e30: 72 73 65 43 65 6c 6c 28 29 0a 2a 2a 20 6d 65 74  rseCell().** met
8e40: 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 73 65  hod..**.** Parse
8e50: 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20   a cell content 
8e60: 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69  block and fill i
8e70: 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73  n the CellInfo s
8e80: 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20  tructure..**.** 
8e90: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
8ea0: 72 28 29 20 20 20 20 20 20 20 20 3d 3e 20 20 20  r()        =>   
8eb0: 74 61 62 6c 65 20 62 74 72 65 65 20 6c 65 61 66  table btree leaf
8ec0: 20 6e 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65 50   nodes.** btreeP
8ed0: 61 72 73 65 43 65 6c 6c 4e 6f 50 61 79 6c 6f 61  arseCellNoPayloa
8ee0: 64 28 29 20 20 3d 3e 20 20 20 74 61 62 6c 65 20  d()  =>   table 
8ef0: 62 74 72 65 65 20 69 6e 74 65 72 6e 61 6c 20 6e  btree internal n
8f00: 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65 50 61 72  odes.** btreePar
8f10: 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28 29  seCellPtrIndex()
8f20: 20 20 20 3d 3e 20 20 20 69 6e 64 65 78 20 62 74     =>   index bt
8f30: 72 65 65 20 6e 6f 64 65 73 0a 2a 2a 0a 2a 2a 20  ree nodes.**.** 
8f40: 54 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61 20  There is also a 
8f50: 77 72 61 70 70 65 72 20 66 75 6e 63 74 69 6f 6e  wrapper function
8f60: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
8f70: 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f 72  ) that works for
8f80: 0a 2a 2a 20 61 6c 6c 20 4d 65 6d 50 61 67 65 20  .** all MemPage 
8f90: 74 79 70 65 73 20 61 6e 64 20 74 68 61 74 20 72  types and that r
8fa0: 65 66 65 72 65 6e 63 65 73 20 74 68 65 20 63 65  eferences the ce
8fb0: 6c 6c 20 62 79 20 69 6e 64 65 78 20 72 61 74 68  ll by index rath
8fc0: 65 72 20 74 68 61 6e 0a 2a 2a 20 62 79 20 70 6f  er than.** by po
8fd0: 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  inter..*/.static
8fe0: 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65   void btreeParse
8ff0: 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61 64  CellPtrNoPayload
9000: 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
9010: 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ge,         /* P
9020: 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
9030: 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  he cell */.  u8 
9040: 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
9050: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
9060: 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74  to the cell text
9070: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
9080: 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f  *pInfo         /
9090: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73  * Fill in this s
90a0: 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20  tructure */.){. 
90b0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
90c0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
90d0: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
90e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
90f0: 65 2d 3e 6c 65 61 66 3d 3d 30 20 29 3b 0a 20 20  e->leaf==0 );.  
9100: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63  assert( pPage->c
9110: 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20 29  hildPtrSize==4 )
9120: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
9130: 5f 44 45 42 55 47 0a 20 20 55 4e 55 53 45 44 5f  _DEBUG.  UNUSED_
9140: 50 41 52 41 4d 45 54 45 52 28 70 50 61 67 65 29  PARAMETER(pPage)
9150: 3b 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e 66 6f  ;.#endif.  pInfo
9160: 2d 3e 6e 53 69 7a 65 20 3d 20 34 20 2b 20 67 65  ->nSize = 4 + ge
9170: 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34  tVarint(&pCell[4
9180: 5d 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d  ], (u64*)&pInfo-
9190: 3e 6e 4b 65 79 29 3b 0a 20 20 70 49 6e 66 6f 2d  >nKey);.  pInfo-
91a0: 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20  >nPayload = 0;. 
91b0: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
91c0: 20 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61   0;.  pInfo->pPa
91d0: 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 72 65 74  yload = 0;.  ret
91e0: 75 72 6e 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  urn;.}.static vo
91f0: 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  id btreeParseCel
9200: 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67 65 20  lPtr(.  MemPage 
9210: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
9220: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
9230: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
9240: 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
9250: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
9260: 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  ter to the cell 
9270: 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  text. */.  CellI
9280: 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20  nfo *pInfo      
9290: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68     /* Fill in th
92a0: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
92b0: 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 3b 20  ){.  u8 *pIter; 
92c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
92d0: 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 68 72  For scanning thr
92e0: 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  ough pCell */.  
92f0: 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20  u32 nPayload;   
9300: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
9310: 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65  r of bytes of ce
9320: 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20  ll payload */.  
9330: 75 36 34 20 69 4b 65 79 3b 20 20 20 20 20 20 20  u64 iKey;       
9340: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
9350: 63 74 65 64 20 4b 65 79 20 76 61 6c 75 65 20 2a  cted Key value *
9360: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
9370: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
9380: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
9390: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
93a0: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c  pPage->leaf==0 |
93b0: 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31  | pPage->leaf==1
93c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
93d0: 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20  age->intKeyLeaf 
93e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
93f0: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
9400: 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65 72 20 3d  ==0 );.  pIter =
9410: 20 70 43 65 6c 6c 3b 0a 0a 20 20 2f 2a 20 54 68   pCell;..  /* Th
9420: 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20  e next block of 
9430: 63 6f 64 65 20 69 73 20 65 71 75 69 76 61 6c 65  code is equivale
9440: 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  nt to:.  **.  **
9450: 20 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65       pIter += ge
9460: 74 56 61 72 69 6e 74 33 32 28 70 49 74 65 72 2c  tVarint32(pIter,
9470: 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 2a 2a   nPayload);.  **
9480: 0a 20 20 2a 2a 20 54 68 65 20 63 6f 64 65 20 69  .  ** The code i
9490: 73 20 69 6e 6c 69 6e 65 64 20 74 6f 20 61 76 6f  s inlined to avo
94a0: 69 64 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61  id a function ca
94b0: 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 6e 50 61 79 6c  ll..  */.  nPayl
94c0: 6f 61 64 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20  oad = *pIter;.  
94d0: 69 66 28 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78  if( nPayload>=0x
94e0: 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45  80 ){.    u8 *pE
94f0: 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a  nd = &pIter[8];.
9500: 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20      nPayload &= 
9510: 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20  0x7f;.    do{.  
9520: 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28      nPayload = (
9530: 6e 50 61 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28  nPayload<<7) | (
9540: 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29  *++pIter & 0x7f)
9550: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2a  ;.    }while( (*
9560: 70 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20  pIter)>=0x80 && 
9570: 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20  pIter<pEnd );.  
9580: 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20  }.  pIter++;..  
9590: 2f 2a 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63  /* The next bloc
95a0: 6b 20 6f 66 20 63 6f 64 65 20 69 73 20 65 71 75  k of code is equ
95b0: 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a  ivalent to:.  **
95c0: 0a 20 20 2a 2a 20 20 20 20 20 70 49 74 65 72 20  .  **     pIter 
95d0: 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 70 49 74  += getVarint(pIt
95e0: 65 72 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f  er, (u64*)&pInfo
95f0: 2d 3e 6e 4b 65 79 29 3b 0a 20 20 2a 2a 0a 20 20  ->nKey);.  **.  
9600: 2a 2a 20 54 68 65 20 63 6f 64 65 20 69 73 20 69  ** The code is i
9610: 6e 6c 69 6e 65 64 20 74 6f 20 61 76 6f 69 64 20  nlined to avoid 
9620: 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e  a function call.
9630: 0a 20 20 2a 2f 0a 20 20 69 4b 65 79 20 3d 20 2a  .  */.  iKey = *
9640: 70 49 74 65 72 3b 0a 20 20 69 66 28 20 69 4b 65  pIter;.  if( iKe
9650: 79 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 75  y>=0x80 ){.    u
9660: 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65 72  8 *pEnd = &pIter
9670: 5b 37 5d 3b 0a 20 20 20 20 69 4b 65 79 20 26 3d  [7];.    iKey &=
9680: 20 30 78 37 66 3b 0a 20 20 20 20 77 68 69 6c 65   0x7f;.    while
9690: 28 31 29 7b 0a 20 20 20 20 20 20 69 4b 65 79 20  (1){.      iKey 
96a0: 3d 20 28 69 4b 65 79 3c 3c 37 29 20 7c 20 28 2a  = (iKey<<7) | (*
96b0: 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b  ++pIter & 0x7f);
96c0: 0a 20 20 20 20 20 20 69 66 28 20 28 2a 70 49 74  .      if( (*pIt
96d0: 65 72 29 3c 30 78 38 30 20 29 20 62 72 65 61 6b  er)<0x80 ) break
96e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ;.      if( pIte
96f0: 72 3e 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20 20  r>=pEnd ){.     
9700: 20 20 20 69 4b 65 79 20 3d 20 28 69 4b 65 79 3c     iKey = (iKey<
9710: 3c 38 29 20 7c 20 2a 2b 2b 70 49 74 65 72 3b 0a  <8) | *++pIter;.
9720: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9730: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
9740: 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20 70  .  pIter++;..  p
9750: 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 2a 28 69  Info->nKey = *(i
9760: 36 34 2a 29 26 69 4b 65 79 3b 0a 20 20 70 49 6e  64*)&iKey;.  pIn
9770: 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e  fo->nPayload = n
9780: 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f  Payload;.  pInfo
9790: 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70 49 74  ->pPayload = pIt
97a0: 65 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  er;.  testcase( 
97b0: 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d  nPayload==pPage-
97c0: 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74  >maxLocal );.  t
97d0: 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61  estcase( nPayloa
97e0: 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d==pPage->maxLoc
97f0: 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 50  al+1 );.  if( nP
9800: 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d  ayload<=pPage->m
9810: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f  axLocal ){.    /
9820: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65  * This is the (e
9830: 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65  asy) common case
9840: 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72   where the entir
9850: 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20  e payload fits. 
9860: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63     ** on the loc
9870: 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65  al page.  No ove
9880: 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65  rflow is require
9890: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  d..    */.    pI
98a0: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50 61  nfo->nSize = nPa
98b0: 79 6c 6f 61 64 20 2b 20 28 75 31 36 29 28 70 49  yload + (u16)(pI
98c0: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
98d0: 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53 69    if( pInfo->nSi
98e0: 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53  ze<4 ) pInfo->nS
98f0: 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e  ize = 4;.    pIn
9900: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
9910: 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65  6)nPayload;.  }e
9920: 6c 73 65 7b 0a 20 20 20 20 62 74 72 65 65 50 61  lse{.    btreePa
9930: 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a  rseCellAdjustSiz
9940: 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50 61  eForOverflow(pPa
9950: 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f  ge, pCell, pInfo
9960: 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
9970: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
9980: 65 6c 6c 50 74 72 49 6e 64 65 78 28 0a 20 20 4d  ellPtrIndex(.  M
9990: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
99a0: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
99b0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65  ontaining the ce
99c0: 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  ll */.  u8 *pCel
99d0: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
99e0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
99f0: 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a  e cell text. */.
9a00: 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66    CellInfo *pInf
9a10: 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  o         /* Fil
9a20: 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  l in this struct
9a30: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a  ure */.){.  u8 *
9a40: 70 49 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  pIter;          
9a50: 20 20 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e      /* For scann
9a60: 69 6e 67 20 74 68 72 6f 75 67 68 20 70 43 65 6c  ing through pCel
9a70: 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c  l */.  u32 nPayl
9a80: 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f  oad;           /
9a90: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
9aa0: 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61  s of cell payloa
9ab0: 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
9ac0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
9ad0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
9ae0: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
9af0: 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  t( pPage->leaf==
9b00: 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66  0 || pPage->leaf
9b10: 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
9b20: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65   pPage->intKeyLe
9b30: 61 66 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65 72  af==0 );.  pIter
9b40: 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67 65   = pCell + pPage
9b50: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
9b60: 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49    nPayload = *pI
9b70: 74 65 72 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c  ter;.  if( nPayl
9b80: 6f 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20  oad>=0x80 ){.   
9b90: 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74   u8 *pEnd = &pIt
9ba0: 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c  er[8];.    nPayl
9bb0: 6f 61 64 20 26 3d 20 30 78 37 66 3b 0a 20 20 20  oad &= 0x7f;.   
9bc0: 20 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c   do{.      nPayl
9bd0: 6f 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c  oad = (nPayload<
9be0: 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20  <7) | (*++pIter 
9bf0: 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68  & 0x7f);.    }wh
9c00: 69 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d 30  ile( *(pIter)>=0
9c10: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
9c20: 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72  d );.  }.  pIter
9c30: 2b 2b 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65  ++;.  pInfo->nKe
9c40: 79 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  y = nPayload;.  
9c50: 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20  pInfo->nPayload 
9c60: 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49  = nPayload;.  pI
9c70: 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20  nfo->pPayload = 
9c80: 70 49 74 65 72 3b 0a 20 20 74 65 73 74 63 61 73  pIter;.  testcas
9c90: 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61  e( nPayload==pPa
9ca0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  ge->maxLocal );.
9cb0: 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79    testcase( nPay
9cc0: 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  load==pPage->max
9cd0: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28  Local+1 );.  if(
9ce0: 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65   nPayload<=pPage
9cf0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20  ->maxLocal ){.  
9d00: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
9d10: 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63   (easy) common c
9d20: 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65 6e  ase where the en
9d30: 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74  tire payload fit
9d40: 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20  s.    ** on the 
9d50: 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20  local page.  No 
9d60: 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75  overflow is requ
9d70: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
9d80: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20   pInfo->nSize = 
9d90: 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75 31 36 29  nPayload + (u16)
9da0: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b  (pIter - pCell);
9db0: 0a 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e  .    if( pInfo->
9dc0: 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d  nSize<4 ) pInfo-
9dd0: 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20  >nSize = 4;.    
9de0: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
9df0: 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20  (u16)nPayload;. 
9e00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 74 72 65   }else{.    btre
9e10: 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75 73 74  eParseCellAdjust
9e20: 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28  SizeForOverflow(
9e30: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49  pPage, pCell, pI
9e40: 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  nfo);.  }.}.stat
9e50: 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72  ic void btreePar
9e60: 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  seCell(.  MemPag
9e70: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
9e80: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
9e90: 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ning the cell */
9ea0: 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20  .  int iCell,   
9eb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
9ec0: 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46  e cell index.  F
9ed0: 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20 2a  irst cell is 0 *
9ee0: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
9ef0: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
9f00: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
9f10: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 50  cture */.){.  pP
9f20: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
9f30: 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28  pPage, findCell(
9f40: 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 2c 20 70  pPage, iCell), p
9f50: 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Info);.}../*.** 
9f60: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  The following ro
9f70: 75 74 69 6e 65 73 20 61 72 65 20 69 6d 70 6c 65  utines are imple
9f80: 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68  mentations of th
9f90: 65 20 4d 65 6d 50 61 67 65 2e 78 43 65 6c 6c 53  e MemPage.xCellS
9fa0: 69 7a 65 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a  ize.** method..*
9fb0: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
9fc0: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
9fd0: 20 62 79 74 65 73 20 74 68 61 74 20 61 20 43 65   bytes that a Ce
9fe0: 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65 20  ll needs in the 
9ff0: 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65  cell.** data are
a000: 61 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d 70  a of the btree-p
a010: 61 67 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e  age.  The return
a020: 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65 73   number includes
a030: 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74   the cell.** dat
a040: 61 20 68 65 61 64 65 72 20 61 6e 64 20 74 68 65  a header and the
a050: 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20   local payload, 
a060: 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72  but not any over
a070: 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20  flow page or.** 
a080: 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20 62  the space used b
a090: 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  y the cell point
a0a0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 63 65 6c 6c 53 69  er..**.** cellSi
a0b0: 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 29  zePtrNoPayload()
a0c0: 20 20 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 69      =>   table i
a0d0: 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a  nternal nodes.**
a0e0: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 29 20 20   cellSizePtr()  
a0f0: 20 20 20 20 20 20 20 20 20 20 20 3d 3e 20 20 20             =>   
a100: 61 6c 6c 20 69 6e 64 65 78 20 6e 6f 64 65 73 20  all index nodes 
a110: 26 20 74 61 62 6c 65 20 6c 65 61 66 20 6e 6f 64  & table leaf nod
a120: 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36  es.*/.static u16
a130: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d   cellSizePtr(Mem
a140: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20  Page *pPage, u8 
a150: 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70  *pCell){.  u8 *p
a160: 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70  Iter = pCell + p
a170: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
a180: 7a 65 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69  ze; /* For loopi
a190: 6e 67 20 6f 76 65 72 20 62 79 74 65 73 20 6f 66  ng over bytes of
a1a0: 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a   pCell */.  u8 *
a1b0: 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  pEnd;           
a1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1d0: 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b       /* End mark
a1e0: 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20 2a 2f   for a varint */
a1f0: 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b 20 20 20  .  u32 nSize;   
a200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a210: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
a220: 69 7a 65 20 76 61 6c 75 65 20 74 6f 20 72 65 74  ize value to ret
a230: 75 72 6e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  urn */..#ifdef S
a240: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
a250: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
a260: 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ned by this func
a270: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61  tion should alwa
a280: 79 73 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  ys be the same a
a290: 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c  s.  ** the (Cell
a2a0: 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75  Info.nSize) valu
a2b0: 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67  e found by doing
a2c0: 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f 66   a full parse of
a2d0: 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20   the.  ** cell. 
a2e0: 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  If SQLITE_DEBUG 
a2f0: 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61  is defined, an a
a300: 73 73 65 72 74 28 29 20 61 74 20 74 68 65 20 62  ssert() at the b
a310: 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68  ottom of.  ** th
a320: 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72 69  is function veri
a330: 66 69 65 73 20 74 68 61 74 20 74 68 69 73 20 69  fies that this i
a340: 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74 20  nvariant is not 
a350: 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43  violated. */.  C
a360: 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e 66  ellInfo debuginf
a370: 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72  o;.  pPage->xPar
a380: 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  seCell(pPage, pC
a390: 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f 29  ell, &debuginfo)
a3a0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 6e 53 69 7a  ;.#endif..  nSiz
a3b0: 65 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66  e = *pIter;.  if
a3c0: 28 20 6e 53 69 7a 65 3e 3d 30 78 38 30 20 29 7b  ( nSize>=0x80 ){
a3d0: 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74  .    pEnd = &pIt
a3e0: 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 53 69 7a 65  er[8];.    nSize
a3f0: 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64 6f   &= 0x7f;.    do
a400: 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20  {.      nSize = 
a410: 28 6e 53 69 7a 65 3c 3c 37 29 20 7c 20 28 2a 2b  (nSize<<7) | (*+
a420: 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a  +pIter & 0x7f);.
a430: 20 20 20 20 7d 77 68 69 6c 65 28 20 2a 28 70 49      }while( *(pI
a440: 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70 49  ter)>=0x80 && pI
a450: 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a  ter<pEnd );.  }.
a460: 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20 69 66 28    pIter++;.  if(
a470: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
a480: 7b 0a 20 20 20 20 2f 2a 20 70 49 74 65 72 20 6e  {.    /* pIter n
a490: 6f 77 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65  ow points at the
a4a0: 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20   64-bit integer 
a4b0: 6b 65 79 20 76 61 6c 75 65 2c 20 61 20 76 61 72  key value, a var
a4c0: 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20 20  iable length .  
a4d0: 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54 68    ** integer. Th
a4e0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63  e following bloc
a4f0: 6b 20 6d 6f 76 65 73 20 70 49 74 65 72 20 74 6f  k moves pIter to
a500: 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 66 69   point at the fi
a510: 72 73 74 20 62 79 74 65 0a 20 20 20 20 2a 2a 20  rst byte.    ** 
a520: 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
a530: 74 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20 2a  the key value. *
a540: 2f 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49  /.    pEnd = &pI
a550: 74 65 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c  ter[9];.    whil
a560: 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30 78  e( (*pIter++)&0x
a570: 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64  80 && pIter<pEnd
a580: 20 29 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63 61   );.  }.  testca
a590: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
a5a0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
a5b0: 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d  testcase( nSize=
a5c0: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
a5d0: 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 53 69 7a  +1 );.  if( nSiz
a5e0: 65 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e<=pPage->maxLoc
a5f0: 61 6c 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20  al ){.    nSize 
a600: 2b 3d 20 28 75 33 32 29 28 70 49 74 65 72 20 2d  += (u32)(pIter -
a610: 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28   pCell);.    if(
a620: 20 6e 53 69 7a 65 3c 34 20 29 20 6e 53 69 7a 65   nSize<4 ) nSize
a630: 20 3d 20 34 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 4;.  }else{. 
a640: 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20     int minLocal 
a650: 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61  = pPage->minLoca
a660: 6c 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d  l;.    nSize = m
a670: 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a 65  inLocal + (nSize
a680: 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20 28   - minLocal) % (
a690: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
a6a0: 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20  leSize - 4);.   
a6b0: 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65   testcase( nSize
a6c0: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
a6d0: 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  l );.    testcas
a6e0: 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d  e( nSize==pPage-
a6f0: 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
a700: 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50 61     if( nSize>pPa
a710: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a  ge->maxLocal ){.
a720: 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69        nSize = mi
a730: 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20  nLocal;.    }.  
a740: 20 20 6e 53 69 7a 65 20 2b 3d 20 34 20 2b 20 28    nSize += 4 + (
a750: 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65  u16)(pIter - pCe
a760: 6c 6c 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ll);.  }.  asser
a770: 74 28 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67 69  t( nSize==debugi
a780: 6e 66 6f 2e 6e 53 69 7a 65 20 7c 7c 20 43 4f 52  nfo.nSize || COR
a790: 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 72 65 74  RUPT_DB );.  ret
a7a0: 75 72 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a  urn (u16)nSize;.
a7b0: 7d 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c  }.static u16 cel
a7c0: 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61  lSizePtrNoPayloa
a7d0: 64 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  d(MemPage *pPage
a7e0: 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20  , u8 *pCell){.  
a7f0: 75 38 20 2a 70 49 74 65 72 20 3d 20 70 43 65 6c  u8 *pIter = pCel
a800: 6c 20 2b 20 34 3b 20 2f 2a 20 46 6f 72 20 6c 6f  l + 4; /* For lo
a810: 6f 70 69 6e 67 20 6f 76 65 72 20 62 79 74 65 73  oping over bytes
a820: 20 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75   of pCell */.  u
a830: 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20 20  8 *pEnd;        
a840: 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61 72        /* End mar
a850: 6b 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20 2a  k for a varint *
a860: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
a870: 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20  _DEBUG.  /* The 
a880: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
a890: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  y this function 
a8a0: 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65  should always be
a8b0: 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a   the same as.  *
a8c0: 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e  * the (CellInfo.
a8d0: 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75  nSize) value fou
a8e0: 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75  nd by doing a fu
a8f0: 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a  ll parse of the.
a900: 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51    ** cell. If SQ
a910: 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65  LITE_DEBUG is de
a920: 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74  fined, an assert
a930: 28 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d  () at the bottom
a940: 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75   of.  ** this fu
a950: 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20  nction verifies 
a960: 74 68 61 74 20 74 68 69 73 20 69 6e 76 61 72 69  that this invari
a970: 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61  ant is not viola
a980: 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  ted. */.  CellIn
a990: 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20  fo debuginfo;.  
a9a0: 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
a9b0: 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  l(pPage, pCell, 
a9c0: 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6c  &debuginfo);.#el
a9d0: 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  se.  UNUSED_PARA
a9e0: 4d 45 54 45 52 28 70 50 61 67 65 29 3b 0a 23 65  METER(pPage);.#e
a9f0: 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
aa00: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
aa10: 69 7a 65 3d 3d 34 20 29 3b 0a 20 20 70 45 6e 64  ize==4 );.  pEnd
aa20: 20 3d 20 70 49 74 65 72 20 2b 20 39 3b 0a 20 20   = pIter + 9;.  
aa30: 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b  while( (*pIter++
aa40: 29 26 30 78 38 30 20 26 26 20 70 49 74 65 72 3c  )&0x80 && pIter<
aa50: 70 45 6e 64 20 29 3b 0a 20 20 61 73 73 65 72 74  pEnd );.  assert
aa60: 28 20 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a  ( debuginfo.nSiz
aa70: 65 3d 3d 28 75 31 36 29 28 70 49 74 65 72 20 2d  e==(u16)(pIter -
aa80: 20 70 43 65 6c 6c 29 20 7c 7c 20 43 4f 52 52 55   pCell) || CORRU
aa90: 50 54 5f 44 42 20 29 3b 0a 20 20 72 65 74 75 72  PT_DB );.  retur
aaa0: 6e 20 28 75 31 36 29 28 70 49 74 65 72 20 2d 20  n (u16)(pIter - 
aab0: 70 43 65 6c 6c 29 3b 0a 7d 0a 0a 0a 23 69 66 64  pCell);.}...#ifd
aac0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
aad0: 2f 2a 20 54 68 69 73 20 76 61 72 69 61 74 69 6f  /* This variatio
aae0: 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72  n on cellSizePtr
aaf0: 28 29 20 69 73 20 75 73 65 64 20 69 6e 73 69 64  () is used insid
ab00: 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  e of assert() st
ab10: 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79  atements.** only
ab20: 2e 20 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20  . */.static u16 
ab30: 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65  cellSize(MemPage
ab40: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65   *pPage, int iCe
ab50: 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  ll){.  return pP
ab60: 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70  age->xCellSize(p
ab70: 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70  Page, findCell(p
ab80: 50 61 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d  Page, iCell));.}
ab90: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
aba0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
abb0: 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66  OVACUUM./*.** If
abc0: 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c   the cell pCell,
abd0: 20 70 61 72 74 20 6f 66 20 70 61 67 65 20 70 50   part of page pP
abe0: 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  age contains a p
abf0: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20  ointer.** to an 
ac00: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69  overflow page, i
ac10: 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69  nsert an entry i
ac20: 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  nto the pointer-
ac30: 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f  map.** for the o
ac40: 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f  verflow page..*/
ac50: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 74 72  .static void ptr
ac60: 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65  mapPutOvflPtr(Me
ac70: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
ac80: 20 2a 70 43 65 6c 6c 2c 20 69 6e 74 20 2a 70 52   *pCell, int *pR
ac90: 43 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  C){.  CellInfo i
aca0: 6e 66 6f 3b 0a 20 20 69 66 28 20 2a 70 52 43 20  nfo;.  if( *pRC 
acb0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
acc0: 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a  rt( pCell!=0 );.
acd0: 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
ace0: 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
acf0: 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20  , &info);.  if( 
ad00: 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f  info.nLocal<info
ad10: 2e 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20  .nPayload ){.   
ad20: 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74   Pgno ovfl = get
ad30: 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
ad40: 6f 2e 6e 53 69 7a 65 2d 34 5d 29 3b 0a 20 20 20  o.nSize-4]);.   
ad50: 20 70 74 72 6d 61 70 50 75 74 28 70 50 61 67 65   ptrmapPut(pPage
ad60: 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52  ->pBt, ovfl, PTR
ad70: 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70  MAP_OVERFLOW1, p
ad80: 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 52 43 29  Page->pgno, pRC)
ad90: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
ada0: 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e  ./*.** Defragmen
adb0: 74 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e  t the page given
adc0: 2e 20 20 41 6c 6c 20 43 65 6c 6c 73 20 61 72 65  .  All Cells are
add0: 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a   moved to the.**
ade0: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65   end of the page
adf0: 20 61 6e 64 20 61 6c 6c 20 66 72 65 65 20 73 70   and all free sp
ae00: 61 63 65 20 69 73 20 63 6f 6c 6c 65 63 74 65 64  ace is collected
ae10: 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67   into one.** big
ae20: 20 46 72 65 65 42 6c 6b 20 74 68 61 74 20 6f 63   FreeBlk that oc
ae30: 63 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 20  curs in between 
ae40: 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 63  the header and c
ae50: 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 61  ell.** pointer a
ae60: 72 72 61 79 20 61 6e 64 20 74 68 65 20 63 65 6c  rray and the cel
ae70: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a  l content area..
ae80: 2a 2a 0a 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f  **.** EVIDENCE-O
ae90: 46 3a 20 52 2d 34 34 35 38 32 2d 36 30 31 33 38  F: R-44582-60138
aea0: 20 53 51 4c 69 74 65 20 6d 61 79 20 66 72 6f 6d   SQLite may from
aeb0: 20 74 69 6d 65 20 74 6f 20 74 69 6d 65 20 72 65   time to time re
aec0: 6f 72 67 61 6e 69 7a 65 20 61 0a 2a 2a 20 62 2d  organize a.** b-
aed0: 74 72 65 65 20 70 61 67 65 20 73 6f 20 74 68 61  tree page so tha
aee0: 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 66  t there are no f
aef0: 72 65 65 62 6c 6f 63 6b 73 20 6f 72 20 66 72 61  reeblocks or fra
af00: 67 6d 65 6e 74 20 62 79 74 65 73 2c 20 61 6c 6c  gment bytes, all
af10: 0a 2a 2a 20 75 6e 75 73 65 64 20 62 79 74 65 73  .** unused bytes
af20: 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69   are contained i
af30: 6e 20 74 68 65 20 75 6e 61 6c 6c 6f 63 61 74 65  n the unallocate
af40: 64 20 73 70 61 63 65 20 72 65 67 69 6f 6e 2c 20  d space region, 
af50: 61 6e 64 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c 73  and all.** cells
af60: 20 61 72 65 20 70 61 63 6b 65 64 20 74 69 67 68   are packed tigh
af70: 74 6c 79 20 61 74 20 74 68 65 20 65 6e 64 20 6f  tly at the end o
af80: 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73  f the page..*/.s
af90: 74 61 74 69 63 20 69 6e 74 20 64 65 66 72 61 67  tatic int defrag
afa0: 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65  mentPage(MemPage
afb0: 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   *pPage){.  int 
afc0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
afd0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
afe0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
aff0: 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pc;             
b000: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
b010: 73 20 6f 66 20 74 68 65 20 69 2d 74 68 20 63 65  s of the i-th ce
b020: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b  ll */.  int hdr;
b030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b040: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
b050: 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20  the page header 
b060: 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20  */.  int size;  
b070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b080: 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c  /* Size of a cel
b090: 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c  l */.  int usabl
b0a0: 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  eSize;          
b0b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75    /* Number of u
b0c0: 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61  sable bytes on a
b0d0: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63   page */.  int c
b0e0: 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20  ellOffset;      
b0f0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
b100: 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  to the cell poin
b110: 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69  ter array */.  i
b120: 6e 74 20 63 62 72 6b 3b 20 20 20 20 20 20 20 20  nt cbrk;        
b130: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
b140: 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
b150: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
b160: 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20    int nCell;    
b170: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b180: 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
b190: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
b1a0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
b1b0: 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54  data;       /* T
b1c0: 68 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  he page data */.
b1d0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
b1e0: 2a 74 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20  *temp;       /* 
b1f0: 54 65 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65  Temp area for ce
b200: 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ll content */.  
b210: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73  unsigned char *s
b220: 72 63 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 6f  rc;        /* So
b230: 75 72 63 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20  urce of content 
b240: 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 46 69  */.  int iCellFi
b250: 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  rst;            
b260: 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62  /* First allowab
b270: 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f  le cell index */
b280: 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74  .  int iCellLast
b290: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
b2a0: 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20 63   Last possible c
b2b0: 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a 0a 20  ell index */... 
b2c0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
b2d0: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
b2e0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
b2f0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
b300: 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20  age->pBt!=0 );. 
b310: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
b320: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
b330: 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  <= SQLITE_MAX_PA
b340: 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61 73 73  GE_SIZE );.  ass
b350: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
b360: 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73  rflow==0 );.  as
b370: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
b380: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
b390: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
b3a0: 20 74 65 6d 70 20 3d 20 30 3b 0a 20 20 73 72 63   temp = 0;.  src
b3b0: 20 3d 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d   = data = pPage-
b3c0: 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20  >aData;.  hdr = 
b3d0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
b3e0: 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ;.  cellOffset =
b3f0: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
b400: 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50  et;.  nCell = pP
b410: 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73  age->nCell;.  as
b420: 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74  sert( nCell==get
b430: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
b440: 33 5d 29 20 29 3b 0a 20 20 75 73 61 62 6c 65 53  3]) );.  usableS
b450: 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  ize = pPage->pBt
b460: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
b470: 63 62 72 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a  cbrk = usableSiz
b480: 65 3b 0a 20 20 69 43 65 6c 6c 46 69 72 73 74 20  e;.  iCellFirst 
b490: 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  = cellOffset + 2
b4a0: 2a 6e 43 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c  *nCell;.  iCellL
b4b0: 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ast = usableSize
b4c0: 20 2d 20 34 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   - 4;.  for(i=0;
b4d0: 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
b4e0: 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b 20 20      u8 *pAddr;  
b4f0: 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63     /* The i-th c
b500: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  ell pointer */. 
b510: 20 20 20 70 41 64 64 72 20 3d 20 26 64 61 74 61     pAddr = &data
b520: 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a  [cellOffset + i*
b530: 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74  2];.    pc = get
b540: 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20  2byte(pAddr);.  
b550: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
b560: 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20  iCellFirst );.  
b570: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
b580: 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20  iCellLast );.   
b590: 20 2f 2a 20 54 68 65 73 65 20 63 6f 6e 64 69 74   /* These condit
b5a0: 69 6f 6e 73 20 68 61 76 65 20 61 6c 72 65 61 64  ions have alread
b5b0: 79 20 62 65 65 6e 20 76 65 72 69 66 69 65 64 20  y been verified 
b5c0: 69 6e 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  in btreeInitPage
b5d0: 28 29 0a 20 20 20 20 2a 2a 20 69 66 20 50 52 41  ().    ** if PRA
b5e0: 47 4d 41 20 63 65 6c 6c 5f 73 69 7a 65 5f 63 68  GMA cell_size_ch
b5f0: 65 63 6b 3d 4f 4e 2e 0a 20 20 20 20 2a 2f 0a 20  eck=ON..    */. 
b600: 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46     if( pc<iCellF
b610: 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c  irst || pc>iCell
b620: 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65  Last ){.      re
b630: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
b640: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
b650: 20 20 20 20 61 73 73 65 72 74 28 20 70 63 3e 3d      assert( pc>=
b660: 69 43 65 6c 6c 46 69 72 73 74 20 26 26 20 70 63  iCellFirst && pc
b670: 3c 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20  <=iCellLast );. 
b680: 20 20 20 73 69 7a 65 20 3d 20 70 50 61 67 65 2d     size = pPage-
b690: 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65  >xCellSize(pPage
b6a0: 2c 20 26 73 72 63 5b 70 63 5d 29 3b 0a 20 20 20  , &src[pc]);.   
b6b0: 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20   cbrk -= size;. 
b6c0: 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65 6c     if( cbrk<iCel
b6d0: 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b 73 69 7a  lFirst || pc+siz
b6e0: 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  e>usableSize ){.
b6f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
b700: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
b710: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
b720: 72 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d 75  rt( cbrk+size<=u
b730: 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63 62 72  sableSize && cbr
b740: 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  k>=iCellFirst );
b750: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 63  .    testcase( c
b760: 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65  brk+size==usable
b770: 53 69 7a 65 20 29 3b 0a 20 20 20 20 74 65 73 74  Size );.    test
b780: 63 61 73 65 28 20 70 63 2b 73 69 7a 65 3d 3d 75  case( pc+size==u
b790: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
b7a0: 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72 2c   put2byte(pAddr,
b7b0: 20 63 62 72 6b 29 3b 0a 20 20 20 20 69 66 28 20   cbrk);.    if( 
b7c0: 74 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  temp==0 ){.     
b7d0: 20 69 6e 74 20 78 3b 0a 20 20 20 20 20 20 69 66   int x;.      if
b7e0: 28 20 63 62 72 6b 3d 3d 70 63 20 29 20 63 6f 6e  ( cbrk==pc ) con
b7f0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 74 65 6d  tinue;.      tem
b800: 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  p = sqlite3Pager
b810: 54 65 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d  TempSpace(pPage-
b820: 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  >pBt->pPager);. 
b830: 20 20 20 20 20 78 20 3d 20 67 65 74 32 62 79 74       x = get2byt
b840: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
b850: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 74  .      memcpy(&t
b860: 65 6d 70 5b 78 5d 2c 20 26 64 61 74 61 5b 78 5d  emp[x], &data[x]
b870: 2c 20 28 63 62 72 6b 2b 73 69 7a 65 29 20 2d 20  , (cbrk+size) - 
b880: 78 29 3b 0a 20 20 20 20 20 20 73 72 63 20 3d 20  x);.      src = 
b890: 74 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  temp;.    }.    
b8a0: 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63 62 72  memcpy(&data[cbr
b8b0: 6b 5d 2c 20 26 73 72 63 5b 70 63 5d 2c 20 73 69  k], &src[pc], si
b8c0: 7a 65 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ze);.  }.  asser
b8d0: 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69  t( cbrk>=iCellFi
b8e0: 72 73 74 20 29 3b 0a 20 20 70 75 74 32 62 79 74  rst );.  put2byt
b8f0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
b900: 63 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64  cbrk);.  data[hd
b910: 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61  r+1] = 0;.  data
b920: 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64  [hdr+2] = 0;.  d
b930: 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
b940: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69    memset(&data[i
b950: 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63  CellFirst], 0, c
b960: 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b  brk-iCellFirst);
b970: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
b980: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
b990: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
b9a0: 65 29 20 29 3b 0a 20 20 69 66 28 20 63 62 72 6b  e) );.  if( cbrk
b9b0: 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d 70 50 61  -iCellFirst!=pPa
b9c0: 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20  ge->nFree ){.   
b9d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
b9e0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
b9f0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
ba00: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
ba10: 61 72 63 68 20 74 68 65 20 66 72 65 65 2d 6c 69  arch the free-li
ba20: 73 74 20 6f 6e 20 70 61 67 65 20 70 50 67 20 66  st on page pPg f
ba30: 6f 72 20 73 70 61 63 65 20 74 6f 20 73 74 6f 72  or space to stor
ba40: 65 20 61 20 63 65 6c 6c 20 6e 42 79 74 65 20 62  e a cell nByte b
ba50: 79 74 65 73 20 69 6e 0a 2a 2a 20 73 69 7a 65 2e  ytes in.** size.
ba60: 20 49 66 20 6f 6e 65 20 63 61 6e 20 62 65 20 66   If one can be f
ba70: 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 61 20 70  ound, return a p
ba80: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 70  ointer to the sp
ba90: 61 63 65 20 61 6e 64 20 72 65 6d 6f 76 65 20 69  ace and remove i
baa0: 74 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 72  t.** from the fr
bab0: 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49  ee-list..**.** I
bac0: 66 20 6e 6f 20 73 75 69 74 61 62 6c 65 20 73 70  f no suitable sp
bad0: 61 63 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  ace can be found
bae0: 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
baf0: 74 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  t, return NULL..
bb00: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
bb10: 69 6f 6e 20 6d 61 79 20 64 65 74 65 63 74 20 63  ion may detect c
bb20: 6f 72 72 75 70 74 69 6f 6e 20 77 69 74 68 69 6e  orruption within
bb30: 20 70 50 67 2e 20 20 49 66 20 63 6f 72 72 75 70   pPg.  If corrup
bb40: 74 69 6f 6e 20 69 73 0a 2a 2a 20 64 65 74 65 63  tion is.** detec
bb50: 74 65 64 20 74 68 65 6e 20 2a 70 52 63 20 69 73  ted then *pRc is
bb60: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 43   set to SQLITE_C
bb70: 4f 52 52 55 50 54 20 61 6e 64 20 4e 55 4c 4c 20  ORRUPT and NULL 
bb80: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
bb90: 2a 2a 20 53 6c 6f 74 73 20 6f 6e 20 74 68 65 20  ** Slots on the 
bba0: 66 72 65 65 20 6c 69 73 74 20 74 68 61 74 20 61  free list that a
bbb0: 72 65 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64  re between 1 and
bbc0: 20 33 20 62 79 74 65 73 20 6c 61 72 67 65 72 20   3 bytes larger 
bbd0: 74 68 61 6e 20 6e 42 79 74 65 0a 2a 2a 20 77 69  than nByte.** wi
bbe0: 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64 20 69 66  ll be ignored if
bbf0: 20 61 64 64 69 6e 67 20 74 68 65 20 65 78 74 72   adding the extr
bc00: 61 20 73 70 61 63 65 20 74 6f 20 74 68 65 20 66  a space to the f
bc10: 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 75  ragmentation cou
bc20: 6e 74 0a 2a 2a 20 63 61 75 73 65 73 20 74 68 65  nt.** causes the
bc30: 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 63   fragmentation c
bc40: 6f 75 6e 74 20 74 6f 20 65 78 63 65 65 64 20 36  ount to exceed 6
bc50: 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20  0..*/.static u8 
bc60: 2a 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 4d 65  *pageFindSlot(Me
bc70: 6d 50 61 67 65 20 2a 70 50 67 2c 20 69 6e 74 20  mPage *pPg, int 
bc80: 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 52 63 29  nByte, int *pRc)
bc90: 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64  {.  const int hd
bca0: 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f 66 66 73  r = pPg->hdrOffs
bcb0: 65 74 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74  et;.  u8 * const
bcc0: 20 61 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44   aData = pPg->aD
bcd0: 61 74 61 3b 0a 20 20 69 6e 74 20 69 41 64 64 72  ata;.  int iAddr
bce0: 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69 6e   = hdr + 1;.  in
bcf0: 74 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28  t pc = get2byte(
bd00: 26 61 44 61 74 61 5b 69 41 64 64 72 5d 29 3b 0a  &aData[iAddr]);.
bd10: 20 20 69 6e 74 20 78 3b 0a 20 20 69 6e 74 20 75    int x;.  int u
bd20: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 67 2d  sableSize = pPg-
bd30: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
bd40: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 63 3e  ;..  assert( pc>
bd50: 30 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 69  0 );.  do{.    i
bd60: 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20  nt size;        
bd70: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
bd80: 68 65 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a  he free slot */.
bd90: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
bda0: 4f 46 3a 20 52 2d 30 36 38 36 36 2d 33 39 31 32  OF: R-06866-3912
bdb0: 35 20 46 72 65 65 62 6c 6f 63 6b 73 20 61 72 65  5 Freeblocks are
bdc0: 20 61 6c 77 61 79 73 20 63 6f 6e 6e 65 63 74 65   always connecte
bdd0: 64 20 69 6e 20 6f 72 64 65 72 20 6f 66 0a 20 20  d in order of.  
bde0: 20 20 2a 2a 20 69 6e 63 72 65 61 73 69 6e 67 20    ** increasing 
bdf0: 6f 66 66 73 65 74 2e 20 2a 2f 0a 20 20 20 20 69  offset. */.    i
be00: 66 28 20 70 63 3e 75 73 61 62 6c 65 53 69 7a 65  f( pc>usableSize
be10: 2d 34 20 7c 7c 20 70 63 3c 69 41 64 64 72 2b 34  -4 || pc<iAddr+4
be20: 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d   ){.      *pRc =
be30: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
be40: 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75  BKPT;.      retu
be50: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
be60: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
be70: 52 2d 32 32 37 31 30 2d 35 33 33 32 38 20 54 68  R-22710-53328 Th
be80: 65 20 74 68 69 72 64 20 61 6e 64 20 66 6f 75 72  e third and four
be90: 74 68 20 62 79 74 65 73 20 6f 66 20 65 61 63 68  th bytes of each
bea0: 0a 20 20 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63  .    ** freebloc
beb0: 6b 20 66 6f 72 6d 20 61 20 62 69 67 2d 65 6e 64  k form a big-end
bec0: 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
bed0: 68 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66  h is the size of
bee0: 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 0a 20   the freeblock. 
bef0: 20 20 20 2a 2a 20 69 6e 20 62 79 74 65 73 2c 20     ** in bytes, 
bf00: 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 34 2d  including the 4-
bf10: 62 79 74 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a  byte header. */.
bf20: 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62      size = get2b
bf30: 79 74 65 28 26 61 44 61 74 61 5b 70 63 2b 32 5d  yte(&aData[pc+2]
bf40: 29 3b 0a 20 20 20 20 69 66 28 20 28 78 20 3d 20  );.    if( (x = 
bf50: 73 69 7a 65 20 2d 20 6e 42 79 74 65 29 3e 3d 30  size - nByte)>=0
bf60: 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
bf70: 73 65 28 20 78 3d 3d 34 20 29 3b 0a 20 20 20 20  se( x==4 );.    
bf80: 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 33    testcase( x==3
bf90: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 63   );.      if( pc
bfa0: 20 3c 20 70 50 67 2d 3e 63 65 6c 6c 4f 66 66 73   < pPg->cellOffs
bfb0: 65 74 2b 32 2a 70 50 67 2d 3e 6e 43 65 6c 6c 20  et+2*pPg->nCell 
bfc0: 7c 7c 20 73 69 7a 65 2b 70 63 20 3e 20 75 73 61  || size+pc > usa
bfd0: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
bfe0: 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45     *pRc = SQLITE
bff0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
c000: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
c010: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
c020: 20 78 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20   x<4 ){.        
c030: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
c040: 52 2d 31 31 34 39 38 2d 35 38 30 32 32 20 49 6e  R-11498-58022 In
c050: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 62   a well-formed b
c060: 2d 74 72 65 65 20 70 61 67 65 2c 20 74 68 65 20  -tree page, the 
c070: 74 6f 74 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a  total.        **
c080: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
c090: 20 69 6e 20 66 72 61 67 6d 65 6e 74 73 20 6d 61   in fragments ma
c0a0: 79 20 6e 6f 74 20 65 78 63 65 65 64 20 36 30 2e  y not exceed 60.
c0b0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
c0c0: 61 44 61 74 61 5b 68 64 72 2b 37 5d 3e 35 37 20  aData[hdr+7]>57 
c0d0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 20  ) return 0;..   
c0e0: 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74       /* Remove t
c0f0: 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74 68 65  he slot from the
c100: 20 66 72 65 65 2d 6c 69 73 74 2e 20 55 70 64 61   free-list. Upda
c110: 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
c120: 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 72 61 67  .        ** frag
c130: 6d 65 6e 74 65 64 20 62 79 74 65 73 20 77 69 74  mented bytes wit
c140: 68 69 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f  hin the page. */
c150: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
c160: 26 61 44 61 74 61 5b 69 41 64 64 72 5d 2c 20 26  &aData[iAddr], &
c170: 61 44 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20  aData[pc], 2);. 
c180: 20 20 20 20 20 20 20 61 44 61 74 61 5b 68 64 72         aData[hdr
c190: 2b 37 5d 20 2b 3d 20 28 75 38 29 78 3b 0a 20 20  +7] += (u8)x;.  
c1a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c1b0: 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20 72     /* The slot r
c1c0: 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20 66 72  emains on the fr
c1d0: 65 65 2d 6c 69 73 74 2e 20 52 65 64 75 63 65 20  ee-list. Reduce 
c1e0: 69 74 73 20 73 69 7a 65 20 74 6f 20 61 63 63 6f  its size to acco
c1f0: 75 6e 74 0a 20 20 20 20 20 20 20 20 20 2a 2a 20  unt.         ** 
c200: 66 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20  for the portion 
c210: 75 73 65 64 20 62 79 20 74 68 65 20 6e 65 77 20  used by the new 
c220: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20  allocation. */. 
c230: 20 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28         put2byte(
c240: 26 61 44 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29  &aData[pc+2], x)
c250: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c260: 72 65 74 75 72 6e 20 26 61 44 61 74 61 5b 70 63  return &aData[pc
c270: 20 2b 20 78 5d 3b 0a 20 20 20 20 7d 0a 20 20 20   + x];.    }.   
c280: 20 69 41 64 64 72 20 3d 20 70 63 3b 0a 20 20 20   iAddr = pc;.   
c290: 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26   pc = get2byte(&
c2a0: 61 44 61 74 61 5b 70 63 5d 29 3b 0a 20 20 7d 77  aData[pc]);.  }w
c2b0: 68 69 6c 65 28 20 70 63 20 29 3b 0a 0a 20 20 72  hile( pc );..  r
c2c0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
c2d0: 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65  * Allocate nByte
c2e0: 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
c2f0: 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20  from within the 
c300: 42 2d 54 72 65 65 20 70 61 67 65 20 70 61 73 73  B-Tree page pass
c310: 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72  ed.** as the fir
c320: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 57 72 69  st argument. Wri
c330: 74 65 20 69 6e 74 6f 20 2a 70 49 64 78 20 74 68  te into *pIdx th
c340: 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50 61  e index into pPa
c350: 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f  ge->aData[].** o
c360: 66 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  f the first byte
c370: 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 73 70   of allocated sp
c380: 61 63 65 2e 20 52 65 74 75 72 6e 20 65 69 74 68  ace. Return eith
c390: 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a  er SQLITE_OK or.
c3a0: 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  ** an error code
c3b0: 20 28 75 73 75 61 6c 6c 79 20 53 51 4c 49 54 45   (usually SQLITE
c3c0: 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a  _CORRUPT)..**.**
c3d0: 20 54 68 65 20 63 61 6c 6c 65 72 20 67 75 61 72   The caller guar
c3e0: 61 6e 74 65 65 73 20 74 68 61 74 20 74 68 65 72  antees that ther
c3f0: 65 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 20  e is sufficient 
c400: 73 70 61 63 65 20 74 6f 20 6d 61 6b 65 20 74 68  space to make th
c410: 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e  e.** allocation.
c420: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
c430: 69 67 68 74 20 6e 65 65 64 20 74 6f 20 64 65 66  ight need to def
c440: 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72 64 65 72  ragment in order
c450: 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c   to bring.** all
c460: 20 74 68 65 20 73 70 61 63 65 20 74 6f 67 65 74   the space toget
c470: 68 65 72 2c 20 68 6f 77 65 76 65 72 2e 20 20 54  her, however.  T
c480: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
c490: 20 61 76 6f 69 64 20 75 73 69 6e 67 0a 2a 2a 20   avoid using.** 
c4a0: 74 68 65 20 66 69 72 73 74 20 74 77 6f 20 62 79  the first two by
c4b0: 74 65 73 20 70 61 73 74 20 74 68 65 20 63 65 6c  tes past the cel
c4c0: 6c 20 70 6f 69 6e 74 65 72 20 61 72 65 61 20 73  l pointer area s
c4d0: 69 6e 63 65 20 70 72 65 73 75 6d 61 62 6c 79 20  ince presumably 
c4e0: 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69  this.** allocati
c4f0: 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d 61 64 65  on is being made
c500: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 73   in order to ins
c510: 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 2c 20  ert a new cell, 
c520: 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c  so we will.** al
c530: 73 6f 20 65 6e 64 20 75 70 20 6e 65 65 64 69 6e  so end up needin
c540: 67 20 61 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69  g a new cell poi
c550: 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nter..*/.static 
c560: 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70 61 63  int allocateSpac
c570: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
c580: 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74  , int nByte, int
c590: 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f 6e 73 74   *pIdx){.  const
c5a0: 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65   int hdr = pPage
c5b0: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20  ->hdrOffset;    
c5c0: 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
c5d0: 66 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  f pPage->hdrOffs
c5e0: 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e  et */.  u8 * con
c5f0: 73 74 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  st data = pPage-
c600: 3e 61 44 61 74 61 3b 20 20 20 20 20 20 2f 2a 20  >aData;      /* 
c610: 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70  Local cache of p
c620: 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20  Page->aData */. 
c630: 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20   int top;       
c640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c650: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
c660: 79 74 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74  yte of cell cont
c670: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e  ent area */.  in
c680: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
c690: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c6a0: 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 72 65     /* Integer re
c6b0: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
c6c0: 6e 74 20 67 61 70 3b 20 20 20 20 20 20 20 20 2f  nt gap;        /
c6d0: 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
c6e0: 67 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c 6c  gap between cell
c6f0: 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 63 65   pointers and ce
c700: 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ll content */.  
c710: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
c720: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
c730: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
c740: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
c750: 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20  pPage->pBt );.  
c760: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
c770: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
c780: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
c790: 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65  .  assert( nByte
c7a0: 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d  >=0 );  /* Minim
c7b0: 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20  um cell size is 
c7c0: 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  4 */.  assert( p
c7d0: 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79  Page->nFree>=nBy
c7e0: 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  te );.  assert( 
c7f0: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
c800: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
c810: 20 6e 42 79 74 65 20 3c 20 28 69 6e 74 29 28 70   nByte < (int)(p
c820: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
c830: 65 53 69 7a 65 2d 38 29 20 29 3b 0a 0a 20 20 61  eSize-8) );..  a
c840: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 65  ssert( pPage->ce
c850: 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68 64 72 20  llOffset == hdr 
c860: 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e  + 12 - 4*pPage->
c870: 6c 65 61 66 20 29 3b 0a 20 20 67 61 70 20 3d 20  leaf );.  gap = 
c880: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
c890: 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65  t + 2*pPage->nCe
c8a0: 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 67 61  ll;.  assert( ga
c8b0: 70 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 2f 2a  p<=65536 );.  /*
c8c0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
c8d0: 32 39 33 35 36 2d 30 32 33 39 31 20 49 66 20 74  29356-02391 If t
c8e0: 68 65 20 64 61 74 61 62 61 73 65 20 75 73 65 73  he database uses
c8f0: 20 61 20 36 35 35 33 36 2d 62 79 74 65 20 70 61   a 65536-byte pa
c900: 67 65 20 73 69 7a 65 0a 20 20 2a 2a 20 61 6e 64  ge size.  ** and
c910: 20 74 68 65 20 72 65 73 65 72 76 65 64 20 73 70   the reserved sp
c920: 61 63 65 20 69 73 20 7a 65 72 6f 20 28 74 68 65  ace is zero (the
c930: 20 75 73 75 61 6c 20 76 61 6c 75 65 20 66 6f 72   usual value for
c940: 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65 29   reserved space)
c950: 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 63  .  ** then the c
c960: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 66 73  ell content offs
c970: 65 74 20 6f 66 20 61 6e 20 65 6d 70 74 79 20 70  et of an empty p
c980: 61 67 65 20 77 61 6e 74 73 20 74 6f 20 62 65 20  age wants to be 
c990: 36 35 35 33 36 2e 0a 20 20 2a 2a 20 48 6f 77 65  65536..  ** Howe
c9a0: 76 65 72 2c 20 74 68 61 74 20 69 6e 74 65 67 65  ver, that intege
c9b0: 72 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 74  r is too large t
c9c0: 6f 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 61  o be stored in a
c9d0: 20 32 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64   2-byte unsigned
c9e0: 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73  .  ** integer, s
c9f0: 6f 20 61 20 76 61 6c 75 65 20 6f 66 20 30 20 69  o a value of 0 i
ca00: 73 20 75 73 65 64 20 69 6e 20 69 74 73 20 70 6c  s used in its pl
ca10: 61 63 65 2e 20 2a 2f 0a 20 20 74 6f 70 20 3d 20  ace. */.  top = 
ca20: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
ca30: 64 72 2b 35 5d 29 3b 0a 20 20 61 73 73 65 72 74  dr+5]);.  assert
ca40: 28 20 74 6f 70 3c 3d 28 69 6e 74 29 70 50 61 67  ( top<=(int)pPag
ca50: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
ca60: 7a 65 20 29 3b 20 2f 2a 20 50 72 65 76 65 6e 74  ze ); /* Prevent
ca70: 20 62 79 20 67 65 74 41 6e 64 49 6e 69 74 50 61   by getAndInitPa
ca80: 67 65 28 29 20 2a 2f 0a 20 20 69 66 28 20 67 61  ge() */.  if( ga
ca90: 70 3e 74 6f 70 20 29 7b 0a 20 20 20 20 69 66 28  p>top ){.    if(
caa0: 20 74 6f 70 3d 3d 30 20 26 26 20 70 50 61 67 65   top==0 && pPage
cab0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
cac0: 65 3d 3d 36 35 35 33 36 20 29 7b 0a 20 20 20 20  e==65536 ){.    
cad0: 20 20 74 6f 70 20 3d 20 36 35 35 33 36 3b 0a 20    top = 65536;. 
cae0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
caf0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
cb00: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
cb10: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
cb20: 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20 73  here is enough s
cb30: 70 61 63 65 20 62 65 74 77 65 65 6e 20 67 61 70  pace between gap
cb40: 20 61 6e 64 20 74 6f 70 20 66 6f 72 20 6f 6e 65   and top for one
cb50: 20 6d 6f 72 65 20 63 65 6c 6c 20 70 6f 69 6e 74   more cell point
cb60: 65 72 0a 20 20 2a 2a 20 61 72 72 61 79 20 65 6e  er.  ** array en
cb70: 74 72 79 20 6f 66 66 73 65 74 2c 20 61 6e 64 20  try offset, and 
cb80: 69 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  if the freelist 
cb90: 69 73 20 6e 6f 74 20 65 6d 70 74 79 2c 20 74 68  is not empty, th
cba0: 65 6e 20 73 65 61 72 63 68 20 74 68 65 0a 20 20  en search the.  
cbb0: 2a 2a 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b  ** freelist look
cbc0: 69 6e 67 20 66 6f 72 20 61 20 66 72 65 65 20 73  ing for a free s
cbd0: 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 20 74  lot big enough t
cbe0: 6f 20 73 61 74 69 73 66 79 20 74 68 65 20 72 65  o satisfy the re
cbf0: 71 75 65 73 74 2e 0a 20 20 2a 2f 0a 20 20 74 65  quest..  */.  te
cc00: 73 74 63 61 73 65 28 20 67 61 70 2b 32 3d 3d 74  stcase( gap+2==t
cc10: 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  op );.  testcase
cc20: 28 20 67 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a  ( gap+1==top );.
cc30: 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70 3d    testcase( gap=
cc40: 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20 28 64  =top );.  if( (d
cc50: 61 74 61 5b 68 64 72 2b 32 5d 20 7c 7c 20 64 61  ata[hdr+2] || da
cc60: 74 61 5b 68 64 72 2b 31 5d 29 20 26 26 20 67 61  ta[hdr+1]) && ga
cc70: 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a 20 20 20 20  p+2<=top ){.    
cc80: 75 38 20 2a 70 53 70 61 63 65 20 3d 20 70 61 67  u8 *pSpace = pag
cc90: 65 46 69 6e 64 53 6c 6f 74 28 70 50 61 67 65 2c  eFindSlot(pPage,
cca0: 20 6e 42 79 74 65 2c 20 26 72 63 29 3b 0a 20 20   nByte, &rc);.  
ccb0: 20 20 69 66 28 20 70 53 70 61 63 65 20 29 7b 0a    if( pSpace ){.
ccc0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
ccd0: 70 61 63 65 3e 3d 64 61 74 61 20 26 26 20 28 70  pace>=data && (p
cce0: 53 70 61 63 65 20 2d 20 64 61 74 61 29 3c 36 35  Space - data)<65
ccf0: 35 33 36 20 29 3b 0a 20 20 20 20 20 20 2a 70 49  536 );.      *pI
cd00: 64 78 20 3d 20 28 69 6e 74 29 28 70 53 70 61 63  dx = (int)(pSpac
cd10: 65 20 2d 20 64 61 74 61 29 3b 0a 20 20 20 20 20  e - data);.     
cd20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
cd30: 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  K;.    }else if(
cd40: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
cd50: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
cd60: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 71 75  }..  /* The requ
cd70: 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  est could not be
cd80: 20 66 75 6c 66 69 6c 6c 65 64 20 75 73 69 6e 67   fulfilled using
cd90: 20 61 20 66 72 65 65 6c 69 73 74 20 73 6c 6f 74   a freelist slot
cda0: 2e 20 20 43 68 65 63 6b 0a 20 20 2a 2a 20 74 6f  .  Check.  ** to
cdb0: 20 73 65 65 20 69 66 20 64 65 66 72 61 67 6d 65   see if defragme
cdc0: 6e 74 61 74 69 6f 6e 20 69 73 20 6e 65 63 65 73  ntation is neces
cdd0: 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 74 65 73  sary..  */.  tes
cde0: 74 63 61 73 65 28 20 67 61 70 2b 32 2b 6e 42 79  tcase( gap+2+nBy
cdf0: 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28  te==top );.  if(
ce00: 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e 74 6f 70   gap+2+nByte>top
ce10: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
ce20: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c  pPage->nCell>0 |
ce30: 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
ce40: 20 20 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d      rc = defragm
ce50: 65 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  entPage(pPage);.
ce60: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
ce70: 75 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20  urn rc;.    top 
ce80: 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  = get2byteNotZer
ce90: 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  o(&data[hdr+5]);
cea0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 61 70  .    assert( gap
ceb0: 2b 6e 42 79 74 65 3c 3d 74 6f 70 20 29 3b 0a 20  +nByte<=top );. 
cec0: 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   }...  /* Alloca
ced0: 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74  te memory from t
cee0: 68 65 20 67 61 70 20 69 6e 20 62 65 74 77 65 65  he gap in betwee
cef0: 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  n the cell point
cf00: 65 72 20 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e  er array.  ** an
cf10: 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  d the cell conte
cf20: 6e 74 20 61 72 65 61 2e 20 20 54 68 65 20 62 74  nt area.  The bt
cf30: 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 63 61  reeInitPage() ca
cf40: 6c 6c 20 68 61 73 20 61 6c 72 65 61 64 79 0a 20  ll has already. 
cf50: 20 2a 2a 20 76 61 6c 69 64 61 74 65 64 20 74 68   ** validated th
cf60: 65 20 66 72 65 65 6c 69 73 74 2e 20 20 47 69 76  e freelist.  Giv
cf70: 65 6e 20 74 68 61 74 20 74 68 65 20 66 72 65 65  en that the free
cf80: 6c 69 73 74 20 69 73 20 76 61 6c 69 64 2c 20 74  list is valid, t
cf90: 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20  here.  ** is no 
cfa0: 77 61 79 20 74 68 61 74 20 74 68 65 20 61 6c 6c  way that the all
cfb0: 6f 63 61 74 69 6f 6e 20 63 61 6e 20 65 78 74 65  ocation can exte
cfc0: 6e 64 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f  nd off the end o
cfd0: 66 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a  f the page..  **
cfe0: 20 54 68 65 20 61 73 73 65 72 74 28 29 20 62 65   The assert() be
cff0: 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74 68 65  low verifies the
d000: 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e   previous senten
d010: 63 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 2d  ce..  */.  top -
d020: 3d 20 6e 42 79 74 65 3b 0a 20 20 70 75 74 32 62  = nByte;.  put2b
d030: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
d040: 2c 20 74 6f 70 29 3b 0a 20 20 61 73 73 65 72 74  , top);.  assert
d050: 28 20 74 6f 70 2b 6e 42 79 74 65 20 3c 3d 20 28  ( top+nByte <= (
d060: 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e  int)pPage->pBt->
d070: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
d080: 2a 70 49 64 78 20 3d 20 74 6f 70 3b 0a 20 20 72  *pIdx = top;.  r
d090: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
d0a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
d0b0: 20 61 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68   a section of th
d0c0: 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 74  e pPage->aData t
d0d0: 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a  o the freelist..
d0e0: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74  ** The first byt
d0f0: 65 20 6f 66 20 74 68 65 20 6e 65 77 20 66 72 65  e of the new fre
d100: 65 20 62 6c 6f 63 6b 20 69 73 20 70 50 61 67 65  e block is pPage
d110: 2d 3e 61 44 61 74 61 5b 69 53 74 61 72 74 5d 0a  ->aData[iStart].
d120: 2a 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20  ** and the size 
d130: 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73 20  of the block is 
d140: 69 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a  iSize bytes..**.
d150: 2a 2a 20 41 64 6a 61 63 65 6e 74 20 66 72 65 65  ** Adjacent free
d160: 62 6c 6f 63 6b 73 20 61 72 65 20 63 6f 61 6c 65  blocks are coale
d170: 73 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  sced..**.** Note
d180: 20 74 68 61 74 20 65 76 65 6e 20 74 68 6f 75 67   that even thoug
d190: 68 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 20  h the freeblock 
d1a0: 6c 69 73 74 20 77 61 73 20 63 68 65 63 6b 65 64  list was checked
d1b0: 20 62 79 20 62 74 72 65 65 49 6e 69 74 50 61 67   by btreeInitPag
d1c0: 65 28 29 2c 0a 2a 2a 20 74 68 61 74 20 72 6f 75  e(),.** that rou
d1d0: 74 69 6e 65 20 77 69 6c 6c 20 6e 6f 74 20 64 65  tine will not de
d1e0: 74 65 63 74 20 6f 76 65 72 6c 61 70 20 62 65 74  tect overlap bet
d1f0: 77 65 65 6e 20 63 65 6c 6c 73 20 6f 72 20 66 72  ween cells or fr
d200: 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 72 0a 2a  eeblocks.  Nor.*
d210: 2a 20 64 6f 65 73 20 69 74 20 64 65 74 65 63 74  * does it detect
d220: 20 63 65 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c   cells or freebl
d230: 6f 63 6b 73 20 74 68 61 74 20 65 6e 63 72 6f 75  ocks that encrou
d240: 63 68 20 69 6e 74 6f 20 74 68 65 20 72 65 73 65  ch into the rese
d250: 72 76 65 64 20 62 79 74 65 73 0a 2a 2a 20 61 74  rved bytes.** at
d260: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
d270: 70 61 67 65 2e 20 20 53 6f 20 64 6f 20 61 64 64  page.  So do add
d280: 69 74 69 6f 6e 61 6c 20 63 6f 72 72 75 70 74 69  itional corrupti
d290: 6f 6e 20 63 68 65 63 6b 73 20 69 6e 73 69 64 65  on checks inside
d2a0: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
d2b0: 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
d2c0: 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 6e  TE_CORRUPT if an
d2d0: 79 20 70 72 6f 62 6c 65 6d 73 20 61 72 65 20 66  y problems are f
d2e0: 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
d2f0: 69 6e 74 20 66 72 65 65 53 70 61 63 65 28 4d 65  int freeSpace(Me
d300: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 31  mPage *pPage, u1
d310: 36 20 69 53 74 61 72 74 2c 20 75 31 36 20 69 53  6 iStart, u16 iS
d320: 69 7a 65 29 7b 0a 20 20 75 31 36 20 69 50 74 72  ize){.  u16 iPtr
d330: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d350: 20 41 64 64 72 65 73 73 20 6f 66 20 70 74 72 20   Address of ptr 
d360: 74 6f 20 6e 65 78 74 20 66 72 65 65 62 6c 6f 63  to next freebloc
d370: 6b 20 2a 2f 0a 20 20 75 31 36 20 69 46 72 65 65  k */.  u16 iFree
d380: 42 6c 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  Blk;            
d390: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d3a0: 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e  Address of the n
d3b0: 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f  ext freeblock */
d3c0: 0a 20 20 75 38 20 68 64 72 3b 20 20 20 20 20 20  .  u8 hdr;      
d3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
d3f0: 20 68 65 61 64 65 72 20 73 69 7a 65 2e 20 20 30   header size.  0
d400: 20 6f 72 20 31 30 30 20 2a 2f 0a 20 20 75 38 20   or 100 */.  u8 
d410: 6e 46 72 61 67 20 3d 20 30 3b 20 20 20 20 20 20  nFrag = 0;      
d420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d430: 20 20 20 2f 2a 20 52 65 64 75 63 74 69 6f 6e 20     /* Reduction 
d440: 69 6e 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e  in fragmentation
d450: 20 2a 2f 0a 20 20 75 31 36 20 69 4f 72 69 67 53   */.  u16 iOrigS
d460: 69 7a 65 20 3d 20 69 53 69 7a 65 3b 20 20 20 20  ize = iSize;    
d470: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
d480: 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66  riginal value of
d490: 20 69 53 69 7a 65 20 2a 2f 0a 20 20 75 33 32 20   iSize */.  u32 
d4a0: 69 4c 61 73 74 20 3d 20 70 50 61 67 65 2d 3e 70  iLast = pPage->p
d4b0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34  Bt->usableSize-4
d4c0: 3b 20 2f 2a 20 4c 61 72 67 65 73 74 20 70 6f 73  ; /* Largest pos
d4d0: 73 69 62 6c 65 20 66 72 65 65 62 6c 6f 63 6b 20  sible freeblock 
d4e0: 6f 66 66 73 65 74 20 2a 2f 0a 20 20 75 33 32 20  offset */.  u32 
d4f0: 69 45 6e 64 20 3d 20 69 53 74 61 72 74 20 2b 20  iEnd = iStart + 
d500: 69 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  iSize;          
d510: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
d520: 70 61 73 74 20 74 68 65 20 69 53 74 61 72 74 20  past the iStart 
d530: 62 75 66 66 65 72 20 2a 2f 0a 20 20 75 6e 73 69  buffer */.  unsi
d540: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20  gned char *data 
d550: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20  = pPage->aData; 
d560: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 65 6e    /* Page conten
d570: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
d580: 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b  pPage->pBt!=0 );
d590: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
d5a0: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
d5b0: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
d5c0: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
d5d0: 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 53  CORRUPT_DB || iS
d5e0: 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72  tart>=pPage->hdr
d5f0: 4f 66 66 73 65 74 2b 36 2b 70 50 61 67 65 2d 3e  Offset+6+pPage->
d600: 63 68 69 6c 64 50 74 72 53 69 7a 65 20 29 3b 0a  childPtrSize );.
d610: 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
d620: 54 5f 44 42 20 7c 7c 20 69 45 6e 64 20 3c 3d 20  T_DB || iEnd <= 
d630: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
d640: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65  leSize );.  asse
d650: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
d660: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
d670: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
d680: 73 73 65 72 74 28 20 69 53 69 7a 65 3e 3d 34 20  ssert( iSize>=4 
d690: 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20  );   /* Minimum 
d6a0: 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a  cell size is 4 *
d6b0: 2f 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61  /.  assert( iSta
d6c0: 72 74 3c 3d 69 4c 61 73 74 20 29 3b 0a 0a 20 20  rt<=iLast );..  
d6d0: 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64 65 6c  /* Overwrite del
d6e0: 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  eted information
d6f0: 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68 65 6e   with zeros when
d700: 20 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65   the secure_dele
d710: 74 65 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69  te.  ** option i
d720: 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69  s enabled */.  i
d730: 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 62  f( pPage->pBt->b
d740: 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45  tsFlags & BTS_SE
d750: 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20  CURE_DELETE ){. 
d760: 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b     memset(&data[
d770: 69 53 74 61 72 74 5d 2c 20 30 2c 20 69 53 69 7a  iStart], 0, iSiz
d780: 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  e);.  }..  /* Th
d790: 65 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62 6c  e list of freebl
d7a0: 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20  ocks must be in 
d7b0: 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  ascending order.
d7c0: 20 20 46 69 6e 64 20 74 68 65 20 0a 20 20 2a 2a    Find the .  **
d7d0: 20 73 70 6f 74 20 6f 6e 20 74 68 65 20 6c 69 73   spot on the lis
d7e0: 74 20 77 68 65 72 65 20 69 53 74 61 72 74 20 73  t where iStart s
d7f0: 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74 65  hould be inserte
d800: 64 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20  d..  */.  hdr = 
d810: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
d820: 3b 0a 20 20 69 50 74 72 20 3d 20 68 64 72 20 2b  ;.  iPtr = hdr +
d830: 20 31 3b 0a 20 20 69 66 28 20 64 61 74 61 5b 69   1;.  if( data[i
d840: 50 74 72 2b 31 5d 3d 3d 30 20 26 26 20 64 61 74  Ptr+1]==0 && dat
d850: 61 5b 69 50 74 72 5d 3d 3d 30 20 29 7b 0a 20 20  a[iPtr]==0 ){.  
d860: 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 30 3b 20    iFreeBlk = 0; 
d870: 20 2f 2a 20 53 68 6f 72 74 63 75 74 20 66 6f 72   /* Shortcut for
d880: 20 74 68 65 20 63 61 73 65 20 77 68 65 6e 20 74   the case when t
d890: 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 65  he freelist is e
d8a0: 6d 70 74 79 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  mpty */.  }else{
d8b0: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 69 46 72  .    while( (iFr
d8c0: 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74 65  eeBlk = get2byte
d8d0: 28 26 64 61 74 61 5b 69 50 74 72 5d 29 29 3c 69  (&data[iPtr]))<i
d8e0: 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 69  Start ){.      i
d8f0: 66 28 20 69 46 72 65 65 42 6c 6b 3c 69 50 74 72  f( iFreeBlk<iPtr
d900: 2b 34 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  +4 ){.        if
d910: 28 20 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29 20  ( iFreeBlk==0 ) 
d920: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 72  break;.        r
d930: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
d940: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
d950: 20 7d 0a 20 20 20 20 20 20 69 50 74 72 20 3d 20   }.      iPtr = 
d960: 69 46 72 65 65 42 6c 6b 3b 0a 20 20 20 20 7d 0a  iFreeBlk;.    }.
d970: 20 20 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b      if( iFreeBlk
d980: 3e 69 4c 61 73 74 20 29 20 72 65 74 75 72 6e 20  >iLast ) return 
d990: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
d9a0: 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28  KPT;.    assert(
d9b0: 20 69 46 72 65 65 42 6c 6b 3e 69 50 74 72 20 7c   iFreeBlk>iPtr |
d9c0: 7c 20 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29 3b  | iFreeBlk==0 );
d9d0: 0a 20 20 0a 20 20 20 20 2f 2a 20 41 74 20 74 68  .  .    /* At th
d9e0: 69 73 20 70 6f 69 6e 74 3a 0a 20 20 20 20 2a 2a  is point:.    **
d9f0: 20 20 20 20 69 46 72 65 65 42 6c 6b 3a 20 20 20      iFreeBlk:   
da00: 46 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20  First freeblock 
da10: 61 66 74 65 72 20 69 53 74 61 72 74 2c 20 6f 72  after iStart, or
da20: 20 7a 65 72 6f 20 69 66 20 6e 6f 6e 65 0a 20 20   zero if none.  
da30: 20 20 2a 2a 20 20 20 20 69 50 74 72 3a 20 20 20    **    iPtr:   
da40: 20 20 20 20 54 68 65 20 61 64 64 72 65 73 73 20      The address 
da50: 6f 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  of a pointer to 
da60: 69 46 72 65 65 42 6c 6b 0a 20 20 20 20 2a 2a 0a  iFreeBlk.    **.
da70: 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20      ** Check to 
da80: 73 65 65 20 69 66 20 69 46 72 65 65 42 6c 6b 20  see if iFreeBlk 
da90: 73 68 6f 75 6c 64 20 62 65 20 63 6f 61 6c 65 73  should be coales
daa0: 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  ced onto the end
dab0: 20 6f 66 20 69 53 74 61 72 74 2e 0a 20 20 20 20   of iStart..    
dac0: 2a 2f 0a 20 20 20 20 69 66 28 20 69 46 72 65 65  */.    if( iFree
dad0: 42 6c 6b 20 26 26 20 69 45 6e 64 2b 33 3e 3d 69  Blk && iEnd+3>=i
dae0: 46 72 65 65 42 6c 6b 20 29 7b 0a 20 20 20 20 20  FreeBlk ){.     
daf0: 20 6e 46 72 61 67 20 3d 20 69 46 72 65 65 42 6c   nFrag = iFreeBl
db00: 6b 20 2d 20 69 45 6e 64 3b 0a 20 20 20 20 20 20  k - iEnd;.      
db10: 69 66 28 20 69 45 6e 64 3e 69 46 72 65 65 42 6c  if( iEnd>iFreeBl
db20: 6b 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  k ) return SQLIT
db30: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
db40: 20 20 20 20 20 20 69 45 6e 64 20 3d 20 69 46 72        iEnd = iFr
db50: 65 65 42 6c 6b 20 2b 20 67 65 74 32 62 79 74 65  eeBlk + get2byte
db60: 28 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 2b  (&data[iFreeBlk+
db70: 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  2]);.      if( i
db80: 45 6e 64 20 3e 20 70 50 61 67 65 2d 3e 70 42 74  End > pPage->pBt
db90: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 20 72  ->usableSize ) r
dba0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
dbb0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
dbc0: 20 69 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20   iSize = iEnd - 
dbd0: 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 69 46  iStart;.      iF
dbe0: 72 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74  reeBlk = get2byt
dbf0: 65 28 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b  e(&data[iFreeBlk
dc00: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  ]);.    }.  .   
dc10: 20 2f 2a 20 49 66 20 69 50 74 72 20 69 73 20 61   /* If iPtr is a
dc20: 6e 6f 74 68 65 72 20 66 72 65 65 62 6c 6f 63 6b  nother freeblock
dc30: 20 28 74 68 61 74 20 69 73 2c 20 69 66 20 69 50   (that is, if iP
dc40: 74 72 20 69 73 20 6e 6f 74 20 74 68 65 20 66 72  tr is not the fr
dc50: 65 65 6c 69 73 74 0a 20 20 20 20 2a 2a 20 70 6f  eelist.    ** po
dc60: 69 6e 74 65 72 20 69 6e 20 74 68 65 20 70 61 67  inter in the pag
dc70: 65 20 68 65 61 64 65 72 29 20 74 68 65 6e 20 63  e header) then c
dc80: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69  heck to see if i
dc90: 53 74 61 72 74 20 73 68 6f 75 6c 64 20 62 65 0a  Start should be.
dca0: 20 20 20 20 2a 2a 20 63 6f 61 6c 65 73 63 65 64      ** coalesced
dcb0: 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
dcc0: 20 69 50 74 72 2e 0a 20 20 20 20 2a 2f 0a 20 20   iPtr..    */.  
dcd0: 20 20 69 66 28 20 69 50 74 72 3e 68 64 72 2b 31    if( iPtr>hdr+1
dce0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50   ){.      int iP
dcf0: 74 72 45 6e 64 20 3d 20 69 50 74 72 20 2b 20 67  trEnd = iPtr + g
dd00: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 50  et2byte(&data[iP
dd10: 74 72 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66  tr+2]);.      if
dd20: 28 20 69 50 74 72 45 6e 64 2b 33 3e 3d 69 53 74  ( iPtrEnd+3>=iSt
dd30: 61 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  art ){.        i
dd40: 66 28 20 69 50 74 72 45 6e 64 3e 69 53 74 61 72  f( iPtrEnd>iStar
dd50: 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  t ) return SQLIT
dd60: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
dd70: 20 20 20 20 20 20 20 20 6e 46 72 61 67 20 2b 3d          nFrag +=
dd80: 20 69 53 74 61 72 74 20 2d 20 69 50 74 72 45 6e   iStart - iPtrEn
dd90: 64 3b 0a 20 20 20 20 20 20 20 20 69 53 69 7a 65  d;.        iSize
dda0: 20 3d 20 69 45 6e 64 20 2d 20 69 50 74 72 3b 0a   = iEnd - iPtr;.
ddb0: 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d          iStart =
ddc0: 20 69 50 74 72 3b 0a 20 20 20 20 20 20 7d 0a 20   iPtr;.      }. 
ddd0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 46 72     }.    if( nFr
dde0: 61 67 3e 64 61 74 61 5b 68 64 72 2b 37 5d 20 29  ag>data[hdr+7] )
ddf0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
de00: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
de10: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20   data[hdr+7] -= 
de20: 6e 46 72 61 67 3b 0a 20 20 7d 0a 20 20 69 66 28  nFrag;.  }.  if(
de30: 20 69 53 74 61 72 74 3d 3d 67 65 74 32 62 79 74   iStart==get2byt
de40: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20  e(&data[hdr+5]) 
de50: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65  ){.    /* The ne
de60: 77 20 66 72 65 65 62 6c 6f 63 6b 20 69 73 20 61  w freeblock is a
de70: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
de80: 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  of the cell cont
de90: 65 6e 74 20 61 72 65 61 2c 0a 20 20 20 20 2a 2a  ent area,.    **
dea0: 20 73 6f 20 6a 75 73 74 20 65 78 74 65 6e 64 20   so just extend 
deb0: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
dec0: 20 61 72 65 61 20 72 61 74 68 65 72 20 74 68 61   area rather tha
ded0: 6e 20 63 72 65 61 74 65 20 61 6e 6f 74 68 65 72  n create another
dee0: 0a 20 20 20 20 2a 2a 20 66 72 65 65 6c 69 73 74  .    ** freelist
def0: 20 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20 69 66   entry */.    if
df00: 28 20 69 50 74 72 21 3d 68 64 72 2b 31 20 29 20  ( iPtr!=hdr+1 ) 
df10: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
df20: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
df30: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
df40: 64 72 2b 31 5d 2c 20 69 46 72 65 65 42 6c 6b 29  dr+1], iFreeBlk)
df50: 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
df60: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 69 45 6e  data[hdr+5], iEn
df70: 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  d);.  }else{.   
df80: 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e   /* Insert the n
df90: 65 77 20 66 72 65 65 62 6c 6f 63 6b 20 69 6e 74  ew freeblock int
dfa0: 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a  o the freelist *
dfb0: 2f 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  /.    put2byte(&
dfc0: 64 61 74 61 5b 69 50 74 72 5d 2c 20 69 53 74 61  data[iPtr], iSta
dfd0: 72 74 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  rt);.    put2byt
dfe0: 65 28 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c  e(&data[iStart],
dff0: 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20   iFreeBlk);.    
e000: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  put2byte(&data[i
e010: 53 74 61 72 74 2b 32 5d 2c 20 69 53 69 7a 65 29  Start+2], iSize)
e020: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e  ;.  }.  pPage->n
e030: 46 72 65 65 20 2b 3d 20 69 4f 72 69 67 53 69 7a  Free += iOrigSiz
e040: 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
e050: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
e060: 44 65 63 6f 64 65 20 74 68 65 20 66 6c 61 67 73  Decode the flags
e070: 20 62 79 74 65 20 28 74 68 65 20 66 69 72 73 74   byte (the first
e080: 20 62 79 74 65 20 6f 66 20 74 68 65 20 68 65 61   byte of the hea
e090: 64 65 72 29 20 66 6f 72 20 61 20 70 61 67 65 0a  der) for a page.
e0a0: 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  ** and initializ
e0b0: 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  e fields of the 
e0c0: 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74 75 72  MemPage structur
e0d0: 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a  e accordingly..*
e0e0: 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f  *.** Only the fo
e0f0: 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74  llowing combinat
e100: 69 6f 6e 73 20 61 72 65 20 73 75 70 70 6f 72 74  ions are support
e110: 65 64 2e 20 20 41 6e 79 74 68 69 6e 67 20 64 69  ed.  Anything di
e120: 66 66 65 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63  fferent.** indic
e130: 61 74 65 73 20 61 20 63 6f 72 72 75 70 74 20 64  ates a corrupt d
e140: 61 74 61 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a  atabase files:.*
e150: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  *.**         PTF
e160: 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20  _ZERODATA.**    
e170: 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54       PTF_ZERODAT
e180: 41 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20  A | PTF_LEAF.** 
e190: 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46          PTF_LEAF
e1a0: 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45  DATA | PTF_INTKE
e1b0: 59 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  Y.**         PTF
e1c0: 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f  _LEAFDATA | PTF_
e1d0: 49 4e 54 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41  INTKEY | PTF_LEA
e1e0: 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  F.*/.static int 
e1f0: 64 65 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50  decodeFlags(MemP
e200: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
e210: 66 6c 61 67 42 79 74 65 29 7b 0a 20 20 42 74 53  flagByte){.  BtS
e220: 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20  hared *pBt;     
e230: 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 50 61  /* A copy of pPa
e240: 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73  ge->pBt */..  as
e250: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 68 64 72  sert( pPage->hdr
e260: 4f 66 66 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e  Offset==(pPage->
e270: 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20  pgno==1 ? 100 : 
e280: 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  0) );.  assert( 
e290: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
e2a0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
e2b0: 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65  utex) );.  pPage
e2c0: 2d 3e 6c 65 61 66 20 3d 20 28 75 38 29 28 66 6c  ->leaf = (u8)(fl
e2d0: 61 67 42 79 74 65 3e 3e 33 29 3b 20 20 61 73 73  agByte>>3);  ass
e2e0: 65 72 74 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d  ert( PTF_LEAF ==
e2f0: 20 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42   1<<3 );.  flagB
e300: 79 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46  yte &= ~PTF_LEAF
e310: 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  ;.  pPage->child
e320: 50 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50  PtrSize = 4-4*pP
e330: 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 50 61  age->leaf;.  pPa
e340: 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20 3d 20  ge->xCellSize = 
e350: 63 65 6c 6c 53 69 7a 65 50 74 72 3b 0a 20 20 70  cellSizePtr;.  p
e360: 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
e370: 0a 20 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d  .  if( flagByte=
e380: 3d 28 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c  =(PTF_LEAFDATA |
e390: 20 50 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a   PTF_INTKEY) ){.
e3a0: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
e3b0: 4f 46 3a 20 52 2d 30 37 32 39 31 2d 33 35 33 32  OF: R-07291-3532
e3c0: 38 20 41 20 76 61 6c 75 65 20 6f 66 20 35 20 28  8 A value of 5 (
e3d0: 30 78 30 35 29 20 6d 65 61 6e 73 20 74 68 65 20  0x05) means the 
e3e0: 70 61 67 65 20 69 73 20 61 6e 0a 20 20 20 20 2a  page is an.    *
e3f0: 2a 20 69 6e 74 65 72 69 6f 72 20 74 61 62 6c 65  * interior table
e400: 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f   b-tree page. */
e410: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 54  .    assert( (PT
e420: 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 49  F_LEAFDATA|PTF_I
e430: 4e 54 4b 45 59 29 3d 3d 35 20 29 3b 0a 20 20 20  NTKEY)==5 );.   
e440: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
e450: 20 52 2d 32 36 39 30 30 2d 30 39 31 37 36 20 41   R-26900-09176 A
e460: 20 76 61 6c 75 65 20 6f 66 20 31 33 20 28 30 78   value of 13 (0x
e470: 30 64 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61  0d) means the pa
e480: 67 65 20 69 73 20 61 0a 20 20 20 20 2a 2a 20 6c  ge is a.    ** l
e490: 65 61 66 20 74 61 62 6c 65 20 62 2d 74 72 65 65  eaf table b-tree
e4a0: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73   page. */.    as
e4b0: 73 65 72 74 28 20 28 50 54 46 5f 4c 45 41 46 44  sert( (PTF_LEAFD
e4c0: 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59 7c 50  ATA|PTF_INTKEY|P
e4d0: 54 46 5f 4c 45 41 46 29 3d 3d 31 33 20 29 3b 0a  TF_LEAF)==13 );.
e4e0: 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
e4f0: 79 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70  y = 1;.    if( p
e500: 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
e510: 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
e520: 79 4c 65 61 66 20 3d 20 31 3b 0a 20 20 20 20 20  yLeaf = 1;.     
e530: 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
e540: 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65 43  ll = btreeParseC
e550: 65 6c 6c 50 74 72 3b 0a 20 20 20 20 7d 65 6c 73  ellPtr;.    }els
e560: 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  e{.      pPage->
e570: 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a  intKeyLeaf = 0;.
e580: 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 43 65        pPage->xCe
e590: 6c 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a  llSize = cellSiz
e5a0: 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20  ePtrNoPayload;. 
e5b0: 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72       pPage->xPar
e5c0: 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61  seCell = btreePa
e5d0: 72 73 65 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c  rseCellPtrNoPayl
e5e0: 6f 61 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  oad;.    }.    p
e5f0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d  Page->maxLocal =
e600: 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20   pBt->maxLeaf;. 
e610: 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63     pPage->minLoc
e620: 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61  al = pBt->minLea
e630: 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66  f;.  }else if( f
e640: 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52  lagByte==PTF_ZER
e650: 4f 44 41 54 41 20 29 7b 0a 20 20 20 20 2f 2a 20  ODATA ){.    /* 
e660: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
e670: 33 33 31 36 2d 33 37 33 30 38 20 41 20 76 61 6c  3316-37308 A val
e680: 75 65 20 6f 66 20 32 20 28 30 78 30 32 29 20 6d  ue of 2 (0x02) m
e690: 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73  eans the page is
e6a0: 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72   an.    ** inter
e6b0: 69 6f 72 20 69 6e 64 65 78 20 62 2d 74 72 65 65  ior index b-tree
e6c0: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73   page. */.    as
e6d0: 73 65 72 74 28 20 28 50 54 46 5f 5a 45 52 4f 44  sert( (PTF_ZEROD
e6e0: 41 54 41 29 3d 3d 32 20 29 3b 0a 20 20 20 20 2f  ATA)==2 );.    /
e6f0: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
e700: 2d 35 39 36 31 35 2d 34 32 38 32 38 20 41 20 76  -59615-42828 A v
e710: 61 6c 75 65 20 6f 66 20 31 30 20 28 30 78 30 61  alue of 10 (0x0a
e720: 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65  ) means the page
e730: 20 69 73 20 61 0a 20 20 20 20 2a 2a 20 6c 65 61   is a.    ** lea
e740: 66 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 70  f index b-tree p
e750: 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  age. */.    asse
e760: 72 74 28 20 28 50 54 46 5f 5a 45 52 4f 44 41 54  rt( (PTF_ZERODAT
e770: 41 7c 50 54 46 5f 4c 45 41 46 29 3d 3d 31 30 20  A|PTF_LEAF)==10 
e780: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  );.    pPage->in
e790: 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 50  tKey = 0;.    pP
e7a0: 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20  age->intKeyLeaf 
e7b0: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = 0;.    pPage->
e7c0: 78 50 61 72 73 65 43 65 6c 6c 20 3d 20 62 74 72  xParseCell = btr
e7d0: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e  eeParseCellPtrIn
e7e0: 64 65 78 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  dex;.    pPage->
e7f0: 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  maxLocal = pBt->
e800: 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50  maxLocal;.    pP
e810: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  age->minLocal = 
e820: 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  pBt->minLocal;. 
e830: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45   }else{.    /* E
e840: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 37  VIDENCE-OF: R-47
e850: 36 30 38 2d 35 36 34 36 39 20 41 6e 79 20 6f 74  608-56469 Any ot
e860: 68 65 72 20 76 61 6c 75 65 20 66 6f 72 20 74 68  her value for th
e870: 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 74 79  e b-tree page ty
e880: 70 65 20 69 73 0a 20 20 20 20 2a 2a 20 61 6e 20  pe is.    ** an 
e890: 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 20 20 72 65  error. */.    re
e8a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
e8b0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
e8c0: 70 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50  pPage->max1byteP
e8d0: 61 79 6c 6f 61 64 20 3d 20 70 42 74 2d 3e 6d 61  ayload = pBt->ma
e8e0: 78 31 62 79 74 65 50 61 79 6c 6f 61 64 3b 0a 20  x1bytePayload;. 
e8f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
e900: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  K;.}../*.** Init
e910: 69 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69 6c  ialize the auxil
e920: 69 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  iary information
e930: 20 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f 63   for a disk bloc
e940: 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  k..**.** Return 
e950: 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
e960: 63 65 73 73 2e 20 20 49 66 20 77 65 20 73 65 65  cess.  If we see
e970: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 64   that the page d
e980: 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61  oes.** not conta
e990: 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  in a well-formed
e9a0: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c 20   database page, 
e9b0: 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20  then return .** 
e9c0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20  SQLITE_CORRUPT. 
e9d0: 20 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65 74   Note that a ret
e9e0: 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b  urn of SQLITE_OK
e9f0: 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61   does not.** gua
ea00: 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20  rantee that the 
ea10: 70 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72  page is well-for
ea20: 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68  med.  It only sh
ea30: 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20 66  ows that.** we f
ea40: 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74 20  ailed to detect 
ea50: 61 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  any corruption..
ea60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
ea70: 72 65 65 49 6e 69 74 50 61 67 65 28 4d 65 6d 50  reeInitPage(MemP
ea80: 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 0a 20 20  age *pPage){..  
ea90: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
eaa0: 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
eab0: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 64  t( pPage->pBt->d
eac0: 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
ead0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
eae0: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
eaf0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
eb00: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f  ert( pPage->pgno
eb10: 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ==sqlite3PagerPa
eb20: 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e  genumber(pPage->
eb30: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
eb40: 73 65 72 74 28 20 70 50 61 67 65 20 3d 3d 20 73  sert( pPage == s
eb50: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
eb60: 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  tra(pPage->pDbPa
eb70: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
eb80: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d   pPage->aData ==
eb90: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
eba0: 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50  Data(pPage->pDbP
ebb0: 61 67 65 29 20 29 3b 0a 0a 20 20 69 66 28 20 21  age) );..  if( !
ebc0: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b  pPage->isInit ){
ebd0: 0a 20 20 20 20 69 6e 74 20 70 63 3b 20 20 20 20  .    int pc;    
ebe0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
ebf0: 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63  ss of a freebloc
ec00: 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e  k within pPage->
ec10: 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 20 20 75  aData[] */.    u
ec20: 38 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  8 hdr;          
ec30: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62    /* Offset to b
ec40: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65  eginning of page
ec50: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75   header */.    u
ec60: 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  8 *data;        
ec70: 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50    /* Equal to pP
ec80: 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20  age->aData */.  
ec90: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
eca0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d          /* The m
ecb0: 61 69 6e 20 62 74 72 65 65 20 73 74 72 75 63 74  ain btree struct
ecc0: 75 72 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75  ure */.    int u
ecd0: 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a  sableSize;    /*
ece0: 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c   Amount of usabl
ecf0: 65 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20  e space on each 
ed00: 70 61 67 65 20 2a 2f 0a 20 20 20 20 75 31 36 20  page */.    u16 
ed10: 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f  cellOffset;    /
ed20: 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d 20 73 74  * Offset from st
ed30: 61 72 74 20 6f 66 20 70 61 67 65 20 74 6f 20 66  art of page to f
ed40: 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  irst cell pointe
ed50: 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 46 72  r */.    int nFr
ed60: 65 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ee;         /* N
ed70: 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20  umber of unused 
ed80: 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67  bytes on the pag
ed90: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 6f 70  e */.    int top
eda0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
edb0: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
edc0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
edd0: 65 61 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43  ea */.    int iC
ede0: 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 2f 2a 20  ellFirst;    /* 
edf0: 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20  First allowable 
ee00: 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63  cell or freebloc
ee10: 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20  k offset */.    
ee20: 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20  int iCellLast;  
ee30: 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69     /* Last possi
ee40: 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65  ble cell or free
ee50: 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a  block offset */.
ee60: 0a 20 20 20 20 70 42 74 20 3d 20 70 50 61 67 65  .    pBt = pPage
ee70: 2d 3e 70 42 74 3b 0a 0a 20 20 20 20 68 64 72 20  ->pBt;..    hdr 
ee80: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
ee90: 65 74 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70  et;.    data = p
eea0: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20  Page->aData;.   
eeb0: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
eec0: 20 52 2d 32 38 35 39 34 2d 30 32 38 39 30 20 54   R-28594-02890 T
eed0: 68 65 20 6f 6e 65 2d 62 79 74 65 20 66 6c 61 67  he one-byte flag
eee0: 20 61 74 20 6f 66 66 73 65 74 20 30 20 69 6e 64   at offset 0 ind
eef0: 69 63 61 74 69 6e 67 0a 20 20 20 20 2a 2a 20 74  icating.    ** t
ef00: 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 74  he b-tree page t
ef10: 79 70 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ype. */.    if( 
ef20: 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67  decodeFlags(pPag
ef30: 65 2c 20 64 61 74 61 5b 68 64 72 5d 29 20 29 20  e, data[hdr]) ) 
ef40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
ef50: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
ef60: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67  assert( pBt->pag
ef70: 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42  eSize>=512 && pB
ef80: 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35  t->pageSize<=655
ef90: 33 36 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  36 );.    pPage-
efa0: 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36  >maskPage = (u16
efb0: 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  )(pBt->pageSize 
efc0: 2d 20 31 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  - 1);.    pPage-
efd0: 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
efe0: 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d      usableSize =
eff0: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
f000: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 63 65 6c  ;.    pPage->cel
f010: 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66  lOffset = cellOf
f020: 66 73 65 74 20 3d 20 68 64 72 20 2b 20 38 20 2b  fset = hdr + 8 +
f030: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
f040: 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 2d  Size;.    pPage-
f050: 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64 61 74  >aDataEnd = &dat
f060: 61 5b 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20  a[usableSize];. 
f070: 20 20 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49     pPage->aCellI
f080: 64 78 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f  dx = &data[cellO
f090: 66 66 73 65 74 5d 3b 0a 20 20 20 20 70 50 61 67  ffset];.    pPag
f0a0: 65 2d 3e 61 44 61 74 61 4f 66 73 74 20 3d 20 26  e->aDataOfst = &
f0b0: 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c  data[pPage->chil
f0c0: 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 20 20 2f  dPtrSize];.    /
f0d0: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
f0e0: 2d 35 38 30 31 35 2d 34 38 31 37 35 20 54 68 65  -58015-48175 The
f0f0: 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65   two-byte intege
f100: 72 20 61 74 20 6f 66 66 73 65 74 20 35 20 64 65  r at offset 5 de
f110: 73 69 67 6e 61 74 65 73 0a 20 20 20 20 2a 2a 20  signates.    ** 
f120: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
f130: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
f140: 65 61 2e 20 41 20 7a 65 72 6f 20 76 61 6c 75 65  ea. A zero value
f150: 20 66 6f 72 20 74 68 69 73 20 69 6e 74 65 67 65   for this intege
f160: 72 20 69 73 0a 20 20 20 20 2a 2a 20 69 6e 74 65  r is.    ** inte
f170: 72 70 72 65 74 65 64 20 61 73 20 36 35 35 33 36  rpreted as 65536
f180: 2e 20 2a 2f 0a 20 20 20 20 74 6f 70 20 3d 20 67  . */.    top = g
f190: 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26  et2byteNotZero(&
f1a0: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
f1b0: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
f1c0: 3a 20 52 2d 33 37 30 30 32 2d 33 32 37 37 34 20  : R-37002-32774 
f1d0: 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74  The two-byte int
f1e0: 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 33  eger at offset 3
f1f0: 20 67 69 76 65 73 20 74 68 65 0a 20 20 20 20 2a   gives the.    *
f200: 2a 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * number of cell
f210: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 2a  s on the page. *
f220: 2f 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65  /.    pPage->nCe
f230: 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ll = get2byte(&d
f240: 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20  ata[hdr+3]);.   
f250: 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c   if( pPage->nCel
f260: 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29  l>MX_CELL(pBt) )
f270: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 6f 20 6d 61  {.      /* To ma
f280: 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73  ny cells for a s
f290: 69 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65  ingle page.  The
f2a0: 20 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f   page must be co
f2b0: 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 20 20 72  rrupt */.      r
f2c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
f2d0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
f2e0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
f2f0: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f  Page->nCell==MX_
f300: 43 45 4c 4c 28 70 42 74 29 20 29 3b 0a 20 20 20  CELL(pBt) );.   
f310: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
f320: 20 52 2d 32 34 30 38 39 2d 35 37 39 37 39 20 49   R-24089-57979 I
f330: 66 20 61 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  f a page contain
f340: 73 20 6e 6f 20 63 65 6c 6c 73 20 28 77 68 69 63  s no cells (whic
f350: 68 20 69 73 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a  h is only.    **
f360: 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20   possible for a 
f370: 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 74  root page of a t
f380: 61 62 6c 65 20 74 68 61 74 20 63 6f 6e 74 61 69  able that contai
f390: 6e 73 20 6e 6f 20 72 6f 77 73 29 20 74 68 65 6e  ns no rows) then
f3a0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 66 66 73   the.    ** offs
f3b0: 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63  et to the cell c
f3c0: 6f 6e 74 65 6e 74 20 61 72 65 61 20 77 69 6c 6c  ontent area will
f3d0: 20 65 71 75 61 6c 20 74 68 65 20 70 61 67 65 20   equal the page 
f3e0: 73 69 7a 65 20 6d 69 6e 75 73 20 74 68 65 0a 20  size minus the. 
f3f0: 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 72     ** bytes of r
f400: 65 73 65 72 76 65 64 20 73 70 61 63 65 2e 20 2a  eserved space. *
f410: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
f420: 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20  age->nCell>0 || 
f430: 74 6f 70 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20  top==usableSize 
f440: 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
f450: 0a 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c 66 6f  ..    /* A malfo
f460: 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61  rmed database pa
f470: 67 65 20 6d 69 67 68 74 20 63 61 75 73 65 20 75  ge might cause u
f480: 73 20 74 6f 20 72 65 61 64 20 70 61 73 74 20 74  s to read past t
f490: 68 65 20 65 6e 64 0a 20 20 20 20 2a 2a 20 6f 66  he end.    ** of
f4a0: 20 70 61 67 65 20 77 68 65 6e 20 70 61 72 73 69   page when parsi
f4b0: 6e 67 20 61 20 63 65 6c 6c 2e 20 20 0a 20 20 20  ng a cell.  .   
f4c0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66   **.    ** The f
f4d0: 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f  ollowing block o
f4e0: 66 20 63 6f 64 65 20 63 68 65 63 6b 73 20 65 61  f code checks ea
f4f0: 72 6c 79 20 74 6f 20 73 65 65 20 69 66 20 61 20  rly to see if a 
f500: 63 65 6c 6c 20 65 78 74 65 6e 64 73 0a 20 20 20  cell extends.   
f510: 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64   ** past the end
f520: 20 6f 66 20 61 20 70 61 67 65 20 62 6f 75 6e 64   of a page bound
f530: 61 72 79 20 61 6e 64 20 63 61 75 73 65 73 20 53  ary and causes S
f540: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 74 6f  QLITE_CORRUPT to
f550: 20 62 65 20 0a 20 20 20 20 2a 2a 20 72 65 74 75   be .    ** retu
f560: 72 6e 65 64 20 69 66 20 69 74 20 64 6f 65 73 2e  rned if it does.
f570: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 43 65 6c  .    */.    iCel
f580: 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66  lFirst = cellOff
f590: 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e  set + 2*pPage->n
f5a0: 43 65 6c 6c 3b 0a 20 20 20 20 69 43 65 6c 6c 4c  Cell;.    iCellL
f5b0: 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ast = usableSize
f5c0: 20 2d 20 34 3b 0a 20 20 20 20 69 66 28 20 70 42   - 4;.    if( pB
f5d0: 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  t->db->flags & S
f5e0: 51 4c 49 54 45 5f 43 65 6c 6c 53 69 7a 65 43 6b  QLITE_CellSizeCk
f5f0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
f600: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
f610: 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 63 65  ndex into the ce
f620: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll pointer array
f630: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a   */.      int sz
f640: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
f650: 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f  ize of a cell */
f660: 0a 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  ..      if( !pPa
f670: 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c  ge->leaf ) iCell
f680: 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20 66 6f  Last--;.      fo
f690: 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e  r(i=0; i<pPage->
f6a0: 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
f6b0: 20 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79       pc = get2by
f6c0: 74 65 41 6c 69 67 6e 65 64 28 26 64 61 74 61 5b  teAligned(&data[
f6d0: 63 65 6c 6c 4f 66 66 73 65 74 2b 69 2a 32 5d 29  cellOffset+i*2])
f6e0: 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
f6f0: 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72  se( pc==iCellFir
f700: 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  st );.        te
f710: 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c  stcase( pc==iCel
f720: 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 20 20 20  lLast );.       
f730: 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72   if( pc<iCellFir
f740: 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61  st || pc>iCellLa
f750: 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
f760: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
f770: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
f780: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 7a      }.        sz
f790: 20 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53   = pPage->xCellS
f7a0: 69 7a 65 28 70 50 61 67 65 2c 20 26 64 61 74 61  ize(pPage, &data
f7b0: 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 20 20 74  [pc]);.        t
f7c0: 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d  estcase( pc+sz==
f7d0: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
f7e0: 20 20 20 20 20 20 69 66 28 20 70 63 2b 73 7a 3e        if( pc+sz>
f7f0: 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
f800: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
f810: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
f820: 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  PT;.        }.  
f830: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
f840: 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69  !pPage->leaf ) i
f850: 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a 20 20 20 20  CellLast++;.    
f860: 7d 20 20 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70  }  ..    /* Comp
f870: 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 66 72  ute the total fr
f880: 65 65 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20  ee space on the 
f890: 70 61 67 65 0a 20 20 20 20 2a 2a 20 45 56 49 44  page.    ** EVID
f8a0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 33 35 38 38  ENCE-OF: R-23588
f8b0: 2d 33 34 34 35 30 20 54 68 65 20 74 77 6f 2d 62  -34450 The two-b
f8c0: 79 74 65 20 69 6e 74 65 67 65 72 20 61 74 20 6f  yte integer at o
f8d0: 66 66 73 65 74 20 31 20 67 69 76 65 73 20 74 68  ffset 1 gives th
f8e0: 65 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 20 6f  e.    ** start o
f8f0: 66 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65  f the first free
f900: 62 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61 67  block on the pag
f910: 65 2c 20 6f 72 20 69 73 20 7a 65 72 6f 20 69 66  e, or is zero if
f920: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20   there are no.  
f930: 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 73 2e    ** freeblocks.
f940: 20 2a 2f 0a 20 20 20 20 70 63 20 3d 20 67 65 74   */.    pc = get
f950: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
f960: 31 5d 29 3b 0a 20 20 20 20 6e 46 72 65 65 20 3d  1]);.    nFree =
f970: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74   data[hdr+7] + t
f980: 6f 70 3b 20 20 2f 2a 20 49 6e 69 74 20 6e 46 72  op;  /* Init nFr
f990: 65 65 20 74 6f 20 6e 6f 6e 2d 66 72 65 65 62 6c  ee to non-freebl
f9a0: 6f 63 6b 20 66 72 65 65 20 73 70 61 63 65 20 2a  ock free space *
f9b0: 2f 0a 20 20 20 20 69 66 28 20 70 63 3e 30 20 29  /.    if( pc>0 )
f9c0: 7b 0a 20 20 20 20 20 20 75 33 32 20 6e 65 78 74  {.      u32 next
f9d0: 2c 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66  , size;.      if
f9e0: 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20  ( pc<iCellFirst 
f9f0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56  ){.        /* EV
fa00: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35  IDENCE-OF: R-555
fa10: 33 30 2d 35 32 39 33 30 20 49 6e 20 61 20 77 65  30-52930 In a we
fa20: 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65 65  ll-formed b-tree
fa30: 20 70 61 67 65 2c 20 74 68 65 72 65 20 77 69 6c   page, there wil
fa40: 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77  l.        ** alw
fa50: 61 79 73 20 62 65 20 61 74 20 6c 65 61 73 74 20  ays be at least 
fa60: 6f 6e 65 20 63 65 6c 6c 20 62 65 66 6f 72 65 20  one cell before 
fa70: 74 68 65 20 66 69 72 73 74 20 66 72 65 65 62 6c  the first freebl
fa80: 6f 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ock..        */.
fa90: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
faa0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
fab0: 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20  PT; .      }.   
fac0: 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20     while( 1 ){. 
fad0: 20 20 20 20 20 20 20 69 66 28 20 70 63 3e 69 43         if( pc>iC
fae0: 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20  ellLast ){.     
faf0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
fb00: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
fb10: 20 2f 2a 20 46 72 65 65 62 6c 6f 63 6b 20 6f 66   /* Freeblock of
fb20: 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  f the end of the
fb30: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
fb40: 20 7d 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20   }.        next 
fb50: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
fb60: 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 20 20 73  [pc]);.        s
fb70: 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26  ize = get2byte(&
fb80: 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20  data[pc+2]);.   
fb90: 20 20 20 20 20 6e 46 72 65 65 20 3d 20 6e 46 72       nFree = nFr
fba0: 65 65 20 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20  ee + size;.     
fbb0: 20 20 20 69 66 28 20 6e 65 78 74 3c 3d 70 63 2b     if( next<=pc+
fbc0: 73 69 7a 65 2b 33 20 29 20 62 72 65 61 6b 3b 0a  size+3 ) break;.
fbd0: 20 20 20 20 20 20 20 20 70 63 20 3d 20 6e 65 78          pc = nex
fbe0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
fbf0: 20 69 66 28 20 6e 65 78 74 3e 30 20 29 7b 0a 20   if( next>0 ){. 
fc00: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
fc10: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
fc20: 54 3b 20 20 2f 2a 20 46 72 65 65 62 6c 6f 63 6b  T;  /* Freeblock
fc30: 20 6e 6f 74 20 69 6e 20 61 73 63 65 6e 64 69 6e   not in ascendin
fc40: 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20  g order */.     
fc50: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 63 2b   }.      if( pc+
fc60: 73 69 7a 65 3e 28 75 6e 73 69 67 6e 65 64 20 69  size>(unsigned i
fc70: 6e 74 29 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  nt)usableSize ){
fc80: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
fc90: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
fca0: 4b 50 54 3b 20 20 2f 2a 20 4c 61 73 74 20 66 72  KPT;  /* Last fr
fcb0: 65 65 62 6c 6f 63 6b 20 65 78 74 65 6e 64 73 20  eeblock extends 
fcc0: 70 61 73 74 20 70 61 67 65 20 65 6e 64 20 2a 2f  past page end */
fcd0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
fce0: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
fcf0: 6f 69 6e 74 2c 20 6e 46 72 65 65 20 63 6f 6e 74  oint, nFree cont
fd00: 61 69 6e 73 20 74 68 65 20 73 75 6d 20 6f 66 20  ains the sum of 
fd10: 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68  the offset to th
fd20: 65 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 6f  e start.    ** o
fd30: 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65  f the cell-conte
fd40: 6e 74 20 61 72 65 61 20 70 6c 75 73 20 74 68 65  nt area plus the
fd50: 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20   number of free 
fd60: 62 79 74 65 73 20 77 69 74 68 69 6e 0a 20 20 20  bytes within.   
fd70: 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e   ** the cell-con
fd80: 74 65 6e 74 20 61 72 65 61 2e 20 49 66 20 74 68  tent area. If th
fd90: 69 73 20 69 73 20 67 72 65 61 74 65 72 20 74 68  is is greater th
fda0: 61 6e 20 74 68 65 20 75 73 61 62 6c 65 2d 73 69  an the usable-si
fdb0: 7a 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ze.    ** of the
fdc0: 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20   page, then the 
fdd0: 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72  page must be cor
fde0: 72 75 70 74 65 64 2e 20 54 68 69 73 20 63 68 65  rupted. This che
fdf0: 63 6b 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 73  ck also.    ** s
fe00: 65 72 76 65 73 20 74 6f 20 76 65 72 69 66 79 20  erves to verify 
fe10: 74 68 61 74 20 74 68 65 20 6f 66 66 73 65 74 20  that the offset 
fe20: 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
fe30: 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74  the cell-content
fe40: 0a 20 20 20 20 2a 2a 20 61 72 65 61 2c 20 61 63  .    ** area, ac
fe50: 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 70  cording to the p
fe60: 61 67 65 20 68 65 61 64 65 72 2c 20 6c 69 65 73  age header, lies
fe70: 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65   within the page
fe80: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
fe90: 20 6e 46 72 65 65 3e 75 73 61 62 6c 65 53 69 7a   nFree>usableSiz
fea0: 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
feb0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
fec0: 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20  _BKPT; .    }.  
fed0: 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d    pPage->nFree =
fee0: 20 28 75 31 36 29 28 6e 46 72 65 65 20 2d 20 69   (u16)(nFree - i
fef0: 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20 20 20  CellFirst);.    
ff00: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
ff10: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
ff20: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
ff30: 0a 2a 2a 20 53 65 74 20 75 70 20 61 20 72 61 77  .** Set up a raw
ff40: 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 69 74   page so that it
ff50: 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61   looks like a da
ff60: 74 61 62 61 73 65 20 70 61 67 65 20 68 6f 6c 64  tabase page hold
ff70: 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65  ing.** no entrie
ff80: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
ff90: 64 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50 61  d zeroPage(MemPa
ffa0: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66  ge *pPage, int f
ffb0: 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65  lags){.  unsigne
ffc0: 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70  d char *data = p
ffd0: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42  Page->aData;.  B
ffe0: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
fff0: 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20  Page->pBt;.  u8 
10000 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
10010 4f 66 66 73 65 74 3b 0a 20 20 75 31 36 20 66 69  Offset;.  u16 fi
10020 72 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  rst;..  assert( 
10030 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
10040 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44  number(pPage->pD
10050 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70  bPage)==pPage->p
10060 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  gno );.  assert(
10070 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
10080 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
10090 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29  Page) == (void*)
100a0 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
100b0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
100c0 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
100d0 62 50 61 67 65 29 20 3d 3d 20 64 61 74 61 20 29  bPage) == data )
100e0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
100f0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
10100 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
10110 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
10120 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
10130 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
10140 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74  );.  if( pBt->bt
10150 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43  sFlags & BTS_SEC
10160 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20  URE_DELETE ){.  
10170 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68    memset(&data[h
10180 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61  dr], 0, pBt->usa
10190 62 6c 65 53 69 7a 65 20 2d 20 68 64 72 29 3b 0a  bleSize - hdr);.
101a0 20 20 7d 0a 20 20 64 61 74 61 5b 68 64 72 5d 20    }.  data[hdr] 
101b0 3d 20 28 63 68 61 72 29 66 6c 61 67 73 3b 0a 20  = (char)flags;. 
101c0 20 66 69 72 73 74 20 3d 20 68 64 72 20 2b 20 28   first = hdr + (
101d0 28 66 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29  (flags&PTF_LEAF)
101e0 3d 3d 30 20 3f 20 31 32 20 3a 20 38 29 3b 0a 20  ==0 ? 12 : 8);. 
101f0 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64   memset(&data[hd
10200 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64  r+1], 0, 4);.  d
10210 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
10220 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
10230 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73  [hdr+5], pBt->us
10240 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61  ableSize);.  pPa
10250 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36  ge->nFree = (u16
10260 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  )(pBt->usableSiz
10270 65 20 2d 20 66 69 72 73 74 29 3b 0a 20 20 64 65  e - first);.  de
10280 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c  codeFlags(pPage,
10290 20 66 6c 61 67 73 29 3b 0a 20 20 70 50 61 67 65   flags);.  pPage
102a0 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66  ->cellOffset = f
102b0 69 72 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e 61  irst;.  pPage->a
102c0 44 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b  DataEnd = &data[
102d0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d  pBt->usableSize]
102e0 3b 0a 20 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c  ;.  pPage->aCell
102f0 49 64 78 20 3d 20 26 64 61 74 61 5b 66 69 72 73  Idx = &data[firs
10300 74 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61  t];.  pPage->aDa
10310 74 61 4f 66 73 74 20 3d 20 26 64 61 74 61 5b 70  taOfst = &data[p
10320 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
10330 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f  ze];.  pPage->nO
10340 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 61  verflow = 0;.  a
10350 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65  ssert( pBt->page
10360 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74  Size>=512 && pBt
10370 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33  ->pageSize<=6553
10380 36 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61  6 );.  pPage->ma
10390 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28 70  skPage = (u16)(p
103a0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31  Bt->pageSize - 1
103b0 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  );.  pPage->nCel
103c0 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e  l = 0;.  pPage->
103d0 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a  isInit = 1;.}...
103e0 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
103f0 44 62 50 61 67 65 20 6f 62 74 61 69 6e 65 64 20  DbPage obtained 
10400 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 69  from the pager i
10410 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 75 73  nto a MemPage us
10420 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 62 74 72  ed by.** the btr
10430 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61  ee layer..*/.sta
10440 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72  tic MemPage *btr
10450 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
10460 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65  (DbPage *pDbPage
10470 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53  , Pgno pgno, BtS
10480 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d  hared *pBt){.  M
10490 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
104a0 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65  (MemPage*)sqlite
104b0 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
104c0 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 70  DbPage);.  if( p
104d0 67 6e 6f 21 3d 70 50 61 67 65 2d 3e 70 67 6e 6f  gno!=pPage->pgno
104e0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61   ){.    pPage->a
104f0 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61  Data = sqlite3Pa
10500 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
10510 67 65 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ge);.    pPage->
10520 70 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67  pDbPage = pDbPag
10530 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 42  e;.    pPage->pB
10540 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 70 50 61  t = pBt;.    pPa
10550 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b  ge->pgno = pgno;
10560 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 64 72 4f  .    pPage->hdrO
10570 66 66 73 65 74 20 3d 20 70 67 6e 6f 3d 3d 31 20  ffset = pgno==1 
10580 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20 7d 0a 20  ? 100 : 0;.  }. 
10590 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
105a0 61 44 61 74 61 3d 3d 73 71 6c 69 74 65 33 50 61  aData==sqlite3Pa
105b0 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
105c0 67 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ge) );.  return 
105d0 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  pPage; .}../*.**
105e0 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d   Get a page from
105f0 20 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69   the pager.  Ini
10600 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50  tialize the MemP
10610 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d  age.pBt and.** M
10620 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65  emPage.aData ele
10630 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e  ments if needed.
10640 20 20 53 65 65 20 61 6c 73 6f 3a 20 62 74 72 65    See also: btre
10650 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 29  eGetUnusedPage()
10660 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50  ..**.** If the P
10670 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
10680 4e 54 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  NT flag is set, 
10690 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  it means that we
106a0 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 2a 2a 20   do not care.** 
106b0 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e  about the conten
106c0 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 74  t of the page at
106d0 20 74 68 69 73 20 74 69 6d 65 2e 20 20 53 6f 20   this time.  So 
106e0 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65  do not go to the
106f0 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63   disk.** to fetc
10700 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20  h the content.  
10710 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65  Just fill in the
10720 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65   content with ze
10730 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20  ros for now..** 
10740 49 66 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  If in the future
10750 20 77 65 20 63 61 6c 6c 20 73 71 6c 69 74 65 33   we call sqlite3
10760 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20  PagerWrite() on 
10770 74 68 69 73 20 70 61 67 65 2c 20 74 68 61 74 0a  this page, that.
10780 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68 61 76 65  ** means we have
10790 20 73 74 61 72 74 65 64 20 74 6f 20 62 65 20 63   started to be c
107a0 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74 20 63  oncerned about c
107b0 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65 20 64  ontent and the d
107c0 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75  isk.** read shou
107d0 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68 61 74  ld occur at that
107e0 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69   point..*/.stati
107f0 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 50 61  c int btreeGetPa
10800 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
10810 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  pBt,       /* Th
10820 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e  e btree */.  Pgn
10830 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
10840 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
10850 68 65 20 70 61 67 65 20 74 6f 20 66 65 74 63 68  he page to fetch
10860 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
10870 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65  ppPage,    /* Re
10880 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e  turn the page in
10890 20 74 68 69 73 20 70 61 72 61 6d 65 74 65 72 20   this parameter 
108a0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
108b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47            /* PAG
108c0 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
108d0 20 6f 72 20 50 41 47 45 52 5f 47 45 54 5f 52 45   or PAGER_GET_RE
108e0 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69  ADONLY */.){.  i
108f0 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20  nt rc;.  DbPage 
10900 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73  *pDbPage;..  ass
10910 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c  ert( flags==0 ||
10920 20 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47 45   flags==PAGER_GE
10930 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 7c 7c 20 66  T_NOCONTENT || f
10940 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f  lags==PAGER_GET_
10950 52 45 41 44 4f 4e 4c 59 20 29 3b 0a 20 20 61 73  READONLY );.  as
10960 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
10970 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
10980 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  tex) );.  rc = s
10990 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
109a0 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f  Bt->pPager, pgno
109b0 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62  , (DbPage**)&pDb
109c0 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Page, flags);.  
109d0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
109e0 72 63 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20  rc;.  *ppPage = 
109f0 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50  btreePageFromDbP
10a00 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e  age(pDbPage, pgn
10a10 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65 74 75 72  o, pBt);.  retur
10a20 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
10a30 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61  /*.** Retrieve a
10a40 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70   page from the p
10a50 61 67 65 72 20 63 61 63 68 65 2e 20 49 66 20 74  ager cache. If t
10a60 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
10a70 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65  e is not.** alre
10a80 61 64 79 20 69 6e 20 74 68 65 20 70 61 67 65 72  ady in the pager
10a90 20 63 61 63 68 65 20 72 65 74 75 72 6e 20 4e 55   cache return NU
10aa0 4c 4c 2e 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  LL. Initialize t
10ab0 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61  he MemPage.pBt a
10ac0 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44  nd.** MemPage.aD
10ad0 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20  ata elements if 
10ae0 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  needed..*/.stati
10af0 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65  c MemPage *btree
10b00 50 61 67 65 4c 6f 6f 6b 75 70 28 42 74 53 68 61  PageLookup(BtSha
10b10 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
10b20 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a  gno){.  DbPage *
10b30 70 44 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72  pDbPage;.  asser
10b40 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
10b50 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
10b60 29 20 29 3b 0a 20 20 70 44 62 50 61 67 65 20 3d  ) );.  pDbPage =
10b70 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
10b80 6b 75 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  kup(pBt->pPager,
10b90 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44   pgno);.  if( pD
10ba0 62 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74  bPage ){.    ret
10bb0 75 72 6e 20 62 74 72 65 65 50 61 67 65 46 72 6f  urn btreePageFro
10bc0 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c  mDbPage(pDbPage,
10bd0 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 7d   pgno, pBt);.  }
10be0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
10bf0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
10c00 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
10c10 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61  abase file in pa
10c20 67 65 73 2e 20 49 66 20 74 68 65 72 65 20 69 73  ges. If there is
10c30 20 61 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20   any kind of.** 
10c40 65 72 72 6f 72 2c 20 72 65 74 75 72 6e 20 28 28  error, return ((
10c50 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 2d 31 29  unsigned int)-1)
10c60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f  ..*/.static Pgno
10c70 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
10c80 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
10c90 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 6e 50    return pBt->nP
10ca0 61 67 65 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74  age;.}.u32 sqlit
10cb0 65 33 42 74 72 65 65 4c 61 73 74 50 61 67 65 28  e3BtreeLastPage(
10cc0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73  Btree *p){.  ass
10cd0 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
10ce0 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
10cf0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28 70 2d  ;.  assert( ((p-
10d00 3e 70 42 74 2d 3e 6e 50 61 67 65 29 26 30 78 38  >pBt->nPage)&0x8
10d10 30 30 30 30 30 30 29 3d 3d 30 20 29 3b 0a 20 20  000000)==0 );.  
10d20 72 65 74 75 72 6e 20 62 74 72 65 65 50 61 67 65  return btreePage
10d30 63 6f 75 6e 74 28 70 2d 3e 70 42 74 29 3b 0a 7d  count(p->pBt);.}
10d40 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61  ../*.** Get a pa
10d50 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
10d60 72 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  r and initialize
10d70 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 43   it..**.** If pC
10d80 75 72 21 3d 30 20 74 68 65 6e 20 74 68 65 20 70  ur!=0 then the p
10d90 61 67 65 20 69 73 20 62 65 69 6e 67 20 66 65 74  age is being fet
10da0 63 68 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  ched as part of 
10db0 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 0a  a moveToChild().
10dc0 2a 2a 20 63 61 6c 6c 2e 20 20 44 6f 20 61 64 64  ** call.  Do add
10dd0 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 20 63  itional sanity c
10de0 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70  hecking on the p
10df0 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  age in this case
10e00 2e 0a 2a 2a 20 41 6e 64 20 69 66 20 74 68 65 20  ..** And if the 
10e10 66 65 74 63 68 20 66 61 69 6c 73 2c 20 74 68 69  fetch fails, thi
10e20 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 64  s routine must d
10e30 65 63 72 65 6d 65 6e 74 20 70 43 75 72 2d 3e 69  ecrement pCur->i
10e40 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  Page..**.** The 
10e50 70 61 67 65 20 69 73 20 66 65 74 63 68 65 64 20  page is fetched 
10e60 61 73 20 72 65 61 64 2d 77 72 69 74 65 20 75 6e  as read-write un
10e70 6c 65 73 73 20 70 43 75 72 20 69 73 20 6e 6f 74  less pCur is not
10e80 20 4e 55 4c 4c 20 61 6e 64 20 69 73 0a 2a 2a 20   NULL and is.** 
10e90 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73  a read-only curs
10ea0 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  or..**.** If an 
10eb0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
10ec0 65 6e 20 2a 70 70 50 61 67 65 20 69 73 20 75 6e  en *ppPage is un
10ed0 64 65 66 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d  defined. It.** m
10ee0 61 79 20 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e  ay remain unchan
10ef0 67 65 64 2c 20 6f 72 20 69 74 20 6d 61 79 20 62  ged, or it may b
10f00 65 20 73 65 74 20 74 6f 20 61 6e 20 69 6e 76 61  e set to an inva
10f10 6c 69 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74  lid value..*/.st
10f20 61 74 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49  atic int getAndI
10f30 6e 69 74 50 61 67 65 28 0a 20 20 42 74 53 68 61  nitPage(.  BtSha
10f40 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
10f50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
10f60 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
10f70 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
10f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f90 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
10fa0 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 67 65  f the page to ge
10fb0 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  t */.  MemPage *
10fc0 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20  *ppPage,        
10fd0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
10fe0 74 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72  the page pointer
10ff0 20 68 65 72 65 20 2a 2f 0a 20 20 42 74 43 75 72   here */.  BtCur
11000 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
11010 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
11020 72 73 6f 72 20 74 6f 20 72 65 63 65 69 76 65 20  rsor to receive 
11030 74 68 65 20 70 61 67 65 2c 20 6f 72 20 4e 55 4c  the page, or NUL
11040 4c 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 61 64  L */.  int bRead
11050 4f 6e 6c 79 20 20 20 20 20 20 20 20 20 20 20 20  Only            
11060 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
11070 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 70  or a read-only p
11080 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  age */.){.  int 
11090 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  rc;.  DbPage *pD
110a0 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28  bPage;.  assert(
110b0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
110c0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
110d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
110e0 72 3d 3d 30 20 7c 7c 20 70 70 50 61 67 65 3d 3d  r==0 || ppPage==
110f0 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  &pCur->apPage[pC
11100 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
11110 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d 30 20  assert( pCur==0 
11120 7c 7c 20 62 52 65 61 64 4f 6e 6c 79 3d 3d 70 43  || bReadOnly==pC
11130 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67  ur->curPagerFlag
11140 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  s );.  assert( p
11150 43 75 72 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  Cur==0 || pCur->
11160 69 50 61 67 65 3e 30 20 29 3b 0a 0a 20 20 69 66  iPage>0 );..  if
11170 28 20 70 67 6e 6f 3e 62 74 72 65 65 50 61 67 65  ( pgno>btreePage
11180 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20  count(pBt) ){.  
11190 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
111a0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
111b0 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50  goto getAndInitP
111c0 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  age_error;.  }. 
111d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
111e0 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
111f0 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65  r, pgno, (DbPage
11200 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 62 52 65  **)&pDbPage, bRe
11210 61 64 4f 6e 6c 79 29 3b 0a 20 20 69 66 28 20 72  adOnly);.  if( r
11220 63 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 67 65  c ){.    goto ge
11230 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72  tAndInitPage_err
11240 6f 72 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67  or;.  }.  *ppPag
11250 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71  e = (MemPage*)sq
11260 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
11270 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69  ra(pDbPage);.  i
11280 66 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73  f( (*ppPage)->is
11290 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 62  Init==0 ){.    b
112a0 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61  treePageFromDbPa
112b0 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f  ge(pDbPage, pgno
112c0 2c 20 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d  , pBt);.    rc =
112d0 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 2a   btreeInitPage(*
112e0 70 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  ppPage);.    if(
112f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11300 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
11310 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
11320 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49      goto getAndI
11330 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20  nitPage_error;. 
11340 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
11350 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 67  t( (*ppPage)->pg
11360 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73  no==pgno );.  as
11370 73 65 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d  sert( (*ppPage)-
11380 3e 61 44 61 74 61 3d 3d 73 71 6c 69 74 65 33 50  >aData==sqlite3P
11390 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
113a0 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  age) );..  /* If
113b0 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 63 68 69   obtaining a chi
113c0 6c 64 20 70 61 67 65 20 66 6f 72 20 61 20 63 75  ld page for a cu
113d0 72 73 6f 72 2c 20 77 65 20 6d 75 73 74 20 76 65  rsor, we must ve
113e0 72 69 66 79 20 74 68 61 74 20 74 68 65 20 70 61  rify that the pa
113f0 67 65 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 61  ge is.  ** compa
11400 74 69 62 6c 65 20 77 69 74 68 20 74 68 65 20 72  tible with the r
11410 6f 6f 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 69  oot page. */.  i
11420 66 28 20 70 43 75 72 20 26 26 20 28 28 2a 70 70  f( pCur && ((*pp
11430 50 61 67 65 29 2d 3e 6e 43 65 6c 6c 3c 31 20 7c  Page)->nCell<1 |
11440 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 6e 74  | (*ppPage)->int
11450 4b 65 79 21 3d 70 43 75 72 2d 3e 63 75 72 49 6e  Key!=pCur->curIn
11460 74 4b 65 79 29 20 29 7b 0a 20 20 20 20 72 63 20  tKey) ){.    rc 
11470 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
11480 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 6c 65 61  _BKPT;.    relea
11490 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
114a0 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64  .    goto getAnd
114b0 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a  InitPage_error;.
114c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
114d0 49 54 45 5f 4f 4b 3b 0a 0a 67 65 74 41 6e 64 49  ITE_OK;..getAndI
114e0 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3a 0a 20  nitPage_error:. 
114f0 20 69 66 28 20 70 43 75 72 20 29 20 70 43 75 72   if( pCur ) pCur
11500 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 74 65 73  ->iPage--;.  tes
11510 74 63 61 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29  tcase( pgno==0 )
11520 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f  ;.  assert( pgno
11530 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  !=0 || rc==SQLIT
11540 45 5f 43 4f 52 52 55 50 54 20 29 3b 0a 20 20 72  E_CORRUPT );.  r
11550 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
11560 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d  ** Release a Mem
11570 50 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75  Page.  This shou
11580 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63  ld be called onc
11590 65 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72  e for each prior
115a0 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65  .** call to btre
115b0 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61  eGetPage..*/.sta
115c0 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
115d0 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65 6d 50  PageNotNull(MemP
115e0 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 61  age *pPage){.  a
115f0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44  ssert( pPage->aD
11600 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ata );.  assert(
11610 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20   pPage->pBt );. 
11620 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
11630 70 44 62 50 61 67 65 21 3d 30 20 29 3b 0a 20 20  pDbPage!=0 );.  
11640 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
11650 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61  agerGetExtra(pPa
11660 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20  ge->pDbPage) == 
11670 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a  (void*)pPage );.
11680 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
11690 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
116a0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70  age->pDbPage)==p
116b0 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20  Page->aData );. 
116c0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
116d0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
116e0 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
116f0 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
11700 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 61  UnrefNotNull(pPa
11710 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 7d 0a  ge->pDbPage);.}.
11720 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
11730 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  asePage(MemPage 
11740 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70  *pPage){.  if( p
11750 50 61 67 65 20 29 20 72 65 6c 65 61 73 65 50 61  Page ) releasePa
11760 67 65 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 29  geNotNull(pPage)
11770 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61  ;.}../*.** Get a
11780 6e 20 75 6e 75 73 65 64 20 70 61 67 65 2e 0a 2a  n unused page..*
11790 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20  *.** This works 
117a0 6a 75 73 74 20 6c 69 6b 65 20 62 74 72 65 65 47  just like btreeG
117b0 65 74 50 61 67 65 28 29 20 77 69 74 68 20 74 68  etPage() with th
117c0 65 20 61 64 64 69 74 69 6f 6e 3a 0a 2a 2a 0a 2a  e addition:.**.*
117d0 2a 20 20 20 2a 20 20 49 66 20 74 68 65 20 70 61  *   *  If the pa
117e0 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ge is already in
117f0 20 75 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74   use for some ot
11800 68 65 72 20 70 75 72 70 6f 73 65 2c 20 69 6d 6d  her purpose, imm
11810 65 64 69 61 74 65 6c 79 0a 2a 2a 20 20 20 20 20  ediately.**     
11820 20 72 65 6c 65 61 73 65 20 69 74 20 61 6e 64 20   release it and 
11830 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45  return an SQLITE
11840 5f 43 55 52 52 55 50 54 20 65 72 72 6f 72 2e 0a  _CURRUPT error..
11850 2a 2a 20 20 20 2a 20 20 4d 61 6b 65 20 73 75 72  **   *  Make sur
11860 65 20 74 68 65 20 69 73 49 6e 69 74 20 66 6c 61  e the isInit fla
11870 67 20 69 73 20 63 6c 65 61 72 0a 2a 2f 0a 73 74  g is clear.*/.st
11880 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65  atic int btreeGe
11890 74 55 6e 75 73 65 64 50 61 67 65 28 0a 20 20 42  tUnusedPage(.  B
118a0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
118b0 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
118c0 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
118d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
118e0 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  mber of the page
118f0 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d   to fetch */.  M
11900 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
11910 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68      /* Return th
11920 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 70  e page in this p
11930 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e  arameter */.  in
11940 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  t flags         
11950 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f     /* PAGER_GET_
11960 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47  NOCONTENT or PAG
11970 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
11980 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
11990 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
119a0 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c  t, pgno, ppPage,
119b0 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72   flags);.  if( r
119c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
119d0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
119e0 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
119f0 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50  ((*ppPage)->pDbP
11a00 61 67 65 29 3e 31 20 29 7b 0a 20 20 20 20 20 20  age)>1 ){.      
11a10 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
11a20 61 67 65 29 3b 0a 20 20 20 20 20 20 2a 70 70 50  age);.      *ppP
11a30 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  age = 0;.      r
11a40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
11a50 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
11a60 0a 20 20 20 20 28 2a 70 70 50 61 67 65 29 2d 3e  .    (*ppPage)->
11a70 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65  isInit = 0;.  }e
11a80 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65  lse{.    *ppPage
11a90 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
11aa0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
11ab0 20 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   During a rollba
11ac0 63 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67  ck, when the pag
11ad0 65 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72  er reloads infor
11ae0 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20  mation into the 
11af0 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74  cache.** so that
11b00 20 74 68 65 20 63 61 63 68 65 20 69 73 20 72 65   the cache is re
11b10 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72  stored to its or
11b20 69 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20  iginal state at 
11b30 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20  the start of.** 
11b40 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  the transaction,
11b50 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 72   for each page r
11b60 65 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75  estored this rou
11b70 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
11b80 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
11b90 6e 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65  ne needs to rese
11ba0 74 20 74 68 65 20 65 78 74 72 61 20 64 61 74 61  t the extra data
11bb0 20 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20   section at the 
11bc0 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61  end of the.** pa
11bd0 67 65 20 74 6f 20 61 67 72 65 65 20 77 69 74 68  ge to agree with
11be0 20 74 68 65 20 72 65 73 74 6f 72 65 64 20 64 61   the restored da
11bf0 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ta..*/.static vo
11c00 69 64 20 70 61 67 65 52 65 69 6e 69 74 28 44 62  id pageReinit(Db
11c10 50 61 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20  Page *pData){.  
11c20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
11c30 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61    pPage = (MemPa
11c40 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  ge *)sqlite3Page
11c50 72 47 65 74 45 78 74 72 61 28 70 44 61 74 61 29  rGetExtra(pData)
11c60 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
11c70 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
11c80 6f 75 6e 74 28 70 44 61 74 61 29 3e 30 20 29 3b  ount(pData)>0 );
11c90 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73  .  if( pPage->is
11ca0 49 6e 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65  Init ){.    asse
11cb0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
11cc0 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
11cd0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20  t->mutex) );.   
11ce0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
11cf0 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   0;.    if( sqli
11d00 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
11d10 6f 75 6e 74 28 70 44 61 74 61 29 3e 31 20 29 7b  ount(pData)>1 ){
11d20 0a 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20  .      /* pPage 
11d30 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61 20 62  might not be a b
11d40 74 72 65 65 20 70 61 67 65 3b 20 20 69 74 20 6d  tree page;  it m
11d50 69 67 68 74 20 62 65 20 61 6e 20 6f 76 65 72 66  ight be an overf
11d60 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a  low page.      *
11d70 2a 20 6f 72 20 70 74 72 6d 61 70 20 70 61 67 65  * or ptrmap page
11d80 20 6f 72 20 61 20 66 72 65 65 20 70 61 67 65 2e   or a free page.
11d90 20 20 49 6e 20 74 68 6f 73 65 20 63 61 73 65 73    In those cases
11da0 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  , the following.
11db0 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f        ** call to
11dc0 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
11dd0 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74   will likely ret
11de0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
11df0 50 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75 74  PT..      ** But
11e00 20 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e 65   no harm is done
11e10 20 62 79 20 74 68 69 73 2e 20 20 41 6e 64 20 69   by this.  And i
11e20 74 20 69 73 20 76 65 72 79 20 69 6d 70 6f 72 74  t is very import
11e30 61 6e 74 20 74 68 61 74 0a 20 20 20 20 20 20 2a  ant that.      *
11e40 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  * btreeInitPage(
11e50 29 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65  ) be called on e
11e60 76 65 72 79 20 62 74 72 65 65 20 70 61 67 65 20  very btree page 
11e70 73 6f 20 77 65 20 6d 61 6b 65 0a 20 20 20 20 20  so we make.     
11e80 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f 72   ** the call for
11e90 20 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74   every page that
11ea0 20 63 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72 65   comes in for re
11eb0 2d 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20  -initing. */.   
11ec0 20 20 20 62 74 72 65 65 49 6e 69 74 50 61 67 65     btreeInitPage
11ed0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  (pPage);.    }. 
11ee0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f   }.}../*.** Invo
11ef0 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
11f00 6c 65 72 20 66 6f 72 20 61 20 62 74 72 65 65 2e  ler for a btree.
11f10 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
11f20 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61  treeInvokeBusyHa
11f30 6e 64 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67  ndler(void *pArg
11f40 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
11f50 42 74 20 3d 20 28 42 74 53 68 61 72 65 64 2a 29  Bt = (BtShared*)
11f60 70 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20  pArg;.  assert( 
11f70 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73  pBt->db );.  ass
11f80 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
11f90 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d  ex_held(pBt->db-
11fa0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74  >mutex) );.  ret
11fb0 75 72 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b  urn sqlite3Invok
11fc0 65 42 75 73 79 48 61 6e 64 6c 65 72 28 26 70 42  eBusyHandler(&pB
11fd0 74 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c  t->db->busyHandl
11fe0 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  er);.}../*.** Op
11ff0 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69  en a database fi
12000 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65  le..** .** zFile
12010 6e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65  name is the name
12020 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
12030 20 66 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65   file.  If zFile
12040 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20  name is NULL.** 
12050 74 68 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61  then an ephemera
12060 6c 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72  l database is cr
12070 65 61 74 65 64 2e 20 20 54 68 65 20 65 70 68 65  eated.  The ephe
12080 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 6d  meral database m
12090 69 67 68 74 0a 2a 2a 20 62 65 20 65 78 63 6c 75  ight.** be exclu
120a0 73 69 76 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79  sively in memory
120b0 2c 20 6f 72 20 69 74 20 6d 69 67 68 74 20 75 73  , or it might us
120c0 65 20 61 20 64 69 73 6b 2d 62 61 73 65 64 20 6d  e a disk-based m
120d0 65 6d 6f 72 79 20 63 61 63 68 65 2e 0a 2a 2a 20  emory cache..** 
120e0 45 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20  Either way, the 
120f0 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61  ephemeral databa
12100 73 65 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d  se will be autom
12110 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64  atically deleted
12120 20 0a 2a 2a 20 77 68 65 6e 20 73 71 6c 69 74 65   .** when sqlite
12130 33 42 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73  3BtreeClose() is
12140 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   called..**.** I
12150 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22  f zFilename is "
12160 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61  :memory:" then a
12170 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
12180 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64 0a  base is created.
12190 2a 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d  ** that is autom
121a0 61 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79  atically destroy
121b0 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c  ed when it is cl
121c0 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  osed..**.** The 
121d0 22 66 6c 61 67 73 22 20 70 61 72 61 6d 65 74 65  "flags" paramete
121e0 72 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74  r is a bitmask t
121f0 68 61 74 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  hat might contai
12200 6e 20 62 69 74 73 20 6c 69 6b 65 0a 2a 2a 20 42  n bits like.** B
12210 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41  TREE_OMIT_JOURNA
12220 4c 20 61 6e 64 2f 6f 72 20 42 54 52 45 45 5f 4d  L and/or BTREE_M
12230 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  EMORY..**.** If 
12240 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
12250 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69  already opened i
12260 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
12270 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
12280 2a 20 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20  * and we are in 
12290 73 68 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64  shared cache mod
122a0 65 2c 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e  e, then the open
122b0 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20   will fail with 
122c0 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e  an.** SQLITE_CON
122d0 53 54 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20  STRAINT error.  
122e0 57 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20  We cannot allow 
122f0 74 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68  two or more BtSh
12300 61 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20  ared.** objects 
12310 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  in the same data
12320 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
12330 73 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77  since doing so w
12340 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70  ill lead.** to p
12350 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63  roblems with loc
12360 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  king..*/.int sql
12370 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20  ite3BtreeOpen(. 
12380 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
12390 66 73 2c 20 20 20 20 20 20 2f 2a 20 56 46 53 20  fs,      /* VFS 
123a0 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20  to use for this 
123b0 62 2d 74 72 65 65 20 2a 2f 0a 20 20 63 6f 6e 73  b-tree */.  cons
123c0 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
123d0 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  e,  /* Name of t
123e0 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69  he file containi
123f0 6e 67 20 74 68 65 20 42 54 72 65 65 20 64 61 74  ng the BTree dat
12400 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74  abase */.  sqlit
12410 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
12420 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64     /* Associated
12430 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
12440 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70   */.  Btree **pp
12450 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a  Btree,        /*
12460 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20   Pointer to new 
12470 42 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69  Btree object wri
12480 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69  tten here */.  i
12490 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
124a0 20 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e         /* Option
124b0 73 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c  s */.  int vfsFl
124c0 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
124d0 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74  * Flags passed t
124e0 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65  hrough to sqlite
124f0 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f  3_vfs.xOpen() */
12500 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  .){.  BtShared *
12510 70 42 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  pBt = 0;        
12520 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70       /* Shared p
12530 61 72 74 20 6f 66 20 62 74 72 65 65 20 73 74 72  art of btree str
12540 75 63 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65  ucture */.  Btre
12550 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  e *p;           
12560 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
12570 6e 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a  ndle to return *
12580 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
12590 78 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30  x *mutexOpen = 0
125a0 3b 20 20 2f 2a 20 50 72 65 76 65 6e 74 73 20 61  ;  /* Prevents a
125b0 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e   race condition.
125c0 20 54 69 63 6b 65 74 20 23 33 35 33 37 20 2a 2f   Ticket #3537 */
125d0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
125e0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
125f0 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
12600 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74   from this funct
12610 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73  ion */.  u8 nRes
12620 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20  erve;           
12630 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20          /* Byte 
12640 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 20  of unused space 
12650 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a  on each page */.
12660 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
12670 7a 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 20  zDbHeader[100]; 
12680 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 65 61   /* Database hea
12690 64 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a  der content */..
126a0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 70 65    /* True if ope
126b0 6e 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61  ning an ephemera
126c0 6c 2c 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74  l, temporary dat
126d0 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  abase */.  const
126e0 20 69 6e 74 20 69 73 54 65 6d 70 44 62 20 3d 20   int isTempDb = 
126f0 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20  zFilename==0 || 
12700 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b  zFilename[0]==0;
12710 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76  ..  /* Set the v
12720 61 72 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20  ariable isMemdb 
12730 74 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69  to true for an i
12740 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
12750 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73  e, or .  ** fals
12760 65 20 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73  e for a file-bas
12770 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  ed database..  *
12780 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
12790 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20  OMIT_MEMORYDB.  
127a0 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64  const int isMemd
127b0 62 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 63  b = 0;.#else.  c
127c0 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62  onst int isMemdb
127d0 20 3d 20 28 7a 46 69 6c 65 6e 61 6d 65 20 26 26   = (zFilename &&
127e0 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d   strcmp(zFilenam
127f0 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d  e, ":memory:")==
12800 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0).             
12810 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 73            || (is
12820 54 65 6d 70 44 62 20 26 26 20 73 71 6c 69 74 65  TempDb && sqlite
12830 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64 62  3TempInMemory(db
12840 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
12850 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 76 66            || (vf
12860 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  sFlags & SQLITE_
12870 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b  OPEN_MEMORY)!=0;
12880 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
12890 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73  t( db!=0 );.  as
128a0 73 65 72 74 28 20 70 56 66 73 21 3d 30 20 29 3b  sert( pVfs!=0 );
128b0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
128c0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
128d0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
128e0 73 65 72 74 28 20 28 66 6c 61 67 73 26 30 78 66  sert( (flags&0xf
128f0 66 29 3d 3d 66 6c 61 67 73 20 29 3b 20 20 20 2f  f)==flags );   /
12900 2a 20 66 6c 61 67 73 20 66 69 74 20 69 6e 20 38  * flags fit in 8
12910 20 62 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f   bits */..  /* O
12920 6e 6c 79 20 61 20 42 54 52 45 45 5f 53 49 4e 47  nly a BTREE_SING
12930 4c 45 20 64 61 74 61 62 61 73 65 20 63 61 6e 20  LE database can 
12940 62 65 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52  be BTREE_UNORDER
12950 45 44 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ED */.  assert( 
12960 28 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 55  (flags & BTREE_U
12970 4e 4f 52 44 45 52 45 44 29 3d 3d 30 20 7c 7c 20  NORDERED)==0 || 
12980 28 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53  (flags & BTREE_S
12990 49 4e 47 4c 45 29 21 3d 30 20 29 3b 0a 0a 20 20  INGLE)!=0 );..  
129a0 2f 2a 20 41 20 42 54 52 45 45 5f 53 49 4e 47 4c  /* A BTREE_SINGL
129b0 45 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c  E database is al
129c0 77 61 79 73 20 61 20 74 65 6d 70 6f 72 61 72 79  ways a temporary
129d0 20 61 6e 64 2f 6f 72 20 65 70 68 65 6d 65 72 61   and/or ephemera
129e0 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  l */.  assert( (
129f0 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49  flags & BTREE_SI
12a00 4e 47 4c 45 29 3d 3d 30 20 7c 7c 20 69 73 54 65  NGLE)==0 || isTe
12a10 6d 70 44 62 20 29 3b 0a 0a 20 20 69 66 28 20 69  mpDb );..  if( i
12a20 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 66 6c  sMemdb ){.    fl
12a30 61 67 73 20 7c 3d 20 42 54 52 45 45 5f 4d 45 4d  ags |= BTREE_MEM
12a40 4f 52 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28  ORY;.  }.  if( (
12a50 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54  vfsFlags & SQLIT
12a60 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 21  E_OPEN_MAIN_DB)!
12a70 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62 20 7c  =0 && (isMemdb |
12a80 7c 20 69 73 54 65 6d 70 44 62 29 20 29 7b 0a 20  | isTempDb) ){. 
12a90 20 20 20 76 66 73 46 6c 61 67 73 20 3d 20 28 76     vfsFlags = (v
12aa0 66 73 46 6c 61 67 73 20 26 20 7e 53 51 4c 49 54  fsFlags & ~SQLIT
12ab0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20  E_OPEN_MAIN_DB) 
12ac0 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  | SQLITE_OPEN_TE
12ad0 4d 50 5f 44 42 3b 0a 20 20 7d 0a 20 20 70 20 3d  MP_DB;.  }.  p =
12ae0 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
12af0 72 6f 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29  ro(sizeof(Btree)
12b00 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20  );.  if( !p ){. 
12b10 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12b20 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
12b30 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20  .  p->inTrans = 
12b40 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d  TRANS_NONE;.  p-
12b50 3e 64 62 20 3d 20 64 62 3b 0a 23 69 66 6e 64 65  >db = db;.#ifnde
12b60 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
12b70 41 52 45 44 5f 43 41 43 48 45 0a 20 20 70 2d 3e  ARED_CACHE.  p->
12b80 6c 6f 63 6b 2e 70 42 74 72 65 65 20 3d 20 70 3b  lock.pBtree = p;
12b90 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c  .  p->lock.iTabl
12ba0 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 23  e = 1;.#endif..#
12bb0 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
12bc0 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
12bd0 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65  ACHE) && !define
12be0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  d(SQLITE_OMIT_DI
12bf0 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20  SKIO).  /*.  ** 
12c00 49 66 20 74 68 69 73 20 42 74 72 65 65 20 69 73  If this Btree is
12c10 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72   a candidate for
12c20 20 73 68 61 72 65 64 20 63 61 63 68 65 2c 20 74   shared cache, t
12c30 72 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20  ry to find an.  
12c40 2a 2a 20 65 78 69 73 74 69 6e 67 20 42 74 53 68  ** existing BtSh
12c50 61 72 65 64 20 6f 62 6a 65 63 74 20 74 68 61 74  ared object that
12c60 20 77 65 20 63 61 6e 20 73 68 61 72 65 20 77 69   we can share wi
12c70 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  th.  */.  if( is
12c80 54 65 6d 70 44 62 3d 3d 30 20 26 26 20 28 69 73  TempDb==0 && (is
12c90 4d 65 6d 64 62 3d 3d 30 20 7c 7c 20 28 76 66 73  Memdb==0 || (vfs
12ca0 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45  Flags&SQLITE_OPE
12cb0 4e 5f 55 52 49 29 21 3d 30 29 20 29 7b 0a 20 20  N_URI)!=0) ){.  
12cc0 20 20 69 66 28 20 76 66 73 46 6c 61 67 73 20 26    if( vfsFlags &
12cd0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41   SQLITE_OPEN_SHA
12ce0 52 45 44 43 41 43 48 45 20 29 7b 0a 20 20 20 20  REDCACHE ){.    
12cf0 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 20    int nFilename 
12d00 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
12d10 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 3b 0a  0(zFilename)+1;.
12d20 20 20 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50        int nFullP
12d30 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e  athname = pVfs->
12d40 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20  mxPathname+1;.  
12d50 20 20 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50      char *zFullP
12d60 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
12d70 33 4d 61 6c 6c 6f 63 28 4d 41 58 28 6e 46 75 6c  3Malloc(MAX(nFul
12d80 6c 50 61 74 68 6e 61 6d 65 2c 6e 46 69 6c 65 6e  lPathname,nFilen
12d90 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 4d 55 54  ame));.      MUT
12da0 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65  EX_LOGIC( sqlite
12db0 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68  3_mutex *mutexSh
12dc0 61 72 65 64 3b 20 29 0a 0a 20 20 20 20 20 20 70  ared; )..      p
12dd0 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a  ->sharable = 1;.
12de0 20 20 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c        if( !zFull
12df0 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
12e00 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
12e10 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  (p);.        ret
12e20 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
12e30 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  _BKPT;.      }. 
12e40 20 20 20 20 20 69 66 28 20 69 73 4d 65 6d 64 62       if( isMemdb
12e50 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
12e60 70 79 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  py(zFullPathname
12e70 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 69  , zFilename, nFi
12e80 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  lename);.      }
12e90 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
12ea0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c   = sqlite3OsFull
12eb0 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a  Pathname(pVfs, z
12ec0 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20  Filename,.      
12ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 46 75               nFu
12ef0 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c  llPathname, zFul
12f00 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
12f10 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
12f20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
12f30 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  free(zFullPathna
12f40 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  me);.          s
12f50 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
12f60 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
12f70 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
12f80 20 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54       }.#if SQLIT
12f90 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20 20  E_THREADSAFE.   
12fa0 20 20 20 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73     mutexOpen = s
12fb0 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
12fc0 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
12fd0 41 54 49 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20  ATIC_OPEN);.    
12fe0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
12ff0 65 6e 74 65 72 28 6d 75 74 65 78 4f 70 65 6e 29  enter(mutexOpen)
13000 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68 61  ;.      mutexSha
13010 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  red = sqlite3Mut
13020 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
13030 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
13040 45 52 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ER);.      sqlit
13050 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d  e3_mutex_enter(m
13060 75 74 65 78 53 68 61 72 65 64 29 3b 0a 23 65 6e  utexShared);.#en
13070 64 69 66 0a 20 20 20 20 20 20 66 6f 72 28 70 42  dif.      for(pB
13080 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  t=GLOBAL(BtShare
13090 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
130a0 43 61 63 68 65 4c 69 73 74 29 3b 20 70 42 74 3b  CacheList); pBt;
130b0 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29   pBt=pBt->pNext)
130c0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
130d0 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b  ( pBt->nRef>0 );
130e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d  .        if( 0==
130f0 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68  strcmp(zFullPath
13100 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 50 61 67  name, sqlite3Pag
13110 65 72 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e  erFilename(pBt->
13120 70 50 61 67 65 72 2c 20 30 29 29 0a 20 20 20 20  pPager, 0)).    
13130 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
13140 73 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28  sqlite3PagerVfs(
13150 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56  pBt->pPager)==pV
13160 66 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  fs ){.          
13170 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20  int iDb;.       
13180 20 20 20 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e     for(iDb=db->n
13190 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44  Db-1; iDb>=0; iD
131a0 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20  b--){.          
131b0 20 20 42 74 72 65 65 20 2a 70 45 78 69 73 74 69    Btree *pExisti
131c0 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  ng = db->aDb[iDb
131d0 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20  ].pBt;.         
131e0 20 20 20 69 66 28 20 70 45 78 69 73 74 69 6e 67     if( pExisting
131f0 20 26 26 20 70 45 78 69 73 74 69 6e 67 2d 3e 70   && pExisting->p
13200 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20  Bt==pBt ){.     
13210 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
13220 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
13230 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  exShared);.     
13240 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
13250 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
13260 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20  exOpen);.       
13270 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
13280 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
13290 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
132a0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
132b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
132c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
132d0 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20  ONSTRAINT;.     
132e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
132f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
13300 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20  ->pBt = pBt;.   
13310 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66         pBt->nRef
13320 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  ++;.          br
13330 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
13340 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
13350 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
13360 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
13370 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
13380 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
13390 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
133a0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
133b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49  else{.      /* I
133c0 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65  n debug mode, we
133d0 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73   mark all persis
133e0 74 65 6e 74 20 64 61 74 61 62 61 73 65 73 20 61  tent databases a
133f0 73 20 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20  s sharable.     
13400 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68   ** even when th
13410 65 79 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69  ey are not.  Thi
13420 73 20 65 78 65 72 63 69 73 65 73 20 74 68 65 20  s exercises the 
13430 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64  locking code and
13440 0a 20 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20  .      ** gives 
13450 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79  more opportunity
13460 20 66 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c   for asserts(sql
13470 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
13480 29 29 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  )).      ** stat
13490 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c  ements to find l
134a0 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e  ocking problems.
134b0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
134c0 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b  p->sharable = 1;
134d0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
134e0 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
134f0 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a  Bt==0 ){.    /*.
13500 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f      ** The follo
13510 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b  wing asserts mak
13520 65 20 73 75 72 65 20 74 68 61 74 20 73 74 72 75  e sure that stru
13530 63 74 75 72 65 73 20 75 73 65 64 20 62 79 20 74  ctures used by t
13540 68 65 20 62 74 72 65 65 20 61 72 65 0a 20 20 20  he btree are.   
13550 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73 69   ** the right si
13560 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20  ze.  This is to 
13570 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 73 69  guard against si
13580 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61 74 20  ze changes that 
13590 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68  result.    ** wh
135a0 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20  en compiling on 
135b0 61 20 64 69 66 66 65 72 65 6e 74 20 61 72 63 68  a different arch
135c0 69 74 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f  itecture..    */
135d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
135e0 65 6f 66 28 69 36 34 29 3d 3d 38 20 29 3b 0a 20  eof(i64)==8 );. 
135f0 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
13600 66 28 75 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20  f(u64)==8 );.   
13610 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
13620 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61  u32)==4 );.    a
13630 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31  ssert( sizeof(u1
13640 36 29 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73  6)==2 );.    ass
13650 65 72 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f  ert( sizeof(Pgno
13660 29 3d 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70  )==4 );.  .    p
13670 42 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  Bt = sqlite3Mall
13680 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a  ocZero( sizeof(*
13690 70 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  pBt) );.    if( 
136a0 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pBt==0 ){.      
136b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
136c0 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  M_BKPT;.      go
136d0 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
136e0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  t;.    }.    rc 
136f0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
13700 65 6e 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70  en(pVfs, &pBt->p
13710 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65  Pager, zFilename
13720 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13730 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
13740 6f 66 28 4d 65 6d 50 61 67 65 29 2c 20 66 6c 61  of(MemPage), fla
13750 67 73 2c 20 76 66 73 46 6c 61 67 73 2c 20 70 61  gs, vfsFlags, pa
13760 67 65 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 69  geReinit);.    i
13770 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
13780 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
13790 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d  3PagerSetMmapLim
137a0 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  it(pBt->pPager, 
137b0 64 62 2d 3e 73 7a 4d 6d 61 70 29 3b 0a 20 20 20  db->szMmap);.   
137c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
137d0 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64  agerReadFilehead
137e0 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73  er(pBt->pPager,s
137f0 69 7a 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29  izeof(zDbHeader)
13800 2c 7a 44 62 48 65 61 64 65 72 29 3b 0a 20 20 20  ,zDbHeader);.   
13810 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
13820 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13830 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65    goto btree_ope
13840 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  n_out;.    }.   
13850 20 70 42 74 2d 3e 6f 70 65 6e 46 6c 61 67 73 20   pBt->openFlags 
13860 3d 20 28 75 38 29 66 6c 61 67 73 3b 0a 20 20 20  = (u8)flags;.   
13870 20 70 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20   pBt->db = db;. 
13880 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
13890 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 70 42  etBusyhandler(pB
138a0 74 2d 3e 70 50 61 67 65 72 2c 20 62 74 72 65 65  t->pPager, btree
138b0 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
138c0 72 2c 20 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e  r, pBt);.    p->
138d0 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20  pBt = pBt;.  .  
138e0 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d    pBt->pCursor =
138f0 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61   0;.    pBt->pPa
13900 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ge1 = 0;.    if(
13910 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72   sqlite3PagerIsr
13920 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61  eadonly(pBt->pPa
13930 67 65 72 29 20 29 20 70 42 74 2d 3e 62 74 73 46  ger) ) pBt->btsF
13940 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44  lags |= BTS_READ
13950 5f 4f 4e 4c 59 3b 0a 23 69 66 64 65 66 20 53 51  _ONLY;.#ifdef SQ
13960 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
13970 54 45 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46  TE.    pBt->btsF
13980 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55  lags |= BTS_SECU
13990 52 45 5f 44 45 4c 45 54 45 3b 0a 23 65 6e 64 69  RE_DELETE;.#endi
139a0 66 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  f.    /* EVIDENC
139b0 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33 2d 33 39  E-OF: R-51873-39
139c0 36 31 38 20 54 68 65 20 70 61 67 65 20 73 69 7a  618 The page siz
139d0 65 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65  e for a database
139e0 20 66 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20   file is.    ** 
139f0 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
13a00 65 20 32 2d 62 79 74 65 20 69 6e 74 65 67 65 72  e 2-byte integer
13a10 20 6c 6f 63 61 74 65 64 20 61 74 20 61 6e 20 6f   located at an o
13a20 66 66 73 65 74 20 6f 66 20 31 36 20 62 79 74 65  ffset of 16 byte
13a30 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68  s from.    ** th
13a40 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
13a50 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
13a60 2e 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 70 61  . */.    pBt->pa
13a70 67 65 53 69 7a 65 20 3d 20 28 7a 44 62 48 65 61  geSize = (zDbHea
13a80 64 65 72 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 7a  der[16]<<8) | (z
13a90 44 62 48 65 61 64 65 72 5b 31 37 5d 3c 3c 31 36  DbHeader[17]<<16
13aa0 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  );.    if( pBt->
13ab0 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20  pageSize<512 || 
13ac0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51  pBt->pageSize>SQ
13ad0 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
13ae0 5a 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  ZE.         || (
13af0 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31  (pBt->pageSize-1
13b00 29 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  )&pBt->pageSize)
13b10 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74  !=0 ){.      pBt
13b20 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a  ->pageSize = 0;.
13b30 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13b40 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
13b50 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d       /* If the m
13b60 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f  agic name ":memo
13b70 72 79 3a 22 20 77 69 6c 6c 20 63 72 65 61 74 65  ry:" will create
13b80 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
13b90 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 20 20 20  tabase, then.   
13ba0 20 20 20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20     ** leave the 
13bb0 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20  autoVacuum mode 
13bc0 61 74 20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74  at 0 (do not aut
13bd0 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76 65 6e 20  o-vacuum), even 
13be0 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49  if.      ** SQLI
13bf0 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
13c00 41 43 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f  ACUUM is true. O
13c10 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  n the other hand
13c20 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51  , if.      ** SQ
13c30 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
13c40 44 42 20 68 61 73 20 62 65 65 6e 20 64 65 66 69  DB has been defi
13c50 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f  ned, then ":memo
13c60 72 79 3a 22 20 69 73 20 6a 75 73 74 20 61 0a 20  ry:" is just a. 
13c70 20 20 20 20 20 2a 2a 20 72 65 67 75 6c 61 72 20       ** regular 
13c80 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68  file-name. In th
13c90 69 73 20 63 61 73 65 20 74 68 65 20 61 75 74 6f  is case the auto
13ca0 2d 76 61 63 75 75 6d 20 61 70 70 6c 69 65 73 20  -vacuum applies 
13cb0 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20  as per normal.. 
13cc0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
13cd0 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21  ( zFilename && !
13ce0 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20  isMemdb ){.     
13cf0 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
13d00 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46  um = (SQLITE_DEF
13d10 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  AULT_AUTOVACUUM 
13d20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  ? 1 : 0);.      
13d30 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
13d40 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41  m = (SQLITE_DEFA
13d50 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d  ULT_AUTOVACUUM==
13d60 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20  2 ? 1 : 0);.    
13d70 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
13d80 20 6e 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20   nReserve = 0;. 
13d90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13da0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
13db0 52 2d 33 37 34 39 37 2d 34 32 34 31 32 20 54 68  R-37497-42412 Th
13dc0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65  e size of the re
13dd0 73 65 72 76 65 64 20 72 65 67 69 6f 6e 20 69 73  served region is
13de0 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65 72 6d  .      ** determ
13df0 69 6e 65 64 20 62 79 20 74 68 65 20 6f 6e 65 2d  ined by the one-
13e00 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20 69 6e  byte unsigned in
13e10 74 65 67 65 72 20 66 6f 75 6e 64 20 61 74 20 61  teger found at a
13e20 6e 20 6f 66 66 73 65 74 20 6f 66 20 32 30 0a 20  n offset of 20. 
13e30 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65       ** into the
13e40 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
13e50 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  eader. */.      
13e60 6e 52 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65  nReserve = zDbHe
13e70 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20  ader[20];.      
13e80 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
13e90 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49   BTS_PAGESIZE_FI
13ea0 58 45 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  XED;.#ifndef SQL
13eb0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
13ec0 55 55 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e 61  UUM.      pBt->a
13ed0 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74  utoVacuum = (get
13ee0 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72  4byte(&zDbHeader
13ef0 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29  [36 + 4*4])?1:0)
13f00 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63  ;.      pBt->inc
13f10 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  rVacuum = (get4b
13f20 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33  yte(&zDbHeader[3
13f30 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 7*4])?1:0);.
13f40 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
13f50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
13f60 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42  erSetPagesize(pB
13f70 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d  t->pPager, &pBt-
13f80 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65  >pageSize, nRese
13f90 72 76 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  rve);.    if( rc
13fa0 20 29 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70   ) goto btree_op
13fb0 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 70 42 74 2d  en_out;.    pBt-
13fc0 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42  >usableSize = pB
13fd0 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52  t->pageSize - nR
13fe0 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65  eserve;.    asse
13ff0 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65 53 69  rt( (pBt->pageSi
14000 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f  ze & 7)==0 );  /
14010 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65  * 8-byte alignme
14020 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65 20 2a  nt of pageSize *
14030 2f 0a 20 20 20 0a 23 69 66 20 21 64 65 66 69 6e  /.   .#if !defin
14040 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
14050 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
14060 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
14070 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20  OMIT_DISKIO).   
14080 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20   /* Add the new 
14090 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
140a0 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  to the linked li
140b0 73 74 20 73 68 61 72 61 62 6c 65 20 42 74 53 68  st sharable BtSh
140c0 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  areds..    */.  
140d0 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b    pBt->nRef = 1;
140e0 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72  .    if( p->shar
140f0 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 4d 55  able ){.      MU
14100 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74  TEX_LOGIC( sqlit
14110 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53  e3_mutex *mutexS
14120 68 61 72 65 64 3b 20 29 0a 20 20 20 20 20 20 4d  hared; ).      M
14130 55 54 45 58 5f 4c 4f 47 49 43 28 20 6d 75 74 65  UTEX_LOGIC( mute
14140 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65  xShared = sqlite
14150 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
14160 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
14170 4d 41 53 54 45 52 29 3b 29 0a 20 20 20 20 20 20  MASTER);).      
14180 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41  if( SQLITE_THREA
14190 44 53 41 46 45 20 26 26 20 73 71 6c 69 74 65 33  DSAFE && sqlite3
141a0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
141b0 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20  reMutex ){.     
141c0 20 20 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20     pBt->mutex = 
141d0 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
141e0 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46  c(SQLITE_MUTEX_F
141f0 41 53 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66  AST);.        if
14200 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20  ( pBt->mutex==0 
14210 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
14220 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
14230 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67  KPT;.          g
14240 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
14250 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ut;.        }.  
14260 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
14270 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
14280 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
14290 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d      pBt->pNext =
142a0 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
142b0 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
142c0 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20  acheList);.     
142d0 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
142e0 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
142f0 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74 3b  acheList) = pBt;
14300 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
14310 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
14320 53 68 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23  Shared);.    }.#
14330 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21  endif.  }..#if !
14340 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
14350 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
14360 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
14370 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
14380 29 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65  ).  /* If the ne
14390 77 20 42 74 72 65 65 20 75 73 65 73 20 61 20 73  w Btree uses a s
143a0 68 61 72 61 62 6c 65 20 70 42 74 53 68 61 72 65  harable pBtShare
143b0 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65  d, then link the
143c0 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65 65 20   new.  ** Btree 
143d0 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66  into the list of
143e0 20 61 6c 6c 20 73 68 61 72 61 62 6c 65 20 42 74   all sharable Bt
143f0 72 65 65 73 20 66 6f 72 20 74 68 65 20 73 61 6d  rees for the sam
14400 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20  e connection..  
14410 2a 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 6b  ** The list is k
14420 65 70 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  ept in ascending
14430 20 6f 72 64 65 72 20 62 79 20 70 42 74 20 61 64   order by pBt ad
14440 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  dress..  */.  if
14450 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b  ( p->sharable ){
14460 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
14470 42 74 72 65 65 20 2a 70 53 69 62 3b 0a 20 20 20  Btree *pSib;.   
14480 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
14490 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
144a0 20 69 66 28 20 28 70 53 69 62 20 3d 20 64 62 2d   if( (pSib = db-
144b0 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20  >aDb[i].pBt)!=0 
144c0 26 26 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c  && pSib->sharabl
144d0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69  e ){.        whi
144e0 6c 65 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20  le( pSib->pPrev 
144f0 29 7b 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e  ){ pSib = pSib->
14500 70 50 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20  pPrev; }.       
14510 20 69 66 28 20 28 75 70 74 72 29 70 2d 3e 70 42   if( (uptr)p->pB
14520 74 3c 28 75 70 74 72 29 70 53 69 62 2d 3e 70 42  t<(uptr)pSib->pB
14530 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  t ){.          p
14540 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a  ->pNext = pSib;.
14550 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72            p->pPr
14560 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ev = 0;.        
14570 20 20 70 53 69 62 2d 3e 70 50 72 65 76 20 3d 20    pSib->pPrev = 
14580 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  p;.        }else
14590 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  {.          whil
145a0 65 28 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 26  e( pSib->pNext &
145b0 26 20 28 75 70 74 72 29 70 53 69 62 2d 3e 70 4e  & (uptr)pSib->pN
145c0 65 78 74 2d 3e 70 42 74 3c 28 75 70 74 72 29 70  ext->pBt<(uptr)p
145d0 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ->pBt ){.       
145e0 20 20 20 20 20 70 53 69 62 20 3d 20 70 53 69 62       pSib = pSib
145f0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
14600 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
14610 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e  ->pNext = pSib->
14620 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
14630 20 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62   p->pPrev = pSib
14640 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
14650 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  p->pNext ){.    
14660 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
14670 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20  ->pPrev = p;.   
14680 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14690 20 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d     pSib->pNext =
146a0 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   p;.        }.  
146b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
146c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
146d0 65 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65  endif.  *ppBtree
146e0 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65   = p;..btree_ope
146f0 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21  n_out:.  if( rc!
14700 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14710 20 20 69 66 28 20 70 42 74 20 26 26 20 70 42 74    if( pBt && pBt
14720 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20  ->pPager ){.    
14730 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c    sqlite3PagerCl
14740 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ose(pBt->pPager,
14750 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   0);.    }.    s
14760 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29  qlite3_free(pBt)
14770 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
14780 65 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 42 74  ee(p);.    *ppBt
14790 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ree = 0;.  }else
147a0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  {.    sqlite3_fi
147b0 6c 65 20 2a 70 46 69 6c 65 3b 0a 0a 20 20 20 20  le *pFile;..    
147c0 2f 2a 20 49 66 20 74 68 65 20 42 2d 54 72 65 65  /* If the B-Tree
147d0 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
147e0 79 20 6f 70 65 6e 65 64 2c 20 73 65 74 20 74 68  y opened, set th
147f0 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 73 69  e pager-cache si
14800 7a 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a  ze to the.    **
14810 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 2e 20   default value. 
14820 45 78 63 65 70 74 2c 20 77 68 65 6e 20 6f 70 65  Except, when ope
14830 6e 69 6e 67 20 6f 6e 20 61 6e 20 65 78 69 73 74  ning on an exist
14840 69 6e 67 20 73 68 61 72 65 64 20 70 61 67 65 72  ing shared pager
14850 2d 63 61 63 68 65 2c 0a 20 20 20 20 2a 2a 20 64  -cache,.    ** d
14860 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65  o not change the
14870 20 70 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a   pager-cache siz
14880 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
14890 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 63  ( sqlite3BtreeSc
148a0 68 65 6d 61 28 70 2c 20 30 2c 20 30 29 3d 3d 30  hema(p, 0, 0)==0
148b0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
148c0 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69  3PagerSetCachesi
148d0 7a 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65  ze(p->pBt->pPage
148e0 72 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  r, SQLITE_DEFAUL
148f0 54 5f 43 41 43 48 45 5f 53 49 5a 45 29 3b 0a 20  T_CACHE_SIZE);. 
14900 20 20 20 7d 0a 0a 20 20 20 20 70 46 69 6c 65 20     }..    pFile 
14910 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69  = sqlite3PagerFi
14920 6c 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  le(pBt->pPager);
14930 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
14940 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
14950 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43    sqlite3OsFileC
14960 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 46 69 6c 65  ontrolHint(pFile
14970 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50  , SQLITE_FCNTL_P
14980 44 42 2c 20 28 76 6f 69 64 2a 29 26 70 42 74 2d  DB, (void*)&pBt-
14990 3e 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  >db);.    }.  }.
149a0 20 20 69 66 28 20 6d 75 74 65 78 4f 70 65 6e 20    if( mutexOpen 
149b0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
149c0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
149d0 64 28 6d 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a  d(mutexOpen) );.
149e0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
149f0 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65  x_leave(mutexOpe
14a00 6e 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  n);.  }.  assert
14a10 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14a20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  || sqlite3BtreeC
14a30 6f 6e 6e 65 63 74 69 6f 6e 43 6f 75 6e 74 28 2a  onnectionCount(*
14a40 70 70 42 74 72 65 65 29 3e 30 20 29 3b 0a 20 20  ppBtree)>0 );.  
14a50 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
14a60 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68  .** Decrement th
14a70 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20  e BtShared.nRef 
14a80 63 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e 20 69  counter.  When i
14a90 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a  t reaches zero,.
14aa0 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 42 74  ** remove the Bt
14ab0 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65  Shared structure
14ac0 20 66 72 6f 6d 20 74 68 65 20 73 68 61 72 69 6e   from the sharin
14ad0 67 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 0a  g list.  Return.
14ae0 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 42  ** true if the B
14af0 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75  tShared.nRef cou
14b00 6e 74 65 72 20 72 65 61 63 68 65 73 20 7a 65 72  nter reaches zer
14b10 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  o and return.** 
14b20 66 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73  false if it is s
14b30 74 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a  till positive..*
14b40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6d  /.static int rem
14b50 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69  oveFromSharingLi
14b60 73 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  st(BtShared *pBt
14b70 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
14b80 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
14b90 43 48 45 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49  CHE.  MUTEX_LOGI
14ba0 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  C( sqlite3_mutex
14bb0 20 2a 70 4d 61 73 74 65 72 3b 20 29 0a 20 20 42   *pMaster; ).  B
14bc0 74 53 68 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a  tShared *pList;.
14bd0 20 20 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20    int removed = 
14be0 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  0;..  assert( sq
14bf0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68  lite3_mutex_noth
14c00 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
14c10 29 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43  );.  MUTEX_LOGIC
14c20 28 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69  ( pMaster = sqli
14c30 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
14c40 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
14c50 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 73  C_MASTER); ).  s
14c60 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
14c70 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 70  er(pMaster);.  p
14c80 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66  Bt->nRef--;.  if
14c90 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29  ( pBt->nRef<=0 )
14ca0 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f 42 41 4c  {.    if( GLOBAL
14cb0 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
14cc0 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
14cd0 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20  t)==pBt ){.     
14ce0 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
14cf0 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
14d00 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74 2d  acheList) = pBt-
14d10 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73  >pNext;.    }els
14d20 65 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d  e{.      pList =
14d30 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
14d40 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
14d50 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20  acheList);.     
14d60 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70   while( ALWAYS(p
14d70 4c 69 73 74 29 20 26 26 20 70 4c 69 73 74 2d 3e  List) && pList->
14d80 70 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a 20 20  pNext!=pBt ){.  
14d90 20 20 20 20 20 20 70 4c 69 73 74 3d 70 4c 69 73        pList=pLis
14da0 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  t->pNext;.      
14db0 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41  }.      if( ALWA
14dc0 59 53 28 70 4c 69 73 74 29 20 29 7b 0a 20 20 20  YS(pList) ){.   
14dd0 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78       pList->pNex
14de0 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a  t = pBt->pNext;.
14df0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
14e00 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52    if( SQLITE_THR
14e10 45 41 44 53 41 46 45 20 29 7b 0a 20 20 20 20 20  EADSAFE ){.     
14e20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66   sqlite3_mutex_f
14e30 72 65 65 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b  ree(pBt->mutex);
14e40 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76  .    }.    remov
14e50 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71  ed = 1;.  }.  sq
14e60 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
14e70 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65  e(pMaster);.  re
14e80 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65  turn removed;.#e
14e90 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  lse.  return 1;.
14ea0 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
14eb0 4d 61 6b 65 20 73 75 72 65 20 70 42 74 2d 3e 70  Make sure pBt->p
14ec0 54 6d 70 53 70 61 63 65 20 70 6f 69 6e 74 73 20  TmpSpace points 
14ed0 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  to an allocation
14ee0 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f   of .** MX_CELL_
14ef0 53 49 5a 45 28 70 42 74 29 20 62 79 74 65 73 20  SIZE(pBt) bytes 
14f00 77 69 74 68 20 61 20 34 2d 62 79 74 65 20 70 72  with a 4-byte pr
14f10 65 66 69 78 20 66 6f 72 20 61 20 6c 65 66 74 2d  efix for a left-
14f20 63 68 69 6c 64 0a 2a 2a 20 70 6f 69 6e 74 65 72  child.** pointer
14f30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
14f40 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61   allocateTempSpa
14f50 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ce(BtShared *pBt
14f60 29 7b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  ){.  if( !pBt->p
14f70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20  TmpSpace ){.    
14f80 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  pBt->pTmpSpace =
14f90 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c   sqlite3PageMall
14fa0 6f 63 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  oc( pBt->pageSiz
14fb0 65 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e 65  e );..    /* One
14fc0 20 6f 66 20 74 68 65 20 75 73 65 73 20 6f 66 20   of the uses of 
14fd0 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 69  pBt->pTmpSpace i
14fe0 73 20 74 6f 20 66 6f 72 6d 61 74 20 63 65 6c 6c  s to format cell
14ff0 73 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20  s before.    ** 
15000 69 6e 73 65 72 74 69 6e 67 20 74 68 65 6d 20 69  inserting them i
15010 6e 74 6f 20 61 20 6c 65 61 66 20 70 61 67 65 20  nto a leaf page 
15020 28 66 75 6e 63 74 69 6f 6e 20 66 69 6c 6c 49 6e  (function fillIn
15030 43 65 6c 6c 28 29 29 2e 20 49 66 0a 20 20 20 20  Cell()). If.    
15040 2a 2a 20 61 20 63 65 6c 6c 20 69 73 20 6c 65 73  ** a cell is les
15050 73 20 74 68 61 6e 20 34 20 62 79 74 65 73 20 69  s than 4 bytes i
15060 6e 20 73 69 7a 65 2c 20 69 74 20 69 73 20 72 6f  n size, it is ro
15070 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20 62 79  unded up to 4 by
15080 74 65 73 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  tes.    ** by th
15090 65 20 76 61 72 69 6f 75 73 20 72 6f 75 74 69 6e  e various routin
150a0 65 73 20 74 68 61 74 20 6d 61 6e 69 70 75 6c 61  es that manipula
150b0 74 65 20 62 69 6e 61 72 79 20 63 65 6c 6c 73 2e  te binary cells.
150c0 20 57 68 69 63 68 0a 20 20 20 20 2a 2a 20 63 61   Which.    ** ca
150d0 6e 20 6d 65 61 6e 20 74 68 61 74 20 66 69 6c 6c  n mean that fill
150e0 49 6e 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 69 6e  InCell() only in
150f0 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20 66 69  itializes the fi
15100 72 73 74 20 32 20 6f 72 20 33 0a 20 20 20 20 2a  rst 2 or 3.    *
15110 2a 20 62 79 74 65 73 20 6f 66 20 70 54 6d 70 53  * bytes of pTmpS
15120 70 61 63 65 2c 20 62 75 74 20 74 68 61 74 20 74  pace, but that t
15130 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  he first 4 bytes
15140 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d   are copied from
15150 0a 20 20 20 20 2a 2a 20 69 74 20 69 6e 74 6f 20  .    ** it into 
15160 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e  a database page.
15170 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 63 74   This is not act
15180 75 61 6c 6c 79 20 61 20 70 72 6f 62 6c 65 6d 2c  ually a problem,
15190 20 62 75 74 20 69 74 0a 20 20 20 20 2a 2a 20 64   but it.    ** d
151a0 6f 65 73 20 63 61 75 73 65 20 61 20 76 61 6c 67  oes cause a valg
151b0 72 69 6e 64 20 65 72 72 6f 72 20 77 68 65 6e 20  rind error when 
151c0 74 68 65 20 31 20 6f 72 20 32 20 62 79 74 65 73  the 1 or 2 bytes
151d0 20 6f 66 20 75 6e 69 74 69 61 6c 69 7a 65 64 20   of unitialized 
151e0 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20  .    ** data is 
151f0 70 61 73 73 65 64 20 74 6f 20 73 79 73 74 65 6d  passed to system
15200 20 63 61 6c 6c 20 77 72 69 74 65 28 29 2e 20 53   call write(). S
15210 6f 20 74 6f 20 61 76 6f 69 64 20 74 68 69 73 20  o to avoid this 
15220 65 72 72 6f 72 2c 0a 20 20 20 20 2a 2a 20 7a 65  error,.    ** ze
15230 72 6f 20 74 68 65 20 66 69 72 73 74 20 34 20 62  ro the first 4 b
15240 79 74 65 73 20 6f 66 20 74 65 6d 70 20 73 70 61  ytes of temp spa
15250 63 65 20 68 65 72 65 2e 0a 20 20 20 20 2a 2a 0a  ce here..    **.
15260 20 20 20 20 2a 2a 20 41 6c 73 6f 3a 20 20 50 72      ** Also:  Pr
15270 6f 76 69 64 65 20 66 6f 75 72 20 62 79 74 65 73  ovide four bytes
15280 20 6f 66 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   of initialized 
15290 73 70 61 63 65 20 62 65 66 6f 72 65 20 74 68 65  space before the
152a0 0a 20 20 20 20 2a 2a 20 62 65 67 69 6e 6e 69 6e  .    ** beginnin
152b0 67 20 6f 66 20 70 54 6d 70 53 70 61 63 65 20 61  g of pTmpSpace a
152c0 73 20 61 6e 20 61 72 65 61 20 61 76 61 69 6c 61  s an area availa
152d0 62 6c 65 20 74 6f 20 70 72 65 70 65 6e 64 20 74  ble to prepend t
152e0 68 65 0a 20 20 20 20 2a 2a 20 6c 65 66 74 2d 63  he.    ** left-c
152f0 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 74 6f 20  hild pointer to 
15300 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
15310 20 61 20 63 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a   a cell..    */.
15320 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d      if( pBt->pTm
15330 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20  pSpace ){.      
15340 6d 65 6d 73 65 74 28 70 42 74 2d 3e 70 54 6d 70  memset(pBt->pTmp
15350 53 70 61 63 65 2c 20 30 2c 20 38 29 3b 0a 20 20  Space, 0, 8);.  
15360 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61      pBt->pTmpSpa
15370 63 65 20 2b 3d 20 34 3b 0a 20 20 20 20 7d 0a 20  ce += 4;.    }. 
15380 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
15390 20 74 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 70   the pBt->pTmpSp
153a0 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  ace allocation.*
153b0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
153c0 65 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68  eeTempSpace(BtSh
153d0 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66  ared *pBt){.  if
153e0 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  ( pBt->pTmpSpace
153f0 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d   ){.    pBt->pTm
15400 70 53 70 61 63 65 20 2d 3d 20 34 3b 0a 20 20 20  pSpace -= 4;.   
15410 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
15420 28 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29  (pBt->pTmpSpace)
15430 3b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53  ;.    pBt->pTmpS
15440 70 61 63 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  pace = 0;.  }.}.
15450 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20  ./*.** Close an 
15460 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e  open database an
15470 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c  d invalidate all
15480 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74   cursors..*/.int
15490 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
154a0 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  se(Btree *p){.  
154b0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
154c0 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73  p->pBt;.  BtCurs
154d0 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20  or *pCur;..  /* 
154e0 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72  Close all cursor
154f0 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69  s opened via thi
15500 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20  s handle.  */.  
15510 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
15520 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
15530 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
15540 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
15550 70 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 42 74  p);.  pCur = pBt
15560 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69  ->pCursor;.  whi
15570 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20  le( pCur ){.    
15580 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d  BtCursor *pTmp =
15590 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20   pCur;.    pCur 
155a0 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
155b0 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74     if( pTmp->pBt
155c0 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
155d0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
155e0 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20  eCursor(pTmp);. 
155f0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52     }.  }..  /* R
15600 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69  ollback any acti
15610 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ve transaction a
15620 6e 64 20 66 72 65 65 20 74 68 65 20 68 61 6e 64  nd free the hand
15630 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20  le structure..  
15640 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73  ** The call to s
15650 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
15660 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20  ack() drops any 
15670 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64  table-locks held
15680 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61   by.  ** this ha
15690 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ndle..  */.  sql
156a0 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
156b0 6b 28 70 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20  k(p, SQLITE_OK, 
156c0 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  0);.  sqlite3Btr
156d0 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f  eeLeave(p);..  /
156e0 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 73  * If there are s
156f0 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74  till other outst
15700 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
15710 73 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d  s to the shared-
15720 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63  btree.  ** struc
15730 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77  ture, return now
15740 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20  . The remainder 
15750 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  of this procedur
15760 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75  e cleans .  ** u
15770 70 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  p the shared-btr
15780 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ee..  */.  asser
15790 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b  t( p->wantToLock
157a0 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64  ==0 && p->locked
157b0 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d  ==0 );.  if( !p-
157c0 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d  >sharable || rem
157d0 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69  oveFromSharingLi
157e0 73 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f  st(pBt) ){.    /
157f0 2a 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20  * The pBt is no 
15800 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68  longer on the sh
15810 61 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77  aring list, so w
15820 65 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20  e can access.   
15830 20 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68   ** it without h
15840 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68  aving to hold th
15850 65 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a  e mutex..    **.
15860 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74      ** Clean out
15870 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20   and delete the 
15880 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e  BtShared object.
15890 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
158a0 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f  rt( !pBt->pCurso
158b0 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r );.    sqlite3
158c0 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e  PagerClose(pBt->
158d0 70 50 61 67 65 72 2c 20 70 2d 3e 64 62 29 3b 0a  pPager, p->db);.
158e0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72      if( pBt->xFr
158f0 65 65 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d  eeSchema && pBt-
15900 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  >pSchema ){.    
15910 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65    pBt->xFreeSche
15920 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29  ma(pBt->pSchema)
15930 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
15940 74 65 33 44 62 46 72 65 65 28 30 2c 20 70 42 74  te3DbFree(0, pBt
15950 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
15960 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42  freeTempSpace(pB
15970 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
15980 66 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a  free(pBt);.  }..
15990 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
159a0 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
159b0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61  .  assert( p->wa
159c0 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20  ntToLock==0 );. 
159d0 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b   assert( p->lock
159e0 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ed==0 );.  if( p
159f0 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50 72  ->pPrev ) p->pPr
15a00 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70  ev->pNext = p->p
15a10 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70  Next;.  if( p->p
15a20 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d  Next ) p->pNext-
15a30 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65  >pPrev = p->pPre
15a40 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c  v;.#endif..  sql
15a50 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
15a60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15a70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
15a80 65 20 74 68 65 20 22 73 6f 66 74 22 20 6c 69 6d  e the "soft" lim
15a90 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72  it on the number
15aa0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
15ab0 20 63 61 63 68 65 2e 0a 2a 2a 20 55 6e 75 73 65   cache..** Unuse
15ac0 64 20 61 6e 64 20 75 6e 6d 6f 64 69 66 69 65 64  d and unmodified
15ad0 20 70 61 67 65 73 20 77 69 6c 6c 20 62 65 20 72   pages will be r
15ae0 65 63 79 63 6c 65 64 20 77 68 65 6e 20 74 68 65  ecycled when the
15af0 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61   number of.** pa
15b00 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65  ges in the cache
15b10 20 65 78 63 65 65 64 73 20 74 68 69 73 20 73 6f   exceeds this so
15b20 66 74 20 6c 69 6d 69 74 2e 20 20 42 75 74 20 74  ft limit.  But t
15b30 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a  he size of the.*
15b40 2a 20 63 61 63 68 65 20 69 73 20 61 6c 6c 6f 77  * cache is allow
15b50 65 64 20 74 6f 20 67 72 6f 77 20 6c 61 72 67 65  ed to grow large
15b60 72 20 74 68 61 6e 20 74 68 69 73 20 6c 69 6d 69  r than this limi
15b70 74 20 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73  t if it contains
15b80 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65 73 20  .** dirty pages 
15b90 6f 72 20 70 61 67 65 73 20 73 74 69 6c 6c 20 69  or pages still i
15ba0 6e 20 61 63 74 69 76 65 20 75 73 65 2e 0a 2a 2f  n active use..*/
15bb0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
15bc0 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 42 74  eSetCacheSize(Bt
15bd0 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61  ree *p, int mxPa
15be0 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ge){.  BtShared 
15bf0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
15c00 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
15c10 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
15c20 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
15c30 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
15c40 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  (p);.  sqlite3Pa
15c50 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28  gerSetCachesize(
15c60 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50  pBt->pPager, mxP
15c70 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  age);.  sqlite3B
15c80 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
15c90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15ca0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
15cb0 65 20 74 68 65 20 22 73 70 69 6c 6c 22 20 6c 69  e the "spill" li
15cc0 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65  mit on the numbe
15cd0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
15ce0 65 20 63 61 63 68 65 2e 0a 2a 2a 20 49 66 20 74  e cache..** If t
15cf0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
15d00 65 73 20 65 78 63 65 65 64 73 20 74 68 69 73 20  es exceeds this 
15d10 6c 69 6d 69 74 20 64 75 72 69 6e 67 20 61 20 77  limit during a w
15d20 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
15d30 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 6d  ,.** the pager m
15d40 69 67 68 74 20 61 74 74 65 6d 70 74 20 74 6f 20  ight attempt to 
15d50 22 73 70 69 6c 6c 22 20 70 61 67 65 73 20 74 6f  "spill" pages to
15d60 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65 61 72   the journal ear
15d70 6c 79 20 69 6e 0a 2a 2a 20 6f 72 64 65 72 20 74  ly in.** order t
15d80 6f 20 66 72 65 65 20 75 70 20 6d 65 6d 6f 72 79  o free up memory
15d90 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75  ..**.** The valu
15da0 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68  e returned is th
15db0 65 20 63 75 72 72 65 6e 74 20 73 70 69 6c 6c 20  e current spill 
15dc0 73 69 7a 65 2e 20 20 49 66 20 7a 65 72 6f 20 69  size.  If zero i
15dd0 73 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 61  s passed.** as a
15de0 6e 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 20 63  n argument, no c
15df0 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
15e00 74 6f 20 74 68 65 20 73 70 69 6c 6c 20 73 69 7a  to the spill siz
15e10 65 20 73 65 74 74 69 6e 67 2c 20 73 6f 0a 2a 2a  e setting, so.**
15e20 20 75 73 69 6e 67 20 6d 78 50 61 67 65 20 6f 66   using mxPage of
15e30 20 30 20 69 73 20 61 20 77 61 79 20 74 6f 20 71   0 is a way to q
15e40 75 65 72 79 20 74 68 65 20 63 75 72 72 65 6e 74  uery the current
15e50 20 73 70 69 6c 6c 20 73 69 7a 65 2e 0a 2a 2f 0a   spill size..*/.
15e60 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
15e70 53 65 74 53 70 69 6c 6c 53 69 7a 65 28 42 74 72  SetSpillSize(Btr
15e80 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67  ee *p, int mxPag
15e90 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
15ea0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
15eb0 69 6e 74 20 72 65 73 3b 0a 20 20 61 73 73 65 72  int res;.  asser
15ec0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
15ed0 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
15ee0 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
15ef0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
15f00 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 50 61   res = sqlite3Pa
15f10 67 65 72 53 65 74 53 70 69 6c 6c 73 69 7a 65 28  gerSetSpillsize(
15f20 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50  pBt->pPager, mxP
15f30 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  age);.  sqlite3B
15f40 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
15f50 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 23  return res;.}..#
15f60 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
15f70 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20  AP_SIZE>0./*.** 
15f80 43 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74  Change the limit
15f90 20 6f 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f   on the amount o
15fa0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
15fb0 69 6c 65 20 74 68 61 74 20 6d 61 79 20 62 65 0a  ile that may be.
15fc0 2a 2a 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64  ** memory mapped
15fd0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
15fe0 42 74 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69  BtreeSetMmapLimi
15ff0 74 28 42 74 72 65 65 20 2a 70 2c 20 73 71 6c 69  t(Btree *p, sqli
16000 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70  te3_int64 szMmap
16010 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
16020 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61  Bt = p->pBt;.  a
16030 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
16040 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
16050 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
16060 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
16070 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
16080 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42  rSetMmapLimit(pB
16090 74 2d 3e 70 50 61 67 65 72 2c 20 73 7a 4d 6d 61  t->pPager, szMma
160a0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
160b0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
160c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
160d0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
160e0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
160f0 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  >0 */../*.** Cha
16100 6e 67 65 20 74 68 65 20 77 61 79 20 64 61 74 61  nge the way data
16110 20 69 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69   is synced to di
16120 73 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69  sk in order to i
16130 6e 63 72 65 61 73 65 20 6f 72 20 64 65 63 72 65  ncrease or decre
16140 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20  ase.** how well 
16150 74 68 65 20 64 61 74 61 62 61 73 65 20 72 65 73  the database res
16160 69 73 74 73 20 64 61 6d 61 67 65 20 64 75 65 20  ists damage due 
16170 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e  to OS crashes an
16180 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75  d power.** failu
16190 72 65 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73  res.  Level 1 is
161a0 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 73 79   the same as asy
161b0 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79  nchronous (no sy
161c0 6e 63 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a  ncs() occur and.
161d0 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 68 69  ** there is a hi
161e0 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  gh probability o
161f0 66 20 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c  f damage)  Level
16200 20 32 20 69 73 20 74 68 65 20 64 65 66 61 75 6c   2 is the defaul
16210 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20  t.  There.** is 
16220 61 20 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e  a very low but n
16230 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c  on-zero probabil
16240 69 74 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20  ity of damage.  
16250 4c 65 76 65 6c 20 33 20 72 65 64 75 63 65 73 20  Level 3 reduces 
16260 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69  the.** probabili
16270 74 79 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20  ty of damage to 
16280 6e 65 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69  near zero but wi
16290 74 68 20 61 20 77 72 69 74 65 20 70 65 72 66 6f  th a write perfo
162a0 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e  rmance reduction
162b0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
162c0 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
162d0 52 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74  RAGMAS.int sqlit
162e0 65 33 42 74 72 65 65 53 65 74 50 61 67 65 72 46  e3BtreeSetPagerF
162f0 6c 61 67 73 28 0a 20 20 42 74 72 65 65 20 2a 70  lags(.  Btree *p
16300 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
16310 2a 20 54 68 65 20 62 74 72 65 65 20 74 6f 20 73  * The btree to s
16320 65 74 20 74 68 65 20 73 61 66 65 74 79 20 6c 65  et the safety le
16330 76 65 6c 20 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69  vel on */.  unsi
16340 67 6e 65 64 20 70 67 46 6c 61 67 73 20 20 20 20  gned pgFlags    
16350 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 50 41     /* Various PA
16360 47 45 52 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29  GER_* flags */.)
16370 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
16380 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
16390 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
163a0 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
163b0 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
163c0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
163d0 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
163e0 53 65 74 46 6c 61 67 73 28 70 42 74 2d 3e 70 50  SetFlags(pBt->pP
163f0 61 67 65 72 2c 20 70 67 46 6c 61 67 73 29 3b 0a  ager, pgFlags);.
16400 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
16410 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
16420 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
16430 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  ndif../*.** Chan
16440 67 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 70  ge the default p
16450 61 67 65 73 20 73 69 7a 65 20 61 6e 64 20 74 68  ages size and th
16460 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  e number of rese
16470 72 76 65 64 20 62 79 74 65 73 20 70 65 72 20 70  rved bytes per p
16480 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74  age..** Or, if t
16490 68 65 20 70 61 67 65 20 73 69 7a 65 20 68 61 73  he page size has
164a0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 66 69   already been fi
164b0 78 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  xed, return SQLI
164c0 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20  TE_READONLY .** 
164d0 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67  without changing
164e0 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a   anything..**.**
164f0 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d   The page size m
16500 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f  ust be a power o
16510 66 20 32 20 62 65 74 77 65 65 6e 20 35 31 32 20  f 2 between 512 
16520 61 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20 74  and 65536.  If t
16530 68 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20  he page.** size 
16540 73 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f  supplied does no
16550 74 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73  t meet this cons
16560 74 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20  traint then the 
16570 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74  page size is not
16580 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  .** changed..**.
16590 2a 2a 20 50 61 67 65 20 73 69 7a 65 73 20 61 72  ** Page sizes ar
165a0 65 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f  e constrained to
165b0 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74   be a power of t
165c0 77 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20 72  wo so that the r
165d0 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20  egion.** of the 
165e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73  database file us
165f0 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28  ed for locking (
16600 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e  beginning at PEN
16610 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68  DING_BYTE,.** th
16620 65 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73  e first byte pas
16630 74 20 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61  t the 1GB bounda
16640 72 79 2c 20 30 78 34 30 30 30 30 30 30 30 29 20  ry, 0x40000000) 
16650 6e 65 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a  needs to occur.*
16660 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  * at the beginni
16670 6e 67 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a  ng of a page..**
16680 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72  .** If parameter
16690 20 6e 52 65 73 65 72 76 65 20 69 73 20 6c 65 73   nReserve is les
166a0 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  s than zero, the
166b0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
166c0 72 65 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65  reserved.** byte
166d0 73 20 70 65 72 20 70 61 67 65 20 69 73 20 6c 65  s per page is le
166e0 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a  ft unchanged..**
166f0 0a 2a 2a 20 49 66 20 74 68 65 20 69 46 69 78 21  .** If the iFix!
16700 3d 30 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f  =0 then the BTS_
16710 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20 66  PAGESIZE_FIXED f
16720 6c 61 67 20 69 73 20 73 65 74 20 73 6f 20 74 68  lag is set so th
16730 61 74 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  at the page size
16740 0a 2a 2a 20 61 6e 64 20 61 75 74 6f 76 61 63 75  .** and autovacu
16750 75 6d 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c  um mode can no l
16760 6f 6e 67 65 72 20 62 65 20 63 68 61 6e 67 65 64  onger be changed
16770 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16780 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65  BtreeSetPageSize
16790 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70  (Btree *p, int p
167a0 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65  ageSize, int nRe
167b0 73 65 72 76 65 2c 20 69 6e 74 20 69 46 69 78 29  serve, int iFix)
167c0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
167d0 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72  ITE_OK;.  BtShar
167e0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
167f0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73  ;.  assert( nRes
16800 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73  erve>=-1 && nRes
16810 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73  erve<=255 );.  s
16820 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
16830 28 70 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  (p);.#if SQLITE_
16840 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20  HAS_CODEC.  if( 
16850 6e 52 65 73 65 72 76 65 3e 70 42 74 2d 3e 6f 70  nReserve>pBt->op
16860 74 69 6d 61 6c 52 65 73 65 72 76 65 20 29 20 70  timalReserve ) p
16870 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72  Bt->optimalReser
16880 76 65 20 3d 20 28 75 38 29 6e 52 65 73 65 72 76  ve = (u8)nReserv
16890 65 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  e;.#endif.  if( 
168a0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
168b0 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
168c0 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ED ){.    sqlite
168d0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
168e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
168f0 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a  E_READONLY;.  }.
16900 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30    if( nReserve<0
16910 20 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65   ){.    nReserve
16920 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
16930 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   - pBt->usableSi
16940 7a 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ze;.  }.  assert
16950 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26  ( nReserve>=0 &&
16960 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29   nReserve<=255 )
16970 3b 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a 65  ;.  if( pageSize
16980 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a  >=512 && pageSiz
16990 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  e<=SQLITE_MAX_PA
169a0 47 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20  GE_SIZE &&.     
169b0 20 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29     ((pageSize-1)
169c0 26 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b  &pageSize)==0 ){
169d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61  .    assert( (pa
169e0 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
169f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  ;.    assert( !p
16a00 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20  Bt->pCursor );. 
16a10 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
16a20 20 3d 20 28 75 33 32 29 70 61 67 65 53 69 7a 65   = (u32)pageSize
16a30 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70  ;.    freeTempSp
16a40 61 63 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20 20  ace(pBt);.  }.  
16a50 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
16a60 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74  rSetPagesize(pBt
16a70 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e  ->pPager, &pBt->
16a80 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72  pageSize, nReser
16a90 76 65 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61 62  ve);.  pBt->usab
16aa0 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61  leSize = pBt->pa
16ab0 67 65 53 69 7a 65 20 2d 20 28 75 31 36 29 6e 52  geSize - (u16)nR
16ac0 65 73 65 72 76 65 3b 0a 20 20 69 66 28 20 69 46  eserve;.  if( iF
16ad0 69 78 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61  ix ) pBt->btsFla
16ae0 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49  gs |= BTS_PAGESI
16af0 5a 45 5f 46 49 58 45 44 3b 0a 20 20 73 71 6c 69  ZE_FIXED;.  sqli
16b00 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
16b10 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
16b20 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
16b30 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66  he currently def
16b40 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 0a 2a  ined page size.*
16b50 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
16b60 65 65 47 65 74 50 61 67 65 53 69 7a 65 28 42 74  eeGetPageSize(Bt
16b70 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  ree *p){.  retur
16b80 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  n p->pBt->pageSi
16b90 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ze;.}../*.** Thi
16ba0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 69  s function is si
16bb0 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74 65 33  milar to sqlite3
16bc0 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65 28  BtreeGetReserve(
16bd0 29 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 69  ), except that i
16be0 74 0a 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20 62 65  t.** may only be
16bf0 20 63 61 6c 6c 65 64 20 69 66 20 69 74 20 69 73   called if it is
16c00 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
16c10 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75 74 65   the b-tree mute
16c20 78 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20  x is already.** 
16c30 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  held..**.** This
16c40 20 69 73 20 75 73 65 66 75 6c 20 69 6e 20 6f 6e   is useful in on
16c50 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 69  e special case i
16c60 6e 20 74 68 65 20 62 61 63 6b 75 70 20 41 50 49  n the backup API
16c70 20 63 6f 64 65 20 77 68 65 72 65 20 69 74 20 69   code where it i
16c80 73 0a 2a 2a 20 6b 6e 6f 77 6e 20 74 68 61 74 20  s.** known that 
16c90 74 68 65 20 73 68 61 72 65 64 20 62 2d 74 72 65  the shared b-tre
16ca0 65 20 6d 75 74 65 78 20 69 73 20 68 65 6c 64 2c  e mutex is held,
16cb0 20 62 75 74 20 74 68 65 20 6d 75 74 65 78 20 6f   but the mutex o
16cc0 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61  n the .** databa
16cd0 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f  se handle that o
16ce0 77 6e 73 20 2a 70 20 69 73 20 6e 6f 74 2e 20 49  wns *p is not. I
16cf0 6e 20 74 68 69 73 20 63 61 73 65 20 69 66 20 73  n this case if s
16d00 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
16d10 28 29 0a 2a 2a 20 77 65 72 65 20 74 6f 20 62 65  ().** were to be
16d20 20 63 61 6c 6c 65 64 2c 20 69 74 20 6d 69 67 68   called, it migh
16d30 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 73  t collide with s
16d40 6f 6d 65 20 6f 74 68 65 72 20 6f 70 65 72 61 74  ome other operat
16d50 69 6f 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61  ion on the.** da
16d60 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68  tabase handle th
16d70 61 74 20 6f 77 6e 73 20 2a 70 2c 20 63 61 75 73  at owns *p, caus
16d80 69 6e 67 20 75 6e 64 65 66 69 6e 65 64 20 62 65  ing undefined be
16d90 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73  havior..*/.int s
16da0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65  qlite3BtreeGetRe
16db0 73 65 72 76 65 4e 6f 4d 75 74 65 78 28 42 74 72  serveNoMutex(Btr
16dc0 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b  ee *p){.  int n;
16dd0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
16de0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
16df0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
16e00 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61    n = p->pBt->pa
16e10 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d  geSize - p->pBt-
16e20 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 72  >usableSize;.  r
16e30 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
16e40 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
16e50 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
16e60 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64  space at the end
16e70 20 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 74   of every page t
16e80 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e  hat.** are inten
16e90 74 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73  tually left unus
16ea0 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65  ed.  This is the
16eb0 20 22 72 65 73 65 72 76 65 64 22 20 73 70 61 63   "reserved" spac
16ec0 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d  e that is.** som
16ed0 65 74 69 6d 65 73 20 75 73 65 64 20 62 79 20 65  etimes used by e
16ee0 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  xtensions..**.**
16ef0 20 49 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 4d   If SQLITE_HAS_M
16f00 55 54 45 58 20 69 73 20 64 65 66 69 6e 65 64 20  UTEX is defined 
16f10 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
16f20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 0a  returned is the.
16f30 2a 2a 20 67 72 65 61 74 65 72 20 6f 66 20 74 68  ** greater of th
16f40 65 20 63 75 72 72 65 6e 74 20 72 65 73 65 72 76  e current reserv
16f50 65 64 20 73 70 61 63 65 20 61 6e 64 20 74 68 65  ed space and the
16f60 20 6d 61 78 69 6d 75 6d 20 72 65 71 75 65 73 74   maximum request
16f70 65 64 0a 2a 2a 20 72 65 73 65 72 76 65 20 73 70  ed.** reserve sp
16f80 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ace..*/.int sqli
16f90 74 65 33 42 74 72 65 65 47 65 74 4f 70 74 69 6d  te3BtreeGetOptim
16fa0 61 6c 52 65 73 65 72 76 65 28 42 74 72 65 65 20  alReserve(Btree 
16fb0 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  *p){.  int n;.  
16fc0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
16fd0 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69  r(p);.  n = sqli
16fe0 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72  te3BtreeGetReser
16ff0 76 65 4e 6f 4d 75 74 65 78 28 70 29 3b 0a 23 69  veNoMutex(p);.#i
17000 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
17010 43 4f 44 45 43 0a 20 20 69 66 28 20 6e 3c 70 2d  CODEC.  if( n<p-
17020 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73  >pBt->optimalRes
17030 65 72 76 65 20 29 20 6e 20 3d 20 70 2d 3e 70 42  erve ) n = p->pB
17040 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76  t->optimalReserv
17050 65 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  e;.#endif.  sqli
17060 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
17070 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
17080 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
17090 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
170a0 6e 74 20 66 6f 72 20 61 20 64 61 74 61 62 61 73  nt for a databas
170b0 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70  e if mxPage is p
170c0 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63  ositive..** No c
170d0 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
170e0 69 66 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f  if mxPage is 0 o
170f0 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52  r negative..** R
17100 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65  egardless of the
17110 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65   value of mxPage
17120 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78  , return the max
17130 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e  imum page count.
17140 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
17150 74 72 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74  treeMaxPageCount
17160 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d  (Btree *p, int m
17170 78 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b  xPage){.  int n;
17180 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
17190 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73  nter(p);.  n = s
171a0 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61  qlite3PagerMaxPa
171b0 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e  geCount(p->pBt->
171c0 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b  pPager, mxPage);
171d0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
171e0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
171f0 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n n;.}../*.** Se
17200 74 20 74 68 65 20 42 54 53 5f 53 45 43 55 52 45  t the BTS_SECURE
17210 5f 44 45 4c 45 54 45 20 66 6c 61 67 20 69 66 20  _DELETE flag if 
17220 6e 65 77 46 6c 61 67 20 69 73 20 30 20 6f 72 20  newFlag is 0 or 
17230 31 2e 20 20 49 66 20 6e 65 77 46 6c 61 67 20 69  1.  If newFlag i
17240 73 20 2d 31 2c 0a 2a 2a 20 74 68 65 6e 20 6d 61  s -1,.** then ma
17250 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 2e 20 20  ke no changes.  
17260 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20 74 68  Always return th
17270 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 42  e value of the B
17280 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
17290 0a 2a 2a 20 73 65 74 74 69 6e 67 20 61 66 74 65  .** setting afte
172a0 72 20 74 68 65 20 63 68 61 6e 67 65 2e 0a 2a 2f  r the change..*/
172b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
172c0 65 53 65 63 75 72 65 44 65 6c 65 74 65 28 42 74  eSecureDelete(Bt
172d0 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e 65 77 46  ree *p, int newF
172e0 6c 61 67 29 7b 0a 20 20 69 6e 74 20 62 3b 0a 20  lag){.  int b;. 
172f0 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
17300 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 42  rn 0;.  sqlite3B
17310 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
17320 69 66 28 20 6e 65 77 46 6c 61 67 3e 3d 30 20 29  if( newFlag>=0 )
17330 7b 0a 20 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74  {.    p->pBt->bt
17340 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 53  sFlags &= ~BTS_S
17350 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20  ECURE_DELETE;.  
17360 20 20 69 66 28 20 6e 65 77 46 6c 61 67 20 29 20    if( newFlag ) 
17370 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  p->pBt->btsFlags
17380 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44   |= BTS_SECURE_D
17390 45 4c 45 54 45 3b 0a 20 20 7d 20 0a 20 20 62 20  ELETE;.  } .  b 
173a0 3d 20 28 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c  = (p->pBt->btsFl
173b0 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45  ags & BTS_SECURE
173c0 5f 44 45 4c 45 54 45 29 21 3d 30 3b 0a 20 20 73  _DELETE)!=0;.  s
173d0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
173e0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 3b  (p);.  return b;
173f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
17400 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75   the 'auto-vacuu
17410 6d 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74  m' property of t
17420 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20  he database. If 
17430 74 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d 27  the 'autoVacuum'
17440 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73  .** parameter is
17450 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
17460 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65  auto-vacuum mode
17470 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66 20   is enabled. If 
17480 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64  zero, it.** is d
17490 69 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65 66  isabled. The def
174a0 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74  ault value for t
174b0 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70  he auto-vacuum p
174c0 72 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20 64  roperty is .** d
174d0 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
174e0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
174f0 41 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f  AUTOVACUUM macro
17500 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
17510 42 74 72 65 65 53 65 74 41 75 74 6f 56 61 63 75  BtreeSetAutoVacu
17520 75 6d 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  um(Btree *p, int
17530 20 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69   autoVacuum){.#i
17540 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
17550 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65  _AUTOVACUUM.  re
17560 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
17570 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74  ONLY;.#else.  Bt
17580 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
17590 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  >pBt;.  int rc =
175a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38   SQLITE_OK;.  u8
175b0 20 61 76 20 3d 20 28 75 38 29 61 75 74 6f 56 61   av = (u8)autoVa
175c0 63 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33  cuum;..  sqlite3
175d0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
175e0 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c   if( (pBt->btsFl
175f0 61 67 73 20 26 20 42 54 53 5f 50 41 47 45 53 49  ags & BTS_PAGESI
17600 5a 45 5f 46 49 58 45 44 29 21 3d 30 20 26 26 20  ZE_FIXED)!=0 && 
17610 28 61 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e  (av ?1:0)!=pBt->
17620 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
17630 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
17640 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b  ADONLY;.  }else{
17650 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61  .    pBt->autoVa
17660 63 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a  cuum = av ?1:0;.
17670 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
17680 75 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30  uum = av==2 ?1:0
17690 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
176a0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
176b0 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
176c0 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  f.}../*.** Retur
176d0 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  n the value of t
176e0 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27  he 'auto-vacuum'
176f0 20 70 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75   property. If au
17700 74 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a  to-vacuum is .**
17710 20 65 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65   enabled 1 is re
17720 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
17730 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  e 0..*/.int sqli
17740 74 65 33 42 74 72 65 65 47 65 74 41 75 74 6f 56  te3BtreeGetAutoV
17750 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b  acuum(Btree *p){
17760 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
17770 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
17780 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55   return BTREE_AU
17790 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23  TOVACUUM_NONE;.#
177a0 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20  else.  int rc;. 
177b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
177c0 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a  er(p);.  rc = (.
177d0 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75      (!p->pBt->au
177e0 74 6f 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f  toVacuum)?BTREE_
177f0 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a  AUTOVACUUM_NONE:
17800 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69  .    (!p->pBt->i
17810 6e 63 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45  ncrVacuum)?BTREE
17820 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c  _AUTOVACUUM_FULL
17830 3a 0a 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f  :.    BTREE_AUTO
17840 56 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b  VACUUM_INCR.  );
17850 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
17860 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
17870 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  n rc;.#endif.}..
17880 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66  ./*.** Get a ref
17890 65 72 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31  erence to pPage1
178a0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
178b0 20 66 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c   file.  This wil
178c0 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72  l.** also acquir
178d0 65 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20  e a readlock on 
178e0 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  that file..**.**
178f0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
17900 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73  turned on succes
17910 73 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65 20  s.  If the file 
17920 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c  is not a.** well
17930 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65  -formed database
17940 20 66 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49   file, then SQLI
17950 54 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65  TE_CORRUPT is re
17960 74 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54  turned..** SQLIT
17970 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e  E_BUSY is return
17980 65 64 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ed if the databa
17990 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53  se is locked.  S
179a0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69  QLITE_NOMEM.** i
179b0 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 77 65  s returned if we
179c0 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f   run out of memo
179d0 72 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ry. .*/.static i
179e0 6e 74 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53  nt lockBtree(BtS
179f0 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
17a00 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
17a10 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
17a20 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74  de from subfunct
17a30 69 6f 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ions */.  MemPag
17a40 65 20 2a 70 50 61 67 65 31 3b 20 20 20 20 20 2f  e *pPage1;     /
17a50 2a 20 50 61 67 65 20 31 20 6f 66 20 74 68 65 20  * Page 1 of the 
17a60 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
17a70 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20  .  int nPage;   
17a80 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
17a90 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
17aa0 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
17ab0 69 6e 74 20 6e 50 61 67 65 46 69 6c 65 20 3d 20  int nPageFile = 
17ac0 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  0;   /* Number o
17ad0 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
17ae0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
17af0 20 20 69 6e 74 20 6e 50 61 67 65 48 65 61 64 65    int nPageHeade
17b00 72 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  r;     /* Number
17b10 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
17b20 20 64 61 74 61 62 61 73 65 20 61 63 63 6f 72 64   database accord
17b30 69 6e 67 20 74 6f 20 68 64 72 20 2a 2f 0a 0a 20  ing to hdr */.. 
17b40 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
17b50 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
17b60 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
17b70 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
17b80 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ==0 );.  rc = sq
17b90 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64  lite3PagerShared
17ba0 4c 6f 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72  Lock(pBt->pPager
17bb0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
17bc0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
17bd0 72 63 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65  rc;.  rc = btree
17be0 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20  GetPage(pBt, 1, 
17bf0 26 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69  &pPage1, 0);.  i
17c00 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17c10 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
17c20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63   /* Do some chec
17c30 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73  king to help ins
17c40 75 72 65 20 74 68 65 20 66 69 6c 65 20 77 65 20  ure the file we 
17c50 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73  opened really is
17c60 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61  .  ** a valid da
17c70 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20  tabase file. .  
17c80 2a 2f 0a 20 20 6e 50 61 67 65 20 3d 20 6e 50 61  */.  nPage = nPa
17c90 67 65 48 65 61 64 65 72 20 3d 20 67 65 74 34 62  geHeader = get4b
17ca0 79 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67  yte(28+(u8*)pPag
17cb0 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 73 71  e1->aData);.  sq
17cc0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
17cd0 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  unt(pBt->pPager,
17ce0 20 26 6e 50 61 67 65 46 69 6c 65 29 3b 0a 20 20   &nPageFile);.  
17cf0 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 7c 7c 20  if( nPage==0 || 
17d00 6d 65 6d 63 6d 70 28 32 34 2b 28 75 38 2a 29 70  memcmp(24+(u8*)p
17d10 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 39 32  Page1->aData, 92
17d20 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44  +(u8*)pPage1->aD
17d30 61 74 61 2c 34 29 21 3d 30 20 29 7b 0a 20 20 20  ata,4)!=0 ){.   
17d40 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 46 69   nPage = nPageFi
17d50 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50  le;.  }.  if( nP
17d60 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 75 33 32  age>0 ){.    u32
17d70 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 75   pageSize;.    u
17d80 33 32 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  32 usableSize;. 
17d90 20 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70     u8 *page1 = p
17da0 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20  Page1->aData;.  
17db0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
17dc0 54 41 44 42 3b 0a 20 20 20 20 2f 2a 20 45 56 49  TADB;.    /* EVI
17dd0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 37 33  DENCE-OF: R-4373
17de0 37 2d 33 39 39 39 39 20 45 76 65 72 79 20 76 61  7-39999 Every va
17df0 6c 69 64 20 53 51 4c 69 74 65 20 64 61 74 61 62  lid SQLite datab
17e00 61 73 65 20 66 69 6c 65 20 62 65 67 69 6e 73 0a  ase file begins.
17e10 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20      ** with the 
17e20 66 6f 6c 6c 6f 77 69 6e 67 20 31 36 20 62 79 74  following 16 byt
17e30 65 73 20 28 69 6e 20 68 65 78 29 3a 20 35 33 20  es (in hex): 53 
17e40 35 31 20 34 63 20 36 39 20 37 34 20 36 35 20 32  51 4c 69 74 65 2
17e50 30 20 36 36 20 36 66 20 37 32 20 36 64 0a 20 20  0 66 6f 72 6d.  
17e60 20 20 2a 2a 20 36 31 20 37 34 20 32 30 20 33 33    ** 61 74 20 33
17e70 20 30 30 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20   00. */.    if( 
17e80 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d  memcmp(page1, zM
17e90 61 67 69 63 48 65 61 64 65 72 2c 20 31 36 29 21  agicHeader, 16)!
17ea0 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
17eb0 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
17ec0 65 64 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65  ed;.    }..#ifde
17ed0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
17ee0 4c 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  L.    if( page1[
17ef0 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70  18]>1 ){.      p
17f00 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
17f10 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20  BTS_READ_ONLY;. 
17f20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67     }.    if( pag
17f30 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20  e1[19]>1 ){.    
17f40 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
17f50 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
17f60 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70 61  #else.    if( pa
17f70 67 65 31 5b 31 38 5d 3e 32 20 29 7b 0a 20 20 20  ge1[18]>2 ){.   
17f80 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
17f90 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c   |= BTS_READ_ONL
17fa0 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  Y;.    }.    if(
17fb0 20 70 61 67 65 31 5b 31 39 5d 3e 32 20 29 7b 0a   page1[19]>2 ){.
17fc0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
17fd0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
17fe0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
17ff0 68 65 20 77 72 69 74 65 20 76 65 72 73 69 6f 6e  he write version
18000 20 69 73 20 73 65 74 20 74 6f 20 32 2c 20 74 68   is set to 2, th
18010 69 73 20 64 61 74 61 62 61 73 65 20 73 68 6f 75  is database shou
18020 6c 64 20 62 65 20 61 63 63 65 73 73 65 64 0a 20  ld be accessed. 
18030 20 20 20 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64     ** in WAL mod
18040 65 2e 20 49 66 20 74 68 65 20 6c 6f 67 20 69 73  e. If the log is
18050 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
18060 6e 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20  n, open it now. 
18070 54 68 65 6e 20 0a 20 20 20 20 2a 2a 20 72 65 74  Then .    ** ret
18080 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e  urn SQLITE_OK an
18090 64 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  d return without
180a0 20 70 6f 70 75 6c 61 74 69 6e 67 20 42 74 53 68   populating BtSh
180b0 61 72 65 64 2e 70 50 61 67 65 31 2e 0a 20 20 20  ared.pPage1..   
180c0 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 64   ** The caller d
180d0 65 74 65 63 74 73 20 74 68 69 73 20 61 6e 64 20  etects this and 
180e0 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74  calls this funct
180f0 69 6f 6e 20 61 67 61 69 6e 2e 20 54 68 69 73 20  ion again. This 
18100 69 73 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72  is.    ** requir
18110 65 64 20 61 73 20 74 68 65 20 76 65 72 73 69 6f  ed as the versio
18120 6e 20 6f 66 20 70 61 67 65 20 31 20 63 75 72 72  n of page 1 curr
18130 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67  ently in the pag
18140 65 31 20 62 75 66 66 65 72 0a 20 20 20 20 2a 2a  e1 buffer.    **
18150 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 68 65 20   may not be the 
18160 6c 61 74 65 73 74 20 76 65 72 73 69 6f 6e 20 2d  latest version -
18170 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 61 20   there may be a 
18180 6e 65 77 65 72 20 6f 6e 65 20 69 6e 20 74 68 65  newer one in the
18190 20 6c 6f 67 0a 20 20 20 20 2a 2a 20 66 69 6c 65   log.    ** file
181a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
181b0 20 70 61 67 65 31 5b 31 39 5d 3d 3d 32 20 26 26   page1[19]==2 &&
181c0 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
181d0 26 20 42 54 53 5f 4e 4f 5f 57 41 4c 29 3d 3d 30  & BTS_NO_WAL)==0
181e0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73   ){.      int is
181f0 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  Open = 0;.      
18200 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
18210 72 4f 70 65 6e 57 61 6c 28 70 42 74 2d 3e 70 50  rOpenWal(pBt->pP
18220 61 67 65 72 2c 20 26 69 73 4f 70 65 6e 29 3b 0a  ager, &isOpen);.
18230 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
18240 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
18250 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
18260 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  it_failed;.     
18270 20 7d 65 6c 73 65 7b 0a 23 69 66 20 53 51 4c 49   }else{.#if SQLI
18280 54 45 5f 44 45 46 41 55 4c 54 5f 53 59 4e 43 48  TE_DEFAULT_SYNCH
18290 52 4f 4e 4f 55 53 21 3d 53 51 4c 49 54 45 5f 44  RONOUS!=SQLITE_D
182a0 45 46 41 55 4c 54 5f 57 41 4c 5f 53 59 4e 43 48  EFAULT_WAL_SYNCH
182b0 52 4f 4e 4f 55 53 0a 20 20 20 20 20 20 20 20 73  RONOUS.        s
182c0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 20 20  qlite3 *db;.    
182d0 20 20 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 20      Db *pDb;.   
182e0 20 20 20 20 20 69 66 28 20 28 64 62 3d 70 42 74       if( (db=pBt
182f0 2d 3e 64 62 29 21 3d 30 20 26 26 20 28 70 44 62  ->db)!=0 && (pDb
18300 3d 64 62 2d 3e 61 44 62 29 21 3d 30 20 29 7b 0a  =db->aDb)!=0 ){.
18310 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
18320 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 7c 7c 20   pDb->pBt==0 || 
18330 70 44 62 2d 3e 70 42 74 2d 3e 70 42 74 21 3d 70  pDb->pBt->pBt!=p
18340 42 74 20 29 7b 20 70 44 62 2b 2b 3b 20 7d 0a 20  Bt ){ pDb++; }. 
18350 20 20 20 20 20 20 20 20 20 69 66 28 20 70 44 62           if( pDb
18360 2d 3e 62 53 79 6e 63 53 65 74 3d 3d 30 0a 20 20  ->bSyncSet==0.  
18370 20 20 20 20 20 20 20 20 20 26 26 20 70 44 62 2d           && pDb-
18380 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 3d 3d 53  >safety_level==S
18390 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 59  QLITE_DEFAULT_SY
183a0 4e 43 48 52 4f 4e 4f 55 53 2b 31 0a 20 20 20 20  NCHRONOUS+1.    
183b0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
183c0 20 20 20 20 20 70 44 62 2d 3e 73 61 66 65 74 79       pDb->safety
183d0 5f 6c 65 76 65 6c 20 3d 20 53 51 4c 49 54 45 5f  _level = SQLITE_
183e0 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53 59 4e 43  DEFAULT_WAL_SYNC
183f0 48 52 4f 4e 4f 55 53 2b 31 3b 0a 20 20 20 20 20  HRONOUS+1;.     
18400 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
18410 67 65 72 53 65 74 46 6c 61 67 73 28 70 42 74 2d  gerSetFlags(pBt-
18420 3e 70 50 61 67 65 72 2c 0a 20 20 20 20 20 20 20  >pPager,.       
18430 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73 61 66          pDb->saf
18440 65 74 79 5f 6c 65 76 65 6c 20 7c 20 28 64 62 2d  ety_level | (db-
18450 3e 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 46  >flags & PAGER_F
18460 4c 41 47 53 5f 4d 41 53 4b 29 29 3b 0a 20 20 20  LAGS_MASK));.   
18470 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
18480 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
18490 20 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d 30 20    if( isOpen==0 
184a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c  ){.          rel
184b0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29  easePage(pPage1)
184c0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
184d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
184e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
184f0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
18500 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d 0a  E_NOTADB;.    }.
18510 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 45  #endif..    /* E
18520 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 35  VIDENCE-OF: R-15
18530 34 36 35 2d 32 30 38 31 33 20 54 68 65 20 6d 61  465-20813 The ma
18540 78 69 6d 75 6d 20 61 6e 64 20 6d 69 6e 69 6d 75  ximum and minimu
18550 6d 20 65 6d 62 65 64 64 65 64 20 70 61 79 6c 6f  m embedded paylo
18560 61 64 0a 20 20 20 20 2a 2a 20 66 72 61 63 74 69  ad.    ** fracti
18570 6f 6e 73 20 61 6e 64 20 74 68 65 20 6c 65 61 66  ons and the leaf
18580 20 70 61 79 6c 6f 61 64 20 66 72 61 63 74 69 6f   payload fractio
18590 6e 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65  n values must be
185a0 20 36 34 2c 20 33 32 2c 20 61 6e 64 20 33 32 2e   64, 32, and 32.
185b0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
185c0 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69  he original desi
185d0 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65 73 65  gn allowed these
185e0 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72 79   amounts to vary
185f0 2c 20 62 75 74 20 61 73 20 6f 66 0a 20 20 20 20  , but as of.    
18600 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30  ** version 3.6.0
18610 2c 20 77 65 20 72 65 71 75 69 72 65 20 74 68 65  , we require the
18620 6d 20 74 6f 20 62 65 20 66 69 78 65 64 2e 0a 20  m to be fixed.. 
18630 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65     */.    if( me
18640 6d 63 6d 70 28 26 70 61 67 65 31 5b 32 31 5d 2c  mcmp(&page1[21],
18650 20 22 5c 31 30 30 5c 30 34 30 5c 30 34 30 22 2c   "\100\040\040",
18660 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  3)!=0 ){.      g
18670 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
18680 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
18690 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
186a0 20 52 2d 35 31 38 37 33 2d 33 39 36 31 38 20 54   R-51873-39618 T
186b0 68 65 20 70 61 67 65 20 73 69 7a 65 20 66 6f 72  he page size for
186c0 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
186d0 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72   is.    ** deter
186e0 6d 69 6e 65 64 20 62 79 20 74 68 65 20 32 2d 62  mined by the 2-b
186f0 79 74 65 20 69 6e 74 65 67 65 72 20 6c 6f 63 61  yte integer loca
18700 74 65 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74  ted at an offset
18710 20 6f 66 20 31 36 20 62 79 74 65 73 20 66 72 6f   of 16 bytes fro
18720 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 65 67  m.    ** the beg
18730 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61  inning of the da
18740 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
18750 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20 28      pageSize = (
18760 70 61 67 65 31 5b 31 36 5d 3c 3c 38 29 20 7c 20  page1[16]<<8) | 
18770 28 70 61 67 65 31 5b 31 37 5d 3c 3c 31 36 29 3b  (page1[17]<<16);
18780 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
18790 2d 4f 46 3a 20 52 2d 32 35 30 30 38 2d 32 31 36  -OF: R-25008-216
187a0 38 38 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61  88 The size of a
187b0 20 70 61 67 65 20 69 73 20 61 20 70 6f 77 65 72   page is a power
187c0 20 6f 66 20 74 77 6f 0a 20 20 20 20 2a 2a 20 62   of two.    ** b
187d0 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36  etween 512 and 6
187e0 35 35 33 36 20 69 6e 63 6c 75 73 69 76 65 2e 20  5536 inclusive. 
187f0 2a 2f 0a 20 20 20 20 69 66 28 20 28 28 70 61 67  */.    if( ((pag
18800 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a  eSize-1)&pageSiz
18810 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 70 61  e)!=0.     || pa
18820 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  geSize>SQLITE_MA
18830 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20 20  X_PAGE_SIZE .   
18840 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 3d 32    || pageSize<=2
18850 35 36 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  56 .    ){.     
18860 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
18870 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
18880 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65     assert( (page
18890 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a  Size & 7)==0 );.
188a0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
188b0 4f 46 3a 20 52 2d 35 39 33 31 30 2d 35 31 32 30  OF: R-59310-5120
188c0 35 20 54 68 65 20 22 72 65 73 65 72 76 65 64 20  5 The "reserved 
188d0 73 70 61 63 65 22 20 73 69 7a 65 20 69 6e 20 74  space" size in t
188e0 68 65 20 31 2d 62 79 74 65 0a 20 20 20 20 2a 2a  he 1-byte.    **
188f0 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73   integer at offs
18900 65 74 20 32 30 20 69 73 20 74 68 65 20 6e 75 6d  et 20 is the num
18910 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
18920 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64  space at the end
18930 20 6f 66 0a 20 20 20 20 2a 2a 20 65 61 63 68 20   of.    ** each 
18940 70 61 67 65 20 74 6f 20 72 65 73 65 72 76 65 20  page to reserve 
18950 66 6f 72 20 65 78 74 65 6e 73 69 6f 6e 73 2e 20  for extensions. 
18960 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45  .    **.    ** E
18970 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37  VIDENCE-OF: R-37
18980 34 39 37 2d 34 32 34 31 32 20 54 68 65 20 73 69  497-42412 The si
18990 7a 65 20 6f 66 20 74 68 65 20 72 65 73 65 72 76  ze of the reserv
189a0 65 64 20 72 65 67 69 6f 6e 20 69 73 0a 20 20 20  ed region is.   
189b0 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62   ** determined b
189c0 79 20 74 68 65 20 6f 6e 65 2d 62 79 74 65 20 75  y the one-byte u
189d0 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20  nsigned integer 
189e0 66 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66 66 73  found at an offs
189f0 65 74 20 6f 66 20 32 30 0a 20 20 20 20 2a 2a 20  et of 20.    ** 
18a00 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
18a10 65 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 2a  e file header. *
18a20 2f 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65  /.    usableSize
18a30 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61   = pageSize - pa
18a40 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28  ge1[20];.    if(
18a50 20 28 75 33 32 29 70 61 67 65 53 69 7a 65 21 3d   (u32)pageSize!=
18a60 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b  pBt->pageSize ){
18a70 0a 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20  .      /* After 
18a80 72 65 61 64 69 6e 67 20 74 68 65 20 66 69 72 73  reading the firs
18a90 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
18aa0 74 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20  tabase assuming 
18ab0 61 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20  a page size.    
18ac0 20 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64    ** of BtShared
18ad0 2e 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61  .pageSize, we ha
18ae0 76 65 20 64 69 73 63 6f 76 65 72 65 64 20 74 68  ve discovered th
18af0 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  at the page-size
18b00 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74   is.      ** act
18b10 75 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20  ually pageSize. 
18b20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  Unlock the datab
18b30 61 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e  ase, leave pBt->
18b40 70 50 61 67 65 31 20 61 74 0a 20 20 20 20 20 20  pPage1 at.      
18b50 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75  ** zero and retu
18b60 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68  rn SQLITE_OK. Th
18b70 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61  e caller will ca
18b80 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ll this function
18b90 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20  .      ** again 
18ba0 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74  with the correct
18bb0 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20   page-size..    
18bc0 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61    */.      relea
18bd0 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
18be0 20 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c        pBt->usabl
18bf0 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69  eSize = usableSi
18c00 7a 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  ze;.      pBt->p
18c10 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
18c20 7a 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65  ze;.      freeTe
18c30 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
18c40 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18c50 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
18c60 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
18c70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20  Bt->pageSize,.  
18c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ca0 20 70 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65   pageSize-usable
18cb0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Size);.      ret
18cc0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
18cd0 20 20 69 66 28 20 28 70 42 74 2d 3e 64 62 2d 3e    if( (pBt->db->
18ce0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52  flags & SQLITE_R
18cf0 65 63 6f 76 65 72 79 4d 6f 64 65 29 3d 3d 30 20  ecoveryMode)==0 
18d00 26 26 20 6e 50 61 67 65 3e 6e 50 61 67 65 46 69  && nPage>nPageFi
18d10 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  le ){.      rc =
18d20 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
18d30 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
18d40 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
18d50 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  ed;.    }.    /*
18d60 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
18d70 32 38 33 31 32 2d 36 34 37 30 34 20 48 6f 77 65  28312-64704 Howe
18d80 76 65 72 2c 20 74 68 65 20 75 73 61 62 6c 65 20  ver, the usable 
18d90 73 69 7a 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  size is not allo
18da0 77 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65  wed to.    ** be
18db0 20 6c 65 73 73 20 74 68 61 6e 20 34 38 30 2e 20   less than 480. 
18dc0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
18dd0 69 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  if the page size
18de0 20 69 73 20 35 31 32 2c 20 74 68 65 6e 20 74 68   is 512, then th
18df0 65 0a 20 20 20 20 2a 2a 20 72 65 73 65 72 76 65  e.    ** reserve
18e00 64 20 73 70 61 63 65 20 73 69 7a 65 20 63 61 6e  d space size can
18e10 6e 6f 74 20 65 78 63 65 65 64 20 33 32 2e 20 2a  not exceed 32. *
18e20 2f 0a 20 20 20 20 69 66 28 20 75 73 61 62 6c 65  /.    if( usable
18e30 53 69 7a 65 3c 34 38 30 20 29 7b 0a 20 20 20 20  Size<480 ){.    
18e40 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
18e50 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
18e60 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
18e70 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  e = pageSize;.  
18e80 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
18e90 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  e = usableSize;.
18ea0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18eb0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
18ec0 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
18ed0 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
18ee0 70 61 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29  page1[36 + 4*4])
18ef0 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ?1:0);.    pBt->
18f00 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65  incrVacuum = (ge
18f10 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36  t4byte(&page1[36
18f20 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23   + 7*4])?1:0);.#
18f30 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20  endif.  }..  /* 
18f40 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74 68 65 20  maxLocal is the 
18f50 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  maximum amount o
18f60 66 20 70 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f  f payload to sto
18f70 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20  re locally for. 
18f80 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b   ** a cell.  Mak
18f90 65 20 73 75 72 65 20 69 74 20 69 73 20 73 6d 61  e sure it is sma
18fa0 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74 68 61  ll enough so tha
18fb0 74 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 61  t at least minFa
18fc0 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20  nout.  ** cells 
18fd0 63 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20  can will fit on 
18fe0 6f 6e 65 20 70 61 67 65 2e 20 20 57 65 20 61 73  one page.  We as
18ff0 73 75 6d 65 20 61 20 31 30 2d 62 79 74 65 20 70  sume a 10-byte p
19000 61 67 65 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a  age header..  **
19010 20 42 65 73 69 64 65 73 20 74 68 65 20 70 61 79   Besides the pay
19020 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d  load, the cell m
19030 75 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20  ust store:.  ** 
19040 20 20 20 20 32 2d 62 79 74 65 20 70 6f 69 6e 74      2-byte point
19050 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20  er to the cell. 
19060 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 63   **     4-byte c
19070 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a  hild pointer.  *
19080 2a 20 20 20 20 20 39 2d 62 79 74 65 20 6e 4b 65  *     9-byte nKe
19090 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20  y value.  **    
190a0 20 34 2d 62 79 74 65 20 6e 44 61 74 61 20 76 61   4-byte nData va
190b0 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62  lue.  **     4-b
190c0 79 74 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  yte overflow pag
190d0 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53  e pointer.  ** S
190e0 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74  o a cell consist
190f0 73 20 6f 66 20 61 20 32 2d 62 79 74 65 20 70 6f  s of a 2-byte po
19100 69 6e 74 65 72 2c 20 61 20 68 65 61 64 65 72 20  inter, a header 
19110 77 68 69 63 68 20 69 73 20 61 73 20 6d 75 63 68  which is as much
19120 20 61 73 0a 20 20 2a 2a 20 31 37 20 62 79 74 65   as.  ** 17 byte
19130 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62  s long, 0 to N b
19140 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c  ytes of payload,
19150 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c   and an optional
19160 20 34 20 62 79 74 65 20 6f 76 65 72 66 6c 6f 77   4 byte overflow
19170 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74  .  ** page point
19180 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e  er..  */.  pBt->
19190 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  maxLocal = (u16)
191a0 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ((pBt->usableSiz
191b0 65 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d 20 32  e-12)*64/255 - 2
191c0 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f  3);.  pBt->minLo
191d0 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74  cal = (u16)((pBt
191e0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
191f0 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20  *32/255 - 23);. 
19200 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20   pBt->maxLeaf = 
19210 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c  (u16)(pBt->usabl
19220 65 53 69 7a 65 20 2d 20 33 35 29 3b 0a 20 20 70  eSize - 35);.  p
19230 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 75  Bt->minLeaf = (u
19240 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65  16)((pBt->usable
19250 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20  Size-12)*32/255 
19260 2d 20 32 33 29 3b 0a 20 20 69 66 28 20 70 42 74  - 23);.  if( pBt
19270 2d 3e 6d 61 78 4c 6f 63 61 6c 3e 31 32 37 20 29  ->maxLocal>127 )
19280 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62  {.    pBt->max1b
19290 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 31 32 37  ytePayload = 127
192a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
192b0 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c  Bt->max1bytePayl
192c0 6f 61 64 20 3d 20 28 75 38 29 70 42 74 2d 3e 6d  oad = (u8)pBt->m
192d0 61 78 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 61  axLocal;.  }.  a
192e0 73 73 65 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c  ssert( pBt->maxL
192f0 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43  eaf + 23 <= MX_C
19300 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b  ELL_SIZE(pBt) );
19310 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d  .  pBt->pPage1 =
19320 20 70 50 61 67 65 31 3b 0a 20 20 70 42 74 2d 3e   pPage1;.  pBt->
19330 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20  nPage = nPage;. 
19340 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19350 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66  K;..page1_init_f
19360 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73 65  ailed:.  release
19370 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
19380 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b  pBt->pPage1 = 0;
19390 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
193a0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
193b0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
193c0 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f   number of curso
193d0 72 73 20 6f 70 65 6e 20 6f 6e 20 70 42 74 2e 20  rs open on pBt. 
193e0 54 68 69 73 20 69 73 20 66 6f 72 20 75 73 65 0a  This is for use.
193f0 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20 65  ** in assert() e
19400 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69  xpressions, so i
19410 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c  t is only compil
19420 65 64 20 69 66 20 4e 44 45 42 55 47 20 69 73 20  ed if NDEBUG is 
19430 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a  not.** defined..
19440 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65  **.** Only write
19450 20 63 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75   cursors are cou
19460 6e 74 65 64 20 69 66 20 77 72 4f 6e 6c 79 20 69  nted if wrOnly i
19470 73 20 74 72 75 65 2e 20 20 49 66 20 77 72 4f 6e  s true.  If wrOn
19480 6c 79 20 69 73 0a 2a 2a 20 66 61 6c 73 65 20 74  ly is.** false t
19490 68 65 6e 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  hen all cursors 
194a0 61 72 65 20 63 6f 75 6e 74 65 64 2e 0a 2a 2a 0a  are counted..**.
194b0 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
194c0 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74  ses of this rout
194d0 69 6e 65 2c 20 61 20 63 75 72 73 6f 72 20 69 73  ine, a cursor is
194e0 20 61 6e 79 20 63 75 72 73 6f 72 20 74 68 61 74   any cursor that
194f0 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c 65 20 6f  .** is capable o
19500 66 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  f reading or wri
19510 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
19520 62 61 73 65 2e 20 20 43 75 72 73 6f 72 73 20 74  base.  Cursors t
19530 68 61 74 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e  hat.** have been
19540 20 74 72 69 70 70 65 64 20 69 6e 74 6f 20 74 68   tripped into th
19550 65 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 73  e CURSOR_FAULT s
19560 74 61 74 65 20 61 72 65 20 6e 6f 74 20 63 6f 75  tate are not cou
19570 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nted..*/.static 
19580 69 6e 74 20 63 6f 75 6e 74 56 61 6c 69 64 43 75  int countValidCu
19590 72 73 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a  rsors(BtShared *
195a0 70 42 74 2c 20 69 6e 74 20 77 72 4f 6e 6c 79 29  pBt, int wrOnly)
195b0 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  {.  BtCursor *pC
195c0 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b  ur;.  int r = 0;
195d0 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d  .  for(pCur=pBt-
195e0 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20  >pCursor; pCur; 
195f0 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74  pCur=pCur->pNext
19600 29 7b 0a 20 20 20 20 69 66 28 20 28 77 72 4f 6e  ){.    if( (wrOn
19610 6c 79 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e  ly==0 || (pCur->
19620 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
19630 57 72 69 74 65 46 6c 61 67 29 21 3d 30 29 0a 20  WriteFlag)!=0). 
19640 20 20 20 20 26 26 20 70 43 75 72 2d 3e 65 53 74      && pCur->eSt
19650 61 74 65 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate!=CURSOR_FAUL
19660 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20  T ) r++; .  }.  
19670 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64  return r;.}.#end
19680 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  if../*.** If the
19690 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
196a0 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e  nding cursors an
196b0 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20  d we are not in 
196c0 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66  the middle.** of
196d0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62   a transaction b
196e0 75 74 20 74 68 65 72 65 20 69 73 20 61 20 72 65  ut there is a re
196f0 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
19700 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a  atabase, then.**
19710 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e   this routine un
19720 72 65 66 73 20 74 68 65 20 66 69 72 73 74 20 70  refs the first p
19730 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
19740 61 73 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a  ase file which .
19750 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66 65 63  ** has the effec
19760 74 20 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74  t of releasing t
19770 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a  he read lock..**
19780 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20  .** If there is 
19790 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  a transaction in
197a0 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20   progress, this 
197b0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
197c0 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
197d0 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  id unlockBtreeIf
197e0 55 6e 75 73 65 64 28 42 74 53 68 61 72 65 64 20  Unused(BtShared 
197f0 2a 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28  *pBt){.  assert(
19800 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
19810 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
19820 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 6f 75  );.  assert( cou
19830 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70  ntValidCursors(p
19840 42 74 2c 30 29 3d 3d 30 20 7c 7c 20 70 42 74 2d  Bt,0)==0 || pBt-
19850 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 54  >inTransaction>T
19860 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69  RANS_NONE );.  i
19870 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  f( pBt->inTransa
19880 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  ction==TRANS_NON
19890 45 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31  E && pBt->pPage1
198a0 21 3d 30 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61  !=0 ){.    MemPa
198b0 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74  ge *pPage1 = pBt
198c0 2d 3e 70 50 61 67 65 31 3b 0a 20 20 20 20 61 73  ->pPage1;.    as
198d0 73 65 72 74 28 20 70 50 61 67 65 31 2d 3e 61 44  sert( pPage1->aD
198e0 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ata );.    asser
198f0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  t( sqlite3PagerR
19900 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  efcount(pBt->pPa
19910 67 65 72 29 3d 3d 31 20 29 3b 0a 20 20 20 20 70  ger)==1 );.    p
19920 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a  Bt->pPage1 = 0;.
19930 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e      releasePageN
19940 6f 74 4e 75 6c 6c 28 70 50 61 67 65 31 29 3b 0a  otNull(pPage1);.
19950 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    }.}../*.** If 
19960 70 42 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e  pBt points to an
19970 20 65 6d 70 74 79 20 66 69 6c 65 20 74 68 65 6e   empty file then
19980 20 63 6f 6e 76 65 72 74 20 74 68 61 74 20 65 6d   convert that em
19990 70 74 79 20 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f  pty file.** into
199a0 20 61 20 6e 65 77 20 65 6d 70 74 79 20 64 61 74   a new empty dat
199b0 61 62 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c  abase by initial
199c0 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  izing the first 
199d0 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20 64  page of.** the d
199e0 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  atabase..*/.stat
199f0 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61  ic int newDataba
19a00 73 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  se(BtShared *pBt
19a10 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
19a20 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  1;.  unsigned ch
19a30 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20  ar *data;.  int 
19a40 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
19a50 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
19a60 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
19a70 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67  .  if( pBt->nPag
19a80 65 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  e>0 ){.    retur
19a90 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
19aa0 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50  .  pP1 = pBt->pP
19ab0 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20  age1;.  assert( 
19ac0 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61  pP1!=0 );.  data
19ad0 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20   = pP1->aData;. 
19ae0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
19af0 65 72 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62  erWrite(pP1->pDb
19b00 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
19b10 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d  ) return rc;.  m
19b20 65 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67  emcpy(data, zMag
19b30 69 63 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66  icHeader, sizeof
19b40 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b  (zMagicHeader));
19b50 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f  .  assert( sizeo
19b60 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d  f(zMagicHeader)=
19b70 3d 31 36 20 29 3b 0a 20 20 64 61 74 61 5b 31 36  =16 );.  data[16
19b80 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70  ] = (u8)((pBt->p
19b90 61 67 65 53 69 7a 65 3e 3e 38 29 26 30 78 66 66  ageSize>>8)&0xff
19ba0 29 3b 0a 20 20 64 61 74 61 5b 31 37 5d 20 3d 20  );.  data[17] = 
19bb0 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53  (u8)((pBt->pageS
19bc0 69 7a 65 3e 3e 31 36 29 26 30 78 66 66 29 3b 0a  ize>>16)&0xff);.
19bd0 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a    data[18] = 1;.
19be0 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a    data[19] = 1;.
19bf0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75    assert( pBt->u
19c00 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d 3e  sableSize<=pBt->
19c10 70 61 67 65 53 69 7a 65 20 26 26 20 70 42 74 2d  pageSize && pBt-
19c20 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32 35 35 3e  >usableSize+255>
19c30 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b  =pBt->pageSize);
19c40 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20 28 75  .  data[20] = (u
19c50 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  8)(pBt->pageSize
19c60 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   - pBt->usableSi
19c70 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20  ze);.  data[21] 
19c80 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d  = 64;.  data[22]
19c90 20 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b 32 33   = 32;.  data[23
19ca0 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74  ] = 32;.  memset
19cb0 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31  (&data[24], 0, 1
19cc0 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61  00-24);.  zeroPa
19cd0 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b  ge(pP1, PTF_INTK
19ce0 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f  EY|PTF_LEAF|PTF_
19cf0 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42  LEAFDATA );.  pB
19d00 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
19d10 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
19d20 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  D;.#ifndef SQLIT
19d30 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
19d40 4d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  M.  assert( pBt-
19d50 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c  >autoVacuum==1 |
19d60 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  | pBt->autoVacuu
19d70 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  m==0 );.  assert
19d80 28 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  ( pBt->incrVacuu
19d90 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63  m==1 || pBt->inc
19da0 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20  rVacuum==0 );.  
19db0 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33  put4byte(&data[3
19dc0 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61  6 + 4*4], pBt->a
19dd0 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70 75  utoVacuum);.  pu
19de0 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20  t4byte(&data[36 
19df0 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63  + 7*4], pBt->inc
19e00 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66  rVacuum);.#endif
19e10 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20  .  pBt->nPage = 
19e20 31 3b 0a 20 20 64 61 74 61 5b 33 31 5d 20 3d 20  1;.  data[31] = 
19e30 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  1;.  return SQLI
19e40 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
19e50 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 66  Initialize the f
19e60 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
19e70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
19e80 63 72 65 61 74 69 6e 67 20 61 20 64 61 74 61 62  creating a datab
19e90 61 73 65 0a 2a 2a 20 63 6f 6e 73 69 73 74 69 6e  ase.** consistin
19ea0 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61  g of a single pa
19eb0 67 65 20 61 6e 64 20 6e 6f 20 73 63 68 65 6d 61  ge and no schema
19ec0 20 6f 62 6a 65 63 74 73 29 2e 20 52 65 74 75 72   objects). Retur
19ed0 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69  n SQLITE_OK.** i
19ee0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72  f successful, or
19ef0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
19f00 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e   code otherwise.
19f10 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
19f20 74 72 65 65 4e 65 77 44 62 28 42 74 72 65 65 20  treeNewDb(Btree 
19f30 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
19f40 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
19f50 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d  er(p);.  p->pBt-
19f60 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 63  >nPage = 0;.  rc
19f70 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70   = newDatabase(p
19f80 2d 3e 70 42 74 29 3b 0a 20 20 73 71 6c 69 74 65  ->pBt);.  sqlite
19f90 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
19fa0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
19fb0 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
19fc0 20 73 74 61 72 74 20 61 20 6e 65 77 20 74 72 61   start a new tra
19fd0 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74  nsaction. A writ
19fe0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  e-transaction.**
19ff0 20 69 73 20 73 74 61 72 74 65 64 20 69 66 20 74   is started if t
1a000 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
1a010 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f  nt is nonzero, o
1a020 74 68 65 72 77 69 73 65 20 61 20 72 65 61 64 2d  therwise a read-
1a030 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
1a040 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20    If the second 
1a050 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72  argument is 2 or
1a060 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73   more and exclus
1a070 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ive.** transacti
1a080 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d  on is started, m
1a090 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f  eaning that no o
1a0a0 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20  ther process is 
1a0b0 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63  allowed.** to ac
1a0c0 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73  cess the databas
1a0d0 65 2e 20 20 41 20 70 72 65 65 78 69 73 74 69 6e  e.  A preexistin
1a0e0 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61  g transaction ma
1a0f0 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72  y not be.** upgr
1a100 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76  aded to exclusiv
1a110 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69  e by calling thi
1a120 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f  s routine a seco
1a130 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a  nd time - the.**
1a140 20 65 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61   exclusivity fla
1a150 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72  g only works for
1a160 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
1a170 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74  on..**.** A writ
1a180 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  e-transaction mu
1a190 73 74 20 62 65 20 73 74 61 72 74 65 64 20 62 65  st be started be
1a1a0 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20  fore attempting 
1a1b0 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20  any .** changes 
1a1c0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
1a1d0 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f    None of the fo
1a1e0 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73  llowing routines
1a1f0 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75   .** will work u
1a200 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63 74  nless a transact
1a210 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20 66  ion is started f
1a220 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  irst:.**.**     
1a230 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65   sqlite3BtreeCre
1a240 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20  ateTable().**   
1a250 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
1a260 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20  reateIndex().** 
1a270 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
1a280 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a  eClearTable().**
1a290 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1a2a0 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a  eeDropTable().**
1a2b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1a2c0 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20  eeInsert().**   
1a2d0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44     sqlite3BtreeD
1a2e0 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20  elete().**      
1a2f0 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61  sqlite3BtreeUpda
1a300 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49  teMeta().**.** I
1a310 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74  f an initial att
1a320 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65 20  empt to acquire 
1a330 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62  the lock fails b
1a340 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63  ecause of lock c
1a350 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64  ontention.** and
1a360 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61   the database wa
1a370 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c  s previously unl
1a380 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f  ocked, then invo
1a390 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
1a3a0 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20  ler.** if there 
1a3b0 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20  is one.  But if 
1a3c0 74 68 65 72 65 20 77 61 73 20 70 72 65 76 69 6f  there was previo
1a3d0 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b  usly a read-lock
1a3e0 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f  , do not.** invo
1a3f0 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
1a400 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72  ler - just retur
1a410 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20  n SQLITE_BUSY.  
1a420 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a  SQLITE_BUSY is .
1a430 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e  ** returned when
1a440 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
1a450 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e  y a read-lock in
1a460 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20   order to avoid 
1a470 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  a deadlock..**.*
1a480 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72 65 20  * Suppose there 
1a490 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65  are two processe
1a4a0 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61  s A and B.  A ha
1a4b0 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e  s a read lock an
1a4c0 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73  d B has.** a res
1a4d0 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74  erved lock.  B t
1a4e0 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20  ries to promote 
1a4f0 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 75 74  to exclusive but
1a500 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61   is blocked beca
1a510 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65  use.** of A's re
1a520 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65  ad lock.  A trie
1a530 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20  s to promote to 
1a540 72 65 73 65 72 76 65 64 20 62 75 74 20 69 73 20  reserved but is 
1a550 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a  blocked by B..**
1a560 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65   One or the othe
1a570 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f  r of the two pro
1a580 63 65 73 73 65 73 20 6d 75 73 74 20 67 69 76 65  cesses must give
1a590 20 77 61 79 20 6f 72 20 74 68 65 72 65 20 63 61   way or there ca
1a5a0 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72  n be.** no progr
1a5b0 65 73 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69  ess.  By returni
1a5c0 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61  ng SQLITE_BUSY a
1a5d0 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20  nd not invoking 
1a5e0 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  the busy callbac
1a5f0 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65  k.** when A alre
1a600 61 64 79 20 68 61 73 20 61 20 72 65 61 64 20 6c  ady has a read l
1a610 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67  ock, we encourag
1a620 65 20 41 20 74 6f 20 67 69 76 65 20 75 70 20 61  e A to give up a
1a630 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63  nd let B.** proc
1a640 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  eed..*/.int sqli
1a650 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61  te3BtreeBeginTra
1a660 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ns(Btree *p, int
1a670 20 77 72 66 6c 61 67 29 7b 0a 20 20 42 74 53 68   wrflag){.  BtSh
1a680 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1a690 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Bt;.  int rc = S
1a6a0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c  QLITE_OK;..  sql
1a6b0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1a6c0 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  );.  btreeIntegr
1a6d0 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  ity(p);..  /* If
1a6e0 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6c   the btree is al
1a6f0 72 65 61 64 79 20 69 6e 20 61 20 77 72 69 74 65  ready in a write
1a700 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72  -transaction, or
1a710 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65   it.  ** is alre
1a720 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74 72  ady in a read-tr
1a730 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20  ansaction and a 
1a740 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
1a750 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73 74  .  ** is request
1a760 65 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  ed, this is a no
1a770 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  -op..  */.  if( 
1a780 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
1a790 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69  S_WRITE || (p->i
1a7a0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45  nTrans==TRANS_RE
1a7b0 41 44 20 26 26 20 21 77 72 66 6c 61 67 29 20 29  AD && !wrflag) )
1a7c0 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73  {.    goto trans
1a7d0 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 20 20 61 73  _begun;.  }.  as
1a7e0 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
1a7f0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
1a800 57 52 49 54 45 20 7c 7c 20 49 66 4e 6f 74 4f 6d  WRITE || IfNotOm
1a810 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75  itAV(pBt->bDoTru
1a820 6e 63 61 74 65 29 3d 3d 30 20 29 3b 0a 0a 20 20  ncate)==0 );..  
1a830 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61 63  /* Write transac
1a840 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f  tions are not po
1a850 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64  ssible on a read
1a860 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a  -only database *
1a870 2f 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74  /.  if( (pBt->bt
1a880 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41  sFlags & BTS_REA
1a890 44 5f 4f 4e 4c 59 29 21 3d 30 20 26 26 20 77 72  D_ONLY)!=0 && wr
1a8a0 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d  flag ){.    rc =
1a8b0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
1a8c0 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73  ;.    goto trans
1a8d0 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66  _begun;.  }..#if
1a8e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1a8f0 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
1a900 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 70  {.    sqlite3 *p
1a910 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 2f  Block = 0;.    /
1a920 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74  * If another dat
1a930 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73  abase handle has
1a940 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20   already opened 
1a950 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  a write transact
1a960 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 6f 6e 20 74  ion .    ** on t
1a970 68 69 73 20 73 68 61 72 65 64 2d 62 74 72 65 65  his shared-btree
1a980 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61   structure and a
1a990 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72   second write tr
1a9a0 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 20  ansaction is.   
1a9b0 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20 72   ** requested, r
1a9c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
1a9d0 4b 45 44 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  KED..    */.    
1a9e0 69 66 28 20 28 77 72 66 6c 61 67 20 26 26 20 70  if( (wrflag && p
1a9f0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1aa00 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 0a  n==TRANS_WRITE).
1aa10 20 20 20 20 20 7c 7c 20 28 70 42 74 2d 3e 62 74       || (pBt->bt
1aa20 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 45 4e  sFlags & BTS_PEN
1aa30 44 49 4e 47 29 21 3d 30 0a 20 20 20 20 29 7b 0a  DING)!=0.    ){.
1aa40 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70        pBlock = p
1aa50 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 3b  Bt->pWriter->db;
1aa60 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 77  .    }else if( w
1aa70 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 20  rflag>1 ){.     
1aa80 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
1aa90 20 20 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d        for(pIter=
1aaa0 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65  pBt->pLock; pIte
1aab0 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e  r; pIter=pIter->
1aac0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
1aad0 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65  if( pIter->pBtre
1aae0 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20 20 20  e!=p ){.        
1aaf0 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72    pBlock = pIter
1ab00 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20  ->pBtree->db;.  
1ab10 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1ab20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1ab30 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1ab40 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 73  Block ){.      s
1ab50 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e  qlite3Connection
1ab60 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70  Blocked(p->db, p
1ab70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 72 63  Block);.      rc
1ab80 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44   = SQLITE_LOCKED
1ab90 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
1aba0 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62      goto trans_b
1abb0 65 67 75 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  egun;.    }.  }.
1abc0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 79  #endif..  /* Any
1abd0 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 72 65   read-only or re
1abe0 61 64 2d 77 72 69 74 65 20 74 72 61 6e 73 61 63  ad-write transac
1abf0 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61 20 72  tion implies a r
1ac00 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a  ead-lock on .  *
1ac10 2a 20 70 61 67 65 20 31 2e 20 53 6f 20 69 66 20  * page 1. So if 
1ac20 73 6f 6d 65 20 6f 74 68 65 72 20 73 68 61 72 65  some other share
1ac30 64 2d 63 61 63 68 65 20 63 6c 69 65 6e 74 20 61  d-cache client a
1ac40 6c 72 65 61 64 79 20 68 61 73 20 61 20 77 72 69  lready has a wri
1ac50 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e  te-lock .  ** on
1ac60 20 70 61 67 65 20 31 2c 20 74 68 65 20 74 72 61   page 1, the tra
1ac70 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  nsaction cannot 
1ac80 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20  be opened. */.  
1ac90 72 63 20 3d 20 71 75 65 72 79 53 68 61 72 65 64  rc = queryShared
1aca0 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70  CacheTableLock(p
1acb0 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52  , MASTER_ROOT, R
1acc0 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28  EAD_LOCK);.  if(
1acd0 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29   SQLITE_OK!=rc )
1ace0 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75   goto trans_begu
1acf0 6e 3b 0a 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c  n;..  pBt->btsFl
1ad00 61 67 73 20 26 3d 20 7e 42 54 53 5f 49 4e 49 54  ags &= ~BTS_INIT
1ad10 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 69  IALLY_EMPTY;.  i
1ad20 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 30  f( pBt->nPage==0
1ad30 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73   ) pBt->btsFlags
1ad40 20 7c 3d 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c   |= BTS_INITIALL
1ad50 59 5f 45 4d 50 54 59 3b 0a 20 20 64 6f 20 7b 0a  Y_EMPTY;.  do {.
1ad60 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63 6b      /* Call lock
1ad70 42 74 72 65 65 28 29 20 75 6e 74 69 6c 20 65 69  Btree() until ei
1ad80 74 68 65 72 20 70 42 74 2d 3e 70 50 61 67 65 31  ther pBt->pPage1
1ad90 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 6f 72   is populated or
1ada0 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74 72 65  .    ** lockBtre
1adb0 65 28 29 20 72 65 74 75 72 6e 73 20 73 6f 6d 65  e() returns some
1adc0 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  thing other than
1add0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63 6b   SQLITE_OK. lock
1ade0 42 74 72 65 65 28 29 0a 20 20 20 20 2a 2a 20 6d  Btree().    ** m
1adf0 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ay return SQLITE
1ae00 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 20 70 42  _OK but leave pB
1ae10 74 2d 3e 70 50 61 67 65 31 20 73 65 74 20 74 6f  t->pPage1 set to
1ae20 20 30 20 69 66 20 61 66 74 65 72 0a 20 20 20 20   0 if after.    
1ae30 2a 2a 20 72 65 61 64 69 6e 67 20 70 61 67 65 20  ** reading page 
1ae40 31 20 69 74 20 64 69 73 63 6f 76 65 72 73 20 74  1 it discovers t
1ae50 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a  hat the page-siz
1ae60 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1ae70 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 69  e .    ** file i
1ae80 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67 65 53  s not pBt->pageS
1ae90 69 7a 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ize. In this cas
1aea0 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 77 69  e lockBtree() wi
1aeb0 6c 6c 20 75 70 64 61 74 65 0a 20 20 20 20 2a 2a  ll update.    **
1aec0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 74   pBt->pageSize t
1aed0 6f 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  o the page-size 
1aee0 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64  of the file on d
1aef0 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  isk..    */.    
1af00 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 50 61 67  while( pBt->pPag
1af10 65 31 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f  e1==0 && SQLITE_
1af20 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b 42 74  OK==(rc = lockBt
1af30 72 65 65 28 70 42 74 29 29 20 29 3b 0a 0a 20 20  ree(pBt)) );..  
1af40 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1af50 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b  _OK && wrflag ){
1af60 0a 20 20 20 20 20 20 69 66 28 20 28 70 42 74 2d  .      if( (pBt-
1af70 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
1af80 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b  READ_ONLY)!=0 ){
1af90 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1afa0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
1afb0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1afc0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1afd0 50 61 67 65 72 42 65 67 69 6e 28 70 42 74 2d 3e  PagerBegin(pBt->
1afe0 70 50 61 67 65 72 2c 77 72 66 6c 61 67 3e 31 2c  pPager,wrflag>1,
1aff0 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d  sqlite3TempInMem
1b000 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20  ory(p->db));.   
1b010 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1b020 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1b030 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61      rc = newData
1b040 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20  base(pBt);.     
1b050 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1b060 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72 63   }.  .    if( rc
1b070 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1b080 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65       unlockBtree
1b090 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
1b0a0 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 28     }.  }while( (
1b0b0 72 63 26 30 78 46 46 29 3d 3d 53 51 4c 49 54 45  rc&0xFF)==SQLITE
1b0c0 5f 42 55 53 59 20 26 26 20 70 42 74 2d 3e 69 6e  _BUSY && pBt->in
1b0d0 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
1b0e0 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20  NS_NONE &&.     
1b0f0 20 20 20 20 20 62 74 72 65 65 49 6e 76 6f 6b 65       btreeInvoke
1b100 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42 74 29  BusyHandler(pBt)
1b110 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53   );..  if( rc==S
1b120 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b130 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
1b140 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20  TRANS_NONE ){.  
1b150 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61      pBt->nTransa
1b160 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66  ction++;.#ifndef
1b170 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
1b180 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20  RED_CACHE.      
1b190 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  if( p->sharable 
1b1a0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
1b1b0 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65  t( p->lock.pBtre
1b1c0 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f 63 6b 2e  e==p && p->lock.
1b1d0 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20  iTable==1 );.   
1b1e0 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f       p->lock.eLo
1b1f0 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a  ck = READ_LOCK;.
1b200 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e          p->lock.
1b210 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f  pNext = pBt->pLo
1b220 63 6b 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d  ck;.        pBt-
1b230 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f 63  >pLock = &p->loc
1b240 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  k;.      }.#endi
1b250 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69  f.    }.    p->i
1b260 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c 61 67  nTrans = (wrflag
1b270 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54 52 41  ?TRANS_WRITE:TRA
1b280 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20 69 66  NS_READ);.    if
1b290 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74  ( p->inTrans>pBt
1b2a0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
1b2b0 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  ){.      pBt->in
1b2c0 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d  Transaction = p-
1b2d0 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a  >inTrans;.    }.
1b2e0 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 20 29      if( wrflag )
1b2f0 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20  {.      MemPage 
1b300 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70  *pPage1 = pBt->p
1b310 50 61 67 65 31 3b 0a 23 69 66 6e 64 65 66 20 53  Page1;.#ifndef S
1b320 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
1b330 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20 61 73  D_CACHE.      as
1b340 73 65 72 74 28 20 21 70 42 74 2d 3e 70 57 72 69  sert( !pBt->pWri
1b350 74 65 72 20 29 3b 0a 20 20 20 20 20 20 70 42 74  ter );.      pBt
1b360 2d 3e 70 57 72 69 74 65 72 20 3d 20 70 3b 0a 20  ->pWriter = p;. 
1b370 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61       pBt->btsFla
1b380 67 73 20 26 3d 20 7e 42 54 53 5f 45 58 43 4c 55  gs &= ~BTS_EXCLU
1b390 53 49 56 45 3b 0a 20 20 20 20 20 20 69 66 28 20  SIVE;.      if( 
1b3a0 77 72 66 6c 61 67 3e 31 20 29 20 70 42 74 2d 3e  wrflag>1 ) pBt->
1b3b0 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
1b3c0 45 58 43 4c 55 53 49 56 45 3b 0a 23 65 6e 64 69  EXCLUSIVE;.#endi
1b3d0 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  f..      /* If t
1b3e0 68 65 20 64 62 2d 73 69 7a 65 20 68 65 61 64 65  he db-size heade
1b3f0 72 20 66 69 65 6c 64 20 69 73 20 69 6e 63 6f 72  r field is incor
1b400 72 65 63 74 20 28 61 73 20 69 74 20 6d 61 79 20  rect (as it may 
1b410 62 65 20 69 66 20 61 6e 20 6f 6c 64 0a 20 20 20  be if an old.   
1b420 20 20 20 2a 2a 20 63 6c 69 65 6e 74 20 68 61 73     ** client has
1b430 20 62 65 65 6e 20 77 72 69 74 69 6e 67 20 74 68   been writing th
1b440 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29  e database file)
1b450 2c 20 75 70 64 61 74 65 20 69 74 20 6e 6f 77 2e  , update it now.
1b460 20 44 6f 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20   Doing.      ** 
1b470 74 68 69 73 20 73 6f 6f 6e 65 72 20 72 61 74 68  this sooner rath
1b480 65 72 20 74 68 61 6e 20 6c 61 74 65 72 20 6d 65  er than later me
1b490 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ans the database
1b4a0 20 73 69 7a 65 20 63 61 6e 20 73 61 66 65 6c 79   size can safely
1b4b0 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 2d 72 65   .      ** re-re
1b4c0 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ad the database 
1b4d0 73 69 7a 65 20 66 72 6f 6d 20 70 61 67 65 20 31  size from page 1
1b4e0 20 69 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   if a savepoint 
1b4f0 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  or transaction. 
1b500 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b       ** rollback
1b510 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
1b520 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  he transaction..
1b530 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
1b540 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 67  f( pBt->nPage!=g
1b550 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
1b560 3e 61 44 61 74 61 5b 32 38 5d 29 20 29 7b 0a 20  >aData[28]) ){. 
1b570 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1b580 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
1b590 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
1b5a0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1b5b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1b5c0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
1b5d0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32  &pPage1->aData[2
1b5e0 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b  8], pBt->nPage);
1b5f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1b600 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 74   }.    }.  }...t
1b610 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 69 66  rans_begun:.  if
1b620 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1b630 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  && wrflag ){.   
1b640 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 61   /* This call ma
1b650 6b 65 73 20 73 75 72 65 20 74 68 61 74 20 74 68  kes sure that th
1b660 65 20 70 61 67 65 72 20 68 61 73 20 74 68 65 20  e pager has the 
1b670 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20 6f  correct number o
1b680 66 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 20 73 61  f.    ** open sa
1b690 76 65 70 6f 69 6e 74 73 2e 20 49 66 20 74 68 65  vepoints. If the
1b6a0 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
1b6b0 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  r is greater tha
1b6c0 6e 20 30 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74  n 0 and.    ** t
1b6d0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
1b6e0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
1b6f0 65 6e 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c  en, then it will
1b700 20 62 65 20 6f 70 65 6e 65 64 20 68 65 72 65 2e   be opened here.
1b710 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
1b720 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
1b730 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e  nSavepoint(pBt->
1b740 70 50 61 67 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e  pPager, p->db->n
1b750 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a  Savepoint);.  }.
1b760 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
1b770 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  y(p);.  sqlite3B
1b780 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1b790 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
1b7a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1b7b0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a  T_AUTOVACUUM../*
1b7c0 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e  .** Set the poin
1b7d0 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20  ter-map entries 
1b7e0 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e  for all children
1b7f0 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 2e 20   of page pPage. 
1b800 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67  Also, if.** pPag
1b810 65 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73  e contains cells
1b820 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f   that point to o
1b830 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 73  verflow pages, s
1b840 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a  et the pointer.*
1b850 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  * map entries fo
1b860 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
1b870 61 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f  ages as well..*/
1b880 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74 43  .static int setC
1b890 68 69 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d 50  hildPtrmaps(MemP
1b8a0 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
1b8b0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
1b8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8d0 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61 72    /* Counter var
1b8e0 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  iable */.  int n
1b8f0 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
1b900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b910 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   Number of cells
1b920 20 69 6e 20 70 61 67 65 20 70 50 61 67 65 20 2a   in page pPage *
1b930 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
1b940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b950 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1b960 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68 61   code */.  BtSha
1b970 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
1b980 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67  ->pBt;.  Pgno pg
1b990 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f  no = pPage->pgno
1b9a0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
1b9b0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1b9c0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
1b9d0 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 62 74 72  x) );.  rc = btr
1b9e0 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
1b9f0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1ba00 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
1ba10 72 63 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50  rc;.  nCell = pP
1ba20 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66  age->nCell;..  f
1ba30 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
1ba40 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70   i++){.    u8 *p
1ba50 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
1ba60 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20  pPage, i);..    
1ba70 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
1ba80 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
1ba90 72 63 29 3b 0a 0a 20 20 20 20 69 66 28 20 21 70  rc);..    if( !p
1baa0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
1bab0 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67      Pgno childPg
1bac0 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43  no = get4byte(pC
1bad0 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70 74 72 6d  ell);.      ptrm
1bae0 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64  apPut(pBt, child
1baf0 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  Pgno, PTRMAP_BTR
1bb00 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  EE, pgno, &rc);.
1bb10 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
1bb20 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
1bb30 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50  .    Pgno childP
1bb40 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
1bb50 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
1bb60 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
1bb70 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74  );.    ptrmapPut
1bb80 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c  (pBt, childPgno,
1bb90 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
1bba0 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 7d 0a 0a  gno, &rc);.  }..
1bbb0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1bbc0 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20  /*.** Somewhere 
1bbd0 6f 6e 20 70 50 61 67 65 20 69 73 20 61 20 70 6f  on pPage is a po
1bbe0 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 69 46  inter to page iF
1bbf0 72 6f 6d 2e 20 20 4d 6f 64 69 66 79 20 74 68 69  rom.  Modify thi
1bc00 73 20 70 6f 69 6e 74 65 72 20 73 6f 0a 2a 2a 20  s pointer so.** 
1bc10 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
1bc20 6f 20 69 54 6f 2e 20 50 61 72 61 6d 65 74 65 72  o iTo. Parameter
1bc30 20 65 54 79 70 65 20 64 65 73 63 72 69 62 65 73   eType describes
1bc40 20 74 68 65 20 74 79 70 65 20 6f 66 20 70 6f 69   the type of poi
1bc50 6e 74 65 72 20 74 6f 0a 2a 2a 20 62 65 20 6d 6f  nter to.** be mo
1bc60 64 69 66 69 65 64 2c 20 61 73 20 20 66 6f 6c 6c  dified, as  foll
1bc70 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  ows:.**.** PTRMA
1bc80 50 5f 42 54 52 45 45 3a 20 20 20 20 20 70 50 61  P_BTREE:     pPa
1bc90 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61  ge is a btree-pa
1bca0 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  ge. The pointer 
1bcb0 70 6f 69 6e 74 73 20 61 74 20 61 20 63 68 69 6c  points at a chil
1bcc0 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  d .**           
1bcd0 20 20 20 20 20 20 20 20 70 61 67 65 20 6f 66 20          page of 
1bce0 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52  pPage..**.** PTR
1bcf0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70  MAP_OVERFLOW1: p
1bd00 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d  Page is a btree-
1bd10 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
1bd20 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f  r points at an o
1bd30 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20  verflow.**      
1bd40 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67               pag
1bd50 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  e pointed to by 
1bd60 6f 6e 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73  one of the cells
1bd70 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a   on pPage..**.**
1bd80 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
1bd90 32 3a 20 70 50 61 67 65 20 69 73 20 61 6e 20 6f  2: pPage is an o
1bda0 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68  verflow-page. Th
1bdb0 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
1bdc0 20 61 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20   at the next.** 
1bdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bde0 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20    overflow page 
1bdf0 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a  in the list..*/.
1be00 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 64 69 66  static int modif
1be10 79 50 61 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d  yPagePointer(Mem
1be20 50 61 67 65 20 2a 70 50 61 67 65 2c 20 50 67 6e  Page *pPage, Pgn
1be30 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54  o iFrom, Pgno iT
1be40 6f 2c 20 75 38 20 65 54 79 70 65 29 7b 0a 20 20  o, u8 eType){.  
1be50 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1be60 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
1be70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
1be80 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1be90 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
1bea0 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
1beb0 65 29 20 29 3b 0a 20 20 69 66 28 20 65 54 79 70  e) );.  if( eTyp
1bec0 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
1bed0 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  OW2 ){.    /* Th
1bee0 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61 6c 77  e pointer is alw
1bef0 61 79 73 20 74 68 65 20 66 69 72 73 74 20 34 20  ays the first 4 
1bf00 62 79 74 65 73 20 6f 66 20 74 68 65 20 70 61 67  bytes of the pag
1bf10 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  e in this case. 
1bf20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74 34   */.    if( get4
1bf30 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
1bf40 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  a)!=iFrom ){.   
1bf50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1bf60 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1bf70 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74     }.    put4byt
1bf80 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  e(pPage->aData, 
1bf90 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  iTo);.  }else{. 
1bfa0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
1bfb0 74 20 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 74  t nCell;.    int
1bfc0 20 72 63 3b 0a 0a 20 20 20 20 72 63 20 3d 20 62   rc;..    rc = b
1bfd0 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
1bfe0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
1bff0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1c000 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
1c010 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28  nCell;..    for(
1c020 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
1c030 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43  +){.      u8 *pC
1c040 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
1c050 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20  Page, i);.      
1c060 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
1c070 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20  P_OVERFLOW1 ){. 
1c080 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20         CellInfo 
1c090 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 70 50  info;.        pP
1c0a0 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
1c0b0 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
1c0c0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  nfo);.        if
1c0d0 28 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e  ( info.nLocal<in
1c0e0 66 6f 2e 6e 50 61 79 6c 6f 61 64 0a 20 20 20 20  fo.nPayload.    
1c0f0 20 20 20 20 20 26 26 20 70 43 65 6c 6c 2b 69 6e       && pCell+in
1c100 66 6f 2e 6e 53 69 7a 65 2d 31 3c 3d 70 50 61 67  fo.nSize-1<=pPag
1c110 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e  e->aData+pPage->
1c120 6d 61 73 6b 50 61 67 65 0a 20 20 20 20 20 20 20  maskPage.       
1c130 20 20 26 26 20 69 46 72 6f 6d 3d 3d 67 65 74 34    && iFrom==get4
1c140 62 79 74 65 28 70 43 65 6c 6c 2b 69 6e 66 6f 2e  byte(pCell+info.
1c150 6e 53 69 7a 65 2d 34 29 0a 20 20 20 20 20 20 20  nSize-4).       
1c160 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75   ){.          pu
1c170 74 34 62 79 74 65 28 70 43 65 6c 6c 2b 69 6e 66  t4byte(pCell+inf
1c180 6f 2e 6e 53 69 7a 65 2d 34 2c 20 69 54 6f 29 3b  o.nSize-4, iTo);
1c190 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
1c1a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1c1b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1c1c0 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70 43   if( get4byte(pC
1c1d0 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20  ell)==iFrom ){. 
1c1e0 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
1c1f0 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20  e(pCell, iTo);. 
1c200 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1c210 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1c220 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69  }.    }.  .    i
1c230 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20  f( i==nCell ){. 
1c240 20 20 20 20 20 69 66 28 20 65 54 79 70 65 21 3d       if( eType!=
1c250 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
1c260 0a 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62  .          get4b
1c270 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
1c280 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
1c290 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b  et+8])!=iFrom ){
1c2a0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1c2b0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1c2c0 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  KPT;.      }.   
1c2d0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
1c2e0 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
1c2f0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69  >hdrOffset+8], i
1c300 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  To);.    }.  }. 
1c310 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1c320 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  K;.}.../*.** Mov
1c330 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  e the open datab
1c340 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65  ase page pDbPage
1c350 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72   to location iFr
1c360 65 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  eePage in the .*
1c370 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20  * database. The 
1c380 70 44 62 50 61 67 65 20 72 65 66 65 72 65 6e 63  pDbPage referenc
1c390 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e  e remains valid.
1c3a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 43 6f 6d  .**.** The isCom
1c3b0 6d 69 74 20 66 6c 61 67 20 69 6e 64 69 63 61 74  mit flag indicat
1c3c0 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  es that there is
1c3d0 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d 65   no need to reme
1c3e0 6d 62 65 72 20 74 68 61 74 0a 2a 2a 20 74 68 65  mber that.** the
1c3f0 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74   journal needs t
1c400 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20 62 65  o be sync()ed be
1c410 66 6f 72 65 20 64 61 74 61 62 61 73 65 20 70 61  fore database pa
1c420 67 65 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f  ge pDbPage->pgno
1c430 20 0a 2a 2a 20 63 61 6e 20 62 65 20 77 72 69 74   .** can be writ
1c440 74 65 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c  ten to. The call
1c450 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 70  er has already p
1c460 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20 77  romised not to w
1c470 72 69 74 65 20 74 6f 20 74 68 61 74 0a 2a 2a 20  rite to that.** 
1c480 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
1c490 69 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65  int relocatePage
1c4a0 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
1c4b0 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
1c4c0 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61  Btree */.  MemPa
1c4d0 67 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20  ge *pDbPage,    
1c4e0 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65      /* Open page
1c4f0 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38   to move */.  u8
1c500 20 65 54 79 70 65 2c 20 20 20 20 20 20 20 20 20   eType,         
1c510 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
1c520 72 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74  r map 'type' ent
1c530 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a  ry for pDbPage *
1c540 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67  /.  Pgno iPtrPag
1c550 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
1c560 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67  Pointer map 'pag
1c570 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20  e-no' entry for 
1c580 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  pDbPage */.  Pgn
1c590 6f 20 69 46 72 65 65 50 61 67 65 2c 20 20 20 20  o iFreePage,    
1c5a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63        /* The loc
1c5b0 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44  ation to move pD
1c5c0 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e  bPage to */.  in
1c5d0 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20 20 20  t isCommit      
1c5e0 20 20 20 20 20 20 20 2f 2a 20 69 73 43 6f 6d 6d         /* isComm
1c5f0 69 74 20 66 6c 61 67 20 70 61 73 73 65 64 20 74  it flag passed t
1c600 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  o sqlite3PagerMo
1c610 76 65 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d  vepage */.){.  M
1c620 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67 65  emPage *pPtrPage
1c630 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20  ;   /* The page 
1c640 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20  that contains a 
1c650 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61  pointer to pDbPa
1c660 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62  ge */.  Pgno iDb
1c670 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e  Page = pDbPage->
1c680 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70  pgno;.  Pager *p
1c690 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61  Pager = pBt->pPa
1c6a0 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ger;.  int rc;..
1c6b0 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d    assert( eType=
1c6c0 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
1c6d0 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  2 || eType==PTRM
1c6e0 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20  AP_OVERFLOW1 || 
1c6f0 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54  .      eType==PT
1c700 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54  RMAP_BTREE || eT
1c710 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
1c720 50 41 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74  PAGE );.  assert
1c730 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1c740 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
1c750 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44   );.  assert( pD
1c760 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20  bPage->pBt==pBt 
1c770 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61  );..  /* Move pa
1c780 67 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20  ge iDbPage from 
1c790 69 74 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  its current loca
1c7a0 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d  tion to page num
1c7b0 62 65 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f  ber iFreePage */
1c7c0 0a 20 20 54 52 41 43 45 28 28 22 41 55 54 4f 56  .  TRACE(("AUTOV
1c7d0 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64  ACUUM: Moving %d
1c7e0 20 74 6f 20 66 72 65 65 20 70 61 67 65 20 25 64   to free page %d
1c7f0 20 28 70 74 72 20 70 61 67 65 20 25 64 20 74 79   (ptr page %d ty
1c800 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20  pe %d)\n", .    
1c810 20 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65    iDbPage, iFree
1c820 50 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Page, iPtrPage, 
1c830 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20  eType));.  rc = 
1c840 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
1c850 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 44 62  page(pPager, pDb
1c860 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69  Page->pDbPage, i
1c870 46 72 65 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d  FreePage, isComm
1c880 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  it);.  if( rc!=S
1c890 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c8a0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
1c8b0 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d   pDbPage->pgno =
1c8c0 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f   iFreePage;..  /
1c8d0 2a 20 49 66 20 70 44 62 50 61 67 65 20 77 61 73  * If pDbPage was
1c8e0 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74   a btree-page, t
1c8f0 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20  hen it may have 
1c900 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f  child pages and/
1c910 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68  or cells.  ** th
1c920 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72  at point to over
1c930 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20  flow pages. The 
1c940 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
1c950 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73  ies for all thes
1c960 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65  e.  ** pages nee
1c970 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e  d to be changed.
1c980 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44  .  **.  ** If pD
1c990 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72  bPage is an over
1c9a0 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20  flow page, then 
1c9b0 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65  the first 4 byte
1c9c0 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20  s may store a.  
1c9d0 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20  ** pointer to a 
1c9e0 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66  subsequent overf
1c9f0 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74 68 69  low page. If thi
1ca00 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  s is the case, t
1ca10 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69  hen.  ** the poi
1ca20 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74  nter map needs t
1ca30 6f 20 62 65 20 75 70 64 61 74 65 64 20 66 6f 72  o be updated for
1ca40 20 74 68 65 20 73 75 62 73 65 71 75 65 6e 74 20   the subsequent 
1ca50 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20  overflow page.. 
1ca60 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d   */.  if( eType=
1ca70 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
1ca80 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
1ca90 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72  OOTPAGE ){.    r
1caa0 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d  c = setChildPtrm
1cab0 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20  aps(pDbPage);.  
1cac0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1cad0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
1cae0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1caf0 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20  }else{.    Pgno 
1cb00 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62  nextOvfl = get4b
1cb10 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61  yte(pDbPage->aDa
1cb20 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78  ta);.    if( nex
1cb30 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20  tOvfl!=0 ){.    
1cb40 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
1cb50 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41   nextOvfl, PTRMA
1cb60 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72  P_OVERFLOW2, iFr
1cb70 65 65 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20  eePage, &rc);.  
1cb80 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1cb90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1cba0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1cbb0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
1cbc0 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61 74 61   /* Fix the data
1cbd0 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20  base pointer on 
1cbe0 70 61 67 65 20 69 50 74 72 50 61 67 65 20 74 68  page iPtrPage th
1cbf0 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44  at pointed at iD
1cc00 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68  bPage so.  ** th
1cc10 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20  at it points at 
1cc20 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20  iFreePage. Also 
1cc30 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20  fix the pointer 
1cc40 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20  map entry for.  
1cc50 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a  ** iPtrPage..  *
1cc60 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 50  /.  if( eType!=P
1cc70 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
1cc80 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  {.    rc = btree
1cc90 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 74  GetPage(pBt, iPt
1cca0 72 50 61 67 65 2c 20 26 70 50 74 72 50 61 67 65  rPage, &pPtrPage
1ccb0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
1ccc0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1ccd0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1cce0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
1ccf0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1cd00 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62 50 61  (pPtrPage->pDbPa
1cd10 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
1cd20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1cd30 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1cd40 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20  pPtrPage);.     
1cd50 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1cd60 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66  }.    rc = modif
1cd70 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74  yPagePointer(pPt
1cd80 72 50 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20  rPage, iDbPage, 
1cd90 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65  iFreePage, eType
1cda0 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  );.    releasePa
1cdb0 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20  ge(pPtrPage);.  
1cdc0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1cdd0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 74 72  _OK ){.      ptr
1cde0 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46 72 65  mapPut(pBt, iFre
1cdf0 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50  ePage, eType, iP
1ce00 74 72 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20  trPage, &rc);.  
1ce10 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1ce20 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61   rc;.}../* Forwa
1ce30 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72  rd declaration r
1ce40 65 71 75 69 72 65 64 20 62 79 20 69 6e 63 72 56  equired by incrV
1ce50 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a  acuumStep(). */.
1ce60 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63  static int alloc
1ce70 61 74 65 42 74 72 65 65 50 61 67 65 28 42 74 53  ateBtreePage(BtS
1ce80 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65  hared *, MemPage
1ce90 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e   **, Pgno *, Pgn
1cea0 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50  o, u8);../*.** P
1ceb0 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20  erform a single 
1cec0 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63 72 65  step of an incre
1ced0 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49  mental-vacuum. I
1cee0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65  f successful, re
1cef0 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  turn.** SQLITE_O
1cf00 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  K. If there is n
1cf10 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e  o work to do (an
1cf20 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 20 70  d therefore no p
1cf30 6f 69 6e 74 20 69 6e 20 0a 2a 2a 20 63 61 6c 6c  oint in .** call
1cf40 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
1cf50 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75 72 6e  n again), return
1cf60 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 4f 72   SQLITE_DONE. Or
1cf70 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a  , if an error .*
1cf80 2a 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  * occurs, return
1cf90 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f   some other erro
1cfa0 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4d 6f  r code..**.** Mo
1cfb0 72 65 20 73 70 65 63 69 66 69 63 61 6c 6c 79 2c  re specifically,
1cfc0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
1cfd0 74 74 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72  ttempts to re-or
1cfe0 67 61 6e 69 7a 65 20 74 68 65 20 64 61 74 61 62  ganize the datab
1cff0 61 73 65 20 73 6f 20 0a 2a 2a 20 74 68 61 74 20  ase so .** that 
1d000 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 6f 66  the last page of
1d010 20 74 68 65 20 66 69 6c 65 20 63 75 72 72 65 6e   the file curren
1d020 74 6c 79 20 69 6e 20 75 73 65 20 69 73 20 6e 6f  tly in use is no
1d030 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a   longer in use..
1d040 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  **.** Parameter 
1d050 6e 46 69 6e 20 69 73 20 74 68 65 20 6e 75 6d 62  nFin is the numb
1d060 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  er of pages that
1d070 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 77   this database w
1d080 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20  ould contain.** 
1d090 77 65 72 65 20 74 68 69 73 20 66 75 6e 63 74 69  were this functi
1d0a0 6f 6e 20 63 61 6c 6c 65 64 20 75 6e 74 69 6c 20  on called until 
1d0b0 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  it returns SQLIT
1d0c0 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 49 66  E_DONE..**.** If
1d0d0 20 74 68 65 20 62 43 6f 6d 6d 69 74 20 70 61 72   the bCommit par
1d0e0 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65  ameter is non-ze
1d0f0 72 6f 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ro, this functio
1d100 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 74  n assumes that t
1d110 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 77 69  he .** caller wi
1d120 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20  ll keep calling 
1d130 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29  incrVacuumStep()
1d140 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e   until it return
1d150 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 0a 2a  s SQLITE_DONE .*
1d160 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 2e 20 62  * or an error. b
1d170 43 6f 6d 6d 69 74 20 69 73 20 70 61 73 73 65 64  Commit is passed
1d180 20 74 72 75 65 20 66 6f 72 20 61 6e 20 61 75 74   true for an aut
1d190 6f 2d 76 61 63 75 75 6d 2d 6f 6e 2d 63 6f 6d 6d  o-vacuum-on-comm
1d1a0 69 74 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  it .** operation
1d1b0 2c 20 6f 72 20 66 61 6c 73 65 20 66 6f 72 20 61  , or false for a
1d1c0 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
1d1d0 63 75 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cuum..*/.static 
1d1e0 69 6e 74 20 69 6e 63 72 56 61 63 75 75 6d 53 74  int incrVacuumSt
1d1f0 65 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ep(BtShared *pBt
1d200 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e  , Pgno nFin, Pgn
1d210 6f 20 69 4c 61 73 74 50 67 2c 20 69 6e 74 20 62  o iLastPg, int b
1d220 43 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 6e 6f 20  Commit){.  Pgno 
1d230 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20  nFreeList;      
1d240 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1d250 66 20 70 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e  f pages still on
1d260 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2a   the free-list *
1d270 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  /.  int rc;..  a
1d280 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1d290 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
1d2a0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
1d2b0 74 28 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e 20  t( iLastPg>nFin 
1d2c0 29 3b 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41  );..  if( !PTRMA
1d2d0 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c  P_ISPAGE(pBt, iL
1d2e0 61 73 74 50 67 29 20 26 26 20 69 4c 61 73 74 50  astPg) && iLastP
1d2f0 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  g!=PENDING_BYTE_
1d300 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
1d310 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 50   u8 eType;.    P
1d320 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20  gno iPtrPage;.. 
1d330 20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d 20 67     nFreeList = g
1d340 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  et4byte(&pBt->pP
1d350 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
1d360 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 4c  ;.    if( nFreeL
1d370 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist==0 ){.      
1d380 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
1d390 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72  NE;.    }..    r
1d3a0 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
1d3b0 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65 54 79  t, iLastPg, &eTy
1d3c0 70 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a  pe, &iPtrPage);.
1d3d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1d3e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1d3f0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1d400 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
1d410 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
1d420 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
1d430 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1d440 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  PT;.    }..    i
1d450 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
1d460 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20  _FREEPAGE ){.   
1d470 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d     if( bCommit==
1d480 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
1d490 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20  Remove the page 
1d4a0 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20 66  from the files f
1d4b0 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 69  ree-list. This i
1d4c0 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a 20  s not required. 
1d4d0 20 20 20 20 20 20 20 2a 2a 20 69 66 20 62 43 6f         ** if bCo
1d4e0 6d 6d 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  mmit is non-zero
1d4f0 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20  . In that case, 
1d500 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 77 69  the free-list wi
1d510 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  ll be.        **
1d520 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65   truncated to ze
1d530 72 6f 20 61 66 74 65 72 20 74 68 69 73 20 66 75  ro after this fu
1d540 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20  nction returns, 
1d550 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 0a 20  so it doesn't . 
1d560 20 20 20 20 20 20 20 2a 2a 20 6d 61 74 74 65 72         ** matter
1d570 20 69 66 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e   if it still con
1d580 74 61 69 6e 73 20 73 6f 6d 65 20 67 61 72 62 61  tains some garba
1d590 67 65 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20  ge entries..    
1d5a0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50      */.        P
1d5b0 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20 20 20  gno iFreePg;.   
1d5c0 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46       MemPage *pF
1d5d0 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72  reePg;.        r
1d5e0 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
1d5f0 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65  ePage(pBt, &pFre
1d600 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69  ePg, &iFreePg, i
1d610 4c 61 73 74 50 67 2c 20 42 54 41 4c 4c 4f 43 5f  LastPg, BTALLOC_
1d620 45 58 41 43 54 29 3b 0a 20 20 20 20 20 20 20 20  EXACT);.        
1d630 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1d640 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
1d650 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1d660 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
1d670 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69 4c 61  rt( iFreePg==iLa
1d680 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20  stPg );.        
1d690 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65  releasePage(pFre
1d6a0 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ePg);.      }.  
1d6b0 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
1d6c0 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 20 20   Pgno iFreePg;  
1d6d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1d6e0 64 65 78 20 6f 66 20 66 72 65 65 20 70 61 67 65  dex of free page
1d6f0 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50 67   to move pLastPg
1d700 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d   to */.      Mem
1d710 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a 20  Page *pLastPg;. 
1d720 20 20 20 20 20 75 38 20 65 4d 6f 64 65 20 3d 20       u8 eMode = 
1d730 42 54 41 4c 4c 4f 43 5f 41 4e 59 3b 20 20 20 2f  BTALLOC_ANY;   /
1d740 2a 20 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72  * Mode parameter
1d750 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72   for allocateBtr
1d760 65 65 50 61 67 65 28 29 20 2a 2f 0a 20 20 20 20  eePage() */.    
1d770 20 20 50 67 6e 6f 20 69 4e 65 61 72 20 3d 20 30    Pgno iNear = 0
1d780 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e  ;           /* n
1d790 65 61 72 62 79 20 70 61 72 61 6d 65 74 65 72 20  earby parameter 
1d7a0 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  for allocateBtre
1d7b0 65 50 61 67 65 28 29 20 2a 2f 0a 0a 20 20 20 20  ePage() */..    
1d7c0 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
1d7d0 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67  age(pBt, iLastPg
1d7e0 2c 20 26 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a  , &pLastPg, 0);.
1d7f0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1d800 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1d810 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1d820 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
1d830 49 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 7a 65  If bCommit is ze
1d840 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72 75  ro, this loop ru
1d850 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20  ns exactly once 
1d860 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74 50 67  and page pLastPg
1d870 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 77 61  .      ** is swa
1d880 70 70 65 64 20 77 69 74 68 20 74 68 65 20 66 69  pped with the fi
1d890 72 73 74 20 66 72 65 65 20 70 61 67 65 20 70 75  rst free page pu
1d8a0 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66 72 65  lled off the fre
1d8b0 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a  e list..      **
1d8c0 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65  .      ** On the
1d8d0 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 20   other hand, if 
1d8e0 62 43 6f 6d 6d 69 74 20 69 73 20 67 72 65 61 74  bCommit is great
1d8f0 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  er than zero, th
1d900 65 6e 20 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a  en keep.      **
1d910 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61   looping until a
1d920 20 66 72 65 65 2d 70 61 67 65 20 6c 6f 63 61 74   free-page locat
1d930 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 66 69  ed within the fi
1d940 72 73 74 20 6e 46 69 6e 20 70 61 67 65 73 0a 20  rst nFin pages. 
1d950 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66       ** of the f
1d960 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20  ile is found..  
1d970 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
1d980 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20   bCommit==0 ){. 
1d990 20 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 42         eMode = B
1d9a0 54 41 4c 4c 4f 43 5f 4c 45 3b 0a 20 20 20 20 20  TALLOC_LE;.     
1d9b0 20 20 20 69 4e 65 61 72 20 3d 20 6e 46 69 6e 3b     iNear = nFin;
1d9c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64  .      }.      d
1d9d0 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50  o {.        MemP
1d9e0 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20  age *pFreePg;.  
1d9f0 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
1da00 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
1da10 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72  , &pFreePg, &iFr
1da20 65 65 50 67 2c 20 69 4e 65 61 72 2c 20 65 4d 6f  eePg, iNear, eMo
1da30 64 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  de);.        if(
1da40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1da50 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65  {.          rele
1da60 61 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29  asePage(pLastPg)
1da70 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
1da80 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
1da90 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
1daa0 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20  Page(pFreePg);. 
1dab0 20 20 20 20 20 7d 77 68 69 6c 65 28 20 62 43 6f       }while( bCo
1dac0 6d 6d 69 74 20 26 26 20 69 46 72 65 65 50 67 3e  mmit && iFreePg>
1dad0 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20 20 61 73  nFin );.      as
1dae0 73 65 72 74 28 20 69 46 72 65 65 50 67 3c 69 4c  sert( iFreePg<iL
1daf0 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 0a  astPg );.      .
1db00 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63        rc = reloc
1db10 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c 61  atePage(pBt, pLa
1db20 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50 74  stPg, eType, iPt
1db30 72 50 61 67 65 2c 20 69 46 72 65 65 50 67 2c 20  rPage, iFreePg, 
1db40 62 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20  bCommit);.      
1db50 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73  releasePage(pLas
1db60 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tPg);.      if( 
1db70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1db80 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1db90 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
1dba0 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 43 6f  }.  }..  if( bCo
1dbb0 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64  mmit==0 ){.    d
1dbc0 6f 20 7b 0a 20 20 20 20 20 20 69 4c 61 73 74 50  o {.      iLastP
1dbd0 67 2d 2d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  g--;.    }while(
1dbe0 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44 49 4e   iLastPg==PENDIN
1dbf0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
1dc00 20 7c 7c 20 50 54 52 4d 41 50 5f 49 53 50 41 47   || PTRMAP_ISPAG
1dc10 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20  E(pBt, iLastPg) 
1dc20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 62 44 6f 54  );.    pBt->bDoT
1dc30 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20 20  runcate = 1;.   
1dc40 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 69 4c   pBt->nPage = iL
1dc50 61 73 74 50 67 3b 0a 20 20 7d 0a 20 20 72 65 74  astPg;.  }.  ret
1dc60 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1dc70 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61  ../*.** The data
1dc80 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20 74  base opened by t
1dc90 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
1dca0 74 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63  t is an auto-vac
1dcb0 75 75 6d 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  uum database.** 
1dcc0 6e 4f 72 69 67 20 70 61 67 65 73 20 69 6e 20 73  nOrig pages in s
1dcd0 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e  ize containing n
1dce0 46 72 65 65 20 66 72 65 65 20 70 61 67 65 73 2e  Free free pages.
1dcf0 20 52 65 74 75 72 6e 20 74 68 65 20 65 78 70 65   Return the expe
1dd00 63 74 65 64 20 0a 2a 2a 20 73 69 7a 65 20 6f 66  cted .** size of
1dd10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   the database in
1dd20 20 70 61 67 65 73 20 66 6f 6c 6c 6f 77 69 6e 67   pages following
1dd30 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
1dd40 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  operation..*/.st
1dd50 61 74 69 63 20 50 67 6e 6f 20 66 69 6e 61 6c 44  atic Pgno finalD
1dd60 62 53 69 7a 65 28 42 74 53 68 61 72 65 64 20 2a  bSize(BtShared *
1dd70 70 42 74 2c 20 50 67 6e 6f 20 6e 4f 72 69 67 2c  pBt, Pgno nOrig,
1dd80 20 50 67 6e 6f 20 6e 46 72 65 65 29 7b 0a 20 20   Pgno nFree){.  
1dd90 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20 20 20 20  int nEntry;     
1dda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ddb0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
1ddc0 72 69 65 73 20 6f 6e 20 6f 6e 65 20 70 74 72 6d  ries on one ptrm
1ddd0 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e  ap page */.  Pgn
1dde0 6f 20 6e 50 74 72 6d 61 70 3b 20 20 20 20 20 20  o nPtrmap;      
1ddf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1de00 4e 75 6d 62 65 72 20 6f 66 20 50 74 72 4d 61 70  Number of PtrMap
1de10 20 70 61 67 65 73 20 74 6f 20 62 65 20 66 72 65   pages to be fre
1de20 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46 69  ed */.  Pgno nFi
1de30 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
1de40 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1de50 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 6e 45  n value */..  nE
1de60 6e 74 72 79 20 3d 20 70 42 74 2d 3e 75 73 61 62  ntry = pBt->usab
1de70 6c 65 53 69 7a 65 2f 35 3b 0a 20 20 6e 50 74 72  leSize/5;.  nPtr
1de80 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72  map = (nFree-nOr
1de90 69 67 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f  ig+PTRMAP_PAGENO
1dea0 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b 6e 45 6e  (pBt, nOrig)+nEn
1deb0 74 72 79 29 2f 6e 45 6e 74 72 79 3b 0a 20 20 6e  try)/nEntry;.  n
1dec0 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46  Fin = nOrig - nF
1ded0 72 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20  ree - nPtrmap;. 
1dee0 20 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49   if( nOrig>PENDI
1def0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
1df00 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e  ) && nFin<PENDIN
1df10 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
1df20 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a   ){.    nFin--;.
1df30 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 50 54 52    }.  while( PTR
1df40 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
1df50 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50  nFin) || nFin==P
1df60 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
1df70 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e 46 69  (pBt) ){.    nFi
1df80 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  n--;.  }..  retu
1df90 72 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn nFin;.}../*.*
1dfa0 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61  * A write-transa
1dfb0 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70  ction must be op
1dfc0 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c  ened before call
1dfd0 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
1dfe0 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d  n..** It perform
1dff0 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 74 20  s a single unit 
1e000 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64 73 20  of work towards 
1e010 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  an incremental v
1e020 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  acuum..**.** If 
1e030 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20  the incremental 
1e040 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69 73 68  vacuum is finish
1e050 65 64 20 61 66 74 65 72 20 74 68 69 73 20 66 75  ed after this fu
1e060 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a  nction has run,.
1e070 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69  ** SQLITE_DONE i
1e080 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69  s returned. If i
1e090 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73 68 65  t is not finishe
1e0a0 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20  d, but no error 
1e0b0 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51 4c  occurred,.** SQL
1e0c0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1e0d0 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 61 6e  ed. Otherwise an
1e0e0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
1e0f0 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  de. .*/.int sqli
1e100 74 65 33 42 74 72 65 65 49 6e 63 72 56 61 63 75  te3BtreeIncrVacu
1e110 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  um(Btree *p){.  
1e120 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
1e130 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
1e140 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
1e150 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73  eEnter(p);.  ass
1e160 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
1e170 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
1e180 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54 72 61  RITE && p->inTra
1e190 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
1e1a0 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 61  );.  if( !pBt->a
1e1b0 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
1e1c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
1e1d0 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  E;.  }else{.    
1e1e0 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 62 74 72  Pgno nOrig = btr
1e1f0 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
1e200 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65  ;.    Pgno nFree
1e210 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74   = get4byte(&pBt
1e220 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
1e230 33 36 5d 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e  36]);.    Pgno n
1e240 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a  Fin = finalDbSiz
1e250 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46  e(pBt, nOrig, nF
1e260 72 65 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e  ree);..    if( n
1e270 4f 72 69 67 3c 6e 46 69 6e 20 29 7b 0a 20 20 20  Orig<nFin ){.   
1e280 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
1e290 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1e2a0 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 72 65 65   }else if( nFree
1e2b0 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  >0 ){.      rc =
1e2c0 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
1e2d0 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  pBt, 0, 0);.    
1e2e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1e2f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
1e300 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
1e310 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a  flowCache(pBt);.
1e320 20 20 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63          rc = inc
1e330 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c  rVacuumStep(pBt,
1e340 20 6e 46 69 6e 2c 20 6e 4f 72 69 67 2c 20 30 29   nFin, nOrig, 0)
1e350 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1e360 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1e370 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
1e380 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1e390 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d  ite(pBt->pPage1-
1e3a0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
1e3b0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
1e3c0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
1e3d0 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  28], pBt->nPage)
1e3e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
1e3f0 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
1e400 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
1e410 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
1e420 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1e430 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1e440 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1e450 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f  e is called prio
1e460 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  r to sqlite3Page
1e470 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74  rCommit when a t
1e480 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73  ransaction.** is
1e490 20 63 6f 6d 6d 69 74 74 65 64 20 66 6f 72 20 61   committed for a
1e4a0 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
1e4b0 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  tabase..**.** If
1e4c0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1e4d0 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e  turned, then *pn
1e4e0 54 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f 20  Trunc is set to 
1e4f0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
1e500 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ges.** the datab
1e510 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20  ase file should 
1e520 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  be truncated to 
1e530 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69  during the commi
1e540 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69  t process. .** i
1e550 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61 73 65  .e. the database
1e560 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67 61   has been reorga
1e570 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f 6e  nized so that on
1e580 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a 70 6e  ly the first *pn
1e590 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61  Trunc.** pages a
1e5a0 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74  re in use..*/.st
1e5b0 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61 63  atic int autoVac
1e5c0 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61 72  uumCommit(BtShar
1e5d0 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20  ed *pBt){.  int 
1e5e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1e5f0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1e600 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20  = pBt->pPager;. 
1e610 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e   VVA_ONLY( int n
1e620 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67  Ref = sqlite3Pag
1e630 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65  erRefcount(pPage
1e640 72 29 3b 20 29 0a 0a 20 20 61 73 73 65 72 74 28  r); )..  assert(
1e650 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1e660 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
1e670 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 41  );.  invalidateA
1e680 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
1e690 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74 28 70  pBt);.  assert(p
1e6a0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b  Bt->autoVacuum);
1e6b0 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69 6e 63  .  if( !pBt->inc
1e6c0 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50  rVacuum ){.    P
1e6d0 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20  gno nFin;       
1e6e0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
1e6f0 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65  ages in database
1e700 20 61 66 74 65 72 20 61 75 74 6f 76 61 63 75 75   after autovacuu
1e710 6d 69 6e 67 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  ming */.    Pgno
1e720 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f   nFree;        /
1e730 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
1e740 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
1e750 74 20 69 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a 20  t initially */. 
1e760 20 20 20 50 67 6e 6f 20 69 46 72 65 65 3b 20 20     Pgno iFree;  
1e770 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78        /* The nex
1e780 74 20 70 61 67 65 20 74 6f 20 62 65 20 66 72 65  t page to be fre
1e790 65 64 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e  ed */.    Pgno n
1e7a0 4f 72 69 67 3b 20 20 20 20 20 20 20 20 2f 2a 20  Orig;        /* 
1e7b0 44 61 74 61 62 61 73 65 20 73 69 7a 65 20 62 65  Database size be
1e7c0 66 6f 72 65 20 66 72 65 65 69 6e 67 20 2a 2f 0a  fore freeing */.
1e7d0 0a 20 20 20 20 6e 4f 72 69 67 20 3d 20 62 74 72  .    nOrig = btr
1e7e0 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
1e7f0 3b 0a 20 20 20 20 69 66 28 20 50 54 52 4d 41 50  ;.    if( PTRMAP
1e800 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 4f 72  _ISPAGE(pBt, nOr
1e810 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45  ig) || nOrig==PE
1e820 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
1e830 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  pBt) ){.      /*
1e840 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   It is not possi
1e850 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 61 20  ble to create a 
1e860 64 61 74 61 62 61 73 65 20 66 6f 72 20 77 68 69  database for whi
1e870 63 68 20 74 68 65 20 66 69 6e 61 6c 20 70 61 67  ch the final pag
1e880 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 69  e.      ** is ei
1e890 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72 2d 6d  ther a pointer-m
1e8a0 61 70 20 70 61 67 65 20 6f 72 20 74 68 65 20 70  ap page or the p
1e8b0 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61 67 65  ending-byte page
1e8c0 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20 20 20 2a  . If one.      *
1e8d0 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  * is encountered
1e8e0 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73  , this indicates
1e8f0 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20   corruption..   
1e900 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75     */.      retu
1e910 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1e920 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20  T_BKPT;.    }.. 
1e930 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62     nFree = get4b
1e940 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
1e950 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
1e960 20 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62    nFin = finalDb
1e970 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c  Size(pBt, nOrig,
1e980 20 6e 46 72 65 65 29 3b 0a 20 20 20 20 69 66 28   nFree);.    if(
1e990 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20 72 65   nFin>nOrig ) re
1e9a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1e9b0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 69 66  UPT_BKPT;.    if
1e9c0 28 20 6e 46 69 6e 3c 6e 4f 72 69 67 20 29 7b 0a  ( nFin<nOrig ){.
1e9d0 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 41        rc = saveA
1e9e0 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30  llCursors(pBt, 0
1e9f0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
1ea00 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69 67 3b  for(iFree=nOrig;
1ea10 20 69 46 72 65 65 3e 6e 46 69 6e 20 26 26 20 72   iFree>nFin && r
1ea20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 46  c==SQLITE_OK; iF
1ea30 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63  ree--){.      rc
1ea40 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65   = incrVacuumSte
1ea50 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69 46 72  p(pBt, nFin, iFr
1ea60 65 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  ee, 1);.    }.  
1ea70 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54    if( (rc==SQLIT
1ea80 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53 51  E_DONE || rc==SQ
1ea90 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46 72 65  LITE_OK) && nFre
1eaa0 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  e>0 ){.      rc 
1eab0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1eac0 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d  ite(pBt->pPage1-
1ead0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
1eae0 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e   put4byte(&pBt->
1eaf0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
1eb00 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74  ], 0);.      put
1eb10 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
1eb20 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30  e1->aData[36], 0
1eb30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  );.      put4byt
1eb40 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
1eb50 61 44 61 74 61 5b 32 38 5d 2c 20 6e 46 69 6e 29  aData[28], nFin)
1eb60 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 44 6f  ;.      pBt->bDo
1eb70 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20  Truncate = 1;.  
1eb80 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d      pBt->nPage =
1eb90 20 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 20   nFin;.    }.   
1eba0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1ebb0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
1ebc0 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
1ebd0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
1ebe0 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e    }..  assert( n
1ebf0 52 65 66 3e 3d 73 71 6c 69 74 65 33 50 61 67 65  Ref>=sqlite3Page
1ec00 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72  rRefcount(pPager
1ec10 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ) );.  return rc
1ec20 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66  ;.}..#else /* if
1ec30 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1ec40 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 23  _AUTOVACUUM */.#
1ec50 20 64 65 66 69 6e 65 20 73 65 74 43 68 69 6c 64   define setChild
1ec60 50 74 72 6d 61 70 73 28 78 29 20 53 51 4c 49 54  Ptrmaps(x) SQLIT
1ec70 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  E_OK.#endif../*.
1ec80 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1ec90 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70  does the first p
1eca0 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68  hase of a two-ph
1ecb0 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69  ase commit.  Thi
1ecc0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75  s routine.** cau
1ecd0 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  ses a rollback j
1ece0 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65  ournal to be cre
1ecf0 61 74 65 64 20 28 69 66 20 69 74 20 64 6f 65 73  ated (if it does
1ed00 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69   not already exi
1ed10 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c  st).** and popul
1ed20 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68  ated with enough
1ed30 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20   information so 
1ed40 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 20  that if a power 
1ed50 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74  loss occurs.** t
1ed60 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 20  he database can 
1ed70 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  be restored to i
1ed80 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  ts original stat
1ed90 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63  e by playing bac
1eda0 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  k.** the journal
1edb0 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74  .  Then the cont
1edc0 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  ents of the jour
1edd0 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20  nal are flushed 
1ede0 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69  out to.** the di
1edf0 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a  sk.  After the j
1ee00 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79  ournal is safely
1ee10 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63   on oxide, the c
1ee20 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a  hanges to the.**
1ee30 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77 72   database are wr
1ee40 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64  itten into the d
1ee50 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
1ee60 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64   flushed to oxid
1ee70 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64  e..** At the end
1ee80 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74   of this call, t
1ee90 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
1eea0 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73  nal still exists
1eeb0 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20   on the.** disk 
1eec0 61 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c  and we are still
1eed0 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63   holding all loc
1eee0 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73  ks, so the trans
1eef0 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a  action has not.*
1ef00 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65  * committed.  Se
1ef10 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  e sqlite3BtreeCo
1ef20 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 66  mmitPhaseTwo() f
1ef30 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68  or the second ph
1ef40 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f  ase of the.** co
1ef50 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a  mmit process..**
1ef60 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73  .** This call is
1ef70 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77   a no-op if no w
1ef80 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
1ef90 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63   is currently ac
1efa0 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a  tive on pBt..**.
1efb0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79  ** Otherwise, sy
1efc0 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
1efd0 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72  file for the btr
1efe0 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20  ee pBt. zMaster 
1eff0 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65  points to.** the
1f000 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65   name of a maste
1f010 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  r journal file t
1f020 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72  hat should be wr
1f030 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a  itten into the.*
1f040 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75  * individual jou
1f050 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73  rnal file, or is
1f060 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e   NULL, indicatin
1f070 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  g no master jour
1f080 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69  nal file .** (si
1f090 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72  ngle database tr
1f0a0 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a  ansaction)..**.*
1f0b0 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63  * When this is c
1f0c0 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65  alled, the maste
1f0d0 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64  r journal should
1f0e0 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 62 65   already have be
1f0f0 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70  en.** created, p
1f100 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68  opulated with th
1f110 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  is journal point
1f120 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f  er and synced to
1f130 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63   disk..**.** Onc
1f140 65 20 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e  e this is routin
1f150 65 20 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20  e has returned, 
1f160 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72  the only thing r
1f170 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69  equired to commi
1f180 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74  t.** the write-t
1f190 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74  ransaction for t
1f1a0 68 69 73 20 64 61 74 61 62 61 73 65 20 66 69 6c  his database fil
1f1b0 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74  e is to delete t
1f1c0 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69  he journal..*/.i
1f1d0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
1f1e0 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 42 74  ommitPhaseOne(Bt
1f1f0 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  ree *p, const ch
1f200 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
1f210 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1f220 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  OK;.  if( p->inT
1f230 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
1f240 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65  E ){.    BtShare
1f250 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
1f260 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1f270 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 6e 64  eEnter(p);.#ifnd
1f280 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1f290 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
1f2a0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
1f2b0 6d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  m ){.      rc = 
1f2c0 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74  autoVacuumCommit
1f2d0 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28  (pBt);.      if(
1f2e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1f2f0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1f300 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1f310 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1f320 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
1f330 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 62 44  .    if( pBt->bD
1f340 6f 54 72 75 6e 63 61 74 65 20 29 7b 0a 20 20 20  oTruncate ){.   
1f350 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 54     sqlite3PagerT
1f360 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74  runcateImage(pBt
1f370 2d 3e 70 50 61 67 65 72 2c 20 70 42 74 2d 3e 6e  ->pPager, pBt->n
1f380 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  Page);.    }.#en
1f390 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  dif.    rc = sql
1f3a0 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
1f3b0 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61  haseOne(pBt->pPa
1f3c0 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29  ger, zMaster, 0)
1f3d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
1f3e0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a  eeLeave(p);.  }.
1f3f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1f400 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1f410 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 72  ion is called fr
1f420 6f 6d 20 62 6f 74 68 20 42 74 72 65 65 43 6f 6d  om both BtreeCom
1f430 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 61 6e  mitPhaseTwo() an
1f440 64 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  d BtreeRollback(
1f450 29 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63  ).** at the conc
1f460 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e  lusion of a tran
1f470 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  saction..*/.stat
1f480 69 63 20 76 6f 69 64 20 62 74 72 65 65 45 6e 64  ic void btreeEnd
1f490 54 72 61 6e 73 61 63 74 69 6f 6e 28 42 74 72 65  Transaction(Btre
1f4a0 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
1f4b0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
1f4c0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1f4d0 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74   p->db;.  assert
1f4e0 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
1f4f0 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 0a  ldsMutex(p) );..
1f500 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1f510 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
1f520 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74   pBt->bDoTruncat
1f530 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  e = 0;.#endif.  
1f540 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54  if( p->inTrans>T
1f550 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 64 62 2d  RANS_NONE && db-
1f560 3e 6e 56 64 62 65 52 65 61 64 3e 31 20 29 7b 0a  >nVdbeRead>1 ){.
1f570 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
1f580 61 72 65 20 6f 74 68 65 72 20 61 63 74 69 76 65  are other active
1f590 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74   statements that
1f5a0 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68 69 73 20   belong to this 
1f5b0 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
1f5c0 68 61 6e 64 6c 65 2c 20 64 6f 77 6e 67 72 61 64  handle, downgrad
1f5d0 65 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79  e to a read-only
1f5e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68   transaction. Th
1f5f0 65 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e  e other statemen
1f600 74 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 73 74  ts.    ** may st
1f610 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20 66  ill be reading f
1f620 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
1f630 2e 20 20 2a 2f 0a 20 20 20 20 64 6f 77 6e 67 72  .  */.    downgr
1f640 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
1f650 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a  eTableLocks(p);.
1f660 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d      p->inTrans =
1f670 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d   TRANS_READ;.  }
1f680 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
1f690 74 68 65 20 68 61 6e 64 6c 65 20 68 61 64 20 61  the handle had a
1f6a0 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73  ny kind of trans
1f6b0 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63  action open, dec
1f6c0 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 20 20  rement the .    
1f6d0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  ** transaction c
1f6e0 6f 75 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72  ount of the shar
1f6f0 65 64 20 62 74 72 65 65 2e 20 49 66 20 74 68 65  ed btree. If the
1f700 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1f710 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65 61 63 68  nt .    ** reach
1f720 65 73 20 30 2c 20 73 65 74 20 74 68 65 20 73 68  es 0, set the sh
1f730 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52  ared state to TR
1f740 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e  ANS_NONE. The un
1f750 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
1f760 64 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20  d().    ** call 
1f770 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63  below will unloc
1f780 6b 20 74 68 65 20 70 61 67 65 72 2e 20 20 2a 2f  k the pager.  */
1f790 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  .    if( p->inTr
1f7a0 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ans!=TRANS_NONE 
1f7b0 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72 41 6c  ){.      clearAl
1f7c0 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
1f7d0 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 20  eLocks(p);.     
1f7e0 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
1f7f0 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20  on--;.      if( 
1f800 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63  0==pBt->nTransac
1f810 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  tion ){.        
1f820 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1f830 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  on = TRANS_NONE;
1f840 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1f850 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 63      /* Set the c
1f860 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
1f870 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e  on state to TRAN
1f880 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63  S_NONE and unloc
1f890 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 70 61  k the .    ** pa
1f8a0 67 65 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c  ger if this call
1f8b0 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79   closed the only
1f8c0 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
1f8d0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a  ransaction.  */.
1f8e0 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d      p->inTrans =
1f8f0 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20   TRANS_NONE;.   
1f900 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
1f910 75 73 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a  used(pBt);.  }..
1f920 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
1f930 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  (p);.}../*.** Co
1f940 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
1f950 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69  tion currently i
1f960 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a  n progress..**.*
1f970 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
1f980 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 73 65  mplements the se
1f990 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 61 20  cond phase of a 
1f9a0 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20  2-phase commit. 
1f9b0 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42   The.** sqlite3B
1f9c0 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
1f9d0 6e 65 28 29 20 72 6f 75 74 69 6e 65 20 64 6f 65  ne() routine doe
1f9e0 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61 73  s the first phas
1f9f0 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20  e and should.** 
1fa00 62 65 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f 72  be invoked prior
1fa10 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   to calling this
1fa20 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 73   routine.  The s
1fa30 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
1fa40 74 50 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20 72  tPhaseOne().** r
1fa50 6f 75 74 69 6e 65 20 64 69 64 20 61 6c 6c 20 74  outine did all t
1fa60 68 65 20 77 6f 72 6b 20 6f 66 20 77 72 69 74 69  he work of writi
1fa70 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  ng information o
1fa80 75 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 66  ut to disk and f
1fa90 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63  lushing the.** c
1faa0 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68 61 74 20  ontents so that 
1fab0 74 68 65 79 20 61 72 65 20 77 72 69 74 74 65 6e  they are written
1fac0 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 70   onto the disk p
1fad0 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20 74 68 69  latter.  All thi
1fae0 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61 73  s.** routine has
1faf0 20 74 6f 20 64 6f 20 69 73 20 64 65 6c 65 74 65   to do is delete
1fb00 20 6f 72 20 74 72 75 6e 63 61 74 65 20 6f 72 20   or truncate or 
1fb10 7a 65 72 6f 20 74 68 65 20 68 65 61 64 65 72 20  zero the header 
1fb20 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65 20 72 6f  in the.** the ro
1fb30 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 28  llback journal (
1fb40 77 68 69 63 68 20 63 61 75 73 65 73 20 74 68 65  which causes the
1fb50 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20   transaction to 
1fb60 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20 64  commit) and.** d
1fb70 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a  rop locks..**.**
1fb80 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 6e   Normally, if an
1fb90 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
1fba0 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 6c 61  ile the pager la
1fbb0 79 65 72 20 69 73 20 61 74 74 65 6d 70 74 69 6e  yer is attemptin
1fbc0 67 20 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c 69 7a  g to .** finaliz
1fbd0 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  e the underlying
1fbe0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
1fbf0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
1fc00 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 61 6e  urns an error an
1fc10 64 0a 2a 2a 20 74 68 65 20 75 70 70 65 72 20 6c  d.** the upper l
1fc20 61 79 65 72 20 77 69 6c 6c 20 61 74 74 65 6d 70  ayer will attemp
1fc30 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 48 6f  t a rollback. Ho
1fc40 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 73 65  wever, if the se
1fc50 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a  cond argument.**
1fc60 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65   is non-zero the
1fc70 6e 20 74 68 69 73 20 62 2d 74 72 65 65 20 74 72  n this b-tree tr
1fc80 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 70 61 72  ansaction is par
1fc90 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c  t of a multi-fil
1fca0 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  e .** transactio
1fcb0 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  n. In this case,
1fcc0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1fcd0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
1fce0 6e 20 63 6f 6d 6d 69 74 74 65 64 20 0a 2a 2a 20  n committed .** 
1fcf0 28 62 79 20 64 65 6c 65 74 69 6e 67 20 61 20 6d  (by deleting a m
1fd00 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1fd10 6c 65 29 20 61 6e 64 20 74 68 65 20 63 61 6c 6c  le) and the call
1fd20 65 72 20 77 69 6c 6c 20 69 67 6e 6f 72 65 20 74  er will ignore t
1fd30 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
1fd40 73 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 20 53  s return code. S
1fd50 6f 2c 20 65 76 65 6e 20 69 66 20 61 6e 20 65 72  o, even if an er
1fd60 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 74 68  ror occurs in th
1fd70 65 20 70 61 67 65 72 20 6c 61 79 65 72 2c 0a 2a  e pager layer,.*
1fd80 2a 20 72 65 73 65 74 20 74 68 65 20 62 2d 74 72  * reset the b-tr
1fd90 65 65 20 6f 62 6a 65 63 74 73 20 69 6e 74 65 72  ee objects inter
1fda0 6e 61 6c 20 73 74 61 74 65 20 74 6f 20 69 6e 64  nal state to ind
1fdb0 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 77  icate that the w
1fdc0 72 69 74 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  rite.** transact
1fdd0 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63 6c 6f  ion has been clo
1fde0 73 65 64 2e 20 54 68 69 73 20 69 73 20 71 75 69  sed. This is qui
1fdf0 74 65 20 73 61 66 65 2c 20 61 73 20 74 68 65 20  te safe, as the 
1fe00 70 61 67 65 72 20 77 69 6c 6c 20 68 61 76 65 0a  pager will have.
1fe10 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 65 64 20  ** transitioned 
1fe20 74 6f 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  to the error sta
1fe30 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  te..**.** This w
1fe40 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20  ill release the 
1fe50 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  write lock on th
1fe60 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1fe70 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72    If there.** ar
1fe80 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73  e no active curs
1fe90 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c  ors, it also rel
1fea0 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c  eases the read l
1feb0 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ock..*/.int sqli
1fec0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
1fed0 61 73 65 54 77 6f 28 42 74 72 65 65 20 2a 70 2c  aseTwo(Btree *p,
1fee0 20 69 6e 74 20 62 43 6c 65 61 6e 75 70 29 7b 0a   int bCleanup){.
1fef0 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
1ff00 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 20  s==TRANS_NONE ) 
1ff10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1ff20 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1ff30 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65  Enter(p);.  btre
1ff40 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a  eIntegrity(p);..
1ff50 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64    /* If the hand
1ff60 6c 65 20 68 61 73 20 61 20 77 72 69 74 65 2d 74  le has a write-t
1ff70 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c  ransaction open,
1ff80 20 63 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72   commit the shar
1ff90 65 64 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20  ed-btrees .  ** 
1ffa0 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
1ffb0 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73  set the shared s
1ffc0 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45  tate to TRANS_RE
1ffd0 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  AD..  */.  if( p
1ffe0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1fff0 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e  _WRITE ){.    in
20000 74 20 72 63 3b 0a 20 20 20 20 42 74 53 68 61 72  t rc;.    BtShar
20010 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
20020 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
20030 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
20040 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
20050 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
20060 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30  ->nTransaction>0
20070 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
20080 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
20090 68 61 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61  haseTwo(pBt->pPa
200a0 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
200b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  !=SQLITE_OK && b
200c0 43 6c 65 61 6e 75 70 3d 3d 30 20 29 7b 0a 20 20  Cleanup==0 ){.  
200d0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
200e0 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
200f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
20100 0a 20 20 20 20 70 2d 3e 69 44 61 74 61 56 65 72  .    p->iDataVer
20110 73 69 6f 6e 2d 2d 3b 20 20 2f 2a 20 43 6f 6d 70  sion--;  /* Comp
20120 65 6e 73 61 74 65 20 66 6f 72 20 70 50 61 67 65  ensate for pPage
20130 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2b  r->iDataVersion+
20140 2b 3b 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 69  +; */.    pBt->i
20150 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
20160 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 62  RANS_READ;.    b
20170 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74  treeClearHasCont
20180 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20  ent(pBt);.  }.. 
20190 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63   btreeEndTransac
201a0 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74  tion(p);.  sqlit
201b0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
201c0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
201d0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f  _OK;.}../*.** Do
201e0 20 62 6f 74 68 20 70 68 61 73 65 73 20 6f 66 20   both phases of 
201f0 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74  a commit..*/.int
20200 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
20210 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  mit(Btree *p){. 
20220 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
20230 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
20240 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
20250 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
20260 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20  ne(p, 0);.  if( 
20270 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
20280 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
20290 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
202a0 65 54 77 6f 28 70 2c 20 30 29 3b 0a 20 20 7d 0a  eTwo(p, 0);.  }.
202b0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
202c0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
202d0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
202e0 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
202f0 74 68 65 20 73 74 61 74 65 20 74 6f 20 43 55 52  the state to CUR
20300 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20 74 68  SOR_FAULT and th
20310 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20  e error.** code 
20320 74 6f 20 65 72 72 43 6f 64 65 20 66 6f 72 20 65  to errCode for e
20330 76 65 72 79 20 63 75 72 73 6f 72 20 6f 6e 20 61  very cursor on a
20340 6e 79 20 42 74 53 68 61 72 65 64 20 74 68 61 74  ny BtShared that
20350 20 70 42 74 72 65 65 0a 2a 2a 20 72 65 66 65 72   pBtree.** refer
20360 65 6e 63 65 73 2e 20 20 4f 72 20 69 66 20 74 68  ences.  Or if th
20370 65 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c 61 67  e writeOnly flag
20380 20 69 73 20 73 65 74 20 74 6f 20 31 2c 20 74 68   is set to 1, th
20390 65 6e 20 6f 6e 6c 79 0a 2a 2a 20 74 72 69 70 20  en only.** trip 
203a0 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 6e  write cursors an
203b0 64 20 6c 65 61 76 65 20 72 65 61 64 20 63 75 72  d leave read cur
203c0 73 6f 72 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a  sors unchanged..
203d0 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75 72 73  **.** Every curs
203e0 6f 72 20 69 73 20 61 20 63 61 6e 64 69 64 61 74  or is a candidat
203f0 65 20 74 6f 20 62 65 20 74 72 69 70 70 65 64 2c  e to be tripped,
20400 20 69 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f   including curso
20410 72 73 0a 2a 2a 20 74 68 61 74 20 62 65 6c 6f 6e  rs.** that belon
20420 67 20 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62  g to other datab
20430 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
20440 74 68 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62  that happen to b
20450 65 0a 2a 2a 20 73 68 61 72 69 6e 67 20 74 68 65  e.** sharing the
20460 20 63 61 63 68 65 20 77 69 74 68 20 70 42 74 72   cache with pBtr
20470 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ee..**.** This r
20480 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c  outine gets call
20490 65 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61  ed when a rollba
204a0 63 6b 20 6f 63 63 75 72 73 2e 20 49 66 20 74 68  ck occurs. If th
204b0 65 20 77 72 69 74 65 4f 6e 6c 79 0a 2a 2a 20 66  e writeOnly.** f
204c0 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65  lag is true, the
204d0 6e 20 6f 6e 6c 79 20 77 72 69 74 65 2d 63 75 72  n only write-cur
204e0 73 6f 72 73 20 6e 65 65 64 20 62 65 20 74 72 69  sors need be tri
204f0 70 70 65 64 20 2d 20 72 65 61 64 2d 6f 6e 6c 79  pped - read-only
20500 0a 2a 2a 20 63 75 72 73 6f 72 73 20 73 61 76 65  .** cursors save
20510 20 74 68 65 69 72 20 63 75 72 72 65 6e 74 20 70   their current p
20520 6f 73 69 74 69 6f 6e 73 20 73 6f 20 74 68 61 74  ositions so that
20530 20 74 68 65 79 20 6d 61 79 20 63 6f 6e 74 69 6e   they may contin
20540 75 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  ue .** following
20550 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f   the rollback. O
20560 72 2c 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20  r, if writeOnly 
20570 69 73 20 66 61 6c 73 65 2c 20 61 6c 6c 20 63 75  is false, all cu
20580 72 73 6f 72 73 20 61 72 65 20 0a 2a 2a 20 74 72  rsors are .** tr
20590 69 70 70 65 64 2e 20 49 6e 20 67 65 6e 65 72 61  ipped. In genera
205a0 6c 2c 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20  l, writeOnly is 
205b0 66 61 6c 73 65 20 69 66 20 74 68 65 20 74 72 61  false if the tra
205c0 6e 73 61 63 74 69 6f 6e 20 62 65 69 6e 67 0a 2a  nsaction being.*
205d0 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6d 6f  * rolled back mo
205e0 64 69 66 69 65 64 20 74 68 65 20 64 61 74 61 62  dified the datab
205f0 61 73 65 20 73 63 68 65 6d 61 2e 20 49 6e 20 74  ase schema. In t
20600 68 69 73 20 63 61 73 65 20 62 2d 74 72 65 65 20  his case b-tree 
20610 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 73 20 6d 61  root.** pages ma
20620 79 20 62 65 20 6d 6f 76 65 64 20 6f 72 20 64 65  y be moved or de
20630 6c 65 74 65 64 20 66 72 6f 6d 20 74 68 65 20 64  leted from the d
20640 61 74 61 62 61 73 65 20 61 6c 74 6f 67 65 74 68  atabase altogeth
20650 65 72 2c 20 6d 61 6b 69 6e 67 0a 2a 2a 20 69 74  er, making.** it
20660 20 75 6e 73 61 66 65 20 66 6f 72 20 72 65 61 64   unsafe for read
20670 20 63 75 72 73 6f 72 73 20 74 6f 20 63 6f 6e 74   cursors to cont
20680 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  inue..**.** If t
20690 68 65 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c 61  he writeOnly fla
206a0 67 20 69 73 20 74 72 75 65 20 61 6e 64 20 61 6e  g is true and an
206b0 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
206c0 74 65 72 65 64 20 77 68 69 6c 65 20 0a 2a 2a 20  tered while .** 
206d0 73 61 76 69 6e 67 20 74 68 65 20 63 75 72 72 65  saving the curre
206e0 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 61  nt position of a
206f0 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f   read-only curso
20700 72 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73 2c 20  r, all cursors, 
20710 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c  .** including al
20720 6c 20 72 65 61 64 2d 63 75 72 73 6f 72 73 20 61  l read-cursors a
20730 72 65 20 74 72 69 70 70 65 64 2e 0a 2a 2a 0a 2a  re tripped..**.*
20740 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
20750 65 74 75 72 6e 65 64 20 69 66 20 73 75 63 63 65  eturned if succe
20760 73 73 66 75 6c 2c 20 6f 72 20 69 66 20 61 6e 20  ssful, or if an 
20770 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
20780 6c 65 0a 2a 2a 20 73 61 76 69 6e 67 20 61 20 63  le.** saving a c
20790 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2c 20  ursor position, 
207a0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
207b0 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  code..*/.int sql
207c0 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c  ite3BtreeTripAll
207d0 43 75 72 73 6f 72 73 28 42 74 72 65 65 20 2a 70  Cursors(Btree *p
207e0 42 74 72 65 65 2c 20 69 6e 74 20 65 72 72 43 6f  Btree, int errCo
207f0 64 65 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e 6c  de, int writeOnl
20800 79 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  y){.  BtCursor *
20810 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  p;.  int rc = SQ
20820 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
20830 72 74 28 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d  rt( (writeOnly==
20840 30 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79 3d 3d  0 || writeOnly==
20850 31 29 20 26 26 20 42 54 43 46 5f 57 72 69 74 65  1) && BTCF_Write
20860 46 6c 61 67 3d 3d 31 20 29 3b 0a 20 20 69 66 28  Flag==1 );.  if(
20870 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 73   pBtree ){.    s
20880 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
20890 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 66 6f  (pBtree);.    fo
208a0 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d  r(p=pBtree->pBt-
208b0 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
208c0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
208d0 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 66 28  int i;.      if(
208e0 20 77 72 69 74 65 4f 6e 6c 79 20 26 26 20 28 70   writeOnly && (p
208f0 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
20900 46 5f 57 72 69 74 65 46 6c 61 67 29 3d 3d 30 20  F_WriteFlag)==0 
20910 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
20920 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
20930 5f 56 41 4c 49 44 20 7c 7c 20 70 2d 3e 65 53 74  _VALID || p->eSt
20940 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50  ate==CURSOR_SKIP
20950 4e 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20  NEXT ){.        
20960 20 20 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f    rc = saveCurso
20970 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20  rPosition(p);.  
20980 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
20990 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
209a0 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 29 73           (void)s
209b0 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41  qlite3BtreeTripA
209c0 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 72 65 65  llCursors(pBtree
209d0 2c 20 72 63 2c 20 30 29 3b 0a 20 20 20 20 20 20  , rc, 0);.      
209e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
209f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
20a00 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
20a10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
20a20 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28  treeClearCursor(
20a30 70 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  p);.        p->e
20a40 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 46  State = CURSOR_F
20a50 41 55 4c 54 3b 0a 20 20 20 20 20 20 20 20 70 2d  AULT;.        p-
20a60 3e 73 6b 69 70 4e 65 78 74 20 3d 20 65 72 72 43  >skipNext = errC
20a70 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ode;.      }.   
20a80 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70     for(i=0; i<=p
20a90 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  ->iPage; i++){. 
20aa0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
20ab0 67 65 28 70 2d 3e 61 70 50 61 67 65 5b 69 5d 29  ge(p->apPage[i])
20ac0 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70 50  ;.        p->apP
20ad0 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  age[i] = 0;.    
20ae0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
20af0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
20b00 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72  pBtree);.  }.  r
20b10 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
20b20 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20  ** Rollback the 
20b30 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70  transaction in p
20b40 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49  rogress..**.** I
20b50 66 20 74 72 69 70 43 6f 64 65 20 69 73 20 6e 6f  f tripCode is no
20b60 74 20 53 51 4c 49 54 45 5f 4f 4b 20 74 68 65 6e  t SQLITE_OK then
20b70 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65   cursors will be
20b80 20 69 6e 76 61 6c 69 64 61 74 65 64 20 28 74 72   invalidated (tr
20b90 69 70 70 65 64 29 2e 0a 2a 2a 20 4f 6e 6c 79 20  ipped)..** Only 
20ba0 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 72  write cursors ar
20bb0 65 20 74 72 69 70 70 65 64 20 69 66 20 77 72 69  e tripped if wri
20bc0 74 65 4f 6e 6c 79 20 69 73 20 74 72 75 65 20 62  teOnly is true b
20bd0 75 74 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61  ut all cursors a
20be0 72 65 0a 2a 2a 20 74 72 69 70 70 65 64 20 69 66  re.** tripped if
20bf0 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61   writeOnly is fa
20c00 6c 73 65 2e 20 20 41 6e 79 20 61 74 74 65 6d 70  lse.  Any attemp
20c10 74 20 74 6f 20 75 73 65 0a 2a 2a 20 61 20 74 72  t to use.** a tr
20c20 69 70 70 65 64 20 63 75 72 73 6f 72 20 77 69 6c  ipped cursor wil
20c30 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 65  l result in an e
20c40 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rror..**.** This
20c50 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68   will release th
20c60 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
20c70 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
20c80 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  e.  If there.** 
20c90 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75  are no active cu
20ca0 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72  rsors, it also r
20cb0 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64  eleases the read
20cc0 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   lock..*/.int sq
20cd0 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
20ce0 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ck(Btree *p, int
20cf0 20 74 72 69 70 43 6f 64 65 2c 20 69 6e 74 20 77   tripCode, int w
20d00 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74  riteOnly){.  int
20d10 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
20d20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
20d30 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
20d40 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 77 72 69  ;..  assert( wri
20d50 74 65 4f 6e 6c 79 3d 3d 31 20 7c 7c 20 77 72 69  teOnly==1 || wri
20d60 74 65 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 61  teOnly==0 );.  a
20d70 73 73 65 72 74 28 20 74 72 69 70 43 6f 64 65 3d  ssert( tripCode=
20d80 3d 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f  =SQLITE_ABORT_RO
20d90 4c 4c 42 41 43 4b 20 7c 7c 20 74 72 69 70 43 6f  LLBACK || tripCo
20da0 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  de==SQLITE_OK );
20db0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
20dc0 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 74  nter(p);.  if( t
20dd0 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  ripCode==SQLITE_
20de0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 74  OK ){.    rc = t
20df0 72 69 70 43 6f 64 65 20 3d 20 73 61 76 65 41 6c  ripCode = saveAl
20e00 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c  lCursors(pBt, 0,
20e10 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
20e20 29 20 77 72 69 74 65 4f 6e 6c 79 20 3d 20 30 3b  ) writeOnly = 0;
20e30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
20e40 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
20e50 7d 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64 65  }.  if( tripCode
20e60 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 20   ){.    int rc2 
20e70 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72  = sqlite3BtreeTr
20e80 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20  ipAllCursors(p, 
20e90 74 72 69 70 43 6f 64 65 2c 20 77 72 69 74 65 4f  tripCode, writeO
20ea0 6e 6c 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74  nly);.    assert
20eb0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
20ec0 7c 7c 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d 30  || (writeOnly==0
20ed0 20 26 26 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f   && rc2==SQLITE_
20ee0 4f 4b 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72  OK) );.    if( r
20ef0 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  c2!=SQLITE_OK ) 
20f00 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 20 20  rc = rc2;.  }.  
20f10 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
20f20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  );..  if( p->inT
20f30 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
20f40 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32  E ){.    int rc2
20f50 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 54  ;..    assert( T
20f60 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d  RANS_WRITE==pBt-
20f70 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  >inTransaction )
20f80 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69  ;.    rc2 = sqli
20f90 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
20fa0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
20fb0 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49     if( rc2!=SQLI
20fc0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
20fd0 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a  c = rc2;.    }..
20fe0 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62      /* The rollb
20ff0 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73  ack may have des
21000 74 72 6f 79 65 64 20 74 68 65 20 70 50 61 67 65  troyed the pPage
21010 31 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20  1->aData value. 
21020 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20   So.    ** call 
21030 62 74 72 65 65 47 65 74 50 61 67 65 28 29 20 6f  btreeGetPage() o
21040 6e 20 70 61 67 65 20 31 20 61 67 61 69 6e 20 74  n page 1 again t
21050 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75  o make.    ** su
21060 72 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61  re pPage1->aData
21070 20 69 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c   is set correctl
21080 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 74  y. */.    if( bt
21090 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
210a0 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d  1, &pPage1, 0)==
210b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
210c0 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 67     int nPage = g
210d0 65 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29  et4byte(28+(u8*)
210e0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a  pPage1->aData);.
210f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
21100 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20  nPage==0 );.    
21110 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29    if( nPage==0 )
21120 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
21130 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
21140 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20  er, &nPage);.   
21150 20 20 20 74 65 73 74 63 61 73 65 28 20 70 42 74     testcase( pBt
21160 2d 3e 6e 50 61 67 65 21 3d 6e 50 61 67 65 20 29  ->nPage!=nPage )
21170 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61  ;.      pBt->nPa
21180 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20  ge = nPage;.    
21190 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
211a0 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  age1);.    }.   
211b0 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 56 61   assert( countVa
211c0 6c 69 64 43 75 72 73 6f 72 73 28 70 42 74 2c 20  lidCursors(pBt, 
211d0 31 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74  1)==0 );.    pBt
211e0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
211f0 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
21200 20 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43    btreeClearHasC
21210 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d  ontent(pBt);.  }
21220 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e  ..  btreeEndTran
21230 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71  saction(p);.  sq
21240 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
21250 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
21260 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20  .}../*.** Start 
21270 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74  a statement subt
21280 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20  ransaction. The 
21290 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  subtransaction c
212a0 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20  an be rolled.** 
212b0 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74  back independent
212c0 6c 79 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 74  ly of the main t
212d0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59 6f 75 20  ransaction. You 
212e0 6d 75 73 74 20 73 74 61 72 74 20 61 20 74 72 61  must start a tra
212f0 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 62 65 66  nsaction .** bef
21300 6f 72 65 20 73 74 61 72 74 69 6e 67 20 61 20 73  ore starting a s
21310 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  ubtransaction. T
21320 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  he subtransactio
21330 6e 20 69 73 20 65 6e 64 65 64 20 61 75 74 6f 6d  n is ended autom
21340 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 69 66 20  atically .** if 
21350 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63  the main transac
21360 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f 72 20  tion commits or 
21370 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  rolls back..**.*
21380 2a 20 53 74 61 74 65 6d 65 6e 74 20 73 75 62 74  * Statement subt
21390 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20  ransactions are 
213a0 75 73 65 64 20 61 72 6f 75 6e 64 20 69 6e 64 69  used around indi
213b0 76 69 64 75 61 6c 20 53 51 4c 20 73 74 61 74 65  vidual SQL state
213c0 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61 72  ments.** that ar
213d0 65 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68  e contained with
213e0 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d  in a BEGIN...COM
213f0 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61  MIT block.  If a
21400 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65   constraint.** e
21410 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68  rror occurs with
21420 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
21430 2c 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20  , the effect of 
21440 74 68 61 74 20 6f 6e 65 20 73 74 61 74 65 6d 65  that one stateme
21450 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c  nt.** can be rol
21460 6c 65 64 20 62 61 63 6b 20 77 69 74 68 6f 75 74  led back without
21470 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62   having to rollb
21480 61 63 6b 20 74 68 65 20 65 6e 74 69 72 65 20 74  ack the entire t
21490 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
214a0 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20 73 75  * A statement su
214b0 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  b-transaction is
214c0 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20   implemented as 
214d0 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76  an anonymous sav
214e0 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a 20 76  epoint. The.** v
214f0 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74  alue passed as t
21500 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65  he second parame
21510 74 65 72 20 69 73 20 74 68 65 20 74 6f 74 61 6c  ter is the total
21520 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70   number of savep
21530 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64  oints,.** includ
21540 69 6e 67 20 74 68 65 20 6e 65 77 20 61 6e 6f 6e  ing the new anon
21550 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2c  ymous savepoint,
21560 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 42 2d 54   open on the B-T
21570 72 65 65 2e 20 69 2e 65 2e 20 69 66 20 74 68 65  ree. i.e. if the
21580 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74  re.** are no act
21590 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61  ive savepoints a
215a0 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73 74 61 74  nd no other stat
215b0 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f  ement-transactio
215c0 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74 61  ns open,.** iSta
215d0 74 65 6d 65 6e 74 20 69 73 20 31 2e 20 54 68 69  tement is 1. Thi
215e0 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65  s anonymous save
215f0 70 6f 69 6e 74 20 63 61 6e 20 62 65 20 72 65 6c  point can be rel
21600 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  eased or rolled 
21610 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 74 68  back.** using th
21620 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61  e sqlite3BtreeSa
21630 76 65 70 6f 69 6e 74 28 29 20 66 75 6e 63 74 69  vepoint() functi
21640 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
21650 65 33 42 74 72 65 65 42 65 67 69 6e 53 74 6d 74  e3BtreeBeginStmt
21660 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69  (Btree *p, int i
21670 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20 20 69 6e  Statement){.  in
21680 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
21690 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
216a0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
216b0 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74  ter(p);.  assert
216c0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
216d0 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61  ANS_WRITE );.  a
216e0 73 73 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73  ssert( (pBt->bts
216f0 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44  Flags & BTS_READ
21700 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 20 20 61  _ONLY)==0 );.  a
21710 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e  ssert( iStatemen
21720 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  t>0 );.  assert(
21730 20 69 53 74 61 74 65 6d 65 6e 74 3e 70 2d 3e 64   iStatement>p->d
21740 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29 3b  b->nSavepoint );
21750 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
21760 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
21770 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
21780 2f 2a 20 41 74 20 74 68 65 20 70 61 67 65 72 20  /* At the pager 
21790 6c 65 76 65 6c 2c 20 61 20 73 74 61 74 65 6d 65  level, a stateme
217a0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
217b0 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20 77 69  s a savepoint wi
217c0 74 68 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78  th.  ** an index
217d0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 61 6c   greater than al
217e0 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 63 72 65  l savepoints cre
217f0 61 74 65 64 20 65 78 70 6c 69 63 69 74 6c 79 20  ated explicitly 
21800 75 73 69 6e 67 0a 20 20 2a 2a 20 53 51 4c 20 73  using.  ** SQL s
21810 74 61 74 65 6d 65 6e 74 73 2e 20 49 74 20 69 73  tatements. It is
21820 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f 70 65 6e   illegal to open
21830 2c 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c  , release or rol
21840 6c 62 61 63 6b 20 61 6e 79 0a 20 20 2a 2a 20 73  lback any.  ** s
21850 75 63 68 20 73 61 76 65 70 6f 69 6e 74 73 20 77  uch savepoints w
21860 68 69 6c 65 20 74 68 65 20 73 74 61 74 65 6d 65  hile the stateme
21870 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  nt transaction s
21880 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69  avepoint is acti
21890 76 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ve..  */.  rc = 
218a0 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
218b0 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70  Savepoint(pBt->p
218c0 50 61 67 65 72 2c 20 69 53 74 61 74 65 6d 65 6e  Pager, iStatemen
218d0 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  t);.  sqlite3Btr
218e0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
218f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
21900 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67  * The second arg
21910 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
21920 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20 61  nction, op, is a
21930 6c 77 61 79 73 20 53 41 56 45 50 4f 49 4e 54 5f  lways SAVEPOINT_
21940 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20 53  ROLLBACK.** or S
21950 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
21960 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
21970 65 69 74 68 65 72 20 72 65 6c 65 61 73 65 73 20  either releases 
21980 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68  or rolls back th
21990 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 69  e.** savepoint i
219a0 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61 72  dentified by par
219b0 61 6d 65 74 65 72 20 69 53 61 76 65 70 6f 69 6e  ameter iSavepoin
219c0 74 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  t, depending on 
219d0 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66  the value .** of
219e0 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61   op..**.** Norma
219f0 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e 74 20  lly, iSavepoint 
21a00 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
21a10 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f  or equal to zero
21a20 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 6f 70  . However, if op
21a30 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54   is.** SAVEPOINT
21a40 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20  _ROLLBACK, then 
21a50 69 53 61 76 65 70 6f 69 6e 74 20 6d 61 79 20 61  iSavepoint may a
21a60 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74 68  lso be -1. In th
21a70 69 73 20 63 61 73 65 20 74 68 65 20 0a 2a 2a 20  is case the .** 
21a80 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
21a90 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69  entire transacti
21aa0 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20 62 61  on are rolled ba
21ab0 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69 66 66  ck. This is diff
21ac0 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61 20  erent.** from a 
21ad0 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63 74 69  normal transacti
21ae0 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20  on rollback, as 
21af0 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72 65 6c  no locks are rel
21b00 65 61 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a  eased and the.**
21b10 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 65 6d   transaction rem
21b20 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e  ains open..*/.in
21b30 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61  t sqlite3BtreeSa
21b40 76 65 70 6f 69 6e 74 28 42 74 72 65 65 20 2a 70  vepoint(Btree *p
21b50 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53  , int op, int iS
21b60 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74  avepoint){.  int
21b70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
21b80 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 69  .  if( p && p->i
21b90 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
21ba0 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61  ITE ){.    BtSha
21bb0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
21bc0 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f  t;.    assert( o
21bd0 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  p==SAVEPOINT_REL
21be0 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45  EASE || op==SAVE
21bf0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29  POINT_ROLLBACK )
21c00 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 53  ;.    assert( iS
21c10 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28  avepoint>=0 || (
21c20 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20 26  iSavepoint==-1 &
21c30 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  & op==SAVEPOINT_
21c40 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20 20  ROLLBACK) );.   
21c50 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
21c60 65 72 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20  er(p);.    rc = 
21c70 73 71 6c 69 74 65 33 50 61 67 65 72 53 61 76 65  sqlite3PagerSave
21c80 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  point(pBt->pPage
21c90 72 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e  r, op, iSavepoin
21ca0 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  t);.    if( rc==
21cb0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21cc0 20 20 20 69 66 28 20 69 53 61 76 65 70 6f 69 6e     if( iSavepoin
21cd0 74 3c 30 20 26 26 20 28 70 42 74 2d 3e 62 74 73  t<0 && (pBt->bts
21ce0 46 6c 61 67 73 20 26 20 42 54 53 5f 49 4e 49 54  Flags & BTS_INIT
21cf0 49 41 4c 4c 59 5f 45 4d 50 54 59 29 21 3d 30 20  IALLY_EMPTY)!=0 
21d00 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  ){.        pBt->
21d10 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  nPage = 0;.     
21d20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 65   }.      rc = ne
21d30 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a  wDatabase(pBt);.
21d40 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
21d50 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 20 2b   = get4byte(28 +
21d60 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
21d70 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ata);..      /* 
21d80 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  The database siz
21d90 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e  e was written in
21da0 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 32 38  to the offset 28
21db0 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 0a 20   of the header. 
21dc0 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65       ** when the
21dd0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61   transaction sta
21de0 72 74 65 64 2c 20 73 6f 20 77 65 20 6b 6e 6f 77  rted, so we know
21df0 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 20   that the value 
21e00 61 74 20 6f 66 66 73 65 74 0a 20 20 20 20 20 20  at offset.      
21e10 2a 2a 20 32 38 20 69 73 20 6e 6f 6e 7a 65 72 6f  ** 28 is nonzero
21e20 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
21e30 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20  t( pBt->nPage>0 
21e40 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
21e50 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
21e60 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
21e70 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  rc;.}../*.** Cre
21e80 61 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72  ate a new cursor
21e90 20 66 6f 72 20 74 68 65 20 42 54 72 65 65 20 77   for the BTree w
21ea0 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20  hose root is on 
21eb0 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54 61 62  the page.** iTab
21ec0 6c 65 2e 20 49 66 20 61 20 72 65 61 64 2d 6f 6e  le. If a read-on
21ed0 6c 79 20 63 75 72 73 6f 72 20 69 73 20 72 65 71  ly cursor is req
21ee0 75 65 73 74 65 64 2c 20 69 74 20 69 73 20 61 73  uested, it is as
21ef0 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68  sumed that.** th
21f00 65 20 63 61 6c 6c 65 72 20 61 6c 72 65 61 64 79  e caller already
21f10 20 68 61 73 20 61 74 20 6c 65 61 73 74 20 61 20   has at least a 
21f20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61  read-only transa
21f30 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e  ction open.** on
21f40 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6c   the database al
21f50 72 65 61 64 79 2e 20 49 66 20 61 20 77 72 69 74  ready. If a writ
21f60 65 2d 63 75 72 73 6f 72 20 69 73 20 72 65 71 75  e-cursor is requ
21f70 65 73 74 65 64 2c 20 74 68 65 6e 0a 2a 2a 20 74  ested, then.** t
21f80 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61 73 73  he caller is ass
21f90 75 6d 65 64 20 74 6f 20 68 61 76 65 20 61 6e 20  umed to have an 
21fa0 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73  open write trans
21fb0 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  action..**.** If
21fc0 20 74 68 65 20 42 54 52 45 45 5f 57 52 43 53 52   the BTREE_WRCSR
21fd0 20 62 69 74 20 6f 66 20 77 72 46 6c 61 67 20 69   bit of wrFlag i
21fe0 73 20 63 6c 65 61 72 2c 20 74 68 65 6e 20 74 68  s clear, then th
21ff0 65 20 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c  e cursor can onl
22000 79 0a 2a 2a 20 62 65 20 75 73 65 64 20 66 6f 72  y.** be used for
22010 20 72 65 61 64 69 6e 67 2e 20 20 49 66 20 74 68   reading.  If th
22020 65 20 42 54 52 45 45 5f 57 52 43 53 52 20 62 69  e BTREE_WRCSR bi
22030 74 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74  t is set, then t
22040 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 63 61 6e  he cursor.** can
22050 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61   be used for rea
22060 64 69 6e 67 20 6f 72 20 66 6f 72 20 77 72 69 74  ding or for writ
22070 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63 6f 6e  ing if other con
22080 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72 69 74  ditions for writ
22090 69 6e 67 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20  ing.** are also 
220a0 6d 65 74 2e 20 20 54 68 65 73 65 20 61 72 65 20  met.  These are 
220b0 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74  the conditions t
220c0 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65 74 20  hat must be met 
220d0 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 66 6f 72 20  in order.** for 
220e0 77 72 69 74 69 6e 67 20 74 6f 20 62 65 20 61 6c  writing to be al
220f0 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20  lowed:.**.** 1: 
22100 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74   The cursor must
22110 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65   have been opene
22120 64 20 77 69 74 68 20 77 72 46 6c 61 67 20 63 6f  d with wrFlag co
22130 6e 74 61 69 6e 69 6e 67 20 42 54 52 45 45 5f 57  ntaining BTREE_W
22140 52 43 53 52 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f  RCSR.**.** 2:  O
22150 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
22160 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 73  nnections that s
22170 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 70 61  hare the same pa
22180 67 65 72 20 63 61 63 68 65 0a 2a 2a 20 20 20 20  ger cache.**    
22190 20 62 75 74 20 77 68 69 63 68 20 61 72 65 20 6e   but which are n
221a0 6f 74 20 69 6e 20 74 68 65 20 52 45 41 44 5f 55  ot in the READ_U
221b0 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74 61 74 65  NCOMMITTED state
221c0 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a   may not have.**
221d0 20 20 20 20 20 63 75 72 73 6f 72 73 20 6f 70 65       cursors ope
221e0 6e 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30  n with wrFlag==0
221f0 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62   on the same tab
22200 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a  le.  Otherwise.*
22210 2a 20 20 20 20 20 74 68 65 20 63 68 61 6e 67 65  *     the change
22220 73 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 77  s made by this w
22230 72 69 74 65 20 63 75 72 73 6f 72 20 77 6f 75 6c  rite cursor woul
22240 64 20 62 65 20 76 69 73 69 62 6c 65 20 74 6f 0a  d be visible to.
22250 2a 2a 20 20 20 20 20 74 68 65 20 72 65 61 64 20  **     the read 
22260 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20 6f  cursors in the o
22270 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
22280 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nnection..**.** 
22290 33 3a 20 20 54 68 65 20 64 61 74 61 62 61 73 65  3:  The database
222a0 20 6d 75 73 74 20 62 65 20 77 72 69 74 61 62 6c   must be writabl
222b0 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f  e (not on read-o
222c0 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a  nly media).**.**
222d0 20 34 3a 20 20 54 68 65 72 65 20 6d 75 73 74 20   4:  There must 
222e0 62 65 20 61 6e 20 61 63 74 69 76 65 20 74 72 61  be an active tra
222f0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
22300 54 68 65 20 42 54 52 45 45 5f 46 4f 52 44 45 4c  The BTREE_FORDEL
22310 45 54 45 20 62 69 74 20 6f 66 20 77 72 46 6c 61  ETE bit of wrFla
22320 67 20 6d 61 79 20 6f 70 74 69 6f 6e 61 6c 6c 79  g may optionally
22330 20 62 65 20 73 65 74 20 69 66 20 42 54 52 45 45   be set if BTREE
22340 5f 57 52 43 53 52 0a 2a 2a 20 69 73 20 73 65 74  _WRCSR.** is set
22350 2e 20 20 49 66 20 46 4f 52 44 45 4c 45 54 45 20  .  If FORDELETE 
22360 69 73 20 73 65 74 2c 20 74 68 61 74 20 69 73 20  is set, that is 
22370 61 20 68 69 6e 74 20 74 6f 20 74 68 65 20 69 6d  a hint to the im
22380 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61  plementation tha
22390 74 0a 2a 2a 20 74 68 69 73 20 63 75 72 73 6f 72  t.** this cursor
223a0 20 77 69 6c 6c 20 6f 6e 6c 79 20 62 65 20 75 73   will only be us
223b0 65 64 20 74 6f 20 73 65 65 6b 20 74 6f 20 61 6e  ed to seek to an
223c0 64 20 64 65 6c 65 74 65 20 65 6e 74 72 69 65 73  d delete entries
223d0 20 6f 66 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20   of an index.** 
223e0 61 73 20 70 61 72 74 20 6f 66 20 61 20 6c 61 72  as part of a lar
223f0 67 65 72 20 44 45 4c 45 54 45 20 73 74 61 74 65  ger DELETE state
22400 6d 65 6e 74 2e 20 20 54 68 65 20 46 4f 52 44 45  ment.  The FORDE
22410 4c 45 54 45 20 68 69 6e 74 20 69 73 20 6e 6f 74  LETE hint is not
22420 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 69 73   used by.** this
22430 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e   implementation.
22440 20 20 42 75 74 20 69 6e 20 61 20 68 79 70 6f 74    But in a hypot
22450 68 65 74 69 63 61 6c 20 61 6c 74 65 72 6e 61 74  hetical alternat
22460 69 76 65 20 73 74 6f 72 61 67 65 20 65 6e 67 69  ive storage engi
22470 6e 65 20 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20  ne .** in which 
22480 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 61 72  index entries ar
22490 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
224a0 64 65 6c 65 74 65 64 20 77 68 65 6e 20 63 6f 72  deleted when cor
224b0 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65  responding table
224c0 0a 2a 2a 20 72 6f 77 73 20 61 72 65 20 64 65 6c  .** rows are del
224d0 65 74 65 64 2c 20 74 68 65 20 46 4f 52 44 45 4c  eted, the FORDEL
224e0 45 54 45 20 66 6c 61 67 20 69 73 20 61 20 68 69  ETE flag is a hi
224f0 6e 74 20 74 68 61 74 20 61 6c 6c 20 53 45 45 4b  nt that all SEEK
22500 20 61 6e 64 20 44 45 4c 45 54 45 0a 2a 2a 20 6f   and DELETE.** o
22510 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20 74 68 69  perations on thi
22520 73 20 63 75 72 73 6f 72 20 63 61 6e 20 62 65 20  s cursor can be 
22530 6e 6f 2d 6f 70 73 20 61 6e 64 20 61 6c 6c 20 52  no-ops and all R
22540 45 41 44 20 6f 70 65 72 61 74 69 6f 6e 73 20 63  EAD operations c
22550 61 6e 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20  an .** return a 
22560 6e 75 6c 6c 20 72 6f 77 20 28 32 2d 62 79 74 65  null row (2-byte
22570 73 3a 20 30 78 30 31 20 30 78 30 30 29 2e 0a 2a  s: 0x01 0x00)..*
22580 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67  *.** No checking
22590 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65   is done to make
225a0 20 73 75 72 65 20 74 68 61 74 20 70 61 67 65 20   sure that page 
225b0 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73  iTable really is
225c0 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67   the.** root pag
225d0 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20  e of a b-tree.  
225e0 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68  If it is not, th
225f0 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  en the cursor ac
22600 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e  quired.** will n
22610 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c  ot work correctl
22620 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61  y..**.** It is a
22630 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
22640 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
22650 6f 72 5a 65 72 6f 28 29 20 68 61 73 20 62 65 65  orZero() has bee
22660 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20 70  n called.** on p
22670 43 75 72 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  Cur to initializ
22680 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 70 61  e the memory spa
22690 63 65 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f  ce prior to invo
226a0 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  king this routin
226b0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
226c0 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20   btreeCursor(.  
226d0 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20  Btree *p,       
226e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
22700 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ree */.  int iTa
22710 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ble,            
22720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22730 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
22740 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  table to open */
22750 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20  .  int wrFlag,  
22760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22770 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74            /* 1 t
22780 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d  o write. 0 read-
22790 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  only */.  struct
227a0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
227b0 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fo,             
227c0 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f   /* First arg to
227d0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
227e0 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73  tion */.  BtCurs
227f0 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20  or *pCur        
22800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22810 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e 65   /* Space for ne
22820 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20  w cursor */.){. 
22830 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
22840 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20   p->pBt;        
22850 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65          /* Share
22860 64 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65 20  d b-tree handle 
22870 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  */.  BtCursor *p
22880 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X;              
22890 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
228a0 6f 6f 70 69 6e 67 20 6f 76 65 72 20 6f 74 68 65  ooping over othe
228b0 72 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 2a 2f  r all cursors */
228c0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
228d0 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
228e0 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72  ex(p) );.  asser
228f0 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 0a 20 20  t( wrFlag==0 .  
22900 20 20 20 20 20 7c 7c 20 77 72 46 6c 61 67 3d 3d       || wrFlag==
22910 42 54 52 45 45 5f 57 52 43 53 52 20 0a 20 20 20  BTREE_WRCSR .   
22920 20 20 20 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 28      || wrFlag==(
22930 42 54 52 45 45 5f 57 52 43 53 52 7c 42 54 52 45  BTREE_WRCSR|BTRE
22940 45 5f 46 4f 52 44 45 4c 45 54 45 29 20 0a 20 20  E_FORDELETE) .  
22950 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  );..  /* The fol
22960 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73 74  lowing assert st
22970 61 74 65 6d 65 6e 74 73 20 76 65 72 69 66 79 20  atements verify 
22980 74 68 61 74 20 69 66 20 74 68 69 73 20 69 73 20  that if this is 
22990 61 20 73 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a  a sharable .  **
229a0 20 62 2d 74 72 65 65 20 64 61 74 61 62 61 73 65   b-tree database
229b0 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  , the connection
229c0 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20   is holding the 
229d0 72 65 71 75 69 72 65 64 20 74 61 62 6c 65 20 6c  required table l
229e0 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20  ocks, .  ** and 
229f0 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f  that no other co
22a00 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 6e 79  nnection has any
22a10 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 68 61   open cursor tha
22a20 74 20 63 6f 6e 66 6c 69 63 74 73 20 77 69 74 68  t conflicts with
22a30 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b   .  ** this lock
22a40 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
22a50 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61  hasSharedCacheTa
22a60 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c  bleLock(p, iTabl
22a70 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20  e, pKeyInfo!=0, 
22a80 28 77 72 46 6c 61 67 3f 32 3a 31 29 29 20 29 3b  (wrFlag?2:1)) );
22a90 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61  .  assert( wrFla
22aa0 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52 65 61 64  g==0 || !hasRead
22ab0 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69 54 61  Conflicts(p, iTa
22ac0 62 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 73  ble) );..  /* As
22ad0 73 65 72 74 20 74 68 61 74 20 74 68 65 20 63 61  sert that the ca
22ae0 6c 6c 65 72 20 68 61 73 20 6f 70 65 6e 65 64 20  ller has opened 
22af0 74 68 65 20 72 65 71 75 69 72 65 64 20 74 72 61  the required tra
22b00 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61  nsaction. */.  a
22b10 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e  ssert( p->inTran
22b20 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a  s>TRANS_NONE );.
22b30 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
22b40 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e  ==0 || p->inTran
22b50 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
22b60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
22b70 3e 70 50 61 67 65 31 20 26 26 20 70 42 74 2d 3e  >pPage1 && pBt->
22b80 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b  pPage1->aData );
22b90 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61  .  assert( wrFla
22ba0 67 3d 3d 30 20 7c 7c 20 28 70 42 74 2d 3e 62 74  g==0 || (pBt->bt
22bb0 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41  sFlags & BTS_REA
22bc0 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 0a 20  D_ONLY)==0 );.. 
22bd0 20 69 66 28 20 77 72 46 6c 61 67 20 29 7b 0a 20   if( wrFlag ){. 
22be0 20 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53     allocateTempS
22bf0 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 69  pace(pBt);.    i
22c00 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  f( pBt->pTmpSpac
22c10 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  e==0 ) return SQ
22c20 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
22c30 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61 62 6c  .  }.  if( iTabl
22c40 65 3d 3d 31 20 26 26 20 62 74 72 65 65 50 61 67  e==1 && btreePag
22c50 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30 20 29  ecount(pBt)==0 )
22c60 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 77 72  {.    assert( wr
22c70 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20 69  Flag==0 );.    i
22c80 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Table = 0;.  }..
22c90 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f    /* Now that no
22ca0 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20 63 61   other errors ca
22cb0 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20  n occur, finish 
22cc0 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42  filling in the B
22cd0 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72  tCursor.  ** var
22ce0 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e 6b 20  iables and link 
22cf0 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20  the cursor into 
22d00 74 68 65 20 42 74 53 68 61 72 65 64 20 6c 69 73  the BtShared lis
22d10 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70  t.  */.  pCur->p
22d20 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29  gnoRoot = (Pgno)
22d30 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72 2d 3e  iTable;.  pCur->
22d40 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 70 43  iPage = -1;.  pC
22d50 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70  ur->pKeyInfo = p
22d60 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d  KeyInfo;.  pCur-
22d70 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70  >pBtree = p;.  p
22d80 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a  Cur->pBt = pBt;.
22d90 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
22da0 20 3d 20 77 72 46 6c 61 67 20 3f 20 42 54 43 46   = wrFlag ? BTCF
22db0 5f 57 72 69 74 65 46 6c 61 67 20 3a 20 30 3b 0a  _WriteFlag : 0;.
22dc0 20 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72    pCur->curPager
22dd0 46 6c 61 67 73 20 3d 20 77 72 46 6c 61 67 20 3f  Flags = wrFlag ?
22de0 20 30 20 3a 20 50 41 47 45 52 5f 47 45 54 5f 52   0 : PAGER_GET_R
22df0 45 41 44 4f 4e 4c 59 3b 0a 20 20 2f 2a 20 49 66  EADONLY;.  /* If
22e00 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f   there are two o
22e10 72 20 6d 6f 72 65 20 63 75 72 73 6f 72 73 20 6f  r more cursors o
22e20 6e 20 74 68 65 20 73 61 6d 65 20 62 74 72 65 65  n the same btree
22e30 2c 20 74 68 65 6e 20 61 6c 6c 20 73 75 63 68 0a  , then all such.
22e40 20 20 2a 2a 20 63 75 72 73 6f 72 73 20 2a 6d 75    ** cursors *mu
22e50 73 74 2a 20 68 61 76 65 20 74 68 65 20 42 54 43  st* have the BTC
22e60 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67 20  F_Multiple flag 
22e70 73 65 74 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 58  set. */.  for(pX
22e80 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
22e90 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
22ea0 7b 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 70 67  {.    if( pX->pg
22eb0 6e 6f 52 6f 6f 74 3d 3d 28 50 67 6e 6f 29 69 54  noRoot==(Pgno)iT
22ec0 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 70 58  able ){.      pX
22ed0 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54  ->curFlags |= BT
22ee0 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 20  CF_Multiple;.   
22ef0 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
22f00 73 20 7c 3d 20 42 54 43 46 5f 4d 75 6c 74 69 70  s |= BTCF_Multip
22f10 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  le;.    }.  }.  
22f20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42  pCur->pNext = pB
22f30 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 70 42  t->pCursor;.  pB
22f40 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75  t->pCursor = pCu
22f50 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74  r;.  pCur->eStat
22f60 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
22f70 49 44 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ID;.  return SQL
22f80 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71  ITE_OK;.}.int sq
22f90 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
22fa0 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
22fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fd0 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
22fe0 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
22ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23010 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61   Root page of ta
23020 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ble to open */. 
23030 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20   int wrFlag,    
23040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23050 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23060 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65  1 to write. 0 re
23070 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72  ad-only */.  str
23080 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  uct KeyInfo *pKe
23090 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20  yInfo,          
230a0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
230b0 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72  t arg to xCompar
230c0 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  e() */.  BtCurso
230d0 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20  r *pCur         
230e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230f0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65       /* Write ne
23100 77 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f  w cursor here */
23110 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
23120 69 66 28 20 69 54 61 62 6c 65 3c 31 20 29 7b 0a  if( iTable<1 ){.
23130 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
23140 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
23150 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
23160 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
23170 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 43  .    rc = btreeC
23180 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c  ursor(p, iTable,
23190 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66   wrFlag, pKeyInf
231a0 6f 2c 20 70 43 75 72 29 3b 0a 20 20 20 20 73 71  o, pCur);.    sq
231b0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
231c0 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
231d0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
231e0 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  turn the size of
231f0 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65   a BtCursor obje
23200 63 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a  ct in bytes..**.
23210 2a 2a 20 54 68 69 73 20 69 6e 74 65 72 66 61 63  ** This interfac
23220 65 73 20 69 73 20 6e 65 65 64 65 64 20 73 6f 20  es is needed so 
23230 74 68 61 74 20 75 73 65 72 73 20 6f 66 20 63 75  that users of cu
23240 72 73 6f 72 73 20 63 61 6e 20 70 72 65 61 6c 6c  rsors can preall
23250 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66 69 63 69  ocate.** suffici
23260 65 6e 74 20 73 74 6f 72 61 67 65 20 74 6f 20 68  ent storage to h
23270 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e 20 20 54  old a cursor.  T
23280 68 65 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65  he BtCursor obje
23290 63 74 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20  ct is opaque.** 
232a0 74 6f 20 75 73 65 72 73 20 73 6f 20 74 68 65 79  to users so they
232b0 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73   cannot do the s
232c0 69 7a 65 6f 66 28 29 20 74 68 65 6d 73 65 6c 76  izeof() themselv
232d0 65 73 20 2d 20 74 68 65 79 20 6d 75 73 74 20 63  es - they must c
232e0 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  all.** this rout
232f0 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ine..*/.int sqli
23300 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 53 69  te3BtreeCursorSi
23310 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75  ze(void){.  retu
23320 72 6e 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  rn ROUND8(sizeof
23330 28 42 74 43 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a  (BtCursor));.}..
23340 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
23350 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 69 6c   memory that wil
23360 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69  l be converted i
23370 6e 74 6f 20 61 20 42 74 43 75 72 73 6f 72 20 6f  nto a BtCursor o
23380 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  bject..**.** The
23390 20 73 69 6d 70 6c 65 20 61 70 70 72 6f 61 63 68   simple approach
233a0 20 68 65 72 65 20 77 6f 75 6c 64 20 62 65 20 74   here would be t
233b0 6f 20 6d 65 6d 73 65 74 28 29 20 74 68 65 20 65  o memset() the e
233c0 6e 74 69 72 65 20 6f 62 6a 65 63 74 0a 2a 2a 20  ntire object.** 
233d0 74 6f 20 7a 65 72 6f 2e 20 20 42 75 74 20 69 74  to zero.  But it
233e0 20 74 75 72 6e 73 20 6f 75 74 20 74 68 61 74 20   turns out that 
233f0 74 68 65 20 61 70 50 61 67 65 5b 5d 20 61 6e 64  the apPage[] and
23400 20 61 69 49 64 78 5b 5d 20 61 72 72 61 79 73 0a   aiIdx[] arrays.
23410 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74  ** do not need t
23420 6f 20 62 65 20 7a 65 72 6f 65 64 20 61 6e 64 20  o be zeroed and 
23430 74 68 65 79 20 61 72 65 20 6c 61 72 67 65 2c 20  they are large, 
23440 73 6f 20 77 65 20 63 61 6e 20 73 61 76 65 20 61  so we can save a
23450 20 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74   lot.** of run-t
23460 69 6d 65 20 62 79 20 73 6b 69 70 70 69 6e 67 20  ime by skipping 
23470 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
23480 6f 6e 20 6f 66 20 74 68 6f 73 65 20 65 6c 65 6d  on of those elem
23490 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ents..*/.void sq
234a0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
234b0 5a 65 72 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Zero(BtCursor *p
234c0 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30  ){.  memset(p, 0
234d0 2c 20 6f 66 66 73 65 74 6f 66 28 42 74 43 75 72  , offsetof(BtCur
234e0 73 6f 72 2c 20 69 50 61 67 65 29 29 3b 0a 7d 0a  sor, iPage));.}.
234f0 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63  ./*.** Close a c
23500 75 72 73 6f 72 2e 20 20 54 68 65 20 72 65 61 64  ursor.  The read
23510 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
23520 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 72 65  abase file is re
23530 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74  leased.** when t
23540 68 65 20 6c 61 73 74 20 63 75 72 73 6f 72 20 69  he last cursor i
23550 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74  s closed..*/.int
23560 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
23570 73 65 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f  seCursor(BtCurso
23580 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74 72 65  r *pCur){.  Btre
23590 65 20 2a 70 42 74 72 65 65 20 3d 20 70 43 75 72  e *pBtree = pCur
235a0 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69 66 28 20  ->pBtree;.  if( 
235b0 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 69 6e  pBtree ){.    in
235c0 74 20 69 3b 0a 20 20 20 20 42 74 53 68 61 72 65  t i;.    BtShare
235d0 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
235e0 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  Bt;.    sqlite3B
235f0 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65  treeEnter(pBtree
23600 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
23610 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
23620 43 75 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Cur);.    assert
23630 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 21 3d  ( pBt->pCursor!=
23640 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  0 );.    if( pBt
23650 2d 3e 70 43 75 72 73 6f 72 3d 3d 70 43 75 72 20  ->pCursor==pCur 
23660 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 43  ){.      pBt->pC
23670 75 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e  ursor = pCur->pN
23680 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ext;.    }else{.
23690 20 20 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a        BtCursor *
236a0 70 50 72 65 76 20 3d 20 70 42 74 2d 3e 70 43 75  pPrev = pBt->pCu
236b0 72 73 6f 72 3b 0a 20 20 20 20 20 20 64 6f 7b 0a  rsor;.      do{.
236c0 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65          if( pPre
236d0 76 2d 3e 70 4e 65 78 74 3d 3d 70 43 75 72 20 29  v->pNext==pCur )
236e0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 72 65  {.          pPre
236f0 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d  v->pNext = pCur-
23700 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
23710 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
23720 20 7d 0a 20 20 20 20 20 20 20 20 70 50 72 65 76   }.        pPrev
23730 20 3d 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 3b   = pPrev->pNext;
23740 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 41  .      }while( A
23750 4c 57 41 59 53 28 70 50 72 65 76 29 20 29 3b 0a  LWAYS(pPrev) );.
23760 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
23770 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67  0; i<=pCur->iPag
23780 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
23790 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
237a0 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20  >apPage[i]);.   
237b0 20 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72   }.    unlockBtr
237c0 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
237d0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
237e0 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  e(pCur->aOverflo
237f0 77 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74  w);.    /* sqlit
23800 65 33 5f 66 72 65 65 28 70 43 75 72 29 3b 20 2a  e3_free(pCur); *
23810 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  /.    sqlite3Btr
23820 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b  eeLeave(pBtree);
23830 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
23840 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
23850 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
23860 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20  BtCursor* given 
23870 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  in the argument 
23880 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42  has a valid.** B
23890 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72  tCursor.info str
238a0 75 63 74 75 72 65 2e 20 20 49 66 20 69 74 20 69  ucture.  If it i
238b0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61  s not already va
238c0 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72  lid, call.** btr
238d0 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f  eeParseCell() to
238e0 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a   fill it in..**.
238f0 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f  ** BtCursor.info
23900 20 69 73 20 61 20 63 61 63 68 65 20 6f 66 20 74   is a cache of t
23910 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  he information i
23920 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 65  n the current ce
23930 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69  ll..** Using thi
23940 73 20 63 61 63 68 65 20 72 65 64 75 63 65 73 20  s cache reduces 
23950 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61  the number of ca
23960 6c 6c 73 20 74 6f 20 62 74 72 65 65 50 61 72 73  lls to btreePars
23970 65 43 65 6c 6c 28 29 2e 0a 2a 2f 0a 23 69 66 6e  eCell()..*/.#ifn
23980 64 65 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61  def NDEBUG.  sta
23990 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 43  tic void assertC
239a0 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72  ellInfo(BtCursor
239b0 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c   *pCur){.    Cel
239c0 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
239d0 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72  int iPage = pCur
239e0 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d  ->iPage;.    mem
239f0 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69  set(&info, 0, si
23a00 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20  zeof(info));.   
23a10 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
23a20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61  pCur->apPage[iPa
23a30 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64 78  ge], pCur->aiIdx
23a40 5b 69 50 61 67 65 5d 2c 20 26 69 6e 66 6f 29 3b  [iPage], &info);
23a50 0a 20 20 20 20 61 73 73 65 72 74 28 20 43 4f 52  .    assert( COR
23a60 52 55 50 54 5f 44 42 20 7c 7c 20 6d 65 6d 63 6d  RUPT_DB || memcm
23a70 70 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e  p(&info, &pCur->
23a80 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66  info, sizeof(inf
23a90 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65  o))==0 );.  }.#e
23aa0 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73  lse.  #define as
23ab0 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a  sertCellInfo(x).
23ac0 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 53 51  #endif.static SQ
23ad0 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f  LITE_NOINLINE vo
23ae0 69 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42  id getCellInfo(B
23af0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
23b00 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
23b10 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20  .nSize==0 ){.   
23b20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75   int iPage = pCu
23b30 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 70 43  r->iPage;.    pC
23b40 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20  ur->curFlags |= 
23b50 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a  BTCF_ValidNKey;.
23b60 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
23b70 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ll(pCur->apPage[
23b80 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49  iPage],pCur->aiI
23b90 64 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d  dx[iPage],&pCur-
23ba0 3e 69 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  >info);.  }else{
23bb0 0a 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49  .    assertCellI
23bc0 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d  nfo(pCur);.  }.}
23bd0 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
23be0 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 72 6f    /* The next ro
23bf0 75 74 69 6e 65 20 75 73 65 64 20 6f 6e 6c 79 20  utine used only 
23c00 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20  within assert() 
23c10 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a  statements */./*
23c20 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
23c30 69 66 20 74 68 65 20 67 69 76 65 6e 20 42 74 43  if the given BtC
23c40 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20  ursor is valid. 
23c50 20 41 20 76 61 6c 69 64 20 63 75 72 73 6f 72 20   A valid cursor 
23c60 69 73 20 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 69  is one.** that i
23c70 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
23c80 74 69 6e 67 20 74 6f 20 61 20 72 6f 77 20 69 6e  ting to a row in
23c90 20 61 20 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74   a (non-empty) t
23ca0 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73  able..** This is
23cb0 20 61 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20   a verification 
23cc0 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
23cd0 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65  only within asse
23ce0 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e  rt() statements.
23cf0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
23d00 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69  treeCursorIsVali
23d10 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
23d20 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72  ){.  return pCur
23d30 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
23d40 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  ==CURSOR_VALID;.
23d50 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42  }.#endif /* NDEB
23d60 55 47 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  UG */.int sqlite
23d70 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61  3BtreeCursorIsVa
23d80 6c 69 64 4e 4e 28 42 74 43 75 72 73 6f 72 20 2a  lidNN(BtCursor *
23d90 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
23da0 20 70 43 75 72 21 3d 30 20 29 3b 0a 20 20 72 65   pCur!=0 );.  re
23db0 74 75 72 6e 20 70 43 75 72 2d 3e 65 53 74 61 74  turn pCur->eStat
23dc0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b  e==CURSOR_VALID;
23dd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
23de0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
23df0 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 6f 72  e integer key or
23e00 20 22 72 6f 77 69 64 22 20 66 6f 72 20 61 20 74   "rowid" for a t
23e10 61 62 6c 65 20 62 74 72 65 65 2e 0a 2a 2a 20 54  able btree..** T
23e20 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f  his routine is o
23e30 6e 6c 79 20 76 61 6c 69 64 20 66 6f 72 20 61 20  nly valid for a 
23e40 63 75 72 73 6f 72 20 74 68 61 74 20 69 73 20 70  cursor that is p
23e50 6f 69 6e 74 69 6e 67 20 69 6e 74 6f 20 61 0a 2a  ointing into a.*
23e60 2a 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65  * ordinary table
23e70 20 62 74 72 65 65 2e 20 20 49 66 20 74 68 65 20   btree.  If the 
23e80 63 75 72 73 6f 72 20 70 6f 69 6e 74 73 20 74 6f  cursor points to
23e90 20 61 6e 20 69 6e 64 65 78 20 62 74 72 65 65 20   an index btree 
23ea0 6f 72 0a 2a 2a 20 69 73 20 69 6e 76 61 6c 69 64  or.** is invalid
23eb0 2c 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  , the result of 
23ec0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
23ed0 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 36  undefined..*/.i6
23ee0 34 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  4 sqlite3BtreeIn
23ef0 74 65 67 65 72 4b 65 79 28 42 74 43 75 72 73 6f  tegerKey(BtCurso
23f00 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
23f10 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
23f20 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
23f30 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
23f40 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
23f50 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
23f60 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20  pCur->curIntKey 
23f70 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f  );.  getCellInfo
23f80 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e  (pCur);.  return
23f90 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
23fa0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
23fb0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
23fc0 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64  bytes of payload
23fd0 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74   for the entry t
23fe0 68 61 74 20 70 43 75 72 20 69 73 0a 2a 2a 20 63  hat pCur is.** c
23ff0 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
24000 67 20 74 6f 2e 20 20 46 6f 72 20 74 61 62 6c 65  g to.  For table
24010 20 62 74 72 65 65 73 2c 20 74 68 69 73 20 77 69   btrees, this wi
24020 6c 6c 20 62 65 20 74 68 65 20 61 6d 6f 75 6e 74  ll be the amount
24030 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20 20 46 6f  .** of data.  Fo
24040 72 20 69 6e 64 65 78 20 62 74 72 65 65 73 2c 20  r index btrees, 
24050 74 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65  this will be the
24060 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6b 65 79   size of the key
24070 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
24080 65 72 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65  er must guarante
24090 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  e that the curso
240a0 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
240b0 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76   a non-NULL.** v
240c0 61 6c 69 64 20 65 6e 74 72 79 2e 20 20 49 6e 20  alid entry.  In 
240d0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65  other words, the
240e0 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75   calling procedu
240f0 72 65 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65  re must guarante
24100 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 75  e.** that the cu
24110 72 73 6f 72 20 68 61 73 20 43 75 72 73 6f 72 2e  rsor has Cursor.
24120 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
24130 41 4c 49 44 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c  ALID..*/.u32 sql
24140 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64  ite3BtreePayload
24150 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70  Size(BtCursor *p
24160 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Cur){.  assert( 
24170 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
24180 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
24190 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
241a0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
241b0 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ;.  getCellInfo(
241c0 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCur);.  return 
241d0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c  pCur->info.nPayl
241e0 6f 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  oad;.}../*.** Gi
241f0 76 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d  ven the page num
24200 62 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c  ber of an overfl
24210 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ow page in the d
24220 61 74 61 62 61 73 65 20 28 70 61 72 61 6d 65 74  atabase (paramet
24230 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69  er.** ovfl), thi
24240 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73  s function finds
24250 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
24260 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67   of the next pag
24270 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e  e in the .** lin
24280 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65 72  ked list of over
24290 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20 70  flow pages. If p
242a0 6f 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65 73  ossible, it uses
242b0 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d   the auto-vacuum
242c0 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  .** pointer-map 
242d0 64 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66 20  data instead of 
242e0 72 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e 74  reading the cont
242f0 65 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66 6c  ent of page ovfl
24300 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a   to do so. .**.*
24310 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
24320 63 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20 65  curs an SQLite e
24330 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
24340 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
24350 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  :.**.** The page
24360 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
24370 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ext overflow pag
24380 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20  e in the linked 
24390 6c 69 73 74 20 69 73 20 0a 2a 2a 20 77 72 69 74  list is .** writ
243a0 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78  ten to *pPgnoNex
243b0 74 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c 20  t. If page ovfl 
243c0 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  is the last page
243d0 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20 0a   in its linked .
243e0 2a 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e  ** list, *pPgnoN
243f0 65 78 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  ext is set to ze
24400 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70  ro. .**.** If pp
24410 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Page is not NULL
24420 2c 20 61 6e 64 20 61 20 72 65 66 65 72 65 6e 63  , and a referenc
24430 65 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65  e to the MemPage
24440 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f   object correspo
24450 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67 65  nding.** to page
24460 20 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20 77 61   number pOvfl wa
24470 73 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 6e  s obtained, then
24480 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
24490 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74  to point to that
244a0 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e 20 49  .** reference. I
244b0 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
244c0 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
244d0 61 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72 65  aller to call re
244e0 6c 65 61 73 65 50 61 67 65 28 29 0a 2a 2a 20 6f  leasePage().** o
244f0 6e 20 2a 70 70 50 61 67 65 20 74 6f 20 66 72 65  n *ppPage to fre
24500 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 2e  e the reference.
24510 20 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63 65   In no reference
24520 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 28 62   was obtained (b
24530 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 70 6f  ecause.** the po
24540 69 6e 74 65 72 2d 6d 61 70 20 77 61 73 20 75 73  inter-map was us
24550 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  ed to obtain the
24560 20 76 61 6c 75 65 20 66 6f 72 20 2a 70 50 67 6e   value for *pPgn
24570 6f 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a 20  oNext), then.** 
24580 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
24590 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  o zero..*/.stati
245a0 63 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f  c int getOverflo
245b0 77 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  wPage(.  BtShare
245c0 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
245d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
245e0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
245f0 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20  Pgno ovfl,      
24600 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24610 43 75 72 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77  Current overflow
24620 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
24630 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
24640 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ge,            /
24650 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20 68  * OUT: MemPage h
24660 61 6e 64 6c 65 20 28 6d 61 79 20 62 65 20 4e 55  andle (may be NU
24670 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70  LL) */.  Pgno *p
24680 50 67 6e 6f 4e 65 78 74 20 20 20 20 20 20 20 20  PgnoNext        
24690 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65        /* OUT: Ne
246a0 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  xt overflow page
246b0 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20   number */.){.  
246c0 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20  Pgno next = 0;. 
246d0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
246e0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  = 0;.  int rc = 
246f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
24700 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
24710 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
24720 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
24730 28 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69  (pPgnoNext);..#i
24740 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
24750 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f  T_AUTOVACUUM.  /
24760 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 74 68  * Try to find th
24770 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
24780 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74  he overflow list
24790 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20   using the.  ** 
247a0 61 75 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74  autovacuum point
247b0 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 20 47 75  er-map pages. Gu
247c0 65 73 73 20 74 68 61 74 20 74 68 65 20 6e 65 78  ess that the nex
247d0 74 20 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20  t page in .  ** 
247e0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73  the overflow lis
247f0 74 20 69 73 20 70 61 67 65 20 6e 75 6d 62 65 72  t is page number
24800 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74 68   (ovfl+1). If th
24810 61 74 20 67 75 65 73 73 20 74 75 72 6e 73 20 0a  at guess turns .
24820 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 77    ** out to be w
24830 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20  rong, fall back 
24840 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64  to loading the d
24850 61 74 61 20 6f 66 20 70 61 67 65 20 0a 20 20 2a  ata of page .  *
24860 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f  * number ovfl to
24870 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e   determine the n
24880 65 78 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  ext page number.
24890 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
248a0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
248b0 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20     Pgno pgno;.  
248c0 20 20 50 67 6e 6f 20 69 47 75 65 73 73 20 3d 20    Pgno iGuess = 
248d0 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65  ovfl+1;.    u8 e
248e0 54 79 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65  Type;..    while
248f0 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
24900 70 42 74 2c 20 69 47 75 65 73 73 29 20 7c 7c 20  pBt, iGuess) || 
24910 69 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f  iGuess==PENDING_
24920 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
24930 7b 0a 20 20 20 20 20 20 69 47 75 65 73 73 2b 2b  {.      iGuess++
24940 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
24950 20 69 47 75 65 73 73 3c 3d 62 74 72 65 65 50 61   iGuess<=btreePa
24960 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a  gecount(pBt) ){.
24970 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
24980 70 47 65 74 28 70 42 74 2c 20 69 47 75 65 73 73  pGet(pBt, iGuess
24990 2c 20 26 65 54 79 70 65 2c 20 26 70 67 6e 6f 29  , &eType, &pgno)
249a0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
249b0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 54 79  SQLITE_OK && eTy
249c0 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
249d0 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76  LOW2 && pgno==ov
249e0 66 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65  fl ){.        ne
249f0 78 74 20 3d 20 69 47 75 65 73 73 3b 0a 20 20 20  xt = iGuess;.   
24a00 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
24a10 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20  _DONE;.      }. 
24a20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
24a30 0a 20 20 61 73 73 65 72 74 28 20 6e 65 78 74 3d  .  assert( next=
24a40 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
24a50 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72  _DONE );.  if( r
24a60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
24a70 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
24a80 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c  tPage(pBt, ovfl,
24a90 20 26 70 50 61 67 65 2c 20 28 70 70 50 61 67 65   &pPage, (ppPage
24aa0 3d 3d 30 29 20 3f 20 50 41 47 45 52 5f 47 45 54  ==0) ? PAGER_GET
24ab0 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a  _READONLY : 0);.
24ac0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
24ad0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61  SQLITE_OK || pPa
24ae0 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ge==0 );.    if(
24af0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
24b00 7b 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67  {.      next = g
24b10 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  et4byte(pPage->a
24b20 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Data);.    }.  }
24b30 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d  ..  *pPgnoNext =
24b40 20 6e 65 78 74 3b 0a 20 20 69 66 28 20 70 70 50   next;.  if( ppP
24b50 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 70 50 61  age ){.    *ppPa
24b60 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65  ge = pPage;.  }e
24b70 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  lse{.    release
24b80 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d  Page(pPage);.  }
24b90 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53  .  return (rc==S
24ba0 51 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c  QLITE_DONE ? SQL
24bb0 49 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a  ITE_OK : rc);.}.
24bc0 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61  ./*.** Copy data
24bd0 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 74   from a buffer t
24be0 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66 72 6f  o a page, or fro
24bf0 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20 62 75  m a page to a bu
24c00 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79  ffer..**.** pPay
24c10 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e 74 65  load is a pointe
24c20 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72 65 64  r to data stored
24c30 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70 61 67   on database pag
24c40 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66  e pDbPage..** If
24c50 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20 69 73   argument eOp is
24c60 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79   false, then nBy
24c70 74 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  te bytes of data
24c80 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66   are copied.** f
24c90 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f 20  rom pPayload to 
24ca0 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74  the buffer point
24cb0 65 64 20 61 74 20 62 79 20 70 42 75 66 2e 20 49  ed at by pBuf. I
24cc0 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a  f eOp is true,.*
24cd0 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33 50 61  * then sqlite3Pa
24ce0 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61  gerWrite() is ca
24cf0 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67 65 20  lled on pDbPage 
24d00 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65 73 0a  and nByte bytes.
24d10 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65 20 63  ** of data are c
24d20 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65 20 62  opied from the b
24d30 75 66 66 65 72 20 70 42 75 66 20 74 6f 20 70 50  uffer pBuf to pP
24d40 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51  ayload..**.** SQ
24d50 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
24d60 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  ned on success, 
24d70 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72 72  otherwise an err
24d80 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
24d90 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f  ic int copyPaylo
24da0 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50 61 79  ad(.  void *pPay
24db0 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20 20 20  load,           
24dc0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61  /* Pointer to pa
24dd0 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69  ge data */.  voi
24de0 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  d *pBuf,        
24df0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
24e00 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20  r to buffer */. 
24e10 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20   int nByte,     
24e20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
24e30 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
24e40 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65   copy */.  int e
24e50 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Op,             
24e60 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70       /* 0 -> cop
24e70 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d  y from page, 1 -
24e80 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65 20 2a  > copy to page *
24e90 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  /.  DbPage *pDbP
24ea0 61 67 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a  age           /*
24eb0 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
24ec0 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a   pPayload */.){.
24ed0 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20 20 20    if( eOp ){.   
24ee0 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72   /* Copy data fr
24ef0 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70 61 67  om buffer to pag
24f00 65 20 28 61 20 77 72 69 74 65 20 6f 70 65 72 61  e (a write opera
24f10 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74  tion) */.    int
24f20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
24f30 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29  erWrite(pDbPage)
24f40 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
24f50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
24f60 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
24f70 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61  }.    memcpy(pPa
24f80 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42 79  yload, pBuf, nBy
24f90 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  te);.  }else{.  
24fa0 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66    /* Copy data f
24fb0 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75 66 66  rom page to buff
24fc0 65 72 20 28 61 20 72 65 61 64 20 6f 70 65 72 61  er (a read opera
24fd0 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d  tion) */.    mem
24fe0 63 70 79 28 70 42 75 66 2c 20 70 50 61 79 6c 6f  cpy(pBuf, pPaylo
24ff0 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a  ad, nByte);.  }.
25000 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
25010 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
25020 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
25030 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20 6f 76  ed to read or ov
25040 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61 64 20  erwrite payload 
25050 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66  information.** f
25060 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  or the entry tha
25070 74 20 74 68 65 20 70 43 75 72 20 63 75 72 73 6f  t the pCur curso
25080 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
25090 2e 20 54 68 65 20 65 4f 70 0a 2a 2a 20 61 72 67  . The eOp.** arg
250a0 75 6d 65 6e 74 20 69 73 20 69 6e 74 65 72 70 72  ument is interpr
250b0 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  eted as follows:
250c0 0a 2a 2a 0a 2a 2a 20 20 20 30 3a 20 54 68 65 20  .**.**   0: The 
250d0 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 72  operation is a r
250e0 65 61 64 2e 20 50 6f 70 75 6c 61 74 65 20 74 68  ead. Populate th
250f0 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65  e overflow cache
25100 2e 0a 2a 2a 20 20 20 31 3a 20 54 68 65 20 6f 70  ..**   1: The op
25110 65 72 61 74 69 6f 6e 20 69 73 20 61 20 77 72 69  eration is a wri
25120 74 65 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65  te. Populate the
25130 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e   overflow cache.
25140 0a 2a 2a 20 20 20 32 3a 20 54 68 65 20 6f 70 65  .**   2: The ope
25150 72 61 74 69 6f 6e 20 69 73 20 61 20 72 65 61 64  ration is a read
25160 2e 20 44 6f 20 6e 6f 74 20 70 6f 70 75 6c 61 74  . Do not populat
25170 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
25180 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f  ache..**.** A to
25190 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79 74  tal of "amt" byt
251a0 65 73 20 61 72 65 20 72 65 61 64 20 6f 72 20 77  es are read or w
251b0 72 69 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67  ritten beginning
251c0 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a   at "offset"..**
251d0 20 44 61 74 61 20 69 73 20 72 65 61 64 20 74 6f   Data is read to
251e0 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 62 75 66   or from the buf
251f0 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20  fer pBuf..**.** 
25200 54 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e  The content bein
25210 67 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  g read or writte
25220 6e 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 6f  n might appear o
25230 6e 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65 0a  n the main page.
25240 2a 2a 20 6f 72 20 62 65 20 73 63 61 74 74 65 72  ** or be scatter
25250 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70  ed out on multip
25260 6c 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  le overflow page
25270 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
25280 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 65  current cursor e
25290 6e 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72  ntry uses one or
252a0 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70   more overflow p
252b0 61 67 65 73 20 61 6e 64 20 74 68 65 0a 2a 2a 20  ages and the.** 
252c0 65 4f 70 20 61 72 67 75 6d 65 6e 74 20 69 73 20  eOp argument is 
252d0 6e 6f 74 20 32 2c 20 74 68 69 73 20 66 75 6e 63  not 2, this func
252e0 74 69 6f 6e 20 6d 61 79 20 61 6c 6c 6f 63 61 74  tion may allocat
252f0 65 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20  e space for and 
25300 6c 61 7a 69 6c 79 20 0a 2a 2a 20 70 6f 70 75 6c  lazily .** popul
25310 61 74 65 73 20 74 68 65 20 6f 76 65 72 66 6c 6f  ates the overflo
25320 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
25330 65 20 61 72 72 61 79 20 28 42 74 43 75 72 73 6f  e array (BtCurso
25340 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20 0a 2a  r.aOverflow). .*
25350 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c  * Subsequent cal
25360 6c 73 20 75 73 65 20 74 68 69 73 20 63 61 63 68  ls use this cach
25370 65 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e  e to make seekin
25380 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65  g to the supplie
25390 64 20 6f 66 66 73 65 74 20 0a 2a 2a 20 6d 6f 72  d offset .** mor
253a0 65 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a  e efficient..**.
253b0 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66  ** Once an overf
253c0 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
253d0 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c  che has been all
253e0 6f 63 61 74 65 64 2c 20 69 74 20 6d 61 79 20 62  ocated, it may b
253f0 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64  e.** invalidated
25400 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   if some other c
25410 75 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f 20  ursor writes to 
25420 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c 20  the same table, 
25430 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75 72  or if.** the cur
25440 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20  sor is moved to 
25450 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77 2e  a different row.
25460 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69   Additionally, i
25470 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a  n auto-vacuum.**
25480 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f   mode, the follo
25490 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79 20  wing events may 
254a0 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f 76  invalidate an ov
254b0 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
254c0 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20   cache..**.**   
254d0 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  * An incremental
254e0 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20   vacuum,.**   * 
254f0 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f  A commit in auto
25500 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d  _vacuum="full" m
25510 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61  ode,.**   * Crea
25520 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d 61  ting a table (ma
25530 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67  y require moving
25540 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
25550 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e)..*/.static in
25560 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  t accessPayload(
25570 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
25580 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  r,      /* Curso
25590 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e  r pointing to en
255a0 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  try to read from
255b0 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73 65 74   */.  u32 offset
255c0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65  ,          /* Be
255d0 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73  gin reading this
255e0 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61   far into payloa
255f0 64 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20  d */.  u32 amt, 
25600 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
25610 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79  ead this many by
25620 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  tes */.  unsigne
25630 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a  d char *pBuf, /*
25640 20 57 72 69 74 65 20 74 68 65 20 62 79 74 65 73   Write the bytes
25650 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65   into this buffe
25660 72 20 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20  r */ .  int eOp 
25670 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25680 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f  zero to read. no
25690 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e  n-zero to write.
256a0 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
256b0 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64  d char *aPayload
256c0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
256d0 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 49  ITE_OK;.  int iI
256e0 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  dx = 0;.  MemPag
256f0 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
25700 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
25710 61 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70  age]; /* Btree p
25720 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20 65  age of current e
25730 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61 72  ntry */.  BtShar
25740 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e  ed *pBt = pCur->
25750 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  pBt;            
25760 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 74        /* Btree t
25770 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e  his cursor belon
25780 67 73 20 74 6f 20 2a 2f 0a 23 69 66 64 65 66 20  gs to */.#ifdef 
25790 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56  SQLITE_DIRECT_OV
257a0 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 75 6e  ERFLOW_READ.  un
257b0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 20 63 6f  signed char * co
257c0 6e 73 74 20 70 42 75 66 53 74 61 72 74 20 3d 20  nst pBufStart = 
257d0 70 42 75 66 3b 0a 20 20 69 6e 74 20 62 45 6e 64  pBuf;.  int bEnd
257e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
257f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25800 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 61    /* True if rea
25810 64 69 6e 67 20 74 6f 20 65 6e 64 20 6f 66 20 64  ding to end of d
25820 61 74 61 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  ata */.#endif.. 
25830 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20 29   assert( pPage )
25840 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
25850 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
25860 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
25870 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
25880 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61  pCur->iPage]<pPa
25890 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61  ge->nCell );.  a
258a0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
258b0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
258c0 0a 20 20 61 73 73 65 72 74 28 20 65 4f 70 21 3d  .  assert( eOp!=
258d0 32 20 7c 7c 20 6f 66 66 73 65 74 3d 3d 30 20 29  2 || offset==0 )
258e0 3b 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 73  ;    /* Always s
258f0 74 61 72 74 20 66 72 6f 6d 20 62 65 67 69 6e 6e  tart from beginn
25900 69 6e 67 20 66 6f 72 20 65 4f 70 3d 3d 32 20 2a  ing for eOp==2 *
25910 2f 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f  /..  getCellInfo
25920 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f  (pCur);.  aPaylo
25930 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ad = pCur->info.
25940 70 50 61 79 6c 6f 61 64 3b 0a 23 69 66 64 65 66  pPayload;.#ifdef
25950 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f   SQLITE_DIRECT_O
25960 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 62  VERFLOW_READ.  b
25970 45 6e 64 20 3d 20 6f 66 66 73 65 74 2b 61 6d 74  End = offset+amt
25980 3d 3d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61  ==pCur->info.nPa
25990 79 6c 6f 61 64 3b 0a 23 65 6e 64 69 66 0a 20 20  yload;.#endif.  
259a0 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 2b 61  assert( offset+a
259b0 6d 74 20 3c 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  mt <= pCur->info
259c0 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 0a 20 20  .nPayload );..  
259d0 61 73 73 65 72 74 28 20 61 50 61 79 6c 6f 61 64  assert( aPayload
259e0 20 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20   > pPage->aData 
259f0 29 3b 0a 20 20 69 66 28 20 28 75 70 74 72 29 28  );.  if( (uptr)(
25a00 61 50 61 79 6c 6f 61 64 20 2d 20 70 50 61 67 65  aPayload - pPage
25a10 2d 3e 61 44 61 74 61 29 20 3e 20 28 70 42 74 2d  ->aData) > (pBt-
25a20 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 70 43  >usableSize - pC
25a30 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 29  ur->info.nLocal)
25a40 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e   ){.    /* Tryin
25a50 67 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69  g to read or wri
25a60 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  te past the end 
25a70 6f 66 20 74 68 65 20 64 61 74 61 20 69 73 20 61  of the data is a
25a80 6e 20 65 72 72 6f 72 2e 20 20 54 68 65 0a 20 20  n error.  The.  
25a90 20 20 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 61 6c    ** conditional
25aa0 20 61 62 6f 76 65 20 69 73 20 72 65 61 6c 6c 79   above is really
25ab0 3a 0a 20 20 20 20 2a 2a 20 20 20 20 26 61 50 61  :.    **    &aPa
25ac0 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f  yload[pCur->info
25ad0 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67  .nLocal] > &pPag
25ae0 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75 73  e->aData[pBt->us
25af0 61 62 6c 65 53 69 7a 65 5d 0a 20 20 20 20 2a 2a  ableSize].    **
25b00 20 62 75 74 20 69 73 20 72 65 63 61 73 74 20 69   but is recast i
25b10 6e 74 6f 20 69 74 73 20 63 75 72 72 65 6e 74 20  nto its current 
25b20 66 6f 72 6d 20 74 6f 20 61 76 6f 69 64 20 69 6e  form to avoid in
25b30 74 65 67 65 72 20 6f 76 65 72 66 6c 6f 77 20 70  teger overflow p
25b40 72 6f 62 6c 65 6d 73 0a 20 20 20 20 2a 2f 0a 20  roblems.    */. 
25b50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
25b60 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
25b70 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69   }..  /* Check i
25b80 66 20 64 61 74 61 20 6d 75 73 74 20 62 65 20 72  f data must be r
25b90 65 61 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66  ead/written to/f
25ba0 72 6f 6d 20 74 68 65 20 62 74 72 65 65 20 70 61  rom the btree pa
25bb0 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20  ge itself. */.  
25bc0 69 66 28 20 6f 66 66 73 65 74 3c 70 43 75 72 2d  if( offset<pCur-
25bd0 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a  >info.nLocal ){.
25be0 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b      int a = amt;
25bf0 0a 20 20 20 20 69 66 28 20 61 2b 6f 66 66 73 65  .    if( a+offse
25c00 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  t>pCur->info.nLo
25c10 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 61 20 3d  cal ){.      a =
25c20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
25c30 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20  al - offset;.   
25c40 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f 70 79   }.    rc = copy
25c50 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61  Payload(&aPayloa
25c60 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c  d[offset], pBuf,
25c70 20 61 2c 20 28 65 4f 70 20 26 20 30 78 30 31 29   a, (eOp & 0x01)
25c80 2c 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  , pPage->pDbPage
25c90 29 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20  );.    offset = 
25ca0 30 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d 20 61  0;.    pBuf += a
25cb0 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a  ;.    amt -= a;.
25cc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66    }else{.    off
25cd0 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66  set -= pCur->inf
25ce0 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 0a  o.nLocal;.  }...
25cf0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
25d00 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a  _OK && amt>0 ){.
25d10 20 20 20 20 63 6f 6e 73 74 20 75 33 32 20 6f 76      const u32 ov
25d20 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  flSize = pBt->us
25d30 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f  ableSize - 4;  /
25d40 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e 74 20  * Bytes content 
25d50 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f  per ovfl page */
25d60 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 50 61  .    Pgno nextPa
25d70 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61 67  ge;..    nextPag
25d80 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 50  e = get4byte(&aP
25d90 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66  ayload[pCur->inf
25da0 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 20 20 20  o.nLocal]);..   
25db0 20 2f 2a 20 49 66 20 74 68 65 20 42 74 43 75 72   /* If the BtCur
25dc0 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 20  sor.aOverflow[] 
25dd0 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c  has not been all
25de0 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65  ocated, allocate
25df0 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 2a 2a 20   it now..    ** 
25e00 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20 61  Except, do not a
25e10 6c 6c 6f 63 61 74 65 20 61 4f 76 65 72 66 6c 6f  llocate aOverflo
25e20 77 5b 5d 20 66 6f 72 20 65 4f 70 3d 3d 32 2e 0a  w[] for eOp==2..
25e30 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
25e40 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72  e aOverflow[] ar
25e50 72 61 79 20 69 73 20 73 69 7a 65 64 20 61 74 20  ray is sized at 
25e60 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65 61  one entry for ea
25e70 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ch overflow page
25e80 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f  .    ** in the o
25e90 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54  verflow chain. T
25ea0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
25eb0 66 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  f the first over
25ec0 66 6c 6f 77 20 70 61 67 65 20 69 73 0a 20 20 20  flow page is.   
25ed0 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 61 4f   ** stored in aO
25ee0 76 65 72 66 6c 6f 77 5b 30 5d 2c 20 65 74 63 2e  verflow[0], etc.
25ef0 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20 69 6e   A value of 0 in
25f00 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d   the aOverflow[]
25f10 20 61 72 72 61 79 0a 20 20 20 20 2a 2a 20 6d 65   array.    ** me
25f20 61 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f  ans "not yet kno
25f30 77 6e 22 20 28 74 68 65 20 63 61 63 68 65 20 69  wn" (the cache i
25f40 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74  s lazily populat
25f50 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ed)..    */.    
25f60 69 66 28 20 65 4f 70 21 3d 32 20 26 26 20 28 70  if( eOp!=2 && (p
25f70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
25f80 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d  BTCF_ValidOvfl)=
25f90 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
25fa0 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69  nOvfl = (pCur->i
25fb0 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75  nfo.nPayload-pCu
25fc0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f  r->info.nLocal+o
25fd0 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53  vflSize-1)/ovflS
25fe0 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  ize;.      if( n
25ff0 4f 76 66 6c 3e 70 43 75 72 2d 3e 6e 4f 76 66 6c  Ovfl>pCur->nOvfl
26000 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20  Alloc ){.       
26010 20 50 67 6e 6f 20 2a 61 4e 65 77 20 3d 20 28 50   Pgno *aNew = (P
26020 67 6e 6f 2a 29 73 71 6c 69 74 65 33 52 65 61 6c  gno*)sqlite3Real
26030 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 20 20 20  loc(.           
26040 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
26050 2c 20 6e 4f 76 66 6c 2a 32 2a 73 69 7a 65 6f 66  , nOvfl*2*sizeof
26060 28 50 67 6e 6f 29 0a 20 20 20 20 20 20 20 20 29  (Pgno).        )
26070 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 4e  ;.        if( aN
26080 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ew==0 ){.       
26090 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
260a0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
260b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
260c0 20 20 20 20 70 43 75 72 2d 3e 6e 4f 76 66 6c 41      pCur->nOvflA
260d0 6c 6c 6f 63 20 3d 20 6e 4f 76 66 6c 2a 32 3b 0a  lloc = nOvfl*2;.
260e0 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
260f0 61 4f 76 65 72 66 6c 6f 77 20 3d 20 61 4e 65 77  aOverflow = aNew
26100 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
26110 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
26120 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
26130 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 43         memset(pC
26140 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 30  ur->aOverflow, 0
26150 2c 20 6e 4f 76 66 6c 2a 73 69 7a 65 6f 66 28 50  , nOvfl*sizeof(P
26160 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 20 20 70  gno));.        p
26170 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d  Cur->curFlags |=
26180 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 3b   BTCF_ValidOvfl;
26190 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
261a0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76      /* If the ov
261b0 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
261c0 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20   cache has been 
261d0 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
261e0 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66  e.    ** entry f
261f0 6f 72 20 74 68 65 20 66 69 72 73 74 20 72 65 71  or the first req
26200 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20 70  uired overflow p
26210 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73 6b  age is valid, sk
26220 69 70 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74  ip.    ** direct
26230 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f  ly to it..    */
26240 0a 20 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e  .    if( (pCur->
26250 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
26260 56 61 6c 69 64 4f 76 66 6c 29 21 3d 30 0a 20 20  ValidOvfl)!=0.  
26270 20 20 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65     && pCur->aOve
26280 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66  rflow[offset/ovf
26290 6c 53 69 7a 65 5d 0a 20 20 20 20 29 7b 0a 20 20  lSize].    ){.  
262a0 20 20 20 20 69 49 64 78 20 3d 20 28 6f 66 66 73      iIdx = (offs
262b0 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20  et/ovflSize);.  
262c0 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70      nextPage = p
262d0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
262e0 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66 73  Idx];.      offs
262f0 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76 66  et = (offset%ovf
26300 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 0a 20  lSize);.    }.. 
26310 20 20 20 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51     for( ; rc==SQ
26320 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30  LITE_OK && amt>0
26330 20 26 26 20 6e 65 78 74 50 61 67 65 3b 20 69 49   && nextPage; iI
26340 64 78 2b 2b 29 7b 0a 0a 20 20 20 20 20 20 2f 2a  dx++){..      /*
26350 20 49 66 20 72 65 71 75 69 72 65 64 2c 20 70 6f   If required, po
26360 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66  pulate the overf
26370 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
26380 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  che. */.      if
26390 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
263a0 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76  s & BTCF_ValidOv
263b0 66 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  fl)!=0 ){.      
263c0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
263d0 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d  aOverflow[iIdx]=
263e0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
263f0 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65     || pCur->aOve
26400 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78  rflow[iIdx]==nex
26410 74 50 61 67 65 0a 20 20 20 20 20 20 20 20 20 20  tPage.          
26420 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54        || CORRUPT
26430 5f 44 42 20 29 3b 0a 20 20 20 20 20 20 20 20 70  _DB );.        p
26440 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
26450 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b  Idx] = nextPage;
26460 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
26470 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c  if( offset>=ovfl
26480 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
26490 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73  /* The only reas
264a0 6f 6e 20 74 6f 20 72 65 61 64 20 74 68 69 73 20  on to read this 
264b0 70 61 67 65 20 69 73 20 74 6f 20 6f 62 74 61 69  page is to obtai
264c0 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  n the page.     
264d0 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72     ** number for
264e0 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
264f0 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  n the overflow c
26500 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65 0a 20  hain. The page. 
26510 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 69         ** data i
26520 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 20  s not required. 
26530 53 6f 20 66 69 72 73 74 20 74 72 79 20 74 6f 20  So first try to 
26540 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65 72 66  lookup the overf
26550 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  low.        ** p
26560 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2c 20  age-list cache, 
26570 69 66 20 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c  if any, then fal
26580 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20 67 65  l back to the ge
26590 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 29 0a  tOverflowPage().
265a0 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74          ** funct
265b0 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ion..        **.
265c0 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20          ** Note 
265d0 74 68 61 74 20 74 68 65 20 61 4f 76 65 72 66 6c  that the aOverfl
265e0 6f 77 5b 5d 20 61 72 72 61 79 20 6d 75 73 74 20  ow[] array must 
265f0 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 62 65 63  be allocated bec
26600 61 75 73 65 20 65 4f 70 21 3d 32 0a 20 20 20 20  ause eOp!=2.    
26610 20 20 20 20 2a 2a 20 68 65 72 65 2e 20 20 49 66      ** here.  If
26620 20 65 4f 70 3d 3d 32 2c 20 74 68 65 6e 20 6f 66   eOp==2, then of
26630 66 73 65 74 3d 3d 30 20 61 6e 64 20 74 68 69 73  fset==0 and this
26640 20 62 72 61 6e 63 68 20 69 73 20 6e 65 76 65 72   branch is never
26650 20 74 61 6b 65 6e 2e 0a 20 20 20 20 20 20 20 20   taken..        
26660 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
26670 74 28 20 65 4f 70 21 3d 32 20 29 3b 0a 20 20 20  t( eOp!=2 );.   
26680 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
26690 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
266a0 43 46 5f 56 61 6c 69 64 4f 76 66 6c 20 29 3b 0a  CF_ValidOvfl );.
266b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
266c0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
266d0 3d 3d 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 20  ==pBt->db );.   
266e0 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61       if( pCur->a
266f0 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d  Overflow[iIdx+1]
26700 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65   ){.          ne
26710 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  xtPage = pCur->a
26720 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d  Overflow[iIdx+1]
26730 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
26740 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
26750 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
26760 70 42 74 2c 20 6e 65 78 74 50 61 67 65 2c 20 30  pBt, nextPage, 0
26770 2c 20 26 6e 65 78 74 50 61 67 65 29 3b 0a 20 20  , &nextPage);.  
26780 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
26790 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69  offset -= ovflSi
267a0 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ze;.      }else{
267b0 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64  .        /* Need
267c0 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70 61   to read this pa
267d0 67 65 20 70 72 6f 70 65 72 6c 79 2e 20 49 74 20  ge properly. It 
267e0 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66  contains some of
267f0 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
26800 72 61 6e 67 65 20 6f 66 20 64 61 74 61 20 74 68  range of data th
26810 61 74 20 69 73 20 62 65 69 6e 67 20 72 65 61 64  at is being read
26820 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69   (eOp==0) or wri
26830 74 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20  tten (eOp!=0).. 
26840 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 64 65 66         */.#ifdef
26850 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f   SQLITE_DIRECT_O
26860 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20  VERFLOW_READ.   
26870 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c       sqlite3_fil
26880 65 20 2a 66 64 3b 0a 23 65 6e 64 69 66 0a 20 20  e *fd;.#endif.  
26890 20 20 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d        int a = am
268a0 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  t;.        if( a
268b0 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c   + offset > ovfl
268c0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
268d0 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d    a = ovflSize -
268e0 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20   offset;.       
268f0 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
26900 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f  E_DIRECT_OVERFLO
26910 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20 20 2f  W_READ.        /
26920 2a 20 49 66 20 61 6c 6c 20 74 68 65 20 66 6f 6c  * If all the fol
26930 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
26940 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
26950 20 20 20 20 2a 2a 20 20 20 31 29 20 74 68 69 73      **   1) this
26960 20 69 73 20 61 20 72 65 61 64 20 6f 70 65 72 61   is a read opera
26970 74 69 6f 6e 2c 20 61 6e 64 20 0a 20 20 20 20 20  tion, and .     
26980 20 20 20 2a 2a 20 20 20 32 29 20 64 61 74 61 20     **   2) data 
26990 69 73 20 72 65 71 75 69 72 65 64 20 66 72 6f 6d  is required from
269a0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
269b0 69 73 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  is overflow page
269c0 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  , and.        **
269d0 20 20 20 33 29 20 74 68 65 20 64 61 74 61 62 61     3) the databa
269e0 73 65 20 69 73 20 66 69 6c 65 2d 62 61 63 6b 65  se is file-backe
269f0 64 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a  d, and.        *
26a00 2a 20 20 20 34 29 20 74 68 65 72 65 20 69 73 20  *   4) there is 
26a10 6e 6f 20 6f 70 65 6e 20 77 72 69 74 65 2d 74 72  no open write-tr
26a20 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20  ansaction, and. 
26a30 20 20 20 20 20 20 20 2a 2a 20 20 20 35 29 20 74         **   5) t
26a40 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  he database is n
26a50 6f 74 20 61 20 57 41 4c 20 64 61 74 61 62 61 73  ot a WAL databas
26a60 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  e,.        **   
26a70 36 29 20 61 6c 6c 20 64 61 74 61 20 66 72 6f 6d  6) all data from
26a80 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65 69   the page is bei
26a90 6e 67 20 72 65 61 64 2e 0a 20 20 20 20 20 20 20  ng read..       
26aa0 20 2a 2a 20 20 20 37 29 20 61 74 20 6c 65 61 73   **   7) at leas
26ab0 74 20 34 20 62 79 74 65 73 20 68 61 76 65 20 61  t 4 bytes have a
26ac0 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65 61 64  lready been read
26ad0 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74   into the output
26ae0 20 62 75 66 66 65 72 20 0a 20 20 20 20 20 20 20   buffer .       
26af0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   **.        ** t
26b00 68 65 6e 20 64 61 74 61 20 63 61 6e 20 62 65 20  hen data can be 
26b10 72 65 61 64 20 64 69 72 65 63 74 6c 79 20 66 72  read directly fr
26b20 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
26b30 66 69 6c 65 20 69 6e 74 6f 20 74 68 65 0a 20 20  file into the.  
26b40 20 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20        ** output 
26b50 62 75 66 66 65 72 2c 20 62 79 70 61 73 73 69 6e  buffer, bypassin
26b60 67 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  g the page-cache
26b70 20 61 6c 74 6f 67 65 74 68 65 72 2e 20 54 68 69   altogether. Thi
26b80 73 20 73 70 65 65 64 73 0a 20 20 20 20 20 20 20  s speeds.       
26b90 20 2a 2a 20 75 70 20 6c 6f 61 64 69 6e 67 20 6c   ** up loading l
26ba0 61 72 67 65 20 72 65 63 6f 72 64 73 20 74 68 61  arge records tha
26bb0 74 20 73 70 61 6e 20 6d 61 6e 79 20 6f 76 65 72  t span many over
26bc0 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20 20 20  flow pages..    
26bd0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
26be0 66 28 20 28 65 4f 70 26 30 78 30 31 29 3d 3d 30  f( (eOp&0x01)==0
26bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c10 20 20 20 20 20 20 2f 2a 20 28 31 29 20 2a 2f 0a        /* (1) */.
26c20 20 20 20 20 20 20 20 20 20 26 26 20 6f 66 66 73           && offs
26c30 65 74 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20  et==0           
26c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26c60 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (2) */.       
26c70 20 20 26 26 20 28 62 45 6e 64 20 7c 7c 20 61 3d    && (bEnd || a=
26c80 3d 6f 76 66 6c 53 69 7a 65 29 20 20 20 20 20 20  =ovflSize)      
26c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ca0 20 20 20 20 20 20 20 20 2f 2a 20 28 36 29 20 2a          /* (6) *
26cb0 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 42  /.         && pB
26cc0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
26cd0 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 20 20 20  ==TRANS_READ    
26ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26cf0 20 2f 2a 20 28 34 29 20 2a 2f 0a 20 20 20 20 20   /* (4) */.     
26d00 20 20 20 20 26 26 20 28 66 64 20 3d 20 73 71 6c      && (fd = sql
26d10 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 42  ite3PagerFile(pB
26d20 74 2d 3e 70 50 61 67 65 72 29 29 2d 3e 70 4d 65  t->pPager))->pMe
26d30 74 68 6f 64 73 20 20 20 20 20 2f 2a 20 28 33 29  thods     /* (3)
26d40 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20   */.         && 
26d50 30 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 55  0==sqlite3PagerU
26d60 73 65 57 61 6c 28 70 42 74 2d 3e 70 50 61 67 65  seWal(pBt->pPage
26d70 72 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r)              
26d80 20 20 20 2f 2a 20 28 35 29 20 2a 2f 0a 20 20 20     /* (5) */.   
26d90 20 20 20 20 20 20 26 26 20 26 70 42 75 66 5b 2d        && &pBuf[-
26da0 34 5d 3e 3d 70 42 75 66 53 74 61 72 74 20 20 20  4]>=pBufStart   
26db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26dc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
26dd0 37 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b  7) */.        ){
26de0 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 61 53  .          u8 aS
26df0 61 76 65 5b 34 5d 3b 0a 20 20 20 20 20 20 20 20  ave[4];.        
26e00 20 20 75 38 20 2a 61 57 72 69 74 65 20 3d 20 26    u8 *aWrite = &
26e10 70 42 75 66 5b 2d 34 5d 3b 0a 20 20 20 20 20 20  pBuf[-4];.      
26e20 20 20 20 20 61 73 73 65 72 74 28 20 61 57 72 69      assert( aWri
26e30 74 65 3e 3d 70 42 75 66 53 74 61 72 74 20 29 3b  te>=pBufStart );
26e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e50 20 20 20 20 20 20 20 20 20 2f 2a 20 68 65 6e 63           /* henc
26e60 65 20 28 37 29 20 2a 2f 0a 20 20 20 20 20 20 20  e (7) */.       
26e70 20 20 20 6d 65 6d 63 70 79 28 61 53 61 76 65 2c     memcpy(aSave,
26e80 20 61 57 72 69 74 65 2c 20 34 29 3b 0a 20 20 20   aWrite, 4);.   
26e90 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
26ea0 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 57  te3OsRead(fd, aW
26eb0 72 69 74 65 2c 20 61 2b 34 2c 20 28 69 36 34 29  rite, a+4, (i64)
26ec0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28 6e  pBt->pageSize*(n
26ed0 65 78 74 50 61 67 65 2d 31 29 29 3b 0a 20 20 20  extPage-1));.   
26ee0 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
26ef0 3d 20 67 65 74 34 62 79 74 65 28 61 57 72 69 74  = get4byte(aWrit
26f00 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  e);.          me
26f10 6d 63 70 79 28 61 57 72 69 74 65 2c 20 61 53 61  mcpy(aWrite, aSa
26f20 76 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  ve, 4);.        
26f30 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20  }else.#endif..  
26f40 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
26f50 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
26f60 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  e;.          rc 
26f70 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
26f80 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e  t(pBt->pPager, n
26f90 65 78 74 50 61 67 65 2c 20 26 70 44 62 50 61 67  extPage, &pDbPag
26fa0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
26fb0 20 28 28 65 4f 70 26 30 78 30 31 29 3d 3d 30 20   ((eOp&0x01)==0 
26fc0 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  ? PAGER_GET_READ
26fd0 4f 4e 4c 59 20 3a 20 30 29 0a 20 20 20 20 20 20  ONLY : 0).      
26fe0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20      );.         
26ff0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
27000 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
27010 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c    aPayload = sql
27020 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
27030 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  (pDbPage);.     
27040 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
27050 3d 20 67 65 74 34 62 79 74 65 28 61 50 61 79 6c  = get4byte(aPayl
27060 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  oad);.          
27070 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f    rc = copyPaylo
27080 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66  ad(&aPayload[off
27090 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c  set+4], pBuf, a,
270a0 20 28 65 4f 70 26 30 78 30 31 29 2c 20 70 44 62   (eOp&0x01), pDb
270b0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
270c0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
270d0 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
270e0 20 20 20 20 20 20 20 20 20 20 20 6f 66 66 73 65             offse
270f0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
27100 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
27110 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20       amt -= a;. 
27120 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20 61         pBuf += a
27130 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
27140 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
27150 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e  QLITE_OK && amt>
27160 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
27170 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
27180 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  KPT;.  }.  retur
27190 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
271a0 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20  ead part of the 
271b0 70 61 79 6c 6f 61 64 20 66 6f 72 20 74 68 65 20  payload for the 
271c0 72 6f 77 20 61 74 20 77 68 69 63 68 20 74 68 61  row at which tha
271d0 74 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73  t cursor pCur is
271e0 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f   currently.** po
271f0 69 6e 74 69 6e 67 2e 20 20 22 61 6d 74 22 20 62  inting.  "amt" b
27200 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61  ytes will be tra
27210 6e 73 66 65 72 72 65 64 20 69 6e 74 6f 20 70 42  nsferred into pB
27220 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73  uf[].  The trans
27230 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74  fer.** begins at
27240 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a   "offset"..**.**
27250 20 70 43 75 72 20 63 61 6e 20 62 65 20 70 6f 69   pCur can be poi
27260 6e 74 69 6e 67 20 74 6f 20 65 69 74 68 65 72 20  nting to either 
27270 61 20 74 61 62 6c 65 20 6f 72 20 61 6e 20 69 6e  a table or an in
27280 64 65 78 20 62 2d 74 72 65 65 2e 0a 2a 2a 20 49  dex b-tree..** I
27290 66 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  f pointing to a 
272a0 74 61 62 6c 65 20 62 74 72 65 65 2c 20 74 68 65  table btree, the
272b0 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 73 65  n the content se
272c0 63 74 69 6f 6e 20 69 73 20 72 65 61 64 2e 20 20  ction is read.  
272d0 49 66 0a 2a 2a 20 70 43 75 72 20 69 73 20 70 6f  If.** pCur is po
272e0 69 6e 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64  inting to an ind
272f0 65 78 20 62 2d 74 72 65 65 20 74 68 65 6e 20 74  ex b-tree then t
27300 68 65 20 6b 65 79 20 73 65 63 74 69 6f 6e 20 69  he key section i
27310 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f  s read..**.** Fo
27320 72 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  r sqlite3BtreePa
27330 79 6c 6f 61 64 28 29 2c 20 74 68 65 20 63 61 6c  yload(), the cal
27340 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20  ler must ensure 
27350 74 68 61 74 20 70 43 75 72 20 69 73 20 70 6f 69  that pCur is poi
27360 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61  nting.** to a va
27370 6c 69 64 20 72 6f 77 20 69 6e 20 74 68 65 20 74  lid row in the t
27380 61 62 6c 65 2e 20 20 46 6f 72 20 73 71 6c 69 74  able.  For sqlit
27390 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 43 68  e3BtreePayloadCh
273a0 65 63 6b 65 64 28 29 2c 20 74 68 65 0a 2a 2a 20  ecked(), the.** 
273b0 63 75 72 73 6f 72 20 6d 69 67 68 74 20 62 65 20  cursor might be 
273c0 69 6e 76 61 6c 69 64 20 6f 72 20 6d 69 67 68 74  invalid or might
273d0 20 6e 65 65 64 20 74 6f 20 62 65 20 72 65 73 74   need to be rest
273e0 6f 72 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e  ored before bein
273f0 67 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 52 65  g read..**.** Re
27400 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
27410 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20  n success or an 
27420 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
27430 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
27440 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20  rong.  An error 
27450 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22  is returned if "
27460 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c  offset+amt" is l
27470 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68  arger than.** th
27480 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c  e available payl
27490 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  oad..*/.int sqli
274a0 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 28  te3BtreePayload(
274b0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
274c0 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20  u32 offset, u32 
274d0 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29  amt, void *pBuf)
274e0 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
274f0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
27500 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
27510 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
27520 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
27530 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
27540 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  age>=0 && pCur->
27550 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
27560 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge] );.  assert(
27570 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
27580 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e  r->iPage]<pCur->
27590 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
275a0 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ge]->nCell );.  
275b0 72 65 74 75 72 6e 20 61 63 63 65 73 73 50 61 79  return accessPay
275c0 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65  load(pCur, offse
275d0 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65  t, amt, (unsigne
275e0 64 20 63 68 61 72 2a 29 70 42 75 66 2c 20 30 29  d char*)pBuf, 0)
275f0 3b 0a 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ;.}.#ifndef SQLI
27600 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
27610 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
27620 65 50 61 79 6c 6f 61 64 43 68 65 63 6b 65 64 28  ePayloadChecked(
27630 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
27640 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20  u32 offset, u32 
27650 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29  amt, void *pBuf)
27660 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  {.  int rc;.  if
27670 20 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d   ( pCur->eState=
27680 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
27690 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
276a0 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a  LITE_ABORT;.  }.
276b0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
276c0 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
276d0 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  r) );.  rc = res
276e0 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
276f0 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
27700 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
27710 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
27720 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
27730 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61  R_VALID );.    a
27740 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
27750 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61  ge>=0 && pCur->a
27760 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
27770 65 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  e] );.    assert
27780 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
27790 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d  ur->iPage]<pCur-
277a0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
277b0 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  age]->nCell );. 
277c0 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61     rc = accessPa
277d0 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73  yload(pCur, offs
277e0 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 30  et, amt, pBuf, 0
277f0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
27800 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
27810 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
27820 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  BLOB */../*.** R
27830 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
27840 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72  to payload infor
27850 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  mation from the 
27860 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 0a  entry that the .
27870 2a 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20 69  ** pCur cursor i
27880 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20  s pointing to.  
27890 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74  The pointer is t
278a0 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  o the beginning 
278b0 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66  of.** the key if
278c0 20 69 6e 64 65 78 20 62 74 72 65 65 73 20 28 70   index btrees (p
278d0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30 29  Page->intKey==0)
278e0 20 61 6e 64 20 69 73 20 74 68 65 20 64 61 74 61   and is the data
278f0 20 66 6f 72 0a 2a 2a 20 74 61 62 6c 65 20 62 74   for.** table bt
27900 72 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74  rees (pPage->int
27910 4b 65 79 3d 3d 31 29 2e 20 54 68 65 20 6e 75 6d  Key==1). The num
27920 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
27930 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 6b 65 79  available.** key
27940 2f 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e  /data is written
27950 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66   into *pAmt.  If
27960 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20   *pAmt==0, then 
27970 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 72 65 74  the value.** ret
27980 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62  urned will not b
27990 65 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65  e a valid pointe
279a0 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  r..**.** This ro
279b0 75 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69  utine is an opti
279c0 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73  mization.  It is
279d0 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20   common for the 
279e0 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e  entire key.** an
279f0 64 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e  d data to fit on
27a00 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20   the local page 
27a10 61 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f  and for there to
27a20 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a   be no overflow.
27a30 2a 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20  ** pages.  When 
27a40 74 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73  that is so, this
27a50 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20   routine can be 
27a60 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 74  used to access t
27a70 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61  he.** key and da
27a80 74 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e  ta without makin
27a90 67 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68  g a copy.  If th
27aa0 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74  e key and/or dat
27ab0 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f  a spills.** onto
27ac0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c   overflow pages,
27ad0 20 74 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c   then accessPayl
27ae0 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20 75 73  oad() must be us
27af0 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 65  ed to reassemble
27b00 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61  .** the key/data
27b10 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74   and copy it int
27b20 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64  o a preallocated
27b30 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54   buffer..**.** T
27b40 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
27b50 6e 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74  ned by this rout
27b60 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74  ine looks direct
27b70 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  ly into the cach
27b80 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68  ed.** page of th
27b90 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65  e database.  The
27ba0 20 64 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e   data might chan
27bb0 67 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e  ge or move the n
27bc0 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20  ext time.** any 
27bd0 62 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73  btree routine is
27be0 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74   called..*/.stat
27bf0 69 63 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 66  ic const void *f
27c00 65 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42  etchPayload(.  B
27c10 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
27c20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f      /* Cursor po
27c30 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20  inting to entry 
27c40 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a  to read from */.
27c50 20 20 75 33 32 20 2a 70 41 6d 74 20 20 20 20 20    u32 *pAmt     
27c60 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
27c70 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76  the number of av
27c80 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65  ailable bytes he
27c90 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 61  re */.){.  u32 a
27ca0 6d 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  mt;.  assert( pC
27cb0 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69  ur!=0 && pCur->i
27cc0 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d  Page>=0 && pCur-
27cd0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
27ce0 61 67 65 5d 29 3b 0a 20 20 61 73 73 65 72 74 28  age]);.  assert(
27cf0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
27d00 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
27d10 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
27d20 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
27d30 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
27d40 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
27d50 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
27d60 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
27d70 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
27d80 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
27d90 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  <pCur->apPage[pC
27da0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
27db0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
27dc0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3e  Cur->info.nSize>
27dd0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
27de0 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f  Cur->info.pPaylo
27df0 61 64 3e 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ad>pCur->apPage[
27e00 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44  pCur->iPage]->aD
27e10 61 74 61 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  ata || CORRUPT_D
27e20 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  B );.  assert( p
27e30 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f  Cur->info.pPaylo
27e40 61 64 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ad<pCur->apPage[
27e50 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44  pCur->iPage]->aD
27e60 61 74 61 45 6e 64 20 7c 7c 43 4f 52 52 55 50 54  ataEnd ||CORRUPT
27e70 5f 44 42 29 3b 0a 20 20 61 6d 74 20 3d 20 28 69  _DB);.  amt = (i
27e80 6e 74 29 28 70 43 75 72 2d 3e 61 70 50 61 67 65  nt)(pCur->apPage
27e90 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61  [pCur->iPage]->a
27ea0 44 61 74 61 45 6e 64 20 2d 20 70 43 75 72 2d 3e  DataEnd - pCur->
27eb0 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 29 3b 0a  info.pPayload);.
27ec0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
27ed0 2e 6e 4c 6f 63 61 6c 3c 61 6d 74 20 29 20 61 6d  .nLocal<amt ) am
27ee0 74 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  t = pCur->info.n
27ef0 4c 6f 63 61 6c 3b 0a 20 20 2a 70 41 6d 74 20 3d  Local;.  *pAmt =
27f00 20 61 6d 74 3b 0a 20 20 72 65 74 75 72 6e 20 28   amt;.  return (
27f10 76 6f 69 64 2a 29 70 43 75 72 2d 3e 69 6e 66 6f  void*)pCur->info
27f20 2e 70 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f  .pPayload;.}.../
27f30 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74  *.** For the ent
27f40 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70  ry that cursor p
27f50 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c  Cur is point to,
27f60 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61   return as.** ma
27f70 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  ny bytes of the 
27f80 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73 20 61  key or data as a
27f90 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  re available on 
27fa0 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74  the local.** b-t
27fb0 72 65 65 20 70 61 67 65 2e 20 20 57 72 69 74 65  ree page.  Write
27fc0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
27fd0 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69  vailable bytes i
27fe0 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a  nto *pAmt..**.**
27ff0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74   The pointer ret
28000 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72  urned is ephemer
28010 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74  al.  The key/dat
28020 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72  a may move.** or
28030 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e   be destroyed on
28040 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74   the next call t
28050 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74  o any Btree rout
28060 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e  ine,.** includin
28070 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68  g calls from oth
28080 65 72 20 74 68 72 65 61 64 73 20 61 67 61 69 6e  er threads again
28090 73 74 20 74 68 65 20 73 61 6d 65 20 63 61 63 68  st the same cach
280a0 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d  e..** Hence, a m
280b0 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68  utex on the BtSh
280c0 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68  ared should be h
280d0 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  eld prior to cal
280e0 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75  ling.** this rou
280f0 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73  tine..**.** Thes
28100 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73  e routines is us
28110 65 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20  ed to get quick 
28120 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e  access to key an
28130 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65  d data.** in the
28140 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
28150 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70  re no overflow p
28160 61 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a  ages are used..*
28170 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71  /.const void *sq
28180 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61  lite3BtreePayloa
28190 64 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 20  dFetch(BtCursor 
281a0 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 41 6d 74  *pCur, u32 *pAmt
281b0 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 65 74 63  ){.  return fetc
281c0 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70  hPayload(pCur, p
281d0 41 6d 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  Amt);.}.../*.** 
281e0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
281f0 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68  down to a new ch
28200 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e  ild page.  The n
28210 65 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20  ewPgno argument 
28220 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e  is the.** page n
28230 75 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68 69  umber of the chi
28240 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  ld page to move 
28250 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  to..**.** This f
28260 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
28270 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
28280 66 20 74 68 65 20 70 61 67 65 2d 68 65 61 64 65  f the page-heade
28290 72 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66  r flags field of
282a0 0a 2a 2a 20 74 68 65 20 6e 65 77 20 63 68 69 6c  .** the new chil
282b0 64 20 70 61 67 65 20 64 6f 65 73 20 6e 6f 74 20  d page does not 
282c0 6d 61 74 63 68 20 74 68 65 20 66 6c 61 67 73 20  match the flags 
282d0 66 69 65 6c 64 20 6f 66 20 74 68 65 20 70 61 72  field of the par
282e0 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66 20  ent (i.e..** if 
282f0 61 6e 20 69 6e 74 6b 65 79 20 70 61 67 65 20 61  an intkey page a
28300 70 70 65 61 72 73 20 74 6f 20 62 65 20 74 68 65  ppears to be the
28310 20 70 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f 6e   parent of a non
28320 2d 69 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f 72  -intkey page, or
28330 0a 2a 2a 20 76 69 63 65 2d 76 65 72 73 61 29 2e  .** vice-versa).
28340 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
28350 6f 76 65 54 6f 43 68 69 6c 64 28 42 74 43 75 72  oveToChild(BtCur
28360 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6e  sor *pCur, u32 n
28370 65 77 50 67 6e 6f 29 7b 0a 20 20 42 74 53 68 61  ewPgno){.  BtSha
28380 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
28390 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  >pBt;..  assert(
283a0 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
283b0 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
283c0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
283d0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
283e0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
283f0 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43 55 52  Cur->iPage<BTCUR
28400 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b  SOR_MAX_DEPTH );
28410 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
28420 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20 20 69  >iPage>=0 );.  i
28430 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  f( pCur->iPage>=
28440 28 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45  (BTCURSOR_MAX_DE
28450 50 54 48 2d 31 29 20 29 7b 0a 20 20 20 20 72 65  PTH-1) ){.    re
28460 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
28470 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
28480 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
28490 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75   = 0;.  pCur->cu
284a0 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
284b0 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f  _ValidNKey|BTCF_
284c0 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 70 43  ValidOvfl);.  pC
284d0 75 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a 20 20 70  ur->iPage++;.  p
284e0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
284f0 3e 69 50 61 67 65 5d 20 3d 20 30 3b 0a 20 20 72  >iPage] = 0;.  r
28500 65 74 75 72 6e 20 67 65 74 41 6e 64 49 6e 69 74  eturn getAndInit
28510 50 61 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e  Page(pBt, newPgn
28520 6f 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65  o, &pCur->apPage
28530 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2c 0a 20  [pCur->iPage],. 
28540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28550 20 20 20 20 20 20 20 70 43 75 72 2c 20 70 43 75         pCur, pCu
28560 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73  r->curPagerFlags
28570 29 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  );.}..#if SQLITE
28580 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67  _DEBUG./*.** Pag
28590 65 20 70 50 61 72 65 6e 74 20 69 73 20 61 6e 20  e pParent is an 
285a0 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65  internal (non-le
285b0 61 66 29 20 74 72 65 65 20 70 61 67 65 2e 20 54  af) tree page. T
285c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a  his function .**
285d0 20 61 73 73 65 72 74 73 20 74 68 61 74 20 70 61   asserts that pa
285e0 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64  ge number iChild
285f0 20 69 73 20 74 68 65 20 6c 65 66 74 2d 63 68 69   is the left-chi
28600 6c 64 20 69 66 20 74 68 65 20 69 49 64 78 27 74  ld if the iIdx't
28610 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67  h.** cell in pag
28620 65 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69  e pParent. Or, i
28630 66 20 69 49 64 78 20 69 73 20 65 71 75 61 6c 20  f iIdx is equal 
28640 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  to the total num
28650 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20  ber of.** cells 
28660 69 6e 20 70 50 61 72 65 6e 74 2c 20 74 68 61 74  in pParent, that
28670 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68   page number iCh
28680 69 6c 64 20 69 73 20 74 68 65 20 72 69 67 68 74  ild is the right
28690 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65  -child of.** the
286a0 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
286b0 20 76 6f 69 64 20 61 73 73 65 72 74 50 61 72 65   void assertPare
286c0 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61 67 65 20  ntIndex(MemPage 
286d0 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74 20 69 49  *pParent, int iI
286e0 64 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64 29  dx, Pgno iChild)
286f0 7b 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f  {.  if( CORRUPT_
28700 44 42 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a  DB ) return;  /*
28710 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20   The conditions 
28720 74 65 73 74 65 64 20 62 65 6c 6f 77 20 6d 69 67  tested below mig
28730 68 74 20 6e 6f 74 20 62 65 20 74 72 75 65 0a 20  ht not be true. 
28740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28750 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e             ** in
28760 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
28770 61 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ase */.  assert(
28780 20 69 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d 3e   iIdx<=pParent->
28790 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 69  nCell );.  if( i
287a0 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43  Idx==pParent->nC
287b0 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ell ){.    asser
287c0 74 28 20 67 65 74 34 62 79 74 65 28 26 70 50 61  t( get4byte(&pPa
287d0 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72  rent->aData[pPar
287e0 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  ent->hdrOffset+8
287f0 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20  ])==iChild );.  
28800 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
28810 74 28 20 67 65 74 34 62 79 74 65 28 66 69 6e 64  t( get4byte(find
28820 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 49  Cell(pParent, iI
28830 64 78 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a  dx))==iChild );.
28840 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 64    }.}.#else.#  d
28850 65 66 69 6e 65 20 61 73 73 65 72 74 50 61 72 65  efine assertPare
28860 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20 0a  ntIndex(x,y,z) .
28870 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  #endif../*.** Mo
28880 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 75 70  ve the cursor up
28890 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70   to the parent p
288a0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d  age..**.** pCur-
288b0 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 74  >idx is set to t
288c0 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74 68  he cell index th
288d0 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
288e0 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
288f0 65 20 70 61 67 65 20 77 65 20 61 72 65 20 63 6f  e page we are co
28900 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20 77  ming from.  If w
28910 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f  e are coming fro
28920 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d  m the.** right-m
28930 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65 20 74  ost child page t
28940 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69 73  hen pCur->idx is
28950 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65   set to one more
28960 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72   than.** the lar
28970 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e  gest cell index.
28980 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
28990 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74 43  moveToParent(BtC
289a0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
289b0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
289c0 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
289d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
289e0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
289f0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
28a00 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
28a10 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e>0 );.  assert(
28a20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
28a30 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
28a40 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65  assertParentInde
28a50 78 28 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50  x(.    pCur->apP
28a60 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  age[pCur->iPage-
28a70 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61  1], .    pCur->a
28a80 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
28a90 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e  -1], .    pCur->
28aa0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
28ab0 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20  ge]->pgno.  );. 
28ac0 20 74 65 73 74 63 61 73 65 28 20 70 43 75 72 2d   testcase( pCur-
28ad0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
28ae0 67 65 2d 31 5d 20 3e 20 70 43 75 72 2d 3e 61 70  ge-1] > pCur->ap
28af0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
28b00 2d 31 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  -1]->nCell );.  
28b10 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
28b20 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75   = 0;.  pCur->cu
28b30 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
28b40 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f  _ValidNKey|BTCF_
28b50 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 72 65  ValidOvfl);.  re
28b60 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c  leasePageNotNull
28b70 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  (pCur->apPage[pC
28b80 75 72 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a 7d  ur->iPage--]);.}
28b90 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
28ba0 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74   cursor to point
28bb0 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67   to the root pag
28bc0 65 20 6f 66 20 69 74 73 20 62 2d 74 72 65 65 20  e of its b-tree 
28bd0 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
28be0 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 68 61   If the table ha
28bf0 73 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  s a virtual root
28c00 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20   page, then the 
28c10 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20  cursor is moved 
28c20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20 74  to point.** to t
28c30 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20  he virtual root 
28c40 70 61 67 65 20 69 6e 73 74 65 61 64 20 6f 66 20  page instead of 
28c50 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20  the actual root 
28c60 70 61 67 65 2e 20 41 20 74 61 62 6c 65 20 68 61  page. A table ha
28c70 73 20 61 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72  s a.** virtual r
28c80 6f 6f 74 20 70 61 67 65 20 77 68 65 6e 20 74 68  oot page when th
28c90 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61  e actual root pa
28ca0 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63  ge contains no c
28cb0 65 6c 6c 73 20 61 6e 64 20 61 20 0a 2a 2a 20 73  ells and a .** s
28cc0 69 6e 67 6c 65 20 63 68 69 6c 64 20 70 61 67 65  ingle child page
28cd0 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20  . This can only 
28ce0 68 61 70 70 65 6e 20 77 69 74 68 20 74 68 65 20  happen with the 
28cf0 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 61 74 20  table rooted at 
28d00 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66  page 1..**.** If
28d10 20 74 68 65 20 62 2d 74 72 65 65 20 73 74 72 75   the b-tree stru
28d20 63 74 75 72 65 20 69 73 20 65 6d 70 74 79 2c 20  cture is empty, 
28d30 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65  the cursor state
28d40 20 69 73 20 73 65 74 20 74 6f 20 0a 2a 2a 20 43   is set to .** C
28d50 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 2e 20 4f  URSOR_INVALID. O
28d60 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 63 75  therwise, the cu
28d70 72 73 6f 72 20 69 73 20 73 65 74 20 74 6f 20 70  rsor is set to p
28d80 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73  oint to the firs
28d90 74 0a 2a 2a 20 63 65 6c 6c 20 6c 6f 63 61 74 65  t.** cell locate
28da0 64 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 28 6f  d on the root (o
28db0 72 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 29 20  r virtual root) 
28dc0 70 61 67 65 20 61 6e 64 20 74 68 65 20 63 75 72  page and the cur
28dd0 73 6f 72 20 73 74 61 74 65 0a 2a 2a 20 69 73 20  sor state.** is 
28de0 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 56 41  set to CURSOR_VA
28df0 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  LID..**.** If th
28e00 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
28e10 72 6e 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  rns successfully
28e20 2c 20 69 74 20 6d 61 79 20 62 65 20 61 73 73 75  , it may be assu
28e30 6d 65 64 20 74 68 61 74 20 74 68 65 0a 2a 2a 20  med that the.** 
28e40 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67  page-header flag
28e50 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  s indicate that 
28e60 74 68 65 20 5b 76 69 72 74 75 61 6c 5d 20 72 6f  the [virtual] ro
28e70 6f 74 2d 70 61 67 65 20 69 73 20 74 68 65 20 65  ot-page is the e
28e80 78 70 65 63 74 65 64 20 0a 2a 2a 20 6b 69 6e 64  xpected .** kind
28e90 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65 20   of b-tree page 
28ea0 28 69 2e 65 2e 20 69 66 20 77 68 65 6e 20 6f 70  (i.e. if when op
28eb0 65 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72  ening the cursor
28ec0 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20   the caller did 
28ed0 6e 6f 74 0a 2a 2a 20 73 70 65 63 69 66 79 20 61  not.** specify a
28ee0 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
28ef0 72 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74  re the flags byt
28f00 65 20 69 73 20 73 65 74 20 74 6f 20 30 78 30 35  e is set to 0x05
28f10 20 6f 72 20 30 78 30 44 2c 0a 2a 2a 20 69 6e 64   or 0x0D,.** ind
28f20 69 63 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20  icating a table 
28f30 62 2d 74 72 65 65 2c 20 6f 72 20 69 66 20 74 68  b-tree, or if th
28f40 65 20 63 61 6c 6c 65 72 20 64 69 64 20 73 70 65  e caller did spe
28f50 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 0a  cify a KeyInfo .
28f60 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74 68 65  ** structure the
28f70 20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20 73   flags byte is s
28f80 65 74 20 74 6f 20 30 78 30 32 20 6f 72 20 30 78  et to 0x02 or 0x
28f90 30 41 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 61  0A, indicating a
28fa0 6e 20 69 6e 64 65 78 0a 2a 2a 20 62 2d 74 72 65  n index.** b-tre
28fb0 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e)..*/.static in
28fc0 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43  t moveToRoot(BtC
28fd0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
28fe0 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a  MemPage *pRoot;.
28ff0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
29000 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
29010 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
29020 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
29030 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 49 4e  ssert( CURSOR_IN
29040 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f 52  VALID < CURSOR_R
29050 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
29060 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56  assert( CURSOR_V
29070 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f 52 5f  ALID   < CURSOR_
29080 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
29090 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
290a0 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53 4f 52  FAULT   > CURSOR
290b0 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
290c0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
290d0 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te>=CURSOR_REQUI
290e0 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 69 66  RESEEK ){.    if
290f0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
29100 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a  CURSOR_FAULT ){.
29110 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
29120 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51  ur->skipNext!=SQ
29130 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
29140 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b   return pCur->sk
29150 69 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  ipNext;.    }.  
29160 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
29170 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b  earCursor(pCur);
29180 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 43 75 72  .  }..  if( pCur
29190 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20  ->iPage>=0 ){.  
291a0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
291b0 65 20 29 7b 0a 20 20 20 20 20 20 64 6f 7b 0a 20  e ){.      do{. 
291c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
291d0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
291e0 2d 3e 69 50 61 67 65 5d 21 3d 30 20 29 3b 0a 20  ->iPage]!=0 );. 
291f0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
29200 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e  geNotNull(pCur->
29210 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
29220 67 65 2d 2d 5d 29 3b 0a 20 20 20 20 20 20 7d 77  ge--]);.      }w
29230 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 50 61 67  hile( pCur->iPag
29240 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  e);.      goto s
29250 6b 69 70 5f 69 6e 69 74 3b 0a 20 20 20 20 7d 0a  kip_init;.    }.
29260 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 75 72    }else if( pCur
29270 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 29 7b  ->pgnoRoot==0 ){
29280 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
29290 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
292a0 49 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ID;.    return S
292b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
292c0 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
292d0 43 75 72 2d 3e 69 50 61 67 65 3d 3d 28 2d 31 29  Cur->iPage==(-1)
292e0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 67 65 74   );.    rc = get
292f0 41 6e 64 49 6e 69 74 50 61 67 65 28 70 43 75 72  AndInitPage(pCur
29300 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 2c 20 70  ->pBtree->pBt, p
29310 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26  Cur->pgnoRoot, &
29320 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2c  pCur->apPage[0],
29330 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29340 20 20 20 20 20 20 20 20 20 30 2c 20 70 43 75 72           0, pCur
29350 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73 29  ->curPagerFlags)
29360 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
29370 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
29380 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
29390 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
293a0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
293b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72  ;.    }.    pCur
293c0 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  ->iPage = 0;.   
293d0 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79   pCur->curIntKey
293e0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
293f0 30 5d 2d 3e 69 6e 74 4b 65 79 3b 0a 20 20 7d 0a  0]->intKey;.  }.
29400 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e    pRoot = pCur->
29410 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 61 73 73  apPage[0];.  ass
29420 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f  ert( pRoot->pgno
29430 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ==pCur->pgnoRoot
29440 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 43 75   );..  /* If pCu
29450 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 69 73 20 6e  r->pKeyInfo is n
29460 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  ot NULL, then th
29470 65 20 63 61 6c 6c 65 72 20 74 68 61 74 20 6f 70  e caller that op
29480 65 6e 65 64 20 74 68 69 73 20 63 75 72 73 6f 72  ened this cursor
29490 0a 20 20 2a 2a 20 65 78 70 65 63 74 65 64 20 74  .  ** expected t
294a0 6f 20 6f 70 65 6e 20 69 74 20 6f 6e 20 61 6e 20  o open it on an 
294b0 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 20 4f 74  index b-tree. Ot
294c0 68 65 72 77 69 73 65 2c 20 69 66 20 70 4b 65 79  herwise, if pKey
294d0 49 6e 66 6f 20 69 73 0a 20 20 2a 2a 20 4e 55 4c  Info is.  ** NUL
294e0 4c 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 65 78  L, the caller ex
294f0 70 65 63 74 73 20 61 20 74 61 62 6c 65 20 62 2d  pects a table b-
29500 74 72 65 65 2e 20 49 66 20 74 68 69 73 20 69 73  tree. If this is
29510 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2c 0a 20   not the case,. 
29520 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51   ** return an SQ
29530 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72 72  LITE_CORRUPT err
29540 6f 72 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45  or. .  **.  ** E
29550 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 20  arlier versions 
29560 6f 66 20 53 51 4c 69 74 65 20 61 73 73 75 6d 65  of SQLite assume
29570 64 20 74 68 61 74 20 74 68 69 73 20 74 65 73 74  d that this test
29580 20 63 6f 75 6c 64 20 6e 6f 74 20 66 61 69 6c 0a   could not fail.
29590 20 20 2a 2a 20 69 66 20 74 68 65 20 72 6f 6f 74    ** if the root
295a0 20 70 61 67 65 20 77 61 73 20 61 6c 72 65 61 64   page was alread
295b0 79 20 6c 6f 61 64 65 64 20 77 68 65 6e 20 74 68  y loaded when th
295c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20  is function was 
295d0 63 61 6c 6c 65 64 20 28 69 2e 65 2e 0a 20 20 2a  called (i.e..  *
295e0 2a 20 69 66 20 70 43 75 72 2d 3e 69 50 61 67 65  * if pCur->iPage
295f0 3e 3d 30 29 2e 20 42 75 74 20 74 68 69 73 20 69  >=0). But this i
29600 73 20 6e 6f 74 20 73 6f 20 69 66 20 74 68 65 20  s not so if the 
29610 64 61 74 61 62 61 73 65 20 69 73 20 63 6f 72 72  database is corr
29620 75 70 74 65 64 20 0a 20 20 2a 2a 20 69 6e 20 73  upted .  ** in s
29630 75 63 68 20 61 20 77 61 79 20 74 68 61 74 20 70  uch a way that p
29640 61 67 65 20 70 52 6f 6f 74 20 69 73 20 6c 69 6e  age pRoot is lin
29650 6b 65 64 20 69 6e 74 6f 20 61 20 73 65 63 6f 6e  ked into a secon
29660 64 20 62 2d 74 72 65 65 20 74 61 62 6c 65 20 0a  d b-tree table .
29670 20 20 2a 2a 20 28 6f 72 20 74 68 65 20 66 72 65    ** (or the fre
29680 65 6c 69 73 74 29 2e 20 20 2a 2f 0a 20 20 61 73  elist).  */.  as
29690 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69 6e 74  sert( pRoot->int
296a0 4b 65 79 3d 3d 31 20 7c 7c 20 70 52 6f 6f 74 2d  Key==1 || pRoot-
296b0 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20 20  >intKey==0 );.  
296c0 69 66 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69  if( pRoot->isIni
296d0 74 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e 70  t==0 || (pCur->p
296e0 4b 65 79 49 6e 66 6f 3d 3d 30 29 21 3d 70 52 6f  KeyInfo==0)!=pRo
296f0 6f 74 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ot->intKey ){.  
29700 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
29710 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
29720 7d 0a 0a 73 6b 69 70 5f 69 6e 69 74 3a 20 20 0a  }..skip_init:  .
29730 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d    pCur->aiIdx[0]
29740 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e   = 0;.  pCur->in
29750 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
29760 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
29770 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61 73 74 7c  = ~(BTCF_AtLast|
29780 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42  BTCF_ValidNKey|B
29790 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a  TCF_ValidOvfl);.
297a0 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d  .  pRoot = pCur-
297b0 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 69 66  >apPage[0];.  if
297c0 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30  ( pRoot->nCell>0
297d0 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53   ){.    pCur->eS
297e0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41  tate = CURSOR_VA
297f0 4c 49 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  LID;.  }else if(
29800 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b   !pRoot->leaf ){
29810 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70 61 67  .    Pgno subpag
29820 65 3b 0a 20 20 20 20 69 66 28 20 70 52 6f 6f 74  e;.    if( pRoot
29830 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72 65 74 75  ->pgno!=1 ) retu
29840 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
29850 54 5f 42 4b 50 54 3b 0a 20 20 20 20 73 75 62 70  T_BKPT;.    subp
29860 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
29870 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f  pRoot->aData[pRo
29880 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ot->hdrOffset+8]
29890 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  );.    pCur->eSt
298a0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
298b0 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ID;.    rc = mov
298c0 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73  eToChild(pCur, s
298d0 75 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65  ubpage);.  }else
298e0 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  {.    pCur->eSta
298f0 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
29900 4c 49 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  LID;.  }.  retur
29910 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
29920 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
29930 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d  own to the left-
29940 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20  most leaf entry 
29950 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65  beneath the.** e
29960 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 69 74  ntry to which it
29970 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
29980 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  inting..**.** Th
29990 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66  e left-most leaf
299a0 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68   is the one with
299b0 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65   the smallest ke
299c0 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a  y - the first.**
299d0 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
299e0 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
299f0 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  nt moveToLeftmos
29a00 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
29a10 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  ){.  Pgno pgno;.
29a20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
29a30 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20  E_OK;.  MemPage 
29a40 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  *pPage;..  asser
29a50 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
29a60 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
29a70 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
29a80 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
29a90 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  LID );.  while( 
29aa0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
29ab0 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d   !(pPage = pCur-
29ac0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
29ad0 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20  age])->leaf ){. 
29ae0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
29af0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
29b00 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ge]<pPage->nCell
29b10 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67   );.    pgno = g
29b20 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
29b30 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 61 69  (pPage, pCur->ai
29b40 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
29b50 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ));.    rc = mov
29b60 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70  eToChild(pCur, p
29b70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  gno);.  }.  retu
29b80 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
29b90 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
29ba0 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68  down to the righ
29bb0 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72  t-most leaf entr
29bc0 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a  y beneath the.**
29bd0 20 70 61 67 65 20 74 6f 20 77 68 69 63 68 20 69   page to which i
29be0 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
29bf0 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65  ointing.  Notice
29c00 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a   the difference.
29c10 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54  ** between moveT
29c20 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20  oLeftmost() and 
29c30 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
29c40 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  ).  moveToLeftmo
29c50 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68  st().** finds th
29c60 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72  e left-most entr
29c70 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65  y beneath the *e
29c80 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f  ntry* whereas mo
29c90 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a  veToRightmost().
29ca0 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69 67  ** finds the rig
29cb0 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65  ht-most entry be
29cc0 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a  neath the *page*
29cd0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68  ..**.** The righ
29ce0 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73 20  t-most entry is 
29cf0 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65  the one with the
29d00 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20 74   largest key - t
29d10 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69  he last.** key i
29d20 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
29d30 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
29d40 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
29d50 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
29d60 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20  {.  Pgno pgno;. 
29d70 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
29d80 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  _OK;.  MemPage *
29d90 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73  pPage = 0;..  as
29da0 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
29db0 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
29dc0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
29dd0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
29de0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c  _VALID );.  whil
29df0 65 28 20 21 28 70 50 61 67 65 20 3d 20 70 43 75  e( !(pPage = pCu
29e00 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
29e10 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b  iPage])->leaf ){
29e20 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34  .    pgno = get4
29e30 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
29e40 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
29e50 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75  set+8]);.    pCu
29e60 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
29e70 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e  Page] = pPage->n
29e80 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d  Cell;.    rc = m
29e90 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
29ea0 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20   pgno);.    if( 
29eb0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
29ec0 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 69 49 64    }.  pCur->aiId
29ed0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
29ee0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b   pPage->nCell-1;
29ef0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
29f00 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29  >info.nSize==0 )
29f10 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 43 75  ;.  assert( (pCu
29f20 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
29f30 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3d 3d 30  CF_ValidNKey)==0
29f40 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   );.  return SQL
29f50 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f  ITE_OK;.}../* Mo
29f60 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
29f70 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
29f80 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
29f90 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
29fa0 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  .** on success. 
29fb0 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20   Set *pRes to 0 
29fc0 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  if the cursor ac
29fd0 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f  tually points to
29fe0 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72   something.** or
29ff0 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20   set *pRes to 1 
2a000 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
2a010 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
2a020 6c 69 74 65 33 42 74 72 65 65 46 69 72 73 74 28  lite3BtreeFirst(
2a030 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
2a040 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
2a050 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
2a060 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
2a070 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
2a080 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2a090 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
2a0a0 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
2a0b0 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76  x) );.  rc = mov
2a0c0 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
2a0d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2a0e0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43  OK ){.    if( pC
2a0f0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2a100 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
2a110 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2a120 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c  ->pgnoRoot==0 ||
2a130 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2a140 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
2a150 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70  l==0 );.      *p
2a160 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  Res = 1;.    }el
2a170 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
2a180 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
2a190 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
2a1a0 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 2a 70  ll>0 );.      *p
2a1b0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
2a1c0 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  c = moveToLeftmo
2a1d0 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  st(pCur);.    }.
2a1e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2a1f0 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
2a200 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61  cursor to the la
2a210 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
2a220 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53  table.  Return S
2a230 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
2a240 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52  uccess.  Set *pR
2a250 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63  es to 0 if the c
2a260 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70  ursor actually p
2a270 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69  oints to somethi
2a280 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52  ng.** or set *pR
2a290 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74  es to 1 if the t
2a2a0 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
2a2b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
2a2c0 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72 20  eeLast(BtCursor 
2a2d0 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
2a2e0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20  ){.  int rc;. . 
2a2f0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
2a300 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
2a310 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2a320 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2a330 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
2a340 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  db->mutex) );.. 
2a350 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f   /* If the curso
2a360 72 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 73  r already points
2a370 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
2a380 72 79 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  ry, this is a no
2a390 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55  -op. */.  if( CU
2a3a0 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72  RSOR_VALID==pCur
2a3b0 2d 3e 65 53 74 61 74 65 20 26 26 20 28 70 43 75  ->eState && (pCu
2a3c0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
2a3d0 43 46 5f 41 74 4c 61 73 74 29 21 3d 30 20 29 7b  CF_AtLast)!=0 ){
2a3e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
2a3f0 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 69 73  EBUG.    /* This
2a400 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 74 6f   block serves to
2a410 20 61 73 73 65 72 74 28 29 20 74 68 61 74 20 74   assert() that t
2a420 68 65 20 63 75 72 73 6f 72 20 72 65 61 6c 6c 79  he cursor really
2a430 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20 20   does point .   
2a440 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73 74 20   ** to the last 
2a450 65 6e 74 72 79 20 69 6e 20 74 68 65 20 62 2d 74  entry in the b-t
2a460 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ree. */.    int 
2a470 69 69 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30  ii;.    for(ii=0
2a480 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50 61 67 65  ; ii<pCur->iPage
2a490 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61  ; ii++){.      a
2a4a0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
2a4b0 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70  dx[ii]==pCur->ap
2a4c0 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20  Page[ii]->nCell 
2a4d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
2a4e0 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
2a4f0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 70  [pCur->iPage]==p
2a500 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2a510 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d  ->iPage]->nCell-
2a520 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
2a530 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2a540 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66  ur->iPage]->leaf
2a550 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72   );.#endif.    r
2a560 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2a570 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76  .  }..  rc = mov
2a580 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
2a590 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2a5a0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 43 55  OK ){.    if( CU
2a5b0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43  RSOR_INVALID==pC
2a5c0 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
2a5d0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2a5e0 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c  ->pgnoRoot==0 ||
2a5f0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2a600 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
2a610 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70  l==0 );.      *p
2a620 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  Res = 1;.    }el
2a630 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
2a640 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2a650 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2a660 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
2a670 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
2a680 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72  ToRightmost(pCur
2a690 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
2a6a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2a6b0 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46        pCur->curF
2a6c0 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 41 74 4c  lags |= BTCF_AtL
2a6d0 61 73 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ast;.      }else
2a6e0 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
2a6f0 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43  curFlags &= ~BTC
2a700 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20 20 20  F_AtLast;.      
2a710 7d 0a 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a  }.   .    }.  }.
2a720 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2a730 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
2a740 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f  or so that it po
2a750 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79  ints to an entry
2a760 20 6e 65 61 72 20 74 68 65 20 6b 65 79 20 0a 2a   near the key .*
2a770 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  * specified by p
2a780 49 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79  IdxKey or intKey
2a790 2e 20 20 20 52 65 74 75 72 6e 20 61 20 73 75 63  .   Return a suc
2a7a0 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  cess code..**.**
2a7b0 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c   For INTKEY tabl
2a7c0 65 73 2c 20 74 68 65 20 69 6e 74 4b 65 79 20 70  es, the intKey p
2a7d0 61 72 61 6d 65 74 65 72 20 69 73 20 75 73 65 64  arameter is used
2a7e0 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d  .  pIdxKey .** m
2a7f0 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f  ust be NULL.  Fo
2a800 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20  r index tables, 
2a810 70 49 64 78 4b 65 79 20 69 73 20 75 73 65 64 20  pIdxKey is used 
2a820 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73  and intKey.** is
2a830 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   ignored..**.** 
2a840 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63  If an exact matc
2a850 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20  h is not found, 
2a860 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
2a870 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66  is always.** lef
2a880 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20  t pointing at a 
2a890 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20  leaf page which 
2a8a0 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65  would hold the e
2a8b0 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65  ntry if it.** we
2a8c0 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65  re present.  The
2a8d0 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f   cursor might po
2a8e0 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  int to an entry 
2a8f0 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65  that comes.** be
2a900 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74 68  fore or after th
2a910 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  e key..**.** An 
2a920 69 6e 74 65 67 65 72 20 69 73 20 77 72 69 74 74  integer is writt
2a930 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20 77 68  en into *pRes wh
2a940 69 63 68 20 69 73 20 74 68 65 20 72 65 73 75 6c  ich is the resul
2a950 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e  t of.** comparin
2a960 67 20 74 68 65 20 6b 65 79 20 77 69 74 68 20 74  g the key with t
2a970 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63  he entry to whic
2a980 68 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  h the cursor is 
2a990 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54  .** pointing.  T
2a9a0 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68  he meaning of th
2a9b0 65 20 69 6e 74 65 67 65 72 20 77 72 69 74 74 65  e integer writte
2a9c0 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20  n into.** *pRes 
2a9d0 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  is as follows:.*
2a9e0 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30  *.**     *pRes<0
2a9f0 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72        The cursor
2aa00 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
2aa10 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  g at an entry th
2aa20 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
2aa30 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65         is smalle
2aa40 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49  r than intKey/pI
2aa50 64 78 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20  dxKey or if the 
2aa60 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a  table is empty.*
2aa70 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
2aa80 20 20 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f     and the curso
2aa90 72 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c  r is therefore l
2aaa0 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74  eft point to not
2aab0 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  hing..**.**     
2aac0 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65  *pRes==0     The
2aad0 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
2aae0 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
2aaf0 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
2ab00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78                ex
2ab10 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 69 6e  actly matches in
2ab20 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a  tKey/pIdxKey..**
2ab30 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20  .**     *pRes>0 
2ab40 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
2ab50 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
2ab60 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
2ab70 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
2ab80 20 20 20 20 20 20 69 73 20 6c 61 72 67 65 72 20        is larger 
2ab90 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78  than intKey/pIdx
2aba0 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 69  Key..**.** For i
2abb0 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 74 68 65  ndex tables, the
2abc0 20 70 49 64 78 4b 65 79 2d 3e 65 71 53 65 65 6e   pIdxKey->eqSeen
2abd0 20 66 69 65 6c 64 20 69 73 20 73 65 74 20 74 6f   field is set to
2abe0 20 31 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 65   1 if there.** e
2abf0 78 69 73 74 73 20 61 6e 20 65 6e 74 72 79 20 69  xists an entry i
2ac00 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  n the table that
2ac10 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73   exactly matches
2ac20 20 70 49 64 78 4b 65 79 2e 20 20 0a 2a 2f 0a 69   pIdxKey.  .*/.i
2ac30 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d  nt sqlite3BtreeM
2ac40 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20  ovetoUnpacked(. 
2ac50 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
2ac60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2ac70 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f   cursor to be mo
2ac80 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  ved */.  Unpacke
2ac90 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79  dRecord *pIdxKey
2aca0 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e  , /* Unpacked in
2acb0 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34  dex key */.  i64
2acc0 20 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20   intKey,        
2acd0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62        /* The tab
2ace0 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  le key */.  int 
2acf0 62 69 61 73 52 69 67 68 74 2c 20 20 20 20 20 20  biasRight,      
2ad00 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c       /* If true,
2ad10 20 62 69 61 73 20 74 68 65 20 73 65 61 72 63 68   bias the search
2ad20 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64   to the high end
2ad30 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20   */.  int *pRes 
2ad40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ad50 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72  * Write search r
2ad60 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29  esults here */.)
2ad70 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 52 65  {.  int rc;.  Re
2ad80 63 6f 72 64 43 6f 6d 70 61 72 65 20 78 52 65 63  cordCompare xRec
2ad90 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 0a 20 20 61  ordCompare;..  a
2ada0 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
2adb0 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
2adc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
2add0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2ade0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
2adf0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
2ae00 73 65 72 74 28 20 70 52 65 73 20 29 3b 0a 20 20  sert( pRes );.  
2ae10 61 73 73 65 72 74 28 20 28 70 49 64 78 4b 65 79  assert( (pIdxKey
2ae20 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65  ==0)==(pCur->pKe
2ae30 79 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a 20 20 61  yInfo==0) );.  a
2ae40 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
2ae50 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
2ae60 44 20 7c 7c 20 28 70 49 64 78 4b 65 79 3d 3d 30  D || (pIdxKey==0
2ae70 29 3d 3d 28 70 43 75 72 2d 3e 63 75 72 49 6e 74  )==(pCur->curInt
2ae80 4b 65 79 21 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a  Key!=0) );..  /*
2ae90 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
2aea0 73 20 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69  s already positi
2aeb0 6f 6e 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e  oned at the poin
2aec0 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a  t we are trying.
2aed0 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c    ** to move to,
2aee0 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72   then just retur
2aef0 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20  n without doing 
2af00 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66  any work */.  if
2af10 28 20 70 49 64 78 4b 65 79 3d 3d 30 0a 20 20 20  ( pIdxKey==0.   
2af20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  && pCur->eState=
2af30 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 26 26  =CURSOR_VALID &&
2af40 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
2af50 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   & BTCF_ValidNKe
2af60 79 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 69  y)!=0.  ){.    i
2af70 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  f( pCur->info.nK
2af80 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ey==intKey ){.  
2af90 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
2afa0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2afb0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
2afc0 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46   if( (pCur->curF
2afd0 6c 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c 61  lags & BTCF_AtLa
2afe0 73 74 29 21 3d 30 20 26 26 20 70 43 75 72 2d 3e  st)!=0 && pCur->
2aff0 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79  info.nKey<intKey
2b000 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   ){.      *pRes 
2b010 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75  = -1;.      retu
2b020 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2b030 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
2b040 49 64 78 4b 65 79 20 29 7b 0a 20 20 20 20 78 52  IdxKey ){.    xR
2b050 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20 73  ecordCompare = s
2b060 71 6c 69 74 65 33 56 64 62 65 46 69 6e 64 43 6f  qlite3VdbeFindCo
2b070 6d 70 61 72 65 28 70 49 64 78 4b 65 79 29 3b 0a  mpare(pIdxKey);.
2b080 20 20 20 20 70 49 64 78 4b 65 79 2d 3e 65 72 72      pIdxKey->err
2b090 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 61 73  Code = 0;.    as
2b0a0 73 65 72 74 28 20 70 49 64 78 4b 65 79 2d 3e 64  sert( pIdxKey->d
2b0b0 65 66 61 75 6c 74 5f 72 63 3d 3d 31 20 0a 20 20  efault_rc==1 .  
2b0c0 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 4b 65         || pIdxKe
2b0d0 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 30  y->default_rc==0
2b0e0 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49   .         || pI
2b0f0 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72  dxKey->default_r
2b100 63 3d 3d 2d 31 0a 20 20 20 20 29 3b 0a 20 20 7d  c==-1.    );.  }
2b110 65 6c 73 65 7b 0a 20 20 20 20 78 52 65 63 6f 72  else{.    xRecor
2b120 64 43 6f 6d 70 61 72 65 20 3d 20 30 3b 20 2f 2a  dCompare = 0; /*
2b130 20 41 6c 6c 20 6b 65 79 73 20 61 72 65 20 69 6e   All keys are in
2b140 74 65 67 65 72 73 20 2a 2f 0a 20 20 7d 0a 0a 20  tegers */.  }.. 
2b150 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
2b160 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
2b170 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
2b180 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
2b190 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
2b1a0 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  =0 || pCur->apPa
2b1b0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
2b1c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2b1d0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c  r->pgnoRoot==0 |
2b1e0 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  | pCur->apPage[p
2b1f0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49  Cur->iPage]->isI
2b200 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nit );.  assert(
2b210 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2b220 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c  URSOR_INVALID ||
2b230 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2b240 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
2b250 6c 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75  l>0 );.  if( pCu
2b260 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2b270 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
2b280 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20   *pRes = -1;.   
2b290 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
2b2a0 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43  gnoRoot==0 || pC
2b2b0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2b2c0 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d  >iPage]->nCell==
2b2d0 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 );.    return 
2b2e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
2b2f0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
2b300 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
2b310 3d 3d 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65  ==pCur->curIntKe
2b320 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  y );.  assert( p
2b330 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 7c  Cur->curIntKey |
2b340 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20 66  | pIdxKey );.  f
2b350 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20  or(;;){.    int 
2b360 6c 77 72 2c 20 75 70 72 2c 20 69 64 78 2c 20 63  lwr, upr, idx, c
2b370 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50  ;.    Pgno chldP
2b380 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  g;.    MemPage *
2b390 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
2b3a0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2b3b0 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  ];.    u8 *pCell
2b3c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b3d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
2b3e0 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74  inter to current
2b3f0 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a   cell in pPage *
2b400 2f 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67 65 2d  /..    /* pPage-
2b410 3e 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65 20 67  >nCell must be g
2b420 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f  reater than zero
2b430 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
2b440 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a   root-page.    *
2b450 2a 20 74 68 65 20 63 75 72 73 6f 72 20 77 6f 75  * the cursor wou
2b460 6c 64 20 68 61 76 65 20 62 65 65 6e 20 49 4e 56  ld have been INV
2b470 41 4c 49 44 20 61 62 6f 76 65 20 61 6e 64 20 74  ALID above and t
2b480 68 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70  his for(;;) loop
2b490 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e  .    ** not run.
2b4a0 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   If this is not 
2b4b0 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c 20 74  the root-page, t
2b4c0 68 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f 43 68  hen the moveToCh
2b4d0 69 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a 20 20  ild() routine.  
2b4e0 20 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20    ** would have 
2b4f0 61 6c 72 65 61 64 79 20 64 65 74 65 63 74 65 64  already detected
2b500 20 64 62 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20   db corruption. 
2b510 53 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61 67 65  Similarly, pPage
2b520 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20   must.    ** be 
2b530 74 68 65 20 72 69 67 68 74 20 6b 69 6e 64 20 28  the right kind (
2b540 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 29 20  index or table) 
2b550 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  of b-tree page. 
2b560 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a 2a  Otherwise.    **
2b570 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29   a moveToChild()
2b580 20 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29   or moveToRoot()
2b590 20 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61 76 65   call would have
2b5a0 20 64 65 74 65 63 74 65 64 20 63 6f 72 72 75 70   detected corrup
2b5b0 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 73  tion.  */.    as
2b5c0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
2b5d0 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65  ll>0 );.    asse
2b5e0 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  rt( pPage->intKe
2b5f0 79 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30 29 20  y==(pIdxKey==0) 
2b600 29 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a  );.    lwr = 0;.
2b610 20 20 20 20 75 70 72 20 3d 20 70 50 61 67 65 2d      upr = pPage-
2b620 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 61 73  >nCell-1;.    as
2b630 73 65 72 74 28 20 62 69 61 73 52 69 67 68 74 3d  sert( biasRight=
2b640 3d 30 20 7c 7c 20 62 69 61 73 52 69 67 68 74 3d  =0 || biasRight=
2b650 3d 31 20 29 3b 0a 20 20 20 20 69 64 78 20 3d 20  =1 );.    idx = 
2b660 75 70 72 3e 3e 28 31 2d 62 69 61 73 52 69 67 68  upr>>(1-biasRigh
2b670 74 29 3b 20 2f 2a 20 69 64 78 20 3d 20 62 69 61  t); /* idx = bia
2b680 73 52 69 67 68 74 20 3f 20 75 70 72 20 3a 20 28  sRight ? upr : (
2b690 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20  lwr+upr)/2; */. 
2b6a0 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
2b6b0 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75  Cur->iPage] = (u
2b6c0 31 36 29 69 64 78 3b 0a 20 20 20 20 69 66 28 20  16)idx;.    if( 
2b6d0 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3d 3d  xRecordCompare==
2b6e0 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b  0 ){.      for(;
2b6f0 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20  ;){.        i64 
2b700 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  nCellKey;.      
2b710 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65    pCell = findCe
2b720 6c 6c 50 61 73 74 50 74 72 28 70 50 61 67 65 2c  llPastPtr(pPage,
2b730 20 69 64 78 29 3b 0a 20 20 20 20 20 20 20 20 69   idx);.        i
2b740 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
2b750 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  Leaf ){.        
2b760 20 20 77 68 69 6c 65 28 20 30 78 38 30 20 3c 3d    while( 0x80 <=
2b770 20 2a 28 70 43 65 6c 6c 2b 2b 29 20 29 7b 0a 20   *(pCell++) ){. 
2b780 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
2b790 43 65 6c 6c 3e 3d 70 50 61 67 65 2d 3e 61 44 61  Cell>=pPage->aDa
2b7a0 74 61 45 6e 64 20 29 20 72 65 74 75 72 6e 20 53  taEnd ) return S
2b7b0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2b7c0 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  PT;.          }.
2b7d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b7e0 20 20 67 65 74 56 61 72 69 6e 74 28 70 43 65 6c    getVarint(pCel
2b7f0 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b  l, (u64*)&nCellK
2b800 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ey);.        if(
2b810 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79   nCellKey<intKey
2b820 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77   ){.          lw
2b830 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20  r = idx+1;.     
2b840 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72       if( lwr>upr
2b850 20 29 7b 20 63 20 3d 20 2d 31 3b 20 62 72 65 61   ){ c = -1; brea
2b860 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c  k; }.        }el
2b870 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3e  se if( nCellKey>
2b880 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
2b890 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b      upr = idx-1;
2b8a0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c  .          if( l
2b8b0 77 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2b 31  wr>upr ){ c = +1
2b8c0 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20  ; break; }.     
2b8d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2b8e0 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c      assert( nCel
2b8f0 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 3b 0a  lKey==intKey );.
2b900 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
2b910 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2b920 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20  e] = (u16)idx;. 
2b930 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50           if( !pP
2b940 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2b950 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69           lwr = i
2b960 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  dx;.            
2b970 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 6e 65 78 74  goto moveto_next
2b980 5f 6c 61 79 65 72 3b 0a 20 20 20 20 20 20 20 20  _layer;.        
2b990 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2b9a0 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c       pCur->curFl
2b9b0 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69  ags |= BTCF_Vali
2b9c0 64 4e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20  dNKey;.         
2b9d0 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b     pCur->info.nK
2b9e0 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20  ey = nCellKey;. 
2b9f0 20 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d             pCur-
2ba00 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
2ba10 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 52  .            *pR
2ba20 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  es = 0;.        
2ba30 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2ba40 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
2ba50 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2ba60 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 2b      assert( lwr+
2ba70 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  upr>=0 );.      
2ba80 20 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72    idx = (lwr+upr
2ba90 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20  )>>1;  /* idx = 
2baa0 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a  (lwr+upr)/2; */.
2bab0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
2bac0 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29  e{.      for(;;)
2bad0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43  {.        int nC
2bae0 65 6c 6c 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66  ell;  /* Size of
2baf0 20 74 68 65 20 70 43 65 6c 6c 20 63 65 6c 6c 20   the pCell cell 
2bb00 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  in bytes */.    
2bb10 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
2bb20 43 65 6c 6c 50 61 73 74 50 74 72 28 70 50 61 67  CellPastPtr(pPag
2bb30 65 2c 20 69 64 78 29 3b 0a 0a 20 20 20 20 20 20  e, idx);..      
2bb40 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d    /* The maximum
2bb50 20 73 75 70 70 6f 72 74 65 64 20 70 61 67 65 2d   supported page-
2bb60 73 69 7a 65 20 69 73 20 36 35 35 33 36 20 62 79  size is 65536 by
2bb70 74 65 73 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  tes. This means 
2bb80 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
2bb90 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
2bba0 65 72 20 6f 66 20 72 65 63 6f 72 64 20 62 79 74  er of record byt
2bbb0 65 73 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20  es stored on an 
2bbc0 69 6e 64 65 78 20 42 2d 54 72 65 65 0a 20 20 20  index B-Tree.   
2bbd0 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20       ** page is 
2bbe0 6c 65 73 73 20 74 68 61 6e 20 31 36 33 38 34 20  less than 16384 
2bbf0 62 79 74 65 73 20 61 6e 64 20 6d 61 79 20 62 65  bytes and may be
2bc00 20 73 74 6f 72 65 64 20 61 73 20 61 20 32 2d 62   stored as a 2-b
2bc10 79 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 76  yte.        ** v
2bc20 61 72 69 6e 74 2e 20 54 68 69 73 20 69 6e 66 6f  arint. This info
2bc30 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  rmation is used 
2bc40 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61 76  to attempt to av
2bc50 6f 69 64 20 70 61 72 73 69 6e 67 20 0a 20 20 20  oid parsing .   
2bc60 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69       ** the enti
2bc70 72 65 20 63 65 6c 6c 20 62 79 20 63 68 65 63 6b  re cell by check
2bc80 69 6e 67 20 66 6f 72 20 74 68 65 20 63 61 73 65  ing for the case
2bc90 73 20 77 68 65 72 65 20 74 68 65 20 72 65 63 6f  s where the reco
2bca0 72 64 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a  rd is .        *
2bcb0 2a 20 73 74 6f 72 65 64 20 65 6e 74 69 72 65 6c  * stored entirel
2bcc0 79 20 77 69 74 68 69 6e 20 74 68 65 20 62 2d 74  y within the b-t
2bcd0 72 65 65 20 70 61 67 65 20 62 79 20 69 6e 73 70  ree page by insp
2bce0 65 63 74 69 6e 67 20 74 68 65 20 66 69 72 73 74  ecting the first
2bcf0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 32 20 62   .        ** 2 b
2bd00 79 74 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c  ytes of the cell
2bd10 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
2bd20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 43 65       nCell = pCe
2bd30 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69  ll[0];.        i
2bd40 66 28 20 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d  f( nCell<=pPage-
2bd50 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64  >max1bytePayload
2bd60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
2bd70 20 54 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e   This branch run
2bd80 73 20 69 66 20 74 68 65 20 72 65 63 6f 72 64 2d  s if the record-
2bd90 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68  size field of th
2bda0 65 20 63 65 6c 6c 20 69 73 20 61 0a 20 20 20 20  e cell is a.    
2bdb0 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20        ** single 
2bdc0 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20  byte varint and 
2bdd0 74 68 65 20 72 65 63 6f 72 64 20 66 69 74 73 20  the record fits 
2bde0 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20  entirely on the 
2bdf0 6d 61 69 6e 0a 20 20 20 20 20 20 20 20 20 20 2a  main.          *
2be00 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20  * b-tree page.  
2be10 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  */.          tes
2be20 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65  tcase( pCell+nCe
2be30 6c 6c 2b 31 3d 3d 70 50 61 67 65 2d 3e 61 44 61  ll+1==pPage->aDa
2be40 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20  taEnd );.       
2be50 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f     c = xRecordCo
2be60 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f  mpare(nCell, (vo
2be70 69 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20 70  id*)&pCell[1], p
2be80 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  IdxKey);.       
2be90 20 7d 65 6c 73 65 20 69 66 28 20 21 28 70 43 65   }else if( !(pCe
2bea0 6c 6c 5b 31 5d 20 26 20 30 78 38 30 29 20 0a 20  ll[1] & 0x80) . 
2beb0 20 20 20 20 20 20 20 20 20 26 26 20 28 6e 43 65           && (nCe
2bec0 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78 37  ll = ((nCell&0x7
2bed0 66 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b 31  f)<<7) + pCell[1
2bee0 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ])<=pPage->maxLo
2bef0 63 61 6c 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  cal.        ){. 
2bf00 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2bf10 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c  record-size fiel
2bf20 64 20 69 73 20 61 20 32 20 62 79 74 65 20 76 61  d is a 2 byte va
2bf30 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63  rint and the rec
2bf40 6f 72 64 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ord .          *
2bf50 2a 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20  * fits entirely 
2bf60 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d 74 72  on the main b-tr
2bf70 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20  ee page.  */.   
2bf80 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2bf90 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d   pCell+nCell+2==
2bfa0 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
2bfb0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  );.          c =
2bfc0 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28   xRecordCompare(
2bfd0 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70  nCell, (void*)&p
2bfe0 43 65 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79  Cell[2], pIdxKey
2bff0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
2c000 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
2c010 68 65 20 72 65 63 6f 72 64 20 66 6c 6f 77 73 20  he record flows 
2c020 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72  over onto one or
2c030 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70   more overflow p
2c040 61 67 65 73 2e 20 49 6e 0a 20 20 20 20 20 20 20  ages. In.       
2c050 20 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65 20     ** this case 
2c060 74 68 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e  the whole cell n
2c070 65 65 64 73 20 74 6f 20 62 65 20 70 61 72 73 65  eeds to be parse
2c080 64 2c 20 61 20 62 75 66 66 65 72 20 61 6c 6c 6f  d, a buffer allo
2c090 63 61 74 65 64 0a 20 20 20 20 20 20 20 20 20 20  cated.          
2c0a0 2a 2a 20 61 6e 64 20 61 63 63 65 73 73 50 61 79  ** and accessPay
2c0b0 6c 6f 61 64 28 29 20 75 73 65 64 20 74 6f 20 72  load() used to r
2c0c0 65 74 72 69 65 76 65 20 74 68 65 20 72 65 63 6f  etrieve the reco
2c0d0 72 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20  rd into the.    
2c0e0 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20        ** buffer 
2c0f0 62 65 66 6f 72 65 20 56 64 62 65 52 65 63 6f 72  before VdbeRecor
2c100 64 43 6f 6d 70 61 72 65 28 29 20 63 61 6e 20 62  dCompare() can b
2c110 65 20 63 61 6c 6c 65 64 2e 20 0a 20 20 20 20 20  e called. .     
2c120 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2c130 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65 63 6f    ** If the reco
2c140 72 64 20 69 73 20 63 6f 72 72 75 70 74 2c 20 74  rd is corrupt, t
2c150 68 65 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72  he xRecordCompar
2c160 65 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 72 65  e routine may re
2c170 61 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ad.          ** 
2c180 75 70 20 74 6f 20 74 77 6f 20 76 61 72 69 6e 74  up to two varint
2c190 73 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  s past the end o
2c1a0 66 20 74 68 65 20 62 75 66 66 65 72 2e 20 41 6e  f the buffer. An
2c1b0 20 65 78 74 72 61 20 31 38 20 0a 20 20 20 20 20   extra 18 .     
2c1c0 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66       ** bytes of
2c1d0 20 70 61 64 64 69 6e 67 20 69 73 20 61 6c 6c 6f   padding is allo
2c1e0 63 61 74 65 64 20 61 74 20 74 68 65 20 65 6e 64  cated at the end
2c1f0 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 69   of the buffer i
2c200 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  n.          ** c
2c210 61 73 65 20 74 68 69 73 20 68 61 70 70 65 6e 73  ase this happens
2c220 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
2c230 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a  void *pCellKey;.
2c240 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 20 63            u8 * c
2c250 6f 6e 73 74 20 70 43 65 6c 6c 42 6f 64 79 20 3d  onst pCellBody =
2c260 20 70 43 65 6c 6c 20 2d 20 70 50 61 67 65 2d 3e   pCell - pPage->
2c270 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
2c280 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78          pPage->x
2c290 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  ParseCell(pPage,
2c2a0 20 70 43 65 6c 6c 42 6f 64 79 2c 20 26 70 43 75   pCellBody, &pCu
2c2b0 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  r->info);.      
2c2c0 20 20 20 20 6e 43 65 6c 6c 20 3d 20 28 69 6e 74      nCell = (int
2c2d0 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79  )pCur->info.nKey
2c2e0 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
2c2f0 63 61 73 65 28 20 6e 43 65 6c 6c 3c 30 20 29 3b  case( nCell<0 );
2c300 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6b 65     /* True if ke
2c310 79 20 73 69 7a 65 20 69 73 20 32 5e 33 32 20 6f  y size is 2^32 o
2c320 72 20 6d 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20  r more */.      
2c330 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43      testcase( nC
2c340 65 6c 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20 49 6e  ell==0 );  /* In
2c350 76 61 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a 20  valid key size: 
2c360 20 30 78 38 30 20 30 78 38 30 20 30 78 30 30 20   0x80 0x80 0x00 
2c370 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  */.          tes
2c380 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 31 20  tcase( nCell==1 
2c390 29 3b 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6b  );  /* Invalid k
2c3a0 65 79 20 73 69 7a 65 3a 20 20 30 78 38 30 20 30  ey size:  0x80 0
2c3b0 78 38 30 20 30 78 30 31 20 2a 2f 0a 20 20 20 20  x80 0x01 */.    
2c3c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2c3d0 6e 43 65 6c 6c 3d 3d 32 20 29 3b 20 20 2f 2a 20  nCell==2 );  /* 
2c3e0 4d 69 6e 69 6d 75 6d 20 6c 65 67 61 6c 20 69 6e  Minimum legal in
2c3f0 64 65 78 20 6b 65 79 20 73 69 7a 65 20 2a 2f 0a  dex key size */.
2c400 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 43            if( nC
2c410 65 6c 6c 3c 32 20 29 7b 0a 20 20 20 20 20 20 20  ell<2 ){.       
2c420 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2c430 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2c440 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
2c450 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
2c460 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2c470 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20       pCellKey = 
2c480 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e  sqlite3Malloc( n
2c490 43 65 6c 6c 2b 31 38 20 29 3b 0a 20 20 20 20 20  Cell+18 );.     
2c4a0 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65       if( pCellKe
2c4b0 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  y==0 ){.        
2c4c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2c4d0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
2c4e0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
2c4f0 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
2c500 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2c510 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
2c520 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
2c530 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20  6)idx;.         
2c540 20 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c   rc = accessPayl
2c550 6f 61 64 28 70 43 75 72 2c 20 30 2c 20 6e 43 65  oad(pCur, 0, nCe
2c560 6c 6c 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  ll, (unsigned ch
2c570 61 72 2a 29 70 43 65 6c 6c 4b 65 79 2c 20 32 29  ar*)pCellKey, 2)
2c580 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2c590 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
2c5a0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
2c5b0 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
2c5c0 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
2c5d0 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20  o_finish;.      
2c5e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2c5f0 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61  c = xRecordCompa
2c600 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b  re(nCell, pCellK
2c610 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  ey, pIdxKey);.  
2c620 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2c630 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a  free(pCellKey);.
2c640 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c650 20 20 61 73 73 65 72 74 28 20 0a 20 20 20 20 20    assert( .     
2c660 20 20 20 20 20 20 20 28 70 49 64 78 4b 65 79 2d         (pIdxKey-
2c670 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
2c680 5f 43 4f 52 52 55 50 54 20 7c 7c 20 63 3d 3d 30  _CORRUPT || c==0
2c690 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70  ).         && (p
2c6a0 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21  IdxKey->errCode!
2c6b0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c  =SQLITE_NOMEM ||
2c6c0 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64   pCur->pBtree->d
2c6d0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29  b->mallocFailed)
2c6e0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
2c6f0 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20      if( c<0 ){. 
2c700 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69           lwr = i
2c710 64 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 65  dx+1;.        }e
2c720 6c 73 65 20 69 66 28 20 63 3e 30 20 29 7b 0a 20  lse if( c>0 ){. 
2c730 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69           upr = i
2c740 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65  dx-1;.        }e
2c750 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61  lse{.          a
2c760 73 73 65 72 74 28 20 63 3d 3d 30 20 29 3b 0a 20  ssert( c==0 );. 
2c770 20 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d           *pRes =
2c780 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   0;.          rc
2c790 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2c7a0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69          pCur->ai
2c7b0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2c7c0 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20   = (u16)idx;.   
2c7d0 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 4b         if( pIdxK
2c7e0 65 79 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 63  ey->errCode ) rc
2c7f0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
2c800 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  T;.          got
2c810 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
2c820 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2c830 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29     if( lwr>upr )
2c840 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2c850 61 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72 3e  assert( lwr+upr>
2c860 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 64  =0 );.        id
2c870 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31  x = (lwr+upr)>>1
2c880 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72  ;  /* idx = (lwr
2c890 2b 75 70 72 29 2f 32 20 2a 2f 0a 20 20 20 20 20  +upr)/2 */.     
2c8a0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
2c8b0 65 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20  ert( lwr==upr+1 
2c8c0 7c 7c 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65  || (pPage->intKe
2c8d0 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61  y && !pPage->lea
2c8e0 66 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  f) );.    assert
2c8f0 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
2c900 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
2c910 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
2c920 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
2c930 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2c940 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  <pCur->apPage[pC
2c950 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
2c960 6c 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  l );.      pCur-
2c970 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2c980 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a  ge] = (u16)idx;.
2c990 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 63 3b        *pRes = c;
2c9a0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
2c9b0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74  TE_OK;.      got
2c9c0 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
2c9d0 0a 20 20 20 20 7d 0a 6d 6f 76 65 74 6f 5f 6e 65  .    }.moveto_ne
2c9e0 78 74 5f 6c 61 79 65 72 3a 0a 20 20 20 20 69 66  xt_layer:.    if
2c9f0 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43  ( lwr>=pPage->nC
2ca00 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 6c  ell ){.      chl
2ca10 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 26  dPg = get4byte(&
2ca20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
2ca30 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
2ca40 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2ca50 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74      chldPg = get
2ca60 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
2ca70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20  Page, lwr));.   
2ca80 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49   }.    pCur->aiI
2ca90 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
2caa0 3d 20 28 75 31 36 29 6c 77 72 3b 0a 20 20 20 20  = (u16)lwr;.    
2cab0 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
2cac0 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a  (pCur, chldPg);.
2cad0 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65      if( rc ) bre
2cae0 61 6b 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66  ak;.  }.moveto_f
2caf0 69 6e 69 73 68 3a 0a 20 20 70 43 75 72 2d 3e 69  inish:.  pCur->i
2cb00 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
2cb10 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e   assert( (pCur->
2cb20 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
2cb30 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 3b  ValidOvfl)==0 );
2cb40 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2cb50 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
2cb60 52 55 45 20 69 66 20 74 68 65 20 63 75 72 73 6f  RUE if the curso
2cb70 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e  r is not pointin
2cb80 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66  g at an entry of
2cb90 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a   the table..**.*
2cba0 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72  * TRUE will be r
2cbb0 65 74 75 72 6e 65 64 20 61 66 74 65 72 20 61 20  eturned after a 
2cbc0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
2cbd0 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73  treeNext() moves
2cbe0 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73  .** past the las
2cbf0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
2cc00 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42  able or sqlite3B
2cc10 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73  treePrev() moves
2cc20 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72   past.** the fir
2cc30 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20  st entry.  TRUE 
2cc40 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64  is also returned
2cc50 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
2cc60 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
2cc70 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28 42  qlite3BtreeEof(B
2cc80 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
2cc90 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20    /* TODO: What 
2cca0 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
2ccb0 20 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49   in CURSOR_REQUI
2ccc0 52 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74  RESEEK but all t
2ccd0 61 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a  able entries.  *
2cce0 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65  * have been dele
2ccf0 74 65 64 3f 20 54 68 69 73 20 41 50 49 20 77 69  ted? This API wi
2cd00 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67  ll need to chang
2cd10 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65  e to return an e
2cd20 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61  rror code.  ** a
2cd30 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f  s well as the bo
2cd40 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c  olean result val
2cd50 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72  ue..  */.  retur
2cd60 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21  n (CURSOR_VALID!
2cd70 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a  =pCur->eState);.
2cd80 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  }../*.** Advance
2cd90 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
2cda0 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e  he next entry in
2cdb0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
2cdc0 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  If.** successful
2cdd0 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
2cde0 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  0.  If the curso
2cdf0 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79  r.** was already
2ce00 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
2ce10 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
2ce20 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  he database befo
2ce30 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  re.** this routi
2ce40 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74  ne was called, t
2ce50 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e  hen set *pRes=1.
2ce60 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20  .**.** The main 
2ce70 65 6e 74 72 79 20 70 6f 69 6e 74 20 69 73 20 73  entry point is s
2ce80 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
2ce90 29 2e 20 20 54 68 61 74 20 72 6f 75 74 69 6e 65  ).  That routine
2cea0 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a   is optimized.**
2ceb0 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20   for the common 
2cec0 63 61 73 65 20 6f 66 20 6d 65 72 65 6c 79 20 69  case of merely i
2ced0 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20  ncrementing the 
2cee0 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74 43  cell counter BtC
2cef0 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74  ursor.aiIdx.** t
2cf00 6f 20 74 68 65 20 6e 65 78 74 20 63 65 6c 6c 20  o the next cell 
2cf10 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  on the current p
2cf20 61 67 65 2e 20 20 54 68 65 20 28 73 6c 6f 77 65  age.  The (slowe
2cf30 72 29 20 62 74 72 65 65 4e 65 78 74 28 29 20 68  r) btreeNext() h
2cf40 65 6c 70 65 72 0a 2a 2a 20 72 6f 75 74 69 6e 65  elper.** routine
2cf50 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
2cf60 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  it is necessary 
2cf70 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64 69 66  to move to a dif
2cf80 66 65 72 65 6e 74 20 70 61 67 65 20 6f 72 0a 2a  ferent page or.*
2cf90 2a 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  * to restore the
2cfa0 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54   cursor..**.** T
2cfb0 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
2cfc0 69 6f 6e 20 77 69 6c 6c 20 73 65 74 20 2a 70 52  ion will set *pR
2cfd0 65 73 20 74 6f 20 30 20 6f 72 20 31 2e 20 20 54  es to 0 or 1.  T
2cfe0 68 65 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73  he initial *pRes
2cff0 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62   value.** will b
2d000 65 20 31 20 69 66 20 74 68 65 20 63 75 72 73 6f  e 1 if the curso
2d010 72 20 62 65 69 6e 67 20 73 74 65 70 70 65 64 20  r being stepped 
2d020 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61  corresponds to a
2d030 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 0a  n SQL index and.
2d040 2a 2a 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  ** if this routi
2d050 6e 65 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65  ne could have be
2d060 65 6e 20 73 6b 69 70 70 65 64 20 69 66 20 74 68  en skipped if th
2d070 61 74 20 53 51 4c 20 69 6e 64 65 78 20 68 61 64  at SQL index had
2d080 20 62 65 65 6e 0a 2a 2a 20 61 20 75 6e 69 71 75   been.** a uniqu
2d090 65 20 69 6e 64 65 78 2e 20 20 4f 74 68 65 72 77  e index.  Otherw
2d0a0 69 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20 77  ise the caller w
2d0b0 69 6c 6c 20 68 61 76 65 20 73 65 74 20 2a 70 52  ill have set *pR
2d0c0 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a  es to zero..** Z
2d0d0 65 72 6f 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f  ero is the commo
2d0e0 6e 20 63 61 73 65 2e 20 54 68 65 20 62 74 72 65  n case. The btre
2d0f0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
2d100 20 69 73 20 66 72 65 65 20 74 6f 20 75 73 65 20   is free to use 
2d110 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 2a  the.** initial *
2d120 70 52 65 73 20 76 61 6c 75 65 20 61 73 20 61 20  pRes value as a 
2d130 68 69 6e 74 20 74 6f 20 69 6d 70 72 6f 76 65 20  hint to improve 
2d140 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20 62 75 74  performance, but
2d150 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
2d160 53 51 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70  SQLite btree imp
2d170 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73  lementation does
2d180 20 6e 6f 74 2e 20 28 4e 6f 74 65 20 74 68 61 74   not. (Note that
2d190 20 74 68 65 20 63 6f 6d 64 62 32 20 62 74 72 65   the comdb2 btre
2d1a0 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  e.** implementat
2d1b0 69 6f 6e 20 64 6f 65 73 20 75 73 65 20 74 68 69  ion does use thi
2d1c0 73 20 68 69 6e 74 2c 20 68 6f 77 65 76 65 72 2e  s hint, however.
2d1d0 29 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49  ).*/.static SQLI
2d1e0 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20  TE_NOINLINE int 
2d1f0 62 74 72 65 65 4e 65 78 74 28 42 74 43 75 72 73  btreeNext(BtCurs
2d200 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
2d210 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
2d220 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d    int idx;.  Mem
2d230 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20  Page *pPage;..  
2d240 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
2d250 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
2d260 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2d270 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20  ur->skipNext==0 
2d280 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  || pCur->eState!
2d290 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
2d2a0 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52 65 73  .  assert( *pRes
2d2b0 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75  ==0 );.  if( pCu
2d2c0 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2d2d0 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 61  R_VALID ){.    a
2d2e0 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75  ssert( (pCur->cu
2d2f0 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
2d300 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a 20  lidOvfl)==0 );. 
2d310 20 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43     rc = restoreC
2d320 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
2d330 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ur);.    if( rc!
2d340 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2d350 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2d360 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52     }.    if( CUR
2d370 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75  SOR_INVALID==pCu
2d380 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  r->eState ){.   
2d390 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
2d3a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2d3b0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
2d3c0 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  if( pCur->skipNe
2d3d0 78 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  xt ){.      asse
2d3e0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
2d3f0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c  ==CURSOR_VALID |
2d400 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  | pCur->eState==
2d410 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
2d420 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65  );.      pCur->e
2d430 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56  State = CURSOR_V
2d440 41 4c 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20  ALID;.      if( 
2d450 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3e 30  pCur->skipNext>0
2d460 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
2d470 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a  ->skipNext = 0;.
2d480 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2d490 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2d4a0 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b  }.      pCur->sk
2d4b0 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  ipNext = 0;.    
2d4c0 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d  }.  }..  pPage =
2d4d0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2d4e0 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64  ur->iPage];.  id
2d4f0 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64  x = ++pCur->aiId
2d500 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  x[pCur->iPage];.
2d510 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2d520 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20 20 2f 2a  >isInit );..  /*
2d530 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
2d540 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74   file is corrupt
2d550 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  , it is possible
2d560 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 6f   for the value o
2d570 66 20 69 64 78 20 0a 20 20 2a 2a 20 74 6f 20 62  f idx .  ** to b
2d580 65 20 69 6e 76 61 6c 69 64 20 68 65 72 65 2e 20  e invalid here. 
2d590 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63  This can only oc
2d5a0 63 75 72 20 69 66 20 61 20 73 65 63 6f 6e 64 20  cur if a second 
2d5b0 63 75 72 73 6f 72 20 6d 6f 64 69 66 69 65 73 0a  cursor modifies.
2d5c0 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 77 68    ** the page wh
2d5d0 69 6c 65 20 63 75 72 73 6f 72 20 70 43 75 72 20  ile cursor pCur 
2d5e0 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 72 65 66  is holding a ref
2d5f0 65 72 65 6e 63 65 20 74 6f 20 69 74 2e 20 57 68  erence to it. Wh
2d600 69 63 68 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c  ich can.  ** onl
2d610 79 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20  y happen if the 
2d620 64 61 74 61 62 61 73 65 20 69 73 20 63 6f 72 72  database is corr
2d630 75 70 74 20 69 6e 20 73 75 63 68 20 61 20 77 61  upt in such a wa
2d640 79 20 61 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65  y as to link the
2d650 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 74 6f 20  .  ** page into 
2d660 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 2d  more than one b-
2d670 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e 20  tree structure. 
2d680 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 69  */.  testcase( i
2d690 64 78 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  dx>pPage->nCell 
2d6a0 29 3b 0a 0a 20 20 69 66 28 20 69 64 78 3e 3d 70  );..  if( idx>=p
2d6b0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  Page->nCell ){. 
2d6c0 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
2d6d0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20  eaf ){.      rc 
2d6e0 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
2d6f0 75 72 2c 20 67 65 74 34 62 79 74 65 28 26 70 50  ur, get4byte(&pP
2d700 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
2d710 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29  ->hdrOffset+8]))
2d720 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
2d730 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2d740 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c    return moveToL
2d750 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
2d760 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20     }.    do{.   
2d770 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61     if( pCur->iPa
2d780 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ge==0 ){.       
2d790 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
2d7a0 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
2d7b0 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
2d7c0 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  D;.        retur
2d7d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
2d7e0 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54     }.      moveT
2d7f0 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20  oParent(pCur);. 
2d800 20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75       pPage = pCu
2d810 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2d820 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68 69  iPage];.    }whi
2d830 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  le( pCur->aiIdx[
2d840 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 50  pCur->iPage]>=pP
2d850 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
2d860 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
2d870 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74  Key ){.      ret
2d880 75 72 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65  urn sqlite3Btree
2d890 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65 73 29  Next(pCur, pRes)
2d8a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2d8b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2d8c0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
2d8d0 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
2d8e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2d8f0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
2d900 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 6f  e{.    return mo
2d910 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
2d920 72 29 3b 0a 20 20 7d 0a 7d 0a 69 6e 74 20 73 71  r);.  }.}.int sq
2d930 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 42  lite3BtreeNext(B
2d940 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
2d950 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 4d 65 6d  nt *pRes){.  Mem
2d960 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 61  Page *pPage;.  a
2d970 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
2d980 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
2d990 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65  );.  assert( pRe
2d9a0 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  s!=0 );.  assert
2d9b0 28 20 2a 70 52 65 73 3d 3d 30 20 7c 7c 20 2a 70  ( *pRes==0 || *p
2d9c0 52 65 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  Res==1 );.  asse
2d9d0 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  rt( pCur->skipNe
2d9e0 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65  xt==0 || pCur->e
2d9f0 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
2da00 4c 49 44 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69  LID );.  pCur->i
2da10 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
2da20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
2da30 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e  &= ~(BTCF_ValidN
2da40 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
2da50 66 6c 29 3b 0a 20 20 2a 70 52 65 73 20 3d 20 30  fl);.  *pRes = 0
2da60 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
2da70 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
2da80 49 44 20 29 20 72 65 74 75 72 6e 20 62 74 72 65  ID ) return btre
2da90 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65 73  eNext(pCur, pRes
2daa0 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  );.  pPage = pCu
2dab0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2dac0 69 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 28 2b  iPage];.  if( (+
2dad0 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75  +pCur->aiIdx[pCu
2dae0 72 2d 3e 69 50 61 67 65 5d 29 3e 3d 70 50 61 67  r->iPage])>=pPag
2daf0 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  e->nCell ){.    
2db00 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2db10 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20  ->iPage]--;.    
2db20 72 65 74 75 72 6e 20 62 74 72 65 65 4e 65 78 74  return btreeNext
2db30 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20  (pCur, pRes);.  
2db40 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c  }.  if( pPage->l
2db50 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72  eaf ){.    retur
2db60 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
2db70 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
2db80 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
2db90 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  pCur);.  }.}../*
2dba0 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 63 75 72  .** Step the cur
2dbb0 73 6f 72 20 74 6f 20 74 68 65 20 62 61 63 6b 20  sor to the back 
2dbc0 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  to the previous 
2dbd0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
2dbe0 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75  abase.  If.** su
2dbf0 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65  ccessful then se
2dc00 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74  t *pRes=0.  If t
2dc10 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73  he cursor.** was
2dc20 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e   already pointin
2dc30 67 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  g to the first e
2dc40 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
2dc50 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74  base before.** t
2dc60 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
2dc70 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74  called, then set
2dc80 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20   *pRes=1..**.** 
2dc90 54 68 65 20 6d 61 69 6e 20 65 6e 74 72 79 20 70  The main entry p
2dca0 6f 69 6e 74 20 69 73 20 73 71 6c 69 74 65 33 42  oint is sqlite3B
2dcb0 74 72 65 65 50 72 65 76 69 6f 75 73 28 29 2e 20  treePrevious(). 
2dcc0 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20 69 73   That routine is
2dcd0 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f   optimized.** fo
2dce0 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  r the common cas
2dcf0 65 20 6f 66 20 6d 65 72 65 6c 79 20 64 65 63 72  e of merely decr
2dd00 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 65 6c  ementing the cel
2dd10 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75 72 73  l counter BtCurs
2dd20 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74  or.aiIdx.** to t
2dd30 68 65 20 70 72 65 76 69 6f 75 73 20 63 65 6c 6c  he previous cell
2dd40 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
2dd50 70 61 67 65 2e 20 20 54 68 65 20 28 73 6c 6f 77  page.  The (slow
2dd60 65 72 29 20 62 74 72 65 65 50 72 65 76 69 6f 75  er) btreePreviou
2dd70 73 28 29 0a 2a 2a 20 68 65 6c 70 65 72 20 72 6f  s().** helper ro
2dd80 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
2dd90 77 68 65 6e 20 69 74 20 69 73 20 6e 65 63 65 73  when it is neces
2dda0 73 61 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20  sary to move to 
2ddb0 61 20 64 69 66 66 65 72 65 6e 74 20 70 61 67 65  a different page
2ddc0 0a 2a 2a 20 6f 72 20 74 6f 20 72 65 73 74 6f 72  .** or to restor
2ddd0 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a  e the cursor..**
2dde0 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  .** The calling 
2ddf0 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73 65  function will se
2de00 74 20 2a 70 52 65 73 20 74 6f 20 30 20 6f 72 20  t *pRes to 0 or 
2de10 31 2e 20 20 54 68 65 20 69 6e 69 74 69 61 6c 20  1.  The initial 
2de20 2a 70 52 65 73 20 76 61 6c 75 65 0a 2a 2a 20 77  *pRes value.** w
2de30 69 6c 6c 20 62 65 20 31 20 69 66 20 74 68 65 20  ill be 1 if the 
2de40 63 75 72 73 6f 72 20 62 65 69 6e 67 20 73 74 65  cursor being ste
2de50 70 70 65 64 20 63 6f 72 72 65 73 70 6f 6e 64 73  pped corresponds
2de60 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78   to an SQL index
2de70 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68 69 73 20   and.** if this 
2de80 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61  routine could ha
2de90 76 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64 20  ve been skipped 
2dea0 69 66 20 74 68 61 74 20 53 51 4c 20 69 6e 64 65  if that SQL inde
2deb0 78 20 68 61 64 20 62 65 65 6e 0a 2a 2a 20 61 20  x had been.** a 
2dec0 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20 4f  unique index.  O
2ded0 74 68 65 72 77 69 73 65 20 74 68 65 20 63 61 6c  therwise the cal
2dee0 6c 65 72 20 77 69 6c 6c 20 68 61 76 65 20 73 65  ler will have se
2def0 74 20 2a 70 52 65 73 20 74 6f 20 7a 65 72 6f 2e  t *pRes to zero.
2df00 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 74 68 65 20  .** Zero is the 
2df10 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 20 54 68 65  common case. The
2df20 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74   btree implement
2df30 61 74 69 6f 6e 20 69 73 20 66 72 65 65 20 74 6f  ation is free to
2df40 20 75 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74   use the.** init
2df50 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 20  ial *pRes value 
2df60 61 73 20 61 20 68 69 6e 74 20 74 6f 20 69 6d 70  as a hint to imp
2df70 72 6f 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65  rove performance
2df80 2c 20 62 75 74 20 74 68 65 20 63 75 72 72 65 6e  , but the curren
2df90 74 0a 2a 2a 20 53 51 4c 69 74 65 20 62 74 72 65  t.** SQLite btre
2dfa0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
2dfb0 20 64 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f 74 65   does not. (Note
2dfc0 20 74 68 61 74 20 74 68 65 20 63 6f 6d 64 62 32   that the comdb2
2dfd0 20 62 74 72 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d   btree.** implem
2dfe0 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 75 73  entation does us
2dff0 65 20 74 68 69 73 20 68 69 6e 74 2c 20 68 6f 77  e this hint, how
2e000 65 76 65 72 2e 29 0a 2a 2f 0a 73 74 61 74 69 63  ever.).*/.static
2e010 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
2e020 20 69 6e 74 20 62 74 72 65 65 50 72 65 76 69 6f   int btreePrevio
2e030 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  us(BtCursor *pCu
2e040 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
2e050 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61   int rc;.  MemPa
2e060 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73  ge *pPage;..  as
2e070 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
2e080 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
2e090 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73  ;.  assert( pRes
2e0a0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
2e0b0 20 2a 70 52 65 73 3d 3d 30 20 29 3b 0a 20 20 61   *pRes==0 );.  a
2e0c0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69  ssert( pCur->ski
2e0d0 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72  pNext==0 || pCur
2e0e0 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
2e0f0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
2e100 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  rt( (pCur->curFl
2e110 61 67 73 20 26 20 28 42 54 43 46 5f 41 74 4c 61  ags & (BTCF_AtLa
2e120 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  st|BTCF_ValidOvf
2e130 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  l|BTCF_ValidNKey
2e140 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ))==0 );.  asser
2e150 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  t( pCur->info.nS
2e160 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ize==0 );.  if( 
2e170 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
2e180 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
2e190 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
2e1a0 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
2e1b0 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
2e1c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2e1d0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2e1e0 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53    }.    if( CURS
2e1f0 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
2e200 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
2e210 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
2e220 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2e230 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  _OK;.    }.    i
2e240 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  f( pCur->skipNex
2e250 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t ){.      asser
2e260 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
2e270 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c  =CURSOR_VALID ||
2e280 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2e290 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29  URSOR_SKIPNEXT )
2e2a0 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53  ;.      pCur->eS
2e2b0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41  tate = CURSOR_VA
2e2c0 4c 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70  LID;.      if( p
2e2d0 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20  Cur->skipNext<0 
2e2e0 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
2e2f0 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20  >skipNext = 0;. 
2e300 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2e310 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
2e320 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69  .      pCur->ski
2e330 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d  pNext = 0;.    }
2e340 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20  .  }..  pPage = 
2e350 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2e360 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73  r->iPage];.  ass
2e370 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
2e380 69 74 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61  it );.  if( !pPa
2e390 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2e3a0 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e  int idx = pCur->
2e3b0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2e3c0 65 5d 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  e];.    rc = mov
2e3d0 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67  eToChild(pCur, g
2e3e0 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
2e3f0 28 70 50 61 67 65 2c 20 69 64 78 29 29 29 3b 0a  (pPage, idx)));.
2e400 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
2e410 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  urn rc;.    rc =
2e420 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
2e430 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  (pCur);.  }else{
2e440 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 75 72  .    while( pCur
2e450 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2e460 61 67 65 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  age]==0 ){.     
2e470 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
2e480 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
2e490 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
2e4a0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
2e4b0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
2e4c0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2e4d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2e4e0 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50   }.      moveToP
2e4f0 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20  arent(pCur);.   
2e500 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
2e510 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d  Cur->info.nSize=
2e520 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
2e530 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
2e540 73 20 26 20 28 42 54 43 46 5f 56 61 6c 69 64 4f  s & (BTCF_ValidO
2e550 76 66 6c 29 29 3d 3d 30 20 29 3b 0a 0a 20 20 20  vfl))==0 );..   
2e560 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2e570 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20  r->iPage]--;.   
2e580 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
2e590 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2e5a0 65 5d 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  e];.    if( pPag
2e5b0 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50  e->intKey && !pP
2e5c0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2e5d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
2e5e0 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75  treePrevious(pCu
2e5f0 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65  r, pRes);.    }e
2e600 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
2e610 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
2e620 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2e630 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  ;.}.int sqlite3B
2e640 74 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43  treePrevious(BtC
2e650 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
2e660 20 2a 70 52 65 73 29 7b 0a 20 20 61 73 73 65 72   *pRes){.  asser
2e670 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
2e680 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
2e690 20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d 30   assert( pRes!=0
2e6a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70   );.  assert( *p
2e6b0 52 65 73 3d 3d 30 20 7c 7c 20 2a 70 52 65 73 3d  Res==0 || *pRes=
2e6c0 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
2e6d0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d  pCur->skipNext==
2e6e0 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  0 || pCur->eStat
2e6f0 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
2e700 29 3b 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  );.  *pRes = 0;.
2e710 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
2e720 20 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61 73   &= ~(BTCF_AtLas
2e730 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  t|BTCF_ValidOvfl
2e740 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29  |BTCF_ValidNKey)
2e750 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
2e760 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  Size = 0;.  if( 
2e770 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
2e780 52 53 4f 52 5f 56 41 4c 49 44 0a 20 20 20 7c 7c  RSOR_VALID.   ||
2e790 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2e7a0 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 0a 20 20 20  r->iPage]==0.   
2e7b0 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
2e7c0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65  pCur->iPage]->le
2e7d0 61 66 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72  af==0.  ){.    r
2e7e0 65 74 75 72 6e 20 62 74 72 65 65 50 72 65 76 69  eturn btreePrevi
2e7f0 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b  ous(pCur, pRes);
2e800 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 69 49  .  }.  pCur->aiI
2e810 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  dx[pCur->iPage]-
2e820 2d 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  -;.  return SQLI
2e830 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
2e840 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70  Allocate a new p
2e850 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74  age from the dat
2e860 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
2e870 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 69  * The new page i
2e880 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74  s marked as dirt
2e890 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f  y.  (In other wo
2e8a0 72 64 73 2c 20 73 71 6c 69 74 65 33 50 61 67 65  rds, sqlite3Page
2e8b0 72 57 72 69 74 65 28 29 0a 2a 2a 20 68 61 73 20  rWrite().** has 
2e8c0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
2e8d0 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20 70  led on the new p
2e8e0 61 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20 70  age.)  The new p
2e8f0 61 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20  age has also.** 
2e900 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64 20  been referenced 
2e910 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  and the calling 
2e920 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70 6f  routine is respo
2e930 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69  nsible for calli
2e940 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  ng.** sqlite3Pag
2e950 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65  erUnref() on the
2e960 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20 69   new page when i
2e970 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a  t is done..**.**
2e980 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
2e990 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73  turned on succes
2e9a0 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65  s.  Any other re
2e9b0 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63  turn value indic
2e9c0 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  ates.** an error
2e9d0 2e 20 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  .  *ppPage is se
2e9e0 74 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 74 68 65  t to NULL in the
2e9f0 20 65 76 65 6e 74 20 6f 66 20 61 6e 20 65 72 72   event of an err
2ea00 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  or..**.** If the
2ea10 20 22 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65   "nearby" parame
2ea20 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68  ter is not 0, th
2ea30 65 6e 20 61 6e 20 65 66 66 6f 72 74 20 69 73 20  en an effort is 
2ea40 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61  made to .** loca
2ea50 74 65 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20  te a page close 
2ea60 74 6f 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  to the page numb
2ea70 65 72 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68  er "nearby".  Th
2ea80 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 69  is can be used i
2ea90 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20  n an.** attempt 
2eaa0 74 6f 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20  to keep related 
2eab0 70 61 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65  pages close to e
2eac0 61 63 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65  ach other in the
2ead0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a   database file,.
2eae0 2a 2a 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e  ** which in turn
2eaf0 20 63 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61   can make databa
2eb00 73 65 20 61 63 63 65 73 73 20 66 61 73 74 65 72  se access faster
2eb10 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
2eb20 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20 69  Mode parameter i
2eb30 73 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20  s BTALLOC_EXACT 
2eb40 61 6e 64 20 74 68 65 20 6e 65 61 72 62 79 20 70  and the nearby p
2eb50 61 67 65 20 65 78 69 73 74 73 0a 2a 2a 20 61 6e  age exists.** an
2eb60 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72  ywhere on the fr
2eb70 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69 74  ee-list, then it
2eb80 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
2eb90 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20  o be returned.  
2eba0 49 66 0a 2a 2a 20 65 4d 6f 64 65 20 69 73 20 42  If.** eMode is B
2ebb0 54 41 4c 4c 4f 43 5f 4c 54 20 74 68 65 6e 20 74  TALLOC_LT then t
2ebc0 68 65 20 70 61 67 65 20 72 65 74 75 72 6e 65 64  he page returned
2ebd0 20 77 69 6c 6c 20 62 65 20 6c 65 73 73 20 74 68   will be less th
2ebe0 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74  an or equal.** t
2ebf0 6f 20 6e 65 61 72 62 79 20 69 66 20 61 6e 79 20  o nearby if any 
2ec00 73 75 63 68 20 70 61 67 65 20 65 78 69 73 74 73  such page exists
2ec10 2e 20 20 49 66 20 65 4d 6f 64 65 20 69 73 20 42  .  If eMode is B
2ec20 54 41 4c 4c 4f 43 5f 41 4e 59 20 74 68 65 6e 20  TALLOC_ANY then 
2ec30 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
2ec40 72 65 73 74 72 69 63 74 69 6f 6e 73 20 6f 6e 20  restrictions on 
2ec50 77 68 69 63 68 20 70 61 67 65 20 69 73 20 72 65  which page is re
2ec60 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
2ec70 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74  c int allocateBt
2ec80 72 65 65 50 61 67 65 28 0a 20 20 42 74 53 68 61  reePage(.  BtSha
2ec90 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
2eca0 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
2ecb0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
2ecc0 50 61 67 65 2c 20 20 20 20 20 20 2f 2a 20 53 74  Page,      /* St
2ecd0 6f 72 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  ore pointer to t
2ece0 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  he allocated pag
2ecf0 65 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f  e here */.  Pgno
2ed00 20 2a 70 50 67 6e 6f 2c 20 20 20 20 20 20 20 20   *pPgno,        
2ed10 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20     /* Store the 
2ed20 70 61 67 65 20 6e 75 6d 62 65 72 20 68 65 72 65  page number here
2ed30 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62   */.  Pgno nearb
2ed40 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y,           /* 
2ed50 53 65 61 72 63 68 20 66 6f 72 20 61 20 70 61 67  Search for a pag
2ed60 65 20 6e 65 61 72 20 74 68 69 73 20 6f 6e 65 20  e near this one 
2ed70 2a 2f 0a 20 20 75 38 20 65 4d 6f 64 65 20 20 20  */.  u8 eMode   
2ed80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
2ed90 54 41 4c 4c 4f 43 5f 45 58 41 43 54 2c 20 42 54  TALLOC_EXACT, BT
2eda0 41 4c 4c 4f 43 5f 4c 54 2c 20 6f 72 20 42 54 41  ALLOC_LT, or BTA
2edb0 4c 4c 4f 43 5f 41 4e 59 20 2a 2f 0a 29 7b 0a 20  LLOC_ANY */.){. 
2edc0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
2edd0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33  ;.  int rc;.  u3
2ede0 32 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  2 n;     /* Numb
2edf0 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74  er of pages on t
2ee00 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20  he freelist */. 
2ee10 20 75 33 32 20 6b 3b 20 20 20 20 20 2f 2a 20 4e   u32 k;     /* N
2ee20 75 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20  umber of leaves 
2ee30 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20  on the trunk of 
2ee40 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a  the freelist */.
2ee50 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e    MemPage *pTrun
2ee60 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  k = 0;.  MemPage
2ee70 20 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30   *pPrevTrunk = 0
2ee80 3b 0a 20 20 50 67 6e 6f 20 6d 78 50 61 67 65 3b  ;.  Pgno mxPage;
2ee90 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69       /* Total si
2eea0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
2eeb0 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73  se file */..  as
2eec0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2eed0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
2eee0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
2eef0 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  ( eMode==BTALLOC
2ef00 5f 41 4e 59 20 7c 7c 20 28 6e 65 61 72 62 79 3e  _ANY || (nearby>
2ef10 30 20 26 26 20 49 66 4e 6f 74 4f 6d 69 74 41 56  0 && IfNotOmitAV
2ef20 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  (pBt->autoVacuum
2ef30 29 29 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d  )) );.  pPage1 =
2ef40 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20   pBt->pPage1;.  
2ef50 6d 78 50 61 67 65 20 3d 20 62 74 72 65 65 50 61  mxPage = btreePa
2ef60 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20  gecount(pBt);.  
2ef70 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
2ef80 52 2d 30 35 31 31 39 2d 30 32 36 33 37 20 54 68  R-05119-02637 Th
2ef90 65 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  e 4-byte big-end
2efa0 69 61 6e 20 69 6e 74 65 67 65 72 20 61 74 20 6f  ian integer at o
2efb0 66 66 73 65 74 20 33 36 0a 20 20 2a 2a 20 73 74  ffset 36.  ** st
2efc0 6f 72 65 73 20 73 74 6f 72 65 73 20 74 68 65 20  ores stores the 
2efd0 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
2efe0 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
2eff0 65 6c 69 73 74 2e 20 2a 2f 0a 20 20 6e 20 3d 20  elist. */.  n = 
2f000 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
2f010 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
2f020 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 6d 78 50  testcase( n==mxP
2f030 61 67 65 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e  age-1 );.  if( n
2f040 3e 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20  >=mxPage ){.    
2f050 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
2f060 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
2f070 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20    if( n>0 ){.   
2f080 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 70 61   /* There are pa
2f090 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
2f0a0 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e 65 20  ist.  Reuse one 
2f0b0 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 2e 20  of those pages. 
2f0c0 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54 72 75  */.    Pgno iTru
2f0d0 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61 72 63  nk;.    u8 searc
2f0e0 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66  hList = 0; /* If
2f0f0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6d   the free-list m
2f100 75 73 74 20 62 65 20 73 65 61 72 63 68 65 64 20  ust be searched 
2f110 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a  for 'nearby' */.
2f120 20 20 20 20 75 33 32 20 6e 53 65 61 72 63 68 20      u32 nSearch 
2f130 3d 20 30 3b 20 20 20 2f 2a 20 43 6f 75 6e 74 20  = 0;   /* Count 
2f140 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
2f150 20 73 65 61 72 63 68 20 61 74 74 65 6d 70 74 73   search attempts
2f160 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20   */.    .    /* 
2f170 49 66 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  If eMode==BTALLO
2f180 43 5f 45 58 41 43 54 20 61 6e 64 20 61 20 71 75  C_EXACT and a qu
2f190 65 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74  ery of the point
2f1a0 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68  er-map.    ** sh
2f1b0 6f 77 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ows that the pag
2f1c0 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f  e 'nearby' is so
2f1d0 6d 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66  mewhere on the f
2f1e0 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20  ree-list, then. 
2f1f0 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65     ** the entire
2f200 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65  -list will be se
2f210 61 72 63 68 65 64 20 66 6f 72 20 74 68 61 74 20  arched for that 
2f220 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  page..    */.#if
2f230 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2f240 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
2f250 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  if( eMode==BTALL
2f260 4f 43 5f 45 58 41 43 54 20 29 7b 0a 20 20 20 20  OC_EXACT ){.    
2f270 20 20 69 66 28 20 6e 65 61 72 62 79 3c 3d 6d 78    if( nearby<=mx
2f280 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
2f290 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20  u8 eType;.      
2f2a0 20 20 61 73 73 65 72 74 28 20 6e 65 61 72 62 79    assert( nearby
2f2b0 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  >0 );.        as
2f2c0 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
2f2d0 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 20  acuum );.       
2f2e0 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
2f2f0 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54  pBt, nearby, &eT
2f300 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ype, 0);.       
2f310 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2f320 20 72 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28   rc;.        if(
2f330 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46   eType==PTRMAP_F
2f340 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20  REEPAGE ){.     
2f350 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
2f360 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
2f370 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
2f380 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c   if( eMode==BTAL
2f390 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20  LOC_LE ){.      
2f3a0 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a  searchList = 1;.
2f3b0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
2f3c0 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
2f3d0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75  he free-list cou
2f3e0 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69 54 72  nt by 1. Set iTr
2f3f0 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78  unk to the index
2f400 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66   of the.    ** f
2f410 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74  irst free-list t
2f420 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76  runk page. iPrev
2f430 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c  Trunk is initial
2f440 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ly 1..    */.   
2f450 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2f460 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e  erWrite(pPage1->
2f470 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
2f480 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2f490 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26  ;.    put4byte(&
2f4a0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
2f4b0 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a  ], n-1);..    /*
2f4c0 20 54 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e   The code within
2f4d0 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75   this loop is ru
2f4e0 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74  n only once if t
2f4f0 68 65 20 27 73 65 61 72 63 68 4c 69 73 74 27 20  he 'searchList' 
2f500 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20  variable.    ** 
2f510 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68  is not true. Oth
2f520 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20  erwise, it runs 
2f530 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 72  once for each tr
2f540 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a  unk-page on the.
2f550 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74      ** free-list
2f560 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20   until the page 
2f570 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61  'nearby' is loca
2f580 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c  ted (eMode==BTAL
2f590 4c 4f 43 5f 45 58 41 43 54 29 0a 20 20 20 20 2a  LOC_EXACT).    *
2f5a0 2a 20 6f 72 20 75 6e 74 69 6c 20 61 20 70 61 67  * or until a pag
2f5b0 65 20 6c 65 73 73 20 74 68 61 6e 20 27 6e 65 61  e less than 'nea
2f5c0 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20  rby' is located 
2f5d0 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f  (eMode==BTALLOC_
2f5e0 4c 54 29 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  LT).    */.    d
2f5f0 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54  o {.      pPrevT
2f600 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  runk = pTrunk;. 
2f610 20 20 20 20 20 69 66 28 20 70 50 72 65 76 54 72       if( pPrevTr
2f620 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  unk ){.        /
2f630 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
2f640 2d 30 31 35 30 36 2d 31 31 30 35 33 20 54 68 65  -01506-11053 The
2f650 20 66 69 72 73 74 20 69 6e 74 65 67 65 72 20 6f   first integer o
2f660 6e 20 61 20 66 72 65 65 6c 69 73 74 20 74 72 75  n a freelist tru
2f670 6e 6b 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  nk page.        
2f680 2a 2a 20 69 73 20 74 68 65 20 70 61 67 65 20 6e  ** is the page n
2f690 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78  umber of the nex
2f6a0 74 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b  t freelist trunk
2f6b0 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73   page in the lis
2f6c0 74 20 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  t or.        ** 
2f6d0 7a 65 72 6f 20 69 66 20 74 68 69 73 20 69 73 20  zero if this is 
2f6e0 74 68 65 20 6c 61 73 74 20 66 72 65 65 6c 69 73  the last freelis
2f6f0 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 2a 2f  t trunk page. */
2f700 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20  .        iTrunk 
2f710 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 72 65  = get4byte(&pPre
2f720 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  vTrunk->aData[0]
2f730 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
2f740 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45          /* EVIDE
2f750 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 38 34 31 2d  NCE-OF: R-59841-
2f760 31 33 37 39 38 20 54 68 65 20 34 2d 62 79 74 65  13798 The 4-byte
2f770 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
2f780 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 33 32  ger at offset 32
2f790 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72  .        ** stor
2f7a0 65 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  es the page numb
2f7b0 65 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  er of the first 
2f7c0 70 61 67 65 20 6f 66 20 74 68 65 20 66 72 65 65  page of the free
2f7d0 6c 69 73 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66  list, or zero if
2f7e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
2f7f0 66 72 65 65 6c 69 73 74 20 69 73 20 65 6d 70 74  freelist is empt
2f800 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 54  y. */.        iT
2f810 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
2f820 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
2f830 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  2]);.      }.   
2f840 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54 72     testcase( iTr
2f850 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20  unk==mxPage );. 
2f860 20 20 20 20 20 69 66 28 20 69 54 72 75 6e 6b 3e       if( iTrunk>
2f870 6d 78 50 61 67 65 20 7c 7c 20 6e 53 65 61 72 63  mxPage || nSearc
2f880 68 2b 2b 20 3e 20 6e 20 29 7b 0a 20 20 20 20 20  h++ > n ){.     
2f890 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
2f8a0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2f8b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2f8c0 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55    rc = btreeGetU
2f8d0 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 69  nusedPage(pBt, i
2f8e0 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20  Trunk, &pTrunk, 
2f8f0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
2f900 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2f910 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
2f920 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2f930 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2f940 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
2f950 73 65 72 74 28 20 70 54 72 75 6e 6b 21 3d 30 20  sert( pTrunk!=0 
2f960 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2f970 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 21 3d   pTrunk->aData!=
2f980 30 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 45 56  0 );.      /* EV
2f990 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 33 35  IDENCE-OF: R-135
2f9a0 32 33 2d 30 34 33 39 34 20 54 68 65 20 73 65 63  23-04394 The sec
2f9b0 6f 6e 64 20 69 6e 74 65 67 65 72 20 6f 6e 20 61  ond integer on a
2f9c0 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
2f9d0 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  page.      ** is
2f9e0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c   the number of l
2f9f0 65 61 66 20 70 61 67 65 20 70 6f 69 6e 74 65 72  eaf page pointer
2fa00 73 20 74 6f 20 66 6f 6c 6c 6f 77 2e 20 2a 2f 0a  s to follow. */.
2fa10 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79        k = get4by
2fa20 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
2fa30 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  a[4]);.      if(
2fa40 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68   k==0 && !search
2fa50 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
2fa60 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73  /* The trunk has
2fa70 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74   no leaves and t
2fa80 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62  he list is not b
2fa90 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a  eing searched. .
2faa0 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78          ** So ex
2fab0 74 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20  tract the trunk 
2fac0 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20  page itself and 
2fad0 75 73 65 20 69 74 20 61 73 20 74 68 65 20 6e 65  use it as the ne
2fae0 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  wly .        ** 
2faf0 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a  allocated page *
2fb00 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
2fb10 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20  ( pPrevTrunk==0 
2fb20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2fb30 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2fb40 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
2fb50 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
2fb60 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
2fb70 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
2fb80 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
2fb90 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f  }.        *pPgno
2fba0 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = iTrunk;.     
2fbb0 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
2fbc0 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70  1->aData[32], &p
2fbd0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
2fbe0 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70   4);.        *pp
2fbf0 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  Page = pTrunk;. 
2fc00 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
2fc10 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  0;.        TRACE
2fc20 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
2fc30 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20  trunk - %d free 
2fc40 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a  pages left\n", *
2fc50 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20  pPgno, n-1));.  
2fc60 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e      }else if( k>
2fc70 28 75 33 32 29 28 70 42 74 2d 3e 75 73 61 62 6c  (u32)(pBt->usabl
2fc80 65 53 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a  eSize/4 - 2) ){.
2fc90 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
2fca0 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20   of k is out of 
2fcb0 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65  range.  Database
2fcc0 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20   corruption */. 
2fcd0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2fce0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2fcf0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
2fd00 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
2fd10 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2fd20 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2fd30 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2fd40 73 65 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20  searchList .    
2fd50 20 20 20 20 20 20 20 20 26 26 20 28 6e 65 61 72          && (near
2fd60 62 79 3d 3d 69 54 72 75 6e 6b 20 7c 7c 20 28 69  by==iTrunk || (i
2fd70 54 72 75 6e 6b 3c 6e 65 61 72 62 79 20 26 26 20  Trunk<nearby && 
2fd80 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c  eMode==BTALLOC_L
2fd90 45 29 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20  E)) .      ){.  
2fda0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73        /* The lis
2fdb0 74 20 69 73 20 62 65 69 6e 67 20 73 65 61 72 63  t is being searc
2fdc0 68 65 64 20 61 6e 64 20 74 68 69 73 20 74 72 75  hed and this tru
2fdd0 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65 20 70  nk page is the p
2fde0 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  age.        ** t
2fdf0 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61  o allocate, rega
2fe00 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
2fe10 72 20 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e  r it has leaves.
2fe20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2fe30 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72      *pPgno = iTr
2fe40 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 2a 70 70  unk;.        *pp
2fe50 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  Page = pTrunk;. 
2fe60 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73         searchLis
2fe70 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  t = 0;.        r
2fe80 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2fe90 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
2fea0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
2feb0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
2fec0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
2fed0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
2fee0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
2fef0 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( k==0 ){.      
2ff00 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72      if( !pPrevTr
2ff10 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  unk ){.         
2ff20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
2ff30 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70  1->aData[32], &p
2ff40 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
2ff50 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   4);.          }
2ff60 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2ff70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2ff80 67 65 72 57 72 69 74 65 28 70 50 72 65 76 54 72  gerWrite(pPrevTr
2ff90 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
2ffa0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
2ffb0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2ffc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f                go
2ffd0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
2ffe0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
2fff0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
30000 6d 65 6d 63 70 79 28 26 70 50 72 65 76 54 72 75  memcpy(&pPrevTru
30010 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70  nk->aData[0], &p
30020 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
30030 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   4);.          }
30040 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
30050 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
30060 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72   trunk page is r
30070 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20 63  equired by the c
30080 61 6c 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e  aller but it con
30090 74 61 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20  tains .         
300a0 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20   ** pointers to 
300b0 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73  free-list leaves
300c0 2e 20 54 68 65 20 66 69 72 73 74 20 6c 65 61 66  . The first leaf
300d0 20 62 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b   becomes a trunk
300e0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61  .          ** pa
300f0 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ge in this case.
30100 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
30110 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
30120 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20  *pNewTrunk;.    
30130 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54        Pgno iNewT
30140 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
30150 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38  &pTrunk->aData[8
30160 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ]);.          if
30170 28 20 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61  ( iNewTrunk>mxPa
30180 67 65 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20  ge ){ .         
30190 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
301a0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
301b0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
301c0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
301d0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
301e0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
301f0 20 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61   iNewTrunk==mxPa
30200 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ge );.          
30210 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75  rc = btreeGetUnu
30220 73 65 64 50 61 67 65 28 70 42 74 2c 20 69 4e 65  sedPage(pBt, iNe
30230 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75  wTrunk, &pNewTru
30240 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  nk, 0);.        
30250 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
30260 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
30270 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
30280 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
30290 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
302a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
302b0 65 72 57 72 69 74 65 28 70 4e 65 77 54 72 75 6e  erWrite(pNewTrun
302c0 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
302d0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
302e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
302f0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
30300 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a  age(pNewTrunk);.
30310 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
30320 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
30330 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ge;.          }.
30340 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
30350 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61  (&pNewTrunk->aDa
30360 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  ta[0], &pTrunk->
30370 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
30380 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
30390 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61  (&pNewTrunk->aDa
303a0 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20  ta[4], k-1);.   
303b0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
303c0 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
303d0 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  8], &pTrunk->aDa
303e0 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29  ta[12], (k-1)*4)
303f0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65  ;.          rele
30400 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e  asePage(pNewTrun
30410 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  k);.          if
30420 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  ( !pPrevTrunk ){
30430 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
30440 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
30450 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
30460 67 65 31 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ge1->pDbPage) );
30470 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74  .            put
30480 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
30490 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72  Data[32], iNewTr
304a0 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
304b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
304c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
304d0 61 67 65 72 57 72 69 74 65 28 70 50 72 65 76 54  agerWrite(pPrevT
304e0 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
304f0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
30500 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
30510 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
30520 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
30530 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30540 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
30550 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
30560 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29  a[0], iNewTrunk)
30570 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
30580 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30590 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  pTrunk = 0;.    
305a0 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
305b0 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d  CATE: %d trunk -
305c0 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c   %d free pages l
305d0 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20  eft\n", *pPgno, 
305e0 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20  n-1));.#endif.  
305f0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e      }else if( k>
30600 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
30610 45 78 74 72 61 63 74 20 61 20 6c 65 61 66 20 66  Extract a leaf f
30620 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f  rom the trunk */
30630 0a 20 20 20 20 20 20 20 20 75 33 32 20 63 6c 6f  .        u32 clo
30640 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67  sest;.        Pg
30650 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20  no iPage;.      
30660 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
30670 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d  *aData = pTrunk-
30680 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20  >aData;.        
30690 69 66 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a  if( nearby>0 ){.
306a0 20 20 20 20 20 20 20 20 20 20 75 33 32 20 69 3b            u32 i;
306b0 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65  .          close
306c0 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
306d0 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41    if( eMode==BTA
306e0 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20  LLOC_LE ){.     
306f0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
30700 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<k; i++){.     
30710 20 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d           iPage =
30720 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61   get4byte(&aData
30730 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20 20 20 20 20  [8+i*4]);.      
30740 20 20 20 20 20 20 20 20 69 66 28 20 69 50 61 67          if( iPag
30750 65 3c 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20  e<=nearby ){.   
30760 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f               clo
30770 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20  sest = i;.      
30780 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
30790 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
307a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
307b0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
307c0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
307d0 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  dist;.          
307e0 20 20 64 69 73 74 20 3d 20 73 71 6c 69 74 65 33    dist = sqlite3
307f0 41 62 73 49 6e 74 33 32 28 67 65 74 34 62 79 74  AbsInt32(get4byt
30800 65 28 26 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e  e(&aData[8]) - n
30810 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20  earby);.        
30820 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b      for(i=1; i<k
30830 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
30840 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73        int d2 = s
30850 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28 67  qlite3AbsInt32(g
30860 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
30870 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79 29  +i*4]) - nearby)
30880 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
30890 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b 0a 20  if( d2<dist ){. 
308a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
308b0 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20  losest = i;.    
308c0 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74              dist
308d0 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20   = d2;.         
308e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
308f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
30900 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
30910 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73            closes
30920 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
30930 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67 65 20  ..        iPage 
30940 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74  = get4byte(&aDat
30950 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b  a[8+closest*4]);
30960 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
30970 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65  e( iPage==mxPage
30980 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
30990 69 50 61 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a  iPage>mxPage ){.
309a0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
309b0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
309c0 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  PT;.          go
309d0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
309e0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
309f0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
30a00 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20  ( iPage==mxPage 
30a10 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
30a20 73 65 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20  searchList .    
30a30 20 20 20 20 20 7c 7c 20 28 69 50 61 67 65 3d 3d       || (iPage==
30a40 6e 65 61 72 62 79 20 7c 7c 20 28 69 50 61 67 65  nearby || (iPage
30a50 3c 6e 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65  <nearby && eMode
30a60 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a  ==BTALLOC_LE)) .
30a70 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
30a80 20 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65       int noConte
30a90 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70  nt;.          *p
30aa0 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20  Pgno = iPage;.  
30ab0 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
30ac0 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77 61 73  ALLOCATE: %d was
30ad0 20 6c 65 61 66 20 25 64 20 6f 66 20 25 64 20 6f   leaf %d of %d o
30ae0 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20 20 20 20  n trunk %d".    
30af0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3a 20               ": 
30b00 25 64 20 6d 6f 72 65 20 66 72 65 65 20 70 61 67  %d more free pag
30b10 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  es\n",.         
30b20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20          *pPgno, 
30b30 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54  closest+1, k, pT
30b40 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29  runk->pgno, n-1)
30b50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
30b60 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
30b70 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
30b80 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
30b90 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e  if( rc ) goto en
30ba0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
30bb0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63  .          if( c
30bc0 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20  losest<k-1 ){.  
30bd0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
30be0 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73  (&aData[8+closes
30bf0 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b  t*4], &aData[4+k
30c00 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  *4], 4);.       
30c10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
30c20 75 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 34  ut4byte(&aData[4
30c30 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20  ], k-1);.       
30c40 20 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 21     noContent = !
30c50 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65  btreeGetHasConte
30c60 6e 74 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29 3f  nt(pBt, *pPgno)?
30c70 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e   PAGER_GET_NOCON
30c80 54 45 4e 54 20 3a 20 30 3b 0a 20 20 20 20 20 20  TENT : 0;.      
30c90 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
30ca0 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c  tUnusedPage(pBt,
30cb0 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c   *pPgno, ppPage,
30cc0 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20   noContent);.   
30cd0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
30ce0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
30cf0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
30d00 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28  ite3PagerWrite((
30d10 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67  *ppPage)->pDbPag
30d20 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
30d30 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
30d40 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
30d50 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
30d60 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  ppPage);.       
30d70 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
30d80 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
30d90 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
30da0 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69          searchLi
30db0 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
30dc0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
30dd0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65  releasePage(pPre
30de0 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70  vTrunk);.      p
30df0 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20  PrevTrunk = 0;. 
30e00 20 20 20 7d 77 68 69 6c 65 28 20 73 65 61 72 63     }while( searc
30e10 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65  hList );.  }else
30e20 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61  {.    /* There a
30e30 72 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74  re no pages on t
30e40 68 65 20 66 72 65 65 6c 69 73 74 2c 20 73 6f 20  he freelist, so 
30e50 61 70 70 65 6e 64 20 61 20 6e 65 77 20 70 61 67  append a new pag
30e60 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  e to the.    ** 
30e70 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2e 0a  database image..
30e80 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f      **.    ** No
30e90 72 6d 61 6c 6c 79 2c 20 6e 65 77 20 70 61 67 65  rmally, new page
30ea0 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74  s allocated by t
30eb0 68 69 73 20 62 6c 6f 63 6b 20 63 61 6e 20 62 65  his block can be
30ec0 20 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20   requested from 
30ed0 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72  the.    ** pager
30ee0 20 6c 61 79 65 72 20 77 69 74 68 20 74 68 65 20   layer with the 
30ef0 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61  'no-content' fla
30f00 67 20 73 65 74 2e 20 54 68 69 73 20 70 72 65 76  g set. This prev
30f10 65 6e 74 73 20 74 68 65 20 70 61 67 65 72 0a 20  ents the pager. 
30f20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 72 79 69 6e     ** from tryin
30f30 67 20 74 6f 20 72 65 61 64 20 74 68 65 20 70 61  g to read the pa
30f40 67 65 73 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  ges content from
30f50 20 64 69 73 6b 2e 20 48 6f 77 65 76 65 72 2c 20   disk. However, 
30f60 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75  if the.    ** cu
30f70 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
30f80 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 72 75  n has already ru
30f90 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 69 6e  n one or more in
30fa0 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d  cremental-vacuum
30fb0 0a 20 20 20 20 2a 2a 20 73 74 65 70 73 2c 20 74  .    ** steps, t
30fc0 68 65 6e 20 74 68 65 20 70 61 67 65 20 77 65 20  hen the page we 
30fd0 61 72 65 20 61 62 6f 75 74 20 74 6f 20 61 6c 6c  are about to all
30fe0 6f 63 61 74 65 20 6d 61 79 20 63 6f 6e 74 61 69  ocate may contai
30ff0 6e 20 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a  n content.    **
31000 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65   that is require
31010 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f  d in the event o
31020 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 6e  f a rollback. In
31030 20 74 68 69 73 20 63 61 73 65 2c 20 64 6f 0a 20   this case, do. 
31040 20 20 20 2a 2a 20 6e 6f 74 20 73 65 74 20 74 68     ** not set th
31050 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 66 6c 61  e no-content fla
31060 67 2e 20 54 68 69 73 20 63 61 75 73 65 73 20 74  g. This causes t
31070 68 65 20 70 61 67 65 72 20 74 6f 20 6c 6f 61 64  he pager to load
31080 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   and journal.   
31090 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20   ** the current 
310a0 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 62 65 66  page content bef
310b0 6f 72 65 20 6f 76 65 72 77 72 69 74 69 6e 67 20  ore overwriting 
310c0 69 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  it..    **.    *
310d0 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
310e0 70 61 67 65 72 20 77 69 6c 6c 20 6e 6f 74 20 61  pager will not a
310f0 63 74 75 61 6c 6c 79 20 61 74 74 65 6d 70 74 20  ctually attempt 
31100 74 6f 20 6c 6f 61 64 20 6f 72 20 6a 6f 75 72 6e  to load or journ
31110 61 6c 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 65  al .    ** conte
31120 6e 74 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20  nt for any page 
31130 74 68 61 74 20 72 65 61 6c 6c 79 20 64 6f 65 73  that really does
31140 20 6c 69 65 20 70 61 73 74 20 74 68 65 20 65 6e   lie past the en
31150 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  d of the databas
31160 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 6f 6e  e.    ** file on
31170 20 64 69 73 6b 2e 20 53 6f 20 74 68 65 20 65 66   disk. So the ef
31180 66 65 63 74 73 20 6f 66 20 64 69 73 61 62 6c 69  fects of disabli
31190 6e 67 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e  ng the no-conten
311a0 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20  t optimization. 
311b0 20 20 20 2a 2a 20 68 65 72 65 20 61 72 65 20 63     ** here are c
311c0 6f 6e 66 69 6e 65 64 20 74 6f 20 74 68 6f 73 65  onfined to those
311d0 20 70 61 67 65 73 20 74 68 61 74 20 6c 69 65 20   pages that lie 
311e0 62 65 74 77 65 65 6e 20 74 68 65 20 65 6e 64 20  between the end 
311f0 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  of the.    ** da
31200 74 61 62 61 73 65 20 69 6d 61 67 65 20 61 6e 64  tabase image and
31210 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
31220 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
31230 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4e     */.    int bN
31240 6f 43 6f 6e 74 65 6e 74 20 3d 20 28 30 3d 3d 49  oContent = (0==I
31250 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e  fNotOmitAV(pBt->
31260 62 44 6f 54 72 75 6e 63 61 74 65 29 29 3f 20 50  bDoTruncate))? P
31270 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
31280 4e 54 3a 30 3b 0a 0a 20 20 20 20 72 63 20 3d 20  NT:0;..    rc = 
31290 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
312a0 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70  e(pBt->pPage1->p
312b0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
312c0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
312d0 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b  .    pBt->nPage+
312e0 2b 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  +;.    if( pBt->
312f0 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42  nPage==PENDING_B
31300 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 20  YTE_PAGE(pBt) ) 
31310 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23  pBt->nPage++;..#
31320 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
31330 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
31340 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
31350 61 63 75 75 6d 20 26 26 20 50 54 52 4d 41 50 5f  acuum && PTRMAP_
31360 49 53 50 41 47 45 28 70 42 74 2c 20 70 42 74 2d  ISPAGE(pBt, pBt-
31370 3e 6e 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20  >nPage) ){.     
31380 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65   /* If *pPgno re
31390 66 65 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65  fers to a pointe
313a0 72 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f  r-map page, allo
313b0 63 61 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67  cate two new pag
313c0 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74  es.      ** at t
313d0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
313e0 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e  le instead of on
313f0 65 2e 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c  e. The first all
31400 6f 63 61 74 65 64 20 70 61 67 65 0a 20 20 20 20  ocated page.    
31410 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e    ** becomes a n
31420 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  ew pointer-map p
31430 61 67 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20  age, the second 
31440 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 63  is used by the c
31450 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a  aller..      */.
31460 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
31470 50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52  Pg = 0;.      TR
31480 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
31490 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66  %d from end of f
314a0 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70  ile (pointer-map
314b0 20 70 61 67 65 29 5c 6e 22 2c 20 70 42 74 2d 3e   page)\n", pBt->
314c0 6e 50 61 67 65 29 29 3b 0a 20 20 20 20 20 20 61  nPage));.      a
314d0 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67  ssert( pBt->nPag
314e0 65 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  e!=PENDING_BYTE_
314f0 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20  PAGE(pBt) );.   
31500 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
31510 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20  UnusedPage(pBt, 
31520 70 42 74 2d 3e 6e 50 61 67 65 2c 20 26 70 50 67  pBt->nPage, &pPg
31530 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20  , bNoContent);. 
31540 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
31550 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
31560 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
31570 67 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44  gerWrite(pPg->pD
31580 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
31590 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 67 29  releasePage(pPg)
315a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
315b0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
315c0 72 63 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e  rc;.      pBt->n
315d0 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66  Page++;.      if
315e0 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45  ( pBt->nPage==PE
315f0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
31600 70 42 74 29 20 29 7b 20 70 42 74 2d 3e 6e 50 61  pBt) ){ pBt->nPa
31610 67 65 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65  ge++; }.    }.#e
31620 6e 64 69 66 0a 20 20 20 20 70 75 74 34 62 79 74  ndif.    put4byt
31630 65 28 32 38 20 2b 20 28 75 38 2a 29 70 42 74 2d  e(28 + (u8*)pBt-
31640 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20  >pPage1->aData, 
31650 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20  pBt->nPage);.   
31660 20 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e   *pPgno = pBt->n
31670 50 61 67 65 3b 0a 0a 20 20 20 20 61 73 73 65 72  Page;..    asser
31680 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49  t( *pPgno!=PENDI
31690 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
316a0 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74  ) );.    rc = bt
316b0 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65  reeGetUnusedPage
316c0 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70  (pBt, *pPgno, pp
316d0 50 61 67 65 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74  Page, bNoContent
316e0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
316f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72  return rc;.    r
31700 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
31710 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d  Write((*ppPage)-
31720 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
31730 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
31740 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
31750 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
31760 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
31770 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41  0;.    }.    TRA
31780 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
31790 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69  d from end of fi
317a0 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b  le\n", *pPgno));
317b0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
317c0 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f  *pPgno!=PENDING_
317d0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
317e0 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  ;..end_allocate_
317f0 70 61 67 65 3a 0a 20 20 72 65 6c 65 61 73 65 50  page:.  releaseP
31800 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72  age(pTrunk);.  r
31810 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76  eleasePage(pPrev
31820 54 72 75 6e 6b 29 3b 0a 20 20 61 73 73 65 72 74  Trunk);.  assert
31830 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
31840 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  || sqlite3PagerP
31850 61 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70  ageRefcount((*pp
31860 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3c  Page)->pDbPage)<
31870 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
31880 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
31890 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e   (*ppPage)->isIn
318a0 69 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  it==0 );.  retur
318b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
318c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
318d0 75 73 65 64 20 74 6f 20 61 64 64 20 70 61 67 65  used to add page
318e0 20 69 50 61 67 65 20 74 6f 20 74 68 65 20 64 61   iPage to the da
318f0 74 61 62 61 73 65 20 66 69 6c 65 20 66 72 65 65  tabase file free
31900 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73  -list. .** It is
31910 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
31920 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
31930 72 65 61 64 79 20 61 20 70 61 72 74 20 6f 66 20  ready a part of 
31940 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a  the free-list..*
31950 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 70  *.** The value p
31960 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
31970 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
31980 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
31990 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66   optional..** If
319a0 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 70 70   the caller happ
319b0 65 6e 73 20 74 6f 20 68 61 76 65 20 61 20 70 6f  ens to have a po
319c0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d  inter to the Mem
319d0 50 61 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20  Page object .** 
319e0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
319f0 20 70 61 67 65 20 69 50 61 67 65 20 68 61 6e 64   page iPage hand
31a00 79 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 69  y, it may pass i
31a10 74 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  t as the second 
31a20 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72  value. .** Other
31a30 77 69 73 65 2c 20 69 74 20 6d 61 79 20 70 61 73  wise, it may pas
31a40 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66  s NULL..**.** If
31a50 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
31a60 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 69  MemPage object i
31a70 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  s passed as the 
31a80 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
31a90 0a 2a 2a 20 69 74 73 20 72 65 66 65 72 65 6e 63  .** its referenc
31aa0 65 20 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61  e count is not a
31ab0 6c 74 65 72 65 64 20 62 79 20 74 68 69 73 20 66  ltered by this f
31ac0 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
31ad0 69 63 20 69 6e 74 20 66 72 65 65 50 61 67 65 32  ic int freePage2
31ae0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
31af0 4d 65 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61 67  MemPage *pMemPag
31b00 65 2c 20 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a  e, Pgno iPage){.
31b10 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e    MemPage *pTrun
31b20 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  k = 0;          
31b30 20 20 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69        /* Free-li
31b40 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f  st trunk page */
31b50 0a 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d  .  Pgno iTrunk =
31b60 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
31b70 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
31b80 75 6d 62 65 72 20 6f 66 20 66 72 65 65 2d 6c 69  umber of free-li
31b90 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f  st trunk page */
31ba0 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61   .  MemPage *pPa
31bb0 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
31bc0 31 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  1;      /* Local
31bd0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61   reference to pa
31be0 67 65 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ge 1 */.  MemPag
31bf0 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20  e *pPage;       
31c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31c10 20 50 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   Page being free
31c20 64 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20  d. May be NULL. 
31c30 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
31c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c50 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
31c60 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn Code */.  int
31c70 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20   nFree;         
31c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c90 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62   /* Initial numb
31ca0 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 66  er of pages on f
31cb0 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61  ree-list */..  a
31cc0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
31cd0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
31ce0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
31cf0 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
31d00 20 69 50 61 67 65 3e 31 20 29 3b 0a 20 20 61 73   iPage>1 );.  as
31d10 73 65 72 74 28 20 21 70 4d 65 6d 50 61 67 65 20  sert( !pMemPage 
31d20 7c 7c 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67 6e  || pMemPage->pgn
31d30 6f 3d 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20 69  o==iPage );..  i
31d40 66 28 20 69 50 61 67 65 3c 32 20 29 20 72 65 74  f( iPage<2 ) ret
31d50 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
31d60 50 54 5f 42 4b 50 54 3b 0a 20 20 69 66 28 20 70  PT_BKPT;.  if( p
31d70 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 70  MemPage ){.    p
31d80 50 61 67 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b  Page = pMemPage;
31d90 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
31da0 72 52 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50  rRef(pPage->pDbP
31db0 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  age);.  }else{. 
31dc0 20 20 20 70 50 61 67 65 20 3d 20 62 74 72 65 65     pPage = btree
31dd0 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20  PageLookup(pBt, 
31de0 69 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  iPage);.  }..  /
31df0 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
31e00 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20  free page count 
31e10 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72  on pPage1 */.  r
31e20 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
31e30 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
31e40 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
31e50 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65   ) goto freepage
31e60 5f 6f 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20  _out;.  nFree = 
31e70 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
31e80 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
31e90 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
31ea0 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72  ->aData[36], nFr
31eb0 65 65 2b 31 29 3b 0a 0a 20 20 69 66 28 20 70 42  ee+1);..  if( pB
31ec0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
31ed0 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  S_SECURE_DELETE 
31ee0 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
31ef0 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 20 6f   secure_delete o
31f00 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64  ption is enabled
31f10 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c  , then.    ** al
31f20 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77  ways fully overw
31f30 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66  rite deleted inf
31f40 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65  ormation with ze
31f50 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ros..    */.    
31f60 69 66 28 20 28 21 70 50 61 67 65 20 26 26 20 28  if( (!pPage && (
31f70 28 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61  (rc = btreeGetPa
31f80 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26  ge(pBt, iPage, &
31f90 70 50 61 67 65 2c 20 30 29 29 21 3d 30 29 20 29  pPage, 0))!=0) )
31fa0 0a 20 20 20 20 20 7c 7c 20 20 20 20 20 20 20 20  .     ||        
31fb0 20 20 20 20 28 28 72 63 20 3d 20 73 71 6c 69 74      ((rc = sqlit
31fc0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
31fd0 67 65 2d 3e 70 44 62 50 61 67 65 29 29 21 3d 30  ge->pDbPage))!=0
31fe0 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67  ).    ){.      g
31ff0 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
32000 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73  ;.    }.    mems
32010 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  et(pPage->aData,
32020 20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e   0, pPage->pBt->
32030 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a  pageSize);.  }..
32040 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
32050 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75  base supports au
32060 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65  to-vacuum, write
32070 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65   an entry in the
32080 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a   pointer-map.  *
32090 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  * to indicate th
320a0 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 66  at the page is f
320b0 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ree..  */.  if( 
320c0 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
320d0 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
320e0 74 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50  t, iPage, PTRMAP
320f0 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20 26 72  _FREEPAGE, 0, &r
32100 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  c);.    if( rc )
32110 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
32120 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  ut;.  }..  /* No
32130 77 20 6d 61 6e 69 70 75 6c 61 74 65 20 74 68 65  w manipulate the
32140 20 61 63 74 75 61 6c 20 64 61 74 61 62 61 73 65   actual database
32150 20 66 72 65 65 2d 6c 69 73 74 20 73 74 72 75 63   free-list struc
32160 74 75 72 65 2e 20 54 68 65 72 65 20 61 72 65 20  ture. There are 
32170 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69  two.  ** possibi
32180 6c 69 74 69 65 73 2e 20 49 66 20 74 68 65 20 66  lities. If the f
32190 72 65 65 2d 6c 69 73 74 20 69 73 20 63 75 72 72  ree-list is curr
321a0 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20  ently empty, or 
321b0 69 66 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a  if the first.  *
321c0 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  * trunk page in 
321d0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
321e0 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73   full, then this
321f0 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d   page will becom
32200 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65  e a.  ** new fre
32210 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
32220 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  e. Otherwise, it
32230 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c   will become a l
32240 65 61 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  eaf of the.  ** 
32250 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65  first trunk page
32260 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
32270 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20  free-list. This 
32280 62 6c 6f 63 6b 20 74 65 73 74 73 20 69 66 20 69  block tests if i
32290 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62  t.  ** is possib
322a0 6c 65 20 74 6f 20 61 64 64 20 74 68 65 20 70 61  le to add the pa
322b0 67 65 20 61 73 20 61 20 6e 65 77 20 66 72 65 65  ge as a new free
322c0 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f  -list leaf..  */
322d0 0a 20 20 69 66 28 20 6e 46 72 65 65 21 3d 30 20  .  if( nFree!=0 
322e0 29 7b 0a 20 20 20 20 75 33 32 20 6e 4c 65 61 66  ){.    u32 nLeaf
322f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
32300 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62   /* Initial numb
32310 65 72 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73  er of leaf cells
32320 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 2a   on trunk page *
32330 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d 20  /..    iTrunk = 
32340 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
32350 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20  ->aData[32]);.  
32360 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
32370 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c  age(pBt, iTrunk,
32380 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20   &pTrunk, 0);.  
32390 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
323a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
323b0 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
323c0 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66      }..    nLeaf
323d0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
323e0 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a  unk->aData[4]);.
323f0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
32400 3e 75 73 61 62 6c 65 53 69 7a 65 3e 33 32 20 29  >usableSize>32 )
32410 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20  ;.    if( nLeaf 
32420 3e 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62  > (u32)pBt->usab
32430 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a  leSize/4 - 2 ){.
32440 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
32450 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
32460 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
32470 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
32480 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3c 20 28     if( nLeaf < (
32490 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  u32)pBt->usableS
324a0 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20  ize/4 - 8 ){.   
324b0 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61     /* In this ca
324c0 73 65 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d  se there is room
324d0 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 70 61   on the trunk pa
324e0 67 65 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65  ge to insert the
324f0 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62   page.      ** b
32500 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20  eing freed as a 
32510 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20 20 20 20  new leaf..      
32520 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65  **.      ** Note
32530 20 74 68 61 74 20 74 68 65 20 74 72 75 6e 6b 20   that the trunk 
32540 70 61 67 65 20 69 73 20 6e 6f 74 20 72 65 61 6c  page is not real
32550 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74  ly full until it
32560 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20   contains.      
32570 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  ** usableSize/4 
32580 2d 20 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74  - 2 entries, not
32590 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
325a0 38 20 65 6e 74 72 69 65 73 20 61 73 20 77 65 20  8 entries as we 
325b0 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f  have.      ** co
325c0 64 65 64 2e 20 20 42 75 74 20 64 75 65 20 74 6f  ded.  But due to
325d0 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20   a coding error 
325e0 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  in versions of S
325f0 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 0a 20  QLite prior to. 
32600 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64       ** 3.6.0, d
32610 61 74 61 62 61 73 65 73 20 77 69 74 68 20 66 72  atabases with fr
32620 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
32630 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20  es holding more 
32640 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73  than.      ** us
32650 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65  ableSize/4 - 8 e
32660 6e 74 72 69 65 73 20 77 69 6c 6c 20 62 65 20 72  ntries will be r
32670 65 70 6f 72 74 65 64 20 61 73 20 63 6f 72 72 75  eported as corru
32680 70 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20 20  pt.  In order.  
32690 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61      ** to mainta
326a0 69 6e 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d  in backwards com
326b0 70 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 20  patibility with 
326c0 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  older versions o
326d0 66 20 53 51 4c 69 74 65 2c 0a 20 20 20 20 20 20  f SQLite,.      
326e0 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69  ** we will conti
326f0 6e 75 65 20 74 6f 20 72 65 73 74 72 69 63 74 20  nue to restrict 
32700 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
32710 74 72 69 65 73 20 74 6f 20 75 73 61 62 6c 65 53  tries to usableS
32720 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20 20 20  ize/4 - 8.      
32730 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20  ** for now.  At 
32740 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68  some point in th
32750 65 20 66 75 74 75 72 65 20 28 6f 6e 63 65 20 65  e future (once e
32760 76 65 72 79 6f 6e 65 20 68 61 73 20 75 70 67 72  veryone has upgr
32770 61 64 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f  aded.      ** to
32780 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72 29   3.6.0 or later)
32790 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69   we should consi
327a0 64 65 72 20 66 69 78 69 6e 67 20 74 68 65 20 63  der fixing the c
327b0 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65  onditional above
327c0 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 61  .      ** to rea
327d0 64 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d  d "usableSize/4-
327e0 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 75  2" instead of "u
327f0 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a  sableSize/4-8"..
32800 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
32810 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
32820 2d 31 39 39 32 30 2d 31 31 35 37 36 20 48 6f 77  -19920-11576 How
32830 65 76 65 72 2c 20 6e 65 77 65 72 20 76 65 72 73  ever, newer vers
32840 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 73  ions of SQLite s
32850 74 69 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61 76  till.      ** av
32860 6f 69 64 20 75 73 69 6e 67 20 74 68 65 20 6c 61  oid using the la
32870 73 74 20 73 69 78 20 65 6e 74 72 69 65 73 20 69  st six entries i
32880 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 74  n the freelist t
32890 72 75 6e 6b 20 70 61 67 65 20 61 72 72 61 79 20  runk page array 
328a0 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65  in.      ** orde
328b0 72 20 74 68 61 74 20 64 61 74 61 62 61 73 65 20  r that database 
328c0 66 69 6c 65 73 20 63 72 65 61 74 65 64 20 62 79  files created by
328d0 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20   newer versions 
328e0 6f 66 20 53 51 4c 69 74 65 20 63 61 6e 20 62 65  of SQLite can be
328f0 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 62  .      ** read b
32900 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73  y older versions
32910 20 6f 66 20 53 51 4c 69 74 65 2e 0a 20 20 20 20   of SQLite..    
32920 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
32930 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
32940 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
32950 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
32960 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
32970 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
32980 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
32990 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20  ], nLeaf+1);.   
329a0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
329b0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e  Trunk->aData[8+n
329c0 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b  Leaf*4], iPage);
329d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
329e0 67 65 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46  ge && (pBt->btsF
329f0 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52  lags & BTS_SECUR
32a00 45 5f 44 45 4c 45 54 45 29 3d 3d 30 20 29 7b 0a  E_DELETE)==0 ){.
32a10 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
32a20 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28  3PagerDontWrite(
32a30 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
32a40 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
32a50 20 20 20 72 63 20 3d 20 62 74 72 65 65 53 65 74     rc = btreeSet
32a60 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20  HasContent(pBt, 
32a70 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  iPage);.      }.
32a80 20 20 20 20 20 20 54 52 41 43 45 28 28 22 46 52        TRACE(("FR
32a90 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66  EE-PAGE: %d leaf
32aa0 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25   on trunk page %
32ab0 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f  d\n",pPage->pgno
32ac0 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b  ,pTrunk->pgno));
32ad0 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
32ae0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
32af0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e    }..  /* If con
32b00 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68  trol flows to th
32b10 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69  is point, then i
32b20 74 20 77 61 73 20 6e 6f 74 20 70 6f 73 73 69 62  t was not possib
32b30 6c 65 20 74 6f 20 61 64 64 20 74 68 65 0a 20 20  le to add the.  
32b40 2a 2a 20 74 68 65 20 70 61 67 65 20 62 65 69 6e  ** the page bein
32b50 67 20 66 72 65 65 64 20 61 73 20 61 20 6c 65 61  g freed as a lea
32b60 66 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69  f page of the fi
32b70 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65  rst trunk in the
32b80 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a   free-list..  **
32b90 20 50 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73   Possibly becaus
32ba0 65 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  e the free-list 
32bb0 69 73 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73  is empty, or pos
32bc0 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68  sibly because th
32bd0 65 20 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72  e .  ** first tr
32be0 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d  unk in the free-
32bf0 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e 20 45 69  list is full. Ei
32c00 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 70 61  ther way, the pa
32c10 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 0a 20  ge being freed. 
32c20 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20   ** will become 
32c30 74 68 65 20 6e 65 77 20 66 69 72 73 74 20 74 72  the new first tr
32c40 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
32c50 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a  free-list..  */.
32c60 20 20 69 66 28 20 70 50 61 67 65 3d 3d 30 20 26    if( pPage==0 &
32c70 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  & SQLITE_OK!=(rc
32c80 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
32c90 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61  pBt, iPage, &pPa
32ca0 67 65 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 67  ge, 0)) ){.    g
32cb0 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
32cc0 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
32cd0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
32ce0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
32cf0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
32d00 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
32d10 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
32d20 7d 0a 20 20 70 75 74 34 62 79 74 65 28 70 50 61  }.  put4byte(pPa
32d30 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 72 75 6e  ge->aData, iTrun
32d40 6b 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  k);.  put4byte(&
32d50 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c  pPage->aData[4],
32d60 20 30 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28   0);.  put4byte(
32d70 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
32d80 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 54 52  2], iPage);.  TR
32d90 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a  ACE(("FREE-PAGE:
32da0 20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61   %d new trunk pa
32db0 67 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c  ge replacing %d\
32dc0 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  n", pPage->pgno,
32dd0 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65   iTrunk));..free
32de0 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20  page_out:.  if( 
32df0 70 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61  pPage ){.    pPa
32e00 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
32e10 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67    }.  releasePag
32e20 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 6c 65  e(pPage);.  rele
32e30 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b  asePage(pTrunk);
32e40 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
32e50 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
32e60 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
32e70 61 67 65 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  age, int *pRC){.
32e80 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51    if( (*pRC)==SQ
32e90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
32ea0 70 52 43 20 3d 20 66 72 65 65 50 61 67 65 32 28  pRC = freePage2(
32eb0 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 50 61 67  pPage->pBt, pPag
32ec0 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  e, pPage->pgno);
32ed0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  .  }.}../*.** Fr
32ee0 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  ee any overflow 
32ef0 70 61 67 65 73 20 61 73 73 6f 63 69 61 74 65 64  pages associated
32f00 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
32f10 43 65 6c 6c 2e 20 20 57 72 69 74 65 20 74 68 65  Cell.  Write the
32f20 0a 2a 2a 20 6c 6f 63 61 6c 20 43 65 6c 6c 20 73  .** local Cell s
32f30 69 7a 65 20 28 74 68 65 20 6e 75 6d 62 65 72 20  ize (the number 
32f40 6f 66 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20  of bytes on the 
32f50 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 2c 20 6f  original page, o
32f60 6d 69 74 74 69 6e 67 0a 2a 2a 20 6f 76 65 72 66  mitting.** overf
32f70 6c 6f 77 29 20 69 6e 74 6f 20 2a 70 6e 53 69 7a  low) into *pnSiz
32f80 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
32f90 20 63 6c 65 61 72 43 65 6c 6c 28 0a 20 20 4d 65   clearCell(.  Me
32fa0 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
32fb0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
32fc0 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
32fd0 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 75   the Cell */.  u
32fe0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43  nsigned char *pC
32ff0 65 6c 6c 2c 20 20 20 20 2f 2a 20 46 69 72 73 74  ell,    /* First
33000 20 62 79 74 65 20 6f 66 20 74 68 65 20 43 65 6c   byte of the Cel
33010 6c 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  l */.  CellInfo 
33020 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 20  *pInfo          
33030 2f 2a 20 53 69 7a 65 20 69 6e 66 6f 72 6d 61 74  /* Size informat
33040 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 65  ion about the ce
33050 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61  ll */.){.  BtSha
33060 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
33070 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 6f 76  ->pBt;.  Pgno ov
33080 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  flPgno;.  int rc
33090 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20  ;.  int nOvfl;. 
330a0 20 75 33 32 20 6f 76 66 6c 50 61 67 65 53 69 7a   u32 ovflPageSiz
330b0 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  e;..  assert( sq
330c0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
330d0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
330e0 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e  ex) );.  pPage->
330f0 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
33100 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b  , pCell, pInfo);
33110 0a 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 4c  .  if( pInfo->nL
33120 6f 63 61 6c 3d 3d 70 49 6e 66 6f 2d 3e 6e 50 61  ocal==pInfo->nPa
33130 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 72 65 74  yload ){.    ret
33140 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  urn SQLITE_OK;  
33150 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70  /* No overflow p
33160 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74  ages. Return wit
33170 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68  hout doing anyth
33180 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  ing */.  }.  if(
33190 20 70 43 65 6c 6c 2b 70 49 6e 66 6f 2d 3e 6e 53   pCell+pInfo->nS
331a0 69 7a 65 2d 31 20 3e 20 70 50 61 67 65 2d 3e 61  ize-1 > pPage->a
331b0 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b  Data+pPage->mask
331c0 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Page ){.    retu
331d0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
331e0 54 5f 42 4b 50 54 3b 20 20 2f 2a 20 43 65 6c 6c  T_BKPT;  /* Cell
331f0 20 65 78 74 65 6e 64 73 20 70 61 73 74 20 65 6e   extends past en
33200 64 20 6f 66 20 70 61 67 65 20 2a 2f 0a 20 20 7d  d of page */.  }
33210 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65  .  ovflPgno = ge
33220 74 34 62 79 74 65 28 70 43 65 6c 6c 20 2b 20 70  t4byte(pCell + p
33230 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 2d 20 34 29  Info->nSize - 4)
33240 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
33250 3e 75 73 61 62 6c 65 53 69 7a 65 20 3e 20 34 20  >usableSize > 4 
33260 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53 69 7a  );.  ovflPageSiz
33270 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
33280 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c  ize - 4;.  nOvfl
33290 20 3d 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c   = (pInfo->nPayl
332a0 6f 61 64 20 2d 20 70 49 6e 66 6f 2d 3e 6e 4c 6f  oad - pInfo->nLo
332b0 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69  cal + ovflPageSi
332c0 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65  ze - 1)/ovflPage
332d0 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Size;.  assert( 
332e0 6e 4f 76 66 6c 3e 30 20 7c 7c 20 0a 20 20 20 20  nOvfl>0 || .    
332f0 28 43 4f 52 52 55 50 54 5f 44 42 20 26 26 20 28  (CORRUPT_DB && (
33300 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20  pInfo->nPayload 
33310 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 29 3c  + ovflPageSize)<
33320 6f 76 66 6c 50 61 67 65 53 69 7a 65 29 0a 20 20  ovflPageSize).  
33330 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66  );.  while( nOvf
33340 6c 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  l-- ){.    Pgno 
33350 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d  iNext = 0;.    M
33360 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20  emPage *pOvfl = 
33370 30 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50  0;.    if( ovflP
33380 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e  gno<2 || ovflPgn
33390 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  o>btreePagecount
333a0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  (pBt) ){.      /
333b0 2a 20 30 20 69 73 20 6e 6f 74 20 61 20 6c 65 67  * 0 is not a leg
333c0 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  al page number a
333d0 6e 64 20 70 61 67 65 20 31 20 63 61 6e 6e 6f 74  nd page 1 cannot
333e0 20 62 65 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a   be an .      **
333f0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
33400 54 68 65 72 65 66 6f 72 65 20 69 66 20 6f 76 66  Therefore if ovf
33410 6c 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20  lPgno<2 or past 
33420 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a  the end of the .
33430 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 74 68        ** file th
33440 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
33450 62 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20  be corrupt. */. 
33460 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
33470 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
33480 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
33490 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  Ovfl ){.      rc
334a0 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61   = getOverflowPa
334b0 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f  ge(pBt, ovflPgno
334c0 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74  , &pOvfl, &iNext
334d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
334e0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
334f0 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 20 70 4f   }..    if( ( pO
33500 76 66 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d  vfl || ((pOvfl =
33510 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70   btreePageLookup
33520 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29  (pBt, ovflPgno))
33530 21 3d 30 29 20 29 0a 20 20 20 20 20 26 26 20 73  !=0) ).     && s
33540 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
33550 65 66 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70  efcount(pOvfl->p
33560 44 62 50 61 67 65 29 21 3d 31 0a 20 20 20 20 29  DbPage)!=1.    )
33570 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65  {.      /* There
33580 20 69 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e   is no reason an
33590 79 20 63 75 72 73 6f 72 20 73 68 6f 75 6c 64 20  y cursor should 
335a0 68 61 76 65 20 61 6e 20 6f 75 74 73 74 61 6e 64  have an outstand
335b0 69 6e 67 20 72 65 66 65 72 65 6e 63 65 20 0a 20  ing reference . 
335c0 20 20 20 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76       ** to an ov
335d0 65 72 66 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f  erflow page belo
335e0 6e 67 69 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20  nging to a cell 
335f0 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 64 65  that is being de
33600 6c 65 74 65 64 2f 75 70 64 61 74 65 64 2e 0a 20  leted/updated.. 
33610 20 20 20 20 20 2a 2a 20 53 6f 20 69 66 20 74 68       ** So if th
33620 65 72 65 20 65 78 69 73 74 73 20 6d 6f 72 65 20  ere exists more 
33630 74 68 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e  than one referen
33640 63 65 20 74 6f 20 74 68 69 73 20 70 61 67 65 2c  ce to this page,
33650 20 74 68 65 6e 20 69 74 20 0a 20 20 20 20 20 20   then it .      
33660 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c  ** must not real
33670 6c 79 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f  ly be an overflo
33680 77 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 64  w page and the d
33690 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
336a0 63 6f 72 72 75 70 74 2e 20 0a 20 20 20 20 20 20  corrupt. .      
336b0 2a 2a 20 49 74 20 69 73 20 68 65 6c 70 66 75 6c  ** It is helpful
336c0 20 74 6f 20 64 65 74 65 63 74 20 74 68 69 73 20   to detect this 
336d0 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66  before calling f
336e0 72 65 65 50 61 67 65 32 28 29 2c 20 61 73 20 0a  reePage2(), as .
336f0 20 20 20 20 20 20 2a 2a 20 66 72 65 65 50 61 67        ** freePag
33700 65 32 28 29 20 6d 61 79 20 7a 65 72 6f 20 74 68  e2() may zero th
33710 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20  e page contents 
33720 69 66 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65  if secure-delete
33730 20 6d 6f 64 65 20 69 73 0a 20 20 20 20 20 20 2a   mode is.      *
33740 2a 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68  * enabled. If th
33750 69 73 20 27 6f 76 65 72 66 6c 6f 77 27 20 70 61  is 'overflow' pa
33760 67 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65  ge happens to be
33770 20 61 20 70 61 67 65 20 74 68 61 74 20 74 68 65   a page that the
33780 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72  .      ** caller
33790 20 69 73 20 69 74 65 72 61 74 69 6e 67 20 74 68   is iterating th
337a0 72 6f 75 67 68 20 6f 72 20 75 73 69 6e 67 20 69  rough or using i
337b0 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 77 61 79  n some other way
337c0 2c 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20  , this.      ** 
337d0 63 61 6e 20 62 65 20 70 72 6f 62 6c 65 6d 61 74  can be problemat
337e0 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ic..      */.   
337f0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
33800 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
33810 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
33820 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 42 74   = freePage2(pBt
33830 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e  , pOvfl, ovflPgn
33840 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  o);.    }..    i
33850 66 28 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20  f( pOvfl ){.    
33860 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
33870 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61  ref(pOvfl->pDbPa
33880 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ge);.    }.    i
33890 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
338a0 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20  c;.    ovflPgno 
338b0 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72  = iNext;.  }.  r
338c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
338d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
338e0 20 74 68 65 20 62 79 74 65 20 73 65 71 75 65 6e   the byte sequen
338f0 63 65 20 75 73 65 64 20 74 6f 20 72 65 70 72 65  ce used to repre
33900 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70  sent a cell on p
33910 61 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64  age pPage.** and
33920 20 77 72 69 74 65 20 74 68 61 74 20 62 79 74 65   write that byte
33930 20 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70   sequence into p
33940 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f  Cell[].  Overflo
33950 77 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61  w pages are.** a
33960 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c  llocated and fil
33970 6c 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73  led in as necess
33980 61 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e  ary.  The callin
33990 67 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69  g procedure.** i
339a0 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
339b0 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75  r making sure su
339c0 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 68  fficient space h
339d0 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
339e0 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d  d.** for pCell[]
339f0 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
33a00 74 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74  t pCell does not
33a10 20 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64 20   necessary need 
33a20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
33a30 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20  pPage->aData.** 
33a40 61 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67  area.  pCell mig
33a50 68 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65  ht point to some
33a60 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61   temporary stora
33a70 67 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69  ge.  The cell wi
33a80 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75  ll.** be constru
33a90 63 74 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d  cted in this tem
33aa0 70 6f 72 61 72 79 20 61 72 65 61 20 74 68 65 6e  porary area then
33ab0 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61   copied into pPa
33ac0 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74  ge->aData.** lat
33ad0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
33ae0 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20  t fillInCell(.  
33af0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
33b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
33b10 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
33b20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c  contains the cel
33b30 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  l */.  unsigned 
33b40 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20  char *pCell,    
33b50 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74        /* Complet
33b60 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 65  e text of the ce
33b70 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 42 74  ll */.  const Bt
33b80 72 65 65 50 61 79 6c 6f 61 64 20 2a 70 58 2c 20  reePayload *pX, 
33b90 20 20 20 20 20 20 20 2f 2a 20 50 61 79 6c 6f 61         /* Payloa
33ba0 64 20 77 69 74 68 20 77 68 69 63 68 20 74 6f 20  d with which to 
33bb0 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20 63 65  construct the ce
33bc0 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53  ll */.  int *pnS
33bd0 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ize             
33be0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
33bf0 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65 20 2a  cell size here *
33c00 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c  /.){.  int nPayl
33c10 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20  oad;.  const u8 
33c20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72  *pSrc;.  int nSr
33c30 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20  c, n, rc;.  int 
33c40 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d  spaceLeft;.  Mem
33c50 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b  Page *pOvfl = 0;
33c60 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52  .  MemPage *pToR
33c70 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e  elease = 0;.  un
33c80 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72  signed char *pPr
33c90 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  ior;.  unsigned 
33ca0 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a  char *pPayload;.
33cb0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
33cc0 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
33cd0 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20  Pgno pgnoOvfl = 
33ce0 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72  0;.  int nHeader
33cf0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
33d00 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
33d10 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
33d20 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67  x) );..  /* pPag
33d30 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  e is not necessa
33d40 72 69 6c 79 20 77 72 69 74 65 61 62 6c 65 20 73  rily writeable s
33d50 69 6e 63 65 20 70 43 65 6c 6c 20 6d 69 67 68 74  ince pCell might
33d60 20 62 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20   be auxiliary.  
33d70 2a 2a 20 62 75 66 66 65 72 20 73 70 61 63 65 20  ** buffer space 
33d80 74 68 61 74 20 69 73 20 73 65 70 61 72 61 74 65  that is separate
33d90 20 66 72 6f 6d 20 74 68 65 20 70 50 61 67 65 20   from the pPage 
33da0 62 75 66 66 65 72 20 61 72 65 61 20 2a 2f 0a 20  buffer area */. 
33db0 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c 3c 70   assert( pCell<p
33dc0 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70  Page->aData || p
33dd0 43 65 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44  Cell>=&pPage->aD
33de0 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  ata[pBt->pageSiz
33df0 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  e].            |
33e00 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
33e10 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
33e20 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
33e30 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 68  /* Fill in the h
33e40 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61  eader. */.  nHea
33e50 64 65 72 20 3d 20 70 50 61 67 65 2d 3e 63 68 69  der = pPage->chi
33e60 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 69 66 28  ldPtrSize;.  if(
33e70 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
33e80 7b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d  {.    nPayload =
33e90 20 70 58 2d 3e 6e 44 61 74 61 20 2b 20 70 58 2d   pX->nData + pX-
33ea0 3e 6e 5a 65 72 6f 3b 0a 20 20 20 20 70 53 72 63  >nZero;.    pSrc
33eb0 20 3d 20 70 58 2d 3e 70 44 61 74 61 3b 0a 20 20   = pX->pData;.  
33ec0 20 20 6e 53 72 63 20 3d 20 70 58 2d 3e 6e 44 61    nSrc = pX->nDa
33ed0 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ta;.    assert( 
33ee0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61  pPage->intKeyLea
33ef0 66 20 29 3b 20 2f 2a 20 66 69 6c 6c 49 6e 43 65  f ); /* fillInCe
33f00 6c 6c 28 29 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  ll() only called
33f10 20 66 6f 72 20 6c 65 61 76 65 73 20 2a 2f 0a 20   for leaves */. 
33f20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75     nHeader += pu
33f30 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c  tVarint32(&pCell
33f40 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 50 61 79 6c  [nHeader], nPayl
33f50 6f 61 64 29 3b 0a 20 20 20 20 6e 48 65 61 64 65  oad);.    nHeade
33f60 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26  r += putVarint(&
33f70 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20  pCell[nHeader], 
33f80 2a 28 75 36 34 2a 29 26 70 58 2d 3e 6e 4b 65 79  *(u64*)&pX->nKey
33f90 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
33fa0 61 73 73 65 72 74 28 20 70 58 2d 3e 6e 4b 65 79  assert( pX->nKey
33fb0 3c 3d 30 78 37 66 66 66 66 66 66 66 20 26 26 20  <=0x7fffffff && 
33fc0 70 58 2d 3e 70 4b 65 79 21 3d 30 20 29 3b 0a 20  pX->pKey!=0 );. 
33fd0 20 20 20 6e 53 72 63 20 3d 20 6e 50 61 79 6c 6f     nSrc = nPaylo
33fe0 61 64 20 3d 20 28 69 6e 74 29 70 58 2d 3e 6e 4b  ad = (int)pX->nK
33ff0 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70  ey;.    pSrc = p
34000 58 2d 3e 70 4b 65 79 3b 0a 20 20 20 20 6e 48 65  X->pKey;.    nHe
34010 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e  ader += putVarin
34020 74 33 32 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64  t32(&pCell[nHead
34030 65 72 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a  er], nPayload);.
34040 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c    }.  .  /* Fill
34050 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20   in the payload 
34060 2a 2f 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61  */.  if( nPayloa
34070 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d<=pPage->maxLoc
34080 61 6c 20 29 7b 0a 20 20 20 20 6e 20 3d 20 6e 48  al ){.    n = nH
34090 65 61 64 65 72 20 2b 20 6e 50 61 79 6c 6f 61 64  eader + nPayload
340a0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
340b0 6e 3d 3d 33 20 29 3b 0a 20 20 20 20 74 65 73 74  n==3 );.    test
340c0 63 61 73 65 28 20 6e 3d 3d 34 20 29 3b 0a 20 20  case( n==4 );.  
340d0 20 20 69 66 28 20 6e 3c 34 20 29 20 6e 20 3d 20    if( n<4 ) n = 
340e0 34 3b 0a 20 20 20 20 2a 70 6e 53 69 7a 65 20 3d  4;.    *pnSize =
340f0 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66   n;.    spaceLef
34100 74 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  t = nPayload;.  
34110 20 20 70 50 72 69 6f 72 20 3d 20 70 43 65 6c 6c    pPrior = pCell
34120 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
34130 6e 74 20 6d 6e 20 3d 20 70 50 61 67 65 2d 3e 6d  nt mn = pPage->m
34140 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 20 3d  inLocal;.    n =
34150 20 6d 6e 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20   mn + (nPayload 
34160 2d 20 6d 6e 29 20 25 20 28 70 50 61 67 65 2d 3e  - mn) % (pPage->
34170 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
34180 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61  - 4);.    testca
34190 73 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61  se( n==pPage->ma
341a0 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65  xLocal );.    te
341b0 73 74 63 61 73 65 28 20 6e 3d 3d 70 50 61 67 65  stcase( n==pPage
341c0 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
341d0 20 20 20 20 69 66 28 20 6e 20 3e 20 70 50 61 67      if( n > pPag
341e0 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 20 6e 20  e->maxLocal ) n 
341f0 3d 20 6d 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c  = mn;.    spaceL
34200 65 66 74 20 3d 20 6e 3b 0a 20 20 20 20 2a 70 6e  eft = n;.    *pn
34210 53 69 7a 65 20 3d 20 6e 20 2b 20 6e 48 65 61 64  Size = n + nHead
34220 65 72 20 2b 20 34 3b 0a 20 20 20 20 70 50 72 69  er + 4;.    pPri
34230 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61  or = &pCell[nHea
34240 64 65 72 2b 6e 5d 3b 0a 20 20 7d 0a 20 20 70 50  der+n];.  }.  pP
34250 61 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b  ayload = &pCell[
34260 6e 48 65 61 64 65 72 5d 3b 0a 0a 20 20 2f 2a 20  nHeader];..  /* 
34270 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 76 61  At this point va
34280 72 69 61 62 6c 65 73 20 73 68 6f 75 6c 64 20 62  riables should b
34290 65 20 73 65 74 20 61 73 20 66 6f 6c 6c 6f 77 73  e set as follows
342a0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 6e 50  :.  **.  **   nP
342b0 61 79 6c 6f 61 64 20 20 20 20 20 20 20 20 20 20  ayload          
342c0 20 54 6f 74 61 6c 20 70 61 79 6c 6f 61 64 20 73   Total payload s
342d0 69 7a 65 20 69 6e 20 62 79 74 65 73 0a 20 20 2a  ize in bytes.  *
342e0 2a 20 20 20 70 50 61 79 6c 6f 61 64 20 20 20 20  *   pPayload    
342f0 20 20 20 20 20 20 20 42 65 67 69 6e 20 77 72 69         Begin wri
34300 74 69 6e 67 20 70 61 79 6c 6f 61 64 20 68 65 72  ting payload her
34310 65 0a 20 20 2a 2a 20 20 20 73 70 61 63 65 4c 65  e.  **   spaceLe
34320 66 74 20 20 20 20 20 20 20 20 20 20 53 70 61 63  ft          Spac
34330 65 20 61 76 61 69 6c 61 62 6c 65 20 61 74 20 70  e available at p
34340 50 61 79 6c 6f 61 64 2e 20 20 49 66 20 6e 50 61  Payload.  If nPa
34350 79 6c 6f 61 64 3e 73 70 61 63 65 4c 65 66 74 2c  yload>spaceLeft,
34360 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .  **           
34370 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20             that 
34380 6d 65 61 6e 73 20 63 6f 6e 74 65 6e 74 20 6d 75  means content mu
34390 73 74 20 73 70 69 6c 6c 20 69 6e 74 6f 20 6f 76  st spill into ov
343a0 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20  erflow pages..  
343b0 2a 2a 20 20 20 2a 70 6e 53 69 7a 65 20 20 20 20  **   *pnSize    
343c0 20 20 20 20 20 20 20 20 53 69 7a 65 20 6f 66 20          Size of 
343d0 74 68 65 20 6c 6f 63 61 6c 20 63 65 6c 6c 20 28  the local cell (
343e0 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 6f 76 65  not counting ove
343f0 72 66 6c 6f 77 20 70 61 67 65 73 29 0a 20 20 2a  rflow pages).  *
34400 2a 20 20 20 70 50 72 69 6f 72 20 20 20 20 20 20  *   pPrior      
34410 20 20 20 20 20 20 20 57 68 65 72 65 20 74 6f 20         Where to 
34420 77 72 69 74 65 20 74 68 65 20 70 67 6e 6f 20 6f  write the pgno o
34430 66 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  f the first over
34440 66 6c 6f 77 20 70 61 67 65 0a 20 20 2a 2a 0a 20  flow page.  **. 
34450 20 2a 2a 20 55 73 65 20 61 20 63 61 6c 6c 20 74   ** Use a call t
34460 6f 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  o btreeParseCell
34470 50 74 72 28 29 20 74 6f 20 76 65 72 69 66 79 20  Ptr() to verify 
34480 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73 20  that the values 
34490 61 62 6f 76 65 0a 20 20 2a 2a 20 77 65 72 65 20  above.  ** were 
344a0 63 6f 6d 70 75 74 65 64 20 63 6f 72 72 65 63 74  computed correct
344b0 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 20 53 51 4c  ly..  */.#if SQL
344c0 49 54 45 5f 44 45 42 55 47 0a 20 20 7b 0a 20 20  ITE_DEBUG.  {.  
344d0 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
344e0 0a 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72  .    pPage->xPar
344f0 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  seCell(pPage, pC
34500 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  ell, &info);.   
34510 20 61 73 73 65 72 74 28 20 6e 48 65 61 64 65 72   assert( nHeader
34520 3d 3d 28 69 6e 74 29 28 69 6e 66 6f 2e 70 50 61  ==(int)(info.pPa
34530 79 6c 6f 61 64 20 2d 20 70 43 65 6c 6c 29 20 29  yload - pCell) )
34540 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 6e  ;.    assert( in
34550 66 6f 2e 6e 4b 65 79 3d 3d 70 58 2d 3e 6e 4b 65  fo.nKey==pX->nKe
34560 79 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  y );.    assert(
34570 20 2a 70 6e 53 69 7a 65 20 3d 3d 20 69 6e 66 6f   *pnSize == info
34580 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73  .nSize );.    as
34590 73 65 72 74 28 20 73 70 61 63 65 4c 65 66 74 20  sert( spaceLeft 
345a0 3d 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  == info.nLocal )
345b0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
345c0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 79  /* Write the pay
345d0 6c 6f 61 64 20 69 6e 74 6f 20 74 68 65 20 6c 6f  load into the lo
345e0 63 61 6c 20 43 65 6c 6c 20 61 6e 64 20 61 6e 79  cal Cell and any
345f0 20 65 78 74 72 61 20 69 6e 74 6f 20 6f 76 65 72   extra into over
34600 66 6c 6f 77 20 70 61 67 65 73 20 2a 2f 0a 20 20  flow pages */.  
34610 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e  while( nPayload>
34620 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61  0 ){.    if( spa
34630 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66  ceLeft==0 ){.#if
34640 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
34650 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
34660 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61    Pgno pgnoPtrma
34670 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a  p = pgnoOvfl; /*
34680 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70   Overflow page p
34690 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79  ointer-map entry
346a0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69   page */.      i
346b0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
346c0 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f  um ){.        do
346d0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f  {.          pgno
346e0 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20  Ovfl++;.        
346f0 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20  } while( .      
34700 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47      PTRMAP_ISPAG
34710 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29  E(pBt, pgnoOvfl)
34720 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45   || pgnoOvfl==PE
34730 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
34740 70 42 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b  pBt) .        );
34750 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
34760 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
34770 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
34780 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f  , &pOvfl, &pgnoO
34790 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30  vfl, pgnoOvfl, 0
347a0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
347b0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
347c0 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  M.      /* If th
347d0 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f  e database suppo
347e0 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c  rts auto-vacuum,
347f0 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20   and the second 
34800 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20  or subsequent.  
34810 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20      ** overflow 
34820 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c  page is being al
34830 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20  located, add an 
34840 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69  entry to the poi
34850 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a  nter-map.      *
34860 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 20  * for that page 
34870 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20  now. .      **. 
34880 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20       ** If this 
34890 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 76 65  is the first ove
348a0 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e  rflow page, then
348b0 20 77 72 69 74 65 20 61 20 70 61 72 74 69 61 6c   write a partial
348c0 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a   entry .      **
348d0 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   to the pointer-
348e0 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69 74 65  map. If we write
348f0 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73   nothing to this
34900 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f   pointer-map slo
34910 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  t,.      ** then
34920 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20   the optimistic 
34930 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70  overflow chain p
34940 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65  rocessing in cle
34950 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a  arCell().      *
34960 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72  * may misinterpr
34970 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c  et the uninitial
34980 69 7a 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20  ized values and 
34990 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20  delete the.     
349a0 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20   ** wrong pages 
349b0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
349c0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
349d0 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
349e0 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c  acuum && rc==SQL
349f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
34a00 20 20 75 38 20 65 54 79 70 65 20 3d 20 28 70 67    u8 eType = (pg
34a10 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f  noPtrmap?PTRMAP_
34a20 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50  OVERFLOW2:PTRMAP
34a30 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20  _OVERFLOW1);.   
34a40 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
34a50 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54  Bt, pgnoOvfl, eT
34a60 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 2c  ype, pgnoPtrmap,
34a70 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69   &rc);.        i
34a80 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
34a90 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
34aa0 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  Ovfl);.        }
34ab0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
34ac0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
34ad0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
34ae0 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b  age(pToRelease);
34af0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
34b00 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rc;.      }..   
34b10 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65     /* If pToRele
34b20 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20  ase is not zero 
34b30 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e  than pPrior poin
34b40 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ts into the data
34b50 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f   area.      ** o
34b60 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d  f pToRelease.  M
34b70 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65  ake sure pToRele
34b80 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69  ase is still wri
34b90 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20  teable. */.     
34ba0 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65   assert( pToRele
34bb0 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase==0 || sqlite
34bc0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
34bd0 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44  e(pToRelease->pD
34be0 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20  bPage) );..     
34bf0 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69 73   /* If pPrior is
34c00 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
34c10 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c  a area of pPage,
34c20 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20   then make sure 
34c30 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69  pPage.      ** i
34c40 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
34c50 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  e */.      asser
34c60 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65 2d  t( pPrior<pPage-
34c70 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f 72  >aData || pPrior
34c80 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  >=&pPage->aData[
34c90 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20  pBt->pageSize]. 
34ca0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
34cb0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
34cc0 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
34cd0 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20  Page) );..      
34ce0 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c  put4byte(pPrior,
34cf0 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20   pgnoOvfl);.    
34d00 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
34d10 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20  oRelease);.     
34d20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f   pToRelease = pO
34d30 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  vfl;.      pPrio
34d40 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61  r = pOvfl->aData
34d50 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
34d60 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20  (pPrior, 0);.   
34d70 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70     pPayload = &p
34d80 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a  Ovfl->aData[4];.
34d90 20 20 20 20 20 20 73 70 61 63 65 4c 65 66 74 20        spaceLeft 
34da0 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
34db0 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20  e - 4;.    }.   
34dc0 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20   n = nPayload;. 
34dd0 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65     if( n>spaceLe
34de0 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65  ft ) n = spaceLe
34df0 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70  ft;..    /* If p
34e00 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74  ToRelease is not
34e10 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61 79 6c   zero than pPayl
34e20 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20  oad points into 
34e30 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20  the data area.  
34e40 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61    ** of pToRelea
34e50 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70  se.  Make sure p
34e60 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74 69  ToRelease is sti
34e70 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f  ll writeable. */
34e80 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f  .    assert( pTo
34e90 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71  Release==0 || sq
34ea0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
34eb0 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65  eable(pToRelease
34ec0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
34ed0 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61     /* If pPayloa
34ee0 64 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  d is part of the
34ef0 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70 50   data area of pP
34f00 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73  age, then make s
34f10 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 2a 2a  ure pPage.    **
34f20 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
34f30 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ble */.    asser
34f40 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50 61 67  t( pPayload<pPag
34f50 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 61 79  e->aData || pPay
34f60 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44  load>=&pPage->aD
34f70 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  ata[pBt->pageSiz
34f80 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  e].            |
34f90 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
34fa0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
34fb0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
34fc0 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a    if( nSrc>0 ){.
34fd0 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72 63        if( n>nSrc
34fe0 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20   ) n = nSrc;.   
34ff0 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20     assert( pSrc 
35000 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
35010 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20  pPayload, pSrc, 
35020 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
35030 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79       memset(pPay
35040 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20  load, 0, n);.   
35050 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20   }.    nPayload 
35060 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f  -= n;.    pPaylo
35070 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72  ad += n;.    pSr
35080 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63  c += n;.    nSrc
35090 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65   -= n;.    space
350a0 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 7d 0a 20  Left -= n;.  }. 
350b0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
350c0 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74 75  Release);.  retu
350d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
350e0 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68  ./*.** Remove th
350f0 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d  e i-th cell from
35100 20 70 50 61 67 65 2e 20 20 54 68 69 73 20 72 6f   pPage.  This ro
35110 75 74 69 6e 65 20 65 66 66 65 63 74 73 20 70 50  utine effects pP
35120 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65  age only..** The
35130 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73   cell content is
35140 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64 65   not freed or de
35150 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20 69  allocated.  It i
35160 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a  s assumed that.*
35170 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  * the cell conte
35180 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70 69  nt has been copi
35190 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73  ed someplace els
351a0 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
351b0 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73   just.** removes
351c0 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74   the reference t
351d0 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20  o the cell from 
351e0 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a  pPage..**.** "sz
351f0 22 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e 75  " must be the nu
35200 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
35210 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74   the cell..*/.st
35220 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70 43 65  atic void dropCe
35230 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ll(MemPage *pPag
35240 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20  e, int idx, int 
35250 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20  sz, int *pRC){. 
35260 20 75 33 32 20 70 63 3b 20 20 20 20 20 20 20 20   u32 pc;        
35270 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 65   /* Offset to ce
35280 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65  ll content of ce
35290 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64  ll being deleted
352a0 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20   */.  u8 *data; 
352b0 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e        /* pPage->
352c0 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70  aData */.  u8 *p
352d0 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55 73  tr;        /* Us
352e0 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65 73  ed to move bytes
352f0 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20 64   around within d
35300 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72  ata[] */.  int r
35310 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  c;         /* Th
35320 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  e return code */
35330 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20  .  int hdr;     
35340 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20     /* Beginning 
35350 6f 66 20 74 68 65 20 68 65 61 64 65 72 2e 20 20  of the header.  
35360 30 20 6d 6f 73 74 20 70 61 67 65 73 2e 20 20 31  0 most pages.  1
35370 30 30 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20 20  00 page 1 */..  
35380 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
35390 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78  n;.  assert( idx
353a0 3e 3d 30 20 26 26 20 69 64 78 3c 70 50 61 67 65  >=0 && idx<pPage
353b0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73  ->nCell );.  ass
353c0 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20  ert( CORRUPT_DB 
353d0 7c 7c 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28  || sz==cellSize(
353e0 70 50 61 67 65 2c 20 69 64 78 29 20 29 3b 0a 20  pPage, idx) );. 
353f0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
35400 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
35410 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
35420 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
35430 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
35440 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
35450 65 78 29 20 29 3b 0a 20 20 64 61 74 61 20 3d 20  ex) );.  data = 
35460 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
35470 70 74 72 20 3d 20 26 70 50 61 67 65 2d 3e 61 43  ptr = &pPage->aC
35480 65 6c 6c 49 64 78 5b 32 2a 69 64 78 5d 3b 0a 20  ellIdx[2*idx];. 
35490 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70   pc = get2byte(p
354a0 74 72 29 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  tr);.  hdr = pPa
354b0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
354c0 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 67   testcase( pc==g
354d0 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
354e0 72 2b 35 5d 29 20 29 3b 0a 20 20 74 65 73 74 63  r+5]) );.  testc
354f0 61 73 65 28 20 70 63 2b 73 7a 3d 3d 70 50 61 67  ase( pc+sz==pPag
35500 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
35510 7a 65 20 29 3b 0a 20 20 69 66 28 20 70 63 20 3c  ze );.  if( pc <
35520 20 28 75 33 32 29 67 65 74 32 62 79 74 65 28 26   (u32)get2byte(&
35530 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 7c 7c 20  data[hdr+5]) || 
35540 70 63 2b 73 7a 20 3e 20 70 50 61 67 65 2d 3e 70  pc+sz > pPage->p
35550 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
35560 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c  {.    *pRC = SQL
35570 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
35580 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
35590 7d 0a 20 20 72 63 20 3d 20 66 72 65 65 53 70 61  }.  rc = freeSpa
355a0 63 65 28 70 50 61 67 65 2c 20 70 63 2c 20 73 7a  ce(pPage, pc, sz
355b0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
355c0 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20     *pRC = rc;.  
355d0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
355e0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a  pPage->nCell--;.
355f0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65    if( pPage->nCe
35600 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 65 6d  ll==0 ){.    mem
35610 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  set(&data[hdr+1]
35620 2c 20 30 2c 20 34 29 3b 0a 20 20 20 20 64 61 74  , 0, 4);.    dat
35630 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20  a[hdr+7] = 0;.  
35640 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
35650 5b 68 64 72 2b 35 5d 2c 20 70 50 61 67 65 2d 3e  [hdr+5], pPage->
35660 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29  pBt->usableSize)
35670 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72  ;.    pPage->nFr
35680 65 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  ee = pPage->pBt-
35690 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 70 50  >usableSize - pP
356a0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 0a 20  age->hdrOffset. 
356b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
356c0 20 20 20 20 20 20 2d 20 70 50 61 67 65 2d 3e 63        - pPage->c
356d0 68 69 6c 64 50 74 72 53 69 7a 65 20 2d 20 38 3b  hildPtrSize - 8;
356e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65  .  }else{.    me
356f0 6d 6d 6f 76 65 28 70 74 72 2c 20 70 74 72 2b 32  mmove(ptr, ptr+2
35700 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e 43 65 6c  , 2*(pPage->nCel
35710 6c 20 2d 20 69 64 78 29 29 3b 0a 20 20 20 20 70  l - idx));.    p
35720 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
35730 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65  r+3], pPage->nCe
35740 6c 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ll);.    pPage->
35750 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20 7d 0a  nFree += 2;.  }.
35760 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20  }../*.** Insert 
35770 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50  a new cell on pP
35780 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64 65  age at cell inde
35790 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f  x "i".  pCell po
357a0 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63  ints to the.** c
357b0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63 65  ontent of the ce
357c0 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ll..**.** If the
357d0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69   cell content wi
357e0 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61  ll fit on the pa
357f0 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74 20  ge, then put it 
35800 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a  there.  If it.**
35810 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74   will not fit, t
35820 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79 20  hen make a copy 
35830 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  of the cell cont
35840 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20 69  ent into pTemp i
35850 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f  f.** pTemp is no
35860 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c  t null.  Regardl
35870 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c  ess of pTemp, al
35880 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e 74  locate a new ent
35890 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e  ry.** in pPage->
358a0 61 70 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b  apOvfl[] and mak
358b0 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20 74 68  e it point to th
358c0 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28  e cell content (
358d0 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65  either.** in pTe
358e0 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67 69 6e  mp or the origin
358f0 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c  al pCell) and al
35900 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20 69 6e  so record its in
35910 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74  dex. .** Allocat
35920 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72 79 20  ing a new entry 
35930 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b  in pPage->aCell[
35940 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 0a  ] implies that .
35950 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  ** pPage->nOverf
35960 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  low is increment
35970 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 52 43 20 6d  ed..**.** *pRC m
35980 75 73 74 20 62 65 20 53 51 4c 49 54 45 5f 4f 4b  ust be SQLITE_OK
35990 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
359a0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f  ne is called..*/
359b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 73  .static void ins
359c0 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  ertCell(.  MemPa
359d0 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20  ge *pPage,   /* 
359e0 50 61 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20  Page into which 
359f0 77 65 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a  we are copying *
35a00 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20  /.  int i,      
35a10 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c        /* New cel
35a20 6c 20 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d  l becomes the i-
35a30 74 68 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70  th cell of the p
35a40 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  age */.  u8 *pCe
35a50 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ll,        /* Co
35a60 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77  ntent of the new
35a70 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73   cell */.  int s
35a80 7a 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  z,           /* 
35a90 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74  Bytes of content
35aa0 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75   in pCell */.  u
35ab0 38 20 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20  8 *pTemp,       
35ac0 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65   /* Temp storage
35ad0 20 73 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c   space for pCell
35ae0 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20  , if needed */. 
35af0 20 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20   Pgno iChild,   
35b00 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72     /* If non-zer
35b10 6f 2c 20 72 65 70 6c 61 63 65 20 66 69 72 73 74  o, replace first
35b20 20 34 20 62 79 74 65 73 20 77 69 74 68 20 74 68   4 bytes with th
35b30 69 73 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e  is value */.  in
35b40 74 20 2a 70 52 43 20 20 20 20 20 20 20 20 20 20  t *pRC          
35b50 2f 2a 20 52 65 61 64 20 61 6e 64 20 77 72 69 74  /* Read and writ
35b60 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 66 72  e return code fr
35b70 6f 6d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  om here */.){.  
35b80 69 6e 74 20 69 64 78 20 3d 20 30 3b 20 20 20 20  int idx = 0;    
35b90 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72    /* Where to wr
35ba0 69 74 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e  ite new cell con
35bb0 74 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a  tent in data[] *
35bc0 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20  /.  int j;      
35bd0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
35be0 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 64  unter */.  u8 *d
35bf0 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ata;         /* 
35c00 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  The content of t
35c10 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f  he whole page */
35c20 0a 20 20 75 38 20 2a 70 49 6e 73 3b 20 20 20 20  .  u8 *pIns;    
35c30 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e       /* The poin
35c40 74 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c  t in pPage->aCel
35c50 6c 49 64 78 5b 5d 20 77 68 65 72 65 20 6e 6f 20  lIdx[] where no 
35c60 63 65 6c 6c 20 69 6e 73 65 72 74 65 64 20 2a 2f  cell inserted */
35c70 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52 43  ..  assert( *pRC
35c80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
35c90 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26   assert( i>=0 &&
35ca0 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   i<=pPage->nCell
35cb0 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f  +pPage->nOverflo
35cc0 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4d  w );.  assert( M
35cd0 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42  X_CELL(pPage->pB
35ce0 74 29 3c 3d 31 30 39 32 31 20 29 3b 0a 20 20 61  t)<=10921 );.  a
35cf0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
35d00 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61  ell<=MX_CELL(pPa
35d10 67 65 2d 3e 70 42 74 29 20 7c 7c 20 43 4f 52 52  ge->pBt) || CORR
35d20 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65  UPT_DB );.  asse
35d30 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
35d40 66 6c 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65 28  flow<=ArraySize(
35d50 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 20 29  pPage->apOvfl) )
35d60 3b 0a 20 20 61 73 73 65 72 74 28 20 41 72 72 61  ;.  assert( Arra
35d70 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f  ySize(pPage->apO
35d80 76 66 6c 29 3d 3d 41 72 72 61 79 53 69 7a 65 28  vfl)==ArraySize(
35d90 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 29 20 29  pPage->aiOvfl) )
35da0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
35db0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
35dc0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
35dd0 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 63 65  ) );.  /* The ce
35de0 6c 6c 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c  ll should normal
35df0 6c 79 20 62 65 20 73 69 7a 65 64 20 63 6f 72 72  ly be sized corr
35e00 65 63 74 6c 79 2e 20 20 48 6f 77 65 76 65 72 2c  ectly.  However,
35e10 20 77 68 65 6e 20 6d 6f 76 69 6e 67 20 61 0a 20   when moving a. 
35e20 20 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 63 65   ** malformed ce
35e30 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66 20 70  ll from a leaf p
35e40 61 67 65 20 74 6f 20 61 6e 20 69 6e 74 65 72 69  age to an interi
35e50 6f 72 20 70 61 67 65 2c 20 69 66 20 74 68 65 20  or page, if the 
35e60 63 65 6c 6c 20 73 69 7a 65 0a 20 20 2a 2a 20 77  cell size.  ** w
35e70 61 6e 74 65 64 20 74 6f 20 62 65 20 6c 65 73 73  anted to be less
35e80 20 74 68 61 6e 20 34 20 62 75 74 20 67 6f 74 20   than 4 but got 
35e90 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20  rounded up to 4 
35ea0 6f 6e 20 74 68 65 20 6c 65 61 66 2c 20 74 68 65  on the leaf, the
35eb0 6e 20 73 69 7a 65 0a 20 20 2a 2a 20 6d 69 67 68  n size.  ** migh
35ec0 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 38  t be less than 8
35ed0 20 28 6c 65 61 66 2d 73 69 7a 65 20 2b 20 70 6f   (leaf-size + po
35ee0 69 6e 74 65 72 29 20 6f 6e 20 74 68 65 20 69 6e  inter) on the in
35ef0 74 65 72 69 6f 72 20 6e 6f 64 65 2e 20 20 48 65  terior node.  He
35f00 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20 74 65 72  nce.  ** the ter
35f10 6d 20 61 66 74 65 72 20 74 68 65 20 7c 7c 20 69  m after the || i
35f20 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
35f30 61 73 73 65 72 74 28 29 2e 20 2a 2f 0a 20 20 61  assert(). */.  a
35f40 73 73 65 72 74 28 20 73 7a 3d 3d 70 50 61 67 65  ssert( sz==pPage
35f50 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67  ->xCellSize(pPag
35f60 65 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 28 73 7a  e, pCell) || (sz
35f70 3d 3d 38 20 26 26 20 69 43 68 69 6c 64 3e 30 29  ==8 && iChild>0)
35f80 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   );.  if( pPage-
35f90 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a  >nOverflow || sz
35fa0 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  +2>pPage->nFree 
35fb0 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70  ){.    if( pTemp
35fc0 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
35fd0 28 70 54 65 6d 70 2c 20 70 43 65 6c 6c 2c 20 73  (pTemp, pCell, s
35fe0 7a 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20  z);.      pCell 
35ff0 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20  = pTemp;.    }. 
36000 20 20 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b     if( iChild ){
36010 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
36020 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64 29 3b 0a  pCell, iChild);.
36030 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50      }.    j = pP
36040 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b  age->nOverflow++
36050 3b 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69  ;.    /* Compari
36060 73 6f 6e 20 61 67 61 69 6e 73 74 20 41 72 72 61  son against Arra
36070 79 53 69 7a 65 2d 31 20 73 69 6e 63 65 20 77 65  ySize-1 since we
36080 20 68 6f 6c 64 20 62 61 63 6b 20 6f 6e 65 20 65   hold back one e
36090 78 74 72 61 20 73 6c 6f 74 0a 20 20 20 20 2a 2a  xtra slot.    **
360a0 20 61 73 20 61 20 63 6f 6e 74 69 6e 67 65 6e 63   as a contingenc
360b0 79 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  y.  In other wor
360c0 64 73 2c 20 6e 65 76 65 72 20 6e 65 65 64 20 6d  ds, never need m
360d0 6f 72 65 20 74 68 61 6e 20 33 20 6f 76 65 72 66  ore than 3 overf
360e0 6c 6f 77 0a 20 20 20 20 2a 2a 20 73 6c 6f 74 73  low.    ** slots
360f0 20 62 75 74 20 34 20 61 72 65 20 61 6c 6c 6f 63   but 4 are alloc
36100 61 74 65 64 2c 20 6a 75 73 74 20 74 6f 20 62 65  ated, just to be
36110 20 73 61 66 65 2e 20 2a 2f 0a 20 20 20 20 61 73   safe. */.    as
36120 73 65 72 74 28 20 6a 20 3c 20 41 72 72 61 79 53  sert( j < ArrayS
36130 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f 76 66  ize(pPage->apOvf
36140 6c 29 2d 31 20 29 3b 0a 20 20 20 20 70 50 61 67  l)-1 );.    pPag
36150 65 2d 3e 61 70 4f 76 66 6c 5b 6a 5d 20 3d 20 70  e->apOvfl[j] = p
36160 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d  Cell;.    pPage-
36170 3e 61 69 4f 76 66 6c 5b 6a 5d 20 3d 20 28 75 31  >aiOvfl[j] = (u1
36180 36 29 69 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65  6)i;..    /* Whe
36190 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66  n multiple overf
361a0 6c 6f 77 73 20 6f 63 63 75 72 2c 20 74 68 65 79  lows occur, they
361b0 20 61 72 65 20 61 6c 77 61 79 73 20 73 65 71 75   are always sequ
361c0 65 6e 74 69 61 6c 20 61 6e 64 20 69 6e 0a 20 20  ential and in.  
361d0 20 20 2a 2a 20 73 6f 72 74 65 64 20 6f 72 64 65    ** sorted orde
361e0 72 2e 20 20 54 68 69 73 20 69 6e 76 61 72 69 61  r.  This invaria
361f0 6e 74 73 20 61 72 69 73 65 20 62 65 63 61 75 73  nts arise becaus
36200 65 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66  e multiple overf
36210 6c 6f 77 73 20 63 61 6e 0a 20 20 20 20 2a 2a 20  lows can.    ** 
36220 6f 6e 6c 79 20 6f 63 63 75 72 20 77 68 65 6e 20  only occur when 
36230 69 6e 73 65 72 74 69 6e 67 20 64 69 76 69 64 65  inserting divide
36240 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74 68 65  r cells into the
36250 20 70 61 72 65 6e 74 20 70 61 67 65 20 64 75 72   parent page dur
36260 69 6e 67 0a 20 20 20 20 2a 2a 20 62 61 6c 61 6e  ing.    ** balan
36270 63 69 6e 67 2c 20 61 6e 64 20 74 68 65 20 64 69  cing, and the di
36280 76 69 64 65 72 73 20 61 72 65 20 61 64 6a 61 63  viders are adjac
36290 65 6e 74 20 61 6e 64 20 73 6f 72 74 65 64 2e 0a  ent and sorted..
362a0 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
362b0 74 28 20 6a 3d 3d 30 20 7c 7c 20 70 50 61 67 65  t( j==0 || pPage
362c0 2d 3e 61 69 4f 76 66 6c 5b 6a 2d 31 5d 3c 28 75  ->aiOvfl[j-1]<(u
362d0 31 36 29 69 20 29 3b 20 2f 2a 20 4f 76 65 72 66  16)i ); /* Overf
362e0 6c 6f 77 73 20 69 6e 20 73 6f 72 74 65 64 20 6f  lows in sorted o
362f0 72 64 65 72 20 2a 2f 0a 20 20 20 20 61 73 73 65  rder */.    asse
36300 72 74 28 20 6a 3d 3d 30 20 7c 7c 20 69 3d 3d 70  rt( j==0 || i==p
36310 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 2d 31  Page->aiOvfl[j-1
36320 5d 2b 31 20 29 3b 20 20 20 2f 2a 20 4f 76 65 72  ]+1 );   /* Over
36330 66 6c 6f 77 73 20 61 72 65 20 73 65 71 75 65 6e  flows are sequen
36340 74 69 61 6c 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  tial */.  }else{
36350 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71  .    int rc = sq
36360 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
36370 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
36380 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
36390 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
363a0 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 20  *pRC = rc;.     
363b0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
363c0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
363d0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
363e0 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
363f0 65 29 20 29 3b 0a 20 20 20 20 64 61 74 61 20 3d  e) );.    data =
36400 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
36410 20 20 20 61 73 73 65 72 74 28 20 26 64 61 74 61     assert( &data
36420 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73  [pPage->cellOffs
36430 65 74 5d 3d 3d 70 50 61 67 65 2d 3e 61 43 65 6c  et]==pPage->aCel
36440 6c 49 64 78 20 29 3b 0a 20 20 20 20 72 63 20 3d  lIdx );.    rc =
36450 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70   allocateSpace(p
36460 50 61 67 65 2c 20 73 7a 2c 20 26 69 64 78 29 3b  Page, sz, &idx);
36470 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 20 2a  .    if( rc ){ *
36480 70 52 43 20 3d 20 72 63 3b 20 72 65 74 75 72 6e  pRC = rc; return
36490 3b 20 7d 0a 20 20 20 20 2f 2a 20 54 68 65 20 61  ; }.    /* The a
364a0 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 29 20 72  llocateSpace() r
364b0 6f 75 74 69 6e 65 20 67 75 61 72 61 6e 74 65 65  outine guarantee
364c0 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
364d0 70 72 6f 70 65 72 74 69 65 73 0a 20 20 20 20 2a  properties.    *
364e0 2a 20 69 66 20 69 74 20 72 65 74 75 72 6e 73 20  * if it returns 
364f0 73 75 63 63 65 73 73 66 75 6c 6c 79 20 2a 2f 0a  successfully */.
36500 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78 20      assert( idx 
36510 3e 3d 20 30 20 29 3b 0a 20 20 20 20 61 73 73 65  >= 0 );.    asse
36520 72 74 28 20 69 64 78 20 3e 3d 20 70 50 61 67 65  rt( idx >= pPage
36530 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 70  ->cellOffset+2*p
36540 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 32 20 7c 7c  Page->nCell+2 ||
36550 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
36560 20 20 20 61 73 73 65 72 74 28 20 69 64 78 2b 73     assert( idx+s
36570 7a 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d  z <= (int)pPage-
36580 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
36590 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e   );.    pPage->n
365a0 46 72 65 65 20 2d 3d 20 28 75 31 36 29 28 32 20  Free -= (u16)(2 
365b0 2b 20 73 7a 29 3b 0a 20 20 20 20 6d 65 6d 63 70  + sz);.    memcp
365c0 79 28 26 64 61 74 61 5b 69 64 78 5d 2c 20 70 43  y(&data[idx], pC
365d0 65 6c 6c 2c 20 73 7a 29 3b 0a 20 20 20 20 69 66  ell, sz);.    if
365e0 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20  ( iChild ){.    
365f0 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61    put4byte(&data
36600 5b 69 64 78 5d 2c 20 69 43 68 69 6c 64 29 3b 0a  [idx], iChild);.
36610 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 73 20 3d      }.    pIns =
36620 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78   pPage->aCellIdx
36630 20 2b 20 69 2a 32 3b 0a 20 20 20 20 6d 65 6d 6d   + i*2;.    memm
36640 6f 76 65 28 70 49 6e 73 2b 32 2c 20 70 49 6e 73  ove(pIns+2, pIns
36650 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e 43 65 6c  , 2*(pPage->nCel
36660 6c 20 2d 20 69 29 29 3b 0a 20 20 20 20 70 75 74  l - i));.    put
36670 32 62 79 74 65 28 70 49 6e 73 2c 20 69 64 78 29  2byte(pIns, idx)
36680 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65  ;.    pPage->nCe
36690 6c 6c 2b 2b 3b 0a 20 20 20 20 2f 2a 20 69 6e 63  ll++;.    /* inc
366a0 72 65 6d 65 6e 74 20 74 68 65 20 63 65 6c 6c 20  rement the cell 
366b0 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28  count */.    if(
366c0 20 28 2b 2b 64 61 74 61 5b 70 50 61 67 65 2d 3e   (++data[pPage->
366d0 68 64 72 4f 66 66 73 65 74 2b 34 5d 29 3d 3d 30  hdrOffset+4])==0
366e0 20 29 20 64 61 74 61 5b 70 50 61 67 65 2d 3e 68   ) data[pPage->h
366f0 64 72 4f 66 66 73 65 74 2b 33 5d 2b 2b 3b 0a 20  drOffset+3]++;. 
36700 20 20 20 61 73 73 65 72 74 28 20 67 65 74 32 62     assert( get2b
36710 79 74 65 28 26 64 61 74 61 5b 70 50 61 67 65 2d  yte(&data[pPage-
36720 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 29 3d 3d  >hdrOffset+3])==
36730 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
36740 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
36750 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
36760 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42     if( pPage->pB
36770 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
36780 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65  .      /* The ce
36790 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61  ll may contain a
367a0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f   pointer to an o
367b0 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66  verflow page. If
367c0 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20 20   so, write.     
367d0 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66 6f   ** the entry fo
367e0 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
367f0 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  age into the poi
36800 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20 20  nter map..      
36810 2a 2f 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  */.      ptrmapP
36820 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c  utOvflPtr(pPage,
36830 20 70 43 65 6c 6c 2c 20 70 52 43 29 3b 0a 20 20   pCell, pRC);.  
36840 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d    }.#endif.  }.}
36850 0a 0a 2f 2a 0a 2a 2a 20 41 20 43 65 6c 6c 41 72  ../*.** A CellAr
36860 72 61 79 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61  ray object conta
36870 69 6e 73 20 61 20 63 61 63 68 65 20 6f 66 20 70  ins a cache of p
36880 6f 69 6e 74 65 72 73 20 61 6e 64 20 73 69 7a 65  ointers and size
36890 73 20 66 6f 72 20 61 0a 2a 2a 20 63 6f 6e 73 65  s for a.** conse
368a0 63 75 74 69 76 65 20 73 65 71 75 65 6e 63 65 20  cutive sequence 
368b0 6f 66 20 63 65 6c 6c 73 20 74 68 61 74 20 6d 69  of cells that mi
368c0 67 68 74 20 62 65 20 68 65 6c 64 20 6f 6e 20 6d  ght be held on m
368d0 75 6c 74 69 70 6c 65 20 70 61 67 65 73 2e 0a 2a  ultiple pages..*
368e0 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
368f0 20 43 65 6c 6c 41 72 72 61 79 20 43 65 6c 6c 41   CellArray CellA
36900 72 72 61 79 3b 0a 73 74 72 75 63 74 20 43 65 6c  rray;.struct Cel
36910 6c 41 72 72 61 79 20 7b 0a 20 20 69 6e 74 20 6e  lArray {.  int n
36920 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
36930 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
36940 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
36950 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ] */.  MemPage *
36960 70 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 2f  pRef;          /
36970 2a 20 52 65 66 65 72 65 6e 63 65 20 70 61 67 65  * Reference page
36980 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c   */.  u8 **apCel
36990 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  l;            /*
369a0 20 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e   All cells begin
369b0 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75   balanced */.  u
369c0 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20  16 *szCell;     
369d0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20         /* Local 
369e0 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c  size of all cell
369f0 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f  s in apCell[] */
36a00 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  .};../*.** Make 
36a10 73 75 72 65 20 74 68 65 20 63 65 6c 6c 20 73 69  sure the cell si
36a20 7a 65 73 20 61 74 20 69 64 78 2c 20 69 64 78 2b  zes at idx, idx+
36a30 31 2c 20 2e 2e 2e 2c 20 69 64 78 2b 4e 2d 31 20  1, ..., idx+N-1 
36a40 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 6f 6d  have been.** com
36a50 70 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  puted..*/.static
36a60 20 76 6f 69 64 20 70 6f 70 75 6c 61 74 65 43 65   void populateCe
36a70 6c 6c 43 61 63 68 65 28 43 65 6c 6c 41 72 72 61  llCache(CellArra
36a80 79 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20 69  y *p, int idx, i
36a90 6e 74 20 4e 29 7b 0a 20 20 61 73 73 65 72 74 28  nt N){.  assert(
36aa0 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 2b 4e   idx>=0 && idx+N
36ab0 3c 3d 70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  <=p->nCell );.  
36ac0 77 68 69 6c 65 28 20 4e 3e 30 20 29 7b 0a 20 20  while( N>0 ){.  
36ad0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43    assert( p->apC
36ae0 65 6c 6c 5b 69 64 78 5d 21 3d 30 20 29 3b 0a 20  ell[idx]!=0 );. 
36af0 20 20 20 69 66 28 20 70 2d 3e 73 7a 43 65 6c 6c     if( p->szCell
36b00 5b 69 64 78 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  [idx]==0 ){.    
36b10 20 20 70 2d 3e 73 7a 43 65 6c 6c 5b 69 64 78 5d    p->szCell[idx]
36b20 20 3d 20 70 2d 3e 70 52 65 66 2d 3e 78 43 65 6c   = p->pRef->xCel
36b30 6c 53 69 7a 65 28 70 2d 3e 70 52 65 66 2c 20 70  lSize(p->pRef, p
36b40 2d 3e 61 70 43 65 6c 6c 5b 69 64 78 5d 29 3b 0a  ->apCell[idx]);.
36b50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
36b60 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54   assert( CORRUPT
36b70 5f 44 42 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  _DB ||.         
36b80 20 20 20 20 20 70 2d 3e 73 7a 43 65 6c 6c 5b 69       p->szCell[i
36b90 64 78 5d 3d 3d 70 2d 3e 70 52 65 66 2d 3e 78 43  dx]==p->pRef->xC
36ba0 65 6c 6c 53 69 7a 65 28 70 2d 3e 70 52 65 66 2c  ellSize(p->pRef,
36bb0 20 70 2d 3e 61 70 43 65 6c 6c 5b 69 64 78 5d 29   p->apCell[idx])
36bc0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 64   );.    }.    id
36bd0 78 2b 2b 3b 0a 20 20 20 20 4e 2d 2d 3b 0a 20 20  x++;.    N--;.  
36be0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
36bf0 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  n the size of th
36c00 65 20 4e 74 68 20 65 6c 65 6d 65 6e 74 20 6f 66  e Nth element of
36c10 20 74 68 65 20 63 65 6c 6c 20 61 72 72 61 79 0a   the cell array.
36c20 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
36c30 5f 4e 4f 49 4e 4c 49 4e 45 20 75 31 36 20 63 6f  _NOINLINE u16 co
36c40 6d 70 75 74 65 43 65 6c 6c 53 69 7a 65 28 43 65  mputeCellSize(Ce
36c50 6c 6c 41 72 72 61 79 20 2a 70 2c 20 69 6e 74 20  llArray *p, int 
36c60 4e 29 7b 0a 20 20 61 73 73 65 72 74 28 20 4e 3e  N){.  assert( N>
36c70 3d 30 20 26 26 20 4e 3c 70 2d 3e 6e 43 65 6c 6c  =0 && N<p->nCell
36c80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
36c90 3e 73 7a 43 65 6c 6c 5b 4e 5d 3d 3d 30 20 29 3b  >szCell[N]==0 );
36ca0 0a 20 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 20  .  p->szCell[N] 
36cb0 3d 20 70 2d 3e 70 52 65 66 2d 3e 78 43 65 6c 6c  = p->pRef->xCell
36cc0 53 69 7a 65 28 70 2d 3e 70 52 65 66 2c 20 70 2d  Size(p->pRef, p-
36cd0 3e 61 70 43 65 6c 6c 5b 4e 5d 29 3b 0a 20 20 72  >apCell[N]);.  r
36ce0 65 74 75 72 6e 20 70 2d 3e 73 7a 43 65 6c 6c 5b  eturn p->szCell[
36cf0 4e 5d 3b 0a 7d 0a 73 74 61 74 69 63 20 75 31 36  N];.}.static u16
36d00 20 63 61 63 68 65 64 43 65 6c 6c 53 69 7a 65 28   cachedCellSize(
36d10 43 65 6c 6c 41 72 72 61 79 20 2a 70 2c 20 69 6e  CellArray *p, in
36d20 74 20 4e 29 7b 0a 20 20 61 73 73 65 72 74 28 20  t N){.  assert( 
36d30 4e 3e 3d 30 20 26 26 20 4e 3c 70 2d 3e 6e 43 65  N>=0 && N<p->nCe
36d40 6c 6c 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73  ll );.  if( p->s
36d50 7a 43 65 6c 6c 5b 4e 5d 20 29 20 72 65 74 75 72  zCell[N] ) retur
36d60 6e 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 3b 0a  n p->szCell[N];.
36d70 20 20 72 65 74 75 72 6e 20 63 6f 6d 70 75 74 65    return compute
36d80 43 65 6c 6c 53 69 7a 65 28 70 2c 20 4e 29 3b 0a  CellSize(p, N);.
36d90 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79 20 61  }../*.** Array a
36da0 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73  pCell[] contains
36db0 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 6e 43 65   pointers to nCe
36dc0 6c 6c 20 62 2d 74 72 65 65 20 70 61 67 65 20 63  ll b-tree page c
36dd0 65 6c 6c 73 2e 20 54 68 65 20 0a 2a 2a 20 73 7a  ells. The .** sz
36de0 43 65 6c 6c 5b 5d 20 61 72 72 61 79 20 63 6f 6e  Cell[] array con
36df0 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 69  tains the size i
36e00 6e 20 62 79 74 65 73 20 6f 66 20 65 61 63 68 20  n bytes of each 
36e10 63 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74  cell. This funct
36e20 69 6f 6e 0a 2a 2a 20 72 65 70 6c 61 63 65 73 20  ion.** replaces 
36e30 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74  the current cont
36e40 65 6e 74 73 20 6f 66 20 70 61 67 65 20 70 50 67  ents of page pPg
36e50 20 77 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e   with the conten
36e60 74 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 0a 2a  ts of the cell.*
36e70 2a 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 53  * array..**.** S
36e80 6f 6d 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73  ome of the cells
36e90 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6d 61 79   in apCell[] may
36ea0 20 63 75 72 72 65 6e 74 6c 79 20 62 65 20 73 74   currently be st
36eb0 6f 72 65 64 20 69 6e 20 70 50 67 2e 20 54 68 69  ored in pPg. Thi
36ec0 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 6f  s.** function wo
36ed0 72 6b 73 20 61 72 6f 75 6e 64 20 70 72 6f 62 6c  rks around probl
36ee0 65 6d 73 20 63 61 75 73 65 64 20 62 79 20 74 68  ems caused by th
36ef0 69 73 20 62 79 20 6d 61 6b 69 6e 67 20 61 20 63  is by making a c
36f00 6f 70 79 20 6f 66 20 61 6e 79 20 0a 2a 2a 20 73  opy of any .** s
36f10 75 63 68 20 63 65 6c 6c 73 20 62 65 66 6f 72 65  uch cells before
36f20 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65   overwriting the
36f30 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2a 0a 2a   page data..**.*
36f40 2a 20 54 68 65 20 4d 65 6d 50 61 67 65 2e 6e 46  * The MemPage.nF
36f50 72 65 65 20 66 69 65 6c 64 20 69 73 20 69 6e 76  ree field is inv
36f60 61 6c 69 64 61 74 65 64 20 62 79 20 74 68 69 73  alidated by this
36f70 20 66 75 6e 63 74 69 6f 6e 2e 20 49 74 20 69 73   function. It is
36f80 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73   the .** respons
36f90 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
36fa0 61 6c 6c 65 72 20 74 6f 20 73 65 74 20 69 74 20  aller to set it 
36fb0 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74  correctly..*/.st
36fc0 61 74 69 63 20 69 6e 74 20 72 65 62 75 69 6c 64  atic int rebuild
36fd0 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20  Page(.  MemPage 
36fe0 2a 70 50 67 2c 20 20 20 20 20 20 20 20 20 20 20  *pPg,           
36ff0 20 20 20 20 20 20 20 20 2f 2a 20 45 64 69 74 20          /* Edit 
37000 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 69  this page */.  i
37010 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20  nt nCell,       
37020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
37030 2a 20 46 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f  * Final number o
37040 66 20 63 65 6c 6c 73 20 6f 6e 20 70 61 67 65 20  f cells on page 
37050 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c  */.  u8 **apCell
37060 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
37070 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
37080 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 75 31 36 20   cells */.  u16 
37090 2a 73 7a 43 65 6c 6c 20 20 20 20 20 20 20 20 20  *szCell         
370a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
370b0 72 72 61 79 20 6f 66 20 63 65 6c 6c 20 73 69 7a  rray of cell siz
370c0 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  es */.){.  const
370d0 20 69 6e 74 20 68 64 72 20 3d 20 70 50 67 2d 3e   int hdr = pPg->
370e0 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20  hdrOffset;      
370f0 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
37100 20 68 65 61 64 65 72 20 6f 6e 20 70 50 67 20 2a   header on pPg *
37110 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61  /.  u8 * const a
37120 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74  Data = pPg->aDat
37130 61 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  a;           /* 
37140 50 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20  Pointer to data 
37150 66 6f 72 20 70 50 67 20 2a 2f 0a 20 20 63 6f 6e  for pPg */.  con
37160 73 74 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  st int usableSiz
37170 65 20 3d 20 70 50 67 2d 3e 70 42 74 2d 3e 75 73  e = pPg->pBt->us
37180 61 62 6c 65 53 69 7a 65 3b 0a 20 20 75 38 20 2a  ableSize;.  u8 *
37190 20 63 6f 6e 73 74 20 70 45 6e 64 20 3d 20 26 61   const pEnd = &a
371a0 44 61 74 61 5b 75 73 61 62 6c 65 53 69 7a 65 5d  Data[usableSize]
371b0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 38 20  ;.  int i;.  u8 
371c0 2a 70 43 65 6c 6c 70 74 72 20 3d 20 70 50 67 2d  *pCellptr = pPg-
371d0 3e 61 43 65 6c 6c 49 64 78 3b 0a 20 20 75 38 20  >aCellIdx;.  u8 
371e0 2a 70 54 6d 70 20 3d 20 73 71 6c 69 74 65 33 50  *pTmp = sqlite3P
371f0 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 70 50  agerTempSpace(pP
37200 67 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  g->pBt->pPager);
37210 0a 20 20 75 38 20 2a 70 44 61 74 61 3b 0a 0a 20  .  u8 *pData;.. 
37220 20 69 20 3d 20 67 65 74 32 62 79 74 65 28 26 61   i = get2byte(&a
37230 44 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  Data[hdr+5]);.  
37240 6d 65 6d 63 70 79 28 26 70 54 6d 70 5b 69 5d 2c  memcpy(&pTmp[i],
37250 20 26 61 44 61 74 61 5b 69 5d 2c 20 75 73 61 62   &aData[i], usab
37260 6c 65 53 69 7a 65 20 2d 20 69 29 3b 0a 0a 20 20  leSize - i);..  
37270 70 44 61 74 61 20 3d 20 70 45 6e 64 3b 0a 20 20  pData = pEnd;.  
37280 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
37290 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a  ; i++){.    u8 *
372a0 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 69  pCell = apCell[i
372b0 5d 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  ];.    if( SQLIT
372c0 45 5f 57 49 54 48 49 4e 28 70 43 65 6c 6c 2c 61  E_WITHIN(pCell,a
372d0 44 61 74 61 2c 70 45 6e 64 29 20 29 7b 0a 20 20  Data,pEnd) ){.  
372e0 20 20 20 20 70 43 65 6c 6c 20 3d 20 26 70 54 6d      pCell = &pTm
372f0 70 5b 70 43 65 6c 6c 20 2d 20 61 44 61 74 61 5d  p[pCell - aData]
37300 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 61 74  ;.    }.    pDat
37310 61 20 2d 3d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a  a -= szCell[i];.
37320 20 20 20 20 70 75 74 32 62 79 74 65 28 70 43 65      put2byte(pCe
37330 6c 6c 70 74 72 2c 20 28 70 44 61 74 61 20 2d 20  llptr, (pData - 
37340 61 44 61 74 61 29 29 3b 0a 20 20 20 20 70 43 65  aData));.    pCe
37350 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20 20 20  llptr += 2;.    
37360 69 66 28 20 70 44 61 74 61 20 3c 20 70 43 65 6c  if( pData < pCel
37370 6c 70 74 72 20 29 20 72 65 74 75 72 6e 20 53 51  lptr ) return SQ
37380 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
37390 54 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44  T;.    memcpy(pD
373a0 61 74 61 2c 20 70 43 65 6c 6c 2c 20 73 7a 43 65  ata, pCell, szCe
373b0 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 61 73 73 65  ll[i]);.    asse
373c0 72 74 28 20 73 7a 43 65 6c 6c 5b 69 5d 3d 3d 70  rt( szCell[i]==p
373d0 50 67 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50  Pg->xCellSize(pP
373e0 67 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 43 4f 52  g, pCell) || COR
373f0 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 74  RUPT_DB );.    t
37400 65 73 74 63 61 73 65 28 20 73 7a 43 65 6c 6c 5b  estcase( szCell[
37410 69 5d 21 3d 70 50 67 2d 3e 78 43 65 6c 6c 53 69  i]!=pPg->xCellSi
37420 7a 65 28 70 50 67 2c 70 43 65 6c 6c 29 20 29 3b  ze(pPg,pCell) );
37430 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 70  .  }..  /* The p
37440 50 67 2d 3e 6e 46 72 65 65 20 66 69 65 6c 64 20  Pg->nFree field 
37450 69 73 20 6e 6f 77 20 73 65 74 20 69 6e 63 6f 72  is now set incor
37460 72 65 63 74 6c 79 2e 20 54 68 65 20 63 61 6c 6c  rectly. The call
37470 65 72 20 77 69 6c 6c 20 66 69 78 20 69 74 2e 20  er will fix it. 
37480 2a 2f 0a 20 20 70 50 67 2d 3e 6e 43 65 6c 6c 20  */.  pPg->nCell 
37490 3d 20 6e 43 65 6c 6c 3b 0a 20 20 70 50 67 2d 3e  = nCell;.  pPg->
374a0 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a  nOverflow = 0;..
374b0 20 20 70 75 74 32 62 79 74 65 28 26 61 44 61 74    put2byte(&aDat
374c0 61 5b 68 64 72 2b 31 5d 2c 20 30 29 3b 0a 20 20  a[hdr+1], 0);.  
374d0 70 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b  put2byte(&aData[
374e0 68 64 72 2b 33 5d 2c 20 70 50 67 2d 3e 6e 43 65  hdr+3], pPg->nCe
374f0 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  ll);.  put2byte(
37500 26 61 44 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70  &aData[hdr+5], p
37510 44 61 74 61 20 2d 20 61 44 61 74 61 29 3b 0a 20  Data - aData);. 
37520 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20   aData[hdr+7] = 
37530 30 78 30 30 3b 0a 20 20 72 65 74 75 72 6e 20 53  0x00;.  return S
37540 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
37550 2a 2a 20 41 72 72 61 79 20 61 70 43 65 6c 6c 5b  ** Array apCell[
37560 5d 20 63 6f 6e 74 61 69 6e 73 20 6e 43 65 6c 6c  ] contains nCell
37570 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 62 2d 74   pointers to b-t
37580 72 65 65 20 63 65 6c 6c 73 2e 20 41 72 72 61 79  ree cells. Array
37590 20 73 7a 43 65 6c 6c 0a 2a 2a 20 63 6f 6e 74 61   szCell.** conta
375a0 69 6e 73 20 74 68 65 20 73 69 7a 65 20 69 6e 20  ins the size in 
375b0 62 79 74 65 73 20 6f 66 20 65 61 63 68 20 73 75  bytes of each su
375c0 63 68 20 63 65 6c 6c 2e 20 54 68 69 73 20 66 75  ch cell. This fu
375d0 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
375e0 74 6f 20 0a 2a 2a 20 61 64 64 20 74 68 65 20 63  to .** add the c
375f0 65 6c 6c 73 20 73 74 6f 72 65 64 20 69 6e 20 74  ells stored in t
37600 68 65 20 61 72 72 61 79 20 74 6f 20 70 61 67 65  he array to page
37610 20 70 50 67 2e 20 49 66 20 69 74 20 63 61 6e 6e   pPg. If it cann
37620 6f 74 20 28 62 65 63 61 75 73 65 20 0a 2a 2a 20  ot (because .** 
37630 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74  the page needs t
37640 6f 20 62 65 20 64 65 66 72 61 67 6d 65 6e 74 65  o be defragmente
37650 64 20 62 65 66 6f 72 65 20 74 68 65 20 63 65 6c  d before the cel
37660 6c 73 20 77 69 6c 6c 20 66 69 74 29 2c 20 6e 6f  ls will fit), no
37670 6e 2d 7a 65 72 6f 0a 2a 2a 20 69 73 20 72 65 74  n-zero.** is ret
37680 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
37690 2c 20 69 66 20 74 68 65 20 63 65 6c 6c 73 20 61  , if the cells a
376a0 72 65 20 61 64 64 65 64 20 73 75 63 63 65 73 73  re added success
376b0 66 75 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 0a 2a  fully, zero is.*
376c0 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  * returned..**.*
376d0 2a 20 41 72 67 75 6d 65 6e 74 20 70 43 65 6c 6c  * Argument pCell
376e0 70 74 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ptr points to th
376f0 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  e first entry in
37700 20 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65   the cell-pointe
37710 72 20 61 72 72 61 79 0a 2a 2a 20 28 70 61 72 74  r array.** (part
37720 20 6f 66 20 70 61 67 65 20 70 50 67 29 20 74 6f   of page pPg) to
37730 20 70 6f 70 75 6c 61 74 65 2e 20 41 66 74 65 72   populate. After
37740 20 63 65 6c 6c 20 61 70 43 65 6c 6c 5b 30 5d 20   cell apCell[0] 
37750 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  is written to th
37760 65 0a 2a 2a 20 70 61 67 65 20 62 6f 64 79 2c 20  e.** page body, 
37770 61 20 31 36 2d 62 69 74 20 6f 66 66 73 65 74 20  a 16-bit offset 
37780 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 70 43  is written to pC
37790 65 6c 6c 70 74 72 2e 20 41 6e 64 20 73 6f 20 6f  ellptr. And so o
377a0 6e 2c 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63  n, for each.** c
377b0 65 6c 6c 20 69 6e 20 74 68 65 20 61 72 72 61 79  ell in the array
377c0 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70  . It is the resp
377d0 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
377e0 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 6e 73 75  e caller to ensu
377f0 72 65 0a 2a 2a 20 74 68 61 74 20 69 74 20 69 73  re.** that it is
37800 20 73 61 66 65 20 74 6f 20 6f 76 65 72 77 72 69   safe to overwri
37810 74 65 20 74 68 69 73 20 70 61 72 74 20 6f 66 20  te this part of 
37820 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72  the cell-pointer
37830 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 57 68   array..**.** Wh
37840 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
37850 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70 70 44   is called, *ppD
37860 61 74 61 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ata points to th
37870 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 0a  e start of the .
37880 2a 2a 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ** content area 
37890 6f 6e 20 70 61 67 65 20 70 50 67 2e 20 49 66 20  on page pPg. If 
378a0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
378b0 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 69 73 20  content area is 
378c0 65 78 74 65 6e 64 65 64 2c 0a 2a 2a 20 2a 70 70  extended,.** *pp
378d0 44 61 74 61 20 69 73 20 75 70 64 61 74 65 64 20  Data is updated 
378e0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
378f0 6e 65 77 20 73 74 61 72 74 20 6f 66 20 74 68 65  new start of the
37900 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 0a 2a 2a   content area.**
37910 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
37920 67 2e 0a 2a 2a 0a 2a 2a 20 46 69 6e 61 6c 6c 79  g..**.** Finally
37930 2c 20 61 72 67 75 6d 65 6e 74 20 70 42 65 67 69  , argument pBegi
37940 6e 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  n points to the 
37950 62 79 74 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  byte immediately
37960 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 0a 2a   following the.*
37970 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 73 70 61  * end of the spa
37980 63 65 20 72 65 71 75 69 72 65 64 20 62 79 20 74  ce required by t
37990 68 69 73 20 70 61 67 65 20 66 6f 72 20 74 68 65  his page for the
379a0 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72   cell-pointer ar
379b0 65 61 20 28 66 6f 72 0a 2a 2a 20 61 6c 6c 20 63  ea (for.** all c
379c0 65 6c 6c 73 20 2d 20 6e 6f 74 20 6a 75 73 74 20  ells - not just 
379d0 74 68 6f 73 65 20 69 6e 73 65 72 74 65 64 20 62  those inserted b
379e0 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 61  y the current ca
379f0 6c 6c 29 2e 20 49 66 20 74 68 65 20 63 6f 6e 74  ll). If the cont
37a00 65 6e 74 0a 2a 2a 20 61 72 65 61 20 6d 75 73 74  ent.** area must
37a10 20 62 65 20 65 78 74 65 6e 64 65 64 20 74 6f 20   be extended to 
37a20 62 65 66 6f 72 65 20 74 68 69 73 20 70 6f 69 6e  before this poin
37a30 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 63  t in order to ac
37a40 63 6f 6d 6f 64 61 74 65 20 61 6c 6c 0a 2a 2a 20  comodate all.** 
37a50 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
37a60 5d 2c 20 74 68 65 6e 20 74 68 65 20 63 65 6c 6c  ], then the cell
37a70 73 20 64 6f 20 6e 6f 74 20 66 69 74 20 61 6e 64  s do not fit and
37a80 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74   non-zero is ret
37a90 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
37aa0 20 69 6e 74 20 70 61 67 65 49 6e 73 65 72 74 41   int pageInsertA
37ab0 72 72 61 79 28 0a 20 20 4d 65 6d 50 61 67 65 20  rray(.  MemPage 
37ac0 2a 70 50 67 2c 20 20 20 20 20 20 20 20 20 20 20  *pPg,           
37ad0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
37ae0 74 6f 20 61 64 64 20 63 65 6c 6c 73 20 74 6f 20  to add cells to 
37af0 2a 2f 0a 20 20 75 38 20 2a 70 42 65 67 69 6e 2c  */.  u8 *pBegin,
37b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37b10 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 63       /* End of c
37b20 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72 61  ell-pointer arra
37b30 79 20 2a 2f 0a 20 20 75 38 20 2a 2a 70 70 44 61  y */.  u8 **ppDa
37b40 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ta,             
37b50 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
37b60 3a 20 50 61 67 65 20 63 6f 6e 74 65 6e 74 20 2d  : Page content -
37b70 61 72 65 61 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  area pointer */.
37b80 20 20 75 38 20 2a 70 43 65 6c 6c 70 74 72 2c 20    u8 *pCellptr, 
37b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37ba0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
37bb0 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 65  cell-pointer are
37bc0 61 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72 73  a */.  int iFirs
37bd0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
37be0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
37bf0 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f  of first cell to
37c00 20 61 64 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43   add */.  int nC
37c10 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
37c20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
37c30 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20  ber of cells to 
37c40 61 64 64 20 74 6f 20 70 50 67 20 2a 2f 0a 20 20  add to pPg */.  
37c50 43 65 6c 6c 41 72 72 61 79 20 2a 70 43 41 72 72  CellArray *pCArr
37c60 61 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ay              
37c70 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c  /* Array of cell
37c80 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  s */.){.  int i;
37c90 0a 20 20 75 38 20 2a 61 44 61 74 61 20 3d 20 70  .  u8 *aData = p
37ca0 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20 75 38 20  Pg->aData;.  u8 
37cb0 2a 70 44 61 74 61 20 3d 20 2a 70 70 44 61 74 61  *pData = *ppData
37cc0 3b 0a 20 20 69 6e 74 20 69 45 6e 64 20 3d 20 69  ;.  int iEnd = i
37cd0 46 69 72 73 74 20 2b 20 6e 43 65 6c 6c 3b 0a 20  First + nCell;. 
37ce0 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54   assert( CORRUPT
37cf0 5f 44 42 20 7c 7c 20 70 50 67 2d 3e 68 64 72 4f  _DB || pPg->hdrO
37d00 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 2f  ffset==0 );    /
37d10 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65 64 20 6f  * Never called o
37d20 6e 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 66 6f  n page 1 */.  fo
37d30 72 28 69 3d 69 46 69 72 73 74 3b 20 69 3c 69 45  r(i=iFirst; i<iE
37d40 6e 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  nd; i++){.    in
37d50 74 20 73 7a 2c 20 72 63 3b 0a 20 20 20 20 75 38  t sz, rc;.    u8
37d60 20 2a 70 53 6c 6f 74 3b 0a 20 20 20 20 73 7a 20   *pSlot;.    sz 
37d70 3d 20 63 61 63 68 65 64 43 65 6c 6c 53 69 7a 65  = cachedCellSize
37d80 28 70 43 41 72 72 61 79 2c 20 69 29 3b 0a 20 20  (pCArray, i);.  
37d90 20 20 69 66 28 20 28 61 44 61 74 61 5b 31 5d 3d    if( (aData[1]=
37da0 3d 30 20 26 26 20 61 44 61 74 61 5b 32 5d 3d 3d  =0 && aData[2]==
37db0 30 29 20 7c 7c 20 28 70 53 6c 6f 74 20 3d 20 70  0) || (pSlot = p
37dc0 61 67 65 46 69 6e 64 53 6c 6f 74 28 70 50 67 2c  ageFindSlot(pPg,
37dd0 73 7a 2c 26 72 63 29 29 3d 3d 30 20 29 7b 0a 20  sz,&rc))==0 ){. 
37de0 20 20 20 20 20 69 66 28 20 28 70 44 61 74 61 20       if( (pData 
37df0 2d 20 70 42 65 67 69 6e 29 3c 73 7a 20 29 20 72  - pBegin)<sz ) r
37e00 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 70  eturn 1;.      p
37e10 44 61 74 61 20 2d 3d 20 73 7a 3b 0a 20 20 20 20  Data -= sz;.    
37e20 20 20 70 53 6c 6f 74 20 3d 20 70 44 61 74 61 3b    pSlot = pData;
37e30 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 70 53  .    }.    /* pS
37e40 6c 6f 74 20 61 6e 64 20 70 43 41 72 72 61 79 2d  lot and pCArray-
37e50 3e 61 70 43 65 6c 6c 5b 69 5d 20 77 69 6c 6c 20  >apCell[i] will 
37e60 6e 65 76 65 72 20 6f 76 65 72 6c 61 70 20 6f 6e  never overlap on
37e70 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 20   a well-formed. 
37e80 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20     ** database. 
37e90 20 42 75 74 20 74 68 65 79 20 6d 69 67 68 74 20   But they might 
37ea0 66 6f 72 20 61 20 63 6f 72 72 75 70 74 20 64 61  for a corrupt da
37eb0 74 61 62 61 73 65 2e 20 20 48 65 6e 63 65 20 75  tabase.  Hence u
37ec0 73 65 20 6d 65 6d 6d 6f 76 65 28 29 0a 20 20 20  se memmove().   
37ed0 20 2a 2a 20 73 69 6e 63 65 20 6d 65 6d 63 70 79   ** since memcpy
37ee0 28 29 20 73 65 6e 64 73 20 53 49 47 41 42 4f 52  () sends SIGABOR
37ef0 54 20 77 69 74 68 20 6f 76 65 72 6c 61 70 70 69  T with overlappi
37f00 6e 67 20 62 75 66 66 65 72 73 20 6f 6e 20 4f 70  ng buffers on Op
37f10 65 6e 42 53 44 20 2a 2f 0a 20 20 20 20 61 73 73  enBSD */.    ass
37f20 65 72 74 28 20 28 70 53 6c 6f 74 2b 73 7a 29 3c  ert( (pSlot+sz)<
37f30 3d 70 43 41 72 72 61 79 2d 3e 61 70 43 65 6c 6c  =pCArray->apCell
37f40 5b 69 5d 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  [i].         || 
37f50 70 53 6c 6f 74 3e 3d 28 70 43 41 72 72 61 79 2d  pSlot>=(pCArray-
37f60 3e 61 70 43 65 6c 6c 5b 69 5d 2b 73 7a 29 0a 20  >apCell[i]+sz). 
37f70 20 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55          || CORRU
37f80 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 6d 65 6d  PT_DB );.    mem
37f90 6d 6f 76 65 28 70 53 6c 6f 74 2c 20 70 43 41 72  move(pSlot, pCAr
37fa0 72 61 79 2d 3e 61 70 43 65 6c 6c 5b 69 5d 2c 20  ray->apCell[i], 
37fb0 73 7a 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  sz);.    put2byt
37fc0 65 28 70 43 65 6c 6c 70 74 72 2c 20 28 70 53 6c  e(pCellptr, (pSl
37fd0 6f 74 20 2d 20 61 44 61 74 61 29 29 3b 0a 20 20  ot - aData));.  
37fe0 20 20 70 43 65 6c 6c 70 74 72 20 2b 3d 20 32 3b    pCellptr += 2;
37ff0 0a 20 20 7d 0a 20 20 2a 70 70 44 61 74 61 20 3d  .  }.  *ppData =
38000 20 70 44 61 74 61 3b 0a 20 20 72 65 74 75 72 6e   pData;.  return
38010 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72   0;.}../*.** Arr
38020 61 79 20 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74  ay apCell[] cont
38030 61 69 6e 73 20 6e 43 65 6c 6c 20 70 6f 69 6e 74  ains nCell point
38040 65 72 73 20 74 6f 20 62 2d 74 72 65 65 20 63 65  ers to b-tree ce
38050 6c 6c 73 2e 20 41 72 72 61 79 20 73 7a 43 65 6c  lls. Array szCel
38060 6c 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74  l .** contains t
38070 68 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  he size in bytes
38080 20 6f 66 20 65 61 63 68 20 73 75 63 68 20 63 65   of each such ce
38090 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ll. This functio
380a0 6e 20 61 64 64 73 20 74 68 65 0a 2a 2a 20 73 70  n adds the.** sp
380b0 61 63 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ace associated w
380c0 69 74 68 20 65 61 63 68 20 63 65 6c 6c 20 69 6e  ith each cell in
380d0 20 74 68 65 20 61 72 72 61 79 20 74 68 61 74 20   the array that 
380e0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f  is currently sto
380f0 72 65 64 20 0a 2a 2a 20 77 69 74 68 69 6e 20 74  red .** within t
38100 68 65 20 62 6f 64 79 20 6f 66 20 70 50 67 20 74  he body of pPg t
38110 6f 20 74 68 65 20 70 50 67 20 66 72 65 65 2d 6c  o the pPg free-l
38120 69 73 74 2e 20 54 68 65 20 63 65 6c 6c 2d 70 6f  ist. The cell-po
38130 69 6e 74 65 72 73 20 61 6e 64 20 6f 74 68 65 72  inters and other
38140 0a 2a 2a 20 66 69 65 6c 64 73 20 6f 66 20 74 68  .** fields of th
38150 65 20 70 61 67 65 20 61 72 65 20 6e 6f 74 20 75  e page are not u
38160 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  pdated..**.** Th
38170 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
38180 72 6e 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  rns the total nu
38190 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 61 64  mber of cells ad
381a0 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ded to the free-
381b0 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
381c0 69 6e 74 20 70 61 67 65 46 72 65 65 41 72 72 61  int pageFreeArra
381d0 79 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  y(.  MemPage *pP
381e0 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
381f0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74 6f 20       /* Page to 
38200 65 64 69 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46  edit */.  int iF
38210 69 72 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  irst,           
38220 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
38230 73 74 20 63 65 6c 6c 20 74 6f 20 64 65 6c 65 74  st cell to delet
38240 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  e */.  int nCell
38250 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
38260 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c 73 20         /* Cells 
38270 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 43  to delete */.  C
38280 65 6c 6c 41 72 72 61 79 20 2a 70 43 41 72 72 61  ellArray *pCArra
38290 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  y              /
382a0 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 73  * Array of cells
382b0 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 20 63 6f   */.){.  u8 * co
382c0 6e 73 74 20 61 44 61 74 61 20 3d 20 70 50 67 2d  nst aData = pPg-
382d0 3e 61 44 61 74 61 3b 0a 20 20 75 38 20 2a 20 63  >aData;.  u8 * c
382e0 6f 6e 73 74 20 70 45 6e 64 20 3d 20 26 61 44 61  onst pEnd = &aDa
382f0 74 61 5b 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61  ta[pPg->pBt->usa
38300 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 75 38 20 2a  bleSize];.  u8 *
38310 20 63 6f 6e 73 74 20 70 53 74 61 72 74 20 3d 20   const pStart = 
38320 26 61 44 61 74 61 5b 70 50 67 2d 3e 68 64 72 4f  &aData[pPg->hdrO
38330 66 66 73 65 74 20 2b 20 38 20 2b 20 70 50 67 2d  ffset + 8 + pPg-
38340 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a  >childPtrSize];.
38350 20 20 69 6e 74 20 6e 52 65 74 20 3d 20 30 3b 0a    int nRet = 0;.
38360 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69    int i;.  int i
38370 45 6e 64 20 3d 20 69 46 69 72 73 74 20 2b 20 6e  End = iFirst + n
38380 43 65 6c 6c 3b 0a 20 20 75 38 20 2a 70 46 72 65  Cell;.  u8 *pFre
38390 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 73 7a 46  e = 0;.  int szF
383a0 72 65 65 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28  ree = 0;..  for(
383b0 69 3d 69 46 69 72 73 74 3b 20 69 3c 69 45 6e 64  i=iFirst; i<iEnd
383c0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a  ; i++){.    u8 *
383d0 70 43 65 6c 6c 20 3d 20 70 43 41 72 72 61 79 2d  pCell = pCArray-
383e0 3e 61 70 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20  >apCell[i];.    
383f0 69 66 28 20 53 51 4c 49 54 45 5f 57 49 54 48 49  if( SQLITE_WITHI
38400 4e 28 70 43 65 6c 6c 2c 20 70 53 74 61 72 74 2c  N(pCell, pStart,
38410 20 70 45 6e 64 29 20 29 7b 0a 20 20 20 20 20 20   pEnd) ){.      
38420 69 6e 74 20 73 7a 3b 0a 20 20 20 20 20 20 2f 2a  int sz;.      /*
38430 20 4e 6f 20 6e 65 65 64 20 74 6f 20 75 73 65 20   No need to use 
38440 63 61 63 68 65 64 43 65 6c 6c 53 69 7a 65 28 29  cachedCellSize()
38450 20 68 65 72 65 2e 20 20 54 68 65 20 73 69 7a 65   here.  The size
38460 73 20