/ Hex Artifact Content
Login

Artifact 05843aa2287d3246793cc09a32c3603566037f49:


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 0a 20 20 69 66 28 20 70 4b 65 79 20 29  */..  if( pKey )
6800: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4b  {.    assert( nK
6810: 65 79 3d 3d 28 69 36 34 29 28 69 6e 74 29 6e 4b  ey==(i64)(int)nK
6820: 65 79 20 29 3b 0a 20 20 20 20 70 49 64 78 4b 65  ey );.    pIdxKe
6830: 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  y = sqlite3VdbeA
6840: 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63 6f  llocUnpackedReco
6850: 72 64 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  rd(pCur->pKeyInf
6860: 6f 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78  o);.    if( pIdx
6870: 4b 65 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Key==0 ) return 
6880: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
6890: 54 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  T;.    sqlite3Vd
68a0: 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70  beRecordUnpack(p
68b0: 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28  Cur->pKeyInfo, (
68c0: 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 20  int)nKey, pKey, 
68d0: 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 69 66  pIdxKey);.    if
68e0: 28 20 70 49 64 78 4b 65 79 2d 3e 6e 46 69 65 6c  ( pIdxKey->nFiel
68f0: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  d==0 ){.      rc
6900: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
6910: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  T_BKPT;.      go
6920: 74 6f 20 6d 6f 76 65 74 6f 5f 64 6f 6e 65 3b 0a  to moveto_done;.
6930: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
6940: 20 20 20 70 49 64 78 4b 65 79 20 3d 20 30 3b 0a     pIdxKey = 0;.
6950: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
6960: 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  e3BtreeMovetoUnp
6970: 61 63 6b 65 64 28 70 43 75 72 2c 20 70 49 64 78  acked(pCur, pIdx
6980: 4b 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61 73 2c  Key, nKey, bias,
6990: 20 70 52 65 73 29 3b 0a 6d 6f 76 65 74 6f 5f 64   pRes);.moveto_d
69a0: 6f 6e 65 3a 0a 20 20 69 66 28 20 70 49 64 78 4b  one:.  if( pIdxK
69b0: 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ey ){.    sqlite
69c0: 33 44 62 46 72 65 65 28 70 43 75 72 2d 3e 70 4b  3DbFree(pCur->pK
69d0: 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 49 64 78  eyInfo->db, pIdx
69e0: 4b 65 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Key);.  }.  retu
69f0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
6a00: 52 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73  Restore the curs
6a10: 6f 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69  or to the positi
6a20: 6f 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f 72  on it was in (or
6a30: 20 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73 20   as close to as 
6a40: 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68 65  possible).** whe
6a50: 6e 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  n saveCursorPosi
6a60: 74 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c 65  tion() was calle
6a70: 64 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69  d. Note that thi
6a80: 73 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20 74  s call deletes t
6a90: 68 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f 73  he .** saved pos
6aa0: 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72 65  ition info store
6ab0: 64 20 62 79 20 73 61 76 65 43 75 72 73 6f 72 50  d by saveCursorP
6ac0: 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74 68  osition(), so th
6ad0: 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61 74  ere can be.** at
6ae0: 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63 74   most one effect
6af0: 69 76 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f  ive restoreCurso
6b00: 72 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c  rPosition() call
6b10: 20 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a 20   after each .** 
6b20: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
6b30: 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  on()..*/.static 
6b40: 69 6e 74 20 62 74 72 65 65 52 65 73 74 6f 72 65  int btreeRestore
6b50: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42  CursorPosition(B
6b60: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
6b70: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
6b80: 73 6b 69 70 4e 65 78 74 3b 0a 20 20 61 73 73 65  skipNext;.  asse
6b90: 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
6ba0: 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
6bb0: 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
6bc0: 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52  eState>=CURSOR_R
6bd0: 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
6be0: 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
6bf0: 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  ==CURSOR_FAULT )
6c00: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 75  {.    return pCu
6c10: 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 7d  r->skipNext;.  }
6c20: 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20  .  pCur->eState 
6c30: 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
6c40: 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 4d 6f  ;.  rc = btreeMo
6c50: 76 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72 2d  veto(pCur, pCur-
6c60: 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65  >pKey, pCur->nKe
6c70: 79 2c 20 30 2c 20 26 73 6b 69 70 4e 65 78 74 29  y, 0, &skipNext)
6c80: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
6c90: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
6ca0: 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e  ite3_free(pCur->
6cb0: 70 4b 65 79 29 3b 0a 20 20 20 20 70 43 75 72 2d  pKey);.    pCur-
6cc0: 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 61  >pKey = 0;.    a
6cd0: 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
6ce0: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
6cf0: 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  D || pCur->eStat
6d00: 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
6d10: 44 20 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 73  D );.    pCur->s
6d20: 6b 69 70 4e 65 78 74 20 7c 3d 20 73 6b 69 70 4e  kipNext |= skipN
6d30: 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 43 75  ext;.    if( pCu
6d40: 72 2d 3e 73 6b 69 70 4e 65 78 74 20 26 26 20 70  r->skipNext && p
6d50: 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
6d60: 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
6d70: 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
6d80: 3d 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58  = CURSOR_SKIPNEX
6d90: 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  T;.    }.  }.  r
6da0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65  eturn rc;.}..#de
6db0: 66 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72 73  fine restoreCurs
6dc0: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a  orPosition(p) \.
6dd0: 20 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55    (p->eState>=CU
6de0: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
6df0: 20 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 62 74   ? \.         bt
6e00: 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72  reeRestoreCursor
6e10: 50 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a  Position(p) : \.
6e20: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
6e30: 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  OK)../*.** Deter
6e40: 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20  mine whether or 
6e50: 6e 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61 73  not a cursor has
6e60: 20 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20   moved from the 
6e70: 70 6f 73 69 74 69 6f 6e 20 77 68 65 72 65 0a 2a  position where.*
6e80: 2a 20 69 74 20 77 61 73 20 6c 61 73 74 20 70 6c  * it was last pl
6e90: 61 63 65 64 2c 20 6f 72 20 68 61 73 20 62 65 65  aced, or has bee
6ea0: 6e 20 69 6e 76 61 6c 69 64 61 74 65 64 20 66 6f  n invalidated fo
6eb0: 72 20 61 6e 79 20 6f 74 68 65 72 20 72 65 61 73  r any other reas
6ec0: 6f 6e 2e 0a 2a 2a 20 43 75 72 73 6f 72 73 20 63  on..** Cursors c
6ed0: 61 6e 20 6d 6f 76 65 20 77 68 65 6e 20 74 68 65  an move when the
6ee0: 20 72 6f 77 20 74 68 65 79 20 61 72 65 20 70 6f   row they are po
6ef0: 69 6e 74 69 6e 67 20 61 74 20 69 73 20 64 65 6c  inting at is del
6f00: 65 74 65 64 20 6f 75 74 0a 2a 2a 20 66 72 6f 6d  eted out.** from
6f10: 20 75 6e 64 65 72 20 74 68 65 6d 2c 20 66 6f 72   under them, for
6f20: 20 65 78 61 6d 70 6c 65 2e 20 20 43 75 72 73 6f   example.  Curso
6f30: 72 20 6d 69 67 68 74 20 61 6c 73 6f 20 6d 6f 76  r might also mov
6f40: 65 20 69 66 20 61 20 62 74 72 65 65 0a 2a 2a 20  e if a btree.** 
6f50: 69 73 20 72 65 62 61 6c 61 6e 63 65 64 2e 0a 2a  is rebalanced..*
6f60: 2a 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69  *.** Calling thi
6f70: 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 61  s routine with a
6f80: 20 4e 55 4c 4c 20 63 75 72 73 6f 72 20 70 6f 69   NULL cursor poi
6f90: 6e 74 65 72 20 72 65 74 75 72 6e 73 20 66 61 6c  nter returns fal
6fa0: 73 65 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68  se..**.** Use th
6fb0: 65 20 73 65 70 61 72 61 74 65 20 73 71 6c 69 74  e separate sqlit
6fc0: 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65 73  e3BtreeCursorRes
6fd0: 74 6f 72 65 28 29 20 72 6f 75 74 69 6e 65 20 74  tore() routine t
6fe0: 6f 20 72 65 73 74 6f 72 65 20 61 20 63 75 72 73  o restore a curs
6ff0: 6f 72 0a 2a 2a 20 62 61 63 6b 20 74 6f 20 77 68  or.** back to wh
7000: 65 72 65 20 69 74 20 6f 75 67 68 74 20 74 6f 20  ere it ought to 
7010: 62 65 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  be if this routi
7020: 6e 65 20 72 65 74 75 72 6e 73 20 74 72 75 65 2e  ne returns true.
7030: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
7040: 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76  treeCursorHasMov
7050: 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ed(BtCursor *pCu
7060: 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75  r){.  return pCu
7070: 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
7080: 52 5f 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a  R_VALID;.}../*.*
7090: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
70a0: 65 73 74 6f 72 65 73 20 61 20 63 75 72 73 6f 72  estores a cursor
70b0: 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69   back to its ori
70c0: 67 69 6e 61 6c 20 70 6f 73 69 74 69 6f 6e 20 61  ginal position a
70d0: 66 74 65 72 20 69 74 0a 2a 2a 20 68 61 73 20 62  fter it.** has b
70e0: 65 65 6e 20 6d 6f 76 65 64 20 62 79 20 73 6f 6d  een moved by som
70f0: 65 20 6f 75 74 73 69 64 65 20 61 63 74 69 76 69  e outside activi
7100: 74 79 20 28 73 75 63 68 20 61 73 20 61 20 62 74  ty (such as a bt
7110: 72 65 65 20 72 65 62 61 6c 61 6e 63 65 20 6f 72  ree rebalance or
7120: 0a 2a 2a 20 61 20 72 6f 77 20 68 61 76 69 6e 67  .** a row having
7130: 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75   been deleted ou
7140: 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  t from under the
7150: 20 63 75 72 73 6f 72 29 2e 20 20 0a 2a 2a 0a 2a   cursor).  .**.*
7160: 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 74 68  * On success, th
7170: 65 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77  e *pDifferentRow
7180: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 66 61   parameter is fa
7190: 6c 73 65 20 69 66 20 74 68 65 20 63 75 72 73 6f  lse if the curso
71a0: 72 20 69 73 20 6c 65 66 74 0a 2a 2a 20 70 6f 69  r is left.** poi
71b0: 6e 74 69 6e 67 20 61 74 20 65 78 61 63 74 6c 79  nting at exactly
71c0: 20 74 68 65 20 73 61 6d 65 20 72 6f 77 2e 20 20   the same row.  
71d0: 2a 70 44 69 66 66 65 72 6e 74 52 6f 77 20 69 73  *pDifferntRow is
71e0: 20 74 68 65 20 72 6f 77 20 74 68 65 20 63 75 72   the row the cur
71f0: 73 6f 72 0a 2a 2a 20 77 61 73 20 70 6f 69 6e 74  sor.** was point
7200: 69 6e 67 20 74 6f 20 68 61 73 20 62 65 65 6e 20  ing to has been 
7210: 64 65 6c 65 74 65 64 2c 20 66 6f 72 63 69 6e 67  deleted, forcing
7220: 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70   the cursor to p
7230: 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 0a 2a 2a 20  oint to some.** 
7240: 6e 65 61 72 62 79 20 72 6f 77 2e 0a 2a 2a 0a 2a  nearby row..**.*
7250: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
7260: 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61  hould only be ca
7270: 6c 6c 65 64 20 66 6f 72 20 61 20 63 75 72 73 6f  lled for a curso
7280: 72 20 74 68 61 74 20 6a 75 73 74 20 72 65 74 75  r that just retu
7290: 72 6e 65 64 0a 2a 2a 20 54 52 55 45 20 66 72 6f  rned.** TRUE fro
72a0: 6d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  m sqlite3BtreeCu
72b0: 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 29 2e 0a  rsorHasMoved()..
72c0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
72d0: 72 65 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65  reeCursorRestore
72e0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
72f0: 20 69 6e 74 20 2a 70 44 69 66 66 65 72 65 6e 74   int *pDifferent
7300: 52 6f 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Row){.  int rc;.
7310: 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21  .  assert( pCur!
7320: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
7330: 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
7340: 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
7350: 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
7360: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
7370: 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
7380: 20 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77    *pDifferentRow
7390: 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
73a0: 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70   rc;.  }.  if( p
73b0: 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
73c0: 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
73d0: 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20   *pDifferentRow 
73e0: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
73f0: 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
7400: 73 6b 69 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 20  skipNext==0 );. 
7410: 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f     *pDifferentRo
7420: 77 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  w = 0;.  }.  ret
7430: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
7440: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
7450: 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49  ENABLE_CURSOR_HI
7460: 4e 54 53 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64  NTS./*.** Provid
7470: 65 20 68 69 6e 74 73 20 74 6f 20 74 68 65 20 63  e hints to the c
7480: 75 72 73 6f 72 2e 20 20 54 68 65 20 70 61 72 74  ursor.  The part
7490: 69 63 75 6c 61 72 20 68 69 6e 74 20 67 69 76 65  icular hint give
74a0: 6e 20 28 61 6e 64 20 74 68 65 20 74 79 70 65 0a  n (and the type.
74b0: 2a 2a 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66  ** and number of
74c0: 20 74 68 65 20 76 61 72 61 72 67 73 20 70 61 72   the varargs par
74d0: 61 6d 65 74 65 72 73 29 20 69 73 20 64 65 74 65  ameters) is dete
74e0: 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 65 48  rmined by the eH
74f0: 69 6e 74 54 79 70 65 0a 2a 2a 20 70 61 72 61 6d  intType.** param
7500: 65 74 65 72 2e 20 20 53 65 65 20 74 68 65 20 64  eter.  See the d
7510: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 74 68  efinitions of th
7520: 65 20 42 54 52 45 45 5f 48 49 4e 54 5f 2a 20 6d  e BTREE_HINT_* m
7530: 61 63 72 6f 73 20 66 6f 72 20 64 65 74 61 69 6c  acros for detail
7540: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
7550: 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 69 6e  e3BtreeCursorHin
7560: 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
7570: 2c 20 69 6e 74 20 65 48 69 6e 74 54 79 70 65 2c  , int eHintType,
7580: 20 2e 2e 2e 29 7b 0a 20 20 2f 2a 20 55 73 65 64   ...){.  /* Used
7590: 20 6f 6e 6c 79 20 62 79 20 73 79 73 74 65 6d 20   only by system 
75a0: 74 68 61 74 20 73 75 62 73 74 69 74 75 74 65 20  that substitute 
75b0: 74 68 65 69 72 20 6f 77 6e 20 73 74 6f 72 61 67  their own storag
75c0: 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 7d 0a 23 65  e engine */.}.#e
75d0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76  ndif../*.** Prov
75e0: 69 64 65 20 66 6c 61 67 20 68 69 6e 74 73 20 74  ide flag hints t
75f0: 6f 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2f  o the cursor..*/
7600: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
7610: 65 65 43 75 72 73 6f 72 48 69 6e 74 46 6c 61 67  eeCursorHintFlag
7620: 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  s(BtCursor *pCur
7630: 2c 20 75 6e 73 69 67 6e 65 64 20 78 29 7b 0a 20  , unsigned x){. 
7640: 20 61 73 73 65 72 74 28 20 78 3d 3d 42 54 52 45   assert( x==BTRE
7650: 45 5f 53 45 45 4b 5f 45 51 20 7c 7c 20 78 3d 3d  E_SEEK_EQ || x==
7660: 42 54 52 45 45 5f 42 55 4c 4b 4c 4f 41 44 20 7c  BTREE_BULKLOAD |
7670: 7c 20 78 3d 3d 30 20 29 3b 0a 20 20 70 43 75 72  | x==0 );.  pCur
7680: 2d 3e 68 69 6e 74 73 20 3d 20 78 3b 0a 7d 0a 0a  ->hints = x;.}..
7690: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
76a0: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
76b0: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 70 61  /*.** Given a pa
76c0: 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 72  ge number of a r
76d0: 65 67 75 6c 61 72 20 64 61 74 61 62 61 73 65 20  egular database 
76e0: 70 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65  page, return the
76f0: 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20   page.** number 
7700: 66 6f 72 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  for the pointer-
7710: 6d 61 70 20 70 61 67 65 20 74 68 61 74 20 63 6f  map page that co
7720: 6e 74 61 69 6e 73 20 74 68 65 20 65 6e 74 72 79  ntains the entry
7730: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 70 75   for the.** inpu
7740: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a  t page number..*
7750: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 28 6e  *.** Return 0 (n
7760: 6f 74 20 61 20 76 61 6c 69 64 20 70 61 67 65 29  ot a valid page)
7770: 20 66 6f 72 20 70 67 6e 6f 3d 3d 31 20 73 69 6e   for pgno==1 sin
7780: 63 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e  ce there is.** n
7790: 6f 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 61 73  o pointer map as
77a0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 61  sociated with pa
77b0: 67 65 20 31 2e 20 20 54 68 65 20 69 6e 74 65 67  ge 1.  The integ
77c0: 72 69 74 79 5f 63 68 65 63 6b 20 6c 6f 67 69 63  rity_check logic
77d0: 0a 2a 2a 20 72 65 71 75 69 72 65 73 20 74 68 61  .** requires tha
77e0: 74 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 2a  t ptrmapPageno(*
77f0: 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69  ,1)!=1..*/.stati
7800: 63 20 50 67 6e 6f 20 70 74 72 6d 61 70 50 61 67  c Pgno ptrmapPag
7810: 65 6e 6f 28 42 74 53 68 61 72 65 64 20 2a 70 42  eno(BtShared *pB
7820: 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  t, Pgno pgno){. 
7830: 20 69 6e 74 20 6e 50 61 67 65 73 50 65 72 4d 61   int nPagesPerMa
7840: 70 50 61 67 65 3b 0a 20 20 50 67 6e 6f 20 69 50  pPage;.  Pgno iP
7850: 74 72 4d 61 70 2c 20 72 65 74 3b 0a 20 20 61 73  trMap, ret;.  as
7860: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
7870: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
7880: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 67  tex) );.  if( pg
7890: 6e 6f 3c 32 20 29 20 72 65 74 75 72 6e 20 30 3b  no<2 ) return 0;
78a0: 0a 20 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50  .  nPagesPerMapP
78b0: 61 67 65 20 3d 20 28 70 42 74 2d 3e 75 73 61 62  age = (pBt->usab
78c0: 6c 65 53 69 7a 65 2f 35 29 2b 31 3b 0a 20 20 69  leSize/5)+1;.  i
78d0: 50 74 72 4d 61 70 20 3d 20 28 70 67 6e 6f 2d 32  PtrMap = (pgno-2
78e0: 29 2f 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61  )/nPagesPerMapPa
78f0: 67 65 3b 0a 20 20 72 65 74 20 3d 20 28 69 50 74  ge;.  ret = (iPt
7900: 72 4d 61 70 2a 6e 50 61 67 65 73 50 65 72 4d 61  rMap*nPagesPerMa
7910: 70 50 61 67 65 29 20 2b 20 32 3b 20 0a 20 20 69  pPage) + 2; .  i
7920: 66 28 20 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f  f( ret==PENDING_
7930: 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
7940: 7b 0a 20 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d  {.    ret++;.  }
7950: 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d  .  return ret;.}
7960: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e  ../*.** Write an
7970: 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20   entry into the 
7980: 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a  pointer map..**.
7990: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
79a0: 75 70 64 61 74 65 73 20 74 68 65 20 70 6f 69 6e  updates the poin
79b0: 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f  ter map entry fo
79c0: 72 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27 6b  r page number 'k
79d0: 65 79 27 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69  ey'.** so that i
79e0: 74 20 6d 61 70 73 20 74 6f 20 74 79 70 65 20 27  t maps to type '
79f0: 65 54 79 70 65 27 20 61 6e 64 20 70 61 72 65 6e  eType' and paren
7a00: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27 70  t page number 'p
7a10: 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a  gno'..**.** If *
7a20: 70 52 43 20 69 73 20 69 6e 69 74 69 61 6c 6c 79  pRC is initially
7a30: 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e 6f 6e 2d 53   non-zero (non-S
7a40: 51 4c 49 54 45 5f 4f 4b 29 20 74 68 65 6e 20 74  QLITE_OK) then t
7a50: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a  his routine is.*
7a60: 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 61  * a no-op.  If a
7a70: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
7a80: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
7a90: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 77 72  error code is wr
7aa0: 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70  itten.** into *p
7ab0: 52 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  RC..*/.static vo
7ac0: 69 64 20 70 74 72 6d 61 70 50 75 74 28 42 74 53  id ptrmapPut(BtS
7ad0: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
7ae0: 20 6b 65 79 2c 20 75 38 20 65 54 79 70 65 2c 20   key, u8 eType, 
7af0: 50 67 6e 6f 20 70 61 72 65 6e 74 2c 20 69 6e 74  Pgno parent, int
7b00: 20 2a 70 52 43 29 7b 0a 20 20 44 62 50 61 67 65   *pRC){.  DbPage
7b10: 20 2a 70 44 62 50 61 67 65 3b 20 20 2f 2a 20 54   *pDbPage;  /* T
7b20: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  he pointer map p
7b30: 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74  age */.  u8 *pPt
7b40: 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20 54 68  rmap;      /* Th
7b50: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 64 61  e pointer map da
7b60: 74 61 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74  ta */.  Pgno iPt
7b70: 72 6d 61 70 3b 20 20 20 20 20 2f 2a 20 54 68 65  rmap;     /* The
7b80: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
7b90: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e  e number */.  in
7ba0: 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20  t offset;       
7bb0: 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 70 6f 69  /* Offset in poi
7bc0: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
7bd0: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
7be0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
7bf0: 6f 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63  ode from subfunc
7c00: 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 69 66 28 20  tions */..  if( 
7c10: 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a  *pRC ) return;..
7c20: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
7c30: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
7c40: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a  ->mutex) );.  /*
7c50: 20 54 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   The master-jour
7c60: 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20  nal page number 
7c70: 6d 75 73 74 20 6e 65 76 65 72 20 62 65 20 75 73  must never be us
7c80: 65 64 20 61 73 20 61 20 70 6f 69 6e 74 65 72 20  ed as a pointer 
7c90: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 61 73  map page */.  as
7ca0: 73 65 72 74 28 20 30 3d 3d 50 54 52 4d 41 50 5f  sert( 0==PTRMAP_
7cb0: 49 53 50 41 47 45 28 70 42 74 2c 20 50 45 4e 44  ISPAGE(pBt, PEND
7cc0: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
7cd0: 74 29 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  t)) );..  assert
7ce0: 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
7cf0: 6d 20 29 3b 0a 20 20 69 66 28 20 6b 65 79 3d 3d  m );.  if( key==
7d00: 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  0 ){.    *pRC = 
7d10: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
7d20: 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  KPT;.    return;
7d30: 0a 20 20 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d  .  }.  iPtrmap =
7d40: 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70   PTRMAP_PAGENO(p
7d50: 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d  Bt, key);.  rc =
7d60: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
7d70: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50  (pBt->pPager, iP
7d80: 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 2c  trmap, &pDbPage,
7d90: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
7da0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7db0: 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72  *pRC = rc;.    r
7dc0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 66 66  eturn;.  }.  off
7dd0: 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52  set = PTRMAP_PTR
7de0: 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20  OFFSET(iPtrmap, 
7df0: 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73  key);.  if( offs
7e00: 65 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70 52 43  et<0 ){.    *pRC
7e10: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
7e20: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f  T_BKPT;.    goto
7e30: 20 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20   ptrmap_exit;.  
7e40: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
7e50: 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  et <= (int)pBt->
7e60: 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a  usableSize-5 );.
7e70: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
7e80: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
7e90: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
7ea0: 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 70 50  .  if( eType!=pP
7eb0: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c  trmap[offset] ||
7ec0: 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d   get4byte(&pPtrm
7ed0: 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70  ap[offset+1])!=p
7ee0: 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41  arent ){.    TRA
7ef0: 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41  CE(("PTRMAP_UPDA
7f00: 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c  TE: %d->(%d,%d)\
7f10: 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20  n", key, eType, 
7f20: 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 2a 70  parent));.    *p
7f30: 52 43 3d 20 72 63 20 3d 20 73 71 6c 69 74 65 33  RC= rc = sqlite3
7f40: 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61  PagerWrite(pDbPa
7f50: 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
7f60: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7f70: 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66 73      pPtrmap[offs
7f80: 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20 20  et] = eType;.   
7f90: 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 74     put4byte(&pPt
7fa0: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20  rmap[offset+1], 
7fb0: 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  parent);.    }. 
7fc0: 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78 69 74 3a   }..ptrmap_exit:
7fd0: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
7fe0: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 7d  nref(pDbPage);.}
7ff0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20  ../*.** Read an 
8000: 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70  entry from the p
8010: 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a  ointer map..**.*
8020: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
8030: 65 74 72 69 65 76 65 73 20 74 68 65 20 70 6f 69  etrieves the poi
8040: 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
8050: 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77  or page 'key', w
8060: 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79  riting.** the ty
8070: 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61  pe and parent pa
8080: 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45  ge number to *pE
8090: 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20  Type and *pPgno 
80a0: 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a  respectively..**
80b0: 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   An error code i
80c0: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f  s returned if so
80d0: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
80e0: 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51  ng, otherwise SQ
80f0: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
8100: 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74  ic int ptrmapGet
8110: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
8120: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45  Pgno key, u8 *pE
8130: 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e  Type, Pgno *pPgn
8140: 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  o){.  DbPage *pD
8150: 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20  bPage;   /* The 
8160: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
8170: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d 61   */.  int iPtrma
8180: 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  p;       /* Poin
8190: 74 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64  ter map page ind
81a0: 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72  ex */.  u8 *pPtr
81b0: 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f  map;       /* Po
81c0: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 64  inter map page d
81d0: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66  ata */.  int off
81e0: 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f  set;        /* O
81f0: 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69  ffset of entry i
8200: 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f  n pointer map */
8210: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
8220: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
8230: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
8240: 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d  tex) );..  iPtrm
8250: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
8260: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
8270: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
8280: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
8290: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
82a0: 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  age, 0);.  if( r
82b0: 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  c!=0 ){.    retu
82c0: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74  rn rc;.  }.  pPt
82d0: 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c  rmap = (u8 *)sql
82e0: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
82f0: 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66  (pDbPage);..  of
8300: 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54  fset = PTRMAP_PT
8310: 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c  ROFFSET(iPtrmap,
8320: 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66   key);.  if( off
8330: 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c  set<0 ){.    sql
8340: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
8350: 44 62 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74  DbPage);.    ret
8360: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
8370: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61  PT_BKPT;.  }.  a
8380: 73 73 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d  ssert( offset <=
8390: 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c   (int)pBt->usabl
83a0: 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73  eSize-5 );.  ass
83b0: 65 72 74 28 20 70 45 54 79 70 65 21 3d 30 20 29  ert( pEType!=0 )
83c0: 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d 20 70 50  ;.  *pEType = pP
83d0: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20  trmap[offset];. 
83e0: 20 69 66 28 20 70 50 67 6e 6f 20 29 20 2a 70 50   if( pPgno ) *pP
83f0: 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
8400: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
8410: 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61  ]);..  sqlite3Pa
8420: 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65  gerUnref(pDbPage
8430: 29 3b 0a 20 20 69 66 28 20 2a 70 45 54 79 70 65  );.  if( *pEType
8440: 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20  <1 || *pEType>5 
8450: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
8460: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
8470: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
8480: 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66  ;.}..#else /* if
8490: 20 64 65 66 69 6e 65 64 20 53 51 4c 49 54 45 5f   defined SQLITE_
84a0: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  OMIT_AUTOVACUUM 
84b0: 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72  */.  #define ptr
84c0: 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72  mapPut(w,x,y,z,r
84d0: 63 29 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72  c).  #define ptr
84e0: 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20  mapGet(w,x,y,z) 
84f0: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66  SQLITE_OK.  #def
8500: 69 6e 65 20 70 74 72 6d 61 70 50 75 74 4f 76 66  ine ptrmapPutOvf
8510: 6c 50 74 72 28 78 2c 20 79 2c 20 72 63 29 0a 23  lPtr(x, y, rc).#
8520: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  endif../*.** Giv
8530: 65 6e 20 61 20 62 74 72 65 65 20 70 61 67 65 20  en a btree page 
8540: 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65 78  and a cell index
8550: 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66 69   (0 means the fi
8560: 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74  rst cell on.** t
8570: 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e 73  he page, 1 means
8580: 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c   the second cell
8590: 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 20  , and so forth) 
85a0: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
85b0: 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  .** to the cell 
85c0: 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 66  content..**.** f
85d0: 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28 29  indCellPastPtr()
85e0: 20 64 6f 65 73 20 74 68 65 20 73 61 6d 65 20 65   does the same e
85f0: 78 63 65 70 74 20 69 74 20 73 6b 69 70 73 20 70  xcept it skips p
8600: 61 73 74 20 74 68 65 20 69 6e 69 74 69 61 6c 0a  ast the initial.
8610: 2a 2a 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20  ** 4-byte child 
8620: 70 6f 69 6e 74 65 72 20 66 6f 75 6e 64 20 6f 6e  pointer found on
8630: 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65 73 2c   interior pages,
8640: 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
8650: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
8660: 74 69 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20  tine works only 
8670: 66 6f 72 20 70 61 67 65 73 20 74 68 61 74 20 64  for pages that d
8680: 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76  o not contain ov
8690: 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f  erflow cells..*/
86a0: 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c  .#define findCel
86b0: 6c 28 50 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d  l(P,I) \.  ((P)-
86c0: 3e 61 44 61 74 61 20 2b 20 28 28 50 29 2d 3e 6d  >aData + ((P)->m
86d0: 61 73 6b 50 61 67 65 20 26 20 67 65 74 32 62 79  askPage & get2by
86e0: 74 65 41 6c 69 67 6e 65 64 28 26 28 50 29 2d 3e  teAligned(&(P)->
86f0: 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29  aCellIdx[2*(I)])
8700: 29 29 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43  )).#define findC
8710: 65 6c 6c 50 61 73 74 50 74 72 28 50 2c 49 29 20  ellPastPtr(P,I) 
8720: 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61 4f  \.  ((P)->aDataO
8730: 66 73 74 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b  fst + ((P)->mask
8740: 50 61 67 65 20 26 20 67 65 74 32 62 79 74 65 41  Page & get2byteA
8750: 6c 69 67 6e 65 64 28 26 28 50 29 2d 3e 61 43 65  ligned(&(P)->aCe
8760: 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a  llIdx[2*(I)]))).
8770: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
8780: 63 6f 6d 6d 6f 6e 20 74 61 69 6c 20 70 72 6f 63  common tail proc
8790: 65 73 73 69 6e 67 20 66 6f 72 20 62 74 72 65 65  essing for btree
87a0: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 61  ParseCellPtr() a
87b0: 6e 64 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65  nd.** btreeParse
87c0: 43 65 6c 6c 50 74 72 49 6e 64 65 78 28 29 20 66  CellPtrIndex() f
87d0: 6f 72 20 74 68 65 20 63 61 73 65 20 77 68 65 6e  or the case when
87e0: 20 74 68 65 20 63 65 6c 6c 20 64 6f 65 73 20 6e   the cell does n
87f0: 6f 74 20 66 69 74 20 65 6e 74 69 72 65 6c 79 0a  ot fit entirely.
8800: 2a 2a 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 42  ** on a single B
8810: 2d 74 72 65 65 20 70 61 67 65 2e 20 20 4d 61 6b  -tree page.  Mak
8820: 65 20 6e 65 63 65 73 73 61 72 79 20 61 64 6a 75  e necessary adju
8830: 73 74 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 43  stments to the C
8840: 65 6c 6c 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63  ellInfo.** struc
8850: 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
8860: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
8870: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
8880: 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f 72  ellAdjustSizeFor
8890: 4f 76 65 72 66 6c 6f 77 28 0a 20 20 4d 65 6d 50  Overflow(.  MemP
88a0: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
88b0: 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
88c0: 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  aining the cell 
88d0: 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
88e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
88f0: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  Pointer to the c
8900: 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43  ell text. */.  C
8910: 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20  ellInfo *pInfo  
8920: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
8930: 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
8940: 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 49 66 20 74   */.){.  /* If t
8950: 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20  he payload will 
8960: 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74 65  not fit complete
8970: 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  ly on the local 
8980: 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20 20  page, we have.  
8990: 2a 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f 77  ** to decide how
89a0: 20 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20 6c   much to store l
89b0: 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d  ocally and how m
89c0: 75 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74  uch to spill ont
89d0: 6f 0a 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20  o.  ** overflow 
89e0: 70 61 67 65 73 2e 20 20 54 68 65 20 73 74 72 61  pages.  The stra
89f0: 74 65 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d  tegy is to minim
8a00: 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  ize the amount o
8a10: 66 20 75 6e 75 73 65 64 0a 20 20 2a 2a 20 73 70  f unused.  ** sp
8a20: 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20  ace on overflow 
8a30: 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65 70  pages while keep
8a40: 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  ing the amount o
8a50: 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a  f local storage.
8a60: 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e 20    ** in between 
8a70: 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78  minLocal and max
8a80: 4c 6f 63 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  Local..  **.  **
8a90: 20 57 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67   Warning:  chang
8aa0: 69 6e 67 20 74 68 65 20 77 61 79 20 6f 76 65 72  ing the way over
8ab0: 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69 73 20  flow payload is 
8ac0: 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 61  distributed in a
8ad0: 6e 79 0a 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c  ny.  ** way will
8ae0: 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e   result in an in
8af0: 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 20  compatible file 
8b00: 66 6f 72 6d 61 74 2e 0a 20 20 2a 2f 0a 20 20 69  format..  */.  i
8b10: 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a  nt minLocal;  /*
8b20: 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20   Minimum amount 
8b30: 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20  of payload held 
8b40: 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74  locally */.  int
8b50: 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d   maxLocal;  /* M
8b60: 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  aximum amount of
8b70: 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f   payload held lo
8b80: 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 73  cally */.  int s
8b90: 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65  urplus;   /* Ove
8ba0: 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61 76  rflow payload av
8bb0: 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61  ailable for loca
8bc0: 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20  l storage */..  
8bd0: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65  minLocal = pPage
8be0: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 6d 61  ->minLocal;.  ma
8bf0: 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e  xLocal = pPage->
8c00: 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 73 75 72 70  maxLocal;.  surp
8c10: 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b  lus = minLocal +
8c20: 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61   (pInfo->nPayloa
8c30: 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70  d - minLocal)%(p
8c40: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
8c50: 65 53 69 7a 65 2d 34 29 3b 0a 20 20 74 65 73 74  eSize-4);.  test
8c60: 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d  case( surplus==m
8c70: 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73  axLocal );.  tes
8c80: 74 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d  tcase( surplus==
8c90: 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20  maxLocal+1 );.  
8ca0: 69 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d  if( surplus <= m
8cb0: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 70  axLocal ){.    p
8cc0: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28  Info->nLocal = (
8cd0: 75 31 36 29 73 75 72 70 6c 75 73 3b 0a 20 20 7d  u16)surplus;.  }
8ce0: 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d  else{.    pInfo-
8cf0: 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d  >nLocal = (u16)m
8d00: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 70  inLocal;.  }.  p
8d10: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28 75  Info->nSize = (u
8d20: 31 36 29 28 26 70 49 6e 66 6f 2d 3e 70 50 61 79  16)(&pInfo->pPay
8d30: 6c 6f 61 64 5b 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  load[pInfo->nLoc
8d40: 61 6c 5d 20 2d 20 70 43 65 6c 6c 29 20 2b 20 34  al] - pCell) + 4
8d50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
8d60: 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
8d70: 73 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s are implementa
8d80: 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65 6d  tions of the Mem
8d90: 50 61 67 65 2e 78 50 61 72 73 65 43 65 6c 6c 28  Page.xParseCell(
8da0: 29 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a  ).** method..**.
8db0: 2a 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c 20  ** Parse a cell 
8dc0: 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e  content block an
8dd0: 64 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43 65  d fill in the Ce
8de0: 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  llInfo structure
8df0: 2e 0a 2a 2a 0a 2a 2a 20 62 74 72 65 65 50 61 72  ..**.** btreePar
8e00: 73 65 43 65 6c 6c 50 74 72 28 29 20 20 20 20 20  seCellPtr()     
8e10: 20 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 62 74     =>   table bt
8e20: 72 65 65 20 6c 65 61 66 20 6e 6f 64 65 73 0a 2a  ree leaf nodes.*
8e30: 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  * btreeParseCell
8e40: 4e 6f 50 61 79 6c 6f 61 64 28 29 20 20 3d 3e 20  NoPayload()  => 
8e50: 20 20 74 61 62 6c 65 20 62 74 72 65 65 20 69 6e    table btree in
8e60: 74 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20  ternal nodes.** 
8e70: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
8e80: 72 49 6e 64 65 78 28 29 20 20 20 3d 3e 20 20 20  rIndex()   =>   
8e90: 69 6e 64 65 78 20 62 74 72 65 65 20 6e 6f 64 65  index btree node
8ea0: 73 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73  s.**.** There is
8eb0: 20 61 6c 73 6f 20 61 20 77 72 61 70 70 65 72 20   also a wrapper 
8ec0: 66 75 6e 63 74 69 6f 6e 20 62 74 72 65 65 50 61  function btreePa
8ed0: 72 73 65 43 65 6c 6c 28 29 20 74 68 61 74 20 77  rseCell() that w
8ee0: 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20  orks for.** all 
8ef0: 4d 65 6d 50 61 67 65 20 74 79 70 65 73 20 61 6e  MemPage types an
8f00: 64 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  d that reference
8f10: 73 20 74 68 65 20 63 65 6c 6c 20 62 79 20 69 6e  s the cell by in
8f20: 64 65 78 20 72 61 74 68 65 72 20 74 68 61 6e 0a  dex rather than.
8f30: 2a 2a 20 62 79 20 70 6f 69 6e 74 65 72 2e 0a 2a  ** by pointer..*
8f40: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  /.static void bt
8f50: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 4e  reeParseCellPtrN
8f60: 6f 50 61 79 6c 6f 61 64 28 0a 20 20 4d 65 6d 50  oPayload(.  MemP
8f70: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
8f80: 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
8f90: 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  aining the cell 
8fa0: 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
8fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8fc0: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  Pointer to the c
8fd0: 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43  ell text. */.  C
8fe0: 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20  ellInfo *pInfo  
8ff0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
9000: 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
9010: 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
9020: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
9030: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
9040: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
9050: 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d  rt( pPage->leaf=
9060: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
9070: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
9080: 69 7a 65 3d 3d 34 20 29 3b 0a 23 69 66 6e 64 65  ize==4 );.#ifnde
9090: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
90a0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
90b0: 52 28 70 50 61 67 65 29 3b 0a 23 65 6e 64 69 66  R(pPage);.#endif
90c0: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20  .  pInfo->nSize 
90d0: 3d 20 34 20 2b 20 67 65 74 56 61 72 69 6e 74 28  = 4 + getVarint(
90e0: 26 70 43 65 6c 6c 5b 34 5d 2c 20 28 75 36 34 2a  &pCell[4], (u64*
90f0: 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a  )&pInfo->nKey);.
9100: 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61    pInfo->nPayloa
9110: 64 20 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e  d = 0;.  pInfo->
9120: 6e 4c 6f 63 61 6c 20 3d 20 30 3b 0a 20 20 70 49  nLocal = 0;.  pI
9130: 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20  nfo->pPayload = 
9140: 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 73  0;.  return;.}.s
9150: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
9160: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 0a 20 20  ParseCellPtr(.  
9170: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
9180: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
9190: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
91a0: 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  ell */.  u8 *pCe
91b0: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
91c0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
91d0: 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f  he cell text. */
91e0: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e  .  CellInfo *pIn
91f0: 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  fo         /* Fi
9200: 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ll in this struc
9210: 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20  ture */.){.  u8 
9220: 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20 20 20  *pIter;         
9230: 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e       /* For scan
9240: 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 70 43 65  ning through pCe
9250: 6c 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79  ll */.  u32 nPay
9260: 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20  load;           
9270: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
9280: 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f  es of cell paylo
9290: 61 64 20 2a 2f 0a 20 20 75 36 34 20 69 4b 65 79  ad */.  u64 iKey
92a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
92b0: 2f 2a 20 45 78 74 72 61 63 74 65 64 20 4b 65 79  /* Extracted Key
92c0: 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 61 73 73   value */..  ass
92d0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
92e0: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
92f0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
9300: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c  assert( pPage->l
9310: 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d  eaf==0 || pPage-
9320: 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 61 73  >leaf==1 );.  as
9330: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74  sert( pPage->int
9340: 4b 65 79 4c 65 61 66 20 29 3b 0a 20 20 61 73 73  KeyLeaf );.  ass
9350: 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c  ert( pPage->chil
9360: 64 50 74 72 53 69 7a 65 3d 3d 30 20 29 3b 0a 20  dPtrSize==0 );. 
9370: 20 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 3b 0a   pIter = pCell;.
9380: 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 62  .  /* The next b
9390: 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 69 73 20  lock of code is 
93a0: 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20  equivalent to:. 
93b0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 70 49 74   **.  **     pIt
93c0: 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  er += getVarint3
93d0: 32 28 70 49 74 65 72 2c 20 6e 50 61 79 6c 6f 61  2(pIter, nPayloa
93e0: 64 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  d);.  **.  ** Th
93f0: 65 20 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65  e code is inline
9400: 64 20 74 6f 20 61 76 6f 69 64 20 61 20 66 75 6e  d to avoid a fun
9410: 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f  ction call..  */
9420: 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70  .  nPayload = *p
9430: 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 50 61 79  Iter;.  if( nPay
9440: 6c 6f 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20  load>=0x80 ){.  
9450: 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49    u8 *pEnd = &pI
9460: 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79  ter[8];.    nPay
9470: 6c 6f 61 64 20 26 3d 20 30 78 37 66 3b 0a 20 20  load &= 0x7f;.  
9480: 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79    do{.      nPay
9490: 6c 6f 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64  load = (nPayload
94a0: 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72  <<7) | (*++pIter
94b0: 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77   & 0x7f);.    }w
94c0: 68 69 6c 65 28 20 28 2a 70 49 74 65 72 29 3e 3d  hile( (*pIter)>=
94d0: 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45  0x80 && pIter<pE
94e0: 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65  nd );.  }.  pIte
94f0: 72 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e  r++;..  /* The n
9500: 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64  ext block of cod
9510: 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  e is equivalent 
9520: 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  to:.  **.  **   
9530: 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61    pIter += getVa
9540: 72 69 6e 74 28 70 49 74 65 72 2c 20 28 75 36 34  rint(pIter, (u64
9550: 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b  *)&pInfo->nKey);
9560: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63  .  **.  ** The c
9570: 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65 64 20 74  ode is inlined t
9580: 6f 20 61 76 6f 69 64 20 61 20 66 75 6e 63 74 69  o avoid a functi
9590: 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20  on call..  */.  
95a0: 69 4b 65 79 20 3d 20 2a 70 49 74 65 72 3b 0a 20  iKey = *pIter;. 
95b0: 20 69 66 28 20 69 4b 65 79 3e 3d 30 78 38 30 20   if( iKey>=0x80 
95c0: 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20  ){.    u8 *pEnd 
95d0: 3d 20 26 70 49 74 65 72 5b 37 5d 3b 0a 20 20 20  = &pIter[7];.   
95e0: 20 69 4b 65 79 20 26 3d 20 30 78 37 66 3b 0a 20   iKey &= 0x7f;. 
95f0: 20 20 20 77 68 69 6c 65 28 31 29 7b 0a 20 20 20     while(1){.   
9600: 20 20 20 69 4b 65 79 20 3d 20 28 69 4b 65 79 3c     iKey = (iKey<
9610: 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20  <7) | (*++pIter 
9620: 26 20 30 78 37 66 29 3b 0a 20 20 20 20 20 20 69  & 0x7f);.      i
9630: 66 28 20 28 2a 70 49 74 65 72 29 3c 30 78 38 30  f( (*pIter)<0x80
9640: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
9650: 69 66 28 20 70 49 74 65 72 3e 3d 70 45 6e 64 20  if( pIter>=pEnd 
9660: 29 7b 0a 20 20 20 20 20 20 20 20 69 4b 65 79 20  ){.        iKey 
9670: 3d 20 28 69 4b 65 79 3c 3c 38 29 20 7c 20 2a 2b  = (iKey<<8) | *+
9680: 2b 70 49 74 65 72 3b 0a 20 20 20 20 20 20 20 20  +pIter;.        
9690: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
96a0: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49 74 65 72     }.  }.  pIter
96b0: 2b 2b 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b  ++;..  pInfo->nK
96c0: 65 79 20 3d 20 2a 28 69 36 34 2a 29 26 69 4b 65  ey = *(i64*)&iKe
96d0: 79 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79  y;.  pInfo->nPay
96e0: 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b  load = nPayload;
96f0: 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f  .  pInfo->pPaylo
9700: 61 64 20 3d 20 70 49 74 65 72 3b 0a 20 20 74 65  ad = pIter;.  te
9710: 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64  stcase( nPayload
9720: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
9730: 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  l );.  testcase(
9740: 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65   nPayload==pPage
9750: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
9760: 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d    if( nPayload<=
9770: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
9780: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  ){.    /* This i
9790: 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d  s the (easy) com
97a0: 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74  mon case where t
97b0: 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61  he entire payloa
97c0: 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e  d fits.    ** on
97d0: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e   the local page.
97e0: 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73    No overflow is
97f0: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
9800: 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69  /.    pInfo->nSi
9810: 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20  ze = nPayload + 
9820: 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43  (u16)(pIter - pC
9830: 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 70 49  ell);.    if( pI
9840: 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20 70  nfo->nSize<4 ) p
9850: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b  Info->nSize = 4;
9860: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  .    pInfo->nLoc
9870: 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f  al = (u16)nPaylo
9880: 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ad;.  }else{.   
9890: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 41   btreeParseCellA
98a0: 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65 72  djustSizeForOver
98b0: 66 6c 6f 77 28 70 50 61 67 65 2c 20 70 43 65 6c  flow(pPage, pCel
98c0: 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d  l, pInfo);.  }.}
98d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
98e0: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e  eeParseCellPtrIn
98f0: 64 65 78 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  dex(.  MemPage *
9900: 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f  pPage,         /
9910: 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  * Page containin
9920: 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  g the cell */.  
9930: 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  u8 *pCell,      
9940: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
9950: 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74  er to the cell t
9960: 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  ext. */.  CellIn
9970: 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20  fo *pInfo       
9980: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69    /* Fill in thi
9990: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29  s structure */.)
99a0: 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 3b 20 20  {.  u8 *pIter;  
99b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
99c0: 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f  or scanning thro
99d0: 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75  ugh pCell */.  u
99e0: 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20  32 nPayload;    
99f0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9a00: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c   of bytes of cel
9a10: 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20  l payload */..  
9a20: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
9a30: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
9a40: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
9a50: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9a60: 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61  ->leaf==0 || pPa
9a70: 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20  ge->leaf==1 );. 
9a80: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
9a90: 69 6e 74 4b 65 79 4c 65 61 66 3d 3d 30 20 29 3b  intKeyLeaf==0 );
9aa0: 0a 20 20 70 49 74 65 72 20 3d 20 70 43 65 6c 6c  .  pIter = pCell
9ab0: 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   + pPage->childP
9ac0: 74 72 53 69 7a 65 3b 0a 20 20 6e 50 61 79 6c 6f  trSize;.  nPaylo
9ad0: 61 64 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69  ad = *pIter;.  i
9ae0: 66 28 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78 38  f( nPayload>=0x8
9af0: 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e  0 ){.    u8 *pEn
9b00: 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20  d = &pIter[8];. 
9b10: 20 20 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20 30     nPayload &= 0
9b20: 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20  x7f;.    do{.   
9b30: 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28 6e     nPayload = (n
9b40: 50 61 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28 2a  Payload<<7) | (*
9b50: 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b  ++pIter & 0x7f);
9b60: 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 2a 28 70  .    }while( *(p
9b70: 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70  Iter)>=0x80 && p
9b80: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
9b90: 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20 70 49  .  pIter++;.  pI
9ba0: 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61 79  nfo->nKey = nPay
9bb0: 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e  load;.  pInfo->n
9bc0: 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f  Payload = nPaylo
9bd0: 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61  ad;.  pInfo->pPa
9be0: 79 6c 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a 20  yload = pIter;. 
9bf0: 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c   testcase( nPayl
9c00: 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  oad==pPage->maxL
9c10: 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61  ocal );.  testca
9c20: 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50  se( nPayload==pP
9c30: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20  age->maxLocal+1 
9c40: 29 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61  );.  if( nPayloa
9c50: 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d<=pPage->maxLoc
9c60: 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  al ){.    /* Thi
9c70: 73 20 69 73 20 74 68 65 20 28 65 61 73 79 29 20  s is the (easy) 
9c80: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
9c90: 65 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 79  e the entire pay
9ca0: 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a  load fits.    **
9cb0: 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61   on the local pa
9cc0: 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77  ge.  No overflow
9cd0: 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20   is required..  
9ce0: 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e    */.    pInfo->
9cf0: 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64  nSize = nPayload
9d00: 20 2b 20 28 75 31 36 29 28 70 49 74 65 72 20 2d   + (u16)(pIter -
9d10: 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28   pCell);.    if(
9d20: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20   pInfo->nSize<4 
9d30: 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d  ) pInfo->nSize =
9d40: 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   4;.    pInfo->n
9d50: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61  Local = (u16)nPa
9d60: 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a  yload;.  }else{.
9d70: 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
9d80: 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f  llAdjustSizeForO
9d90: 76 65 72 66 6c 6f 77 28 70 50 61 67 65 2c 20 70  verflow(pPage, p
9da0: 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20  Cell, pInfo);.  
9db0: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
9dc0: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 0a  btreeParseCell(.
9dd0: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
9de0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67  ,         /* Pag
9df0: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
9e00: 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69   cell */.  int i
9e10: 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
9e20: 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69     /* The cell i
9e30: 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63 65 6c  ndex.  First cel
9e40: 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c  l is 0 */.  Cell
9e50: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
9e60: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
9e70: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
9e80: 0a 29 7b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61  .){.  pPage->xPa
9e90: 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 66  rseCell(pPage, f
9ea0: 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
9eb0: 43 65 6c 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a 7d  Cell), pInfo);.}
9ec0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
9ed0: 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61  owing routines a
9ee0: 72 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  re implementatio
9ef0: 6e 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67  ns of the MemPag
9f00: 65 2e 78 43 65 6c 6c 53 69 7a 65 0a 2a 2a 20 6d  e.xCellSize.** m
9f10: 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6d  ethod..**.** Com
9f20: 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 6e  pute the total n
9f30: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
9f40: 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64 73  hat a Cell needs
9f50: 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20   in the cell.** 
9f60: 64 61 74 61 20 61 72 65 61 20 6f 66 20 74 68 65  data area of the
9f70: 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54 68   btree-page.  Th
9f80: 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72 20  e return number 
9f90: 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65 6c  includes the cel
9fa0: 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65 72  l.** data header
9fb0: 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20 70   and the local p
9fc0: 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20  ayload, but not 
9fd0: 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
9fe0: 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61 63  e or.** the spac
9ff0: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63 65  e used by the ce
a000: 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a  ll pointer..**.*
a010: 2a 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50  * cellSizePtrNoP
a020: 61 79 6c 6f 61 64 28 29 20 20 20 20 3d 3e 20 20  ayload()    =>  
a030: 20 74 61 62 6c 65 20 69 6e 74 65 72 6e 61 6c 20   table internal 
a040: 6e 6f 64 65 73 0a 2a 2a 20 63 65 6c 6c 53 69 7a  nodes.** cellSiz
a050: 65 50 74 72 28 29 20 20 20 20 20 20 20 20 20 20  ePtr()          
a060: 20 20 20 3d 3e 20 20 20 61 6c 6c 20 69 6e 64 65     =>   all inde
a070: 78 20 6e 6f 64 65 73 20 26 20 74 61 62 6c 65 20  x nodes & table 
a080: 6c 65 61 66 20 6e 6f 64 65 73 0a 2a 2f 0a 73 74  leaf nodes.*/.st
a090: 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a  atic u16 cellSiz
a0a0: 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50  ePtr(MemPage *pP
a0b0: 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b  age, u8 *pCell){
a0c0: 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d 20 70  .  u8 *pIter = p
a0d0: 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e 63 68  Cell + pPage->ch
a0e0: 69 6c 64 50 74 72 53 69 7a 65 3b 20 2f 2a 20 46  ildPtrSize; /* F
a0f0: 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
a100: 62 79 74 65 73 20 6f 66 20 70 43 65 6c 6c 20 2a  bytes of pCell *
a110: 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20 20 20  /.  u8 *pEnd;   
a120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a130: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a140: 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61 20 76  End mark for a v
a150: 61 72 69 6e 74 20 2a 2f 0a 20 20 75 33 32 20 6e  arint */.  u32 n
a160: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
a170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a180: 20 20 20 20 2f 2a 20 53 69 7a 65 20 76 61 6c 75      /* Size valu
a190: 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a  e to return */..
a1a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
a1b0: 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c  BUG.  /* The val
a1c0: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ue returned by t
a1d0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
a1e0: 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74 68  uld always be th
a1f0: 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74  e same as.  ** t
a200: 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69  he (CellInfo.nSi
a210: 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64 20  ze) value found 
a220: 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20  by doing a full 
a230: 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20 2a  parse of the.  *
a240: 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54  * cell. If SQLIT
a250: 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69 6e  E_DEBUG is defin
a260: 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20  ed, an assert() 
a270: 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66  at the bottom of
a280: 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  .  ** this funct
a290: 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68 61  ion verifies tha
a2a0: 74 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e 74  t this invariant
a2b0: 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64   is not violated
a2c0: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
a2d0: 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70 50 61  debuginfo;.  pPa
a2e0: 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70  ge->xParseCell(p
a2f0: 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65  Page, pCell, &de
a300: 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64 69 66  buginfo);.#endif
a310: 0a 0a 20 20 6e 53 69 7a 65 20 3d 20 2a 70 49 74  ..  nSize = *pIt
a320: 65 72 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65 3e  er;.  if( nSize>
a330: 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 70 45 6e  =0x80 ){.    pEn
a340: 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20  d = &pIter[8];. 
a350: 20 20 20 6e 53 69 7a 65 20 26 3d 20 30 78 37 66     nSize &= 0x7f
a360: 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  ;.    do{.      
a370: 6e 53 69 7a 65 20 3d 20 28 6e 53 69 7a 65 3c 3c  nSize = (nSize<<
a380: 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26  7) | (*++pIter &
a390: 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69   0x7f);.    }whi
a3a0: 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d 30 78  le( *(pIter)>=0x
a3b0: 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64  80 && pIter<pEnd
a3c0: 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b   );.  }.  pIter+
a3d0: 2b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  +;.  if( pPage->
a3e0: 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a  intKey ){.    /*
a3f0: 20 70 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e 74   pIter now point
a400: 73 20 61 74 20 74 68 65 20 36 34 2d 62 69 74 20  s at the 64-bit 
a410: 69 6e 74 65 67 65 72 20 6b 65 79 20 76 61 6c 75  integer key valu
a420: 65 2c 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65  e, a variable le
a430: 6e 67 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e 74  ngth .    ** int
a440: 65 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77  eger. The follow
a450: 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73 20  ing block moves 
a460: 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61  pIter to point a
a470: 74 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  t the first byte
a480: 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65  .    ** past the
a490: 20 65 6e 64 20 6f 66 20 74 68 65 20 6b 65 79 20   end of the key 
a4a0: 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70 45  value. */.    pE
a4b0: 6e 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a  nd = &pIter[9];.
a4c0: 20 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49 74      while( (*pIt
a4d0: 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70 49  er++)&0x80 && pI
a4e0: 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a  ter<pEnd );.  }.
a4f0: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
a500: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
a510: 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  al );.  testcase
a520: 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e  ( nSize==pPage->
a530: 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20  maxLocal+1 );.  
a540: 69 66 28 20 6e 53 69 7a 65 3c 3d 70 50 61 67 65  if( nSize<=pPage
a550: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20  ->maxLocal ){.  
a560: 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32 29    nSize += (u32)
a570: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b  (pIter - pCell);
a580: 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c 34  .    if( nSize<4
a590: 20 29 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20   ) nSize = 4;.  
a5a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6d  }else{.    int m
a5b0: 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d  inLocal = pPage-
a5c0: 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e  >minLocal;.    n
a5d0: 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20  Size = minLocal 
a5e0: 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f  + (nSize - minLo
a5f0: 63 61 6c 29 20 25 20 28 70 50 61 67 65 2d 3e 70  cal) % (pPage->p
a600: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
a610: 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73   4);.    testcas
a620: 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d  e( nSize==pPage-
a630: 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20  >maxLocal );.   
a640: 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65   testcase( nSize
a650: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
a660: 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e  l+1 );.    if( n
a670: 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c  Size>pPage->maxL
a680: 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e 53  ocal ){.      nS
a690: 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a  ize = minLocal;.
a6a0: 20 20 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65 20      }.    nSize 
a6b0: 2b 3d 20 34 20 2b 20 28 75 31 36 29 28 70 49 74  += 4 + (u16)(pIt
a6c0: 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 7d  er - pCell);.  }
a6d0: 0a 20 20 61 73 73 65 72 74 28 20 6e 53 69 7a 65  .  assert( nSize
a6e0: 3d 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a  ==debuginfo.nSiz
a6f0: 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  e || CORRUPT_DB 
a700: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31 36  );.  return (u16
a710: 29 6e 53 69 7a 65 3b 0a 7d 0a 73 74 61 74 69 63  )nSize;.}.static
a720: 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74 72   u16 cellSizePtr
a730: 4e 6f 50 61 79 6c 6f 61 64 28 4d 65 6d 50 61 67  NoPayload(MemPag
a740: 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43  e *pPage, u8 *pC
a750: 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74 65  ell){.  u8 *pIte
a760: 72 20 3d 20 70 43 65 6c 6c 20 2b 20 34 3b 20 2f  r = pCell + 4; /
a770: 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
a780: 65 72 20 62 79 74 65 73 20 6f 66 20 70 43 65 6c  er bytes of pCel
a790: 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b  l */.  u8 *pEnd;
a7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a7b0: 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61 20   End mark for a 
a7c0: 76 61 72 69 6e 74 20 2a 2f 0a 0a 23 69 66 64 65  varint */..#ifde
a7d0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
a7e0: 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65   /* The value re
a7f0: 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 66  turned by this f
a800: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61  unction should a
a810: 6c 77 61 79 73 20 62 65 20 74 68 65 20 73 61 6d  lways be the sam
a820: 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43  e as.  ** the (C
a830: 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76  ellInfo.nSize) v
a840: 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f  alue found by do
a850: 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65  ing a full parse
a860: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c   of the.  ** cel
a870: 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42  l. If SQLITE_DEB
a880: 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61  UG is defined, a
a890: 6e 20 61 73 73 65 72 74 28 29 20 61 74 20 74 68  n assert() at th
a8a0: 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a  e bottom of.  **
a8b0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76   this function v
a8c0: 65 72 69 66 69 65 73 20 74 68 61 74 20 74 68 69  erifies that thi
a8d0: 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e  s invariant is n
a8e0: 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a  ot violated. */.
a8f0: 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67    CellInfo debug
a900: 69 6e 66 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 78  info;.  pPage->x
a910: 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  ParseCell(pPage,
a920: 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e   pCell, &debugin
a930: 66 6f 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55  fo);.#else.  UNU
a940: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50  SED_PARAMETER(pP
a950: 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  age);.#endif..  
a960: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63  assert( pPage->c
a970: 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20 29  hildPtrSize==4 )
a980: 3b 0a 20 20 70 45 6e 64 20 3d 20 70 49 74 65 72  ;.  pEnd = pIter
a990: 20 2b 20 39 3b 0a 20 20 77 68 69 6c 65 28 20 28   + 9;.  while( (
a9a0: 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20 26  *pIter++)&0x80 &
a9b0: 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a  & pIter<pEnd );.
a9c0: 20 20 61 73 73 65 72 74 28 20 64 65 62 75 67 69    assert( debugi
a9d0: 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 28 75 31 36 29  nfo.nSize==(u16)
a9e0: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 20  (pIter - pCell) 
a9f0: 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
aa00: 0a 20 20 72 65 74 75 72 6e 20 28 75 31 36 29 28  .  return (u16)(
aa10: 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a  pIter - pCell);.
aa20: 7d 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  }...#ifdef SQLIT
aa30: 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 20  E_DEBUG./* This 
aa40: 76 61 72 69 61 74 69 6f 6e 20 6f 6e 20 63 65 6c  variation on cel
aa50: 6c 53 69 7a 65 50 74 72 28 29 20 69 73 20 75 73  lSizePtr() is us
aa60: 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73  ed inside of ass
aa70: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
aa80: 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61  .** only. */.sta
aa90: 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65  tic u16 cellSize
aaa0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
aab0: 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72   int iCell){.  r
aac0: 65 74 75 72 6e 20 70 50 61 67 65 2d 3e 78 43 65  eturn pPage->xCe
aad0: 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 66 69  llSize(pPage, fi
aae0: 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  ndCell(pPage, iC
aaf0: 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ell));.}.#endif.
ab00: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
ab10: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
ab20: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c  /*.** If the cel
ab30: 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20 6f 66  l pCell, part of
ab40: 20 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e 74   page pPage cont
ab50: 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a  ains a pointer.*
ab60: 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  * to an overflow
ab70: 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61 6e   page, insert an
ab80: 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20   entry into the 
ab90: 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66  pointer-map.** f
aba0: 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
abb0: 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
abc0: 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74 4f 76  void ptrmapPutOv
abd0: 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70  flPtr(MemPage *p
abe0: 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 2c  Page, u8 *pCell,
abf0: 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 43 65   int *pRC){.  Ce
ac00: 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 69  llInfo info;.  i
ac10: 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e  f( *pRC ) return
ac20: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 65 6c  ;.  assert( pCel
ac30: 6c 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 2d  l!=0 );.  pPage-
ac40: 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67  >xParseCell(pPag
ac50: 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
ac60: 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f  ;.  if( info.nLo
ac70: 63 61 6c 3c 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  cal<info.nPayloa
ac80: 64 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76  d ){.    Pgno ov
ac90: 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  fl = get4byte(&p
aca0: 43 65 6c 6c 5b 69 6e 66 6f 2e 6e 53 69 7a 65 2d  Cell[info.nSize-
acb0: 34 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50  4]);.    ptrmapP
acc0: 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f  ut(pPage->pBt, o
acd0: 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52  vfl, PTRMAP_OVER
ace0: 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67  FLOW1, pPage->pg
acf0: 6e 6f 2c 20 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a  no, pRC);.  }.}.
ad00: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44  #endif.../*.** D
ad10: 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61  efragment the pa
ad20: 67 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43  ge given.  All C
ad30: 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64 20 74  ells are moved t
ad40: 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20  o the.** end of 
ad50: 74 68 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c  the page and all
ad60: 20 66 72 65 65 20 73 70 61 63 65 20 69 73 20 63   free space is c
ad70: 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e  ollected into on
ad80: 65 0a 2a 2a 20 62 69 67 20 46 72 65 65 42 6c 6b  e.** big FreeBlk
ad90: 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20   that occurs in 
ada0: 62 65 74 77 65 65 6e 20 74 68 65 20 68 65 61 64  between the head
adb0: 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70  er and cell.** p
adc0: 6f 69 6e 74 65 72 20 61 72 72 61 79 20 61 6e 64  ointer array and
add0: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
ade0: 74 20 61 72 65 61 2e 0a 2a 2a 0a 2a 2a 20 45 56  t area..**.** EV
adf0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 35  IDENCE-OF: R-445
ae00: 38 32 2d 36 30 31 33 38 20 53 51 4c 69 74 65 20  82-60138 SQLite 
ae10: 6d 61 79 20 66 72 6f 6d 20 74 69 6d 65 20 74 6f  may from time to
ae20: 20 74 69 6d 65 20 72 65 6f 72 67 61 6e 69 7a 65   time reorganize
ae30: 20 61 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67   a.** b-tree pag
ae40: 65 20 73 6f 20 74 68 61 74 20 74 68 65 72 65 20  e so that there 
ae50: 61 72 65 20 6e 6f 20 66 72 65 65 62 6c 6f 63 6b  are no freeblock
ae60: 73 20 6f 72 20 66 72 61 67 6d 65 6e 74 20 62 79  s or fragment by
ae70: 74 65 73 2c 20 61 6c 6c 0a 2a 2a 20 75 6e 75 73  tes, all.** unus
ae80: 65 64 20 62 79 74 65 73 20 61 72 65 20 63 6f 6e  ed bytes are con
ae90: 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 75 6e  tained in the un
aea0: 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 20  allocated space 
aeb0: 72 65 67 69 6f 6e 2c 20 61 6e 64 20 61 6c 6c 0a  region, and all.
aec0: 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20 70 61 63  ** cells are pac
aed0: 6b 65 64 20 74 69 67 68 74 6c 79 20 61 74 20 74  ked tightly at t
aee0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  he end of the pa
aef0: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ge..*/.static in
af00: 74 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65  t defragmentPage
af10: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
af20: 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
af30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
af40: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
af50: 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20  /.  int pc;     
af60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
af70: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
af80: 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20   i-th cell */.  
af90: 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20  int hdr;        
afa0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
afb0: 66 73 65 74 20 74 6f 20 74 68 65 20 70 61 67 65  fset to the page
afc0: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
afd0: 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20   size;          
afe0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
aff0: 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69  of a cell */.  i
b000: 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20  nt usableSize;  
b010: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
b020: 62 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79  ber of usable by
b030: 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f  tes on a page */
b040: 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65  .  int cellOffse
b050: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
b060: 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63   Offset to the c
b070: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
b080: 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b  y */.  int cbrk;
b090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0a0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
b0b0: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
b0c0: 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  area */.  int nC
b0d0: 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
b0e0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
b0f0: 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70  f cells on the p
b100: 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  age */.  unsigne
b110: 64 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20  d char *data;   
b120: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
b130: 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  data */.  unsign
b140: 65 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20 20  ed char *temp;  
b150: 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72 65       /* Temp are
b160: 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65  a for cell conte
b170: 6e 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  nt */.  unsigned
b180: 20 63 68 61 72 20 2a 73 72 63 3b 20 20 20 20 20   char *src;     
b190: 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6f 66 20     /* Source of 
b1a0: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  content */.  int
b1b0: 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20   iCellFirst;    
b1c0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
b1d0: 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20   allowable cell 
b1e0: 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69  index */.  int i
b1f0: 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 20 20  CellLast;       
b200: 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f        /* Last po
b210: 73 73 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65  ssible cell inde
b220: 78 20 2a 2f 0a 0a 0a 20 20 61 73 73 65 72 74 28  x */...  assert(
b230: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
b240: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
b250: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
b260: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
b270: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
b280: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
b290: 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54  bleSize <= SQLIT
b2a0: 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20  E_MAX_PAGE_SIZE 
b2b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
b2c0: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
b2d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
b2e0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
b2f0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
b300: 65 78 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20  ex) );.  temp = 
b310: 30 3b 0a 20 20 73 72 63 20 3d 20 64 61 74 61 20  0;.  src = data 
b320: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
b330: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
b340: 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c  drOffset;.  cell
b350: 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e  Offset = pPage->
b360: 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43  cellOffset;.  nC
b370: 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
b380: 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43  ll;.  assert( nC
b390: 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28 26 64  ell==get2byte(&d
b3a0: 61 74 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20  ata[hdr+3]) );. 
b3b0: 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50   usableSize = pP
b3c0: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
b3d0: 53 69 7a 65 3b 0a 20 20 63 62 72 6b 20 3d 20 75  Size;.  cbrk = u
b3e0: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65  sableSize;.  iCe
b3f0: 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66  llFirst = cellOf
b400: 66 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a  fset + 2*nCell;.
b410: 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73    iCellLast = us
b420: 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
b430: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
b440: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a  ; i++){.    u8 *
b450: 70 41 64 64 72 3b 20 20 20 20 20 2f 2a 20 54 68  pAddr;     /* Th
b460: 65 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e  e i-th cell poin
b470: 74 65 72 20 2a 2f 0a 20 20 20 20 70 41 64 64 72  ter */.    pAddr
b480: 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66   = &data[cellOff
b490: 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20  set + i*2];.    
b4a0: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 41  pc = get2byte(pA
b4b0: 64 64 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61  ddr);.    testca
b4c0: 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72  se( pc==iCellFir
b4d0: 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  st );.    testca
b4e0: 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73  se( pc==iCellLas
b4f0: 74 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 73  t );.    /* Thes
b500: 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76  e conditions hav
b510: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 76  e already been v
b520: 65 72 69 66 69 65 64 20 69 6e 20 62 74 72 65 65  erified in btree
b530: 49 6e 69 74 50 61 67 65 28 29 0a 20 20 20 20 2a  InitPage().    *
b540: 2a 20 69 66 20 50 52 41 47 4d 41 20 63 65 6c 6c  * if PRAGMA cell
b550: 5f 73 69 7a 65 5f 63 68 65 63 6b 3d 4f 4e 2e 0a  _size_check=ON..
b560: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
b570: 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20  c<iCellFirst || 
b580: 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
b590: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
b5a0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
b5b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
b5c0: 72 74 28 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72  rt( pc>=iCellFir
b5d0: 73 74 20 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c  st && pc<=iCellL
b5e0: 61 73 74 20 29 3b 0a 20 20 20 20 73 69 7a 65 20  ast );.    size 
b5f0: 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69  = pPage->xCellSi
b600: 7a 65 28 70 50 61 67 65 2c 20 26 73 72 63 5b 70  ze(pPage, &src[p
b610: 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d 3d  c]);.    cbrk -=
b620: 20 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 63   size;.    if( c
b630: 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c  brk<iCellFirst |
b640: 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65  | pc+size>usable
b650: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65  Size ){.      re
b660: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
b670: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
b680: 20 20 20 20 61 73 73 65 72 74 28 20 63 62 72 6b      assert( cbrk
b690: 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a  +size<=usableSiz
b6a0: 65 20 26 26 20 63 62 72 6b 3e 3d 69 43 65 6c 6c  e && cbrk>=iCell
b6b0: 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73  First );.    tes
b6c0: 74 63 61 73 65 28 20 63 62 72 6b 2b 73 69 7a 65  tcase( cbrk+size
b6d0: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ==usableSize );.
b6e0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
b6f0: 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a  +size==usableSiz
b700: 65 20 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  e );.    put2byt
b710: 65 28 70 41 64 64 72 2c 20 63 62 72 6b 29 3b 0a  e(pAddr, cbrk);.
b720: 20 20 20 20 69 66 28 20 74 65 6d 70 3d 3d 30 20      if( temp==0 
b730: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 3b 0a  ){.      int x;.
b740: 20 20 20 20 20 20 69 66 28 20 63 62 72 6b 3d 3d        if( cbrk==
b750: 70 63 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  pc ) continue;. 
b760: 20 20 20 20 20 74 65 6d 70 20 3d 20 73 71 6c 69       temp = sqli
b770: 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63  te3PagerTempSpac
b780: 65 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50  e(pPage->pBt->pP
b790: 61 67 65 72 29 3b 0a 20 20 20 20 20 20 78 20 3d  ager);.      x =
b7a0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
b7b0: 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20 6d  hdr+5]);.      m
b7c0: 65 6d 63 70 79 28 26 74 65 6d 70 5b 78 5d 2c 20  emcpy(&temp[x], 
b7d0: 26 64 61 74 61 5b 78 5d 2c 20 28 63 62 72 6b 2b  &data[x], (cbrk+
b7e0: 73 69 7a 65 29 20 2d 20 78 29 3b 0a 20 20 20 20  size) - x);.    
b7f0: 20 20 73 72 63 20 3d 20 74 65 6d 70 3b 0a 20 20    src = temp;.  
b800: 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 26    }.    memcpy(&
b810: 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 73 72 63  data[cbrk], &src
b820: 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 7d  [pc], size);.  }
b830: 0a 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 3e  .  assert( cbrk>
b840: 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20  =iCellFirst );. 
b850: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
b860: 68 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20  hdr+5], cbrk);. 
b870: 20 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30   data[hdr+1] = 0
b880: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d 20  ;.  data[hdr+2] 
b890: 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b  = 0;.  data[hdr+
b8a0: 37 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74  7] = 0;.  memset
b8b0: 28 26 64 61 74 61 5b 69 43 65 6c 6c 46 69 72 73  (&data[iCellFirs
b8c0: 74 5d 2c 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c  t], 0, cbrk-iCel
b8d0: 6c 46 69 72 73 74 29 3b 0a 20 20 61 73 73 65 72  lFirst);.  asser
b8e0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
b8f0: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
b900: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
b910: 69 66 28 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69  if( cbrk-iCellFi
b920: 72 73 74 21 3d 70 50 61 67 65 2d 3e 6e 46 72 65  rst!=pPage->nFre
b930: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
b940: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
b950: 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  KPT;.  }.  retur
b960: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
b970: 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68 65  /*.** Search the
b980: 20 66 72 65 65 2d 6c 69 73 74 20 6f 6e 20 70 61   free-list on pa
b990: 67 65 20 70 50 67 20 66 6f 72 20 73 70 61 63 65  ge pPg for space
b9a0: 20 74 6f 20 73 74 6f 72 65 20 61 20 63 65 6c 6c   to store a cell
b9b0: 20 6e 42 79 74 65 20 62 79 74 65 73 20 69 6e 0a   nByte bytes in.
b9c0: 2a 2a 20 73 69 7a 65 2e 20 49 66 20 6f 6e 65 20  ** size. If one 
b9d0: 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72 65  can be found, re
b9e0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
b9f0: 6f 20 74 68 65 20 73 70 61 63 65 20 61 6e 64 20  o the space and 
ba00: 72 65 6d 6f 76 65 20 69 74 0a 2a 2a 20 66 72 6f  remove it.** fro
ba10: 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  m the free-list.
ba20: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69  .**.** If no sui
ba30: 74 61 62 6c 65 20 73 70 61 63 65 20 63 61 6e 20  table space can 
ba40: 62 65 20 66 6f 75 6e 64 20 6f 6e 20 74 68 65 20  be found on the 
ba50: 66 72 65 65 2d 6c 69 73 74 2c 20 72 65 74 75 72  free-list, retur
ba60: 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  n NULL..**.** Th
ba70: 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
ba80: 64 65 74 65 63 74 20 63 6f 72 72 75 70 74 69 6f  detect corruptio
ba90: 6e 20 77 69 74 68 69 6e 20 70 50 67 2e 20 20 49  n within pPg.  I
baa0: 66 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 0a  f corruption is.
bab0: 2a 2a 20 64 65 74 65 63 74 65 64 20 74 68 65 6e  ** detected then
bac0: 20 2a 70 52 63 20 69 73 20 73 65 74 20 74 6f 20   *pRc is set to 
bad0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 61  SQLITE_CORRUPT a
bae0: 6e 64 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  nd NULL is retur
baf0: 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 6c 6f 74 73  ned..**.** Slots
bb00: 20 6f 6e 20 74 68 65 20 66 72 65 65 20 6c 69 73   on the free lis
bb10: 74 20 74 68 61 74 20 61 72 65 20 62 65 74 77 65  t that are betwe
bb20: 65 6e 20 31 20 61 6e 64 20 33 20 62 79 74 65 73  en 1 and 3 bytes
bb30: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 42 79   larger than nBy
bb40: 74 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 69 67  te.** will be ig
bb50: 6e 6f 72 65 64 20 69 66 20 61 64 64 69 6e 67 20  nored if adding 
bb60: 74 68 65 20 65 78 74 72 61 20 73 70 61 63 65 20  the extra space 
bb70: 74 6f 20 74 68 65 20 66 72 61 67 6d 65 6e 74 61  to the fragmenta
bb80: 74 69 6f 6e 20 63 6f 75 6e 74 0a 2a 2a 20 63 61  tion count.** ca
bb90: 75 73 65 73 20 74 68 65 20 66 72 61 67 6d 65 6e  uses the fragmen
bba0: 74 61 74 69 6f 6e 20 63 6f 75 6e 74 20 74 6f 20  tation count to 
bbb0: 65 78 63 65 65 64 20 36 30 2e 0a 2a 2f 0a 73 74  exceed 60..*/.st
bbc0: 61 74 69 63 20 75 38 20 2a 70 61 67 65 46 69 6e  atic u8 *pageFin
bbd0: 64 53 6c 6f 74 28 4d 65 6d 50 61 67 65 20 2a 70  dSlot(MemPage *p
bbe0: 50 67 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69  Pg, int nByte, i
bbf0: 6e 74 20 2a 70 52 63 29 7b 0a 20 20 63 6f 6e 73  nt *pRc){.  cons
bc00: 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 67 2d  t int hdr = pPg-
bc10: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 38  >hdrOffset;.  u8
bc20: 20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61 20 3d   * const aData =
bc30: 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20 69   pPg->aData;.  i
bc40: 6e 74 20 69 41 64 64 72 20 3d 20 68 64 72 20 2b  nt iAddr = hdr +
bc50: 20 31 3b 0a 20 20 69 6e 74 20 70 63 20 3d 20 67   1;.  int pc = g
bc60: 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 69  et2byte(&aData[i
bc70: 41 64 64 72 5d 29 3b 0a 20 20 69 6e 74 20 78 3b  Addr]);.  int x;
bc80: 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  .  int usableSiz
bc90: 65 20 3d 20 70 50 67 2d 3e 70 42 74 2d 3e 75 73  e = pPg->pBt->us
bca0: 61 62 6c 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73  ableSize;..  ass
bcb0: 65 72 74 28 20 70 63 3e 30 20 29 3b 0a 20 20 64  ert( pc>0 );.  d
bcc0: 6f 7b 0a 20 20 20 20 69 6e 74 20 73 69 7a 65 3b  o{.    int size;
bcd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
bce0: 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65 20  ize of the free 
bcf0: 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 45  slot */.    /* E
bd00: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 36  VIDENCE-OF: R-06
bd10: 38 36 36 2d 33 39 31 32 35 20 46 72 65 65 62 6c  866-39125 Freebl
bd20: 6f 63 6b 73 20 61 72 65 20 61 6c 77 61 79 73 20  ocks are always 
bd30: 63 6f 6e 6e 65 63 74 65 64 20 69 6e 20 6f 72 64  connected in ord
bd40: 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 69 6e 63  er of.    ** inc
bd50: 72 65 61 73 69 6e 67 20 6f 66 66 73 65 74 2e 20  reasing offset. 
bd60: 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3e 75 73  */.    if( pc>us
bd70: 61 62 6c 65 53 69 7a 65 2d 34 20 7c 7c 20 70 63  ableSize-4 || pc
bd80: 3c 69 41 64 64 72 2b 34 20 29 7b 0a 20 20 20 20  <iAddr+4 ){.    
bd90: 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f    *pRc = SQLITE_
bda0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
bdb0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
bdc0: 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45    }.    /* EVIDE
bdd0: 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 37 31 30 2d  NCE-OF: R-22710-
bde0: 35 33 33 32 38 20 54 68 65 20 74 68 69 72 64 20  53328 The third 
bdf0: 61 6e 64 20 66 6f 75 72 74 68 20 62 79 74 65 73  and fourth bytes
be00: 20 6f 66 20 65 61 63 68 0a 20 20 20 20 2a 2a 20   of each.    ** 
be10: 66 72 65 65 62 6c 6f 63 6b 20 66 6f 72 6d 20 61  freeblock form a
be20: 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
be30: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
be40: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65   size of the fre
be50: 65 62 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 69 6e  eblock.    ** in
be60: 20 62 79 74 65 73 2c 20 69 6e 63 6c 75 64 69 6e   bytes, includin
be70: 67 20 74 68 65 20 34 2d 62 79 74 65 20 68 65 61  g the 4-byte hea
be80: 64 65 72 2e 20 2a 2f 0a 20 20 20 20 73 69 7a 65  der. */.    size
be90: 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44 61   = get2byte(&aDa
bea0: 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 69  ta[pc+2]);.    i
beb0: 66 28 20 28 78 20 3d 20 73 69 7a 65 20 2d 20 6e  f( (x = size - n
bec0: 42 79 74 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20  Byte)>=0 ){.    
bed0: 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 34    testcase( x==4
bee0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
bef0: 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20 20 20  se( x==3 );.    
bf00: 20 20 69 66 28 20 70 63 20 3c 20 70 50 67 2d 3e    if( pc < pPg->
bf10: 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 70 50 67  cellOffset+2*pPg
bf20: 2d 3e 6e 43 65 6c 6c 20 7c 7c 20 73 69 7a 65 2b  ->nCell || size+
bf30: 70 63 20 3e 20 75 73 61 62 6c 65 53 69 7a 65 20  pc > usableSize 
bf40: 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 63 20  ){.        *pRc 
bf50: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
bf60: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 72  _BKPT;.        r
bf70: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
bf80: 65 6c 73 65 20 69 66 28 20 78 3c 34 20 29 7b 0a  else if( x<4 ){.
bf90: 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45          /* EVIDE
bfa0: 4e 43 45 2d 4f 46 3a 20 52 2d 31 31 34 39 38 2d  NCE-OF: R-11498-
bfb0: 35 38 30 32 32 20 49 6e 20 61 20 77 65 6c 6c 2d  58022 In a well-
bfc0: 66 6f 72 6d 65 64 20 62 2d 74 72 65 65 20 70 61  formed b-tree pa
bfd0: 67 65 2c 20 74 68 65 20 74 6f 74 61 6c 0a 20 20  ge, the total.  
bfe0: 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20        ** number 
bff0: 6f 66 20 62 79 74 65 73 20 69 6e 20 66 72 61 67  of bytes in frag
c000: 6d 65 6e 74 73 20 6d 61 79 20 6e 6f 74 20 65 78  ments may not ex
c010: 63 65 65 64 20 36 30 2e 20 2a 2f 0a 20 20 20 20  ceed 60. */.    
c020: 20 20 20 20 69 66 28 20 61 44 61 74 61 5b 68 64      if( aData[hd
c030: 72 2b 37 5d 3e 35 37 20 29 20 72 65 74 75 72 6e  r+7]>57 ) return
c040: 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   0;..        /* 
c050: 52 65 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74 20  Remove the slot 
c060: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69  from the free-li
c070: 73 74 2e 20 55 70 64 61 74 65 20 74 68 65 20 6e  st. Update the n
c080: 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 20 20  umber of.       
c090: 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65 64 20 62   ** fragmented b
c0a0: 79 74 65 73 20 77 69 74 68 69 6e 20 74 68 65 20  ytes within the 
c0b0: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  page. */.       
c0c0: 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b 69   memcpy(&aData[i
c0d0: 41 64 64 72 5d 2c 20 26 61 44 61 74 61 5b 70 63  Addr], &aData[pc
c0e0: 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 61  ], 2);.        a
c0f0: 44 61 74 61 5b 68 64 72 2b 37 5d 20 2b 3d 20 28  Data[hdr+7] += (
c100: 75 38 29 78 3b 0a 20 20 20 20 20 20 7d 65 6c 73  u8)x;.      }els
c110: 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e{.        /* Th
c120: 65 20 73 6c 6f 74 20 72 65 6d 61 69 6e 73 20 6f  e slot remains o
c130: 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  n the free-list.
c140: 20 52 65 64 75 63 65 20 69 74 73 20 73 69 7a 65   Reduce its size
c150: 20 74 6f 20 61 63 63 6f 75 6e 74 0a 20 20 20 20   to account.    
c160: 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20       ** for the 
c170: 70 6f 72 74 69 6f 6e 20 75 73 65 64 20 62 79 20  portion used by 
c180: 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69  the new allocati
c190: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  on. */.        p
c1a0: 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 70  ut2byte(&aData[p
c1b0: 63 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20  c+2], x);.      
c1c0: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26  }.      return &
c1d0: 61 44 61 74 61 5b 70 63 20 2b 20 78 5d 3b 0a 20  aData[pc + x];. 
c1e0: 20 20 20 7d 0a 20 20 20 20 69 41 64 64 72 20 3d     }.    iAddr =
c1f0: 20 70 63 3b 0a 20 20 20 20 70 63 20 3d 20 67 65   pc;.    pc = ge
c200: 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 70 63  t2byte(&aData[pc
c210: 5d 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 70 63  ]);.  }while( pc
c220: 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b   );..  return 0;
c230: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
c240: 74 65 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f  te nByte bytes o
c250: 66 20 73 70 61 63 65 20 66 72 6f 6d 20 77 69 74  f space from wit
c260: 68 69 6e 20 74 68 65 20 42 2d 54 72 65 65 20 70  hin the B-Tree p
c270: 61 67 65 20 70 61 73 73 65 64 0a 2a 2a 20 61 73  age passed.** as
c280: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
c290: 65 6e 74 2e 20 57 72 69 74 65 20 69 6e 74 6f 20  ent. Write into 
c2a0: 2a 70 49 64 78 20 74 68 65 20 69 6e 64 65 78 20  *pIdx the index 
c2b0: 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74  into pPage->aDat
c2c0: 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69  a[].** of the fi
c2d0: 72 73 74 20 62 79 74 65 20 6f 66 20 61 6c 6c 6f  rst byte of allo
c2e0: 63 61 74 65 64 20 73 70 61 63 65 2e 20 52 65 74  cated space. Ret
c2f0: 75 72 6e 20 65 69 74 68 65 72 20 53 51 4c 49 54  urn either SQLIT
c300: 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65 72  E_OK or.** an er
c310: 72 6f 72 20 63 6f 64 65 20 28 75 73 75 61 6c 6c  ror code (usuall
c320: 79 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  y SQLITE_CORRUPT
c330: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  )..**.** The cal
c340: 6c 65 72 20 67 75 61 72 61 6e 74 65 65 73 20 74  ler guarantees t
c350: 68 61 74 20 74 68 65 72 65 20 69 73 20 73 75 66  hat there is suf
c360: 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 74 6f  ficient space to
c370: 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 61 6c 6c   make the.** all
c380: 6f 63 61 74 69 6f 6e 2e 20 20 54 68 69 73 20 72  ocation.  This r
c390: 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 6e 65 65  outine might nee
c3a0: 64 20 74 6f 20 64 65 66 72 61 67 6d 65 6e 74 20  d to defragment 
c3b0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 69 6e  in order to brin
c3c0: 67 0a 2a 2a 20 61 6c 6c 20 74 68 65 20 73 70 61  g.** all the spa
c3d0: 63 65 20 74 6f 67 65 74 68 65 72 2c 20 68 6f 77  ce together, how
c3e0: 65 76 65 72 2e 20 20 54 68 69 73 20 72 6f 75 74  ever.  This rout
c3f0: 69 6e 65 20 77 69 6c 6c 20 61 76 6f 69 64 20 75  ine will avoid u
c400: 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 72 73  sing.** the firs
c410: 74 20 74 77 6f 20 62 79 74 65 73 20 70 61 73 74  t two bytes past
c420: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
c430: 72 20 61 72 65 61 20 73 69 6e 63 65 20 70 72 65  r area since pre
c440: 73 75 6d 61 62 6c 79 20 74 68 69 73 0a 2a 2a 20  sumably this.** 
c450: 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 62 65  allocation is be
c460: 69 6e 67 20 6d 61 64 65 20 69 6e 20 6f 72 64 65  ing made in orde
c470: 72 20 74 6f 20 69 6e 73 65 72 74 20 61 20 6e 65  r to insert a ne
c480: 77 20 63 65 6c 6c 2c 20 73 6f 20 77 65 20 77 69  w cell, so we wi
c490: 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65 6e 64 20 75  ll.** also end u
c4a0: 70 20 6e 65 65 64 69 6e 67 20 61 20 6e 65 77 20  p needing a new 
c4b0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  cell pointer..*/
c4c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
c4d0: 63 61 74 65 53 70 61 63 65 28 4d 65 6d 50 61 67  cateSpace(MemPag
c4e0: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e 42  e *pPage, int nB
c4f0: 79 74 65 2c 20 69 6e 74 20 2a 70 49 64 78 29 7b  yte, int *pIdx){
c500: 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72  .  const int hdr
c510: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
c520: 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  set;    /* Local
c530: 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d   cache of pPage-
c540: 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f 0a 20 20  >hdrOffset */.  
c550: 75 38 20 2a 20 63 6f 6e 73 74 20 64 61 74 61 20  u8 * const data 
c560: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20  = pPage->aData; 
c570: 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61       /* Local ca
c580: 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 61 44  che of pPage->aD
c590: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70  ata */.  int top
c5a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c5c0: 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 63   First byte of c
c5d0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
c5e0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
c5f0: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
c600: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
c610: 74 65 67 65 72 20 72 65 74 75 72 6e 20 63 6f 64  teger return cod
c620: 65 20 2a 2f 0a 20 20 69 6e 74 20 67 61 70 3b 20  e */.  int gap; 
c630: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
c640: 62 79 74 65 20 6f 66 20 67 61 70 20 62 65 74 77  byte of gap betw
c650: 65 65 6e 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  een cell pointer
c660: 73 20 61 6e 64 20 63 65 6c 6c 20 63 6f 6e 74 65  s and cell conte
c670: 6e 74 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72  nt */.  .  asser
c680: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
c690: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
c6a0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
c6b0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
c6c0: 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Bt );.  assert( 
c6d0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
c6e0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
c6f0: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
c700: 74 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20  t( nByte>=0 );  
c710: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20  /* Minimum cell 
c720: 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61  size is 4 */.  a
c730: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46  ssert( pPage->nF
c740: 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20  ree>=nByte );.  
c750: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
c760: 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20  Overflow==0 );. 
c770: 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 20 3c   assert( nByte <
c780: 20 28 69 6e 74 29 28 70 50 61 67 65 2d 3e 70 42   (int)(pPage->pB
c790: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 38 29  t->usableSize-8)
c7a0: 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
c7b0: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
c7c0: 20 3d 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34   == hdr + 12 - 4
c7d0: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a  *pPage->leaf );.
c7e0: 20 20 67 61 70 20 3d 20 70 50 61 67 65 2d 3e 63    gap = pPage->c
c7f0: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50  ellOffset + 2*pP
c800: 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73  age->nCell;.  as
c810: 73 65 72 74 28 20 67 61 70 3c 3d 36 35 35 33 36  sert( gap<=65536
c820: 20 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43   );.  /* EVIDENC
c830: 45 2d 4f 46 3a 20 52 2d 32 39 33 35 36 2d 30 32  E-OF: R-29356-02
c840: 33 39 31 20 49 66 20 74 68 65 20 64 61 74 61 62  391 If the datab
c850: 61 73 65 20 75 73 65 73 20 61 20 36 35 35 33 36  ase uses a 65536
c860: 2d 62 79 74 65 20 70 61 67 65 20 73 69 7a 65 0a  -byte page size.
c870: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 73    ** and the res
c880: 65 72 76 65 64 20 73 70 61 63 65 20 69 73 20 7a  erved space is z
c890: 65 72 6f 20 28 74 68 65 20 75 73 75 61 6c 20 76  ero (the usual v
c8a0: 61 6c 75 65 20 66 6f 72 20 72 65 73 65 72 76 65  alue for reserve
c8b0: 64 20 73 70 61 63 65 29 0a 20 20 2a 2a 20 74 68  d space).  ** th
c8c0: 65 6e 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  en the cell cont
c8d0: 65 6e 74 20 6f 66 66 73 65 74 20 6f 66 20 61 6e  ent offset of an
c8e0: 20 65 6d 70 74 79 20 70 61 67 65 20 77 61 6e 74   empty page want
c8f0: 73 20 74 6f 20 62 65 20 36 35 35 33 36 2e 0a 20  s to be 65536.. 
c900: 20 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74 68 61   ** However, tha
c910: 74 20 69 6e 74 65 67 65 72 20 69 73 20 74 6f 6f  t integer is too
c920: 20 6c 61 72 67 65 20 74 6f 20 62 65 20 73 74 6f   large to be sto
c930: 72 65 64 20 69 6e 20 61 20 32 2d 62 79 74 65 20  red in a 2-byte 
c940: 75 6e 73 69 67 6e 65 64 0a 20 20 2a 2a 20 69 6e  unsigned.  ** in
c950: 74 65 67 65 72 2c 20 73 6f 20 61 20 76 61 6c 75  teger, so a valu
c960: 65 20 6f 66 20 30 20 69 73 20 75 73 65 64 20 69  e of 0 is used i
c970: 6e 20 69 74 73 20 70 6c 61 63 65 2e 20 2a 2f 0a  n its place. */.
c980: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
c990: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
c9a0: 20 20 61 73 73 65 72 74 28 20 74 6f 70 3c 3d 28    assert( top<=(
c9b0: 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e  int)pPage->pBt->
c9c0: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 20 2f 2a  usableSize ); /*
c9d0: 20 50 72 65 76 65 6e 74 20 62 79 20 67 65 74 41   Prevent by getA
c9e0: 6e 64 49 6e 69 74 50 61 67 65 28 29 20 2a 2f 0a  ndInitPage() */.
c9f0: 20 20 69 66 28 20 67 61 70 3e 74 6f 70 20 29 7b    if( gap>top ){
ca00: 0a 20 20 20 20 69 66 28 20 74 6f 70 3d 3d 30 20  .    if( top==0 
ca10: 26 26 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  && pPage->pBt->u
ca20: 73 61 62 6c 65 53 69 7a 65 3d 3d 36 35 35 33 36  sableSize==65536
ca30: 20 29 7b 0a 20 20 20 20 20 20 74 6f 70 20 3d 20   ){.      top = 
ca40: 36 35 35 33 36 3b 0a 20 20 20 20 7d 65 6c 73 65  65536;.    }else
ca50: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
ca60: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
ca70: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  PT;.    }.  }.. 
ca80: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
ca90: 65 6e 6f 75 67 68 20 73 70 61 63 65 20 62 65 74  enough space bet
caa0: 77 65 65 6e 20 67 61 70 20 61 6e 64 20 74 6f 70  ween gap and top
cab0: 20 66 6f 72 20 6f 6e 65 20 6d 6f 72 65 20 63 65   for one more ce
cac0: 6c 6c 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20  ll pointer.  ** 
cad0: 61 72 72 61 79 20 65 6e 74 72 79 20 6f 66 66 73  array entry offs
cae0: 65 74 2c 20 61 6e 64 20 69 66 20 74 68 65 20 66  et, and if the f
caf0: 72 65 65 6c 69 73 74 20 69 73 20 6e 6f 74 20 65  reelist is not e
cb00: 6d 70 74 79 2c 20 74 68 65 6e 20 73 65 61 72 63  mpty, then searc
cb10: 68 20 74 68 65 0a 20 20 2a 2a 20 66 72 65 65 6c  h the.  ** freel
cb20: 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ist looking for 
cb30: 61 20 66 72 65 65 20 73 6c 6f 74 20 62 69 67 20  a free slot big 
cb40: 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66  enough to satisf
cb50: 79 20 74 68 65 20 72 65 71 75 65 73 74 2e 0a 20  y the request.. 
cb60: 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
cb70: 67 61 70 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20 20  gap+2==top );.  
cb80: 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 31 3d  testcase( gap+1=
cb90: 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61  =top );.  testca
cba0: 73 65 28 20 67 61 70 3d 3d 74 6f 70 20 29 3b 0a  se( gap==top );.
cbb0: 20 20 69 66 28 20 28 64 61 74 61 5b 68 64 72 2b    if( (data[hdr+
cbc0: 32 5d 20 7c 7c 20 64 61 74 61 5b 68 64 72 2b 31  2] || data[hdr+1
cbd0: 5d 29 20 26 26 20 67 61 70 2b 32 3c 3d 74 6f 70  ]) && gap+2<=top
cbe0: 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 53 70 61   ){.    u8 *pSpa
cbf0: 63 65 20 3d 20 70 61 67 65 46 69 6e 64 53 6c 6f  ce = pageFindSlo
cc00: 74 28 70 50 61 67 65 2c 20 6e 42 79 74 65 2c 20  t(pPage, nByte, 
cc10: 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 70 53  &rc);.    if( pS
cc20: 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 61 73  pace ){.      as
cc30: 73 65 72 74 28 20 70 53 70 61 63 65 3e 3d 64 61  sert( pSpace>=da
cc40: 74 61 20 26 26 20 28 70 53 70 61 63 65 20 2d 20  ta && (pSpace - 
cc50: 64 61 74 61 29 3c 36 35 35 33 36 20 29 3b 0a 20  data)<65536 );. 
cc60: 20 20 20 20 20 2a 70 49 64 78 20 3d 20 28 69 6e       *pIdx = (in
cc70: 74 29 28 70 53 70 61 63 65 20 2d 20 64 61 74 61  t)(pSpace - data
cc80: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
cc90: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
cca0: 65 6c 73 65 20 69 66 28 20 72 63 20 29 7b 0a 20  else if( rc ){. 
ccb0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
ccc0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
ccd0: 54 68 65 20 72 65 71 75 65 73 74 20 63 6f 75 6c  The request coul
cce0: 64 20 6e 6f 74 20 62 65 20 66 75 6c 66 69 6c 6c  d not be fulfill
ccf0: 65 64 20 75 73 69 6e 67 20 61 20 66 72 65 65 6c  ed using a freel
cd00: 69 73 74 20 73 6c 6f 74 2e 20 20 43 68 65 63 6b  ist slot.  Check
cd10: 0a 20 20 2a 2a 20 74 6f 20 73 65 65 20 69 66 20  .  ** to see if 
cd20: 64 65 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20  defragmentation 
cd30: 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  is necessary..  
cd40: 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  */.  testcase( g
cd50: 61 70 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f 70 20  ap+2+nByte==top 
cd60: 29 3b 0a 20 20 69 66 28 20 67 61 70 2b 32 2b 6e  );.  if( gap+2+n
cd70: 42 79 74 65 3e 74 6f 70 20 29 7b 0a 20 20 20 20  Byte>top ){.    
cd80: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
cd90: 43 65 6c 6c 3e 30 20 7c 7c 20 43 4f 52 52 55 50  Cell>0 || CORRUP
cda0: 54 5f 44 42 20 29 3b 0a 20 20 20 20 72 63 20 3d  T_DB );.    rc =
cdb0: 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28   defragmentPage(
cdc0: 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  pPage);.    if( 
cdd0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
cde0: 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
cdf0: 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b  teNotZero(&data[
ce00: 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 61 73 73  hdr+5]);.    ass
ce10: 65 72 74 28 20 67 61 70 2b 6e 42 79 74 65 3c 3d  ert( gap+nByte<=
ce20: 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f  top );.  }...  /
ce30: 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  * Allocate memor
ce40: 79 20 66 72 6f 6d 20 74 68 65 20 67 61 70 20 69  y from the gap i
ce50: 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 65  n between the ce
ce60: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll pointer array
ce70: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 63 65  .  ** and the ce
ce80: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e  ll content area.
ce90: 20 20 54 68 65 20 62 74 72 65 65 49 6e 69 74 50    The btreeInitP
cea0: 61 67 65 28 29 20 63 61 6c 6c 20 68 61 73 20 61  age() call has a
ceb0: 6c 72 65 61 64 79 0a 20 20 2a 2a 20 76 61 6c 69  lready.  ** vali
cec0: 64 61 74 65 64 20 74 68 65 20 66 72 65 65 6c 69  dated the freeli
ced0: 73 74 2e 20 20 47 69 76 65 6e 20 74 68 61 74 20  st.  Given that 
cee0: 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20  the freelist is 
cef0: 76 61 6c 69 64 2c 20 74 68 65 72 65 0a 20 20 2a  valid, there.  *
cf00: 2a 20 69 73 20 6e 6f 20 77 61 79 20 74 68 61 74  * is no way that
cf10: 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   the allocation 
cf20: 63 61 6e 20 65 78 74 65 6e 64 20 6f 66 66 20 74  can extend off t
cf30: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  he end of the pa
cf40: 67 65 2e 0a 20 20 2a 2a 20 54 68 65 20 61 73 73  ge..  ** The ass
cf50: 65 72 74 28 29 20 62 65 6c 6f 77 20 76 65 72 69  ert() below veri
cf60: 66 69 65 73 20 74 68 65 20 70 72 65 76 69 6f 75  fies the previou
cf70: 73 20 73 65 6e 74 65 6e 63 65 2e 0a 20 20 2a 2f  s sentence..  */
cf80: 0a 20 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b  .  top -= nByte;
cf90: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
cfa0: 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a  a[hdr+5], top);.
cfb0: 20 20 61 73 73 65 72 74 28 20 74 6f 70 2b 6e 42    assert( top+nB
cfc0: 79 74 65 20 3c 3d 20 28 69 6e 74 29 70 50 61 67  yte <= (int)pPag
cfd0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
cfe0: 7a 65 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20  ze );.  *pIdx = 
cff0: 74 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  top;.  return SQ
d000: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
d010: 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63 74 69  * Return a secti
d020: 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67 65 2d  on of the pPage-
d030: 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20 66 72  >aData to the fr
d040: 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66  eelist..** The f
d050: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
d060: 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63 6b 20   new free block 
d070: 69 73 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  is pPage->aData[
d080: 69 53 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74  iStart].** and t
d090: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62  he size of the b
d0a0: 6c 6f 63 6b 20 69 73 20 69 53 69 7a 65 20 62 79  lock is iSize by
d0b0: 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 64 6a 61 63  tes..**.** Adjac
d0c0: 65 6e 74 20 66 72 65 65 62 6c 6f 63 6b 73 20 61  ent freeblocks a
d0d0: 72 65 20 63 6f 61 6c 65 73 63 65 64 2e 0a 2a 2a  re coalesced..**
d0e0: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 65 76  .** Note that ev
d0f0: 65 6e 20 74 68 6f 75 67 68 20 74 68 65 20 66 72  en though the fr
d100: 65 65 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73  eeblock list was
d110: 20 63 68 65 63 6b 65 64 20 62 79 20 62 74 72 65   checked by btre
d120: 65 49 6e 69 74 50 61 67 65 28 29 2c 0a 2a 2a 20  eInitPage(),.** 
d130: 74 68 61 74 20 72 6f 75 74 69 6e 65 20 77 69 6c  that routine wil
d140: 6c 20 6e 6f 74 20 64 65 74 65 63 74 20 6f 76 65  l not detect ove
d150: 72 6c 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c  rlap between cel
d160: 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73  ls or freeblocks
d170: 2e 20 20 4e 6f 72 0a 2a 2a 20 64 6f 65 73 20 69  .  Nor.** does i
d180: 74 20 64 65 74 65 63 74 20 63 65 6c 6c 73 20 6f  t detect cells o
d190: 72 20 66 72 65 65 62 6c 6f 63 6b 73 20 74 68 61  r freeblocks tha
d1a0: 74 20 65 6e 63 72 6f 75 63 68 20 69 6e 74 6f 20  t encrouch into 
d1b0: 74 68 65 20 72 65 73 65 72 76 65 64 20 62 79 74  the reserved byt
d1c0: 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64  es.** at the end
d1d0: 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 20 53   of the page.  S
d1e0: 6f 20 64 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20  o do additional 
d1f0: 63 6f 72 72 75 70 74 69 6f 6e 20 63 68 65 63 6b  corruption check
d200: 73 20 69 6e 73 69 64 65 20 74 68 69 73 0a 2a 2a  s inside this.**
d210: 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 72 65 74   routine and ret
d220: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
d230: 50 54 20 69 66 20 61 6e 79 20 70 72 6f 62 6c 65  PT if any proble
d240: 6d 73 20 61 72 65 20 66 6f 75 6e 64 2e 0a 2a 2f  ms are found..*/
d250: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65  .static int free
d260: 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70  Space(MemPage *p
d270: 50 61 67 65 2c 20 75 31 36 20 69 53 74 61 72 74  Page, u16 iStart
d280: 2c 20 75 31 36 20 69 53 69 7a 65 29 7b 0a 20 20  , u16 iSize){.  
d290: 75 31 36 20 69 50 74 72 3b 20 20 20 20 20 20 20  u16 iPtr;       
d2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2b0: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
d2c0: 20 6f 66 20 70 74 72 20 74 6f 20 6e 65 78 74 20   of ptr to next 
d2d0: 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75  freeblock */.  u
d2e0: 31 36 20 69 46 72 65 65 42 6c 6b 3b 20 20 20 20  16 iFreeBlk;    
d2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d300: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
d310: 6f 66 20 74 68 65 20 6e 65 78 74 20 66 72 65 65  of the next free
d320: 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 38 20 68 64  block */.  u8 hd
d330: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
d340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d350: 20 2f 2a 20 50 61 67 65 20 68 65 61 64 65 72 20   /* Page header 
d360: 73 69 7a 65 2e 20 20 30 20 6f 72 20 31 30 30 20  size.  0 or 100 
d370: 2a 2f 0a 20 20 75 38 20 6e 46 72 61 67 20 3d 20  */.  u8 nFrag = 
d380: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
d390: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
d3a0: 64 75 63 74 69 6f 6e 20 69 6e 20 66 72 61 67 6d  duction in fragm
d3b0: 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 31  entation */.  u1
d3c0: 36 20 69 4f 72 69 67 53 69 7a 65 20 3d 20 69 53  6 iOrigSize = iS
d3d0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
d3e0: 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
d3f0: 76 61 6c 75 65 20 6f 66 20 69 53 69 7a 65 20 2a  value of iSize *
d400: 2f 0a 20 20 75 33 32 20 69 4c 61 73 74 20 3d 20  /.  u32 iLast = 
d410: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
d420: 6c 65 53 69 7a 65 2d 34 3b 20 2f 2a 20 4c 61 72  leSize-4; /* Lar
d430: 67 65 73 74 20 70 6f 73 73 69 62 6c 65 20 66 72  gest possible fr
d440: 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a  eeblock offset *
d450: 2f 0a 20 20 75 33 32 20 69 45 6e 64 20 3d 20 69  /.  u32 iEnd = i
d460: 53 74 61 72 74 20 2b 20 69 53 69 7a 65 3b 20 20  Start + iSize;  
d470: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
d480: 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65  st byte past the
d490: 20 69 53 74 61 72 74 20 62 75 66 66 65 72 20 2a   iStart buffer *
d4a0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
d4b0: 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d  r *data = pPage-
d4c0: 3e 61 44 61 74 61 3b 20 20 20 2f 2a 20 50 61 67  >aData;   /* Pag
d4d0: 65 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20  e content */..  
d4e0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
d4f0: 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
d500: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
d510: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
d520: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
d530: 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
d540: 44 42 20 7c 7c 20 69 53 74 61 72 74 3e 3d 70 50  DB || iStart>=pP
d550: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36  age->hdrOffset+6
d560: 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72  +pPage->childPtr
d570: 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Size );.  assert
d580: 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
d590: 69 45 6e 64 20 3c 3d 20 70 50 61 67 65 2d 3e 70  iEnd <= pPage->p
d5a0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
d5b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
d5c0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
d5d0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
d5e0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ) );.  assert( i
d5f0: 53 69 7a 65 3e 3d 34 20 29 3b 20 20 20 2f 2a 20  Size>=4 );   /* 
d600: 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a  Minimum cell siz
d610: 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65  e is 4 */.  asse
d620: 72 74 28 20 69 53 74 61 72 74 3c 3d 69 4c 61 73  rt( iStart<=iLas
d630: 74 20 29 3b 0a 0a 20 20 2f 2a 20 4f 76 65 72 77  t );..  /* Overw
d640: 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66  rite deleted inf
d650: 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65  ormation with ze
d660: 72 6f 73 20 77 68 65 6e 20 74 68 65 20 73 65 63  ros when the sec
d670: 75 72 65 5f 64 65 6c 65 74 65 0a 20 20 2a 2a 20  ure_delete.  ** 
d680: 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  option is enable
d690: 64 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65  d */.  if( pPage
d6a0: 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ->pBt->btsFlags 
d6b0: 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  & BTS_SECURE_DEL
d6c0: 45 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  ETE ){.    memse
d6d0: 74 28 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c  t(&data[iStart],
d6e0: 20 30 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a   0, iSize);.  }.
d6f0: 0a 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 6f  .  /* The list o
d700: 66 20 66 72 65 65 62 6c 6f 63 6b 73 20 6d 75 73  f freeblocks mus
d710: 74 20 62 65 20 69 6e 20 61 73 63 65 6e 64 69 6e  t be in ascendin
d720: 67 20 6f 72 64 65 72 2e 20 20 46 69 6e 64 20 74  g order.  Find t
d730: 68 65 20 0a 20 20 2a 2a 20 73 70 6f 74 20 6f 6e  he .  ** spot on
d740: 20 74 68 65 20 6c 69 73 74 20 77 68 65 72 65 20   the list where 
d750: 69 53 74 61 72 74 20 73 68 6f 75 6c 64 20 62 65  iStart should be
d760: 20 69 6e 73 65 72 74 65 64 2e 0a 20 20 2a 2f 0a   inserted..  */.
d770: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
d780: 64 72 4f 66 66 73 65 74 3b 0a 20 20 69 50 74 72  drOffset;.  iPtr
d790: 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69 66   = hdr + 1;.  if
d7a0: 28 20 64 61 74 61 5b 69 50 74 72 2b 31 5d 3d 3d  ( data[iPtr+1]==
d7b0: 30 20 26 26 20 64 61 74 61 5b 69 50 74 72 5d 3d  0 && data[iPtr]=
d7c0: 3d 30 20 29 7b 0a 20 20 20 20 69 46 72 65 65 42  =0 ){.    iFreeB
d7d0: 6c 6b 20 3d 20 30 3b 20 20 2f 2a 20 53 68 6f 72  lk = 0;  /* Shor
d7e0: 74 63 75 74 20 66 6f 72 20 74 68 65 20 63 61 73  tcut for the cas
d7f0: 65 20 77 68 65 6e 20 74 68 65 20 66 72 65 65 6c  e when the freel
d800: 69 73 74 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a  ist is empty */.
d810: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69    }else{.    whi
d820: 6c 65 28 20 28 69 46 72 65 65 42 6c 6b 20 3d 20  le( (iFreeBlk = 
d830: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
d840: 50 74 72 5d 29 29 3c 69 53 74 61 72 74 20 29 7b  Ptr]))<iStart ){
d850: 0a 20 20 20 20 20 20 69 66 28 20 69 46 72 65 65  .      if( iFree
d860: 42 6c 6b 3c 69 50 74 72 2b 34 20 29 7b 0a 20 20  Blk<iPtr+4 ){.  
d870: 20 20 20 20 20 20 69 66 28 20 69 46 72 65 65 42        if( iFreeB
d880: 6c 6b 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  lk==0 ) break;. 
d890: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
d8a0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
d8b0: 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  T;.      }.     
d8c0: 20 69 50 74 72 20 3d 20 69 46 72 65 65 42 6c 6b   iPtr = iFreeBlk
d8d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
d8e0: 69 46 72 65 65 42 6c 6b 3e 69 4c 61 73 74 20 29  iFreeBlk>iLast )
d8f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
d900: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
d910: 20 61 73 73 65 72 74 28 20 69 46 72 65 65 42 6c   assert( iFreeBl
d920: 6b 3e 69 50 74 72 20 7c 7c 20 69 46 72 65 65 42  k>iPtr || iFreeB
d930: 6c 6b 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 20 20  lk==0 );.  .    
d940: 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
d950: 3a 0a 20 20 20 20 2a 2a 20 20 20 20 69 46 72 65  :.    **    iFre
d960: 65 42 6c 6b 3a 20 20 20 46 69 72 73 74 20 66 72  eBlk:   First fr
d970: 65 65 62 6c 6f 63 6b 20 61 66 74 65 72 20 69 53  eeblock after iS
d980: 74 61 72 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66  tart, or zero if
d990: 20 6e 6f 6e 65 0a 20 20 20 20 2a 2a 20 20 20 20   none.    **    
d9a0: 69 50 74 72 3a 20 20 20 20 20 20 20 54 68 65 20  iPtr:       The 
d9b0: 61 64 64 72 65 73 73 20 6f 66 20 61 20 70 6f 69  address of a poi
d9c0: 6e 74 65 72 20 74 6f 20 69 46 72 65 65 42 6c 6b  nter to iFreeBlk
d9d0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43  .    **.    ** C
d9e0: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69  heck to see if i
d9f0: 46 72 65 65 42 6c 6b 20 73 68 6f 75 6c 64 20 62  FreeBlk should b
da00: 65 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f  e coalesced onto
da10: 20 74 68 65 20 65 6e 64 20 6f 66 20 69 53 74 61   the end of iSta
da20: 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  rt..    */.    i
da30: 66 28 20 69 46 72 65 65 42 6c 6b 20 26 26 20 69  f( iFreeBlk && i
da40: 45 6e 64 2b 33 3e 3d 69 46 72 65 65 42 6c 6b 20  End+3>=iFreeBlk 
da50: 29 7b 0a 20 20 20 20 20 20 6e 46 72 61 67 20 3d  ){.      nFrag =
da60: 20 69 46 72 65 65 42 6c 6b 20 2d 20 69 45 6e 64   iFreeBlk - iEnd
da70: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45 6e 64  ;.      if( iEnd
da80: 3e 69 46 72 65 65 42 6c 6b 20 29 20 72 65 74 75  >iFreeBlk ) retu
da90: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
daa0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 69 45  T_BKPT;.      iE
dab0: 6e 64 20 3d 20 69 46 72 65 65 42 6c 6b 20 2b 20  nd = iFreeBlk + 
dac0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
dad0: 46 72 65 65 42 6c 6b 2b 32 5d 29 3b 0a 20 20 20  FreeBlk+2]);.   
dae0: 20 20 20 69 66 28 20 69 45 6e 64 20 3e 20 70 50     if( iEnd > pP
daf0: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
db00: 53 69 7a 65 20 29 20 72 65 74 75 72 6e 20 53 51  Size ) return SQ
db10: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
db20: 54 3b 0a 20 20 20 20 20 20 69 53 69 7a 65 20 3d  T;.      iSize =
db30: 20 69 45 6e 64 20 2d 20 69 53 74 61 72 74 3b 0a   iEnd - iStart;.
db40: 20 20 20 20 20 20 69 46 72 65 65 42 6c 6b 20 3d        iFreeBlk =
db50: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
db60: 69 46 72 65 65 42 6c 6b 5d 29 3b 0a 20 20 20 20  iFreeBlk]);.    
db70: 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 69  }.  .    /* If i
db80: 50 74 72 20 69 73 20 61 6e 6f 74 68 65 72 20 66  Ptr is another f
db90: 72 65 65 62 6c 6f 63 6b 20 28 74 68 61 74 20 69  reeblock (that i
dba0: 73 2c 20 69 66 20 69 50 74 72 20 69 73 20 6e 6f  s, if iPtr is no
dbb0: 74 20 74 68 65 20 66 72 65 65 6c 69 73 74 0a 20  t the freelist. 
dbc0: 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 69 6e     ** pointer in
dbd0: 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72   the page header
dbe0: 29 20 74 68 65 6e 20 63 68 65 63 6b 20 74 6f 20  ) then check to 
dbf0: 73 65 65 20 69 66 20 69 53 74 61 72 74 20 73 68  see if iStart sh
dc00: 6f 75 6c 64 20 62 65 0a 20 20 20 20 2a 2a 20 63  ould be.    ** c
dc10: 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f 20 74 68  oalesced onto th
dc20: 65 20 65 6e 64 20 6f 66 20 69 50 74 72 2e 0a 20  e end of iPtr.. 
dc30: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50     */.    if( iP
dc40: 74 72 3e 68 64 72 2b 31 20 29 7b 0a 20 20 20 20  tr>hdr+1 ){.    
dc50: 20 20 69 6e 74 20 69 50 74 72 45 6e 64 20 3d 20    int iPtrEnd = 
dc60: 69 50 74 72 20 2b 20 67 65 74 32 62 79 74 65 28  iPtr + get2byte(
dc70: 26 64 61 74 61 5b 69 50 74 72 2b 32 5d 29 3b 0a  &data[iPtr+2]);.
dc80: 20 20 20 20 20 20 69 66 28 20 69 50 74 72 45 6e        if( iPtrEn
dc90: 64 2b 33 3e 3d 69 53 74 61 72 74 20 29 7b 0a 20  d+3>=iStart ){. 
dca0: 20 20 20 20 20 20 20 69 66 28 20 69 50 74 72 45         if( iPtrE
dcb0: 6e 64 3e 69 53 74 61 72 74 20 29 20 72 65 74 75  nd>iStart ) retu
dcc0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
dcd0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
dce0: 6e 46 72 61 67 20 2b 3d 20 69 53 74 61 72 74 20  nFrag += iStart 
dcf0: 2d 20 69 50 74 72 45 6e 64 3b 0a 20 20 20 20 20  - iPtrEnd;.     
dd00: 20 20 20 69 53 69 7a 65 20 3d 20 69 45 6e 64 20     iSize = iEnd 
dd10: 2d 20 69 50 74 72 3b 0a 20 20 20 20 20 20 20 20  - iPtr;.        
dd20: 69 53 74 61 72 74 20 3d 20 69 50 74 72 3b 0a 20  iStart = iPtr;. 
dd30: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
dd40: 20 69 66 28 20 6e 46 72 61 67 3e 64 61 74 61 5b   if( nFrag>data[
dd50: 68 64 72 2b 37 5d 20 29 20 72 65 74 75 72 6e 20  hdr+7] ) return 
dd60: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
dd70: 4b 50 54 3b 0a 20 20 20 20 64 61 74 61 5b 68 64  KPT;.    data[hd
dd80: 72 2b 37 5d 20 2d 3d 20 6e 46 72 61 67 3b 0a 20  r+7] -= nFrag;. 
dd90: 20 7d 0a 20 20 69 66 28 20 69 53 74 61 72 74 3d   }.  if( iStart=
dda0: 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b  =get2byte(&data[
ddb0: 68 64 72 2b 35 5d 29 20 29 7b 0a 20 20 20 20 2f  hdr+5]) ){.    /
ddc0: 2a 20 54 68 65 20 6e 65 77 20 66 72 65 65 62 6c  * The new freebl
ddd0: 6f 63 6b 20 69 73 20 61 74 20 74 68 65 20 62 65  ock is at the be
dde0: 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63  ginning of the c
ddf0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
de00: 2c 0a 20 20 20 20 2a 2a 20 73 6f 20 6a 75 73 74  ,.    ** so just
de10: 20 65 78 74 65 6e 64 20 74 68 65 20 63 65 6c 6c   extend the cell
de20: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 72 61   content area ra
de30: 74 68 65 72 20 74 68 61 6e 20 63 72 65 61 74 65  ther than create
de40: 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20   another.    ** 
de50: 66 72 65 65 6c 69 73 74 20 65 6e 74 72 79 20 2a  freelist entry *
de60: 2f 0a 20 20 20 20 69 66 28 20 69 50 74 72 21 3d  /.    if( iPtr!=
de70: 68 64 72 2b 31 20 29 20 72 65 74 75 72 6e 20 53  hdr+1 ) return S
de80: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
de90: 50 54 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  PT;.    put2byte
dea0: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 69  (&data[hdr+1], i
deb0: 46 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75  FreeBlk);.    pu
dec0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
ded0: 2b 35 5d 2c 20 69 45 6e 64 29 3b 0a 20 20 7d 65  +5], iEnd);.  }e
dee0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 73 65  lse{.    /* Inse
def0: 72 74 20 74 68 65 20 6e 65 77 20 66 72 65 65 62  rt the new freeb
df00: 6c 6f 63 6b 20 69 6e 74 6f 20 74 68 65 20 66 72  lock into the fr
df10: 65 65 6c 69 73 74 20 2a 2f 0a 20 20 20 20 70 75  eelist */.    pu
df20: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 50 74  t2byte(&data[iPt
df30: 72 5d 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20  r], iStart);.   
df40: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
df50: 69 53 74 61 72 74 5d 2c 20 69 46 72 65 65 42 6c  iStart], iFreeBl
df60: 6b 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  k);.    put2byte
df70: 28 26 64 61 74 61 5b 69 53 74 61 72 74 2b 32 5d  (&data[iStart+2]
df80: 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20  , iSize);.  }.  
df90: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20  pPage->nFree += 
dfa0: 69 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72 65 74  iOrigSize;.  ret
dfb0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
dfc0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74  ../*.** Decode t
dfd0: 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 28 74  he flags byte (t
dfe0: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
dff0: 20 74 68 65 20 68 65 61 64 65 72 29 20 66 6f 72   the header) for
e000: 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69   a page.** and i
e010: 6e 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64 73  nitialize fields
e020: 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20   of the MemPage 
e030: 73 74 72 75 63 74 75 72 65 20 61 63 63 6f 72 64  structure accord
e040: 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  ingly..**.** Onl
e050: 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  y the following 
e060: 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72 65  combinations are
e070: 20 73 75 70 70 6f 72 74 65 64 2e 20 20 41 6e 79   supported.  Any
e080: 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a  thing different.
e090: 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 61 20 63  ** indicates a c
e0a0: 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  orrupt database 
e0b0: 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  files:.**.**    
e0c0: 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54       PTF_ZERODAT
e0d0: 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  A.**         PTF
e0e0: 5f 5a 45 52 4f 44 41 54 41 20 7c 20 50 54 46 5f  _ZERODATA | PTF_
e0f0: 4c 45 41 46 0a 2a 2a 20 20 20 20 20 20 20 20 20  LEAF.**         
e100: 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50  PTF_LEAFDATA | P
e110: 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20  TF_INTKEY.**    
e120: 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54       PTF_LEAFDAT
e130: 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c  A | PTF_INTKEY |
e140: 20 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61   PTF_LEAF.*/.sta
e150: 74 69 63 20 69 6e 74 20 64 65 63 6f 64 65 46 6c  tic int decodeFl
e160: 61 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ags(MemPage *pPa
e170: 67 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65  ge, int flagByte
e180: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
e190: 42 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70  Bt;     /* A cop
e1a0: 79 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20  y of pPage->pBt 
e1b0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
e1c0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d  age->hdrOffset==
e1d0: 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20  (pPage->pgno==1 
e1e0: 3f 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20  ? 100 : 0) );.  
e1f0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
e200: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
e210: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
e220: 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d  .  pPage->leaf =
e230: 20 28 75 38 29 28 66 6c 61 67 42 79 74 65 3e 3e   (u8)(flagByte>>
e240: 33 29 3b 20 20 61 73 73 65 72 74 28 20 50 54 46  3);  assert( PTF
e250: 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b  _LEAF == 1<<3 );
e260: 0a 20 20 66 6c 61 67 42 79 74 65 20 26 3d 20 7e  .  flagByte &= ~
e270: 50 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67  PTF_LEAF;.  pPag
e280: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20  e->childPtrSize 
e290: 3d 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61  = 4-4*pPage->lea
e2a0: 66 3b 0a 20 20 70 50 61 67 65 2d 3e 78 43 65 6c  f;.  pPage->xCel
e2b0: 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65  lSize = cellSize
e2c0: 50 74 72 3b 0a 20 20 70 42 74 20 3d 20 70 50 61  Ptr;.  pBt = pPa
e2d0: 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 66  ge->pBt;.  if( f
e2e0: 6c 61 67 42 79 74 65 3d 3d 28 50 54 46 5f 4c 45  lagByte==(PTF_LE
e2f0: 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54  AFDATA | PTF_INT
e300: 4b 45 59 29 20 29 7b 0a 20 20 20 20 2f 2a 20 45  KEY) ){.    /* E
e310: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 37  VIDENCE-OF: R-07
e320: 32 39 31 2d 33 35 33 32 38 20 41 20 76 61 6c 75  291-35328 A valu
e330: 65 20 6f 66 20 35 20 28 30 78 30 35 29 20 6d 65  e of 5 (0x05) me
e340: 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20  ans the page is 
e350: 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72 69  an.    ** interi
e360: 6f 72 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20  or table b-tree 
e370: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  page. */.    ass
e380: 65 72 74 28 20 28 50 54 46 5f 4c 45 41 46 44 41  ert( (PTF_LEAFDA
e390: 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59 29 3d 3d  TA|PTF_INTKEY)==
e3a0: 35 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  5 );.    /* EVID
e3b0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 36 39 30 30  ENCE-OF: R-26900
e3c0: 2d 30 39 31 37 36 20 41 20 76 61 6c 75 65 20 6f  -09176 A value o
e3d0: 66 20 31 33 20 28 30 78 30 64 29 20 6d 65 61 6e  f 13 (0x0d) mean
e3e0: 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61 0a  s the page is a.
e3f0: 20 20 20 20 2a 2a 20 6c 65 61 66 20 74 61 62 6c      ** leaf tabl
e400: 65 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a  e b-tree page. *
e410: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  /.    assert( (P
e420: 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f  TF_LEAFDATA|PTF_
e430: 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 29  INTKEY|PTF_LEAF)
e440: 3d 3d 31 33 20 29 3b 0a 20 20 20 20 70 50 61 67  ==13 );.    pPag
e450: 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b 0a 20  e->intKey = 1;. 
e460: 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65     if( pPage->le
e470: 61 66 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  af ){.      pPag
e480: 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20  e->intKeyLeaf = 
e490: 31 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  1;.      pPage->
e4a0: 78 50 61 72 73 65 43 65 6c 6c 20 3d 20 62 74 72  xParseCell = btr
e4b0: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 3b 0a  eeParseCellPtr;.
e4c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e4d0: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65   pPage->intKeyLe
e4e0: 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  af = 0;.      pP
e4f0: 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20 3d  age->xCellSize =
e500: 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61   cellSizePtrNoPa
e510: 79 6c 6f 61 64 3b 0a 20 20 20 20 20 20 70 50 61  yload;.      pPa
e520: 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d  ge->xParseCell =
e530: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
e540: 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20 20 20  trNoPayload;.   
e550: 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61   }.    pPage->ma
e560: 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61  xLocal = pBt->ma
e570: 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65  xLeaf;.    pPage
e580: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
e590: 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c  ->minLeaf;.  }el
e5a0: 73 65 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d  se if( flagByte=
e5b0: 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 29 7b  =PTF_ZERODATA ){
e5c0: 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
e5d0: 2d 4f 46 3a 20 52 2d 34 33 33 31 36 2d 33 37 33  -OF: R-43316-373
e5e0: 30 38 20 41 20 76 61 6c 75 65 20 6f 66 20 32 20  08 A value of 2 
e5f0: 28 30 78 30 32 29 20 6d 65 61 6e 73 20 74 68 65  (0x02) means the
e600: 20 70 61 67 65 20 69 73 20 61 6e 0a 20 20 20 20   page is an.    
e610: 2a 2a 20 69 6e 74 65 72 69 6f 72 20 69 6e 64 65  ** interior inde
e620: 78 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a  x b-tree page. *
e630: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  /.    assert( (P
e640: 54 46 5f 5a 45 52 4f 44 41 54 41 29 3d 3d 32 20  TF_ZERODATA)==2 
e650: 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  );.    /* EVIDEN
e660: 43 45 2d 4f 46 3a 20 52 2d 35 39 36 31 35 2d 34  CE-OF: R-59615-4
e670: 32 38 32 38 20 41 20 76 61 6c 75 65 20 6f 66 20  2828 A value of 
e680: 31 30 20 28 30 78 30 61 29 20 6d 65 61 6e 73 20  10 (0x0a) means 
e690: 74 68 65 20 70 61 67 65 20 69 73 20 61 0a 20 20  the page is a.  
e6a0: 20 20 2a 2a 20 6c 65 61 66 20 69 6e 64 65 78 20    ** leaf index 
e6b0: 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a  b-tree page. */.
e6c0: 20 20 20 20 61 73 73 65 72 74 28 20 28 50 54 46      assert( (PTF
e6d0: 5f 5a 45 52 4f 44 41 54 41 7c 50 54 46 5f 4c 45  _ZERODATA|PTF_LE
e6e0: 41 46 29 3d 3d 31 30 20 29 3b 0a 20 20 20 20 70  AF)==10 );.    p
e6f0: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30  Page->intKey = 0
e700: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74  ;.    pPage->int
e710: 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20  KeyLeaf = 0;.   
e720: 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
e730: 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65 43  ll = btreeParseC
e740: 65 6c 6c 50 74 72 49 6e 64 65 78 3b 0a 20 20 20  ellPtrIndex;.   
e750: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
e760: 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c   = pBt->maxLocal
e770: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e  ;.    pPage->min
e780: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e  Local = pBt->min
e790: 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Local;.  }else{.
e7a0: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
e7b0: 4f 46 3a 20 52 2d 34 37 36 30 38 2d 35 36 34 36  OF: R-47608-5646
e7c0: 39 20 41 6e 79 20 6f 74 68 65 72 20 76 61 6c 75  9 Any other valu
e7d0: 65 20 66 6f 72 20 74 68 65 20 62 2d 74 72 65 65  e for the b-tree
e7e0: 20 70 61 67 65 20 74 79 70 65 20 69 73 0a 20 20   page type is.  
e7f0: 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 2a    ** an error. *
e800: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
e810: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
e820: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6d  ;.  }.  pPage->m
e830: 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d  ax1bytePayload =
e840: 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61   pBt->max1bytePa
e850: 79 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e 20  yload;.  return 
e860: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
e870: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
e880: 68 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66  he auxiliary inf
e890: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 64  ormation for a d
e8a0: 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  isk block..**.**
e8b0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
e8c0: 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49  K on success.  I
e8d0: 66 20 77 65 20 73 65 65 20 74 68 61 74 20 74 68  f we see that th
e8e0: 65 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e  e page does.** n
e8f0: 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c  ot contain a wel
e900: 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73  l-formed databas
e910: 65 20 70 61 67 65 2c 20 74 68 65 6e 20 72 65 74  e page, then ret
e920: 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43  urn .** SQLITE_C
e930: 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65 20 74 68  ORRUPT.  Note th
e940: 61 74 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53  at a return of S
e950: 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f  QLITE_OK does no
e960: 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 20 74  t.** guarantee t
e970: 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
e980: 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74  well-formed.  It
e990: 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68 61 74   only shows that
e9a0: 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64 20 74 6f  .** we failed to
e9b0: 20 64 65 74 65 63 74 20 61 6e 79 20 63 6f 72 72   detect any corr
e9c0: 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  uption..*/.stati
e9d0: 63 20 69 6e 74 20 62 74 72 65 65 49 6e 69 74 50  c int btreeInitP
e9e0: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
e9f0: 67 65 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20  ge){..  assert( 
ea00: 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b  pPage->pBt!=0 );
ea10: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
ea20: 2d 3e 70 42 74 2d 3e 64 62 21 3d 30 20 29 3b 0a  ->pBt->db!=0 );.
ea30: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
ea40: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
ea50: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
ea60: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
ea70: 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65  ge->pgno==sqlite
ea80: 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
ea90: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
eaa0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
eab0: 61 67 65 20 3d 3d 20 73 71 6c 69 74 65 33 50 61  age == sqlite3Pa
eac0: 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
ead0: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
eae0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
eaf0: 61 44 61 74 61 20 3d 3d 20 73 71 6c 69 74 65 33  aData == sqlite3
eb00: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61  PagerGetData(pPa
eb10: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
eb20: 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69  .  if( !pPage->i
eb30: 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 69 6e 74  sInit ){.    int
eb40: 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   pc;            
eb50: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 20  /* Address of a 
eb60: 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e  freeblock within
eb70: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20   pPage->aData[] 
eb80: 2a 2f 0a 20 20 20 20 75 38 20 68 64 72 3b 20 20  */.    u8 hdr;  
eb90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
eba0: 73 65 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67  set to beginning
ebb0: 20 6f 66 20 70 61 67 65 20 68 65 61 64 65 72 20   of page header 
ebc0: 2a 2f 0a 20 20 20 20 75 38 20 2a 64 61 74 61 3b  */.    u8 *data;
ebd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71 75            /* Equ
ebe0: 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61 44 61  al to pPage->aDa
ebf0: 74 61 20 2a 2f 0a 20 20 20 20 42 74 53 68 61 72  ta */.    BtShar
ec00: 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20  ed *pBt;        
ec10: 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62 74 72 65  /* The main btre
ec20: 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  e structure */. 
ec30: 20 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a     int usableSiz
ec40: 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20  e;    /* Amount 
ec50: 6f 66 20 75 73 61 62 6c 65 20 73 70 61 63 65 20  of usable space 
ec60: 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a  on each page */.
ec70: 20 20 20 20 75 31 36 20 63 65 6c 6c 4f 66 66 73      u16 cellOffs
ec80: 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65 74  et;    /* Offset
ec90: 20 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20 70   from start of p
eca0: 61 67 65 20 74 6f 20 66 69 72 73 74 20 63 65 6c  age to first cel
ecb0: 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20  l pointer */.   
ecc0: 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20   int nFree;     
ecd0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
ece0: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e   unused bytes on
ecf0: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20   the page */.   
ed00: 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20   int top;       
ed10: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
ed20: 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  e of the cell co
ed30: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
ed40: 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74    int iCellFirst
ed50: 3b 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c  ;    /* First al
ed60: 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20  lowable cell or 
ed70: 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74  freeblock offset
ed80: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c   */.    int iCel
ed90: 6c 4c 61 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61  lLast;     /* La
eda0: 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c  st possible cell
edb0: 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66   or freeblock of
edc0: 66 73 65 74 20 2a 2f 0a 0a 20 20 20 20 70 42 74  fset */..    pBt
edd0: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a   = pPage->pBt;..
ede0: 20 20 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d      hdr = pPage-
edf0: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20  >hdrOffset;.    
ee00: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
ee10: 61 74 61 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  ata;.    /* EVID
ee20: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 35 39 34  ENCE-OF: R-28594
ee30: 2d 30 32 38 39 30 20 54 68 65 20 6f 6e 65 2d 62  -02890 The one-b
ee40: 79 74 65 20 66 6c 61 67 20 61 74 20 6f 66 66 73  yte flag at offs
ee50: 65 74 20 30 20 69 6e 64 69 63 61 74 69 6e 67 0a  et 0 indicating.
ee60: 20 20 20 20 2a 2a 20 74 68 65 20 62 2d 74 72 65      ** the b-tre
ee70: 65 20 70 61 67 65 20 74 79 70 65 2e 20 2a 2f 0a  e page type. */.
ee80: 20 20 20 20 69 66 28 20 64 65 63 6f 64 65 46 6c      if( decodeFl
ee90: 61 67 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b  ags(pPage, data[
eea0: 68 64 72 5d 29 20 29 20 72 65 74 75 72 6e 20 53  hdr]) ) return S
eeb0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
eec0: 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  PT;.    assert( 
eed0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35  pBt->pageSize>=5
eee0: 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53  12 && pBt->pageS
eef0: 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20  ize<=65536 );.  
ef00: 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67    pPage->maskPag
ef10: 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70  e = (u16)(pBt->p
ef20: 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20  ageSize - 1);.  
ef30: 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c    pPage->nOverfl
ef40: 6f 77 20 3d 20 30 3b 0a 20 20 20 20 75 73 61 62  ow = 0;.    usab
ef50: 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  leSize = pBt->us
ef60: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 70 50  ableSize;.    pP
ef70: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
ef80: 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68  = cellOffset = h
ef90: 64 72 20 2b 20 38 20 2b 20 70 50 61 67 65 2d 3e  dr + 8 + pPage->
efa0: 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
efb0: 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e    pPage->aDataEn
efc0: 64 20 3d 20 26 64 61 74 61 5b 75 73 61 62 6c 65  d = &data[usable
efd0: 53 69 7a 65 5d 3b 0a 20 20 20 20 70 50 61 67 65  Size];.    pPage
efe0: 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61  ->aCellIdx = &da
eff0: 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a  ta[cellOffset];.
f000: 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61      pPage->aData
f010: 4f 66 73 74 20 3d 20 26 64 61 74 61 5b 70 50 61  Ofst = &data[pPa
f020: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
f030: 5d 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  ];.    /* EVIDEN
f040: 43 45 2d 4f 46 3a 20 52 2d 35 38 30 31 35 2d 34  CE-OF: R-58015-4
f050: 38 31 37 35 20 54 68 65 20 74 77 6f 2d 62 79 74  8175 The two-byt
f060: 65 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66  e integer at off
f070: 73 65 74 20 35 20 64 65 73 69 67 6e 61 74 65 73  set 5 designates
f080: 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 72  .    ** the star
f090: 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  t of the cell co
f0a0: 6e 74 65 6e 74 20 61 72 65 61 2e 20 41 20 7a 65  ntent area. A ze
f0b0: 72 6f 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69  ro value for thi
f0c0: 73 20 69 6e 74 65 67 65 72 20 69 73 0a 20 20 20  s integer is.   
f0d0: 20 2a 2a 20 69 6e 74 65 72 70 72 65 74 65 64 20   ** interpreted 
f0e0: 61 73 20 36 35 35 33 36 2e 20 2a 2f 0a 20 20 20  as 65536. */.   
f0f0: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e   top = get2byteN
f100: 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72  otZero(&data[hdr
f110: 2b 35 5d 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49  +5]);.    /* EVI
f120: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 30 30  DENCE-OF: R-3700
f130: 32 2d 33 32 37 37 34 20 54 68 65 20 74 77 6f 2d  2-32774 The two-
f140: 62 79 74 65 20 69 6e 74 65 67 65 72 20 61 74 20  byte integer at 
f150: 6f 66 66 73 65 74 20 33 20 67 69 76 65 73 20 74  offset 3 gives t
f160: 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72  he.    ** number
f170: 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65   of cells on the
f180: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 70 50   page. */.    pP
f190: 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74  age->nCell = get
f1a0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
f1b0: 33 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  3]);.    if( pPa
f1c0: 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c  ge->nCell>MX_CEL
f1d0: 4c 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  L(pBt) ){.      
f1e0: 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73  /* To many cells
f1f0: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 70 61   for a single pa
f200: 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 6d 75  ge.  The page mu
f210: 73 74 20 62 65 20 63 6f 72 72 75 70 74 20 2a 2f  st be corrupt */
f220: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
f230: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
f240: 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73  T;.    }.    tes
f250: 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 43  tcase( pPage->nC
f260: 65 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42 74  ell==MX_CELL(pBt
f270: 29 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  ) );.    /* EVID
f280: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 30 38 39  ENCE-OF: R-24089
f290: 2d 35 37 39 37 39 20 49 66 20 61 20 70 61 67 65  -57979 If a page
f2a0: 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c   contains no cel
f2b0: 6c 73 20 28 77 68 69 63 68 20 69 73 20 6f 6e 6c  ls (which is onl
f2c0: 79 0a 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c  y.    ** possibl
f2d0: 65 20 66 6f 72 20 61 20 72 6f 6f 74 20 70 61 67  e for a root pag
f2e0: 65 20 6f 66 20 61 20 74 61 62 6c 65 20 74 68 61  e of a table tha
f2f0: 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 6f  t contains no ro
f300: 77 73 29 20 74 68 65 6e 20 74 68 65 0a 20 20 20  ws) then the.   
f310: 20 2a 2a 20 6f 66 66 73 65 74 20 74 6f 20 74 68   ** offset to th
f320: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
f330: 72 65 61 20 77 69 6c 6c 20 65 71 75 61 6c 20 74  rea will equal t
f340: 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 69 6e  he page size min
f350: 75 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 62 79  us the.    ** by
f360: 74 65 73 20 6f 66 20 72 65 73 65 72 76 65 64 20  tes of reserved 
f370: 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61 73  space. */.    as
f380: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
f390: 6c 6c 3e 30 20 7c 7c 20 74 6f 70 3d 3d 75 73 61  ll>0 || top==usa
f3a0: 62 6c 65 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55  bleSize || CORRU
f3b0: 50 54 5f 44 42 20 29 3b 0a 0a 20 20 20 20 2f 2a  PT_DB );..    /*
f3c0: 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20 64 61 74   A malformed dat
f3d0: 61 62 61 73 65 20 70 61 67 65 20 6d 69 67 68 74  abase page might
f3e0: 20 63 61 75 73 65 20 75 73 20 74 6f 20 72 65 61   cause us to rea
f3f0: 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 0a 20  d past the end. 
f400: 20 20 20 2a 2a 20 6f 66 20 70 61 67 65 20 77 68     ** of page wh
f410: 65 6e 20 70 61 72 73 69 6e 67 20 61 20 63 65 6c  en parsing a cel
f420: 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  l.  .    **.    
f430: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
f440: 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 63   block of code c
f450: 68 65 63 6b 73 20 65 61 72 6c 79 20 74 6f 20 73  hecks early to s
f460: 65 65 20 69 66 20 61 20 63 65 6c 6c 20 65 78 74  ee if a cell ext
f470: 65 6e 64 73 0a 20 20 20 20 2a 2a 20 70 61 73 74  ends.    ** past
f480: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 70 61   the end of a pa
f490: 67 65 20 62 6f 75 6e 64 61 72 79 20 61 6e 64 20  ge boundary and 
f4a0: 63 61 75 73 65 73 20 53 51 4c 49 54 45 5f 43 4f  causes SQLITE_CO
f4b0: 52 52 55 50 54 20 74 6f 20 62 65 20 0a 20 20 20  RRUPT to be .   
f4c0: 20 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 66 20   ** returned if 
f4d0: 69 74 20 64 6f 65 73 2e 0a 20 20 20 20 2a 2f 0a  it does..    */.
f4e0: 20 20 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d      iCellFirst =
f4f0: 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
f500: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
f510: 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73    iCellLast = us
f520: 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
f530: 20 20 69 66 28 20 70 42 74 2d 3e 64 62 2d 3e 66    if( pBt->db->f
f540: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43 65  lags & SQLITE_Ce
f550: 6c 6c 53 69 7a 65 43 6b 20 29 7b 0a 20 20 20 20  llSizeCk ){.    
f560: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
f570: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74      /* Index int
f580: 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  o the cell point
f590: 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20  er array */.    
f5a0: 20 20 69 6e 74 20 73 7a 3b 20 20 20 20 20 20 20    int sz;       
f5b0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
f5c0: 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20 20 20   cell */..      
f5d0: 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
f5e0: 20 29 20 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a   ) iCellLast--;.
f5f0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
f600: 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69  <pPage->nCell; i
f610: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 63 20  ++){.        pc 
f620: 3d 20 67 65 74 32 62 79 74 65 41 6c 69 67 6e 65  = get2byteAligne
f630: 64 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  d(&data[cellOffs
f640: 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20  et+i*2]);.      
f650: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
f660: 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20  iCellFirst );.  
f670: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
f680: 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b  pc==iCellLast );
f690: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63 3c  .        if( pc<
f6a0: 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63  iCellFirst || pc
f6b0: 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20  >iCellLast ){.  
f6c0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
f6d0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
f6e0: 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  PT;.        }.  
f6f0: 20 20 20 20 20 20 73 7a 20 3d 20 70 50 61 67 65        sz = pPage
f700: 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67  ->xCellSize(pPag
f710: 65 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20  e, &data[pc]);. 
f720: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
f730: 20 70 63 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69   pc+sz==usableSi
f740: 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ze );.        if
f750: 28 20 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69  ( pc+sz>usableSi
f760: 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
f770: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
f780: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
f790: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
f7a0: 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
f7b0: 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74  leaf ) iCellLast
f7c0: 2b 2b 3b 0a 20 20 20 20 7d 20 20 0a 0a 20 20 20  ++;.    }  ..   
f7d0: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
f7e0: 74 6f 74 61 6c 20 66 72 65 65 20 73 70 61 63 65  total free space
f7f0: 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20   on the page.   
f800: 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   ** EVIDENCE-OF:
f810: 20 52 2d 32 33 35 38 38 2d 33 34 34 35 30 20 54   R-23588-34450 T
f820: 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65  he two-byte inte
f830: 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 31 20  ger at offset 1 
f840: 67 69 76 65 73 20 74 68 65 0a 20 20 20 20 2a 2a  gives the.    **
f850: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 66 69   start of the fi
f860: 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 6f 6e  rst freeblock on
f870: 20 74 68 65 20 70 61 67 65 2c 20 6f 72 20 69 73   the page, or is
f880: 20 7a 65 72 6f 20 69 66 20 74 68 65 72 65 20 61   zero if there a
f890: 72 65 20 6e 6f 0a 20 20 20 20 2a 2a 20 66 72 65  re no.    ** fre
f8a0: 65 62 6c 6f 63 6b 73 2e 20 2a 2f 0a 20 20 20 20  eblocks. */.    
f8b0: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  pc = get2byte(&d
f8c0: 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20  ata[hdr+1]);.   
f8d0: 20 6e 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64   nFree = data[hd
f8e0: 72 2b 37 5d 20 2b 20 74 6f 70 3b 20 20 2f 2a 20  r+7] + top;  /* 
f8f0: 49 6e 69 74 20 6e 46 72 65 65 20 74 6f 20 6e 6f  Init nFree to no
f900: 6e 2d 66 72 65 65 62 6c 6f 63 6b 20 66 72 65 65  n-freeblock free
f910: 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 69 66   space */.    if
f920: 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20 20 20  ( pc>0 ){.      
f930: 75 33 32 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a  u32 next, size;.
f940: 20 20 20 20 20 20 69 66 28 20 70 63 3c 69 43 65        if( pc<iCe
f950: 6c 6c 46 69 72 73 74 20 29 7b 0a 20 20 20 20 20  llFirst ){.     
f960: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
f970: 46 3a 20 52 2d 35 35 35 33 30 2d 35 32 39 33 30  F: R-55530-52930
f980: 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65   In a well-forme
f990: 64 20 62 2d 74 72 65 65 20 70 61 67 65 2c 20 74  d b-tree page, t
f9a0: 68 65 72 65 20 77 69 6c 6c 0a 20 20 20 20 20 20  here will.      
f9b0: 20 20 2a 2a 20 61 6c 77 61 79 73 20 62 65 20 61    ** always be a
f9c0: 74 20 6c 65 61 73 74 20 6f 6e 65 20 63 65 6c 6c  t least one cell
f9d0: 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
f9e0: 74 20 66 72 65 65 62 6c 6f 63 6b 2e 0a 20 20 20  t freeblock..   
f9f0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
fa00: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
fa10: 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20  RRUPT_BKPT; .   
fa20: 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65     }.      while
fa30: 28 20 31 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ( 1 ){.        i
fa40: 66 28 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20  f( pc>iCellLast 
fa50: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
fa60: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
fa70: 50 54 5f 42 4b 50 54 3b 20 2f 2a 20 46 72 65 65  PT_BKPT; /* Free
fa80: 62 6c 6f 63 6b 20 6f 66 66 20 74 68 65 20 65 6e  block off the en
fa90: 64 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f  d of the page */
faa0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
fab0: 20 20 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79     next = get2by
fac0: 74 65 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20  te(&data[pc]);. 
fad0: 20 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65         size = ge
fae0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b  t2byte(&data[pc+
faf0: 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 6e 46 72  2]);.        nFr
fb00: 65 65 20 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a  ee = nFree + siz
fb10: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  e;.        if( n
fb20: 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 20 29  ext<=pc+size+3 )
fb30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
fb40: 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20 20  pc = next;.     
fb50: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 65 78   }.      if( nex
fb60: 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  t>0 ){.        r
fb70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
fb80: 52 55 50 54 5f 42 4b 50 54 3b 20 20 2f 2a 20 46  RUPT_BKPT;  /* F
fb90: 72 65 65 62 6c 6f 63 6b 20 6e 6f 74 20 69 6e 20  reeblock not in 
fba0: 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  ascending order 
fbb0: 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
fbc0: 20 69 66 28 20 70 63 2b 73 69 7a 65 3e 28 75 6e   if( pc+size>(un
fbd0: 73 69 67 6e 65 64 20 69 6e 74 29 75 73 61 62 6c  signed int)usabl
fbe0: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
fbf0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
fc00: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 20 2f 2a  ORRUPT_BKPT;  /*
fc10: 20 4c 61 73 74 20 66 72 65 65 62 6c 6f 63 6b 20   Last freeblock 
fc20: 65 78 74 65 6e 64 73 20 70 61 73 74 20 70 61 67  extends past pag
fc30: 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20 20 20 7d  e end */.      }
fc40: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
fc50: 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6e 46  t this point, nF
fc60: 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ree contains the
fc70: 20 73 75 6d 20 6f 66 20 74 68 65 20 6f 66 66 73   sum of the offs
fc80: 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a  et to the start.
fc90: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 65      ** of the ce
fca0: 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll-content area 
fcb0: 70 6c 75 73 20 74 68 65 20 6e 75 6d 62 65 72 20  plus the number 
fcc0: 6f 66 20 66 72 65 65 20 62 79 74 65 73 20 77 69  of free bytes wi
fcd0: 74 68 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  thin.    ** the 
fce0: 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65  cell-content are
fcf0: 61 2e 20 49 66 20 74 68 69 73 20 69 73 20 67 72  a. If this is gr
fd00: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 75  eater than the u
fd10: 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20 20 20 2a  sable-size.    *
fd20: 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2c 20 74  * of the page, t
fd30: 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 75 73  hen the page mus
fd40: 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20  t be corrupted. 
fd50: 54 68 69 73 20 63 68 65 63 6b 20 61 6c 73 6f 0a  This check also.
fd60: 20 20 20 20 2a 2a 20 73 65 72 76 65 73 20 74 6f      ** serves to
fd70: 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
fd80: 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73   offset to the s
fd90: 74 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  tart of the cell
fda0: 2d 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20  -content.    ** 
fdb0: 61 72 65 61 2c 20 61 63 63 6f 72 64 69 6e 67 20  area, according 
fdc0: 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64  to the page head
fdd0: 65 72 2c 20 6c 69 65 73 20 77 69 74 68 69 6e 20  er, lies within 
fde0: 74 68 65 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  the page..    */
fdf0: 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 3e 75  .    if( nFree>u
fe00: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
fe10: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
fe20: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
fe30: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d      }.    pPage-
fe40: 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28 6e  >nFree = (u16)(n
fe50: 46 72 65 65 20 2d 20 69 43 65 6c 6c 46 69 72 73  Free - iCellFirs
fe60: 74 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69  t);.    pPage->i
fe70: 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 20  sInit = 1;.  }. 
fe80: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
fe90: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  K;.}../*.** Set 
fea0: 75 70 20 61 20 72 61 77 20 70 61 67 65 20 73 6f  up a raw page so
feb0: 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c   that it looks l
fec0: 69 6b 65 20 61 20 64 61 74 61 62 61 73 65 20 70  ike a database p
fed0: 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e  age holding.** n
fee0: 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74  o entries..*/.st
fef0: 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61  atic void zeroPa
ff00: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
ff10: 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  e, int flags){. 
ff20: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
ff30: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
ff40: 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20  ata;.  BtShared 
ff50: 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
ff60: 74 3b 0a 20 20 75 38 20 68 64 72 20 3d 20 70 50  t;.  u8 hdr = pP
ff70: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
ff80: 20 20 75 31 36 20 66 69 72 73 74 3b 0a 0a 20 20    u16 first;..  
ff90: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
ffa0: 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70  agerPagenumber(p
ffb0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d  Page->pDbPage)==
ffc0: 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20  pPage->pgno );. 
ffd0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
ffe0: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
fff0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d  age->pDbPage) ==
10000 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b   (void*)pPage );
10010 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
10020 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
10030 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d  Page->pDbPage) =
10040 3d 20 64 61 74 61 20 29 3b 0a 20 20 61 73 73 65  = data );.  asse
10050 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
10060 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
10070 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
10080 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10090 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
100a0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
100b0 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
100c0 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
100d0 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  TE ){.    memset
100e0 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20  (&data[hdr], 0, 
100f0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
10100 2d 20 68 64 72 29 3b 0a 20 20 7d 0a 20 20 64 61  - hdr);.  }.  da
10110 74 61 5b 68 64 72 5d 20 3d 20 28 63 68 61 72 29  ta[hdr] = (char)
10120 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20 3d  flags;.  first =
10130 20 68 64 72 20 2b 20 28 28 66 6c 61 67 73 26 50   hdr + ((flags&P
10140 54 46 5f 4c 45 41 46 29 3d 3d 30 20 3f 20 31 32  TF_LEAF)==0 ? 12
10150 20 3a 20 38 29 3b 0a 20 20 6d 65 6d 73 65 74 28   : 8);.  memset(
10160 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c  &data[hdr+1], 0,
10170 20 34 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b   4);.  data[hdr+
10180 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32 62 79  7] = 0;.  put2by
10190 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
101a0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
101b0 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
101c0 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75  e = (u16)(pBt->u
101d0 73 61 62 6c 65 53 69 7a 65 20 2d 20 66 69 72 73  sableSize - firs
101e0 74 29 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67  t);.  decodeFlag
101f0 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b  s(pPage, flags);
10200 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  .  pPage->cellOf
10210 66 73 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20  fset = first;.  
10220 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
10230 3d 20 26 64 61 74 61 5b 70 42 74 2d 3e 75 73 61  = &data[pBt->usa
10240 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67  bleSize];.  pPag
10250 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64  e->aCellIdx = &d
10260 61 74 61 5b 66 69 72 73 74 5d 3b 0a 20 20 70 50  ata[first];.  pP
10270 61 67 65 2d 3e 61 44 61 74 61 4f 66 73 74 20 3d  age->aDataOfst =
10280 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 68   &data[pPage->ch
10290 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 70  ildPtrSize];.  p
102a0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
102b0 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
102c0 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31  Bt->pageSize>=51
102d0 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69  2 && pBt->pageSi
102e0 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 70  ze<=65536 );.  p
102f0 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d  Page->maskPage =
10300 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65   (u16)(pBt->page
10310 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50 61  Size - 1);.  pPa
10320 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20  ge->nCell = 0;. 
10330 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
10340 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f   1;.}.../*.** Co
10350 6e 76 65 72 74 20 61 20 44 62 50 61 67 65 20 6f  nvert a DbPage o
10360 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 74 68 65  btained from the
10370 20 70 61 67 65 72 20 69 6e 74 6f 20 61 20 4d 65   pager into a Me
10380 6d 50 61 67 65 20 75 73 65 64 20 62 79 0a 2a 2a  mPage used by.**
10390 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72   the btree layer
103a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50  ..*/.static MemP
103b0 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 46 72  age *btreePageFr
103c0 6f 6d 44 62 50 61 67 65 28 44 62 50 61 67 65 20  omDbPage(DbPage 
103d0 2a 70 44 62 50 61 67 65 2c 20 50 67 6e 6f 20 70  *pDbPage, Pgno p
103e0 67 6e 6f 2c 20 42 74 53 68 61 72 65 64 20 2a 70  gno, BtShared *p
103f0 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Bt){.  MemPage *
10400 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65  pPage = (MemPage
10410 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
10420 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29 3b  tExtra(pDbPage);
10430 0a 20 20 69 66 28 20 70 67 6e 6f 21 3d 70 50 61  .  if( pgno!=pPa
10440 67 65 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20  ge->pgno ){.    
10450 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73  pPage->aData = s
10460 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
10470 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ta(pDbPage);.   
10480 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 20   pPage->pDbPage 
10490 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 20 20 70  = pDbPage;.    p
104a0 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b  Page->pBt = pBt;
104b0 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f  .    pPage->pgno
104c0 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 70 50 61   = pgno;.    pPa
104d0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20  ge->hdrOffset = 
104e0 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20  pgno==1 ? 100 : 
104f0 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  0;.  }.  assert(
10500 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3d 3d 73   pPage->aData==s
10510 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
10520 74 61 28 70 44 62 50 61 67 65 29 20 29 3b 0a 20  ta(pDbPage) );. 
10530 20 72 65 74 75 72 6e 20 70 50 61 67 65 3b 20 0a   return pPage; .
10540 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70  }../*.** Get a p
10550 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67  age from the pag
10560 65 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20  er.  Initialize 
10570 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20  the MemPage.pBt 
10580 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61  and.** MemPage.a
10590 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66  Data elements if
105a0 20 6e 65 65 64 65 64 2e 20 20 53 65 65 20 61 6c   needed.  See al
105b0 73 6f 3a 20 62 74 72 65 65 47 65 74 55 6e 75 73  so: btreeGetUnus
105c0 65 64 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  edPage()..**.** 
105d0 49 66 20 74 68 65 20 50 41 47 45 52 5f 47 45 54  If the PAGER_GET
105e0 5f 4e 4f 43 4f 4e 54 45 4e 54 20 66 6c 61 67 20  _NOCONTENT flag 
105f0 69 73 20 73 65 74 2c 20 69 74 20 6d 65 61 6e 73  is set, it means
10600 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20   that we do not 
10610 63 61 72 65 0a 2a 2a 20 61 62 6f 75 74 20 74 68  care.** about th
10620 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
10630 20 70 61 67 65 20 61 74 20 74 68 69 73 20 74 69   page at this ti
10640 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67  me.  So do not g
10650 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a  o to the disk.**
10660 20 74 6f 20 66 65 74 63 68 20 74 68 65 20 63 6f   to fetch the co
10670 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c  ntent.  Just fil
10680 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  l in the content
10690 20 77 69 74 68 20 7a 65 72 6f 73 20 66 6f 72 20   with zeros for 
106a0 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68  now..** If in th
106b0 65 20 66 75 74 75 72 65 20 77 65 20 63 61 6c 6c  e future we call
106c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
106d0 74 65 28 29 20 6f 6e 20 74 68 69 73 20 70 61 67  te() on this pag
106e0 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73  e, that.** means
106f0 20 77 65 20 68 61 76 65 20 73 74 61 72 74 65 64   we have started
10700 20 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65 64   to be concerned
10710 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61   about content a
10720 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72  nd the disk.** r
10730 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72  ead should occur
10740 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a   at that point..
10750 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
10760 72 65 65 47 65 74 50 61 67 65 28 0a 20 20 42 74  reeGetPage(.  Bt
10770 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
10780 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
10790 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
107a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
107b0 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
107c0 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65  to fetch */.  Me
107d0 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
107e0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
107f0 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 70 61   page in this pa
10800 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74  rameter */.  int
10810 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
10820 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e    /* PAGER_GET_N
10830 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47 45  OCONTENT or PAGE
10840 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a  R_GET_READONLY *
10850 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
10860 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
10870 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61  ;..  assert( fla
10880 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d  gs==0 || flags==
10890 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
108a0 45 4e 54 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41  ENT || flags==PA
108b0 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59  GER_GET_READONLY
108c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
108d0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
108e0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
108f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
10900 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
10910 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67  er, pgno, (DbPag
10920 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 66 6c  e**)&pDbPage, fl
10930 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ags);.  if( rc )
10940 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70   return rc;.  *p
10950 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67  pPage = btreePag
10960 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50  eFromDbPage(pDbP
10970 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b  age, pgno, pBt);
10980 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
10990 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
109a0 74 72 69 65 76 65 20 61 20 70 61 67 65 20 66 72  trieve a page fr
109b0 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63 61 63  om the pager cac
109c0 68 65 2e 20 49 66 20 74 68 65 20 72 65 71 75 65  he. If the reque
109d0 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74  sted page is not
109e0 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74  .** already in t
109f0 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 72  he pager cache r
10a00 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74  eturn NULL. Init
10a10 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61  ialize the MemPa
10a20 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65  ge.pBt and.** Me
10a30 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d  mPage.aData elem
10a40 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a  ents if needed..
10a50 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67  */.static MemPag
10a60 65 20 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b  e *btreePageLook
10a70 75 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  up(BtShared *pBt
10a80 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
10a90 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
10aa0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
10ab0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
10ac0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
10ad0 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33  DbPage = sqlite3
10ae0 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d  PagerLookup(pBt-
10af0 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  >pPager, pgno);.
10b00 20 20 69 66 28 20 70 44 62 50 61 67 65 20 29 7b    if( pDbPage ){
10b10 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65  .    return btre
10b20 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28  ePageFromDbPage(
10b30 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70  pDbPage, pgno, p
10b40 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Bt);.  }.  retur
10b50 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
10b60 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  turn the size of
10b70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
10b80 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20  le in pages. If 
10b90 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e  there is any kin
10ba0 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72  d of.** error, r
10bb0 65 74 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64  eturn ((unsigned
10bc0 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61   int)-1)..*/.sta
10bd0 74 69 63 20 50 67 6e 6f 20 62 74 72 65 65 50 61  tic Pgno btreePa
10be0 67 65 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64  gecount(BtShared
10bf0 20 2a 70 42 74 29 7b 0a 20 20 72 65 74 75 72 6e   *pBt){.  return
10c00 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75   pBt->nPage;.}.u
10c10 33 32 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  32 sqlite3BtreeL
10c20 61 73 74 50 61 67 65 28 42 74 72 65 65 20 2a 70  astPage(Btree *p
10c30 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
10c40 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
10c50 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
10c60 72 74 28 20 28 28 70 2d 3e 70 42 74 2d 3e 6e 50  rt( ((p->pBt->nP
10c70 61 67 65 29 26 30 78 38 30 30 30 30 30 30 29 3d  age)&0x8000000)=
10c80 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 62  =0 );.  return b
10c90 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 2d  treePagecount(p-
10ca0 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  >pBt);.}../*.** 
10cb0 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20  Get a page from 
10cc0 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e  the pager and in
10cd0 69 74 69 61 6c 69 7a 65 20 69 74 2e 0a 2a 2a 0a  itialize it..**.
10ce0 2a 2a 20 49 66 20 70 43 75 72 21 3d 30 20 74 68  ** If pCur!=0 th
10cf0 65 6e 20 74 68 65 20 70 61 67 65 20 69 73 20 62  en the page is b
10d00 65 69 6e 67 20 66 65 74 63 68 65 64 20 61 73 20  eing fetched as 
10d10 70 61 72 74 20 6f 66 20 61 20 6d 6f 76 65 54 6f  part of a moveTo
10d20 43 68 69 6c 64 28 29 0a 2a 2a 20 63 61 6c 6c 2e  Child().** call.
10d30 20 20 44 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20    Do additional 
10d40 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
10d50 6f 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  on the page in t
10d60 68 69 73 20 63 61 73 65 2e 0a 2a 2a 20 41 6e 64  his case..** And
10d70 20 69 66 20 74 68 65 20 66 65 74 63 68 20 66 61   if the fetch fa
10d80 69 6c 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ils, this routin
10d90 65 20 6d 75 73 74 20 64 65 63 72 65 6d 65 6e 74  e must decrement
10da0 20 70 43 75 72 2d 3e 69 50 61 67 65 2e 0a 2a 2a   pCur->iPage..**
10db0 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 69 73 20  .** The page is 
10dc0 66 65 74 63 68 65 64 20 61 73 20 72 65 61 64 2d  fetched as read-
10dd0 77 72 69 74 65 20 75 6e 6c 65 73 73 20 70 43 75  write unless pCu
10de0 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e  r is not NULL an
10df0 64 20 69 73 0a 2a 2a 20 61 20 72 65 61 64 2d 6f  d is.** a read-o
10e00 6e 6c 79 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  nly cursor..**.*
10e10 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
10e20 63 75 72 73 2c 20 74 68 65 6e 20 2a 70 70 50 61  curs, then *ppPa
10e30 67 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e  ge is undefined.
10e40 20 49 74 0a 2a 2a 20 6d 61 79 20 72 65 6d 61 69   It.** may remai
10e50 6e 20 75 6e 63 68 61 6e 67 65 64 2c 20 6f 72 20  n unchanged, or 
10e60 69 74 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f  it may be set to
10e70 20 61 6e 20 69 6e 76 61 6c 69 64 20 76 61 6c 75   an invalid valu
10e80 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
10e90 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
10ea0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
10eb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10ec0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
10ed0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file */.  Pgn
10ee0 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
10ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10f00 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61  Number of the pa
10f10 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d  ge to get */.  M
10f20 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
10f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10f40 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 67 65  * Write the page
10f50 20 70 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f   pointer here */
10f60 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
10f70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
10f80 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20     /* Cursor to 
10f90 72 65 63 65 69 76 65 20 74 68 65 20 70 61 67 65  receive the page
10fa0 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69  , or NULL */.  i
10fb0 6e 74 20 62 52 65 61 64 4f 6e 6c 79 20 20 20 20  nt bReadOnly    
10fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10fd0 2a 20 54 72 75 65 20 66 6f 72 20 61 20 72 65 61  * True for a rea
10fe0 64 2d 6f 6e 6c 79 20 70 61 67 65 20 2a 2f 0a 29  d-only page */.)
10ff0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62  {.  int rc;.  Db
11000 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20  Page *pDbPage;. 
11010 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
11020 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
11030 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
11040 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20  ert( pCur==0 || 
11050 70 70 50 61 67 65 3d 3d 26 70 43 75 72 2d 3e 61  ppPage==&pCur->a
11060 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
11070 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e] );.  assert( 
11080 70 43 75 72 3d 3d 30 20 7c 7c 20 62 52 65 61 64  pCur==0 || bRead
11090 4f 6e 6c 79 3d 3d 70 43 75 72 2d 3e 63 75 72 50  Only==pCur->curP
110a0 61 67 65 72 46 6c 61 67 73 20 29 3b 0a 20 20 61  agerFlags );.  a
110b0 73 73 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c  ssert( pCur==0 |
110c0 7c 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20  | pCur->iPage>0 
110d0 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62  );..  if( pgno>b
110e0 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
110f0 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  t) ){.    rc = S
11100 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
11110 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74  PT;.    goto get
11120 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f  AndInitPage_erro
11130 72 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  r;.  }.  rc = sq
11140 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
11150 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  t->pPager, pgno,
11160 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50   (DbPage**)&pDbP
11170 61 67 65 2c 20 62 52 65 61 64 4f 6e 6c 79 29 3b  age, bReadOnly);
11180 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
11190 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74   goto getAndInit
111a0 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  Page_error;.  }.
111b0 20 20 2a 70 70 50 61 67 65 20 3d 20 28 4d 65 6d    *ppPage = (Mem
111c0 50 61 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67  Page*)sqlite3Pag
111d0 65 72 47 65 74 45 78 74 72 61 28 70 44 62 50 61  erGetExtra(pDbPa
111e0 67 65 29 3b 0a 20 20 69 66 28 20 28 2a 70 70 50  ge);.  if( (*ppP
111f0 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20  age)->isInit==0 
11200 29 7b 0a 20 20 20 20 62 74 72 65 65 50 61 67 65  ){.    btreePage
11210 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61  FromDbPage(pDbPa
11220 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a  ge, pgno, pBt);.
11230 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e      rc = btreeIn
11240 69 74 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  itPage(*ppPage);
11250 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
11260 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11270 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
11280 61 67 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  age);.      goto
11290 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f   getAndInitPage_
112a0 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  error;.    }.  }
112b0 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70 70 50  .  assert( (*ppP
112c0 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f  age)->pgno==pgno
112d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a   );.  assert( (*
112e0 70 70 50 61 67 65 29 2d 3e 61 44 61 74 61 3d 3d  ppPage)->aData==
112f0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
11300 61 74 61 28 70 44 62 50 61 67 65 29 20 29 3b 0a  ata(pDbPage) );.
11310 0a 20 20 2f 2a 20 49 66 20 6f 62 74 61 69 6e 69  .  /* If obtaini
11320 6e 67 20 61 20 63 68 69 6c 64 20 70 61 67 65 20  ng a child page 
11330 66 6f 72 20 61 20 63 75 72 73 6f 72 2c 20 77 65  for a cursor, we
11340 20 6d 75 73 74 20 76 65 72 69 66 79 20 74 68 61   must verify tha
11350 74 20 74 68 65 20 70 61 67 65 20 69 73 0a 20 20  t the page is.  
11360 2a 2a 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  ** compatible wi
11370 74 68 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  th the root page
11380 2e 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 20  . */.  if( pCur 
11390 26 26 20 28 28 2a 70 70 50 61 67 65 29 2d 3e 6e  && ((*ppPage)->n
113a0 43 65 6c 6c 3c 31 20 7c 7c 20 28 2a 70 70 50 61  Cell<1 || (*ppPa
113b0 67 65 29 2d 3e 69 6e 74 4b 65 79 21 3d 70 43 75  ge)->intKey!=pCu
113c0 72 2d 3e 63 75 72 49 6e 74 4b 65 79 29 20 29 7b  r->curIntKey) ){
113d0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
113e0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
113f0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
11400 70 70 50 61 67 65 29 3b 0a 20 20 20 20 67 6f 74  ppPage);.    got
11410 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  o getAndInitPage
11420 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 72 65  _error;.  }.  re
11430 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11440 0a 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f  .getAndInitPage_
11450 65 72 72 6f 72 3a 0a 20 20 69 66 28 20 70 43 75  error:.  if( pCu
11460 72 20 29 20 70 43 75 72 2d 3e 69 50 61 67 65 2d  r ) pCur->iPage-
11470 2d 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  -;.  testcase( p
11480 67 6e 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  gno==0 );.  asse
11490 72 74 28 20 70 67 6e 6f 21 3d 30 20 7c 7c 20 72  rt( pgno!=0 || r
114a0 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  c==SQLITE_CORRUP
114b0 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  T );.  return rc
114c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
114d0 73 65 20 61 20 4d 65 6d 50 61 67 65 2e 20 20 54  se a MemPage.  T
114e0 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 63 61  his should be ca
114f0 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61  lled once for ea
11500 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c  ch prior.** call
11510 20 74 6f 20 62 74 72 65 65 47 65 74 50 61 67 65   to btreeGetPage
11520 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11530 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e   releasePageNotN
11540 75 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ull(MemPage *pPa
11550 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ge){.  assert( p
11560 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20  Page->aData );. 
11570 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
11580 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  pBt );.  assert(
11590 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 21   pPage->pDbPage!
115a0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
115b0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
115c0 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50  xtra(pPage->pDbP
115d0 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70  age) == (void*)p
115e0 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
115f0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
11600 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62  tData(pPage->pDb
11610 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44  Page)==pPage->aD
11620 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ata );.  assert(
11630 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
11640 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
11650 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
11660 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74  te3PagerUnrefNot
11670 4e 75 6c 6c 28 70 50 61 67 65 2d 3e 70 44 62 50  Null(pPage->pDbP
11680 61 67 65 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  age);.}.static v
11690 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28  oid releasePage(
116a0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
116b0 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 20 72  .  if( pPage ) r
116c0 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c  eleasePageNotNul
116d0 6c 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a  l(pPage);.}../*.
116e0 2a 2a 20 47 65 74 20 61 6e 20 75 6e 75 73 65 64  ** Get an unused
116f0 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   page..**.** Thi
11700 73 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b  s works just lik
11710 65 20 62 74 72 65 65 47 65 74 50 61 67 65 28 29  e btreeGetPage()
11720 20 77 69 74 68 20 74 68 65 20 61 64 64 69 74 69   with the additi
11730 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 49  on:.**.**   *  I
11740 66 20 74 68 65 20 70 61 67 65 20 69 73 20 61 6c  f the page is al
11750 72 65 61 64 79 20 69 6e 20 75 73 65 20 66 6f 72  ready in use for
11760 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70   some other purp
11770 6f 73 65 2c 20 69 6d 6d 65 64 69 61 74 65 6c 79  ose, immediately
11780 0a 2a 2a 20 20 20 20 20 20 72 65 6c 65 61 73 65  .**      release
11790 20 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61   it and return a
117a0 6e 20 53 51 4c 49 54 45 5f 43 55 52 52 55 50 54  n SQLITE_CURRUPT
117b0 20 65 72 72 6f 72 2e 0a 2a 2a 20 20 20 2a 20 20   error..**   *  
117c0 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 69 73  Make sure the is
117d0 49 6e 69 74 20 66 6c 61 67 20 69 73 20 63 6c 65  Init flag is cle
117e0 61 72 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ar.*/.static int
117f0 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50   btreeGetUnusedP
11800 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
11810 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54  *pBt,       /* T
11820 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67  he btree */.  Pg
11830 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
11840 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
11850 74 68 65 20 70 61 67 65 20 74 6f 20 66 65 74 63  the page to fetc
11860 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  h */.  MemPage *
11870 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52  *ppPage,    /* R
11880 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 69  eturn the page i
11890 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74 65 72  n this parameter
118a0 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
118b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41             /* PA
118c0 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
118d0 54 20 6f 72 20 50 41 47 45 52 5f 47 45 54 5f 52  T or PAGER_GET_R
118e0 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20  EADONLY */.){.  
118f0 69 6e 74 20 72 63 20 3d 20 62 74 72 65 65 47 65  int rc = btreeGe
11900 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c  tPage(pBt, pgno,
11910 20 70 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b   ppPage, flags);
11920 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
11930 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
11940 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
11950 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67  Refcount((*ppPag
11960 65 29 2d 3e 70 44 62 50 61 67 65 29 3e 31 20 29  e)->pDbPage)>1 )
11970 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
11980 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
11990 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
119a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
119b0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
119c0 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 2a 70  T;.    }.    (*p
119d0 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d  pPage)->isInit =
119e0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
119f0 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
11a00 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
11a10 0a 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20  .../*.** During 
11a20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e  a rollback, when
11a30 20 74 68 65 20 70 61 67 65 72 20 72 65 6c 6f 61   the pager reloa
11a40 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ds information i
11a50 6e 74 6f 20 74 68 65 20 63 61 63 68 65 0a 2a 2a  nto the cache.**
11a60 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 63   so that the cac
11a70 68 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 74  he is restored t
11a80 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
11a90 74 61 74 65 20 61 74 20 74 68 65 20 73 74 61 72  tate at the star
11aa0 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e  t of.** the tran
11ab0 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63  saction, for eac
11ac0 68 20 70 61 67 65 20 72 65 73 74 6f 72 65 64 20  h page restored 
11ad0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
11ae0 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  called..**.** Th
11af0 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73  is routine needs
11b00 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 65 78   to reset the ex
11b10 74 72 61 20 64 61 74 61 20 73 65 63 74 69 6f 6e  tra data section
11b20 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
11b30 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61 67  he.** page to ag
11b40 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73  ree with the res
11b50 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73  tored data..*/.s
11b60 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 52  tatic void pageR
11b70 65 69 6e 69 74 28 44 62 50 61 67 65 20 2a 70 44  einit(DbPage *pD
11b80 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  ata){.  MemPage 
11b90 2a 70 50 61 67 65 3b 0a 20 20 70 50 61 67 65 20  *pPage;.  pPage 
11ba0 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c  = (MemPage *)sql
11bb0 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
11bc0 61 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65  a(pData);.  asse
11bd0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
11be0 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61  PageRefcount(pDa
11bf0 74 61 29 3e 30 20 29 3b 0a 20 20 69 66 28 20 70  ta)>0 );.  if( p
11c00 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a  Page->isInit ){.
11c10 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
11c20 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
11c30 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
11c40 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) );.    pPage->
11c50 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20  isInit = 0;.    
11c60 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  if( sqlite3Pager
11c70 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61  PageRefcount(pDa
11c80 74 61 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f  ta)>1 ){.      /
11c90 2a 20 70 50 61 67 65 20 6d 69 67 68 74 20 6e 6f  * pPage might no
11ca0 74 20 62 65 20 61 20 62 74 72 65 65 20 70 61 67  t be a btree pag
11cb0 65 3b 20 20 69 74 20 6d 69 67 68 74 20 62 65 20  e;  it might be 
11cc0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
11cd0 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 70 74 72  .      ** or ptr
11ce0 6d 61 70 20 70 61 67 65 20 6f 72 20 61 20 66 72  map page or a fr
11cf0 65 65 20 70 61 67 65 2e 20 20 49 6e 20 74 68 6f  ee page.  In tho
11d00 73 65 20 63 61 73 65 73 2c 20 74 68 65 20 66 6f  se cases, the fo
11d10 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a  llowing.      **
11d20 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 49 6e   call to btreeIn
11d30 69 74 50 61 67 65 28 29 20 77 69 6c 6c 20 6c 69  itPage() will li
11d40 6b 65 6c 79 20 72 65 74 75 72 6e 20 53 51 4c 49  kely return SQLI
11d50 54 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20 20  TE_CORRUPT..    
11d60 20 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d    ** But no harm
11d70 20 69 73 20 64 6f 6e 65 20 62 79 20 74 68 69 73   is done by this
11d80 2e 20 20 41 6e 64 20 69 74 20 69 73 20 76 65 72  .  And it is ver
11d90 79 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  y important that
11da0 0a 20 20 20 20 20 20 2a 2a 20 62 74 72 65 65 49  .      ** btreeI
11db0 6e 69 74 50 61 67 65 28 29 20 62 65 20 63 61 6c  nitPage() be cal
11dc0 6c 65 64 20 6f 6e 20 65 76 65 72 79 20 62 74 72  led on every btr
11dd0 65 65 20 70 61 67 65 20 73 6f 20 77 65 20 6d 61  ee page so we ma
11de0 6b 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  ke.      ** the 
11df0 63 61 6c 6c 20 66 6f 72 20 65 76 65 72 79 20 70  call for every p
11e00 61 67 65 20 74 68 61 74 20 63 6f 6d 65 73 20 69  age that comes i
11e10 6e 20 66 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67  n for re-initing
11e20 2e 20 2a 2f 0a 20 20 20 20 20 20 62 74 72 65 65  . */.      btree
11e30 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b  InitPage(pPage);
11e40 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
11e50 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 62  .** Invoke the b
11e60 75 73 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20  usy handler for 
11e70 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74  a btree..*/.stat
11e80 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e 76 6f  ic int btreeInvo
11e90 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f  keBusyHandler(vo
11ea0 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 42 74 53  id *pArg){.  BtS
11eb0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74  hared *pBt = (Bt
11ec0 53 68 61 72 65 64 2a 29 70 41 72 67 3b 0a 20 20  Shared*)pArg;.  
11ed0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 64 62 20  assert( pBt->db 
11ee0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
11ef0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
11f00 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  pBt->db->mutex) 
11f10 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
11f20 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  te3InvokeBusyHan
11f30 64 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62  dler(&pBt->db->b
11f40 75 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a  usyHandler);.}..
11f50 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74  /*.** Open a dat
11f60 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a  abase file..** .
11f70 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  ** zFilename is 
11f80 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
11f90 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
11fa0 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
11fb0 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 61 6e 20  NULL.** then an 
11fc0 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61  ephemeral databa
11fd0 73 65 20 69 73 20 63 72 65 61 74 65 64 2e 20 20  se is created.  
11fe0 54 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61  The ephemeral da
11ff0 74 61 62 61 73 65 20 6d 69 67 68 74 0a 2a 2a 20  tabase might.** 
12000 62 65 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69  be exclusively i
12010 6e 20 6d 65 6d 6f 72 79 2c 20 6f 72 20 69 74 20  n memory, or it 
12020 6d 69 67 68 74 20 75 73 65 20 61 20 64 69 73 6b  might use a disk
12030 2d 62 61 73 65 64 20 6d 65 6d 6f 72 79 20 63 61  -based memory ca
12040 63 68 65 2e 0a 2a 2a 20 45 69 74 68 65 72 20 77  che..** Either w
12050 61 79 2c 20 74 68 65 20 65 70 68 65 6d 65 72 61  ay, the ephemera
12060 6c 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20  l database will 
12070 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  be automatically
12080 20 64 65 6c 65 74 65 64 20 0a 2a 2a 20 77 68 65   deleted .** whe
12090 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  n sqlite3BtreeCl
120a0 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  ose() is called.
120b0 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e  .**.** If zFilen
120c0 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a  ame is ":memory:
120d0 22 20 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d  " then an in-mem
120e0 6f 72 79 20 64 61 74 61 62 61 73 65 20 69 73 20  ory database is 
120f0 63 72 65 61 74 65 64 0a 2a 2a 20 74 68 61 74 20  created.** that 
12100 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  is automatically
12110 20 64 65 73 74 72 6f 79 65 64 20 77 68 65 6e 20   destroyed when 
12120 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a  it is closed..**
12130 0a 2a 2a 20 54 68 65 20 22 66 6c 61 67 73 22 20  .** The "flags" 
12140 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62  parameter is a b
12150 69 74 6d 61 73 6b 20 74 68 61 74 20 6d 69 67 68  itmask that migh
12160 74 20 63 6f 6e 74 61 69 6e 20 62 69 74 73 20 6c  t contain bits l
12170 69 6b 65 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49  ike.** BTREE_OMI
12180 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72  T_JOURNAL and/or
12190 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59 2e 0a 2a   BTREE_MEMORY..*
121a0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
121b0 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 20  base is already 
121c0 6f 70 65 6e 65 64 20 69 6e 20 74 68 65 20 73 61  opened in the sa
121d0 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  me database conn
121e0 65 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65  ection.** and we
121f0 20 61 72 65 20 69 6e 20 73 68 61 72 65 64 20 63   are in shared c
12200 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20  ache mode, then 
12210 74 68 65 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61  the open will fa
12220 69 6c 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51  il with an.** SQ
12230 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
12240 65 72 72 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f  error.  We canno
12250 74 20 61 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d  t allow two or m
12260 6f 72 65 20 42 74 53 68 61 72 65 64 0a 2a 2a 20  ore BtShared.** 
12270 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20 73  objects in the s
12280 61 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ame database con
12290 6e 65 63 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f  nection since do
122a0 69 6e 67 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64  ing so will lead
122b0 0a 2a 2a 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20  .** to problems 
122c0 77 69 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f  with locking..*/
122d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
122e0 65 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  eOpen(.  sqlite3
122f0 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
12300 20 2f 2a 20 56 46 53 20 74 6f 20 75 73 65 20 66   /* VFS to use f
12310 6f 72 20 74 68 69 73 20 62 2d 74 72 65 65 20 2a  or this b-tree *
12320 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
12330 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e  zFilename,  /* N
12340 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
12350 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42  containing the B
12360 54 72 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f  Tree database */
12370 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
12380 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73             /* As
12390 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73  sociated databas
123a0 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74  e handle */.  Bt
123b0 72 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20  ree **ppBtree,  
123c0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
123d0 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62   to new Btree ob
123e0 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68 65 72  ject written her
123f0 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
12400 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
12410 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  * Options */.  i
12420 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20  nt vfsFlags     
12430 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
12440 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74  passed through t
12450 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f  o sqlite3_vfs.xO
12460 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 42 74  pen() */.){.  Bt
12470 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 30 3b  Shared *pBt = 0;
12480 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12490 53 68 61 72 65 64 20 70 61 72 74 20 6f 66 20 62  Shared part of b
124a0 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a  tree structure *
124b0 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20  /.  Btree *p;   
124c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124d0 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20     /* Handle to 
124e0 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69  return */.  sqli
124f0 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
12500 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72  Open = 0;  /* Pr
12510 65 76 65 6e 74 73 20 61 20 72 61 63 65 20 63 6f  events a race co
12520 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20  ndition. Ticket 
12530 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72  #3537 */.  int r
12540 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
12550 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
12560 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 74 68  ult code from th
12570 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
12580 20 75 38 20 6e 52 65 73 65 72 76 65 3b 20 20 20   u8 nReserve;   
12590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125a0 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e 75 73 65  /* Byte of unuse
125b0 64 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20  d space on each 
125c0 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  page */.  unsign
125d0 65 64 20 63 68 61 72 20 7a 44 62 48 65 61 64 65  ed char zDbHeade
125e0 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61  r[100];  /* Data
125f0 62 61 73 65 20 68 65 61 64 65 72 20 63 6f 6e 74  base header cont
12600 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75  ent */..  /* Tru
12610 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 61 6e 20  e if opening an 
12620 65 70 68 65 6d 65 72 61 6c 2c 20 74 65 6d 70 6f  ephemeral, tempo
12630 72 61 72 79 20 64 61 74 61 62 61 73 65 20 2a 2f  rary database */
12640 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 54  .  const int isT
12650 65 6d 70 44 62 20 3d 20 7a 46 69 6c 65 6e 61 6d  empDb = zFilenam
12660 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d  e==0 || zFilenam
12670 65 5b 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53  e[0]==0;..  /* S
12680 65 74 20 74 68 65 20 76 61 72 69 61 62 6c 65 20  et the variable 
12690 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20  isMemdb to true 
126a0 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  for an in-memory
126b0 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20   database, or . 
126c0 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20   ** false for a 
126d0 66 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62  file-based datab
126e0 61 73 65 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  ase..  */.#ifdef
126f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
12700 4f 52 59 44 42 0a 20 20 63 6f 6e 73 74 20 69 6e  ORYDB.  const in
12710 74 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 23  t isMemdb = 0;.#
12720 65 6c 73 65 0a 20 20 63 6f 6e 73 74 20 69 6e 74  else.  const int
12730 20 69 73 4d 65 6d 64 62 20 3d 20 28 7a 46 69 6c   isMemdb = (zFil
12740 65 6e 61 6d 65 20 26 26 20 73 74 72 63 6d 70 28  ename && strcmp(
12750 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d  zFilename, ":mem
12760 6f 72 79 3a 22 29 3d 3d 30 29 0a 20 20 20 20 20  ory:")==0).     
12770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12780 20 20 7c 7c 20 28 69 73 54 65 6d 70 44 62 20 26    || (isTempDb &
12790 26 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d  & sqlite3TempInM
127a0 65 6d 6f 72 79 28 64 62 29 29 0a 20 20 20 20 20  emory(db)).     
127b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127c0 20 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 20 26    || (vfsFlags &
127d0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d   SQLITE_OPEN_MEM
127e0 4f 52 59 29 21 3d 30 3b 0a 23 65 6e 64 69 66 0a  ORY)!=0;.#endif.
127f0 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
12800 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56   );.  assert( pV
12810 66 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  fs!=0 );.  asser
12820 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
12830 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
12840 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 66   );.  assert( (f
12850 6c 61 67 73 26 30 78 66 66 29 3d 3d 66 6c 61 67  lags&0xff)==flag
12860 73 20 29 3b 20 20 20 2f 2a 20 66 6c 61 67 73 20  s );   /* flags 
12870 66 69 74 20 69 6e 20 38 20 62 69 74 73 20 2a 2f  fit in 8 bits */
12880 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61 20 42 54  ..  /* Only a BT
12890 52 45 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62  REE_SINGLE datab
128a0 61 73 65 20 63 61 6e 20 62 65 20 42 54 52 45 45  ase can be BTREE
128b0 5f 55 4e 4f 52 44 45 52 45 44 20 2a 2f 0a 20 20  _UNORDERED */.  
128c0 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 20 26  assert( (flags &
128d0 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44   BTREE_UNORDERED
128e0 29 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26  )==0 || (flags &
128f0 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 29 21 3d   BTREE_SINGLE)!=
12900 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 42 54 52  0 );..  /* A BTR
12910 45 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61  EE_SINGLE databa
12920 73 65 20 69 73 20 61 6c 77 61 79 73 20 61 20 74  se is always a t
12930 65 6d 70 6f 72 61 72 79 20 61 6e 64 2f 6f 72 20  emporary and/or 
12940 65 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 61  ephemeral */.  a
12950 73 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20  ssert( (flags & 
12960 42 54 52 45 45 5f 53 49 4e 47 4c 45 29 3d 3d 30  BTREE_SINGLE)==0
12970 20 7c 7c 20 69 73 54 65 6d 70 44 62 20 29 3b 0a   || isTempDb );.
12980 0a 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29  .  if( isMemdb )
12990 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 42  {.    flags |= B
129a0 54 52 45 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d  TREE_MEMORY;.  }
129b0 0a 20 20 69 66 28 20 28 76 66 73 46 6c 61 67 73  .  if( (vfsFlags
129c0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d   & SQLITE_OPEN_M
129d0 41 49 4e 5f 44 42 29 21 3d 30 20 26 26 20 28 69  AIN_DB)!=0 && (i
129e0 73 4d 65 6d 64 62 20 7c 7c 20 69 73 54 65 6d 70  sMemdb || isTemp
129f0 44 62 29 20 29 7b 0a 20 20 20 20 76 66 73 46 6c  Db) ){.    vfsFl
12a00 61 67 73 20 3d 20 28 76 66 73 46 6c 61 67 73 20  ags = (vfsFlags 
12a10 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  & ~SQLITE_OPEN_M
12a20 41 49 4e 5f 44 42 29 20 7c 20 53 51 4c 49 54 45  AIN_DB) | SQLITE
12a30 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20  _OPEN_TEMP_DB;. 
12a40 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33   }.  p = sqlite3
12a50 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f  MallocZero(sizeo
12a60 66 28 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28  f(Btree));.  if(
12a70 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72   !p ){.    retur
12a80 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
12a90 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e  KPT;.  }.  p->in
12aa0 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f  Trans = TRANS_NO
12ab0 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62  NE;.  p->db = db
12ac0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
12ad0 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
12ae0 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74  HE.  p->lock.pBt
12af0 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c 6f  ree = p;.  p->lo
12b00 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b 0a 23  ck.iTable = 1;.#
12b10 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69  endif..#if !defi
12b20 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
12b30 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26  SHARED_CACHE) &&
12b40 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
12b50 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20  _OMIT_DISKIO).  
12b60 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20  /*.  ** If this 
12b70 42 74 72 65 65 20 69 73 20 61 20 63 61 6e 64 69  Btree is a candi
12b80 64 61 74 65 20 66 6f 72 20 73 68 61 72 65 64 20  date for shared 
12b90 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20 66 69  cache, try to fi
12ba0 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74  nd an.  ** exist
12bb0 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f 62 6a  ing BtShared obj
12bc0 65 63 74 20 74 68 61 74 20 77 65 20 63 61 6e 20  ect that we can 
12bd0 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a  share with.  */.
12be0 20 20 69 66 28 20 69 73 54 65 6d 70 44 62 3d 3d    if( isTempDb==
12bf0 30 20 26 26 20 28 69 73 4d 65 6d 64 62 3d 3d 30  0 && (isMemdb==0
12c00 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 26 53 51   || (vfsFlags&SQ
12c10 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 21 3d  LITE_OPEN_URI)!=
12c20 30 29 20 29 7b 0a 20 20 20 20 69 66 28 20 76 66  0) ){.    if( vf
12c30 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  sFlags & SQLITE_
12c40 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45  OPEN_SHAREDCACHE
12c50 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46   ){.      int nF
12c60 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ilename = sqlite
12c70 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e  3Strlen30(zFilen
12c80 61 6d 65 29 2b 31 3b 0a 20 20 20 20 20 20 69 6e  ame)+1;.      in
12c90 74 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20  t nFullPathname 
12ca0 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  = pVfs->mxPathna
12cb0 6d 65 2b 31 3b 0a 20 20 20 20 20 20 63 68 61 72  me+1;.      char
12cc0 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20   *zFullPathname 
12cd0 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
12ce0 4d 41 58 28 6e 46 75 6c 6c 50 61 74 68 6e 61 6d  MAX(nFullPathnam
12cf0 65 2c 6e 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20  e,nFilename));. 
12d00 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43       MUTEX_LOGIC
12d10 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20  ( sqlite3_mutex 
12d20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a  *mutexShared; ).
12d30 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62  .      p->sharab
12d40 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66  le = 1;.      if
12d50 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ( !zFullPathname
12d60 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
12d70 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
12d80 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
12d90 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
12da0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
12db0 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20   isMemdb ){.    
12dc0 20 20 20 20 6d 65 6d 63 70 79 28 7a 46 75 6c 6c      memcpy(zFull
12dd0 50 61 74 68 6e 61 6d 65 2c 20 7a 46 69 6c 65 6e  Pathname, zFilen
12de0 61 6d 65 2c 20 6e 46 69 6c 65 6e 61 6d 65 29 3b  ame, nFilename);
12df0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
12e00 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
12e10 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
12e20 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (pVfs, zFilename
12e30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
12e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e50 20 20 20 20 20 6e 46 75 6c 6c 50 61 74 68 6e 61       nFullPathna
12e60 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  me, zFullPathnam
12e70 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
12e80 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
12e90 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75  sqlite3_free(zFu
12ea0 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
12eb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
12ec0 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ree(p);.        
12ed0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
12ee0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
12ef0 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  if SQLITE_THREAD
12f00 53 41 46 45 0a 20 20 20 20 20 20 6d 75 74 65 78  SAFE.      mutex
12f10 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65 33 4d 75  Open = sqlite3Mu
12f20 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
12f30 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4f 50 45  MUTEX_STATIC_OPE
12f40 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  N);.      sqlite
12f50 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75  3_mutex_enter(mu
12f60 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20  texOpen);.      
12f70 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71  mutexShared = sq
12f80 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
12f90 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
12fa0 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20  TIC_MASTER);.   
12fb0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
12fc0 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72  _enter(mutexShar
12fd0 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ed);.#endif.    
12fe0 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f 42 41 4c    for(pBt=GLOBAL
12ff0 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
13000 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
13010 74 29 3b 20 70 42 74 3b 20 70 42 74 3d 70 42 74  t); pBt; pBt=pBt
13020 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
13030 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
13040 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  Ref>0 );.       
13050 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a   if( 0==strcmp(z
13060 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71  FullPathname, sq
13070 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61  lite3PagerFilena
13080 6d 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  me(pBt->pPager, 
13090 30 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  0)).            
130a0 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50       && sqlite3P
130b0 61 67 65 72 56 66 73 28 70 42 74 2d 3e 70 50 61  agerVfs(pBt->pPa
130c0 67 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20  ger)==pVfs ){.  
130d0 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b          int iDb;
130e0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
130f0 44 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44  Db=db->nDb-1; iD
13100 62 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a 20 20  b>=0; iDb--){.  
13110 20 20 20 20 20 20 20 20 20 20 42 74 72 65 65 20            Btree 
13120 2a 70 45 78 69 73 74 69 6e 67 20 3d 20 64 62 2d  *pExisting = db-
13130 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20  >aDb[iDb].pBt;. 
13140 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
13150 45 78 69 73 74 69 6e 67 20 26 26 20 70 45 78 69  Existing && pExi
13160 73 74 69 6e 67 2d 3e 70 42 74 3d 3d 70 42 74 20  sting->pBt==pBt 
13170 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
13180 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
13190 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64  eave(mutexShared
131a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
131b0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
131c0 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b  eave(mutexOpen);
131d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
131e0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c  qlite3_free(zFul
131f0 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
13200 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
13210 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
13220 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
13230 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
13240 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  T;.            }
13250 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
13260 20 20 20 20 20 20 20 70 2d 3e 70 42 74 20 3d 20         p->pBt = 
13270 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70  pBt;.          p
13280 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  Bt->nRef++;.    
13290 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
132a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
132b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
132c0 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68  ex_leave(mutexSh
132d0 61 72 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  ared);.      sql
132e0 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50  ite3_free(zFullP
132f0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  athname);.    }.
13300 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
13310 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20  BUG.    else{.  
13320 20 20 20 20 2f 2a 20 49 6e 20 64 65 62 75 67 20      /* In debug 
13330 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c  mode, we mark al
13340 6c 20 70 65 72 73 69 73 74 65 6e 74 20 64 61 74  l persistent dat
13350 61 62 61 73 65 73 20 61 73 20 73 68 61 72 61 62  abases as sharab
13360 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e  le.      ** even
13370 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 20 6e   when they are n
13380 6f 74 2e 20 20 54 68 69 73 20 65 78 65 72 63 69  ot.  This exerci
13390 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ses the locking 
133a0 63 6f 64 65 20 61 6e 64 0a 20 20 20 20 20 20 2a  code and.      *
133b0 2a 20 67 69 76 65 73 20 6d 6f 72 65 20 6f 70 70  * gives more opp
133c0 6f 72 74 75 6e 69 74 79 20 66 6f 72 20 61 73 73  ortunity for ass
133d0 65 72 74 73 28 73 71 6c 69 74 65 33 5f 6d 75 74  erts(sqlite3_mut
133e0 65 78 5f 68 65 6c 64 28 29 29 0a 20 20 20 20 20  ex_held()).     
133f0 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 74   ** statements t
13400 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70  o find locking p
13410 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a  roblems..      *
13420 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61  /.      p->shara
13430 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23  ble = 1;.    }.#
13440 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66  endif.  }.#endif
13450 0a 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b  .  if( pBt==0 ){
13460 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54  .    /*.    ** T
13470 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
13480 65 72 74 73 20 6d 61 6b 65 20 73 75 72 65 20 74  erts make sure t
13490 68 61 74 20 73 74 72 75 63 74 75 72 65 73 20 75  hat structures u
134a0 73 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65  sed by the btree
134b0 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20   are.    ** the 
134c0 72 69 67 68 74 20 73 69 7a 65 2e 20 20 54 68 69  right size.  Thi
134d0 73 20 69 73 20 74 6f 20 67 75 61 72 64 20 61 67  s is to guard ag
134e0 61 69 6e 73 74 20 73 69 7a 65 20 63 68 61 6e 67  ainst size chang
134f0 65 73 20 74 68 61 74 20 72 65 73 75 6c 74 0a 20  es that result. 
13500 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69     ** when compi
13510 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66 66 65 72  ling on a differ
13520 65 6e 74 20 61 72 63 68 69 74 65 63 74 75 72 65  ent architecture
13530 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
13540 65 72 74 28 20 73 69 7a 65 6f 66 28 69 36 34 29  ert( sizeof(i64)
13550 3d 3d 38 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==8 );.    asser
13560 74 28 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d  t( sizeof(u64)==
13570 38 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  8 );.    assert(
13580 20 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20   sizeof(u32)==4 
13590 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
135a0 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b  izeof(u16)==2 );
135b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
135c0 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a  eof(Pgno)==4 );.
135d0 20 20 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c    .    pBt = sql
135e0 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
135f0 73 69 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a  sizeof(*pBt) );.
13600 20 20 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29      if( pBt==0 )
13610 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
13620 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
13630 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
13640 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d  _open_out;.    }
13650 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
13660 33 50 61 67 65 72 4f 70 65 6e 28 70 56 66 73 2c  3PagerOpen(pVfs,
13670 20 26 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a   &pBt->pPager, z
13680 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20  Filename,.      
13690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136a0 20 20 20 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61      sizeof(MemPa
136b0 67 65 29 2c 20 66 6c 61 67 73 2c 20 76 66 73 46  ge), flags, vfsF
136c0 6c 61 67 73 2c 20 70 61 67 65 52 65 69 6e 69 74  lags, pageReinit
136d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
136e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
136f0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
13700 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e  tMmapLimit(pBt->
13710 70 50 61 67 65 72 2c 20 64 62 2d 3e 73 7a 4d 6d  pPager, db->szMm
13720 61 70 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ap);.      rc = 
13730 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 64  sqlite3PagerRead
13740 46 69 6c 65 68 65 61 64 65 72 28 70 42 74 2d 3e  Fileheader(pBt->
13750 70 50 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44  pPager,sizeof(zD
13760 62 48 65 61 64 65 72 29 2c 7a 44 62 48 65 61 64  bHeader),zDbHead
13770 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  er);.    }.    i
13780 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
13790 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62   ){.      goto b
137a0 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20  tree_open_out;. 
137b0 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 6f 70     }.    pBt->op
137c0 65 6e 46 6c 61 67 73 20 3d 20 28 75 38 29 66 6c  enFlags = (u8)fl
137d0 61 67 73 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62  ags;.    pBt->db
137e0 20 3d 20 64 62 3b 0a 20 20 20 20 73 71 6c 69 74   = db;.    sqlit
137f0 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61  e3PagerSetBusyha
13800 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50 61 67 65  ndler(pBt->pPage
13810 72 2c 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75  r, btreeInvokeBu
13820 73 79 48 61 6e 64 6c 65 72 2c 20 70 42 74 29 3b  syHandler, pBt);
13830 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42  .    p->pBt = pB
13840 74 3b 0a 20 20 0a 20 20 20 20 70 42 74 2d 3e 70  t;.  .    pBt->p
13850 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20  Cursor = 0;.    
13860 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b  pBt->pPage1 = 0;
13870 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
13880 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28  PagerIsreadonly(
13890 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 20 70  pBt->pPager) ) p
138a0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
138b0 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 23  BTS_READ_ONLY;.#
138c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43  ifdef SQLITE_SEC
138d0 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 70  URE_DELETE.    p
138e0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
138f0 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
13900 45 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a  E;.#endif.    /*
13910 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
13920 35 31 38 37 33 2d 33 39 36 31 38 20 54 68 65 20  51873-39618 The 
13930 70 61 67 65 20 73 69 7a 65 20 66 6f 72 20 61 20  page size for a 
13940 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
13950 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e  .    ** determin
13960 65 64 20 62 79 20 74 68 65 20 32 2d 62 79 74 65  ed by the 2-byte
13970 20 69 6e 74 65 67 65 72 20 6c 6f 63 61 74 65 64   integer located
13980 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66   at an offset of
13990 20 31 36 20 62 79 74 65 73 20 66 72 6f 6d 0a 20   16 bytes from. 
139a0 20 20 20 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e     ** the beginn
139b0 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61 62  ing of the datab
139c0 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  ase file. */.   
139d0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
139e0 20 28 7a 44 62 48 65 61 64 65 72 5b 31 36 5d 3c   (zDbHeader[16]<
139f0 3c 38 29 20 7c 20 28 7a 44 62 48 65 61 64 65 72  <8) | (zDbHeader
13a00 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69  [17]<<16);.    i
13a10 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  f( pBt->pageSize
13a20 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67  <512 || pBt->pag
13a30 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58  eSize>SQLITE_MAX
13a40 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20  _PAGE_SIZE.     
13a50 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61      || ((pBt->pa
13a60 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70  geSize-1)&pBt->p
13a70 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20  ageSize)!=0 ){. 
13a80 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69       pBt->pageSi
13a90 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  ze = 0;.#ifndef 
13aa0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
13ab0 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20  VACUUM.      /* 
13ac0 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d  If the magic nam
13ad0 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c  e ":memory:" wil
13ae0 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d  l create an in-m
13af0 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20  emory database, 
13b00 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65  then.      ** le
13b10 61 76 65 20 74 68 65 20 61 75 74 6f 56 61 63 75  ave the autoVacu
13b20 75 6d 20 6d 6f 64 65 20 61 74 20 30 20 28 64 6f  um mode at 0 (do
13b30 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75 75 6d   not auto-vacuum
13b40 29 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20 20  ), even if.     
13b50 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55   ** SQLITE_DEFAU
13b60 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73  LT_AUTOVACUUM is
13b70 20 74 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74   true. On the ot
13b80 68 65 72 20 68 61 6e 64 2c 20 69 66 0a 20 20 20  her hand, if.   
13b90 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49     ** SQLITE_OMI
13ba0 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62  T_MEMORYDB has b
13bb0 65 65 6e 20 64 65 66 69 6e 65 64 2c 20 74 68 65  een defined, the
13bc0 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20  n ":memory:" is 
13bd0 6a 75 73 74 20 61 0a 20 20 20 20 20 20 2a 2a 20  just a.      ** 
13be0 72 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d  regular file-nam
13bf0 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
13c00 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  the auto-vacuum 
13c10 61 70 70 6c 69 65 73 20 61 73 20 70 65 72 20 6e  applies as per n
13c20 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a  ormal..      */.
13c30 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e        if( zFilen
13c40 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20  ame && !isMemdb 
13c50 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  ){.        pBt->
13c60 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 53 51  autoVacuum = (SQ
13c70 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
13c80 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a 20 30 29  OVACUUM ? 1 : 0)
13c90 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69  ;.        pBt->i
13ca0 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 53 51 4c  ncrVacuum = (SQL
13cb0 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
13cc0 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20  VACUUM==2 ? 1 : 
13cd0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  0);.      }.#end
13ce0 69 66 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76  if.      nReserv
13cf0 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  e = 0;.    }else
13d00 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  {.      /* EVIDE
13d10 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37 2d  NCE-OF: R-37497-
13d20 34 32 34 31 32 20 54 68 65 20 73 69 7a 65 20 6f  42412 The size o
13d30 66 20 74 68 65 20 72 65 73 65 72 76 65 64 20 72  f the reserved r
13d40 65 67 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a  egion is.      *
13d50 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  * determined by 
13d60 74 68 65 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73  the one-byte uns
13d70 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66 6f  igned integer fo
13d80 75 6e 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74  und at an offset
13d90 20 6f 66 20 32 30 0a 20 20 20 20 20 20 2a 2a 20   of 20.      ** 
13da0 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
13db0 65 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 2a  e file header. *
13dc0 2f 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65  /.      nReserve
13dd0 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 30 5d   = zDbHeader[20]
13de0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73  ;.      pBt->bts
13df0 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47  Flags |= BTS_PAG
13e00 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66  ESIZE_FIXED;.#if
13e10 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13e20 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
13e30 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
13e40 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a  m = (get4byte(&z
13e50 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 34 2a  DbHeader[36 + 4*
13e60 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20  4])?1:0);.      
13e70 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
13e80 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62  = (get4byte(&zDb
13e90 48 65 61 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d  Header[36 + 7*4]
13ea0 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20  )?1:0);.#endif. 
13eb0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
13ec0 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
13ed0 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
13ee0 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  r, &pBt->pageSiz
13ef0 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20  e, nReserve);.  
13f00 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
13f10 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a  btree_open_out;.
13f20 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53      pBt->usableS
13f30 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53  ize = pBt->pageS
13f40 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a  ize - nReserve;.
13f50 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42 74      assert( (pBt
13f60 2d 3e 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d  ->pageSize & 7)=
13f70 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65  =0 );  /* 8-byte
13f80 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61   alignment of pa
13f90 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a 23 69  geSize */.   .#i
13fa0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
13fb0 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
13fc0 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  CHE) && !defined
13fd0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53  (SQLITE_OMIT_DIS
13fe0 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64 20  KIO).    /* Add 
13ff0 74 68 65 20 6e 65 77 20 42 74 53 68 61 72 65 64  the new BtShared
14000 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 6c   object to the l
14010 69 6e 6b 65 64 20 6c 69 73 74 20 73 68 61 72 61  inked list shara
14020 62 6c 65 20 42 74 53 68 61 72 65 64 73 2e 0a 20  ble BtShareds.. 
14030 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 6e     */.    pBt->n
14040 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  Ref = 1;.    if(
14050 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a   p->sharable ){.
14060 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49        MUTEX_LOGI
14070 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  C( sqlite3_mutex
14080 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29   *mutexShared; )
14090 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47  .      MUTEX_LOG
140a0 49 43 28 20 6d 75 74 65 78 53 68 61 72 65 64 20  IC( mutexShared 
140b0 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
140c0 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
140d0 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
140e0 29 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49  ).      if( SQLI
140f0 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26  TE_THREADSAFE &&
14100 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
14110 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20  nfig.bCoreMutex 
14120 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  ){.        pBt->
14130 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d  mutex = sqlite3M
14140 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
14150 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20  _MUTEX_FAST);.  
14160 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6d        if( pBt->m
14170 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  utex==0 ){.     
14180 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
14190 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
141a0 20 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65         goto btre
141b0 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
141c0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
141d0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
141e0 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61  x_enter(mutexSha
141f0 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  red);.      pBt-
14200 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28  >pNext = GLOBAL(
14210 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
14220 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
14230 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28  );.      GLOBAL(
14240 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
14250 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
14260 29 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 73  ) = pBt;.      s
14270 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
14280 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  ve(mutexShared);
14290 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
142a0 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
142b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
142c0 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65  ED_CACHE) && !de
142d0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
142e0 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49  T_DISKIO).  /* I
142f0 66 20 74 68 65 20 6e 65 77 20 42 74 72 65 65 20  f the new Btree 
14300 75 73 65 73 20 61 20 73 68 61 72 61 62 6c 65 20  uses a sharable 
14310 70 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e 20  pBtShared, then 
14320 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a  link the new.  *
14330 2a 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68 65  * Btree into the
14340 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68 61   list of all sha
14350 72 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f 72  rable Btrees for
14360 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63   the same connec
14370 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c  tion..  ** The l
14380 69 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20 61  ist is kept in a
14390 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62  scending order b
143a0 79 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a 20  y pBt address.. 
143b0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68 61   */.  if( p->sha
143c0 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74  rable ){.    int
143d0 20 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70   i;.    Btree *p
143e0 53 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  Sib;.    for(i=0
143f0 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
14400 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53  ){.      if( (pS
14410 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  ib = db->aDb[i].
14420 70 42 74 29 21 3d 30 20 26 26 20 70 53 69 62 2d  pBt)!=0 && pSib-
14430 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
14440 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62       while( pSib
14450 2d 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62 20  ->pPrev ){ pSib 
14460 3d 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d  = pSib->pPrev; }
14470 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 75 70  .        if( (up
14480 74 72 29 70 2d 3e 70 42 74 3c 28 75 70 74 72 29  tr)p->pBt<(uptr)
14490 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20  pSib->pBt ){.   
144a0 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20         p->pNext 
144b0 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20  = pSib;.        
144c0 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a    p->pPrev = 0;.
144d0 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e            pSib->
144e0 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20  pPrev = p;.     
144f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14500 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d      while( pSib-
14510 3e 70 4e 65 78 74 20 26 26 20 28 75 70 74 72 29  >pNext && (uptr)
14520 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74  pSib->pNext->pBt
14530 3c 28 75 70 74 72 29 70 2d 3e 70 42 74 20 29 7b  <(uptr)p->pBt ){
14540 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53 69  .            pSi
14550 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b  b = pSib->pNext;
14560 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
14570 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20         p->pNext 
14580 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20  = pSib->pNext;. 
14590 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65           p->pPre
145a0 76 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20  v = pSib;.      
145b0 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74      if( p->pNext
145c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
145d0 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  p->pNext->pPrev 
145e0 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = p;.          }
145f0 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d  .          pSib-
14600 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20  >pNext = p;.    
14610 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
14620 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
14630 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
14640 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62  *ppBtree = p;..b
14650 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20  tree_open_out:. 
14660 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
14670 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42  OK ){.    if( pB
14680 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72  t && pBt->pPager
14690 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
146a0 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d  3PagerClose(pBt-
146b0 3e 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20  >pPager, 0);.   
146c0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
146d0 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71  ree(pBt);.    sq
146e0 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
146f0 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20 30 3b     *ppBtree = 0;
14700 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
14710 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
14720 65 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  e;..    /* If th
14730 65 20 42 2d 54 72 65 65 20 77 61 73 20 73 75 63  e B-Tree was suc
14740 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64  cessfully opened
14750 2c 20 73 65 74 20 74 68 65 20 70 61 67 65 72 2d  , set the pager-
14760 63 61 63 68 65 20 73 69 7a 65 20 74 6f 20 74 68  cache size to th
14770 65 0a 20 20 20 20 2a 2a 20 64 65 66 61 75 6c 74  e.    ** default
14780 20 76 61 6c 75 65 2e 20 45 78 63 65 70 74 2c 20   value. Except, 
14790 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 6f 6e 20  when opening on 
147a0 61 6e 20 65 78 69 73 74 69 6e 67 20 73 68 61 72  an existing shar
147b0 65 64 20 70 61 67 65 72 2d 63 61 63 68 65 2c 0a  ed pager-cache,.
147c0 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 63 68      ** do not ch
147d0 61 6e 67 65 20 74 68 65 20 70 61 67 65 72 2d 63  ange the pager-c
147e0 61 63 68 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a  ache size..    *
147f0 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
14800 33 42 74 72 65 65 53 63 68 65 6d 61 28 70 2c 20  3BtreeSchema(p, 
14810 30 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20  0, 0)==0 ){.    
14820 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
14830 74 43 61 63 68 65 73 69 7a 65 28 70 2d 3e 70 42  tCachesize(p->pB
14840 74 2d 3e 70 50 61 67 65 72 2c 20 53 51 4c 49 54  t->pPager, SQLIT
14850 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f  E_DEFAULT_CACHE_
14860 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  SIZE);.    }..  
14870 20 20 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65    pFile = sqlite
14880 33 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e  3PagerFile(pBt->
14890 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
148a0 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73   pFile->pMethods
148b0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
148c0 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69  3OsFileControlHi
148d0 6e 74 28 70 46 69 6c 65 2c 20 53 51 4c 49 54 45  nt(pFile, SQLITE
148e0 5f 46 43 4e 54 4c 5f 50 44 42 2c 20 28 76 6f 69  _FCNTL_PDB, (voi
148f0 64 2a 29 26 70 42 74 2d 3e 64 62 29 3b 0a 20 20  d*)&pBt->db);.  
14900 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75    }.  }.  if( mu
14910 74 65 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61  texOpen ){.    a
14920 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
14930 75 74 65 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f  utex_held(mutexO
14940 70 65 6e 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  pen) );.    sqli
14950 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
14960 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a  mutexOpen);.  }.
14970 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
14980 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74  LITE_OK || sqlit
14990 65 33 42 74 72 65 65 43 6f 6e 6e 65 63 74 69 6f  e3BtreeConnectio
149a0 6e 43 6f 75 6e 74 28 2a 70 70 42 74 72 65 65 29  nCount(*ppBtree)
149b0 3e 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  >0 );.  return r
149c0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72  c;.}../*.** Decr
149d0 65 6d 65 6e 74 20 74 68 65 20 42 74 53 68 61 72  ement the BtShar
149e0 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e  ed.nRef counter.
149f0 20 20 57 68 65 6e 20 69 74 20 72 65 61 63 68 65    When it reache
14a00 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76  s zero,.** remov
14a10 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73  e the BtShared s
14a20 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68  tructure from th
14a30 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2e 20  e sharing list. 
14a40 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20   Return.** true 
14a50 69 66 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  if the BtShared.
14a60 6e 52 65 66 20 63 6f 75 6e 74 65 72 20 72 65 61  nRef counter rea
14a70 63 68 65 73 20 7a 65 72 6f 20 61 6e 64 20 72 65  ches zero and re
14a80 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66  turn.** false if
14a90 20 69 74 20 69 73 20 73 74 69 6c 6c 20 70 6f 73   it is still pos
14aa0 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  itive..*/.static
14ab0 20 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53   int removeFromS
14ac0 68 61 72 69 6e 67 4c 69 73 74 28 42 74 53 68 61  haringList(BtSha
14ad0 72 65 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64  red *pBt){.#ifnd
14ae0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
14af0 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 4d 55  HARED_CACHE.  MU
14b00 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74  TEX_LOGIC( sqlit
14b10 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65  e3_mutex *pMaste
14b20 72 3b 20 29 0a 20 20 42 74 53 68 61 72 65 64 20  r; ).  BtShared 
14b30 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72 65  *pList;.  int re
14b40 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73  moved = 0;..  as
14b50 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
14b60 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d  tex_notheld(pBt-
14b70 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 4d 55 54  >mutex) );.  MUT
14b80 45 58 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74 65  EX_LOGIC( pMaste
14b90 72 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  r = sqlite3Mutex
14ba0 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
14bb0 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
14bc0 29 3b 20 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ); ).  sqlite3_m
14bd0 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74  utex_enter(pMast
14be0 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66  er);.  pBt->nRef
14bf0 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e  --;.  if( pBt->n
14c00 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66  Ref<=0 ){.    if
14c10 28 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  ( GLOBAL(BtShare
14c20 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
14c30 43 61 63 68 65 4c 69 73 74 29 3d 3d 70 42 74 20  CacheList)==pBt 
14c40 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28  ){.      GLOBAL(
14c50 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
14c60 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
14c70 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a  ) = pBt->pNext;.
14c80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14c90 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28   pList = GLOBAL(
14ca0 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
14cb0 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
14cc0 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  );.      while( 
14cd0 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 26 26  ALWAYS(pList) &&
14ce0 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70   pList->pNext!=p
14cf0 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  Bt ){.        pL
14d00 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74  ist=pList->pNext
14d10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14d20 69 66 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74  if( ALWAYS(pList
14d30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69  ) ){.        pLi
14d40 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d  st->pNext = pBt-
14d50 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
14d60 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 53 51      }.    if( SQ
14d70 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20  LITE_THREADSAFE 
14d80 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
14d90 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 42 74 2d  _mutex_free(pBt-
14da0 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20  >mutex);.    }. 
14db0 20 20 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a     removed = 1;.
14dc0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
14dd0 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65  tex_leave(pMaste
14de0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 6d  r);.  return rem
14df0 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65  oved;.#else.  re
14e00 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d  turn 1;.#endif.}
14e10 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
14e20 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  e pBt->pTmpSpace
14e30 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c   points to an al
14e40 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20  location of .** 
14e50 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74  MX_CELL_SIZE(pBt
14e60 29 20 62 79 74 65 73 20 77 69 74 68 20 61 20 34  ) bytes with a 4
14e70 2d 62 79 74 65 20 70 72 65 66 69 78 20 66 6f 72  -byte prefix for
14e80 20 61 20 6c 65 66 74 2d 63 68 69 6c 64 0a 2a 2a   a left-child.**
14e90 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61   pointer..*/.sta
14ea0 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74  tic void allocat
14eb0 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61  eTempSpace(BtSha
14ec0 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28  red *pBt){.  if(
14ed0 20 21 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65   !pBt->pTmpSpace
14ee0 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d   ){.    pBt->pTm
14ef0 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33  pSpace = sqlite3
14f00 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d  PageMalloc( pBt-
14f10 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 0a 20 20  >pageSize );..  
14f20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
14f30 75 73 65 73 20 6f 66 20 70 42 74 2d 3e 70 54 6d  uses of pBt->pTm
14f40 70 53 70 61 63 65 20 69 73 20 74 6f 20 66 6f 72  pSpace is to for
14f50 6d 61 74 20 63 65 6c 6c 73 20 62 65 66 6f 72 65  mat cells before
14f60 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 69 6e  .    ** insertin
14f70 67 20 74 68 65 6d 20 69 6e 74 6f 20 61 20 6c 65  g them into a le
14f80 61 66 20 70 61 67 65 20 28 66 75 6e 63 74 69 6f  af page (functio
14f90 6e 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 29 2e  n fillInCell()).
14fa0 20 49 66 0a 20 20 20 20 2a 2a 20 61 20 63 65 6c   If.    ** a cel
14fb0 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 34  l is less than 4
14fc0 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20   bytes in size, 
14fd0 69 74 20 69 73 20 72 6f 75 6e 64 65 64 20 75 70  it is rounded up
14fe0 20 74 6f 20 34 20 62 79 74 65 73 0a 20 20 20 20   to 4 bytes.    
14ff0 2a 2a 20 62 79 20 74 68 65 20 76 61 72 69 6f 75  ** by the variou
15000 73 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20  s routines that 
15010 6d 61 6e 69 70 75 6c 61 74 65 20 62 69 6e 61 72  manipulate binar
15020 79 20 63 65 6c 6c 73 2e 20 57 68 69 63 68 0a 20  y cells. Which. 
15030 20 20 20 2a 2a 20 63 61 6e 20 6d 65 61 6e 20 74     ** can mean t
15040 68 61 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29  hat fillInCell()
15050 20 6f 6e 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65   only initialize
15060 73 20 74 68 65 20 66 69 72 73 74 20 32 20 6f 72  s the first 2 or
15070 20 33 0a 20 20 20 20 2a 2a 20 62 79 74 65 73 20   3.    ** bytes 
15080 6f 66 20 70 54 6d 70 53 70 61 63 65 2c 20 62 75  of pTmpSpace, bu
15090 74 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74  t that the first
150a0 20 34 20 62 79 74 65 73 20 61 72 65 20 63 6f 70   4 bytes are cop
150b0 69 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  ied from.    ** 
150c0 69 74 20 69 6e 74 6f 20 61 20 64 61 74 61 62 61  it into a databa
150d0 73 65 20 70 61 67 65 2e 20 54 68 69 73 20 69 73  se page. This is
150e0 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 61 20   not actually a 
150f0 70 72 6f 62 6c 65 6d 2c 20 62 75 74 20 69 74 0a  problem, but it.
15100 20 20 20 20 2a 2a 20 64 6f 65 73 20 63 61 75 73      ** does caus
15110 65 20 61 20 76 61 6c 67 72 69 6e 64 20 65 72 72  e a valgrind err
15120 6f 72 20 77 68 65 6e 20 74 68 65 20 31 20 6f 72  or when the 1 or
15130 20 32 20 62 79 74 65 73 20 6f 66 20 75 6e 69 74   2 bytes of unit
15140 69 61 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a 20  ialized .    ** 
15150 64 61 74 61 20 69 73 20 70 61 73 73 65 64 20 74  data is passed t
15160 6f 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 77 72  o system call wr
15170 69 74 65 28 29 2e 20 53 6f 20 74 6f 20 61 76 6f  ite(). So to avo
15180 69 64 20 74 68 69 73 20 65 72 72 6f 72 2c 0a 20  id this error,. 
15190 20 20 20 2a 2a 20 7a 65 72 6f 20 74 68 65 20 66     ** zero the f
151a0 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66 20  irst 4 bytes of 
151b0 74 65 6d 70 20 73 70 61 63 65 20 68 65 72 65 2e  temp space here.
151c0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41  .    **.    ** A
151d0 6c 73 6f 3a 20 20 50 72 6f 76 69 64 65 20 66 6f  lso:  Provide fo
151e0 75 72 20 62 79 74 65 73 20 6f 66 20 69 6e 69 74  ur bytes of init
151f0 69 61 6c 69 7a 65 64 20 73 70 61 63 65 20 62 65  ialized space be
15200 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  fore the.    ** 
15210 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 54 6d  beginning of pTm
15220 70 53 70 61 63 65 20 61 73 20 61 6e 20 61 72 65  pSpace as an are
15230 61 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 70  a available to p
15240 72 65 70 65 6e 64 20 74 68 65 0a 20 20 20 20 2a  repend the.    *
15250 2a 20 6c 65 66 74 2d 63 68 69 6c 64 20 70 6f 69  * left-child poi
15260 6e 74 65 72 20 74 6f 20 74 68 65 20 62 65 67 69  nter to the begi
15270 6e 6e 69 6e 67 20 6f 66 20 61 20 63 65 6c 6c 2e  nning of a cell.
15280 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
15290 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29  pBt->pTmpSpace )
152a0 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  {.      memset(p
152b0 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 2c 20 30  Bt->pTmpSpace, 0
152c0 2c 20 38 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  , 8);.      pBt-
152d0 3e 70 54 6d 70 53 70 61 63 65 20 2b 3d 20 34 3b  >pTmpSpace += 4;
152e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
152f0 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70 42 74  .** Free the pBt
15300 2d 3e 70 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f  ->pTmpSpace allo
15310 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  cation.*/.static
15320 20 76 6f 69 64 20 66 72 65 65 54 65 6d 70 53 70   void freeTempSp
15330 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ace(BtShared *pB
15340 74 29 7b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70  t){.  if( pBt->p
15350 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20  TmpSpace ){.    
15360 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 2d  pBt->pTmpSpace -
15370 3d 20 34 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 4;.    sqlite3
15380 50 61 67 65 46 72 65 65 28 70 42 74 2d 3e 70 54  PageFree(pBt->pT
15390 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 70 42  mpSpace);.    pB
153a0 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 30  t->pTmpSpace = 0
153b0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
153c0 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74  lose an open dat
153d0 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69  abase and invali
153e0 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  date all cursors
153f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
15400 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65  BtreeClose(Btree
15410 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
15420 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
15430 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
15440 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c  ;..  /* Close al
15450 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64  l cursors opened
15460 20 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65   via this handle
15470 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
15480 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
15490 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
154a0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
154b0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 43  eeEnter(p);.  pC
154c0 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f  ur = pBt->pCurso
154d0 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72  r;.  while( pCur
154e0 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72   ){.    BtCursor
154f0 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20   *pTmp = pCur;. 
15500 20 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e     pCur = pCur->
15510 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70  pNext;.    if( p
15520 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  Tmp->pBtree==p )
15530 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
15540 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28  treeCloseCursor(
15550 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pTmp);.    }.  }
15560 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20  ..  /* Rollback 
15570 61 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e 73  any active trans
15580 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20  action and free 
15590 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63  the handle struc
155a0 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63  ture..  ** The c
155b0 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74  all to sqlite3Bt
155c0 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72  reeRollback() dr
155d0 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f  ops any table-lo
155e0 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a  cks held by.  **
155f0 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20   this handle..  
15600 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  */.  sqlite3Btre
15610 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 53 51 4c  eRollback(p, SQL
15620 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73 71  ITE_OK, 0);.  sq
15630 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
15640 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
15650 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68  re are still oth
15660 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  er outstanding r
15670 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
15680 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20   shared-btree.  
15690 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 72 65  ** structure, re
156a0 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65  turn now. The re
156b0 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20  mainder of this 
156c0 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73  procedure cleans
156d0 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68   .  ** up the sh
156e0 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f  ared-btree..  */
156f0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61  .  assert( p->wa
15700 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70  ntToLock==0 && p
15710 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20  ->locked==0 );. 
15720 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
15730 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53  e || removeFromS
15740 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20  haringList(pBt) 
15750 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42  ){.    /* The pB
15760 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f  t is no longer o
15770 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69  n the sharing li
15780 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63  st, so we can ac
15790 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77  cess.    ** it w
157a0 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
157b0 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e   hold the mutex.
157c0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43  .    **.    ** C
157d0 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c  lean out and del
157e0 65 74 65 20 74 68 65 20 42 74 53 68 61 72 65 64  ete the BtShared
157f0 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a   object..    */.
15800 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
15810 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20  ->pCursor );.   
15820 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
15830 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  se(pBt->pPager, 
15840 70 2d 3e 64 62 29 3b 0a 20 20 20 20 69 66 28 20  p->db);.    if( 
15850 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61  pBt->xFreeSchema
15860 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d 61   && pBt->pSchema
15870 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 78   ){.      pBt->x
15880 46 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d 3e  FreeSchema(pBt->
15890 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a  pSchema);.    }.
158a0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
158b0 65 28 30 2c 20 70 42 74 2d 3e 70 53 63 68 65 6d  e(0, pBt->pSchem
158c0 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70  a);.    freeTemp
158d0 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
158e0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74  sqlite3_free(pBt
158f0 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  );.  }..#ifndef 
15900 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
15910 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65 72  ED_CACHE.  asser
15920 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b  t( p->wantToLock
15930 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
15940 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b   p->locked==0 );
15950 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20  .  if( p->pPrev 
15960 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  ) p->pPrev->pNex
15970 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  t = p->pNext;.  
15980 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70  if( p->pNext ) p
15990 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
159a0 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69   p->pPrev;.#endi
159b0 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  f..  sqlite3_fre
159c0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
159d0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
159e0 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 22 73  ** Change the "s
159f0 6f 66 74 22 20 6c 69 6d 69 74 20 6f 6e 20 74 68  oft" limit on th
15a00 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
15a10 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a  s in the cache..
15a20 2a 2a 20 55 6e 75 73 65 64 20 61 6e 64 20 75 6e  ** Unused and un
15a30 6d 6f 64 69 66 69 65 64 20 70 61 67 65 73 20 77  modified pages w
15a40 69 6c 6c 20 62 65 20 72 65 63 79 63 6c 65 64 20  ill be recycled 
15a50 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  when the number 
15a60 6f 66 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20 74  of.** pages in t
15a70 68 65 20 63 61 63 68 65 20 65 78 63 65 65 64 73  he cache exceeds
15a80 20 74 68 69 73 20 73 6f 66 74 20 6c 69 6d 69 74   this soft limit
15a90 2e 20 20 42 75 74 20 74 68 65 20 73 69 7a 65 20  .  But the size 
15aa0 6f 66 20 74 68 65 0a 2a 2a 20 63 61 63 68 65 20  of the.** cache 
15ab0 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 67 72  is allowed to gr
15ac0 6f 77 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  ow larger than t
15ad0 68 69 73 20 6c 69 6d 69 74 20 69 66 20 69 74 20  his limit if it 
15ae0 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 64 69 72 74  contains.** dirt
15af0 79 20 70 61 67 65 73 20 6f 72 20 70 61 67 65 73  y pages or pages
15b00 20 73 74 69 6c 6c 20 69 6e 20 61 63 74 69 76 65   still in active
15b10 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   use..*/.int sql
15b20 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68  ite3BtreeSetCach
15b30 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20  eSize(Btree *p, 
15b40 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42  int mxPage){.  B
15b50 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
15b60 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
15b70 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
15b80 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
15b90 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
15ba0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73  reeEnter(p);.  s
15bb0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61  qlite3PagerSetCa
15bc0 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  chesize(pBt->pPa
15bd0 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20  ger, mxPage);.  
15be0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
15bf0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
15c00 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
15c10 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 22 73  ** Change the "s
15c20 70 69 6c 6c 22 20 6c 69 6d 69 74 20 6f 6e 20 74  pill" limit on t
15c30 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
15c40 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e  es in the cache.
15c50 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65  .** If the numbe
15c60 72 20 6f 66 20 70 61 67 65 73 20 65 78 63 65 65  r of pages excee
15c70 64 73 20 74 68 69 73 20 6c 69 6d 69 74 20 64 75  ds this limit du
15c80 72 69 6e 67 20 61 20 77 72 69 74 65 20 74 72 61  ring a write tra
15c90 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65  nsaction,.** the
15ca0 20 70 61 67 65 72 20 6d 69 67 68 74 20 61 74 74   pager might att
15cb0 65 6d 70 74 20 74 6f 20 22 73 70 69 6c 6c 22 20  empt to "spill" 
15cc0 70 61 67 65 73 20 74 6f 20 74 68 65 20 6a 6f 75  pages to the jou
15cd0 72 6e 61 6c 20 65 61 72 6c 79 20 69 6e 0a 2a 2a  rnal early in.**
15ce0 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20 75   order to free u
15cf0 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20  p memory..**.** 
15d00 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
15d10 65 64 20 69 73 20 74 68 65 20 63 75 72 72 65 6e  ed is the curren
15d20 74 20 73 70 69 6c 6c 20 73 69 7a 65 2e 20 20 49  t spill size.  I
15d30 66 20 7a 65 72 6f 20 69 73 20 70 61 73 73 65 64  f zero is passed
15d40 0a 2a 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65  .** as an argume
15d50 6e 74 2c 20 6e 6f 20 63 68 61 6e 67 65 73 20 61  nt, no changes a
15d60 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 73  re made to the s
15d70 70 69 6c 6c 20 73 69 7a 65 20 73 65 74 74 69 6e  pill size settin
15d80 67 2c 20 73 6f 0a 2a 2a 20 75 73 69 6e 67 20 6d  g, so.** using m
15d90 78 50 61 67 65 20 6f 66 20 30 20 69 73 20 61 20  xPage of 0 is a 
15da0 77 61 79 20 74 6f 20 71 75 65 72 79 20 74 68 65  way to query the
15db0 20 63 75 72 72 65 6e 74 20 73 70 69 6c 6c 20 73   current spill s
15dc0 69 7a 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ize..*/.int sqli
15dd0 74 65 33 42 74 72 65 65 53 65 74 53 70 69 6c 6c  te3BtreeSetSpill
15de0 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69  Size(Btree *p, i
15df0 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74  nt mxPage){.  Bt
15e00 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
15e10 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 65 73 3b  >pBt;.  int res;
15e20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
15e30 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
15e40 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
15e50 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
15e60 65 72 28 70 29 3b 0a 20 20 72 65 73 20 3d 20 73  er(p);.  res = s
15e70 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 70  qlite3PagerSetSp
15e80 69 6c 6c 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  illsize(pBt->pPa
15e90 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20  ger, mxPage);.  
15ea0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
15eb0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
15ec0 65 73 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  es;.}..#if SQLIT
15ed0 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
15ee0 30 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  0./*.** Change t
15ef0 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20  he limit on the 
15f00 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 64 61  amount of the da
15f10 74 61 62 61 73 65 20 66 69 6c 65 20 74 68 61 74  tabase file that
15f20 20 6d 61 79 20 62 65 0a 2a 2a 20 6d 65 6d 6f 72   may be.** memor
15f30 79 20 6d 61 70 70 65 64 2e 0a 2a 2f 0a 69 6e 74  y mapped..*/.int
15f40 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
15f50 4d 6d 61 70 4c 69 6d 69 74 28 42 74 72 65 65 20  MmapLimit(Btree 
15f60 2a 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  *p, sqlite3_int6
15f70 34 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 42 74 53  4 szMmap){.  BtS
15f80 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
15f90 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
15fa0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
15fb0 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
15fc0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
15fd0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c  eEnter(p);.  sql
15fe0 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70  ite3PagerSetMmap
15ff0 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65  Limit(pBt->pPage
16000 72 2c 20 73 7a 4d 6d 61 70 29 3b 0a 20 20 73 71  r, szMmap);.  sq
16010 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
16020 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
16030 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
16040 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d   /* SQLITE_MAX_M
16050 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f  MAP_SIZE>0 */../
16060 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
16070 77 61 79 20 64 61 74 61 20 69 73 20 73 79 6e 63  way data is sync
16080 65 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72  ed to disk in or
16090 64 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20  der to increase 
160a0 6f 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68  or decrease.** h
160b0 6f 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61  ow well the data
160c0 62 61 73 65 20 72 65 73 69 73 74 73 20 64 61 6d  base resists dam
160d0 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72  age due to OS cr
160e0 61 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a  ashes and power.
160f0 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65  ** failures.  Le
16100 76 65 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d  vel 1 is the sam
16110 65 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75  e as asynchronou
16120 73 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63  s (no syncs() oc
16130 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65  cur and.** there
16140 20 69 73 20 61 20 68 69 67 68 20 70 72 6f 62 61   is a high proba
16150 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65  bility of damage
16160 29 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68  )  Level 2 is th
16170 65 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72  e default.  Ther
16180 65 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c  e.** is a very l
16190 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20  ow but non-zero 
161a0 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
161b0 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20  amage.  Level 3 
161c0 72 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70  reduces the.** p
161d0 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61  robability of da
161e0 6d 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72  mage to near zer
161f0 6f 20 62 75 74 20 77 69 74 68 20 61 20 77 72 69  o but with a wri
16200 74 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72  te performance r
16210 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66  eduction..*/.#if
16220 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16230 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69  _PAGER_PRAGMAS.i
16240 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
16250 65 74 50 61 67 65 72 46 6c 61 67 73 28 0a 20 20  etPagerFlags(.  
16260 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20  Btree *p,       
16270 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
16280 72 65 65 20 74 6f 20 73 65 74 20 74 68 65 20 73  ree to set the s
16290 61 66 65 74 79 20 6c 65 76 65 6c 20 6f 6e 20 2a  afety level on *
162a0 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 67 46  /.  unsigned pgF
162b0 6c 61 67 73 20 20 20 20 20 20 20 2f 2a 20 56 61  lags       /* Va
162c0 72 69 6f 75 73 20 50 41 47 45 52 5f 2a 20 66 6c  rious PAGER_* fl
162d0 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68  ags */.){.  BtSh
162e0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
162f0 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
16300 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
16310 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
16320 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
16330 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69  Enter(p);.  sqli
16340 74 65 33 50 61 67 65 72 53 65 74 46 6c 61 67 73  te3PagerSetFlags
16350 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67  (pBt->pPager, pg
16360 46 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69 74 65  Flags);.  sqlite
16370 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
16380 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16390 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OK;.}.#endif../*
163a0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 64  .** Change the d
163b0 65 66 61 75 6c 74 20 70 61 67 65 73 20 73 69 7a  efault pages siz
163c0 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72  e and the number
163d0 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79 74   of reserved byt
163e0 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a 20  es per page..** 
163f0 4f 72 2c 20 69 66 20 74 68 65 20 70 61 67 65 20  Or, if the page 
16400 73 69 7a 65 20 68 61 73 20 61 6c 72 65 61 64 79  size has already
16410 20 62 65 65 6e 20 66 69 78 65 64 2c 20 72 65 74   been fixed, ret
16420 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
16430 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74 20  NLY .** without 
16440 63 68 61 6e 67 69 6e 67 20 61 6e 79 74 68 69 6e  changing anythin
16450 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  g..**.** The pag
16460 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20 61  e size must be a
16470 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65 74 77   power of 2 betw
16480 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33  een 512 and 6553
16490 36 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 0a  6.  If the page.
164a0 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69 65 64  ** size supplied
164b0 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20 74   does not meet t
164c0 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  his constraint t
164d0 68 65 6e 20 74 68 65 20 70 61 67 65 20 73 69 7a  hen the page siz
164e0 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e  e is not.** chan
164f0 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20  ged..**.** Page 
16500 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73 74 72  sizes are constr
16510 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f  ained to be a po
16520 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20 74 68  wer of two so th
16530 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a  at the region.**
16540 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
16550 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 6c   file used for l
16560 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e  ocking (beginnin
16570 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42 59 54  g at PENDING_BYT
16580 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  E,.** the first 
16590 62 79 74 65 20 70 61 73 74 20 74 68 65 20 31 47  byte past the 1G
165a0 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78 34 30  B boundary, 0x40
165b0 30 30 30 30 30 30 29 20 6e 65 65 64 73 20 74 6f  000000) needs to
165c0 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74 68 65   occur.** at the
165d0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20   beginning of a 
165e0 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  page..**.** If p
165f0 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65 72 76  arameter nReserv
16600 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a  e is less than z
16610 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e 75  ero, then the nu
16620 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64  mber of reserved
16630 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20 70 61  .** bytes per pa
16640 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61  ge is left uncha
16650 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  nged..**.** If t
16660 68 65 20 69 46 69 78 21 3d 30 20 74 68 65 6e 20  he iFix!=0 then 
16670 74 68 65 20 42 54 53 5f 50 41 47 45 53 49 5a 45  the BTS_PAGESIZE
16680 5f 46 49 58 45 44 20 66 6c 61 67 20 69 73 20 73  _FIXED flag is s
16690 65 74 20 73 6f 20 74 68 61 74 20 74 68 65 20 70  et so that the p
166a0 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64 20  age size.** and 
166b0 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65 20  autovacuum mode 
166c0 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65  can no longer be
166d0 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74   changed..*/.int
166e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
166f0 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a  PageSize(Btree *
16700 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65 2c  p, int pageSize,
16710 20 69 6e 74 20 6e 52 65 73 65 72 76 65 2c 20 69   int nReserve, i
16720 6e 74 20 69 46 69 78 29 7b 0a 20 20 69 6e 74 20  nt iFix){.  int 
16730 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
16740 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
16750 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
16760 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d 31  rt( nReserve>=-1
16770 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35   && nReserve<=25
16780 35 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  5 );.  sqlite3Bt
16790 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66  reeEnter(p);.#if
167a0 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
167b0 43 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76 65  C.  if( nReserve
167c0 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73  >pBt->optimalRes
167d0 65 72 76 65 20 29 20 70 42 74 2d 3e 6f 70 74 69  erve ) pBt->opti
167e0 6d 61 6c 52 65 73 65 72 76 65 20 3d 20 28 75 38  malReserve = (u8
167f0 29 6e 52 65 73 65 72 76 65 3b 0a 23 65 6e 64 69  )nReserve;.#endi
16800 66 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73  f.  if( pBt->bts
16810 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41 47 45  Flags & BTS_PAGE
16820 53 49 5a 45 5f 46 49 58 45 44 20 29 7b 0a 20 20  SIZE_FIXED ){.  
16830 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
16840 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75  ave(p);.    retu
16850 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
16860 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52  LY;.  }.  if( nR
16870 65 73 65 72 76 65 3c 30 20 29 7b 0a 20 20 20 20  eserve<0 ){.    
16880 6e 52 65 73 65 72 76 65 20 3d 20 70 42 74 2d 3e  nReserve = pBt->
16890 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e  pageSize - pBt->
168a0 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a  usableSize;.  }.
168b0 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72    assert( nReser
168c0 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76  ve>=0 && nReserv
168d0 65 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66 28 20  e<=255 );.  if( 
168e0 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
168f0 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54   pageSize<=SQLIT
16900 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20  E_MAX_PAGE_SIZE 
16910 26 26 0a 20 20 20 20 20 20 20 20 28 28 70 61 67  &&.        ((pag
16920 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a  eSize-1)&pageSiz
16930 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  e)==0 ){.    ass
16940 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26  ert( (pageSize &
16950 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73   7)==0 );.    as
16960 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72  sert( !pBt->pCur
16970 73 6f 72 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  sor );.    pBt->
16980 70 61 67 65 53 69 7a 65 20 3d 20 28 75 33 32 29  pageSize = (u32)
16990 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 66 72  pageSize;.    fr
169a0 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  eeTempSpace(pBt)
169b0 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
169c0 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
169d0 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
169e0 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  , &pBt->pageSize
169f0 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 70  , nReserve);.  p
16a00 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
16a10 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
16a20 20 28 75 31 36 29 6e 52 65 73 65 72 76 65 3b 0a   (u16)nReserve;.
16a30 20 20 69 66 28 20 69 46 69 78 20 29 20 70 42 74    if( iFix ) pBt
16a40 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
16a50 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44  S_PAGESIZE_FIXED
16a60 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
16a70 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
16a80 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
16a90 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  Return the curre
16aa0 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 70 61 67  ntly defined pag
16ab0 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71  e size.*/.int sq
16ac0 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
16ad0 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 29 7b  eSize(Btree *p){
16ae0 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74  .  return p->pBt
16af0 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f  ->pageSize;.}../
16b00 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
16b10 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  on is similar to
16b20 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
16b30 52 65 73 65 72 76 65 28 29 2c 20 65 78 63 65 70  Reserve(), excep
16b40 74 20 74 68 61 74 20 69 74 0a 2a 2a 20 6d 61 79  t that it.** may
16b50 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20   only be called 
16b60 69 66 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  if it is guarant
16b70 65 65 64 20 74 68 61 74 20 74 68 65 20 62 2d 74  eed that the b-t
16b80 72 65 65 20 6d 75 74 65 78 20 69 73 20 61 6c 72  ree mutex is alr
16b90 65 61 64 79 0a 2a 2a 20 68 65 6c 64 2e 0a 2a 2a  eady.** held..**
16ba0 0a 2a 2a 20 54 68 69 73 20 69 73 20 75 73 65 66  .** This is usef
16bb0 75 6c 20 69 6e 20 6f 6e 65 20 73 70 65 63 69 61  ul in one specia
16bc0 6c 20 63 61 73 65 20 69 6e 20 74 68 65 20 62 61  l case in the ba
16bd0 63 6b 75 70 20 41 50 49 20 63 6f 64 65 20 77 68  ckup API code wh
16be0 65 72 65 20 69 74 20 69 73 0a 2a 2a 20 6b 6e 6f  ere it is.** kno
16bf0 77 6e 20 74 68 61 74 20 74 68 65 20 73 68 61 72  wn that the shar
16c00 65 64 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20  ed b-tree mutex 
16c10 69 73 20 68 65 6c 64 2c 20 62 75 74 20 74 68 65  is held, but the
16c20 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 0a 2a   mutex on the .*
16c30 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * database handl
16c40 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70 20 69  e that owns *p i
16c50 73 20 6e 6f 74 2e 20 49 6e 20 74 68 69 73 20 63  s not. In this c
16c60 61 73 65 20 69 66 20 73 71 6c 69 74 65 33 42 74  ase if sqlite3Bt
16c70 72 65 65 45 6e 74 65 72 28 29 0a 2a 2a 20 77 65  reeEnter().** we
16c80 72 65 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 2c  re to be called,
16c90 20 69 74 20 6d 69 67 68 74 20 63 6f 6c 6c 69 64   it might collid
16ca0 65 20 77 69 74 68 20 73 6f 6d 65 20 6f 74 68 65  e with some othe
16cb0 72 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20 74  r operation on t
16cc0 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68  he.** database h
16cd0 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20  andle that owns 
16ce0 2a 70 2c 20 63 61 75 73 69 6e 67 20 75 6e 64 65  *p, causing unde
16cf0 66 69 6e 65 64 20 62 65 68 61 76 69 6f 72 2e 0a  fined behavior..
16d00 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
16d10 72 65 65 47 65 74 52 65 73 65 72 76 65 4e 6f 4d  reeGetReserveNoM
16d20 75 74 65 78 28 42 74 72 65 65 20 2a 70 29 7b 0a  utex(Btree *p){.
16d30 20 20 69 6e 74 20 6e 3b 0a 20 20 61 73 73 65 72    int n;.  asser
16d40 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
16d50 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75  _held(p->pBt->mu
16d60 74 65 78 29 20 29 3b 0a 20 20 6e 20 3d 20 70 2d  tex) );.  n = p-
16d70 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  >pBt->pageSize -
16d80 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53   p->pBt->usableS
16d90 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b  ize;.  return n;
16da0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
16db0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
16dc0 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74  ytes of space at
16dd0 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72   the end of ever
16de0 79 20 70 61 67 65 20 74 68 61 74 0a 2a 2a 20 61  y page that.** a
16df0 72 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c  re intentually l
16e00 65 66 74 20 75 6e 75 73 65 64 2e 20 20 54 68 69  eft unused.  Thi
16e10 73 20 69 73 20 74 68 65 20 22 72 65 73 65 72 76  s is the "reserv
16e20 65 64 22 20 73 70 61 63 65 20 74 68 61 74 20 69  ed" space that i
16e30 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75  s.** sometimes u
16e40 73 65 64 20 62 79 20 65 78 74 65 6e 73 69 6f 6e  sed by extension
16e50 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49  s..**.** If SQLI
16e60 54 45 5f 48 41 53 5f 4d 55 54 45 58 20 69 73 20  TE_HAS_MUTEX is 
16e70 64 65 66 69 6e 65 64 20 74 68 65 6e 20 74 68 65  defined then the
16e80 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64   number returned
16e90 20 69 73 20 74 68 65 0a 2a 2a 20 67 72 65 61 74   is the.** great
16ea0 65 72 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  er of the curren
16eb0 74 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65  t reserved space
16ec0 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75 6d   and the maximum
16ed0 20 72 65 71 75 65 73 74 65 64 0a 2a 2a 20 72 65   requested.** re
16ee0 73 65 72 76 65 20 73 70 61 63 65 2e 0a 2a 2f 0a  serve space..*/.
16ef0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
16f00 47 65 74 4f 70 74 69 6d 61 6c 52 65 73 65 72 76  GetOptimalReserv
16f10 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  e(Btree *p){.  i
16f20 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42  nt n;.  sqlite3B
16f30 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
16f40 6e 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  n = sqlite3Btree
16f50 47 65 74 52 65 73 65 72 76 65 4e 6f 4d 75 74 65  GetReserveNoMute
16f60 78 28 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  x(p);.#ifdef SQL
16f70 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
16f80 69 66 28 20 6e 3c 70 2d 3e 70 42 74 2d 3e 6f 70  if( n<p->pBt->op
16f90 74 69 6d 61 6c 52 65 73 65 72 76 65 20 29 20 6e  timalReserve ) n
16fa0 20 3d 20 70 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d   = p->pBt->optim
16fb0 61 6c 52 65 73 65 72 76 65 3b 0a 23 65 6e 64 69  alReserve;.#endi
16fc0 66 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  f.  sqlite3Btree
16fd0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
16fe0 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn n;.}.../*.** 
16ff0 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  Set the maximum 
17000 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61  page count for a
17010 20 64 61 74 61 62 61 73 65 20 69 66 20 6d 78 50   database if mxP
17020 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e  age is positive.
17030 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61  .** No changes a
17040 72 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67  re made if mxPag
17050 65 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69  e is 0 or negati
17060 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73  ve..** Regardles
17070 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f  s of the value o
17080 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e  f mxPage, return
17090 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67   the maximum pag
170a0 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  e count..*/.int 
170b0 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50  sqlite3BtreeMaxP
170c0 61 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a  ageCount(Btree *
170d0 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  p, int mxPage){.
170e0 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74    int n;.  sqlit
170f0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
17100 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61  .  n = sqlite3Pa
17110 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28  gerMaxPageCount(
17120 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  p->pBt->pPager, 
17130 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74  mxPage);.  sqlit
17140 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
17150 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
17160 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 42 54  /*.** Set the BT
17170 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  S_SECURE_DELETE 
17180 66 6c 61 67 20 69 66 20 6e 65 77 46 6c 61 67 20  flag if newFlag 
17190 69 73 20 30 20 6f 72 20 31 2e 20 20 49 66 20 6e  is 0 or 1.  If n
171a0 65 77 46 6c 61 67 20 69 73 20 2d 31 2c 0a 2a 2a  ewFlag is -1,.**
171b0 20 74 68 65 6e 20 6d 61 6b 65 20 6e 6f 20 63 68   then make no ch
171c0 61 6e 67 65 73 2e 20 20 41 6c 77 61 79 73 20 72  anges.  Always r
171d0 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
171e0 6f 66 20 74 68 65 20 42 54 53 5f 53 45 43 55 52  of the BTS_SECUR
171f0 45 5f 44 45 4c 45 54 45 0a 2a 2a 20 73 65 74 74  E_DELETE.** sett
17200 69 6e 67 20 61 66 74 65 72 20 74 68 65 20 63 68  ing after the ch
17210 61 6e 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ange..*/.int sql
17220 69 74 65 33 42 74 72 65 65 53 65 63 75 72 65 44  ite3BtreeSecureD
17230 65 6c 65 74 65 28 42 74 72 65 65 20 2a 70 2c 20  elete(Btree *p, 
17240 69 6e 74 20 6e 65 77 46 6c 61 67 29 7b 0a 20 20  int newFlag){.  
17250 69 6e 74 20 62 3b 0a 20 20 69 66 28 20 70 3d 3d  int b;.  if( p==
17260 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
17270 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
17280 72 28 70 29 3b 0a 20 20 69 66 28 20 6e 65 77 46  r(p);.  if( newF
17290 6c 61 67 3e 3d 30 20 29 7b 0a 20 20 20 20 70 2d  lag>=0 ){.    p-
172a0 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  >pBt->btsFlags &
172b0 3d 20 7e 42 54 53 5f 53 45 43 55 52 45 5f 44 45  = ~BTS_SECURE_DE
172c0 4c 45 54 45 3b 0a 20 20 20 20 69 66 28 20 6e 65  LETE;.    if( ne
172d0 77 46 6c 61 67 20 29 20 70 2d 3e 70 42 74 2d 3e  wFlag ) p->pBt->
172e0 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
172f0 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20  SECURE_DELETE;. 
17300 20 7d 20 0a 20 20 62 20 3d 20 28 70 2d 3e 70 42   } .  b = (p->pB
17310 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
17320 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29  S_SECURE_DELETE)
17330 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  !=0;.  sqlite3Bt
17340 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
17350 65 74 75 72 6e 20 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn b;.}../*.*
17360 2a 20 43 68 61 6e 67 65 20 74 68 65 20 27 61 75  * Change the 'au
17370 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65  to-vacuum' prope
17380 72 74 79 20 6f 66 20 74 68 65 20 64 61 74 61 62  rty of the datab
17390 61 73 65 2e 20 49 66 20 74 68 65 20 27 61 75 74  ase. If the 'aut
173a0 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61  oVacuum'.** para
173b0 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72  meter is non-zer
173c0 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63  o, then auto-vac
173d0 75 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61 62  uum mode is enab
173e0 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74  led. If zero, it
173f0 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e  .** is disabled.
17400 20 54 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   The default val
17410 75 65 20 66 6f 72 20 74 68 65 20 61 75 74 6f 2d  ue for the auto-
17420 76 61 63 75 75 6d 20 70 72 6f 70 65 72 74 79 20  vacuum property 
17430 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65  is .** determine
17440 64 20 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f  d by the SQLITE_
17450 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
17460 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74  UM macro..*/.int
17470 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
17480 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65  AutoVacuum(Btree
17490 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56 61 63   *p, int autoVac
174a0 75 75 6d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  uum){.#ifdef SQL
174b0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
174c0 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  UUM.  return SQL
174d0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65  ITE_READONLY;.#e
174e0 6c 73 65 0a 20 20 42 74 53 68 61 72 65 64 20 2a  lse.  BtShared *
174f0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
17500 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
17510 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20 28 75  OK;.  u8 av = (u
17520 38 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a 0a 20  8)autoVacuum;.. 
17530 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
17540 65 72 28 70 29 3b 0a 20 20 69 66 28 20 28 70 42  er(p);.  if( (pB
17550 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
17560 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44  S_PAGESIZE_FIXED
17570 29 21 3d 30 20 26 26 20 28 61 76 20 3f 31 3a 30  )!=0 && (av ?1:0
17580 29 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  )!=pBt->autoVacu
17590 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  um ){.    rc = S
175a0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
175b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74    }else{.    pBt
175c0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 61  ->autoVacuum = a
175d0 76 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d  v ?1:0;.    pBt-
175e0 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 61 76  >incrVacuum = av
175f0 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20  ==2 ?1:0;.  }.  
17600 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
17610 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
17620 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  c;.#endif.}../*.
17630 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61  ** Return the va
17640 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f  lue of the 'auto
17650 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74  -vacuum' propert
17660 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75  y. If auto-vacuu
17670 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64  m is .** enabled
17680 20 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20   1 is returned. 
17690 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a  Otherwise 0..*/.
176a0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
176b0 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74  GetAutoVacuum(Bt
176c0 72 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20  ree *p){.#ifdef 
176d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
176e0 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20  VACUUM.  return 
176f0 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
17700 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69  _NONE;.#else.  i
17710 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
17720 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
17730 20 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d   rc = (.    (!p-
17740 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  >pBt->autoVacuum
17750 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  )?BTREE_AUTOVACU
17760 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70  UM_NONE:.    (!p
17770 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  ->pBt->incrVacuu
17780 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43  m)?BTREE_AUTOVAC
17790 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54  UUM_FULL:.    BT
177a0 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49  REE_AUTOVACUUM_I
177b0 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74  NCR.  );.  sqlit
177c0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
177d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65  .  return rc;.#e
177e0 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  ndif.}.../*.** G
177f0 65 74 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  et a reference t
17800 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68 65 20  o pPage1 of the 
17810 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
17820 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73  This will.** als
17830 6f 20 61 63 71 75 69 72 65 20 61 20 72 65 61 64  o acquire a read
17840 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c  lock on that fil
17850 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  e..**.** SQLITE_
17860 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f  OK is returned o
17870 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 74  n success.  If t
17880 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61  he file is not a
17890 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20  .** well-formed 
178a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
178b0 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  hen SQLITE_CORRU
178c0 50 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  PT is returned..
178d0 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  ** SQLITE_BUSY i
178e0 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  s returned if th
178f0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f  e database is lo
17900 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f  cked.  SQLITE_NO
17910 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  MEM.** is return
17920 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74  ed if we run out
17930 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a   of memory. .*/.
17940 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42  static int lockB
17950 74 72 65 65 28 42 74 53 68 61 72 65 64 20 2a 70  tree(BtShared *p
17960 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  Bt){.  int rc;  
17970 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
17980 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20  esult code from 
17990 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  subfunctions */.
179a0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
179b0 31 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20 31  1;     /* Page 1
179c0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
179d0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
179e0 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
179f0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
17a00 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
17a10 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67  se */.  int nPag
17a20 65 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f 2a 20  eFile = 0;   /* 
17a30 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
17a40 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
17a50 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  file */.  int nP
17a60 61 67 65 48 65 61 64 65 72 3b 20 20 20 20 20 2f  ageHeader;     /
17a70 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
17a80 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
17a90 65 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 68  e according to h
17aa0 64 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  dr */..  assert(
17ab0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
17ac0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
17ad0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
17ae0 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20  ->pPage1==0 );. 
17af0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
17b00 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 42 74  erSharedLock(pBt
17b10 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  ->pPager);.  if(
17b20 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17b30 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63   return rc;.  rc
17b40 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
17b50 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c  pBt, 1, &pPage1,
17b60 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
17b70 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
17b80 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73  n rc;..  /* Do s
17b90 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74 6f 20  ome checking to 
17ba0 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68 65 20  help insure the 
17bb0 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64 20 72  file we opened r
17bc0 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20  eally is.  ** a 
17bd0 76 61 6c 69 64 20 64 61 74 61 62 61 73 65 20 66  valid database f
17be0 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50 61  ile. .  */.  nPa
17bf0 67 65 20 3d 20 6e 50 61 67 65 48 65 61 64 65 72  ge = nPageHeader
17c00 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b 28   = get4byte(28+(
17c10 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74  u8*)pPage1->aDat
17c20 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  a);.  sqlite3Pag
17c30 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
17c40 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 46  >pPager, &nPageF
17c50 69 6c 65 29 3b 0a 20 20 69 66 28 20 6e 50 61 67  ile);.  if( nPag
17c60 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 32  e==0 || memcmp(2
17c70 34 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61  4+(u8*)pPage1->a
17c80 44 61 74 61 2c 20 39 32 2b 28 75 38 2a 29 70 50  Data, 92+(u8*)pP
17c90 61 67 65 31 2d 3e 61 44 61 74 61 2c 34 29 21 3d  age1->aData,4)!=
17ca0 30 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d  0 ){.    nPage =
17cb0 20 6e 50 61 67 65 46 69 6c 65 3b 0a 20 20 7d 0a   nPageFile;.  }.
17cc0 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b    if( nPage>0 ){
17cd0 0a 20 20 20 20 75 33 32 20 70 61 67 65 53 69 7a  .    u32 pageSiz
17ce0 65 3b 0a 20 20 20 20 75 33 32 20 75 73 61 62 6c  e;.    u32 usabl
17cf0 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70  eSize;.    u8 *p
17d00 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e 61  age1 = pPage1->a
17d10 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 53  Data;.    rc = S
17d20 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20  QLITE_NOTADB;.  
17d30 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
17d40 3a 20 52 2d 34 33 37 33 37 2d 33 39 39 39 39 20  : R-43737-39999 
17d50 45 76 65 72 79 20 76 61 6c 69 64 20 53 51 4c 69  Every valid SQLi
17d60 74 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  te database file
17d70 20 62 65 67 69 6e 73 0a 20 20 20 20 2a 2a 20 77   begins.    ** w
17d80 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
17d90 67 20 31 36 20 62 79 74 65 73 20 28 69 6e 20 68  g 16 bytes (in h
17da0 65 78 29 3a 20 35 33 20 35 31 20 34 63 20 36 39  ex): 53 51 4c 69
17db0 20 37 34 20 36 35 20 32 30 20 36 36 20 36 66 20   74 65 20 66 6f 
17dc0 37 32 20 36 64 0a 20 20 20 20 2a 2a 20 36 31 20  72 6d.    ** 61 
17dd0 37 34 20 32 30 20 33 33 20 30 30 2e 20 2a 2f 0a  74 20 33 00. */.
17de0 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70      if( memcmp(p
17df0 61 67 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64  age1, zMagicHead
17e00 65 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20  er, 16)!=0 ){.  
17e10 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
17e20 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
17e30 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
17e40 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 69 66  _OMIT_WAL.    if
17e50 28 20 70 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b  ( page1[18]>1 ){
17e60 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46  .      pBt->btsF
17e70 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44  lags |= BTS_READ
17e80 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20  _ONLY;.    }.   
17e90 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 31   if( page1[19]>1
17ea0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
17eb0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
17ec0 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20  ;.    }.#else.  
17ed0 20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e    if( page1[18]>
17ee0 32 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  2 ){.      pBt->
17ef0 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
17f00 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d  READ_ONLY;.    }
17f10 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
17f20 39 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 67 6f  9]>2 ){.      go
17f30 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
17f40 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  iled;.    }..   
17f50 20 2f 2a 20 49 66 20 74 68 65 20 77 72 69 74 65   /* If the write
17f60 20 76 65 72 73 69 6f 6e 20 69 73 20 73 65 74 20   version is set 
17f70 74 6f 20 32 2c 20 74 68 69 73 20 64 61 74 61 62  to 2, this datab
17f80 61 73 65 20 73 68 6f 75 6c 64 20 62 65 20 61 63  ase should be ac
17f90 63 65 73 73 65 64 0a 20 20 20 20 2a 2a 20 69 6e  cessed.    ** in
17fa0 20 57 41 4c 20 6d 6f 64 65 2e 20 49 66 20 74 68   WAL mode. If th
17fb0 65 20 6c 6f 67 20 69 73 20 6e 6f 74 20 61 6c 72  e log is not alr
17fc0 65 61 64 79 20 6f 70 65 6e 2c 20 6f 70 65 6e 20  eady open, open 
17fd0 69 74 20 6e 6f 77 2e 20 54 68 65 6e 20 0a 20 20  it now. Then .  
17fe0 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49    ** return SQLI
17ff0 54 45 5f 4f 4b 20 61 6e 64 20 72 65 74 75 72 6e  TE_OK and return
18000 20 77 69 74 68 6f 75 74 20 70 6f 70 75 6c 61 74   without populat
18010 69 6e 67 20 42 74 53 68 61 72 65 64 2e 70 50 61  ing BtShared.pPa
18020 67 65 31 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  ge1..    ** The 
18030 63 61 6c 6c 65 72 20 64 65 74 65 63 74 73 20 74  caller detects t
18040 68 69 73 20 61 6e 64 20 63 61 6c 6c 73 20 74 68  his and calls th
18050 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69  is function agai
18060 6e 2e 20 54 68 69 73 20 69 73 0a 20 20 20 20 2a  n. This is.    *
18070 2a 20 72 65 71 75 69 72 65 64 20 61 73 20 74 68  * required as th
18080 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 61 67  e version of pag
18090 65 20 31 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  e 1 currently in
180a0 20 74 68 65 20 70 61 67 65 31 20 62 75 66 66 65   the page1 buffe
180b0 72 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74  r.    ** may not
180c0 20 62 65 20 74 68 65 20 6c 61 74 65 73 74 20 76   be the latest v
180d0 65 72 73 69 6f 6e 20 2d 20 74 68 65 72 65 20 6d  ersion - there m
180e0 61 79 20 62 65 20 61 20 6e 65 77 65 72 20 6f 6e  ay be a newer on
180f0 65 20 69 6e 20 74 68 65 20 6c 6f 67 0a 20 20 20  e in the log.   
18100 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f   ** file..    */
18110 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
18120 39 5d 3d 3d 32 20 26 26 20 28 70 42 74 2d 3e 62  9]==2 && (pBt->b
18130 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 4e 4f  tsFlags & BTS_NO
18140 5f 57 41 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  _WAL)==0 ){.    
18150 20 20 69 6e 74 20 69 73 4f 70 65 6e 20 3d 20 30    int isOpen = 0
18160 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
18170 69 74 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c  ite3PagerOpenWal
18180 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 69  (pBt->pPager, &i
18190 73 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 69 66  sOpen);.      if
181a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
181b0 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
181c0 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
181d0 64 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  d;.      }else{.
181e0 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55  #if SQLITE_DEFAU
181f0 4c 54 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 21 3d  LT_SYNCHRONOUS!=
18200 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57  SQLITE_DEFAULT_W
18210 41 4c 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 0a 20  AL_SYNCHRONOUS. 
18220 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a         sqlite3 *
18230 64 62 3b 0a 20 20 20 20 20 20 20 20 44 62 20 2a  db;.        Db *
18240 70 44 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28  pDb;.        if(
18250 20 28 64 62 3d 70 42 74 2d 3e 64 62 29 21 3d 30   (db=pBt->db)!=0
18260 20 26 26 20 28 70 44 62 3d 64 62 2d 3e 61 44 62   && (pDb=db->aDb
18270 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
18280 20 20 77 68 69 6c 65 28 20 70 44 62 2d 3e 70 42    while( pDb->pB
18290 74 3d 3d 30 20 7c 7c 20 70 44 62 2d 3e 70 42 74  t==0 || pDb->pBt
182a0 2d 3e 70 42 74 21 3d 70 42 74 20 29 7b 20 70 44  ->pBt!=pBt ){ pD
182b0 62 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20 20  b++; }.         
182c0 20 69 66 28 20 70 44 62 2d 3e 62 53 79 6e 63 53   if( pDb->bSyncS
182d0 65 74 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  et==0.          
182e0 20 26 26 20 70 44 62 2d 3e 73 61 66 65 74 79 5f   && pDb->safety_
182f0 6c 65 76 65 6c 3d 3d 53 51 4c 49 54 45 5f 44 45  level==SQLITE_DE
18300 46 41 55 4c 54 5f 53 59 4e 43 48 52 4f 4e 4f 55  FAULT_SYNCHRONOU
18310 53 2b 31 0a 20 20 20 20 20 20 20 20 20 20 29 7b  S+1.          ){
18320 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 44 62  .            pDb
18330 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d  ->safety_level =
18340 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
18350 57 41 4c 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 2b  WAL_SYNCHRONOUS+
18360 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  1;.            s
18370 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 46 6c  qlite3PagerSetFl
18380 61 67 73 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ags(pBt->pPager,
18390 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
183a0 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65  pDb->safety_leve
183b0 6c 20 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  l | (db->flags &
183c0 20 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53   PAGER_FLAGS_MAS
183d0 4b 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  K));.          }
183e0 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  .        }.#endi
183f0 66 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  f.        if( is
18400 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Open==0 ){.     
18410 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
18420 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20  (pPage1);.      
18430 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18440 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  E_OK;.        }.
18450 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
18460 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42   = SQLITE_NOTADB
18470 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
18480 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
18490 4f 46 3a 20 52 2d 31 35 34 36 35 2d 32 30 38 31  OF: R-15465-2081
184a0 33 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6e  3 The maximum an
184b0 64 20 6d 69 6e 69 6d 75 6d 20 65 6d 62 65 64 64  d minimum embedd
184c0 65 64 20 70 61 79 6c 6f 61 64 0a 20 20 20 20 2a  ed payload.    *
184d0 2a 20 66 72 61 63 74 69 6f 6e 73 20 61 6e 64 20  * fractions and 
184e0 74 68 65 20 6c 65 61 66 20 70 61 79 6c 6f 61 64  the leaf payload
184f0 20 66 72 61 63 74 69 6f 6e 20 76 61 6c 75 65 73   fraction values
18500 20 6d 75 73 74 20 62 65 20 36 34 2c 20 33 32 2c   must be 64, 32,
18510 20 61 6e 64 20 33 32 2e 0a 20 20 20 20 2a 2a 0a   and 32..    **.
18520 20 20 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69      ** The origi
18530 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77  nal design allow
18540 65 64 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73  ed these amounts
18550 20 74 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73   to vary, but as
18560 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69   of.    ** versi
18570 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71  on 3.6.0, we req
18580 75 69 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20  uire them to be 
18590 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  fixed..    */.  
185a0 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61    if( memcmp(&pa
185b0 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30  ge1[21], "\100\0
185c0 34 30 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b  40\040",3)!=0 ){
185d0 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
185e0 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
185f0 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44     }.    /* EVID
18600 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33  ENCE-OF: R-51873
18610 2d 33 39 36 31 38 20 54 68 65 20 70 61 67 65 20  -39618 The page 
18620 73 69 7a 65 20 66 6f 72 20 61 20 64 61 74 61 62  size for a datab
18630 61 73 65 20 66 69 6c 65 20 69 73 0a 20 20 20 20  ase file is.    
18640 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
18650 20 74 68 65 20 32 2d 62 79 74 65 20 69 6e 74 65   the 2-byte inte
18660 67 65 72 20 6c 6f 63 61 74 65 64 20 61 74 20 61  ger located at a
18670 6e 20 6f 66 66 73 65 74 20 6f 66 20 31 36 20 62  n offset of 16 b
18680 79 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  ytes from.    **
18690 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
186a0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
186b0 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65  ile. */.    page
186c0 53 69 7a 65 20 3d 20 28 70 61 67 65 31 5b 31 36  Size = (page1[16
186d0 5d 3c 3c 38 29 20 7c 20 28 70 61 67 65 31 5b 31  ]<<8) | (page1[1
186e0 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 2f 2a 20  7]<<16);.    /* 
186f0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
18700 35 30 30 38 2d 32 31 36 38 38 20 54 68 65 20 73  5008-21688 The s
18710 69 7a 65 20 6f 66 20 61 20 70 61 67 65 20 69 73  ize of a page is
18720 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 0a   a power of two.
18730 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 35      ** between 5
18740 31 32 20 61 6e 64 20 36 35 35 33 36 20 69 6e 63  12 and 65536 inc
18750 6c 75 73 69 76 65 2e 20 2a 2f 0a 20 20 20 20 69  lusive. */.    i
18760 66 28 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29  f( ((pageSize-1)
18770 26 70 61 67 65 53 69 7a 65 29 21 3d 30 0a 20 20  &pageSize)!=0.  
18780 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3e 53     || pageSize>S
18790 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
187a0 49 5a 45 20 0a 20 20 20 20 20 7c 7c 20 70 61 67  IZE .     || pag
187b0 65 53 69 7a 65 3c 3d 32 35 36 20 0a 20 20 20 20  eSize<=256 .    
187c0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
187d0 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
187e0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
187f0 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37  t( (pageSize & 7
18800 29 3d 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20 45  )==0 );.    /* E
18810 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39  VIDENCE-OF: R-59
18820 33 31 30 2d 35 31 32 30 35 20 54 68 65 20 22 72  310-51205 The "r
18830 65 73 65 72 76 65 64 20 73 70 61 63 65 22 20 73  eserved space" s
18840 69 7a 65 20 69 6e 20 74 68 65 20 31 2d 62 79 74  ize in the 1-byt
18850 65 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72  e.    ** integer
18860 20 61 74 20 6f 66 66 73 65 74 20 32 30 20 69 73   at offset 20 is
18870 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
18880 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74  ytes of space at
18890 20 74 68 65 20 65 6e 64 20 6f 66 0a 20 20 20 20   the end of.    
188a0 2a 2a 20 65 61 63 68 20 70 61 67 65 20 74 6f 20  ** each page to 
188b0 72 65 73 65 72 76 65 20 66 6f 72 20 65 78 74 65  reserve for exte
188c0 6e 73 69 6f 6e 73 2e 20 0a 20 20 20 20 2a 2a 0a  nsions. .    **.
188d0 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d      ** EVIDENCE-
188e0 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34 32 34 31  OF: R-37497-4241
188f0 32 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  2 The size of th
18900 65 20 72 65 73 65 72 76 65 64 20 72 65 67 69 6f  e reserved regio
18910 6e 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65  n is.    ** dete
18920 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6f 6e  rmined by the on
18930 65 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20  e-byte unsigned 
18940 69 6e 74 65 67 65 72 20 66 6f 75 6e 64 20 61 74  integer found at
18950 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 32 30   an offset of 20
18960 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65  .    ** into the
18970 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
18980 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 75 73  eader. */.    us
18990 61 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53  ableSize = pageS
189a0 69 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b  ize - page1[20];
189b0 0a 20 20 20 20 69 66 28 20 28 75 33 32 29 70 61  .    if( (u32)pa
189c0 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67  geSize!=pBt->pag
189d0 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f  eSize ){.      /
189e0 2a 20 41 66 74 65 72 20 72 65 61 64 69 6e 67 20  * After reading 
189f0 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
18a00 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  f the database a
18a10 73 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73  ssuming a page s
18a20 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ize.      ** of 
18a30 42 74 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a  BtShared.pageSiz
18a40 65 2c 20 77 65 20 68 61 76 65 20 64 69 73 63 6f  e, we have disco
18a50 76 65 72 65 64 20 74 68 61 74 20 74 68 65 20 70  vered that the p
18a60 61 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20  age-size is.    
18a70 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61    ** actually pa
18a80 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74  geSize. Unlock t
18a90 68 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61  he database, lea
18aa0 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61  ve pBt->pPage1 a
18ab0 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20  t.      ** zero 
18ac0 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
18ad0 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72  E_OK. The caller
18ae0 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20   will call this 
18af0 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  function.      *
18b00 2a 20 61 67 61 69 6e 20 77 69 74 68 20 74 68 65  * again with the
18b10 20 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69   correct page-si
18b20 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ze..      */.   
18b30 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
18b40 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42  Page1);.      pB
18b50 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
18b60 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20  usableSize;.    
18b70 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
18b80 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  = pageSize;.    
18b90 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28    freeTempSpace(
18ba0 70 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  pBt);.      rc =
18bb0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
18bc0 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  Pagesize(pBt->pP
18bd0 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65  ager, &pBt->page
18be0 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Size,.          
18bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c00 20 20 20 20 20 20 20 20 20 70 61 67 65 53 69 7a           pageSiz
18c10 65 2d 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  e-usableSize);. 
18c20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
18c30 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70      }.    if( (p
18c40 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  Bt->db->flags & 
18c50 53 51 4c 49 54 45 5f 52 65 63 6f 76 65 72 79 4d  SQLITE_RecoveryM
18c60 6f 64 65 29 3d 3d 30 20 26 26 20 6e 50 61 67 65  ode)==0 && nPage
18c70 3e 6e 50 61 67 65 46 69 6c 65 20 29 7b 0a 20 20  >nPageFile ){.  
18c80 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
18c90 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
18ca0 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
18cb0 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
18cc0 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  }.    /* EVIDENC
18cd0 45 2d 4f 46 3a 20 52 2d 32 38 33 31 32 2d 36 34  E-OF: R-28312-64
18ce0 37 30 34 20 48 6f 77 65 76 65 72 2c 20 74 68 65  704 However, the
18cf0 20 75 73 61 62 6c 65 20 73 69 7a 65 20 69 73 20   usable size is 
18d00 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 20  not allowed to. 
18d10 20 20 20 2a 2a 20 62 65 20 6c 65 73 73 20 74 68     ** be less th
18d20 61 6e 20 34 38 30 2e 20 49 6e 20 6f 74 68 65 72  an 480. In other
18d30 20 77 6f 72 64 73 2c 20 69 66 20 74 68 65 20 70   words, if the p
18d40 61 67 65 20 73 69 7a 65 20 69 73 20 35 31 32 2c  age size is 512,
18d50 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a   then the.    **
18d60 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65 20   reserved space 
18d70 73 69 7a 65 20 63 61 6e 6e 6f 74 20 65 78 63 65  size cannot exce
18d80 65 64 20 33 32 2e 20 2a 2f 0a 20 20 20 20 69 66  ed 32. */.    if
18d90 28 20 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30  ( usableSize<480
18da0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
18db0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
18dc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
18dd0 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65  >pageSize = page
18de0 53 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75  Size;.    pBt->u
18df0 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62  sableSize = usab
18e00 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20  leSize;.#ifndef 
18e10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
18e20 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e  VACUUM.    pBt->
18e30 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65  autoVacuum = (ge
18e40 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36  t4byte(&page1[36
18e50 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20   + 4*4])?1:0);. 
18e60 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
18e70 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
18e80 70 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29  page1[36 + 7*4])
18e90 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ?1:0);.#endif.  
18ea0 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c  }..  /* maxLocal
18eb0 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   is the maximum 
18ec0 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
18ed0 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c  d to store local
18ee0 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65  ly for.  ** a ce
18ef0 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69  ll.  Make sure i
18f00 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67  t is small enoug
18f10 68 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61  h so that at lea
18f20 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a  st minFanout.  *
18f30 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c  * cells can will
18f40 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65   fit on one page
18f50 2e 20 20 57 65 20 61 73 73 75 6d 65 20 61 20 31  .  We assume a 1
18f60 30 2d 62 79 74 65 20 70 61 67 65 20 68 65 61 64  0-byte page head
18f70 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73  er..  ** Besides
18f80 20 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68   the payload, th
18f90 65 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72  e cell must stor
18fa0 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79  e:.  **     2-by
18fb0 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  te pointer to th
18fc0 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20  e cell.  **     
18fd0 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69  4-byte child poi
18fe0 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d  nter.  **     9-
18ff0 62 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a  byte nKey value.
19000 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20    **     4-byte 
19010 6e 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a  nData value.  **
19020 20 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72       4-byte over
19030 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65  flow page pointe
19040 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c  r.  ** So a cell
19050 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32   consists of a 2
19060 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61  -byte pointer, a
19070 20 68 65 61 64 65 72 20 77 68 69 63 68 20 69 73   header which is
19080 20 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a   as much as.  **
19090 20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20   17 bytes long, 
190a0 30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20  0 to N bytes of 
190b0 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20  payload, and an 
190c0 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20  optional 4 byte 
190d0 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61  overflow.  ** pa
190e0 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f  ge pointer..  */
190f0 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c  .  pBt->maxLocal
19100 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75   = (u16)((pBt->u
19110 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34  sableSize-12)*64
19120 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42  /255 - 23);.  pB
19130 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75  t->minLocal = (u
19140 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65  16)((pBt->usable
19150 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20  Size-12)*32/255 
19160 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61  - 23);.  pBt->ma
19170 78 4c 65 61 66 20 3d 20 28 75 31 36 29 28 70 42  xLeaf = (u16)(pB
19180 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
19190 33 35 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c  35);.  pBt->minL
191a0 65 61 66 20 3d 20 28 75 31 36 29 28 28 70 42 74  eaf = (u16)((pBt
191b0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
191c0 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20  *32/255 - 23);. 
191d0 20 69 66 28 20 70 42 74 2d 3e 6d 61 78 4c 6f 63   if( pBt->maxLoc
191e0 61 6c 3e 31 32 37 20 29 7b 0a 20 20 20 20 70 42  al>127 ){.    pB
191f0 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f  t->max1bytePaylo
19200 61 64 20 3d 20 31 32 37 3b 0a 20 20 7d 65 6c 73  ad = 127;.  }els
19210 65 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31  e{.    pBt->max1
19220 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 28 75  bytePayload = (u
19230 38 29 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b  8)pBt->maxLocal;
19240 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
19250 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33  Bt->maxLeaf + 23
19260 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45   <= MX_CELL_SIZE
19270 28 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e  (pBt) );.  pBt->
19280 70 50 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b  pPage1 = pPage1;
19290 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20  .  pBt->nPage = 
192a0 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20  nPage;.  return 
192b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65  SQLITE_OK;..page
192c0 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20  1_init_failed:. 
192d0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
192e0 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61  ge1);.  pBt->pPa
192f0 67 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  ge1 = 0;.  retur
19300 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
19310 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65   NDEBUG./*.** Re
19320 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
19330 6f 66 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  of cursors open 
19340 6f 6e 20 70 42 74 2e 20 54 68 69 73 20 69 73 20  on pBt. This is 
19350 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73  for use.** in as
19360 73 65 72 74 28 29 20 65 78 70 72 65 73 73 69 6f  sert() expressio
19370 6e 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c  ns, so it is onl
19380 79 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44  y compiled if ND
19390 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64  EBUG is not.** d
193a0 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  efined..**.** On
193b0 6c 79 20 77 72 69 74 65 20 63 75 72 73 6f 72 73  ly write cursors
193c0 20 61 72 65 20 63 6f 75 6e 74 65 64 20 69 66 20   are counted if 
193d0 77 72 4f 6e 6c 79 20 69 73 20 74 72 75 65 2e 20  wrOnly is true. 
193e0 20 49 66 20 77 72 4f 6e 6c 79 20 69 73 0a 2a 2a   If wrOnly is.**
193f0 20 66 61 6c 73 65 20 74 68 65 6e 20 61 6c 6c 20   false then all 
19400 63 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e  cursors are coun
19410 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  ted..**.** For t
19420 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74  he purposes of t
19430 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 63  his routine, a c
19440 75 72 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72  ursor is any cur
19450 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63  sor that.** is c
19460 61 70 61 62 6c 65 20 6f 66 20 72 65 61 64 69 6e  apable of readin
19470 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20  g or writing to 
19480 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 43  the database.  C
19490 75 72 73 6f 72 73 20 74 68 61 74 0a 2a 2a 20 68  ursors that.** h
194a0 61 76 65 20 62 65 65 6e 20 74 72 69 70 70 65 64  ave been tripped
194b0 20 69 6e 74 6f 20 74 68 65 20 43 55 52 53 4f 52   into the CURSOR
194c0 5f 46 41 55 4c 54 20 73 74 61 74 65 20 61 72 65  _FAULT state are
194d0 20 6e 6f 74 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f   not counted..*/
194e0 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e  .static int coun
194f0 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28 42 74  tValidCursors(Bt
19500 53 68 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74  Shared *pBt, int
19510 20 77 72 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75   wrOnly){.  BtCu
19520 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e  rsor *pCur;.  in
19530 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70  t r = 0;.  for(p
19540 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  Cur=pBt->pCursor
19550 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75  ; pCur; pCur=pCu
19560 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  r->pNext){.    i
19570 66 28 20 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c 7c  f( (wrOnly==0 ||
19580 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
19590 20 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61   & BTCF_WriteFla
195a0 67 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20 70  g)!=0).     && p
195b0 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
195c0 53 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b  SOR_FAULT ) r++;
195d0 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72   .  }.  return r
195e0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
195f0 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e  * If there are n
19600 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75  o outstanding cu
19610 72 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65  rsors and we are
19620 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64   not in the midd
19630 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73  le.** of a trans
19640 61 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65  action but there
19650 20 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20   is a read lock 
19660 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  on the database,
19670 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f   then.** this ro
19680 75 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65  utine unrefs the
19690 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
196a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
196b0 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74   which .** has t
196c0 68 65 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c  he effect of rel
196d0 65 61 73 69 6e 67 20 74 68 65 20 72 65 61 64 20  easing the read 
196e0 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  lock..**.** If t
196f0 68 65 72 65 20 69 73 20 61 20 74 72 61 6e 73 61  here is a transa
19700 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73  ction in progres
19710 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
19720 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
19730 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63  tatic void unloc
19740 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 42  kBtreeIfUnused(B
19750 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
19760 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
19770 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
19780 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
19790 65 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43  ert( countValidC
197a0 75 72 73 6f 72 73 28 70 42 74 2c 30 29 3d 3d 30  ursors(pBt,0)==0
197b0 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73   || pBt->inTrans
197c0 61 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e  action>TRANS_NON
197d0 45 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  E );.  if( pBt->
197e0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
197f0 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74  RANS_NONE && pBt
19800 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20  ->pPage1!=0 ){. 
19810 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
19820 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
19830 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
19840 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20  age1->aData );. 
19850 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
19860 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
19870 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20  pBt->pPager)==1 
19880 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67  );.    pBt->pPag
19890 65 31 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65  e1 = 0;.    rele
198a0 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70  asePageNotNull(p
198b0 50 61 67 65 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Page1);.  }.}../
198c0 2a 0a 2a 2a 20 49 66 20 70 42 74 20 70 6f 69 6e  *.** If pBt poin
198d0 74 73 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 66  ts to an empty f
198e0 69 6c 65 20 74 68 65 6e 20 63 6f 6e 76 65 72 74  ile then convert
198f0 20 74 68 61 74 20 65 6d 70 74 79 20 66 69 6c 65   that empty file
19900 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77 20 65  .** into a new e
19910 6d 70 74 79 20 64 61 74 61 62 61 73 65 20 62 79  mpty database by
19920 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
19930 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 0a  e first page of.
19940 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ** the database.
19950 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  .*/.static int n
19960 65 77 44 61 74 61 62 61 73 65 28 42 74 53 68 61  ewDatabase(BtSha
19970 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d  red *pBt){.  Mem
19980 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73  Page *pP1;.  uns
19990 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
199a0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
199b0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
199c0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
199d0 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70  utex) );.  if( p
199e0 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b 0a 20  Bt->nPage>0 ){. 
199f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
19a00 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d  _OK;.  }.  pP1 =
19a10 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20   pBt->pPage1;.  
19a20 61 73 73 65 72 74 28 20 70 50 31 21 3d 30 20 29  assert( pP1!=0 )
19a30 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e  ;.  data = pP1->
19a40 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71  aData;.  rc = sq
19a50 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
19a60 70 50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  pP1->pDbPage);. 
19a70 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
19a80 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61   rc;.  memcpy(da
19a90 74 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72  ta, zMagicHeader
19aa0 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48  , sizeof(zMagicH
19ab0 65 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72  eader));.  asser
19ac0 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63  t( sizeof(zMagic
19ad0 48 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20  Header)==16 );. 
19ae0 20 64 61 74 61 5b 31 36 5d 20 3d 20 28 75 38 29   data[16] = (u8)
19af0 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  ((pBt->pageSize>
19b00 3e 38 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74  >8)&0xff);.  dat
19b10 61 5b 31 37 5d 20 3d 20 28 75 38 29 28 28 70 42  a[17] = (u8)((pB
19b20 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 31 36 29  t->pageSize>>16)
19b30 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31  &0xff);.  data[1
19b40 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31  8] = 1;.  data[1
19b50 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74  9] = 1;.  assert
19b60 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
19b70 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e<=pBt->pageSize
19b80 20 26 26 20 70 42 74 2d 3e 75 73 61 62 6c 65 53   && pBt->usableS
19b90 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61  ize+255>=pBt->pa
19ba0 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b  geSize);.  data[
19bb0 32 30 5d 20 3d 20 28 75 38 29 28 70 42 74 2d 3e  20] = (u8)(pBt->
19bc0 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e  pageSize - pBt->
19bd0 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64  usableSize);.  d
19be0 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20  ata[21] = 64;.  
19bf0 64 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20  data[22] = 32;. 
19c00 20 64 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a   data[23] = 32;.
19c10 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32    memset(&data[2
19c20 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a  4], 0, 100-24);.
19c30 20 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20    zeroPage(pP1, 
19c40 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c  PTF_INTKEY|PTF_L
19c50 45 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41  EAF|PTF_LEAFDATA
19c60 20 29 3b 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c   );.  pBt->btsFl
19c70 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53  ags |= BTS_PAGES
19c80 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64  IZE_FIXED;.#ifnd
19c90 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
19ca0 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65  UTOVACUUM.  asse
19cb0 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
19cc0 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61  uum==1 || pBt->a
19cd0 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a  utoVacuum==0 );.
19ce0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
19cf0 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20  ncrVacuum==1 || 
19d00 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d  pBt->incrVacuum=
19d10 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65  =0 );.  put4byte
19d20 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d  (&data[36 + 4*4]
19d30 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  , pBt->autoVacuu
19d40 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  m);.  put4byte(&
19d50 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20  data[36 + 7*4], 
19d60 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29  pBt->incrVacuum)
19d70 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e  ;.#endif.  pBt->
19d80 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 64 61 74  nPage = 1;.  dat
19d90 61 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65 74  a[31] = 1;.  ret
19da0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
19db0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
19dc0 7a 65 20 74 68 65 20 66 69 72 73 74 20 70 61 67  ze the first pag
19dd0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
19de0 65 20 66 69 6c 65 20 28 63 72 65 61 74 69 6e 67  e file (creating
19df0 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63   a database.** c
19e00 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73  onsisting of a s
19e10 69 6e 67 6c 65 20 70 61 67 65 20 61 6e 64 20 6e  ingle page and n
19e20 6f 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 73  o schema objects
19e30 29 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ). Return SQLITE
19e40 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75 63 63 65 73  _OK.** if succes
19e50 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69  sful, or an SQLi
19e60 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74  te error code ot
19e70 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20  herwise..*/.int 
19e80 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 77 44  sqlite3BtreeNewD
19e90 62 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  b(Btree *p){.  i
19ea0 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
19eb0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
19ec0 20 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 20 3d   p->pBt->nPage =
19ed0 20 30 3b 0a 20 20 72 63 20 3d 20 6e 65 77 44 61   0;.  rc = newDa
19ee0 74 61 62 61 73 65 28 70 2d 3e 70 42 74 29 3b 0a  tabase(p->pBt);.
19ef0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
19f00 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
19f10 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74   rc;.}../*.** At
19f20 74 65 6d 70 74 20 74 6f 20 73 74 61 72 74 20 61  tempt to start a
19f30 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
19f40 2e 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61  . A write-transa
19f50 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72  ction.** is star
19f60 74 65 64 20 69 66 20 74 68 65 20 73 65 63 6f 6e  ted if the secon
19f70 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  d argument is no
19f80 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65  nzero, otherwise
19f90 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e   a read-.** tran
19fa0 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65  saction.  If the
19fb0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
19fc0 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e   is 2 or more an
19fd0 64 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74  d exclusive.** t
19fe0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74  ransaction is st
19ff0 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74  arted, meaning t
1a000 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f  hat no other pro
1a010 63 65 73 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a  cess is allowed.
1a020 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ** to access the
1a030 20 64 61 74 61 62 61 73 65 2e 20 20 41 20 70 72   database.  A pr
1a040 65 65 78 69 73 74 69 6e 67 20 74 72 61 6e 73 61  eexisting transa
1a050 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65  ction may not be
1a060 0a 2a 2a 20 75 70 67 72 61 64 65 64 20 74 6f 20  .** upgraded to 
1a070 65 78 63 6c 75 73 69 76 65 20 62 79 20 63 61 6c  exclusive by cal
1a080 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
1a090 65 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 20  e a second time 
1a0a0 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69  - the.** exclusi
1a0b0 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77  vity flag only w
1a0c0 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65 77 20 74  orks for a new t
1a0d0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
1a0e0 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61  * A write-transa
1a0f0 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74  ction must be st
1a100 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 74 74  arted before att
1a110 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20  empting any .** 
1a120 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64  changes to the d
1a130 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f  atabase.  None o
1a140 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1a150 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c  routines .** wil
1a160 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20  l work unless a 
1a170 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73  transaction is s
1a180 74 61 72 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a  tarted first:.**
1a190 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
1a1a0 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65  BtreeCreateTable
1a1b0 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
1a1c0 65 33 42 74 72 65 65 43 72 65 61 74 65 49 6e 64  e3BtreeCreateInd
1a1d0 65 78 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  ex().**      sql
1a1e0 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61  ite3BtreeClearTa
1a1f0 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ble().**      sq
1a200 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61  lite3BtreeDropTa
1a210 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ble().**      sq
1a220 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72 74  lite3BtreeInsert
1a230 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
1a240 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 29 0a  e3BtreeDelete().
1a250 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
1a260 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 29  treeUpdateMeta()
1a270 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69  .**.** If an ini
1a280 74 69 61 6c 20 61 74 74 65 6d 70 74 20 74 6f 20  tial attempt to 
1a290 61 63 71 75 69 72 65 20 74 68 65 20 6c 6f 63 6b  acquire the lock
1a2a0 20 66 61 69 6c 73 20 62 65 63 61 75 73 65 20 6f   fails because o
1a2b0 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f  f lock contentio
1a2c0 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74  n.** and the dat
1a2d0 61 62 61 73 65 20 77 61 73 20 70 72 65 76 69 6f  abase was previo
1a2e0 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74  usly unlocked, t
1a2f0 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  hen invoke the b
1a300 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69  usy handler.** i
1a310 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20  f there is one. 
1a320 20 42 75 74 20 69 66 20 74 68 65 72 65 20 77 61   But if there wa
1a330 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61 20 72  s previously a r
1a340 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74  ead-lock, do not
1a350 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  .** invoke the b
1a360 75 73 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75  usy handler - ju
1a370 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  st return SQLITE
1a380 5f 42 55 53 59 2e 20 20 53 51 4c 49 54 45 5f 42  _BUSY.  SQLITE_B
1a390 55 53 59 20 69 73 20 0a 2a 2a 20 72 65 74 75 72  USY is .** retur
1a3a0 6e 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69  ned when there i
1a3b0 73 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64  s already a read
1a3c0 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20 74  -lock in order t
1a3d0 6f 20 61 76 6f 69 64 20 61 20 64 65 61 64 6c 6f  o avoid a deadlo
1a3e0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73  ck..**.** Suppos
1a3f0 65 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20  e there are two 
1a400 70 72 6f 63 65 73 73 65 73 20 41 20 61 6e 64 20  processes A and 
1a410 42 2e 20 20 41 20 68 61 73 20 61 20 72 65 61 64  B.  A has a read
1a420 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61 73 0a   lock and B has.
1a430 2a 2a 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  ** a reserved lo
1a440 63 6b 2e 20 20 42 20 74 72 69 65 73 20 74 6f 20  ck.  B tries to 
1a450 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75  promote to exclu
1a460 73 69 76 65 20 62 75 74 20 69 73 20 62 6c 6f 63  sive but is bloc
1a470 6b 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f  ked because.** o
1a480 66 20 41 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e  f A's read lock.
1a490 20 20 41 20 74 72 69 65 73 20 74 6f 20 70 72 6f    A tries to pro
1a4a0 6d 6f 74 65 20 74 6f 20 72 65 73 65 72 76 65 64  mote to reserved
1a4b0 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20   but is blocked 
1a4c0 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20  by B..** One or 
1a4d0 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65  the other of the
1a4e0 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 6d   two processes m
1a4f0 75 73 74 20 67 69 76 65 20 77 61 79 20 6f 72 20  ust give way or 
1a500 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20  there can be.** 
1a510 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20 20 42 79  no progress.  By
1a520 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54   returning SQLIT
1a530 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74 20 69  E_BUSY and not i
1a540 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62 75 73 79  nvoking the busy
1a550 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65   callback.** whe
1a560 6e 20 41 20 61 6c 72 65 61 64 79 20 68 61 73 20  n A already has 
1a570 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20  a read lock, we 
1a580 65 6e 63 6f 75 72 61 67 65 20 41 20 74 6f 20 67  encourage A to g
1a590 69 76 65 20 75 70 20 61 6e 64 20 6c 65 74 20 42  ive up and let B
1a5a0 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a  .** proceed..*/.
1a5b0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1a5c0 42 65 67 69 6e 54 72 61 6e 73 28 42 74 72 65 65  BeginTrans(Btree
1a5d0 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61 67 29   *p, int wrflag)
1a5e0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
1a5f0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e  t = p->pBt;.  in
1a600 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1a610 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
1a620 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72  eEnter(p);.  btr
1a630 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
1a640 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72  .  /* If the btr
1a650 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ee is already in
1a660 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
1a670 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a  tion, or it.  **
1a680 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61   is already in a
1a690 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
1a6a0 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61  n and a read-tra
1a6b0 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  nsaction.  ** is
1a6c0 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 69 73   requested, this
1a6d0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a   is a no-op..  *
1a6e0 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  /.  if( p->inTra
1a6f0 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
1a700 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  || (p->inTrans==
1a710 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77  TRANS_READ && !w
1a720 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f  rflag) ){.    go
1a730 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a  to trans_begun;.
1a740 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42    }.  assert( pB
1a750 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1a760 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c  ==TRANS_WRITE ||
1a770 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74   IfNotOmitAV(pBt
1a780 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 3d 3d  ->bDoTruncate)==
1a790 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65  0 );..  /* Write
1a7a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72   transactions ar
1a7b0 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f  e not possible o
1a7c0 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  n a read-only da
1a7d0 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20  tabase */.  if( 
1a7e0 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
1a7f0 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21   BTS_READ_ONLY)!
1a800 3d 30 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a  =0 && wrflag ){.
1a810 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1a820 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f  READONLY;.    go
1a830 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a  to trans_begun;.
1a840 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
1a850 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
1a860 43 41 43 48 45 0a 20 20 7b 0a 20 20 20 20 73 71  CACHE.  {.    sq
1a870 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20  lite3 *pBlock = 
1a880 30 3b 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 6f  0;.    /* If ano
1a890 74 68 65 72 20 64 61 74 61 62 61 73 65 20 68 61  ther database ha
1a8a0 6e 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79  ndle has already
1a8b0 20 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65 20   opened a write 
1a8c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20  transaction .   
1a8d0 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68 61 72   ** on this shar
1a8e0 65 64 2d 62 74 72 65 65 20 73 74 72 75 63 74 75  ed-btree structu
1a8f0 72 65 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20  re and a second 
1a900 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
1a910 6e 20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71 75  n is.    ** requ
1a920 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51  ested, return SQ
1a930 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20 20  LITE_LOCKED..   
1a940 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 77 72 66   */.    if( (wrf
1a950 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72  lag && pBt->inTr
1a960 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
1a970 5f 57 52 49 54 45 29 0a 20 20 20 20 20 7c 7c 20  _WRITE).     || 
1a980 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
1a990 20 42 54 53 5f 50 45 4e 44 49 4e 47 29 21 3d 30   BTS_PENDING)!=0
1a9a0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 42  .    ){.      pB
1a9b0 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72 69  lock = pBt->pWri
1a9c0 74 65 72 2d 3e 64 62 3b 0a 20 20 20 20 7d 65 6c  ter->db;.    }el
1a9d0 73 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20  se if( wrflag>1 
1a9e0 29 7b 0a 20 20 20 20 20 20 42 74 4c 6f 63 6b 20  ){.      BtLock 
1a9f0 2a 70 49 74 65 72 3b 0a 20 20 20 20 20 20 66 6f  *pIter;.      fo
1aa00 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f  r(pIter=pBt->pLo
1aa10 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72  ck; pIter; pIter
1aa20 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a  =pIter->pNext){.
1aa30 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
1aa40 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a  r->pBtree!=p ){.
1aa50 20 20 20 20 20 20 20 20 20 20 70 42 6c 6f 63 6b            pBlock
1aa60 20 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65   = pIter->pBtree
1aa70 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 20 20  ->db;.          
1aa80 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
1aa90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1aaa0 20 20 20 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b     if( pBlock ){
1aab0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f  .      sqlite3Co
1aac0 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28  nnectionBlocked(
1aad0 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a  p->db, pBlock);.
1aae0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1aaf0 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
1ab00 41 43 48 45 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ACHE;.      goto
1ab10 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20   trans_begun;.  
1ab20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
1ab30 20 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f 6e    /* Any read-on
1ab40 6c 79 20 6f 72 20 72 65 61 64 2d 77 72 69 74 65  ly or read-write
1ab50 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d 70   transaction imp
1ab60 6c 69 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b  lies a read-lock
1ab70 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20 31   on .  ** page 1
1ab80 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74 68  . So if some oth
1ab90 65 72 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  er shared-cache 
1aba0 63 6c 69 65 6e 74 20 61 6c 72 65 61 64 79 20 68  client already h
1abb0 61 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  as a write-lock 
1abc0 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31 2c  .  ** on page 1,
1abd0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1abe0 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65   cannot be opene
1abf0 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65  d. */.  rc = que
1ac00 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62  rySharedCacheTab
1ac10 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52  leLock(p, MASTER
1ac20 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b  _ROOT, READ_LOCK
1ac30 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  );.  if( SQLITE_
1ac40 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20 74 72  OK!=rc ) goto tr
1ac50 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 70 42  ans_begun;..  pB
1ac60 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e  t->btsFlags &= ~
1ac70 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d  BTS_INITIALLY_EM
1ac80 50 54 59 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  PTY;.  if( pBt->
1ac90 6e 50 61 67 65 3d 3d 30 20 29 20 70 42 74 2d 3e  nPage==0 ) pBt->
1aca0 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
1acb0 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b  INITIALLY_EMPTY;
1acc0 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43  .  do {.    /* C
1acd0 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29 20  all lockBtree() 
1ace0 75 6e 74 69 6c 20 65 69 74 68 65 72 20 70 42 74  until either pBt
1acf0 2d 3e 70 50 61 67 65 31 20 69 73 20 70 6f 70 75  ->pPage1 is popu
1ad00 6c 61 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20  lated or.    ** 
1ad10 6c 6f 63 6b 42 74 72 65 65 28 29 20 72 65 74 75  lockBtree() retu
1ad20 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74  rns something ot
1ad30 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  her than SQLITE_
1ad40 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a  OK. lockBtree().
1ad50 20 20 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72      ** may retur
1ad60 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20  n SQLITE_OK but 
1ad70 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65  leave pBt->pPage
1ad80 31 20 73 65 74 20 74 6f 20 30 20 69 66 20 61 66  1 set to 0 if af
1ad90 74 65 72 0a 20 20 20 20 2a 2a 20 72 65 61 64 69  ter.    ** readi
1ada0 6e 67 20 70 61 67 65 20 31 20 69 74 20 64 69 73  ng page 1 it dis
1adb0 63 6f 76 65 72 73 20 74 68 61 74 20 74 68 65 20  covers that the 
1adc0 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65  page-size of the
1add0 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a   database .    *
1ade0 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 42  * file is not pB
1adf0 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e 20  t->pageSize. In 
1ae00 74 68 69 73 20 63 61 73 65 20 6c 6f 63 6b 42 74  this case lockBt
1ae10 72 65 65 28 29 20 77 69 6c 6c 20 75 70 64 61 74  ree() will updat
1ae20 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61  e.    ** pBt->pa
1ae30 67 65 53 69 7a 65 20 74 6f 20 74 68 65 20 70 61  geSize to the pa
1ae40 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 66  ge-size of the f
1ae50 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20  ile on disk..   
1ae60 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70   */.    while( p
1ae70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26 26  Bt->pPage1==0 &&
1ae80 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20   SQLITE_OK==(rc 
1ae90 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29  = lockBtree(pBt)
1aea0 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  ) );..    if( rc
1aeb0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77  ==SQLITE_OK && w
1aec0 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69  rflag ){.      i
1aed0 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  f( (pBt->btsFlag
1aee0 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c  s & BTS_READ_ONL
1aef0 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Y)!=0 ){.       
1af00 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
1af10 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c  DONLY;.      }el
1af20 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
1af30 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67   sqlite3PagerBeg
1af40 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 77  in(pBt->pPager,w
1af50 72 66 6c 61 67 3e 31 2c 73 71 6c 69 74 65 33 54  rflag>1,sqlite3T
1af60 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64  empInMemory(p->d
1af70 62 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  b));.        if(
1af80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1af90 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1afa0 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74   newDatabase(pBt
1afb0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1afc0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
1afd0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1afe0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c  _OK ){.      unl
1aff0 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
1b000 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pBt);.    }.  }
1b010 77 68 69 6c 65 28 20 28 72 63 26 30 78 46 46 29  while( (rc&0xFF)
1b020 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
1b030 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1b040 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ion==TRANS_NONE 
1b050 26 26 0a 20 20 20 20 20 20 20 20 20 20 62 74 72  &&.          btr
1b060 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  eeInvokeBusyHand
1b070 6c 65 72 28 70 42 74 29 20 29 3b 0a 0a 20 20 69  ler(pBt) );..  i
1b080 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1b090 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69   ){.    if( p->i
1b0a0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f  nTrans==TRANS_NO
1b0b0 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  NE ){.      pBt-
1b0c0 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b  >nTransaction++;
1b0d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1b0e0 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
1b0f0 45 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73  E.      if( p->s
1b100 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  harable ){.     
1b110 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f     assert( p->lo
1b120 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26 26 20  ck.pBtree==p && 
1b130 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d  p->lock.iTable==
1b140 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  1 );.        p->
1b150 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41  lock.eLock = REA
1b160 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  D_LOCK;.        
1b170 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20  p->lock.pNext = 
1b180 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20  pBt->pLock;.    
1b190 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d      pBt->pLock =
1b1a0 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20   &p->lock;.     
1b1b0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
1b1c0 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d      p->inTrans =
1b1d0 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57   (wrflag?TRANS_W
1b1e0 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29  RITE:TRANS_READ)
1b1f0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54  ;.    if( p->inT
1b200 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e  rans>pBt->inTran
1b210 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  saction ){.     
1b220 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1b230 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73  ion = p->inTrans
1b240 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1b250 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  wrflag ){.      
1b260 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20  MemPage *pPage1 
1b270 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 23  = pBt->pPage1;.#
1b280 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1b290 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
1b2a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
1b2b0 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20  Bt->pWriter );. 
1b2c0 20 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65       pBt->pWrite
1b2d0 72 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 42 74  r = p;.      pBt
1b2e0 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42  ->btsFlags &= ~B
1b2f0 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20  TS_EXCLUSIVE;.  
1b300 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 3e 31      if( wrflag>1
1b310 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73   ) pBt->btsFlags
1b320 20 7c 3d 20 42 54 53 5f 45 58 43 4c 55 53 49 56   |= BTS_EXCLUSIV
1b330 45 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20  E;.#endif..     
1b340 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 73 69   /* If the db-si
1b350 7a 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20  ze header field 
1b360 69 73 20 69 6e 63 6f 72 72 65 63 74 20 28 61 73  is incorrect (as
1b370 20 69 74 20 6d 61 79 20 62 65 20 69 66 20 61 6e   it may be if an
1b380 20 6f 6c 64 0a 20 20 20 20 20 20 2a 2a 20 63 6c   old.      ** cl
1b390 69 65 6e 74 20 68 61 73 20 62 65 65 6e 20 77 72  ient has been wr
1b3a0 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  iting the databa
1b3b0 73 65 20 66 69 6c 65 29 2c 20 75 70 64 61 74 65  se file), update
1b3c0 20 69 74 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20   it now. Doing. 
1b3d0 20 20 20 20 20 2a 2a 20 74 68 69 73 20 73 6f 6f       ** this soo
1b3e0 6e 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20  ner rather than 
1b3f0 6c 61 74 65 72 20 6d 65 61 6e 73 20 74 68 65 20  later means the 
1b400 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 63 61  database size ca
1b410 6e 20 73 61 66 65 6c 79 20 0a 20 20 20 20 20 20  n safely .      
1b420 2a 2a 20 72 65 2d 72 65 61 64 20 74 68 65 20 64  ** re-read the d
1b430 61 74 61 62 61 73 65 20 73 69 7a 65 20 66 72 6f  atabase size fro
1b440 6d 20 70 61 67 65 20 31 20 69 66 20 61 20 73 61  m page 1 if a sa
1b450 76 65 70 6f 69 6e 74 20 6f 72 20 74 72 61 6e 73  vepoint or trans
1b460 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  action.      ** 
1b470 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20  rollback occurs 
1b480 77 69 74 68 69 6e 20 74 68 65 20 74 72 61 6e 73  within the trans
1b490 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  action..      */
1b4a0 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
1b4b0 6e 50 61 67 65 21 3d 67 65 74 34 62 79 74 65 28  nPage!=get4byte(
1b4c0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32  &pPage1->aData[2
1b4d0 38 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  8]) ){.        r
1b4e0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1b4f0 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
1b500 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
1b510 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1b520 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  K ){.          p
1b530 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
1b540 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d  >aData[28], pBt-
1b550 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  >nPage);.       
1b560 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1b570 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67  .  }...trans_beg
1b580 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  un:.  if( rc==SQ
1b590 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61  LITE_OK && wrfla
1b5a0 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  g ){.    /* This
1b5b0 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65   call makes sure
1b5c0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
1b5d0 68 61 73 20 74 68 65 20 63 6f 72 72 65 63 74 20  has the correct 
1b5e0 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a  number of.    **
1b5f0 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
1b600 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  . If the second 
1b610 70 61 72 61 6d 65 74 65 72 20 69 73 20 67 72 65  parameter is gre
1b620 61 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a  ater than 0 and.
1b630 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a      ** the sub-j
1b640 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c  ournal is not al
1b650 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e  ready open, then
1b660 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e   it will be open
1b670 65 64 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a  ed here..    */.
1b680 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1b690 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69  PagerOpenSavepoi
1b6a0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
1b6b0 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  p->db->nSavepoin
1b6c0 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  t);.  }..  btree
1b6d0 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20  Integrity(p);.  
1b6e0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1b6f0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
1b700 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
1b710 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1b720 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  CUUM../*.** Set 
1b730 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
1b740 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
1b750 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65  children of page
1b760 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66   pPage. Also, if
1b770 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69  .** pPage contai
1b780 6e 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f  ns cells that po
1b790 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20  int to overflow 
1b7a0 70 61 67 65 73 2c 20 73 65 74 20 74 68 65 20 70  pages, set the p
1b7b0 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e  ointer.** map en
1b7c0 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76  tries for the ov
1b7d0 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20  erflow pages as 
1b7e0 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  well..*/.static 
1b7f0 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d  int setChildPtrm
1b800 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  aps(MemPage *pPa
1b810 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  ge){.  int i;   
1b820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b830 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75            /* Cou
1b840 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  nter variable */
1b850 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20  .  int nCell;   
1b860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b870 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1b880 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65  of cells in page
1b890 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20   pPage */.  int 
1b8a0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1b8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b8c0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1b8d0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1b8e0 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
1b8f0 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61   Pgno pgno = pPa
1b900 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73  ge->pgno;..  ass
1b910 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1b920 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
1b930 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1b940 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61  rc = btreeInitPa
1b950 67 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28  ge(pPage);.  if(
1b960 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1b970 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6e 43   return rc;.  nC
1b980 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
1b990 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ll;..  for(i=0; 
1b9a0 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
1b9b0 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66     u8 *pCell = f
1b9c0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
1b9d0 29 3b 0a 0a 20 20 20 20 70 74 72 6d 61 70 50 75  );..    ptrmapPu
1b9e0 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20  tOvflPtr(pPage, 
1b9f0 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20 20  pCell, &rc);..  
1ba00 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
1ba10 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f  af ){.      Pgno
1ba20 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74   childPgno = get
1ba30 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20  4byte(pCell);.  
1ba40 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
1ba50 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54  t, childPgno, PT
1ba60 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f  RMAP_BTREE, pgno
1ba70 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20  , &rc);.    }.  
1ba80 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  }..  if( !pPage-
1ba90 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e  >leaf ){.    Pgn
1baa0 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65  o childPgno = ge
1bab0 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
1bac0 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
1bad0 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70  ffset+8]);.    p
1bae0 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68  trmapPut(pBt, ch
1baf0 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  ildPgno, PTRMAP_
1bb00 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63  BTREE, pgno, &rc
1bb10 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
1bb20 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f   rc;.}../*.** So
1bb30 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65  mewhere on pPage
1bb40 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
1bb50 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f   page iFrom.  Mo
1bb60 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65  dify this pointe
1bb70 72 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20  r so.** that it 
1bb80 70 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50  points to iTo. P
1bb90 61 72 61 6d 65 74 65 72 20 65 54 79 70 65 20 64  arameter eType d
1bba0 65 73 63 72 69 62 65 73 20 74 68 65 20 74 79 70  escribes the typ
1bbb0 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a  e of pointer to.
1bbc0 2a 2a 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20  ** be modified, 
1bbd0 61 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a  as  follows:.**.
1bbe0 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a  ** PTRMAP_BTREE:
1bbf0 20 20 20 20 20 70 50 61 67 65 20 69 73 20 61 20       pPage is a 
1bc00 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20  btree-page. The 
1bc10 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
1bc20 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20  t a child .**   
1bc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc40 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a  page of pPage..*
1bc50 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52  *.** PTRMAP_OVER
1bc60 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20  FLOW1: pPage is 
1bc70 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68  a btree-page. Th
1bc80 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
1bc90 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a   at an overflow.
1bca0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1bcb0 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65       page pointe
1bcc0 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74  d to by one of t
1bcd0 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67  he cells on pPag
1bce0 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f  e..**.** PTRMAP_
1bcf0 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65  OVERFLOW2: pPage
1bd00 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d   is an overflow-
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 74 68 65 20  r points at the 
1bd30 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  next.**         
1bd40 20 20 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c            overfl
1bd50 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  ow page in the l
1bd60 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ist..*/.static i
1bd70 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69  nt modifyPagePoi
1bd80 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50  nter(MemPage *pP
1bd90 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c  age, Pgno iFrom,
1bda0 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54   Pgno iTo, u8 eT
1bdb0 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ype){.  assert( 
1bdc0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1bdd0 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
1bde0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
1bdf0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
1be00 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
1be10 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
1be20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
1be30 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20  P_OVERFLOW2 ){. 
1be40 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
1be50 72 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20  r is always the 
1be60 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66  first 4 bytes of
1be70 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
1be80 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20  s case.  */.    
1be90 69 66 28 20 67 65 74 34 62 79 74 65 28 70 50 61  if( get4byte(pPa
1bea0 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f  ge->aData)!=iFro
1beb0 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  m ){.      retur
1bec0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1bed0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
1bee0 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d   put4byte(pPage-
1bef0 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20  >aData, iTo);.  
1bf00 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69  }else{.    int i
1bf10 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b  ;.    int nCell;
1bf20 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  .    int rc;..  
1bf30 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74    rc = btreeInit
1bf40 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
1bf50 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1bf60 20 72 63 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d   rc;.    nCell =
1bf70 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a   pPage->nCell;..
1bf80 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
1bf90 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
1bfa0 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69    u8 *pCell = fi
1bfb0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29  ndCell(pPage, i)
1bfc0 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  ;.      if( eTyp
1bfd0 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
1bfe0 4f 57 31 20 29 7b 0a 20 20 20 20 20 20 20 20 43  OW1 ){.        C
1bff0 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
1c000 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61        pPage->xPa
1c010 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  rseCell(pPage, p
1c020 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
1c030 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 6e        if( info.n
1c040 4c 6f 63 61 6c 3c 69 6e 66 6f 2e 6e 50 61 79 6c  Local<info.nPayl
1c050 6f 61 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  oad ){.         
1c060 20 69 66 28 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e   if( pCell+info.
1c070 6e 53 69 7a 65 20 3e 20 70 50 61 67 65 2d 3e 61  nSize > pPage->a
1c080 44 61 74 61 2b 70 50 61 67 65 2d 3e 70 42 74 2d  Data+pPage->pBt-
1c090 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
1c0a0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
1c0b0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1c0c0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
1c0d0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
1c0e0 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65   iFrom==get4byte
1c0f0 28 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a  (pCell+info.nSiz
1c100 65 2d 34 29 20 29 7b 0a 20 20 20 20 20 20 20 20  e-4) ){.        
1c110 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65      put4byte(pCe
1c120 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34 2c  ll+info.nSize-4,
1c130 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20   iTo);.         
1c140 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1c150 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1c160 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1c170 20 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74       if( get4byt
1c180 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20  e(pCell)==iFrom 
1c190 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  ){.          put
1c1a0 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f  4byte(pCell, iTo
1c1b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
1c1c0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
1c1d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
1c1e0 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20     if( i==nCell 
1c1f0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  ){.      if( eTy
1c200 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45 45  pe!=PTRMAP_BTREE
1c210 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 67   || .          g
1c220 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
1c230 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
1c240 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f  Offset+8])!=iFro
1c250 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  m ){.        ret
1c260 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1c270 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  PT_BKPT;.      }
1c280 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
1c290 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
1c2a0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
1c2b0 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 20  ], iTo);.    }. 
1c2c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1c2d0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
1c2e0 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64   Move the open d
1c2f0 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
1c300 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e  Page to location
1c310 20 69 46 72 65 65 50 61 67 65 20 69 6e 20 74 68   iFreePage in th
1c320 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  e .** database. 
1c330 54 68 65 20 70 44 62 50 61 67 65 20 72 65 66 65  The pDbPage refe
1c340 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61  rence remains va
1c350 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  lid..**.** The i
1c360 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 6e 64  sCommit flag ind
1c370 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 72  icates that ther
1c380 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
1c390 72 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 2a 2a  remember that.**
1c3a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65   the journal nee
1c3b0 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65  ds to be sync()e
1c3c0 64 20 62 65 66 6f 72 65 20 64 61 74 61 62 61 73  d before databas
1c3d0 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2d 3e  e page pDbPage->
1c3e0 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62 65 20  pgno .** can be 
1c3f0 77 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20  written to. The 
1c400 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61  caller has alrea
1c410 64 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20  dy promised not 
1c420 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 61 74  to write to that
1c430 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  .** page..*/.sta
1c440 74 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65  tic int relocate
1c450 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
1c460 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
1c470 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d   /* Btree */.  M
1c480 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c  emPage *pDbPage,
1c490 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
1c4a0 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a  page to move */.
1c4b0 20 20 75 38 20 65 54 79 70 65 2c 20 20 20 20 20    u8 eType,     
1c4c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
1c4d0 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65 27  inter map 'type'
1c4e0 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61   entry for pDbPa
1c4f0 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74  ge */.  Pgno iPt
1c500 72 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  rPage,          
1c510 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
1c520 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20  'page-no' entry 
1c530 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20  for pDbPage */. 
1c540 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65 2c   Pgno iFreePage,
1c550 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1c560 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76   location to mov
1c570 65 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a  e pDbPage to */.
1c580 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20    int isCommit  
1c590 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 73             /* is
1c5a0 43 6f 6d 6d 69 74 20 66 6c 61 67 20 70 61 73 73  Commit flag pass
1c5b0 65 64 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ed to sqlite3Pag
1c5c0 65 72 4d 6f 76 65 70 61 67 65 20 2a 2f 0a 29 7b  erMovepage */.){
1c5d0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72  .  MemPage *pPtr
1c5e0 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70  Page;   /* The p
1c5f0 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
1c600 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  s a pointer to p
1c610 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
1c620 20 69 44 62 50 61 67 65 20 3d 20 70 44 62 50 61   iDbPage = pDbPa
1c630 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65  ge->pgno;.  Page
1c640 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d  r *pPager = pBt-
1c650 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
1c660 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54  c;..  assert( eT
1c670 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
1c680 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d  FLOW2 || eType==
1c690 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
1c6a0 20 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65   || .      eType
1c6b0 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c  ==PTRMAP_BTREE |
1c6c0 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
1c6d0 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73  ROOTPAGE );.  as
1c6e0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1c6f0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
1c700 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
1c710 28 20 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d  ( pDbPage->pBt==
1c720 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76  pBt );..  /* Mov
1c730 65 20 70 61 67 65 20 69 44 62 50 61 67 65 20 66  e page iDbPage f
1c740 72 6f 6d 20 69 74 73 20 63 75 72 72 65 6e 74 20  rom its current 
1c750 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65  location to page
1c760 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61 67   number iFreePag
1c770 65 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41  e */.  TRACE(("A
1c780 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e  UTOVACUUM: Movin
1c790 67 20 25 64 20 74 6f 20 66 72 65 65 20 70 61 67  g %d to free pag
1c7a0 65 20 25 64 20 28 70 74 72 20 70 61 67 65 20 25  e %d (ptr page %
1c7b0 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a  d type %d)\n", .
1c7c0 20 20 20 20 20 20 69 44 62 50 61 67 65 2c 20 69        iDbPage, i
1c7d0 46 72 65 65 50 61 67 65 2c 20 69 50 74 72 50 61  FreePage, iPtrPa
1c7e0 67 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72  ge, eType));.  r
1c7f0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1c800 4d 6f 76 65 70 61 67 65 28 70 50 61 67 65 72 2c  Movepage(pPager,
1c810 20 70 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67   pDbPage->pDbPag
1c820 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 73  e, iFreePage, is
1c830 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72  Commit);.  if( r
1c840 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1c850 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1c860 20 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67   }.  pDbPage->pg
1c870 6e 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a  no = iFreePage;.
1c880 0a 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65  .  /* If pDbPage
1c890 20 77 61 73 20 61 20 62 74 72 65 65 2d 70 61 67   was a btree-pag
1c8a0 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68  e, then it may h
1c8b0 61 76 65 20 63 68 69 6c 64 20 70 61 67 65 73 20  ave child pages 
1c8c0 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a  and/or cells.  *
1c8d0 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  * that point to 
1c8e0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
1c8f0 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
1c900 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
1c910 74 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73  these.  ** pages
1c920 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e   need to be chan
1c930 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ged..  **.  ** I
1c940 66 20 70 44 62 50 61 67 65 20 69 73 20 61 6e 20  f pDbPage is an 
1c950 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74  overflow page, t
1c960 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 34 20  hen the first 4 
1c970 62 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20  bytes may store 
1c980 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74  a.  ** pointer t
1c990 6f 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f  o a subsequent o
1c9a0 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66  verflow page. If
1c9b0 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
1c9c0 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65  e, then.  ** the
1c9d0 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65   pointer map nee
1c9e0 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64  ds to be updated
1c9f0 20 66 6f 72 20 74 68 65 20 73 75 62 73 65 71 75   for the subsequ
1ca00 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ent overflow pag
1ca10 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54  e..  */.  if( eT
1ca20 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype==PTRMAP_BTRE
1ca30 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  E || eType==PTRM
1ca40 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
1ca50 20 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64     rc = setChild
1ca60 50 74 72 6d 61 70 73 28 70 44 62 50 61 67 65 29  Ptrmaps(pDbPage)
1ca70 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1ca80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1ca90 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1caa0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50  }.  }else{.    P
1cab0 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67  gno nextOvfl = g
1cac0 65 74 34 62 79 74 65 28 70 44 62 50 61 67 65 2d  et4byte(pDbPage-
1cad0 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28  >aData);.    if(
1cae0 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a   nextOvfl!=0 ){.
1caf0 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
1cb00 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50  pBt, nextOvfl, P
1cb10 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c  TRMAP_OVERFLOW2,
1cb20 20 69 46 72 65 65 50 61 67 65 2c 20 26 72 63 29   iFreePage, &rc)
1cb30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1cb40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1cb50 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1cb60 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1cb70 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20  }..  /* Fix the 
1cb80 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72  database pointer
1cb90 20 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61 67   on page iPtrPag
1cba0 65 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61  e that pointed a
1cbb0 74 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a  t iDbPage so.  *
1cbc0 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  * that it points
1cbd0 20 61 74 20 69 46 72 65 65 50 61 67 65 2e 20 41   at iFreePage. A
1cbe0 6c 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e  lso fix the poin
1cbf0 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f  ter map entry fo
1cc00 72 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e  r.  ** iPtrPage.
1cc10 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70  .  */.  if( eTyp
1cc20 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e!=PTRMAP_ROOTPA
1cc30 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62  GE ){.    rc = b
1cc40 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
1cc50 20 69 50 74 72 50 61 67 65 2c 20 26 70 50 74 72   iPtrPage, &pPtr
1cc60 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66  Page, 0);.    if
1cc70 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1cc80 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1cc90 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
1cca0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1ccb0 72 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70  rite(pPtrPage->p
1ccc0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
1ccd0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1cce0 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
1ccf0 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20  age(pPtrPage);. 
1cd00 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1cd10 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d      }.    rc = m
1cd20 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72  odifyPagePointer
1cd30 28 70 50 74 72 50 61 67 65 2c 20 69 44 62 50 61  (pPtrPage, iDbPa
1cd40 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65  ge, iFreePage, e
1cd50 54 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61  Type);.    relea
1cd60 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29  sePage(pPtrPage)
1cd70 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1cd80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1cd90 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
1cda0 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65  iFreePage, eType
1cdb0 2c 20 69 50 74 72 50 61 67 65 2c 20 26 72 63 29  , iPtrPage, &rc)
1cdc0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1cdd0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46  turn rc;.}../* F
1cde0 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
1cdf0 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79 20 69  on required by i
1ce00 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e  ncrVacuumStep().
1ce10 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61   */.static int a
1ce20 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
1ce30 28 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d  (BtShared *, Mem
1ce40 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c  Page **, Pgno *,
1ce50 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a   Pgno, u8);../*.
1ce60 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e  ** Perform a sin
1ce70 67 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69  gle step of an i
1ce80 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75  ncremental-vacuu
1ce90 6d 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  m. If successful
1cea0 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49  , return.** SQLI
1ceb0 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20  TE_OK. If there 
1cec0 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f  is no work to do
1ced0 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20   (and therefore 
1cee0 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 0a 2a 2a 20  no point in .** 
1cef0 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e  calling this fun
1cf00 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65  ction again), re
1cf10 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
1cf20 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f  . Or, if an erro
1cf30 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 72 65  r .** occurs, re
1cf40 74 75 72 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20  turn some other 
1cf50 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  error code..**.*
1cf60 2a 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63 61  * More specifica
1cf70 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69  lly, this functi
1cf80 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72  on attempts to r
1cf90 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65 20 64  e-organize the d
1cfa0 61 74 61 62 61 73 65 20 73 6f 20 0a 2a 2a 20 74  atabase so .** t
1cfb0 68 61 74 20 74 68 65 20 6c 61 73 74 20 70 61 67  hat the last pag
1cfc0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 75  e of the file cu
1cfd0 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 69  rrently in use i
1cfe0 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75  s no longer in u
1cff0 73 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65  se..**.** Parame
1d000 74 65 72 20 6e 46 69 6e 20 69 73 20 74 68 65 20  ter nFin is the 
1d010 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
1d020 74 68 61 74 20 74 68 69 73 20 64 61 74 61 62 61  that this databa
1d030 73 65 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e  se would contain
1d040 0a 2a 2a 20 77 65 72 65 20 74 68 69 73 20 66 75  .** were this fu
1d050 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 75 6e  nction called un
1d060 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73 20 53  til it returns S
1d070 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a  QLITE_DONE..**.*
1d080 2a 20 49 66 20 74 68 65 20 62 43 6f 6d 6d 69 74  * If the bCommit
1d090 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
1d0a0 6e 2d 7a 65 72 6f 2c 20 74 68 69 73 20 66 75 6e  n-zero, this fun
1d0b0 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
1d0c0 61 74 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65  at the .** calle
1d0d0 72 20 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c  r will keep call
1d0e0 69 6e 67 20 69 6e 63 72 56 61 63 75 75 6d 53 74  ing incrVacuumSt
1d0f0 65 70 28 29 20 75 6e 74 69 6c 20 69 74 20 72 65  ep() until it re
1d100 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e  turns SQLITE_DON
1d110 45 20 0a 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f  E .** or an erro
1d120 72 2e 20 62 43 6f 6d 6d 69 74 20 69 73 20 70 61  r. bCommit is pa
1d130 73 73 65 64 20 74 72 75 65 20 66 6f 72 20 61 6e  ssed true for an
1d140 20 61 75 74 6f 2d 76 61 63 75 75 6d 2d 6f 6e 2d   auto-vacuum-on-
1d150 63 6f 6d 6d 69 74 20 0a 2a 2a 20 6f 70 65 72 61  commit .** opera
1d160 74 69 6f 6e 2c 20 6f 72 20 66 61 6c 73 65 20 66  tion, or false f
1d170 6f 72 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  or an incrementa
1d180 6c 20 76 61 63 75 75 6d 2e 0a 2a 2f 0a 73 74 61  l vacuum..*/.sta
1d190 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61 63 75  tic int incrVacu
1d1a0 75 6d 53 74 65 70 28 42 74 53 68 61 72 65 64 20  umStep(BtShared 
1d1b0 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c  *pBt, Pgno nFin,
1d1c0 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 2c 20 69   Pgno iLastPg, i
1d1d0 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 50  nt bCommit){.  P
1d1e0 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20 20  gno nFreeList;  
1d1f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1d200 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 69 6c  er of pages stil
1d210 6c 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  l on the free-li
1d220 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a  st */.  int rc;.
1d230 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1d240 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
1d250 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
1d260 73 73 65 72 74 28 20 69 4c 61 73 74 50 67 3e 6e  ssert( iLastPg>n
1d270 46 69 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21 50  Fin );..  if( !P
1d280 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
1d290 2c 20 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c  , iLastPg) && iL
1d2a0 61 73 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42  astPg!=PENDING_B
1d2b0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
1d2c0 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20  .    u8 eType;. 
1d2d0 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65     Pgno iPtrPage
1d2e0 3b 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74  ;..    nFreeList
1d2f0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74   = get4byte(&pBt
1d300 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
1d310 33 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46  36]);.    if( nF
1d320 72 65 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  reeList==0 ){.  
1d330 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1d340 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20  E_DONE;.    }.. 
1d350 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
1d360 74 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20  t(pBt, iLastPg, 
1d370 26 65 54 79 70 65 2c 20 26 69 50 74 72 50 61 67  &eType, &iPtrPag
1d380 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
1d390 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d3a0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1d3b0 20 20 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70    }.    if( eTyp
1d3c0 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e==PTRMAP_ROOTPA
1d3d0 47 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  GE ){.      retu
1d3e0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1d3f0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20  T_BKPT;.    }.. 
1d400 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
1d410 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b  RMAP_FREEPAGE ){
1d420 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d  .      if( bComm
1d430 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  it==0 ){.       
1d440 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70   /* Remove the p
1d450 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  age from the fil
1d460 65 73 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68  es free-list. Th
1d470 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  is is not requir
1d480 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66  ed.        ** if
1d490 20 62 43 6f 6d 6d 69 74 20 69 73 20 6e 6f 6e 2d   bCommit is non-
1d4a0 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74 20 63 61  zero. In that ca
1d4b0 73 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69 73  se, the free-lis
1d4c0 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20  t will be.      
1d4d0 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74    ** truncated t
1d4e0 6f 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68 69  o zero after thi
1d4f0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
1d500 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27  ns, so it doesn'
1d510 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61  t .        ** ma
1d520 74 74 65 72 20 69 66 20 69 74 20 73 74 69 6c 6c  tter if it still
1d530 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67   contains some g
1d540 61 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e 0a  arbage entries..
1d550 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1d560 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b     Pgno iFreePg;
1d570 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65  .        MemPage
1d580 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20   *pFreePg;.     
1d590 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
1d5a0 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
1d5b0 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50  pFreePg, &iFreeP
1d5c0 67 2c 20 69 4c 61 73 74 50 67 2c 20 42 54 41 4c  g, iLastPg, BTAL
1d5d0 4c 4f 43 5f 45 58 41 43 54 29 3b 0a 20 20 20 20  LOC_EXACT);.    
1d5e0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1d5f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1d600 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1d610 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1d620 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3d  assert( iFreePg=
1d630 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20  =iLastPg );.    
1d640 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1d650 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20  pFreePg);.      
1d660 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  }.    } else {. 
1d670 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50       Pgno iFreeP
1d680 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  g;             /
1d690 2a 20 49 6e 64 65 78 20 6f 66 20 66 72 65 65 20  * Index of free 
1d6a0 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61  page to move pLa
1d6b0 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20  stPg to */.     
1d6c0 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73 74 50   MemPage *pLastP
1d6d0 67 3b 0a 20 20 20 20 20 20 75 38 20 65 4d 6f 64  g;.      u8 eMod
1d6e0 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 3b  e = BTALLOC_ANY;
1d6f0 20 20 20 2f 2a 20 4d 6f 64 65 20 70 61 72 61 6d     /* Mode param
1d700 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74  eter for allocat
1d710 65 42 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a  eBtreePage() */.
1d720 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 61 72        Pgno iNear
1d730 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1d740 2f 2a 20 6e 65 61 72 62 79 20 70 61 72 61 6d 65  /* nearby parame
1d750 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65  ter for allocate
1d760 42 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 0a  BtreePage() */..
1d770 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
1d780 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61  GetPage(pBt, iLa
1d790 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20  stPg, &pLastPg, 
1d7a0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
1d7b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1d7c0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1d7d0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1d7e0 20 2f 2a 20 49 66 20 62 43 6f 6d 6d 69 74 20 69   /* If bCommit i
1d7f0 73 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f  s zero, this loo
1d800 70 20 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f  p runs exactly o
1d810 6e 63 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61  nce and page pLa
1d820 73 74 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73  stPg.      ** is
1d830 20 73 77 61 70 70 65 64 20 77 69 74 68 20 74 68   swapped with th
1d840 65 20 66 69 72 73 74 20 66 72 65 65 20 70 61 67  e first free pag
1d850 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65  e pulled off the
1d860 20 66 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20   free list..    
1d870 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e    **.      ** On
1d880 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
1d890 20 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 67   if bCommit is g
1d8a0 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f  reater than zero
1d8b0 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20  , then keep.    
1d8c0 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74    ** looping unt
1d8d0 69 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c  il a free-page l
1d8e0 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20 74 68  ocated within th
1d8f0 65 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67  e first nFin pag
1d900 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  es.      ** of t
1d910 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64  he file is found
1d920 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1d930 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20   if( bCommit==0 
1d940 29 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65  ){.        eMode
1d950 20 3d 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a 20   = BTALLOC_LE;. 
1d960 20 20 20 20 20 20 20 69 4e 65 61 72 20 3d 20 6e         iNear = n
1d970 46 69 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Fin;.      }.   
1d980 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20     do {.        
1d990 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67  MemPage *pFreePg
1d9a0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  ;.        rc = a
1d9b0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
1d9c0 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20  (pBt, &pFreePg, 
1d9d0 26 69 46 72 65 65 50 67 2c 20 69 4e 65 61 72 2c  &iFreePg, iNear,
1d9e0 20 65 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20   eMode);.       
1d9f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1da00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1da10 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73  releasePage(pLas
1da20 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tPg);.          
1da30 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1da40 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c     }.        rel
1da50 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67  easePage(pFreePg
1da60 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28  );.      }while(
1da70 20 62 43 6f 6d 6d 69 74 20 26 26 20 69 46 72 65   bCommit && iFre
1da80 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20  ePg>nFin );.    
1da90 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50    assert( iFreeP
1daa0 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20  g<iLastPg );.   
1dab0 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20 72     .      rc = r
1dac0 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c  elocatePage(pBt,
1dad0 20 70 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c   pLastPg, eType,
1dae0 20 69 50 74 72 50 61 67 65 2c 20 69 46 72 65 65   iPtrPage, iFree
1daf0 50 67 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a 20 20  Pg, bCommit);.  
1db00 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1db10 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20  pLastPg);.      
1db20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1db30 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
1db40 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
1db50 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
1db60 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20   bCommit==0 ){. 
1db70 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 69 4c     do {.      iL
1db80 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 77 68  astPg--;.    }wh
1db90 69 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d 50 45  ile( iLastPg==PE
1dba0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
1dbb0 70 42 74 29 20 7c 7c 20 50 54 52 4d 41 50 5f 49  pBt) || PTRMAP_I
1dbc0 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74  SPAGE(pBt, iLast
1dbd0 50 67 29 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  Pg) );.    pBt->
1dbe0 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b  bDoTruncate = 1;
1dbf0 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20  .    pBt->nPage 
1dc00 3d 20 69 4c 61 73 74 50 67 3b 0a 20 20 7d 0a 20  = iLastPg;.  }. 
1dc10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1dc20 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  K;.}../*.** The 
1dc30 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20  database opened 
1dc40 62 79 20 74 68 65 20 66 69 72 73 74 20 61 72 67  by the first arg
1dc50 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 75 74 6f  ument is an auto
1dc60 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
1dc70 0a 2a 2a 20 6e 4f 72 69 67 20 70 61 67 65 73 20  .** nOrig pages 
1dc80 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69  in size containi
1dc90 6e 67 20 6e 46 72 65 65 20 66 72 65 65 20 70 61  ng nFree free pa
1dca0 67 65 73 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ges. Return the 
1dcb0 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 73 69 7a  expected .** siz
1dcc0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1dcd0 65 20 69 6e 20 70 61 67 65 73 20 66 6f 6c 6c 6f  e in pages follo
1dce0 77 69 6e 67 20 61 6e 20 61 75 74 6f 2d 76 61 63  wing an auto-vac
1dcf0 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  uum operation..*
1dd00 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 66 69  /.static Pgno fi
1dd10 6e 61 6c 44 62 53 69 7a 65 28 42 74 53 68 61 72  nalDbSize(BtShar
1dd20 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 4f  ed *pBt, Pgno nO
1dd30 72 69 67 2c 20 50 67 6e 6f 20 6e 46 72 65 65 29  rig, Pgno nFree)
1dd40 7b 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20  {.  int nEntry; 
1dd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd60 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1dd70 20 65 6e 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20   entries on one 
1dd80 70 74 72 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  ptrmap page */. 
1dd90 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20   Pgno nPtrmap;  
1dda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ddb0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 74   /* Number of Pt
1ddc0 72 4d 61 70 20 70 61 67 65 73 20 74 6f 20 62 65  rMap pages to be
1ddd0 20 66 72 65 65 64 20 2a 2f 0a 20 20 50 67 6e 6f   freed */.  Pgno
1dde0 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20 20   nFin;          
1ddf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1de00 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a  eturn value */..
1de10 20 20 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e    nEntry = pBt->
1de20 75 73 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20  usableSize/5;.  
1de30 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46 72 65 65  nPtrmap = (nFree
1de40 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50 41  -nOrig+PTRMAP_PA
1de50 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29  GENO(pBt, nOrig)
1de60 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b  +nEntry)/nEntry;
1de70 0a 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20  .  nFin = nOrig 
1de80 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61  - nFree - nPtrma
1de90 70 3b 0a 20 20 69 66 28 20 6e 4f 72 69 67 3e 50  p;.  if( nOrig>P
1dea0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
1deb0 28 70 42 74 29 20 26 26 20 6e 46 69 6e 3c 50 45  (pBt) && nFin<PE
1dec0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
1ded0 70 42 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e  pBt) ){.    nFin
1dee0 2d 2d 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28  --;.  }.  while(
1def0 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
1df00 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69  Bt, nFin) || nFi
1df10 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  n==PENDING_BYTE_
1df20 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
1df30 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20   nFin--;.  }..  
1df40 72 65 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a  return nFin;.}..
1df50 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72  /*.** A write-tr
1df60 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
1df70 65 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20  e opened before 
1df80 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e  calling this fun
1df90 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72  ction..** It per
1dfa0 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75  forms a single u
1dfb0 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61  nit of work towa
1dfc0 72 64 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74  rds an increment
1dfd0 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a  al vacuum..**.**
1dfe0 20 49 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e   If the incremen
1dff0 74 61 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69  tal vacuum is fi
1e000 6e 69 73 68 65 64 20 61 66 74 65 72 20 74 68 69  nished after thi
1e010 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72  s function has r
1e020 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f  un,.** SQLITE_DO
1e030 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  NE is returned. 
1e040 49 66 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e  If it is not fin
1e050 69 73 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72  ished, but no er
1e060 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a  ror occurred,.**
1e070 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1e080 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
1e090 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  e an SQLite erro
1e0a0 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20  r code. .*/.int 
1e0b0 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72  sqlite3BtreeIncr
1e0c0 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29  Vacuum(Btree *p)
1e0d0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
1e0e0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1e0f0 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33  >pBt;..  sqlite3
1e100 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
1e110 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
1e120 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
1e130 4e 53 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69  NS_WRITE && p->i
1e140 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
1e150 49 54 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42  ITE );.  if( !pB
1e160 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
1e170 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1e180 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _DONE;.  }else{.
1e190 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d      Pgno nOrig =
1e1a0 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
1e1b0 70 42 74 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e  pBt);.    Pgno n
1e1c0 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28  Free = get4byte(
1e1d0 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
1e1e0 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 50 67  ata[36]);.    Pg
1e1f0 6e 6f 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44  no nFin = finalD
1e200 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67  bSize(pBt, nOrig
1e210 2c 20 6e 46 72 65 65 29 3b 0a 0a 20 20 20 20 69  , nFree);..    i
1e220 66 28 20 6e 4f 72 69 67 3c 6e 46 69 6e 20 29 7b  f( nOrig<nFin ){
1e230 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1e240 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1e250 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  .    }else if( n
1e260 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Free>0 ){.      
1e270 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
1e280 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a  ors(pBt, 0, 0);.
1e290 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1e2a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1e2b0 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c     invalidateAll
1e2c0 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42  OverflowCache(pB
1e2d0 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  t);.        rc =
1e2e0 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
1e2f0 70 42 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72 69 67  pBt, nFin, nOrig
1e300 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
1e310 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1e320 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1e330 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1e340 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61  erWrite(pBt->pPa
1e350 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
1e360 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
1e370 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
1e380 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50  ata[28], pBt->nP
1e390 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
1e3a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1e3b0 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
1e3c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
1e3d0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1e3e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1e3f0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
1e400 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
1e410 70 72 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33  prior to sqlite3
1e420 50 61 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e  PagerCommit when
1e430 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   a transaction.*
1e440 2a 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 66  * is committed f
1e450 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  or an auto-vacuu
1e460 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  m database..**.*
1e470 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69  * If SQLITE_OK i
1e480 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e  s returned, then
1e490 20 2a 70 6e 54 72 75 6e 63 20 69 73 20 73 65 74   *pnTrunc is set
1e4a0 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
1e4b0 66 20 70 61 67 65 73 0a 2a 2a 20 74 68 65 20 64  f pages.** the d
1e4c0 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f  atabase file sho
1e4d0 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65 64  uld be truncated
1e4e0 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20 63   to during the c
1e4f0 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 20 0a  ommit process. .
1e500 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64 61 74 61  ** i.e. the data
1e510 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 72 65  base has been re
1e520 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20 74 68 61  organized so tha
1e530 74 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74  t only the first
1e540 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67   *pnTrunc.** pag
1e550 65 73 20 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a  es are in use..*
1e560 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75 74  /.static int aut
1e570 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74  oVacuumCommit(Bt
1e580 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
1e590 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1e5a0 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  OK;.  Pager *pPa
1e5b0 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ger = pBt->pPage
1e5c0 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69  r;.  VVA_ONLY( i
1e5d0 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65  nt nRef = sqlite
1e5e0 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
1e5f0 50 61 67 65 72 29 3b 20 29 0a 0a 20 20 61 73 73  Pager); )..  ass
1e600 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1e610 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
1e620 65 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64  ex) );.  invalid
1e630 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
1e640 63 68 65 28 70 42 74 29 3b 0a 20 20 61 73 73 65  che(pBt);.  asse
1e650 72 74 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  rt(pBt->autoVacu
1e660 75 6d 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  um);.  if( !pBt-
1e670 3e 69 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a 20  >incrVacuum ){. 
1e680 20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20     Pgno nFin;   
1e690 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1e6a0 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61  of pages in data
1e6b0 62 61 73 65 20 61 66 74 65 72 20 61 75 74 6f 76  base after autov
1e6c0 61 63 75 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20  acuuming */.    
1e6d0 50 67 6e 6f 20 6e 46 72 65 65 3b 20 20 20 20 20  Pgno nFree;     
1e6e0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1e6f0 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
1e700 65 6c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20  elist initially 
1e710 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 46 72 65  */.    Pgno iFre
1e720 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  e;        /* The
1e730 20 6e 65 78 74 20 70 61 67 65 20 74 6f 20 62 65   next page to be
1e740 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 50 67   freed */.    Pg
1e750 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20  no nOrig;       
1e760 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a   /* Database siz
1e770 65 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67  e before freeing
1e780 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d   */..    nOrig =
1e790 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
1e7a0 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 50 54  pBt);.    if( PT
1e7b0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
1e7c0 20 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67   nOrig) || nOrig
1e7d0 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
1e7e0 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
1e7f0 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70    /* It is not p
1e800 6f 73 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74  ossible to creat
1e810 65 20 61 20 64 61 74 61 62 61 73 65 20 66 6f 72  e a database for
1e820 20 77 68 69 63 68 20 74 68 65 20 66 69 6e 61 6c   which the final
1e830 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69   page.      ** i
1e840 73 20 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74  s either a point
1e850 65 72 2d 6d 61 70 20 70 61 67 65 20 6f 72 20 74  er-map page or t
1e860 68 65 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20  he pending-byte 
1e870 70 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20  page. If one.   
1e880 20 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74     ** is encount
1e890 65 72 65 64 2c 20 74 68 69 73 20 69 6e 64 69 63  ered, this indic
1e8a0 61 74 65 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e  ates corruption.
1e8b0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1e8c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1e8d0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1e8e0 7d 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 67  }..    nFree = g
1e8f0 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  et4byte(&pBt->pP
1e900 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
1e910 3b 0a 20 20 20 20 6e 46 69 6e 20 3d 20 66 69 6e  ;.    nFin = fin
1e920 61 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f  alDbSize(pBt, nO
1e930 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a 20 20 20  rig, nFree);.   
1e940 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20   if( nFin>nOrig 
1e950 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1e960 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1e970 20 20 69 66 28 20 6e 46 69 6e 3c 6e 4f 72 69 67    if( nFin<nOrig
1e980 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1e990 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  aveAllCursors(pB
1e9a0 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  t, 0, 0);.    }.
1e9b0 20 20 20 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f      for(iFree=nO
1e9c0 72 69 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20  rig; iFree>nFin 
1e9d0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
1e9e0 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20  ; iFree--){.    
1e9f0 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75    rc = incrVacuu
1ea00 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c  mStep(pBt, nFin,
1ea10 20 69 46 72 65 65 2c 20 31 29 3b 0a 20 20 20 20   iFree, 1);.    
1ea20 7d 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53  }.    if( (rc==S
1ea30 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63  QLITE_DONE || rc
1ea40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20  ==SQLITE_OK) && 
1ea50 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20  nFree>0 ){.     
1ea60 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1ea70 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61  erWrite(pBt->pPa
1ea80 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
1ea90 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1eaa0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1eab0 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20  a[32], 0);.     
1eac0 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e   put4byte(&pBt->
1ead0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
1eae0 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74  ], 0);.      put
1eaf0 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
1eb00 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 6e  e1->aData[28], n
1eb10 46 69 6e 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  Fin);.      pBt-
1eb20 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31  >bDoTruncate = 1
1eb30 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61  ;.      pBt->nPa
1eb40 67 65 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 7d  ge = nFin;.    }
1eb50 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1eb60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1eb70 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
1eb80 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
1eb90 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
1eba0 74 28 20 6e 52 65 66 3e 3d 73 71 6c 69 74 65 33  t( nRef>=sqlite3
1ebb0 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50  PagerRefcount(pP
1ebc0 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72  ager) );.  retur
1ebd0 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f  n rc;.}..#else /
1ebe0 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  * ifndef SQLITE_
1ebf0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  OMIT_AUTOVACUUM 
1ec00 2a 2f 0a 23 20 64 65 66 69 6e 65 20 73 65 74 43  */.# define setC
1ec10 68 69 6c 64 50 74 72 6d 61 70 73 28 78 29 20 53  hildPtrmaps(x) S
1ec20 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a  QLITE_OK.#endif.
1ec30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1ec40 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72  ine does the fir
1ec50 73 74 20 70 68 61 73 65 20 6f 66 20 61 20 74 77  st phase of a tw
1ec60 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20  o-phase commit. 
1ec70 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
1ec80 20 63 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61   causes a rollba
1ec90 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65  ck journal to be
1eca0 20 63 72 65 61 74 65 64 20 28 69 66 20 69 74 20   created (if it 
1ecb0 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  does not already
1ecc0 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70   exist).** and p
1ecd0 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e  opulated with en
1ece0 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ough information
1ecf0 20 73 6f 20 74 68 61 74 20 69 66 20 61 20 70 6f   so that if a po
1ed00 77 65 72 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a  wer loss occurs.
1ed10 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
1ed20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20  can be restored 
1ed30 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
1ed40 73 74 61 74 65 20 62 79 20 70 6c 61 79 69 6e 67  state by playing
1ed50 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75   back.** the jou
1ed60 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68 65 20  rnal.  Then the 
1ed70 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
1ed80 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c 75 73  journal are flus
1ed90 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68  hed out to.** th
1eda0 65 20 64 69 73 6b 2e 20 20 41 66 74 65 72 20 74  e disk.  After t
1edb0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61  he journal is sa
1edc0 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74  fely on oxide, t
1edd0 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  he changes to th
1ede0 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 61 72  e.** database ar
1edf0 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
1ee00 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1ee10 20 61 6e 64 20 66 6c 75 73 68 65 64 20 74 6f 20   and flushed to 
1ee20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65  oxide..** At the
1ee30 20 65 6e 64 20 6f 66 20 74 68 69 73 20 63 61 6c   end of this cal
1ee40 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  l, the rollback 
1ee50 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78  journal still ex
1ee60 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64  ists on the.** d
1ee70 69 73 6b 20 61 6e 64 20 77 65 20 61 72 65 20 73  isk and we are s
1ee80 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c  till holding all
1ee90 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20 74   locks, so the t
1eea0 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e  ransaction has n
1eeb0 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e  ot.** committed.
1eec0 20 20 53 65 65 20 73 71 6c 69 74 65 33 42 74 72    See sqlite3Btr
1eed0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
1eee0 28 29 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e  () for the secon
1eef0 64 20 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a  d phase of the.*
1ef00 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73  * commit process
1ef10 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c  ..**.** This cal
1ef20 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  l is a no-op if 
1ef30 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  no write-transac
1ef40 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c  tion is currentl
1ef50 79 20 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e  y active on pBt.
1ef60 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
1ef70 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62  , sync the datab
1ef80 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65  ase file for the
1ef90 20 62 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73   btree pBt. zMas
1efa0 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a  ter points to.**
1efb0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d   the name of a m
1efc0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1efd0 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  le that should b
1efe0 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
1eff0 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c  he.** individual
1f000 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f   journal file, o
1f010 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63  r is NULL, indic
1f020 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20  ating no master 
1f030 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a  journal file .**
1f040 20 28 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73   (single databas
1f050 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a  e transaction)..
1f060 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
1f070 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d  is called, the m
1f080 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68  aster journal sh
1f090 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76  ould already hav
1f0a0 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65  e been.** create
1f0b0 64 2c 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  d, populated wit
1f0c0 68 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70  h this journal p
1f0d0 6f 69 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65  ointer and synce
1f0e0 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a  d to disk..**.**
1f0f0 20 4f 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f   Once this is ro
1f100 75 74 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e  utine has return
1f110 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69  ed, the only thi
1f120 6e 67 20 72 65 71 75 69 72 65 64 20 74 6f 20 63  ng required to c
1f130 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69  ommit.** the wri
1f140 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66  te-transaction f
1f150 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65  or this database
1f160 20 66 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65   file is to dele
1f170 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  te the journal..
1f180 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1f190 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
1f1a0 65 28 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73  e(Btree *p, cons
1f1b0 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29  t char *zMaster)
1f1c0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1f1d0 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d  ITE_OK;.  if( p-
1f1e0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1f1f0 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53  WRITE ){.    BtS
1f200 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
1f210 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pBt;.    sqlite3
1f220 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23  BtreeEnter(p);.#
1f230 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1f240 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1f250 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
1f260 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 72  acuum ){.      r
1f270 63 20 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f  c = autoVacuumCo
1f280 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20  mmit(pBt);.     
1f290 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1f2a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  OK ){.        sq
1f2b0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1f2c0 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  p);.        retu
1f2d0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
1f2e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74     }.    if( pBt
1f2f0 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 29 7b  ->bDoTruncate ){
1f300 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
1f310 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65  gerTruncateImage
1f320 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 42  (pBt->pPager, pB
1f330 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d  t->nPage);.    }
1f340 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d  .#endif.    rc =
1f350 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
1f360 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2d  mitPhaseOne(pBt-
1f370 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  >pPager, zMaster
1f380 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
1f390 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1f3a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1f3b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
1f3c0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1f3d0 64 20 66 72 6f 6d 20 62 6f 74 68 20 42 74 72 65  d from both Btre
1f3e0 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
1f3f0 29 20 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62  ) and BtreeRollb
1f400 61 63 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65 20  ack().** at the 
1f410 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20  conclusion of a 
1f420 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a  transaction..*/.
1f430 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
1f440 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  eEndTransaction(
1f450 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
1f460 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
1f470 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pBt;.  sqlite3 *
1f480 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73  db = p->db;.  as
1f490 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
1f4a0 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
1f4b0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
1f4c0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1f4d0 55 4d 0a 20 20 70 42 74 2d 3e 62 44 6f 54 72 75  UM.  pBt->bDoTru
1f4e0 6e 63 61 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69  ncate = 0;.#endi
1f4f0 66 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  f.  if( p->inTra
1f500 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26  ns>TRANS_NONE &&
1f510 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e 31   db->nVdbeRead>1
1f520 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
1f530 65 72 65 20 61 72 65 20 6f 74 68 65 72 20 61 63  ere are other ac
1f540 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73 20  tive statements 
1f550 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74  that belong to t
1f560 68 69 73 20 64 61 74 61 62 61 73 65 0a 20 20 20  his database.   
1f570 20 2a 2a 20 68 61 6e 64 6c 65 2c 20 64 6f 77 6e   ** handle, down
1f580 67 72 61 64 65 20 74 6f 20 61 20 72 65 61 64 2d  grade to a read-
1f590 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e  only transaction
1f5a0 2e 20 54 68 65 20 6f 74 68 65 72 20 73 74 61 74  . The other stat
1f5b0 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6d 61  ements.    ** ma
1f5c0 79 20 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69  y still be readi
1f5d0 6e 67 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ng from the data
1f5e0 62 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 64 6f  base.  */.    do
1f5f0 77 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64  wngradeAllShared
1f600 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28  CacheTableLocks(
1f610 70 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61  p);.    p->inTra
1f620 6e 73 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b  ns = TRANS_READ;
1f630 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1f640 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68   If the handle h
1f650 61 64 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74  ad any kind of t
1f660 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c  ransaction open,
1f670 20 64 65 63 72 65 6d 65 6e 74 20 74 68 65 20 0a   decrement the .
1f680 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
1f690 6f 6e 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20  on count of the 
1f6a0 73 68 61 72 65 64 20 62 74 72 65 65 2e 20 49 66  shared btree. If
1f6b0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1f6c0 20 63 6f 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72   count .    ** r
1f6d0 65 61 63 68 65 73 20 30 2c 20 73 65 74 20 74 68  eaches 0, set th
1f6e0 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74  e shared state t
1f6f0 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68  o TRANS_NONE. Th
1f700 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55  e unlockBtreeIfU
1f710 6e 75 73 65 64 28 29 0a 20 20 20 20 2a 2a 20 63  nused().    ** c
1f720 61 6c 6c 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75  all below will u
1f730 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e  nlock the pager.
1f740 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
1f750 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e  inTrans!=TRANS_N
1f760 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 63 6c 65  ONE ){.      cle
1f770 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  arAllSharedCache
1f780 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20  TableLocks(p);. 
1f790 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73       pBt->nTrans
1f7a0 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20  action--;.      
1f7b0 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61  if( 0==pBt->nTra
1f7c0 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  nsaction ){.    
1f7d0 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
1f7e0 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e  action = TRANS_N
1f7f0 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ONE;.      }.   
1f800 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74   }..    /* Set t
1f810 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
1f820 61 63 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20  action state to 
1f830 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75  TRANS_NONE and u
1f840 6e 6c 6f 63 6b 20 74 68 65 20 0a 20 20 20 20 2a  nlock the .    *
1f850 2a 20 70 61 67 65 72 20 69 66 20 74 68 69 73 20  * pager if this 
1f860 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20  call closed the 
1f870 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69  only read or wri
1f880 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  te transaction. 
1f890 20 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61   */.    p->inTra
1f8a0 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  ns = TRANS_NONE;
1f8b0 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  .    unlockBtree
1f8c0 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
1f8d0 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67   }..  btreeInteg
1f8e0 72 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rity(p);.}../*.*
1f8f0 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  * Commit the tra
1f900 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74  nsaction current
1f910 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a  ly in progress..
1f920 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1f930 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  ne implements th
1f940 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f  e second phase o
1f950 66 20 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d  f a 2-phase comm
1f960 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69  it.  The.** sqli
1f970 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
1f980 61 73 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65  aseOne() routine
1f990 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20   does the first 
1f9a0 70 68 61 73 65 20 61 6e 64 20 73 68 6f 75 6c 64  phase and should
1f9b0 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 70  .** be invoked p
1f9c0 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20  rior to calling 
1f9d0 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54  this routine.  T
1f9e0 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  he sqlite3BtreeC
1f9f0 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 0a  ommitPhaseOne().
1fa00 2a 2a 20 72 6f 75 74 69 6e 65 20 64 69 64 20 61  ** routine did a
1fa10 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77  ll the work of w
1fa20 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  riting informati
1fa30 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61  on out to disk a
1fa40 6e 64 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a  nd flushing the.
1fa50 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74  ** contents so t
1fa60 68 61 74 20 74 68 65 79 20 61 72 65 20 77 72 69  hat they are wri
1fa70 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69  tten onto the di
1fa80 73 6b 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c  sk platter.  All
1fa90 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
1faa0 20 68 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65   has to do is de
1fab0 6c 65 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65  lete or truncate
1fac0 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 68 65 61   or zero the hea
1fad0 64 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68  der in the.** th
1fae0 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
1faf0 61 6c 20 28 77 68 69 63 68 20 63 61 75 73 65 73  al (which causes
1fb00 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1fb10 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a   to commit) and.
1fb20 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a  ** drop locks..*
1fb30 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69  *.** Normally, i
1fb40 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1fb50 73 20 77 68 69 6c 65 20 74 68 65 20 70 61 67 65  s while the page
1fb60 72 20 6c 61 79 65 72 20 69 73 20 61 74 74 65 6d  r layer is attem
1fb70 70 74 69 6e 67 20 74 6f 20 0a 2a 2a 20 66 69 6e  pting to .** fin
1fb80 61 6c 69 7a 65 20 74 68 65 20 75 6e 64 65 72 6c  alize the underl
1fb90 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ying journal fil
1fba0 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
1fbb0 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f   returns an erro
1fbc0 72 20 61 6e 64 0a 2a 2a 20 74 68 65 20 75 70 70  r and.** the upp
1fbd0 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20 61 74  er layer will at
1fbe0 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b  tempt a rollback
1fbf0 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68  . However, if th
1fc00 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
1fc10 74 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  t.** is non-zero
1fc20 20 74 68 65 6e 20 74 68 69 73 20 62 2d 74 72 65   then this b-tre
1fc30 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
1fc40 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69   part of a multi
1fc50 2d 66 69 6c 65 20 0a 2a 2a 20 74 72 61 6e 73 61  -file .** transa
1fc60 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63  ction. In this c
1fc70 61 73 65 2c 20 74 68 65 20 74 72 61 6e 73 61 63  ase, the transac
1fc80 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
1fc90 20 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20   been committed 
1fca0 0a 2a 2a 20 28 62 79 20 64 65 6c 65 74 69 6e 67  .** (by deleting
1fcb0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
1fcc0 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20  l file) and the 
1fcd0 63 61 6c 6c 65 72 20 77 69 6c 6c 20 69 67 6e 6f  caller will igno
1fce0 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63  re this .** func
1fcf0 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 63 6f 64  tions return cod
1fd00 65 2e 20 53 6f 2c 20 65 76 65 6e 20 69 66 20 61  e. So, even if a
1fd10 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69  n error occurs i
1fd20 6e 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65  n the pager laye
1fd30 72 2c 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20  r,.** reset the 
1fd40 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 73 20 69  b-tree objects i
1fd50 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 74 6f  nternal state to
1fd60 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
1fd70 68 65 20 77 72 69 74 65 0a 2a 2a 20 74 72 61 6e  he write.** tran
1fd80 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
1fd90 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 69 73   closed. This is
1fda0 20 71 75 69 74 65 20 73 61 66 65 2c 20 61 73 20   quite safe, as 
1fdb0 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20 68  the pager will h
1fdc0 61 76 65 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ave.** transitio
1fdd0 6e 65 64 20 74 6f 20 74 68 65 20 65 72 72 6f 72  ned to the error
1fde0 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   state..**.** Th
1fdf0 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20  is will release 
1fe00 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  the write lock o
1fe10 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1fe20 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a  ile.  If there.*
1fe30 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  * are no active 
1fe40 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f  cursors, it also
1fe50 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65   releases the re
1fe60 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20  ad lock..*/.int 
1fe70 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
1fe80 69 74 50 68 61 73 65 54 77 6f 28 42 74 72 65 65  itPhaseTwo(Btree
1fe90 20 2a 70 2c 20 69 6e 74 20 62 43 6c 65 61 6e 75   *p, int bCleanu
1fea0 70 29 7b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e  p){..  if( p->in
1feb0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans==TRANS_NON
1fec0 45 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  E ) return SQLIT
1fed0 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 42  E_OK;.  sqlite3B
1fee0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1fef0 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
1ff00 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
1ff10 68 61 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69  handle has a wri
1ff20 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  te-transaction o
1ff30 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20  pen, commit the 
1ff40 73 68 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20  shared-btrees . 
1ff50 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
1ff60 61 6e 64 20 73 65 74 20 74 68 65 20 73 68 61 72  and set the shar
1ff70 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e  ed state to TRAN
1ff80 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69  S_READ..  */.  i
1ff90 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
1ffa0 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
1ffb0 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74    int rc;.    Bt
1ffc0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1ffd0 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74  >pBt;.    assert
1ffe0 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
1fff0 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
20000 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
20010 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
20020 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  on>0 );.    rc =
20030 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
20040 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d  mitPhaseTwo(pBt-
20050 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
20060 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
20070 26 26 20 62 43 6c 65 61 6e 75 70 3d 3d 30 20 29  && bCleanup==0 )
20080 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
20090 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
200a0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
200b0 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 44 61 74     }.    p->iDat
200c0 61 56 65 72 73 69 6f 6e 2d 2d 3b 20 20 2f 2a 20  aVersion--;  /* 
200d0 43 6f 6d 70 65 6e 73 61 74 65 20 66 6f 72 20 70  Compensate for p
200e0 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73  Pager->iDataVers
200f0 69 6f 6e 2b 2b 3b 20 2a 2f 0a 20 20 20 20 70 42  ion++; */.    pB
20100 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
20110 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20   = TRANS_READ;. 
20120 20 20 20 62 74 72 65 65 43 6c 65 61 72 48 61 73     btreeClearHas
20130 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20  Content(pBt);.  
20140 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61  }..  btreeEndTra
20150 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73  nsaction(p);.  s
20160 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
20170 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
20180 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
20190 2a 20 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73  * Do both phases
201a0 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f   of a commit..*/
201b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
201c0 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70  eCommit(Btree *p
201d0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
201e0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
201f0 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  (p);.  rc = sqli
20200 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
20210 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20  aseOne(p, 0);.  
20220 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
20230 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
20240 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
20250 50 68 61 73 65 54 77 6f 28 70 2c 20 30 29 3b 0a  PhaseTwo(p, 0);.
20260 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
20270 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
20280 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
20290 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
202a0 65 74 73 20 74 68 65 20 73 74 61 74 65 20 74 6f  ets the state to
202b0 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e   CURSOR_FAULT an
202c0 64 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63  d the error.** c
202d0 6f 64 65 20 74 6f 20 65 72 72 43 6f 64 65 20 66  ode to errCode f
202e0 6f 72 20 65 76 65 72 79 20 63 75 72 73 6f 72 20  or every cursor 
202f0 6f 6e 20 61 6e 79 20 42 74 53 68 61 72 65 64 20  on any BtShared 
20300 74 68 61 74 20 70 42 74 72 65 65 0a 2a 2a 20 72  that pBtree.** r
20310 65 66 65 72 65 6e 63 65 73 2e 20 20 4f 72 20 69  eferences.  Or i
20320 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 20  f the writeOnly 
20330 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20 31  flag is set to 1
20340 2c 20 74 68 65 6e 20 6f 6e 6c 79 0a 2a 2a 20 74  , then only.** t
20350 72 69 70 20 77 72 69 74 65 20 63 75 72 73 6f 72  rip write cursor
20360 73 20 61 6e 64 20 6c 65 61 76 65 20 72 65 61 64  s and leave read
20370 20 63 75 72 73 6f 72 73 20 75 6e 63 68 61 6e 67   cursors unchang
20380 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20  ed..**.** Every 
20390 63 75 72 73 6f 72 20 69 73 20 61 20 63 61 6e 64  cursor is a cand
203a0 69 64 61 74 65 20 74 6f 20 62 65 20 74 72 69 70  idate to be trip
203b0 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63  ped, including c
203c0 75 72 73 6f 72 73 0a 2a 2a 20 74 68 61 74 20 62  ursors.** that b
203d0 65 6c 6f 6e 67 20 74 6f 20 6f 74 68 65 72 20 64  elong to other d
203e0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
203f0 6f 6e 73 20 74 68 61 74 20 68 61 70 70 65 6e 20  ons that happen 
20400 74 6f 20 62 65 0a 2a 2a 20 73 68 61 72 69 6e 67  to be.** sharing
20410 20 74 68 65 20 63 61 63 68 65 20 77 69 74 68 20   the cache with 
20420 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  pBtree..**.** Th
20430 69 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20  is routine gets 
20440 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f  called when a ro
20450 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 20 49  llback occurs. I
20460 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 0a  f the writeOnly.
20470 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c  ** flag is true,
20480 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65   then only write
20490 2d 63 75 72 73 6f 72 73 20 6e 65 65 64 20 62 65  -cursors need be
204a0 20 74 72 69 70 70 65 64 20 2d 20 72 65 61 64 2d   tripped - read-
204b0 6f 6e 6c 79 0a 2a 2a 20 63 75 72 73 6f 72 73 20  only.** cursors 
204c0 73 61 76 65 20 74 68 65 69 72 20 63 75 72 72 65  save their curre
204d0 6e 74 20 70 6f 73 69 74 69 6f 6e 73 20 73 6f 20  nt positions so 
204e0 74 68 61 74 20 74 68 65 79 20 6d 61 79 20 63 6f  that they may co
204f0 6e 74 69 6e 75 65 20 0a 2a 2a 20 66 6f 6c 6c 6f  ntinue .** follo
20500 77 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63  wing the rollbac
20510 6b 2e 20 4f 72 2c 20 69 66 20 77 72 69 74 65 4f  k. Or, if writeO
20520 6e 6c 79 20 69 73 20 66 61 6c 73 65 2c 20 61 6c  nly is false, al
20530 6c 20 63 75 72 73 6f 72 73 20 61 72 65 20 0a 2a  l cursors are .*
20540 2a 20 74 72 69 70 70 65 64 2e 20 49 6e 20 67 65  * tripped. In ge
20550 6e 65 72 61 6c 2c 20 77 72 69 74 65 4f 6e 6c 79  neral, writeOnly
20560 20 69 73 20 66 61 6c 73 65 20 69 66 20 74 68 65   is false if the
20570 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 69   transaction bei
20580 6e 67 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63  ng.** rolled bac
20590 6b 20 6d 6f 64 69 66 69 65 64 20 74 68 65 20 64  k modified the d
205a0 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20  atabase schema. 
205b0 49 6e 20 74 68 69 73 20 63 61 73 65 20 62 2d 74  In this case b-t
205c0 72 65 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65  ree root.** page
205d0 73 20 6d 61 79 20 62 65 20 6d 6f 76 65 64 20 6f  s may be moved o
205e0 72 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 74  r deleted from t
205f0 68 65 20 64 61 74 61 62 61 73 65 20 61 6c 74 6f  he database alto
20600 67 65 74 68 65 72 2c 20 6d 61 6b 69 6e 67 0a 2a  gether, making.*
20610 2a 20 69 74 20 75 6e 73 61 66 65 20 66 6f 72 20  * it unsafe for 
20620 72 65 61 64 20 63 75 72 73 6f 72 73 20 74 6f 20  read cursors to 
20630 63 6f 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a 20  continue..**.** 
20640 49 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79  If the writeOnly
20650 20 66 6c 61 67 20 69 73 20 74 72 75 65 20 61 6e   flag is true an
20660 64 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e  d an error is en
20670 63 6f 75 6e 74 65 72 65 64 20 77 68 69 6c 65 20  countered while 
20680 0a 2a 2a 20 73 61 76 69 6e 67 20 74 68 65 20 63  .** saving the c
20690 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20  urrent position 
206a0 6f 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63  of a read-only c
206b0 75 72 73 6f 72 2c 20 61 6c 6c 20 63 75 72 73 6f  ursor, all curso
206c0 72 73 2c 20 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e  rs, .** includin
206d0 67 20 61 6c 6c 20 72 65 61 64 2d 63 75 72 73 6f  g all read-curso
206e0 72 73 20 61 72 65 20 74 72 69 70 70 65 64 2e 0a  rs are tripped..
206f0 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
20700 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73  is returned if s
20710 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 69 66  uccessful, or if
20720 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
20730 20 77 68 69 6c 65 0a 2a 2a 20 73 61 76 69 6e 67   while.** saving
20740 20 61 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69   a cursor positi
20750 6f 6e 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  on, an SQLite er
20760 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74  ror code..*/.int
20770 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69   sqlite3BtreeTri
20780 70 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 72 65  pAllCursors(Btre
20790 65 20 2a 70 42 74 72 65 65 2c 20 69 6e 74 20 65  e *pBtree, int e
207a0 72 72 43 6f 64 65 2c 20 69 6e 74 20 77 72 69 74  rrCode, int writ
207b0 65 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73  eOnly){.  BtCurs
207c0 6f 72 20 2a 70 3b 0a 20 20 69 6e 74 20 72 63 20  or *p;.  int rc 
207d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
207e0 61 73 73 65 72 74 28 20 28 77 72 69 74 65 4f 6e  assert( (writeOn
207f0 6c 79 3d 3d 30 20 7c 7c 20 77 72 69 74 65 4f 6e  ly==0 || writeOn
20800 6c 79 3d 3d 31 29 20 26 26 20 42 54 43 46 5f 57  ly==1) && BTCF_W
20810 72 69 74 65 46 6c 61 67 3d 3d 31 20 29 3b 0a 20  riteFlag==1 );. 
20820 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20   if( pBtree ){. 
20830 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
20840 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  nter(pBtree);.  
20850 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e    for(p=pBtree->
20860 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
20870 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
20880 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
20890 20 69 66 28 20 77 72 69 74 65 4f 6e 6c 79 20 26   if( writeOnly &
208a0 26 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20 26  & (p->curFlags &
208b0 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29   BTCF_WriteFlag)
208c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
208d0 66 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55  f( p->eState==CU
208e0 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 2d  RSOR_VALID || p-
208f0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
20900 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20 20  SKIPNEXT ){.    
20910 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 43        rc = saveC
20920 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29  ursorPosition(p)
20930 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
20940 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
20950 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f  .            (vo
20960 69 64 29 73 71 6c 69 74 65 33 42 74 72 65 65 54  id)sqlite3BtreeT
20970 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  ripAllCursors(pB
20980 74 72 65 65 2c 20 72 63 2c 20 30 29 3b 0a 20 20  tree, rc, 0);.  
20990 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
209a0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
209b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
209c0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
209d0 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72  te3BtreeClearCur
209e0 73 6f 72 28 70 29 3b 0a 20 20 20 20 20 20 20 20  sor(p);.        
209f0 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  p->eState = CURS
20a00 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 20 20  OR_FAULT;.      
20a10 20 20 70 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20    p->skipNext = 
20a20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 7d  errCode;.      }
20a30 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
20a40 69 3c 3d 70 2d 3e 69 50 61 67 65 3b 20 69 2b 2b  i<=p->iPage; i++
20a50 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
20a60 73 65 50 61 67 65 28 70 2d 3e 61 70 50 61 67 65  sePage(p->apPage
20a70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  [i]);.        p-
20a80 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a  >apPage[i] = 0;.
20a90 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
20aa0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
20ab0 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d  ave(pBtree);.  }
20ac0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
20ad0 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
20ae0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
20af0 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a  in progress..**.
20b00 2a 2a 20 49 66 20 74 72 69 70 43 6f 64 65 20 69  ** If tripCode i
20b10 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20  s not SQLITE_OK 
20b20 74 68 65 6e 20 63 75 72 73 6f 72 73 20 77 69 6c  then cursors wil
20b30 6c 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64  l be invalidated
20b40 20 28 74 72 69 70 70 65 64 29 2e 0a 2a 2a 20 4f   (tripped)..** O
20b50 6e 6c 79 20 77 72 69 74 65 20 63 75 72 73 6f 72  nly write cursor
20b60 73 20 61 72 65 20 74 72 69 70 70 65 64 20 69 66  s are tripped if
20b70 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 74 72   writeOnly is tr
20b80 75 65 20 62 75 74 20 61 6c 6c 20 63 75 72 73 6f  ue but all curso
20b90 72 73 20 61 72 65 0a 2a 2a 20 74 72 69 70 70 65  rs are.** trippe
20ba0 64 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69  d if writeOnly i
20bb0 73 20 66 61 6c 73 65 2e 20 20 41 6e 79 20 61 74  s false.  Any at
20bc0 74 65 6d 70 74 20 74 6f 20 75 73 65 0a 2a 2a 20  tempt to use.** 
20bd0 61 20 74 72 69 70 70 65 64 20 63 75 72 73 6f 72  a tripped cursor
20be0 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20   will result in 
20bf0 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  an error..**.** 
20c00 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73  This will releas
20c10 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
20c20 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
20c30 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65   file.  If there
20c40 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76  .** are no activ
20c50 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c  e cursors, it al
20c60 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20  so releases the 
20c70 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e  read lock..*/.in
20c80 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  t sqlite3BtreeRo
20c90 6c 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70 2c  llback(Btree *p,
20ca0 20 69 6e 74 20 74 72 69 70 43 6f 64 65 2c 20 69   int tripCode, i
20cb0 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20  nt writeOnly){. 
20cc0 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
20cd0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
20ce0 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  t;.  MemPage *pP
20cf0 61 67 65 31 3b 0a 0a 20 20 61 73 73 65 72 74 28  age1;..  assert(
20d00 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 20 7c 7c   writeOnly==1 ||
20d10 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 29 3b   writeOnly==0 );
20d20 0a 20 20 61 73 73 65 72 74 28 20 74 72 69 70 43  .  assert( tripC
20d30 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 41 42 4f 52  ode==SQLITE_ABOR
20d40 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 74 72  T_ROLLBACK || tr
20d50 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  ipCode==SQLITE_O
20d60 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  K );.  sqlite3Bt
20d70 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69  reeEnter(p);.  i
20d80 66 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c  f( tripCode==SQL
20d90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
20da0 20 3d 20 74 72 69 70 43 6f 64 65 20 3d 20 73 61   = tripCode = sa
20db0 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
20dc0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
20dd0 20 72 63 20 29 20 77 72 69 74 65 4f 6e 6c 79 20   rc ) writeOnly 
20de0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
20df0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
20e00 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 72 69 70  ;.  }.  if( trip
20e10 43 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  Code ){.    int 
20e20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72  rc2 = sqlite3Btr
20e30 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
20e40 28 70 2c 20 74 72 69 70 43 6f 64 65 2c 20 77 72  (p, tripCode, wr
20e50 69 74 65 4f 6e 6c 79 29 3b 0a 20 20 20 20 61 73  iteOnly);.    as
20e60 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
20e70 5f 4f 4b 20 7c 7c 20 28 77 72 69 74 65 4f 6e 6c  _OK || (writeOnl
20e80 79 3d 3d 30 20 26 26 20 72 63 32 3d 3d 53 51 4c  y==0 && rc2==SQL
20e90 49 54 45 5f 4f 4b 29 20 29 3b 0a 20 20 20 20 69  ITE_OK) );.    i
20ea0 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f  f( rc2!=SQLITE_O
20eb0 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20  K ) rc = rc2;.  
20ec0 7d 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  }.  btreeIntegri
20ed0 74 79 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d  ty(p);..  if( p-
20ee0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
20ef0 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74  WRITE ){.    int
20f00 20 72 63 32 3b 0a 0a 20 20 20 20 61 73 73 65 72   rc2;..    asser
20f10 74 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d  t( TRANS_WRITE==
20f20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
20f30 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d 20  on );.    rc2 = 
20f40 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
20f50 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72  back(pBt->pPager
20f60 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d  );.    if( rc2!=
20f70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20f80 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20     rc = rc2;.   
20f90 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72   }..    /* The r
20fa0 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65  ollback may have
20fb0 20 64 65 73 74 72 6f 79 65 64 20 74 68 65 20 70   destroyed the p
20fc0 50 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c  Page1->aData val
20fd0 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63  ue.  So.    ** c
20fe0 61 6c 6c 20 62 74 72 65 65 47 65 74 50 61 67 65  all btreeGetPage
20ff0 28 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61  () on page 1 aga
21000 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a  in to make.    *
21010 2a 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61  * sure pPage1->a
21020 44 61 74 61 20 69 73 20 73 65 74 20 63 6f 72 72  Data is set corr
21030 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66  ectly. */.    if
21040 28 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  ( btreeGetPage(p
21050 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20  Bt, 1, &pPage1, 
21060 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  0)==SQLITE_OK ){
21070 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65  .      int nPage
21080 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b 28   = get4byte(28+(
21090 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74  u8*)pPage1->aDat
210a0 61 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  a);.      testca
210b0 73 65 28 20 6e 50 61 67 65 3d 3d 30 20 29 3b 0a  se( nPage==0 );.
210c0 20 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d        if( nPage=
210d0 3d 30 20 29 20 73 71 6c 69 74 65 33 50 61 67 65  =0 ) sqlite3Page
210e0 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
210f0 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b  pPager, &nPage);
21100 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
21110 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 6e 50 61   pBt->nPage!=nPa
21120 67 65 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  ge );.      pBt-
21130 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a  >nPage = nPage;.
21140 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
21150 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d  e(pPage1);.    }
21160 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 6f 75  .    assert( cou
21170 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70  ntValidCursors(p
21180 42 74 2c 20 31 29 3d 3d 30 20 29 3b 0a 20 20 20  Bt, 1)==0 );.   
21190 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
211a0 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44  ion = TRANS_READ
211b0 3b 0a 20 20 20 20 62 74 72 65 65 43 6c 65 61 72  ;.    btreeClear
211c0 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b  HasContent(pBt);
211d0 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64  .  }..  btreeEnd
211e0 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a  Transaction(p);.
211f0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
21200 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
21210 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74   rc;.}../*.** St
21220 61 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20  art a statement 
21230 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  subtransaction. 
21240 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69  The subtransacti
21250 6f 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64  on can be rolled
21260 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e  .** back indepen
21270 64 65 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61  dently of the ma
21280 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  in transaction. 
21290 59 6f 75 20 6d 75 73 74 20 73 74 61 72 74 20 61  You must start a
212a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a   transaction .**
212b0 20 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67   before starting
212c0 20 61 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f   a subtransactio
212d0 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61  n. The subtransa
212e0 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61  ction is ended a
212f0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a  utomatically .**
21300 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61   if the main tra
21310 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73  nsaction commits
21320 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a   or rolls back..
21330 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20  **.** Statement 
21340 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  subtransactions 
21350 61 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20  are used around 
21360 69 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73  individual SQL s
21370 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61  tatements.** tha
21380 74 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20  t are contained 
21390 77 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e  within a BEGIN..
213a0 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20  .COMMIT block.  
213b0 49 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a  If a constraint.
213c0 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  ** error occurs 
213d0 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65  within the state
213e0 6d 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74  ment, the effect
213f0 20 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61   of that one sta
21400 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65  tement.** can be
21410 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74   rolled back wit
21420 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72  hout having to r
21430 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69  ollback the enti
21440 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  re transaction..
21450 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e  **.** A statemen
21460 74 20 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f  t sub-transactio
21470 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  n is implemented
21480 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73   as an anonymous
21490 20 73 61 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a   savepoint. The.
214a0 2a 2a 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  ** value passed 
214b0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  as the second pa
214c0 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 74  rameter is the t
214d0 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73  otal number of s
214e0 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e  avepoints,.** in
214f0 63 6c 75 64 69 6e 67 20 74 68 65 20 6e 65 77 20  cluding the new 
21500 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f  anonymous savepo
21510 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65  int, open on the
21520 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69 66   B-Tree. i.e. if
21530 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
21540 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
21550 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20  ts and no other 
21560 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61  statement-transa
21570 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20  ctions open,.** 
21580 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20 31 2e  iStatement is 1.
21590 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20   This anonymous 
215a0 73 61 76 65 70 6f 69 6e 74 20 63 61 6e 20 62 65  savepoint can be
215b0 20 72 65 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c   released or rol
215c0 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e  led back.** usin
215d0 67 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72  g the sqlite3Btr
215e0 65 65 53 61 76 65 70 6f 69 6e 74 28 29 20 66 75  eeSavepoint() fu
215f0 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  nction..*/.int s
21600 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e  qlite3BtreeBegin
21610 53 74 6d 74 28 42 74 72 65 65 20 2a 70 2c 20 69  Stmt(Btree *p, i
21620 6e 74 20 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a  nt iStatement){.
21630 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
21640 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
21650 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  Bt;.  sqlite3Btr
21660 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73  eeEnter(p);.  as
21670 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73  sert( p->inTrans
21680 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
21690 0a 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d  .  assert( (pBt-
216a0 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
216b0 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b  READ_ONLY)==0 );
216c0 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74  .  assert( iStat
216d0 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73  ement>0 );.  ass
216e0 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e  ert( iStatement>
216f0 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  p->db->nSavepoin
21700 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
21710 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
21720 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n==TRANS_WRITE )
21730 3b 0a 20 20 2f 2a 20 41 74 20 74 68 65 20 70 61  ;.  /* At the pa
21740 67 65 72 20 6c 65 76 65 6c 2c 20 61 20 73 74 61  ger level, a sta
21750 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
21760 6f 6e 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e  on is a savepoin
21770 74 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20 69  t with.  ** an i
21780 6e 64 65 78 20 67 72 65 61 74 65 72 20 74 68 61  ndex greater tha
21790 6e 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73  n all savepoints
217a0 20 63 72 65 61 74 65 64 20 65 78 70 6c 69 63 69   created explici
217b0 74 6c 79 20 75 73 69 6e 67 0a 20 20 2a 2a 20 53  tly using.  ** S
217c0 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 49  QL statements. I
217d0 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20  t is illegal to 
217e0 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72  open, release or
217f0 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20   rollback any.  
21800 2a 2a 20 73 75 63 68 20 73 61 76 65 70 6f 69 6e  ** such savepoin
21810 74 73 20 77 68 69 6c 65 20 74 68 65 20 73 74 61  ts while the sta
21820 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
21830 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20  on savepoint is 
21840 61 63 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 72  active..  */.  r
21850 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
21860 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42  OpenSavepoint(pB
21870 74 2d 3e 70 50 61 67 65 72 2c 20 69 53 74 61 74  t->pPager, iStat
21880 65 6d 65 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65  ement);.  sqlite
21890 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
218a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
218b0 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  /*.** The second
218c0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
218d0 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20  s function, op, 
218e0 69 73 20 61 6c 77 61 79 73 20 53 41 56 45 50 4f  is always SAVEPO
218f0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20  INT_ROLLBACK.** 
21900 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  or SAVEPOINT_REL
21910 45 41 53 45 2e 20 54 68 69 73 20 66 75 6e 63 74  EASE. This funct
21920 69 6f 6e 20 65 69 74 68 65 72 20 72 65 6c 65 61  ion either relea
21930 73 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63  ses or rolls bac
21940 6b 20 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69  k the.** savepoi
21950 6e 74 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  nt identified by
21960 20 70 61 72 61 6d 65 74 65 72 20 69 53 61 76 65   parameter iSave
21970 70 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67  point, depending
21980 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 0a 2a   on the value .*
21990 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e  * of op..**.** N
219a0 6f 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f  ormally, iSavepo
219b0 69 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74  int is greater t
219c0 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
219d0 7a 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69  zero. However, i
219e0 66 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45 50  f op is.** SAVEP
219f0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74  OINT_ROLLBACK, t
21a00 68 65 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 6d  hen iSavepoint m
21a10 61 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49  ay also be -1. I
21a20 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
21a30 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  .** contents of 
21a40 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73  the entire trans
21a50 61 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65  action are rolle
21a60 64 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20  d back. This is 
21a70 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f  different.** fro
21a80 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73  m a normal trans
21a90 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c  action rollback,
21aa0 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65   as no locks are
21ab0 20 72 65 6c 65 61 73 65 64 20 61 6e 64 20 74 68   released and th
21ac0 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
21ad0 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a   remains open..*
21ae0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
21af0 65 65 53 61 76 65 70 6f 69 6e 74 28 42 74 72 65  eeSavepoint(Btre
21b00 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e  e *p, int op, in
21b10 74 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20  t iSavepoint){. 
21b20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
21b30 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26 26 20  _OK;.  if( p && 
21b40 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
21b50 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42  S_WRITE ){.    B
21b60 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
21b70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72  ->pBt;.    asser
21b80 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  t( op==SAVEPOINT
21b90 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d  _RELEASE || op==
21ba0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
21bb0 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  CK );.    assert
21bc0 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20  ( iSavepoint>=0 
21bd0 7c 7c 20 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d  || (iSavepoint==
21be0 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f  -1 && op==SAVEPO
21bf0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b  INT_ROLLBACK) );
21c00 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
21c10 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 69  eEnter(p);.    i
21c20 66 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  f( op==SAVEPOINT
21c30 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20  _ROLLBACK ){.   
21c40 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43     rc = saveAllC
21c50 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30  ursors(pBt, 0, 0
21c60 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
21c70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
21c80 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
21c90 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f 69  ite3PagerSavepoi
21ca0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
21cb0 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  op, iSavepoint);
21cc0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
21cd0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
21ce0 20 20 20 20 20 20 69 66 28 20 69 53 61 76 65 70        if( iSavep
21cf0 6f 69 6e 74 3c 30 20 26 26 20 28 70 42 74 2d 3e  oint<0 && (pBt->
21d00 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 49  btsFlags & BTS_I
21d10 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 29 21  NITIALLY_EMPTY)!
21d20 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  =0 ){.        pB
21d30 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  t->nPage = 0;.  
21d40 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
21d50 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74   newDatabase(pBt
21d60 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  );.      pBt->nP
21d70 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 32  age = get4byte(2
21d80 38 20 2b 20 70 42 74 2d 3e 70 50 61 67 65 31 2d  8 + pBt->pPage1-
21d90 3e 61 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20  >aData);..      
21da0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
21db0 73 69 7a 65 20 77 61 73 20 77 72 69 74 74 65 6e  size was written
21dc0 20 69 6e 74 6f 20 74 68 65 20 6f 66 66 73 65 74   into the offset
21dd0 20 32 38 20 6f 66 20 74 68 65 20 68 65 61 64 65   28 of the heade
21de0 72 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20  r.      ** when 
21df0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
21e00 73 74 61 72 74 65 64 2c 20 73 6f 20 77 65 20 6b  started, so we k
21e10 6e 6f 77 20 74 68 61 74 20 74 68 65 20 76 61 6c  now that the val
21e20 75 65 20 61 74 20 6f 66 66 73 65 74 0a 20 20 20  ue at offset.   
21e30 20 20 20 2a 2a 20 32 38 20 69 73 20 6e 6f 6e 7a     ** 28 is nonz
21e40 65 72 6f 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  ero. */.      as
21e50 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65  sert( pBt->nPage
21e60 3e 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >0 );.    }.    
21e70 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
21e80 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
21e90 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
21ea0 43 72 65 61 74 65 20 61 20 6e 65 77 20 63 75 72  Create a new cur
21eb0 73 6f 72 20 66 6f 72 20 74 68 65 20 42 54 72 65  sor for the BTre
21ec0 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 69 73 20  e whose root is 
21ed0 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69  on the page.** i
21ee0 54 61 62 6c 65 2e 20 49 66 20 61 20 72 65 61 64  Table. If a read
21ef0 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20 69 73 20  -only cursor is 
21f00 72 65 71 75 65 73 74 65 64 2c 20 69 74 20 69 73  requested, it is
21f10 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a   assumed that.**
21f20 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6c 72 65   the caller alre
21f30 61 64 79 20 68 61 73 20 61 74 20 6c 65 61 73 74  ady has at least
21f40 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61   a read-only tra
21f50 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a  nsaction open.**
21f60 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
21f70 20 61 6c 72 65 61 64 79 2e 20 49 66 20 61 20 77   already. If a w
21f80 72 69 74 65 2d 63 75 72 73 6f 72 20 69 73 20 72  rite-cursor is r
21f90 65 71 75 65 73 74 65 64 2c 20 74 68 65 6e 0a 2a  equested, then.*
21fa0 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  * the caller is 
21fb0 61 73 73 75 6d 65 64 20 74 6f 20 68 61 76 65 20  assumed to have 
21fc0 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  an open write tr
21fd0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
21fe0 20 49 66 20 74 68 65 20 42 54 52 45 45 5f 57 52   If the BTREE_WR
21ff0 43 53 52 20 62 69 74 20 6f 66 20 77 72 46 6c 61  CSR bit of wrFla
22000 67 20 69 73 20 63 6c 65 61 72 2c 20 74 68 65 6e  g is clear, then
22010 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20   the cursor can 
22020 6f 6e 6c 79 0a 2a 2a 20 62 65 20 75 73 65 64 20  only.** be used 
22030 66 6f 72 20 72 65 61 64 69 6e 67 2e 20 20 49 66  for reading.  If
22040 20 74 68 65 20 42 54 52 45 45 5f 57 52 43 53 52   the BTREE_WRCSR
22050 20 62 69 74 20 69 73 20 73 65 74 2c 20 74 68 65   bit is set, the
22060 6e 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  n the cursor.** 
22070 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20  can be used for 
22080 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72 20 77  reading or for w
22090 72 69 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20  riting if other 
220a0 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77  conditions for w
220b0 72 69 74 69 6e 67 0a 2a 2a 20 61 72 65 20 61 6c  riting.** are al
220c0 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65 20 61  so met.  These a
220d0 72 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  re the condition
220e0 73 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d  s that must be m
220f0 65 74 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 66  et in order.** f
22100 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20 62 65  or writing to be
22110 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20   allowed:.**.** 
22120 31 3a 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d  1:  The cursor m
22130 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70  ust have been op
22140 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67  ened with wrFlag
22150 20 63 6f 6e 74 61 69 6e 69 6e 67 20 42 54 52 45   containing BTRE
22160 45 5f 57 52 43 53 52 0a 2a 2a 0a 2a 2a 20 32 3a  E_WRCSR.**.** 2:
22170 20 20 4f 74 68 65 72 20 64 61 74 61 62 61 73 65    Other database
22180 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61   connections tha
22190 74 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65  t share the same
221a0 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a 20   pager cache.** 
221b0 20 20 20 20 62 75 74 20 77 68 69 63 68 20 61 72      but which ar
221c0 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45 41  e not in the REA
221d0 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74  D_UNCOMMITTED st
221e0 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65  ate may not have
221f0 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73 20  .**     cursors 
22200 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61 67  open with wrFlag
22210 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ==0 on the same 
22220 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73  table.  Otherwis
22230 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68 61  e.**     the cha
22240 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68 69  nges made by thi
22250 73 20 77 72 69 74 65 20 63 75 72 73 6f 72 20 77  s write cursor w
22260 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65 20  ould be visible 
22270 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72 65  to.**     the re
22280 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68  ad cursors in th
22290 65 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  e other database
222a0 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a   connection..**.
222b0 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61 62  ** 3:  The datab
222c0 61 73 65 20 6d 75 73 74 20 62 65 20 77 72 69 74  ase must be writ
222d0 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61  able (not on rea
222e0 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a  d-only media).**
222f0 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d 75  .** 4:  There mu
22300 73 74 20 62 65 20 61 6e 20 61 63 74 69 76 65 20  st be an active 
22310 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
22320 2a 2a 20 54 68 65 20 42 54 52 45 45 5f 46 4f 52  ** The BTREE_FOR
22330 44 45 4c 45 54 45 20 62 69 74 20 6f 66 20 77 72  DELETE bit of wr
22340 46 6c 61 67 20 6d 61 79 20 6f 70 74 69 6f 6e 61  Flag may optiona
22350 6c 6c 79 20 62 65 20 73 65 74 20 69 66 20 42 54  lly be set if BT
22360 52 45 45 5f 57 52 43 53 52 0a 2a 2a 20 69 73 20  REE_WRCSR.** is 
22370 73 65 74 2e 20 20 49 66 20 46 4f 52 44 45 4c 45  set.  If FORDELE
22380 54 45 20 69 73 20 73 65 74 2c 20 74 68 61 74 20  TE is set, that 
22390 69 73 20 61 20 68 69 6e 74 20 74 6f 20 74 68 65  is a hint to the
223a0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
223b0 74 68 61 74 0a 2a 2a 20 74 68 69 73 20 63 75 72  that.** this cur
223c0 73 6f 72 20 77 69 6c 6c 20 6f 6e 6c 79 20 62 65  sor will only be
223d0 20 75 73 65 64 20 74 6f 20 73 65 65 6b 20 74 6f   used to seek to
223e0 20 61 6e 64 20 64 65 6c 65 74 65 20 65 6e 74 72   and delete entr
223f0 69 65 73 20 6f 66 20 61 6e 20 69 6e 64 65 78 0a  ies of an index.
22400 2a 2a 20 61 73 20 70 61 72 74 20 6f 66 20 61 20  ** as part of a 
22410 6c 61 72 67 65 72 20 44 45 4c 45 54 45 20 73 74  larger DELETE st
22420 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 46 4f  atement.  The FO
22430 52 44 45 4c 45 54 45 20 68 69 6e 74 20 69 73 20  RDELETE hint is 
22440 6e 6f 74 20 75 73 65 64 20 62 79 0a 2a 2a 20 74  not used by.** t
22450 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  his implementati
22460 6f 6e 2e 20 20 42 75 74 20 69 6e 20 61 20 68 79  on.  But in a hy
22470 70 6f 74 68 65 74 69 63 61 6c 20 61 6c 74 65 72  pothetical alter
22480 6e 61 74 69 76 65 20 73 74 6f 72 61 67 65 20 65  native storage e
22490 6e 67 69 6e 65 20 0a 2a 2a 20 69 6e 20 77 68 69  ngine .** in whi
224a0 63 68 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73  ch index entries
224b0 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c   are automatical
224c0 6c 79 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  ly deleted when 
224d0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61  corresponding ta
224e0 62 6c 65 0a 2a 2a 20 72 6f 77 73 20 61 72 65 20  ble.** rows are 
224f0 64 65 6c 65 74 65 64 2c 20 74 68 65 20 46 4f 52  deleted, the FOR
22500 44 45 4c 45 54 45 20 66 6c 61 67 20 69 73 20 61  DELETE flag is a
22510 20 68 69 6e 74 20 74 68 61 74 20 61 6c 6c 20 53   hint that all S
22520 45 45 4b 20 61 6e 64 20 44 45 4c 45 54 45 0a 2a  EEK and DELETE.*
22530 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20  * operations on 
22540 74 68 69 73 20 63 75 72 73 6f 72 20 63 61 6e 20  this cursor can 
22550 62 65 20 6e 6f 2d 6f 70 73 20 61 6e 64 20 61 6c  be no-ops and al
22560 6c 20 52 45 41 44 20 6f 70 65 72 61 74 69 6f 6e  l READ operation
22570 73 20 63 61 6e 20 0a 2a 2a 20 72 65 74 75 72 6e  s can .** return
22580 20 61 20 6e 75 6c 6c 20 72 6f 77 20 28 32 2d 62   a null row (2-b
22590 79 74 65 73 3a 20 30 78 30 31 20 30 78 30 30 29  ytes: 0x01 0x00)
225a0 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b  ..**.** No check
225b0 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d  ing is done to m
225c0 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 70 61  ake sure that pa
225d0 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79  ge iTable really
225e0 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20   is the.** root 
225f0 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65  page of a b-tree
22600 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c  .  If it is not,
22610 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
22620 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c   acquired.** wil
22630 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65  l not work corre
22640 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  ctly..**.** It i
22650 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
22660 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  he sqlite3BtreeC
22670 75 72 73 6f 72 5a 65 72 6f 28 29 20 68 61 73 20  ursorZero() has 
22680 62 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f  been called.** o
22690 6e 20 70 43 75 72 20 74 6f 20 69 6e 69 74 69 61  n pCur to initia
226a0 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  lize the memory 
226b0 73 70 61 63 65 20 70 72 69 6f 72 20 74 6f 20 69  space prior to i
226c0 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75  nvoking this rou
226d0 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tine..*/.static 
226e0 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72 28  int btreeCursor(
226f0 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20  .  Btree *p,    
22700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22710 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
22720 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20   btree */.  int 
22730 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
22740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22750 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
22760 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e  of table to open
22770 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67   */.  int wrFlag
22780 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
22790 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
227a0 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65  1 to write. 0 re
227b0 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72  ad-only */.  str
227c0 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  uct KeyInfo *pKe
227d0 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20  yInfo,          
227e0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
227f0 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66   to comparison f
22800 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43  unction */.  BtC
22810 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20  ursor *pCur     
22820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22830 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72      /* Space for
22840 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29   new cursor */.)
22850 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
22860 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20 20  t = p->pBt;     
22870 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68             /* Sh
22880 61 72 65 64 20 62 2d 74 72 65 65 20 68 61 6e 64  ared b-tree hand
22890 6c 65 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72  le */.  BtCursor
228a0 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20   *pX;           
228b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
228c0 2a 20 4c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 6f  * Looping over o
228d0 74 68 65 72 20 61 6c 6c 20 63 75 72 73 6f 72 73  ther all cursors
228e0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
228f0 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
22900 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73  Mutex(p) );.  as
22910 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
22920 0a 20 20 20 20 20 20 20 7c 7c 20 77 72 46 6c 61  .       || wrFla
22930 67 3d 3d 42 54 52 45 45 5f 57 52 43 53 52 20 0a  g==BTREE_WRCSR .
22940 20 20 20 20 20 20 20 7c 7c 20 77 72 46 6c 61 67         || wrFlag
22950 3d 3d 28 42 54 52 45 45 5f 57 52 43 53 52 7c 42  ==(BTREE_WRCSR|B
22960 54 52 45 45 5f 46 4f 52 44 45 4c 45 54 45 29 20  TREE_FORDELETE) 
22970 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  .  );..  /* The 
22980 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
22990 20 73 74 61 74 65 6d 65 6e 74 73 20 76 65 72 69   statements veri
229a0 66 79 20 74 68 61 74 20 69 66 20 74 68 69 73 20  fy that if this 
229b0 69 73 20 61 20 73 68 61 72 61 62 6c 65 20 0a 20  is a sharable . 
229c0 20 2a 2a 20 62 2d 74 72 65 65 20 64 61 74 61 62   ** b-tree datab
229d0 61 73 65 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74  ase, the connect
229e0 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 74  ion is holding t
229f0 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62 6c  he required tabl
22a00 65 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61  e locks, .  ** a
22a10 6e 64 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  nd that no other
22a20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20   connection has 
22a30 61 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 20  any open cursor 
22a40 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 20 77  that conflicts w
22a50 69 74 68 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c  ith .  ** this l
22a60 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ock.  */.  asser
22a70 74 28 20 68 61 73 53 68 61 72 65 64 43 61 63 68  t( hasSharedCach
22a80 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54  eTableLock(p, iT
22a90 61 62 6c 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d  able, pKeyInfo!=
22aa0 30 2c 20 28 77 72 46 6c 61 67 3f 32 3a 31 29 29  0, (wrFlag?2:1))
22ab0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72   );.  assert( wr
22ac0 46 6c 61 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52  Flag==0 || !hasR
22ad0 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20  eadConflicts(p, 
22ae0 69 54 61 62 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a  iTable) );..  /*
22af0 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65   Assert that the
22b00 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 70 65 6e   caller has open
22b10 65 64 20 74 68 65 20 72 65 71 75 69 72 65 64 20  ed the required 
22b20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a  transaction. */.
22b30 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54    assert( p->inT
22b40 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20  rans>TRANS_NONE 
22b50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  );.  assert( wrF
22b60 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54  lag==0 || p->inT
22b70 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
22b80 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
22b90 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20 70 42  Bt->pPage1 && pB
22ba0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
22bb0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72   );.  assert( wr
22bc0 46 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 42 74 2d  Flag==0 || (pBt-
22bd0 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
22be0 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b  READ_ONLY)==0 );
22bf0 0a 0a 20 20 69 66 28 20 77 72 46 6c 61 67 20 29  ..  if( wrFlag )
22c00 7b 0a 20 20 20 20 61 6c 6c 6f 63 61 74 65 54 65  {.    allocateTe
22c10 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
22c20 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53    if( pBt->pTmpS
22c30 70 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  pace==0 ) return
22c40 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
22c50 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54  PT;.  }.  if( iT
22c60 61 62 6c 65 3d 3d 31 20 26 26 20 62 74 72 65 65  able==1 && btree
22c70 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d  Pagecount(pBt)==
22c80 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
22c90 20 77 72 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20   wrFlag==0 );.  
22ca0 20 20 69 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20    iTable = 0;.  
22cb0 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74  }..  /* Now that
22cc0 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73   no other errors
22cd0 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69   can occur, fini
22ce0 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68  sh filling in th
22cf0 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20  e BtCursor.  ** 
22d00 76 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6c 69  variables and li
22d10 6e 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e  nk the cursor in
22d20 74 6f 20 74 68 65 20 42 74 53 68 61 72 65 64 20  to the BtShared 
22d30 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72  list.  */.  pCur
22d40 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67  ->pgnoRoot = (Pg
22d50 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70 43 75  no)iTable;.  pCu
22d60 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20  r->iPage = -1;. 
22d70 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20   pCur->pKeyInfo 
22d80 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43  = pKeyInfo;.  pC
22d90 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a  ur->pBtree = p;.
22da0 20 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42    pCur->pBt = pB
22db0 74 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  t;.  pCur->curFl
22dc0 61 67 73 20 3d 20 77 72 46 6c 61 67 20 3f 20 42  ags = wrFlag ? B
22dd0 54 43 46 5f 57 72 69 74 65 46 6c 61 67 20 3a 20  TCF_WriteFlag : 
22de0 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 50 61  0;.  pCur->curPa
22df0 67 65 72 46 6c 61 67 73 20 3d 20 77 72 46 6c 61  gerFlags = wrFla
22e00 67 20 3f 20 30 20 3a 20 50 41 47 45 52 5f 47 45  g ? 0 : PAGER_GE
22e10 54 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 2f 2a  T_READONLY;.  /*
22e20 20 49 66 20 74 68 65 72 65 20 61 72 65 20 74 77   If there are tw
22e30 6f 20 6f 72 20 6d 6f 72 65 20 63 75 72 73 6f 72  o or more cursor
22e40 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 62 74  s on the same bt
22e50 72 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20 73 75  ree, then all su
22e60 63 68 0a 20 20 2a 2a 20 63 75 72 73 6f 72 73 20  ch.  ** cursors 
22e70 2a 6d 75 73 74 2a 20 68 61 76 65 20 74 68 65 20  *must* have the 
22e80 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c  BTCF_Multiple fl
22e90 61 67 20 73 65 74 2e 20 2a 2f 0a 20 20 66 6f 72  ag set. */.  for
22ea0 28 70 58 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  (pX=pBt->pCursor
22eb0 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65  ; pX; pX=pX->pNe
22ec0 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 58 2d  xt){.    if( pX-
22ed0 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 28 50 67 6e 6f  >pgnoRoot==(Pgno
22ee0 29 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  )iTable ){.     
22ef0 20 70 58 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d   pX->curFlags |=
22f00 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a   BTCF_Multiple;.
22f10 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46        pCur->curF
22f20 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 4d 75 6c  lags |= BTCF_Mul
22f30 74 69 70 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d  tiple;.    }.  }
22f40 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d  .  pCur->pNext =
22f50 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20   pBt->pCursor;. 
22f60 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
22f70 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53  pCur;.  pCur->eS
22f80 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
22f90 56 41 4c 49 44 3b 0a 20 20 72 65 74 75 72 6e 20  VALID;.  return 
22fa0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74  SQLITE_OK;.}.int
22fb0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
22fc0 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c  sor(.  Btree *p,
22fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ff0 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
23000 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
23010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23030 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66   /* Root page of
23040 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a   table to open *
23050 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20  /.  int wrFlag, 
23060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23080 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30  /* 1 to write. 0
23090 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20   read-only */.  
230a0 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a  struct KeyInfo *
230b0 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20  pKeyInfo,       
230c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
230d0 69 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d  irst arg to xCom
230e0 70 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75  pare() */.  BtCu
230f0 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20  rsor *pCur      
23100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23110 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
23120 20 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72 65   new cursor here
23130 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
23140 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3c 31 20  .  if( iTable<1 
23150 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
23160 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
23170 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
23180 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
23190 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72  p);.    rc = btr
231a0 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54 61 62  eeCursor(p, iTab
231b0 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65 79  le, wrFlag, pKey
231c0 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20 20  Info, pCur);.   
231d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
231e0 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ve(p);.  }.  ret
231f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
23200 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   Return the size
23210 20 6f 66 20 61 20 42 74 43 75 72 73 6f 72 20 6f   of a BtCursor o
23220 62 6a 65 63 74 20 69 6e 20 62 79 74 65 73 2e 0a  bject in bytes..
23230 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65 72  **.** This inter
23240 66 61 63 65 73 20 69 73 20 6e 65 65 64 65 64 20  faces is needed 
23250 73 6f 20 74 68 61 74 20 75 73 65 72 73 20 6f 66  so that users of
23260 20 63 75 72 73 6f 72 73 20 63 61 6e 20 70 72 65   cursors can pre
23270 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66  allocate.** suff
23280 69 63 69 65 6e 74 20 73 74 6f 72 61 67 65 20 74  icient storage t
23290 6f 20 68 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e  o hold a cursor.
232a0 20 20 54 68 65 20 42 74 43 75 72 73 6f 72 20 6f    The BtCursor o
232b0 62 6a 65 63 74 20 69 73 20 6f 70 61 71 75 65 0a  bject is opaque.
232c0 2a 2a 20 74 6f 20 75 73 65 72 73 20 73 6f 20 74  ** to users so t
232d0 68 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68  hey cannot do th
232e0 65 20 73 69 7a 65 6f 66 28 29 20 74 68 65 6d 73  e sizeof() thems
232f0 65 6c 76 65 73 20 2d 20 74 68 65 79 20 6d 75 73  elves - they mus
23300 74 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72  t call.** this r
23310 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73  outine..*/.int s
23320 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
23330 72 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72  rSize(void){.  r
23340 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 73 69 7a  eturn ROUND8(siz
23350 65 6f 66 28 42 74 43 75 72 73 6f 72 29 29 3b 0a  eof(BtCursor));.
23360 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
23370 69 7a 65 20 6d 65 6d 6f 72 79 20 74 68 61 74 20  ize memory that 
23380 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65  will be converte
23390 64 20 69 6e 74 6f 20 61 20 42 74 43 75 72 73 6f  d into a BtCurso
233a0 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  r object..**.** 
233b0 54 68 65 20 73 69 6d 70 6c 65 20 61 70 70 72 6f  The simple appro
233c0 61 63 68 20 68 65 72 65 20 77 6f 75 6c 64 20 62  ach here would b
233d0 65 20 74 6f 20 6d 65 6d 73 65 74 28 29 20 74 68  e to memset() th
233e0 65 20 65 6e 74 69 72 65 20 6f 62 6a 65 63 74 0a  e entire object.
233f0 2a 2a 20 74 6f 20 7a 65 72 6f 2e 20 20 42 75 74  ** to zero.  But
23400 20 69 74 20 74 75 72 6e 73 20 6f 75 74 20 74 68   it turns out th
23410 61 74 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20  at the apPage[] 
23420 61 6e 64 20 61 69 49 64 78 5b 5d 20 61 72 72 61  and aiIdx[] arra
23430 79 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 65  ys.** do not nee
23440 64 20 74 6f 20 62 65 20 7a 65 72 6f 65 64 20 61  d to be zeroed a
23450 6e 64 20 74 68 65 79 20 61 72 65 20 6c 61 72 67  nd they are larg
23460 65 2c 20 73 6f 20 77 65 20 63 61 6e 20 73 61 76  e, so we can sav
23470 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75  e a lot.** of ru
23480 6e 2d 74 69 6d 65 20 62 79 20 73 6b 69 70 70 69  n-time by skippi
23490 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a  ng the initializ
234a0 61 74 69 6f 6e 20 6f 66 20 74 68 6f 73 65 20 65  ation of those e
234b0 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64  lements..*/.void
234c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
234d0 73 6f 72 5a 65 72 6f 28 42 74 43 75 72 73 6f 72  sorZero(BtCursor
234e0 20 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70   *p){.  memset(p
234f0 2c 20 30 2c 20 6f 66 66 73 65 74 6f 66 28 42 74  , 0, offsetof(Bt
23500 43 75 72 73 6f 72 2c 20 69 50 61 67 65 29 29 3b  Cursor, iPage));
23510 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
23520 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 72  a cursor.  The r
23530 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead lock on the 
23540 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
23550 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65   released.** whe
23560 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72 73 6f  n the last curso
23570 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a  r is closed..*/.
23580 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
23590 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74 43 75  CloseCursor(BtCu
235a0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 42  rsor *pCur){.  B
235b0 74 72 65 65 20 2a 70 42 74 72 65 65 20 3d 20 70  tree *pBtree = p
235c0 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69  Cur->pBtree;.  i
235d0 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20  f( pBtree ){.   
235e0 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 53 68   int i;.    BtSh
235f0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72  ared *pBt = pCur
23600 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74  ->pBt;.    sqlit
23610 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74  e3BtreeEnter(pBt
23620 72 65 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ree);.    sqlite
23630 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f  3BtreeClearCurso
23640 72 28 70 43 75 72 29 3b 0a 20 20 20 20 61 73 73  r(pCur);.    ass
23650 65 72 74 28 20 70 42 74 2d 3e 70 43 75 72 73 6f  ert( pBt->pCurso
23660 72 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  r!=0 );.    if( 
23670 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d 70 43  pBt->pCursor==pC
23680 75 72 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  ur ){.      pBt-
23690 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 2d  >pCursor = pCur-
236a0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73  >pNext;.    }els
236b0 65 7b 0a 20 20 20 20 20 20 42 74 43 75 72 73 6f  e{.      BtCurso
236c0 72 20 2a 70 50 72 65 76 20 3d 20 70 42 74 2d 3e  r *pPrev = pBt->
236d0 70 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 64  pCursor;.      d
236e0 6f 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  o{.        if( p
236f0 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 43 75  Prev->pNext==pCu
23700 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  r ){.          p
23710 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43  Prev->pNext = pC
23720 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ur->pNext;.     
23730 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
23740 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
23750 72 65 76 20 3d 20 70 50 72 65 76 2d 3e 70 4e 65  rev = pPrev->pNe
23760 78 74 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65  xt;.      }while
23770 28 20 41 4c 57 41 59 53 28 70 50 72 65 76 29 20  ( ALWAYS(pPrev) 
23780 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
23790 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69  (i=0; i<=pCur->i
237a0 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
237b0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
237c0 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a  ur->apPage[i]);.
237d0 20 20 20 20 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b      }.    unlock
237e0 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
237f0 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
23800 66 72 65 65 28 70 43 75 72 2d 3e 61 4f 76 65 72  free(pCur->aOver
23810 66 6c 6f 77 29 3b 0a 20 20 20 20 2f 2a 20 73 71  flow);.    /* sq
23820 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 29  lite3_free(pCur)
23830 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  ; */.    sqlite3
23840 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65  BtreeLeave(pBtre
23850 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
23860 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
23870 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  *.** Make sure t
23880 68 65 20 42 74 43 75 72 73 6f 72 2a 20 67 69 76  he BtCursor* giv
23890 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  en in the argume
238a0 6e 74 20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a  nt has a valid.*
238b0 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20  * BtCursor.info 
238c0 73 74 72 75 63 74 75 72 65 2e 20 20 49 66 20 69  structure.  If i
238d0 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
238e0 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20   valid, call.** 
238f0 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29  btreeParseCell()
23900 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a   to fill it in..
23910 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69  **.** BtCursor.i
23920 6e 66 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f  nfo is a cache o
23930 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  f the informatio
23940 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  n in the current
23950 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20   cell..** Using 
23960 74 68 69 73 20 63 61 63 68 65 20 72 65 64 75 63  this cache reduc
23970 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  es the number of
23980 20 63 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 50   calls to btreeP
23990 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2f 0a 23  arseCell()..*/.#
239a0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
239b0 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
239c0 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72  rtCellInfo(BtCur
239d0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20  sor *pCur){.    
239e0 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
239f0 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70     int iPage = p
23a00 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20  Cur->iPage;.    
23a10 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c  memset(&info, 0,
23a20 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a   sizeof(info));.
23a30 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
23a40 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ll(pCur->apPage[
23a50 69 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69  iPage], pCur->ai
23a60 49 64 78 5b 69 50 61 67 65 5d 2c 20 26 69 6e 66  Idx[iPage], &inf
23a70 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  o);.    assert( 
23a80 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 6d 65  CORRUPT_DB || me
23a90 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43 75  mcmp(&info, &pCu
23aa0 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28  r->info, sizeof(
23ab0 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d  info))==0 );.  }
23ac0 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65  .#else.  #define
23ad0 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
23ae0 78 29 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63  x).#endif.static
23af0 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
23b00 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e 66   void getCellInf
23b10 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  o(BtCursor *pCur
23b20 29 7b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69  ){.  if( pCur->i
23b30 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a  nfo.nSize==0 ){.
23b40 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20      int iPage = 
23b50 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20  pCur->iPage;.   
23b60 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
23b70 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65  |= BTCF_ValidNKe
23b80 79 3b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73  y;.    btreePars
23b90 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61  eCell(pCur->apPa
23ba0 67 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e  ge[iPage],pCur->
23bb0 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43  aiIdx[iPage],&pC
23bc0 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d 65 6c  ur->info);.  }el
23bd0 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 43 65  se{.    assertCe
23be0 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
23bf0 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  }.}..#ifndef NDE
23c00 42 55 47 20 20 2f 2a 20 54 68 65 20 6e 65 78 74  BUG  /* The next
23c10 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 6f 6e   routine used on
23c20 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65 72 74  ly within assert
23c30 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f  () statements */
23c40 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
23c50 75 65 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  ue if the given 
23c60 42 74 43 75 72 73 6f 72 20 69 73 20 76 61 6c 69  BtCursor is vali
23c70 64 2e 20 20 41 20 76 61 6c 69 64 20 63 75 72 73  d.  A valid curs
23c80 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20 74 68 61  or is one.** tha
23c90 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
23ca0 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 72 6f 77  ointing to a row
23cb0 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70 74 79   in a (non-empty
23cc0 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73  ) table..** This
23cd0 20 69 73 20 61 20 76 65 72 69 66 69 63 61 74 69   is a verificati
23ce0 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  on routine is us
23cf0 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61  ed only within a
23d00 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
23d10 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ts..*/.int sqlit
23d20 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56  e3BtreeCursorIsV
23d30 61 6c 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70  alid(BtCursor *p
23d40 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  Cur){.  return p
23d50 43 75 72 20 26 26 20 70 43 75 72 2d 3e 65 53 74  Cur && pCur->eSt
23d60 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
23d70 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4e  D;.}.#endif /* N
23d80 44 45 42 55 47 20 2a 2f 0a 69 6e 74 20 73 71 6c  DEBUG */.int sql
23d90 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49  ite3BtreeCursorI
23da0 73 56 61 6c 69 64 4e 4e 28 42 74 43 75 72 73 6f  sValidNN(BtCurso
23db0 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
23dc0 72 74 28 20 70 43 75 72 21 3d 30 20 29 3b 0a 20  rt( pCur!=0 );. 
23dd0 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 65 53   return pCur->eS
23de0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
23df0 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ID;.}../*.** Ret
23e00 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66  urn the value of
23e10 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79   the integer key
23e20 20 6f 72 20 22 72 6f 77 69 64 22 20 66 6f 72 20   or "rowid" for 
23e30 61 20 74 61 62 6c 65 20 62 74 72 65 65 2e 0a 2a  a table btree..*
23e40 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
23e50 73 20 6f 6e 6c 79 20 76 61 6c 69 64 20 66 6f 72  s only valid for
23e60 20 61 20 63 75 72 73 6f 72 20 74 68 61 74 20 69   a cursor that i
23e70 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e 74 6f 20  s pointing into 
23e80 61 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20 74 61  a.** ordinary ta
23e90 62 6c 65 20 62 74 72 65 65 2e 20 20 49 66 20 74  ble btree.  If t
23ea0 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 73  he cursor points
23eb0 20 74 6f 20 61 6e 20 69 6e 64 65 78 20 62 74 72   to an index btr
23ec0 65 65 20 6f 72 0a 2a 2a 20 69 73 20 69 6e 76 61  ee or.** is inva
23ed0 6c 69 64 2c 20 74 68 65 20 72 65 73 75 6c 74 20  lid, the result 
23ee0 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
23ef0 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f  is undefined..*/
23f00 0a 69 36 34 20 73 71 6c 69 74 65 33 42 74 72 65  .i64 sqlite3Btre
23f10 65 49 6e 74 65 67 65 72 4b 65 79 28 42 74 43 75  eIntegerKey(BtCu
23f20 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
23f30 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
23f40 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
23f50 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
23f60 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
23f70 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
23f80 74 28 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b  t( pCur->curIntK
23f90 65 79 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49  ey );.  getCellI
23fa0 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 72 65 74  nfo(pCur);.  ret
23fb0 75 72 6e 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  urn pCur->info.n
23fc0 4b 65 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Key;.}../*.** Re
23fd0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
23fe0 6f 66 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c  of bytes of payl
23ff0 6f 61 64 20 66 6f 72 20 74 68 65 20 65 6e 74 72  oad for the entr
24000 79 20 74 68 61 74 20 70 43 75 72 20 69 73 0a 2a  y that pCur is.*
24010 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  * currently poin
24020 74 69 6e 67 20 74 6f 2e 20 20 46 6f 72 20 74 61  ting to.  For ta
24030 62 6c 65 20 62 74 72 65 65 73 2c 20 74 68 69 73  ble btrees, this
24040 20 77 69 6c 6c 20 62 65 20 74 68 65 20 61 6d 6f   will be the amo
24050 75 6e 74 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20  unt.** of data. 
24060 20 46 6f 72 20 69 6e 64 65 78 20 62 74 72 65 65   For index btree
24070 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20  s, this will be 
24080 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
24090 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  key..**.** The c
240a0 61 6c 6c 65 72 20 6d 75 73 74 20 67 75 61 72 61  aller must guara
240b0 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 63 75  ntee that the cu
240c0 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
240d0 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a   to a non-NULL.*
240e0 2a 20 76 61 6c 69 64 20 65 6e 74 72 79 2e 20 20  * valid entry.  
240f0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
24100 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63  the calling proc
24110 65 64 75 72 65 20 6d 75 73 74 20 67 75 61 72 61  edure must guara
24120 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20 74 68 65  ntee.** that the
24130 20 63 75 72 73 6f 72 20 68 61 73 20 43 75 72 73   cursor has Curs
24140 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  or.eState==CURSO
24150 52 5f 56 41 4c 49 44 2e 0a 2a 2f 0a 75 33 32 20  R_VALID..*/.u32 
24160 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c  sqlite3BtreePayl
24170 6f 61 64 53 69 7a 65 28 42 74 43 75 72 73 6f 72  oadSize(BtCursor
24180 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72   *pCur){.  asser
24190 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
241a0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
241b0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
241c0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
241d0 44 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e  D );.  getCellIn
241e0 66 6f 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75  fo(pCur);.  retu
241f0 72 6e 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50  rn pCur->info.nP
24200 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ayload;.}../*.**
24210 20 47 69 76 65 6e 20 74 68 65 20 70 61 67 65 20   Given the page 
24220 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76 65  number of an ove
24230 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
24240 65 20 64 61 74 61 62 61 73 65 20 28 70 61 72 61  e database (para
24250 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20  meter.** ovfl), 
24260 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69  this function fi
24270 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d  nds the page num
24280 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ber of the next 
24290 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20  page in the .** 
242a0 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f  linked list of o
242b0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49  verflow pages. I
242c0 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74 20 75  f possible, it u
242d0 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76 61 63  ses the auto-vac
242e0 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d  uum.** pointer-m
242f0 61 70 20 64 61 74 61 20 69 6e 73 74 65 61 64 20  ap data instead 
24300 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65 20 63  of reading the c
24310 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20 6f  ontent of page o
24320 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a  vfl to do so. .*
24330 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
24340 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c 69 74   occurs an SQLit
24350 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
24360 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
24370 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ise:.**.** The p
24380 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
24390 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20  e next overflow 
243a0 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b  page in the link
243b0 65 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a 20 77  ed list is .** w
243c0 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f  ritten to *pPgno
243d0 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20 6f 76  Next. If page ov
243e0 66 6c 20 69 73 20 74 68 65 20 6c 61 73 74 20 70  fl is the last p
243f0 61 67 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65  age in its linke
24400 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70 50 67  d .** list, *pPg
24410 6e 6f 4e 65 78 74 20 69 73 20 73 65 74 20 74 6f  noNext is set to
24420 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66   zero. .**.** If
24430 20 70 70 50 61 67 65 20 69 73 20 6e 6f 74 20 4e   ppPage is not N
24440 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66 65 72  ULL, and a refer
24450 65 6e 63 65 20 74 6f 20 74 68 65 20 4d 65 6d 50  ence to the MemP
24460 61 67 65 20 6f 62 6a 65 63 74 20 63 6f 72 72 65  age object corre
24470 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70  sponding.** to p
24480 61 67 65 20 6e 75 6d 62 65 72 20 70 4f 76 66 6c  age number pOvfl
24490 20 77 61 73 20 6f 62 74 61 69 6e 65 64 2c 20 74   was obtained, t
244a0 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73 20 73  hen *ppPage is s
244b0 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  et to point to t
244c0 68 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  hat.** reference
244d0 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70  . It is the resp
244e0 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
244f0 65 20 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c 6c  e caller to call
24500 20 72 65 6c 65 61 73 65 50 61 67 65 28 29 0a 2a   releasePage().*
24510 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f 20  * on *ppPage to 
24520 66 72 65 65 20 74 68 65 20 72 65 66 65 72 65 6e  free the referen
24530 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72 65  ce. In no refere
24540 6e 63 65 20 77 61 73 20 6f 62 74 61 69 6e 65 64  nce was obtained
24550 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65   (because.** the
24560 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61 73   pointer-map was
24570 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69 6e 20   used to obtain 
24580 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 2a 70  the value for *p
24590 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e 0a  PgnoNext), then.
245a0 2a 2a 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  ** *ppPage is se
245b0 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74  t to zero..*/.st
245c0 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76 65 72  atic int getOver
245d0 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74 53 68  flowPage(.  BtSh
245e0 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
245f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
24600 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
24610 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20  .  Pgno ovfl,   
24620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24630 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76 65 72 66  /* Current overf
24640 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20  low page number 
24650 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  */.  MemPage **p
24660 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
24670 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67    /* OUT: MemPag
24680 65 20 68 61 6e 64 6c 65 20 28 6d 61 79 20 62 65  e handle (may be
24690 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f   NULL) */.  Pgno
246a0 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20 20 20   *pPgnoNext     
246b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
246c0 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70   Next overflow p
246d0 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b  age number */.){
246e0 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30  .  Pgno next = 0
246f0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
24700 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ge = 0;.  int rc
24710 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
24720 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
24730 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
24740 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
24750 65 72 74 28 70 50 67 6e 6f 4e 65 78 74 29 3b 0a  ert(pPgnoNext);.
24760 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
24770 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
24780 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64    /* Try to find
24790 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
247a0 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c  n the overflow l
247b0 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20  ist using the.  
247c0 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20 70 6f  ** autovacuum po
247d0 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e  inter-map pages.
247e0 20 47 75 65 73 73 20 74 68 61 74 20 74 68 65 20   Guess that the 
247f0 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a 20 20  next page in .  
24800 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  ** the overflow 
24810 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e 75 6d  list is page num
24820 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66  ber (ovfl+1). If
24830 20 74 68 61 74 20 67 75 65 73 73 20 74 75 72 6e   that guess turn
24840 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62  s .  ** out to b
24850 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61  e wrong, fall ba
24860 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68  ck to loading th
24870 65 20 64 61 74 61 20 6f 66 20 70 61 67 65 20 0a  e data of page .
24880 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c    ** number ovfl
24890 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
248a0 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75 6d 62  e next page numb
248b0 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  er..  */.  if( p
248c0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
248d0 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  {.    Pgno pgno;
248e0 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65 73 73  .    Pgno iGuess
248f0 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75   = ovfl+1;.    u
24900 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 77 68  8 eType;..    wh
24910 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41  ile( PTRMAP_ISPA
24920 47 45 28 70 42 74 2c 20 69 47 75 65 73 73 29 20  GE(pBt, iGuess) 
24930 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e 44 49  || iGuess==PENDI
24940 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
24950 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75 65 73  ) ){.      iGues
24960 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  s++;.    }..    
24970 69 66 28 20 69 47 75 65 73 73 3c 3d 62 74 72 65  if( iGuess<=btre
24980 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  ePagecount(pBt) 
24990 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74  ){.      rc = pt
249a0 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 47 75  rmapGet(pBt, iGu
249b0 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26 70 67  ess, &eType, &pg
249c0 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  no);.      if( r
249d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
249e0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
249f0 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d  ERFLOW2 && pgno=
24a00 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 20  =ovfl ){.       
24a10 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73 3b 0a   next = iGuess;.
24a20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
24a30 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20  ITE_DONE;.      
24a40 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
24a50 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 65  if..  assert( ne
24a60 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c  xt==0 || rc==SQL
24a70 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66  ITE_DONE );.  if
24a80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
24a90 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  ){.    rc = btre
24aa0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f 76  eGetPage(pBt, ov
24ab0 66 6c 2c 20 26 70 50 61 67 65 2c 20 28 70 70 50  fl, &pPage, (ppP
24ac0 61 67 65 3d 3d 30 29 20 3f 20 50 41 47 45 52 5f  age==0) ? PAGER_
24ad0 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30  GET_READONLY : 0
24ae0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
24af0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
24b00 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20  pPage==0 );.    
24b10 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
24b20 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78 74 20  K ){.      next 
24b30 3d 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65  = get4byte(pPage
24b40 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a  ->aData);.    }.
24b50 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65 78    }..  *pPgnoNex
24b60 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66 28 20  t = next;.  if( 
24b70 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20 2a 70  ppPage ){.    *p
24b80 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a 20  pPage = pPage;. 
24b90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65   }else{.    rele
24ba0 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
24bb0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 72 63    }.  return (rc
24bc0 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f 20  ==SQLITE_DONE ? 
24bd0 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29 3b  SQLITE_OK : rc);
24be0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64  .}../*.** Copy d
24bf0 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65  ata from a buffe
24c00 72 20 74 6f 20 61 20 70 61 67 65 2c 20 6f 72 20  r to a page, or 
24c10 66 72 6f 6d 20 61 20 70 61 67 65 20 74 6f 20 61  from a page to a
24c20 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70   buffer..**.** p
24c30 50 61 79 6c 6f 61 64 20 69 73 20 61 20 70 6f 69  Payload is a poi
24c40 6e 74 65 72 20 74 6f 20 64 61 74 61 20 73 74 6f  nter to data sto
24c50 72 65 64 20 6f 6e 20 64 61 74 61 62 61 73 65 20  red on database 
24c60 70 61 67 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a  page pDbPage..**
24c70 20 49 66 20 61 72 67 75 6d 65 6e 74 20 65 4f 70   If argument eOp
24c80 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20   is false, then 
24c90 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 64  nByte bytes of d
24ca0 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 0a 2a  ata are copied.*
24cb0 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20  * from pPayload 
24cc0 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 70 6f  to the buffer po
24cd0 69 6e 74 65 64 20 61 74 20 62 79 20 70 42 75 66  inted at by pBuf
24ce0 2e 20 49 66 20 65 4f 70 20 69 73 20 74 72 75 65  . If eOp is true
24cf0 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74 65  ,.** then sqlite
24d00 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73  3PagerWrite() is
24d10 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61   called on pDbPa
24d20 67 65 20 61 6e 64 20 6e 42 79 74 65 20 62 79 74  ge and nByte byt
24d30 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61 72  es.** of data ar
24d40 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68  e copied from th
24d50 65 20 62 75 66 66 65 72 20 70 42 75 66 20 74 6f  e buffer pBuf to
24d60 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a   pPayload..**.**
24d70 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
24d80 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73  turned on succes
24d90 73 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20  s, otherwise an 
24da0 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73  error code..*/.s
24db0 74 61 74 69 63 20 69 6e 74 20 63 6f 70 79 50 61  tatic int copyPa
24dc0 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a 70  yload(.  void *p
24dd0 50 61 79 6c 6f 61 64 2c 20 20 20 20 20 20 20 20  Payload,        
24de0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
24df0 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20   page data */.  
24e00 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20  void *pBuf,     
24e10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
24e20 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 2a  nter to buffer *
24e30 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20  /.  int nByte,  
24e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24e50 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
24e60 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e   to copy */.  in
24e70 74 20 65 4f 70 2c 20 20 20 20 20 20 20 20 20 20  t eOp,          
24e80 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20          /* 0 -> 
24e90 63 6f 70 79 20 66 72 6f 6d 20 70 61 67 65 2c 20  copy from page, 
24ea0 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61 67  1 -> copy to pag
24eb0 65 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 70  e */.  DbPage *p
24ec0 44 62 50 61 67 65 20 20 20 20 20 20 20 20 20 20  DbPage          
24ed0 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
24ee0 69 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a  ing pPayload */.
24ef0 29 7b 0a 20 20 69 66 28 20 65 4f 70 20 29 7b 0a  ){.  if( eOp ){.
24f00 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61      /* Copy data
24f10 20 66 72 6f 6d 20 62 75 66 66 65 72 20 74 6f 20   from buffer to 
24f20 70 61 67 65 20 28 61 20 77 72 69 74 65 20 6f 70  page (a write op
24f30 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20  eration) */.    
24f40 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
24f50 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61  PagerWrite(pDbPa
24f60 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
24f70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24f80 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
24f90 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28     }.    memcpy(
24fa0 70 50 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20  pPayload, pBuf, 
24fb0 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  nByte);.  }else{
24fc0 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74  .    /* Copy dat
24fd0 61 20 66 72 6f 6d 20 70 61 67 65 20 74 6f 20 62  a from page to b
24fe0 75 66 66 65 72 20 28 61 20 72 65 61 64 20 6f 70  uffer (a read op
24ff0 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20  eration) */.    
25000 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 70 50 61  memcpy(pBuf, pPa
25010 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20  yload, nByte);. 
25020 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
25030 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
25040 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
25050 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 6f 72   used to read or
25060 20 6f 76 65 72 77 72 69 74 65 20 70 61 79 6c 6f   overwrite paylo
25070 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a  ad information.*
25080 2a 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20  * for the entry 
25090 74 68 61 74 20 74 68 65 20 70 43 75 72 20 63 75  that the pCur cu
250a0 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
250b0 20 74 6f 2e 20 54 68 65 20 65 4f 70 0a 2a 2a 20   to. The eOp.** 
250c0 61 72 67 75 6d 65 6e 74 20 69 73 20 69 6e 74 65  argument is inte
250d0 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f  rpreted as follo
250e0 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 3a 20 54  ws:.**.**   0: T
250f0 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  he operation is 
25100 61 20 72 65 61 64 2e 20 50 6f 70 75 6c 61 74 65  a read. Populate
25110 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61   the overflow ca
25120 63 68 65 2e 0a 2a 2a 20 20 20 31 3a 20 54 68 65  che..**   1: The
25130 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20   operation is a 
25140 77 72 69 74 65 2e 20 50 6f 70 75 6c 61 74 65 20  write. Populate 
25150 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63  the overflow cac
25160 68 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61  he..**.** A tota
25170 6c 20 6f 66 20 22 61 6d 74 22 20 62 79 74 65 73  l of "amt" bytes
25180 20 61 72 65 20 72 65 61 64 20 6f 72 20 77 72 69   are read or wri
25190 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61  tten beginning a
251a0 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44  t "offset"..** D
251b0 61 74 61 20 69 73 20 72 65 61 64 20 74 6f 20 6f  ata is read to o
251c0 72 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65  r from the buffe
251d0 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68  r pBuf..**.** Th
251e0 65 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20  e content being 
251f0 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20  read or written 
25200 6d 69 67 68 74 20 61 70 70 65 61 72 20 6f 6e 20  might appear on 
25210 74 68 65 20 6d 61 69 6e 20 70 61 67 65 0a 2a 2a  the main page.**
25220 20 6f 72 20 62 65 20 73 63 61 74 74 65 72 65 64   or be scattered
25230 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65   out on multiple
25240 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
25250 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
25260 72 72 65 6e 74 20 63 75 72 73 6f 72 20 65 6e 74  rrent cursor ent
25270 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d  ry uses one or m
25280 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ore overflow pag
25290 65 73 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  es.** this funct
252a0 69 6f 6e 20 6d 61 79 20 61 6c 6c 6f 63 61 74 65  ion may allocate
252b0 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20 6c   space for and l
252c0 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 0a 2a  azily populate.*
252d0 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  * the overflow p
252e0 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 61  age-list cache a
252f0 72 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61  rray (BtCursor.a
25300 4f 76 65 72 66 6c 6f 77 29 2e 20 0a 2a 2a 20 53  Overflow). .** S
25310 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
25320 75 73 65 20 74 68 69 73 20 63 61 63 68 65 20 74  use this cache t
25330 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74  o make seeking t
25340 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f  o the supplied o
25350 66 66 73 65 74 20 0a 2a 2a 20 6d 6f 72 65 20 65  ffset .** more e
25360 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  fficient..**.** 
25370 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  Once an overflow
25380 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
25390 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
253a0 74 65 64 2c 20 69 74 20 6d 75 73 74 20 62 65 0a  ted, it must be.
253b0 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 20 69  ** invalidated i
253c0 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 75 72  f some other cur
253d0 73 6f 72 20 77 72 69 74 65 73 20 74 6f 20 74 68  sor writes to th
253e0 65 20 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72  e same table, or
253f0 20 69 66 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f   if.** the curso
25400 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 61 20  r is moved to a 
25410 64 69 66 66 65 72 65 6e 74 20 72 6f 77 2e 20 41  different row. A
25420 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20  dditionally, in 
25430 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d  auto-vacuum.** m
25440 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ode, the followi
25450 6e 67 20 65 76 65 6e 74 73 20 6d 61 79 20 69 6e  ng events may in
25460 76 61 6c 69 64 61 74 65 20 61 6e 20 6f 76 65 72  validate an over
25470 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
25480 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  ache..**.**   * 
25490 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  An incremental v
254a0 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20  acuum,.**   * A 
254b0 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76  commit in auto_v
254c0 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64  acuum="full" mod
254d0 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74 69  e,.**   * Creati
254e0 6e 67 20 61 20 74 61 62 6c 65 20 28 6d 61 79 20  ng a table (may 
254f0 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61  require moving a
25500 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 29  n overflow page)
25510 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
25520 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 0a 20  accessPayload(. 
25530 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
25540 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
25550 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72  pointing to entr
25560 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  y to read from *
25570 2f 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c 20  /.  u32 offset, 
25580 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69           /* Begi
25590 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73 20 66  n reading this f
255a0 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20  ar into payload 
255b0 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20 20 20  */.  u32 amt,   
255c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61            /* Rea
255d0 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  d this many byte
255e0 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  s */.  unsigned 
255f0 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57  char *pBuf, /* W
25600 72 69 74 65 20 74 68 65 20 62 79 74 65 73 20 69  rite the bytes i
25610 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20  nto this buffer 
25620 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20 20 20  */ .  int eOp   
25630 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 65             /* ze
25640 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d  ro to read. non-
25650 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a  zero to write. *
25660 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  /.){.  unsigned 
25670 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a  char *aPayload;.
25680 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
25690 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 49 64 78  E_OK;.  int iIdx
256a0 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20   = 0;.  MemPage 
256b0 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  *pPage = pCur->a
256c0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
256d0 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70 61 67  e]; /* Btree pag
256e0 65 20 6f 66 20 63 75 72 72 65 6e 74 20 65 6e 74  e of current ent
256f0 72 79 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  ry */.  BtShared
25700 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42   *pBt = pCur->pB
25710 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
25720 20 20 20 20 2f 2a 20 42 74 72 65 65 20 74 68 69      /* Btree thi
25730 73 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73  s cursor belongs
25740 20 74 6f 20 2a 2f 0a 23 69 66 64 65 66 20 53 51   to */.#ifdef SQ
25750 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52  LITE_DIRECT_OVER
25760 46 4c 4f 57 5f 52 45 41 44 0a 20 20 75 6e 73 69  FLOW_READ.  unsi
25770 67 6e 65 64 20 63 68 61 72 20 2a 20 63 6f 6e 73  gned char * cons
25780 74 20 70 42 75 66 53 74 61 72 74 20 3d 20 70 42  t pBufStart = pB
25790 75 66 3b 20 20 20 20 20 2f 2a 20 53 74 61 72 74  uf;     /* Start
257a0 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74   of original out
257b0 20 62 75 66 66 65 72 20 2a 2f 0a 23 65 6e 64 69   buffer */.#endi
257c0 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  f..  assert( pPa
257d0 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
257e0 65 4f 70 3d 3d 30 20 7c 7c 20 65 4f 70 3d 3d 31  eOp==0 || eOp==1
257f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
25800 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
25810 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
25820 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
25830 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
25840 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
25850 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
25860 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
25870 29 3b 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66  );..  getCellInf
25880 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c  o(pCur);.  aPayl
25890 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  oad = pCur->info
258a0 2e 70 50 61 79 6c 6f 61 64 3b 0a 20 20 61 73 73  .pPayload;.  ass
258b0 65 72 74 28 20 6f 66 66 73 65 74 2b 61 6d 74 20  ert( offset+amt 
258c0 3c 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50  <= pCur->info.nP
258d0 61 79 6c 6f 61 64 20 29 3b 0a 0a 20 20 61 73 73  ayload );..  ass
258e0 65 72 74 28 20 61 50 61 79 6c 6f 61 64 20 3e 20  ert( aPayload > 
258f0 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a  pPage->aData );.
25900 20 20 69 66 28 20 28 75 70 74 72 29 28 61 50 61    if( (uptr)(aPa
25910 79 6c 6f 61 64 20 2d 20 70 50 61 67 65 2d 3e 61  yload - pPage->a
25920 44 61 74 61 29 20 3e 20 28 70 42 74 2d 3e 75 73  Data) > (pBt->us
25930 61 62 6c 65 53 69 7a 65 20 2d 20 70 43 75 72 2d  ableSize - pCur-
25940 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 29 20 29 7b  >info.nLocal) ){
25950 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20 74  .    /* Trying t
25960 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  o read or write 
25970 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
25980 74 68 65 20 64 61 74 61 20 69 73 20 61 6e 20 65  the data is an e
25990 72 72 6f 72 2e 20 20 54 68 65 0a 20 20 20 20 2a  rror.  The.    *
259a0 2a 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62  * conditional ab
259b0 6f 76 65 20 69 73 20 72 65 61 6c 6c 79 3a 0a 20  ove is really:. 
259c0 20 20 20 2a 2a 20 20 20 20 26 61 50 61 79 6c 6f     **    &aPaylo
259d0 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  ad[pCur->info.nL
259e0 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d 3e  ocal] > &pPage->
259f0 61 44 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c  aData[pBt->usabl
25a00 65 53 69 7a 65 5d 0a 20 20 20 20 2a 2a 20 62 75  eSize].    ** bu
25a10 74 20 69 73 20 72 65 63 61 73 74 20 69 6e 74 6f  t is recast into
25a20 20 69 74 73 20 63 75 72 72 65 6e 74 20 66 6f 72   its current for
25a30 6d 20 74 6f 20 61 76 6f 69 64 20 69 6e 74 65 67  m to avoid integ
25a40 65 72 20 6f 76 65 72 66 6c 6f 77 20 70 72 6f 62  er overflow prob
25a50 6c 65 6d 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lems.    */.    
25a60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
25a70 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
25a80 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64  .  /* Check if d
25a90 61 74 61 20 6d 75 73 74 20 62 65 20 72 65 61 64  ata must be read
25aa0 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d  /written to/from
25ab0 20 74 68 65 20 62 74 72 65 65 20 70 61 67 65 20   the btree page 
25ac0 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28  itself. */.  if(
25ad0 20 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e   offset<pCur->in
25ae0 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  fo.nLocal ){.   
25af0 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20   int a = amt;.  
25b00 20 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70    if( a+offset>p
25b10 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
25b20 20 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43   ){.      a = pC
25b30 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
25b40 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a  - offset;.    }.
25b50 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79      rc = copyPay
25b60 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f  load(&aPayload[o
25b70 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c  ffset], pBuf, a,
25b80 20 65 4f 70 2c 20 70 50 61 67 65 2d 3e 70 44 62   eOp, pPage->pDb
25b90 50 61 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65  Page);.    offse
25ba0 74 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20  t = 0;.    pBuf 
25bb0 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d  += a;.    amt -=
25bc0 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   a;.  }else{.   
25bd0 20 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d   offset -= pCur-
25be0 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20  >info.nLocal;.  
25bf0 7d 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  }...  if( rc==SQ
25c00 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30  LITE_OK && amt>0
25c10 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 33   ){.    const u3
25c20 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74  2 ovflSize = pBt
25c30 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
25c40 3b 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74  ;  /* Bytes cont
25c50 65 6e 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67  ent per ovfl pag
25c60 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65  e */.    Pgno ne
25c70 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78  xtPage;..    nex
25c80 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  tPage = get4byte
25c90 28 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d  (&aPayload[pCur-
25ca0 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a  >info.nLocal]);.
25cb0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42  .    /* If the B
25cc0 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f  tCursor.aOverflo
25cd0 77 5b 5d 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  w[] has not been
25ce0 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f   allocated, allo
25cf0 63 61 74 65 20 69 74 20 6e 6f 77 2e 0a 20 20 20  cate it now..   
25d00 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 61   **.    ** The a
25d10 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79  Overflow[] array
25d20 20 69 73 20 73 69 7a 65 64 20 61 74 20 6f 6e 65   is sized at one
25d30 20 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20   entry for each 
25d40 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20  overflow page.  
25d50 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 76 65 72    ** in the over
25d60 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20  flow chain. The 
25d70 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
25d80 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f  he first overflo
25d90 77 20 70 61 67 65 20 69 73 0a 20 20 20 20 2a 2a  w page is.    **
25da0 20 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72   stored in aOver
25db0 66 6c 6f 77 5b 30 5d 2c 20 65 74 63 2e 20 41 20  flow[0], etc. A 
25dc0 76 61 6c 75 65 20 6f 66 20 30 20 69 6e 20 74 68  value of 0 in th
25dd0 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72  e aOverflow[] ar
25de0 72 61 79 0a 20 20 20 20 2a 2a 20 6d 65 61 6e 73  ray.    ** means
25df0 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22   "not yet known"
25e00 20 28 74 68 65 20 63 61 63 68 65 20 69 73 20 6c   (the cache is l
25e10 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 64 29  azily populated)
25e20 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
25e30 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
25e40 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66   & BTCF_ValidOvf
25e50 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  l)==0 ){.      i
25e60 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72  nt nOvfl = (pCur
25e70 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d  ->info.nPayload-
25e80 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
25e90 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76  l+ovflSize-1)/ov
25ea0 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66  flSize;.      if
25eb0 28 20 6e 4f 76 66 6c 3e 70 43 75 72 2d 3e 6e 4f  ( nOvfl>pCur->nO
25ec0 76 66 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  vflAlloc ){.    
25ed0 20 20 20 20 50 67 6e 6f 20 2a 61 4e 65 77 20 3d      Pgno *aNew =
25ee0 20 28 50 67 6e 6f 2a 29 73 71 6c 69 74 65 33 52   (Pgno*)sqlite3R
25ef0 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20  ealloc(.        
25f00 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66      pCur->aOverf
25f10 6c 6f 77 2c 20 6e 4f 76 66 6c 2a 32 2a 73 69 7a  low, nOvfl*2*siz
25f20 65 6f 66 28 50 67 6e 6f 29 0a 20 20 20 20 20 20  eof(Pgno).      
25f30 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
25f40 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   aNew==0 ){.    
25f50 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
25f60 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
25f70 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
25f80 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 6e           pCur->n
25f90 4f 76 66 6c 41 6c 6c 6f 63 20 3d 20 6e 4f 76 66  OvflAlloc = nOvf
25fa0 6c 2a 32 3b 0a 20 20 20 20 20 20 20 20 20 20 70  l*2;.          p
25fb0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d  Cur->aOverflow =
25fc0 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d   aNew;.        }
25fd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
25fe0 65 6d 73 65 74 28 70 43 75 72 2d 3e 61 4f 76 65  emset(pCur->aOve
25ff0 72 66 6c 6f 77 2c 20 30 2c 20 6e 4f 76 66 6c 2a  rflow, 0, nOvfl*
26000 73 69 7a 65 6f 66 28 50 67 6e 6f 29 29 3b 0a 20  sizeof(Pgno));. 
26010 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c       pCur->curFl
26020 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69  ags |= BTCF_Vali
26030 64 4f 76 66 6c 3b 0a 20 20 20 20 7d 65 6c 73 65  dOvfl;.    }else
26040 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
26050 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
26060 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62  list cache has b
26070 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e  een allocated an
26080 64 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 65  d the.      ** e
26090 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 72  ntry for the fir
260a0 73 74 20 72 65 71 75 69 72 65 64 20 6f 76 65 72  st required over
260b0 66 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c  flow page is val
260c0 69 64 2c 20 73 6b 69 70 0a 20 20 20 20 20 20 2a  id, skip.      *
260d0 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20 69 74  * directly to it
260e0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
260f0 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72   if( pCur->aOver
26100 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c  flow[offset/ovfl
26110 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20 20  Size] ){.       
26120 20 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74 2f   iIdx = (offset/
26130 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20  ovflSize);.     
26140 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43     nextPage = pC
26150 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
26160 64 78 5d 3b 0a 20 20 20 20 20 20 20 20 6f 66 66  dx];.        off
26170 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76  set = (offset%ov
26180 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  flSize);.      }
26190 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65  .    }..    asse
261a0 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
261b0 4b 20 26 26 20 61 6d 74 3e 30 20 29 3b 0a 20 20  K && amt>0 );.  
261c0 20 20 77 68 69 6c 65 28 20 6e 65 78 74 50 61 67    while( nextPag
261d0 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  e ){.      /* If
261e0 20 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c   required, popul
261f0 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ate the overflow
26200 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
26210 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
26220 74 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  t( pCur->aOverfl
26230 6f 77 5b 69 49 64 78 5d 3d 3d 30 0a 20 20 20 20  ow[iIdx]==0.    
26240 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 43 75            || pCu
26250 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
26260 78 5d 3d 3d 6e 65 78 74 50 61 67 65 0a 20 20 20  x]==nextPage.   
26270 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 43 4f             || CO
26280 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20  RRUPT_DB );.    
26290 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f    pCur->aOverflo
262a0 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50 61  w[iIdx] = nextPa
262b0 67 65 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6f  ge;..      if( o
262c0 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20  ffset>=ovflSize 
262d0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
262e0 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f  e only reason to
262f0 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20   read this page 
26300 69 73 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  is to obtain the
26310 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
26320 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
26330 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
26340 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e   overflow chain.
26350 20 54 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   The page.      
26360 20 20 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74    ** data is not
26370 20 72 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69   required. So fi
26380 72 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75  rst try to looku
26390 70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20  p the overflow. 
263a0 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c         ** page-l
263b0 69 73 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e  ist cache, if an
263c0 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63  y, then fall bac
263d0 6b 20 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72  k to the getOver
263e0 66 6c 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20  flowPage().     
263f0 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a     ** function..
26400 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
26410 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
26420 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
26430 5f 56 61 6c 69 64 4f 76 66 6c 20 29 3b 0a 20 20  _ValidOvfl );.  
26440 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
26450 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d 3d  ur->pBtree->db==
26460 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 20 20 20  pBt->db );.     
26470 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76     if( pCur->aOv
26480 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29  erflow[iIdx+1] )
26490 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  {.          next
264a0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76  Page = pCur->aOv
264b0 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a  erflow[iIdx+1];.
264c0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
264d0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 67 65           rc = ge
264e0 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42  tOverflowPage(pB
264f0 74 2c 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20  t, nextPage, 0, 
26500 26 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20  &nextPage);.    
26510 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6f 66      }.        of
26520 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65  fset -= ovflSize
26530 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
26540 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74         /* Need t
26550 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65  o read this page
26560 20 70 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f   properly. It co
26570 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74  ntains some of t
26580 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61  he.        ** ra
26590 6e 67 65 20 6f 66 20 64 61 74 61 20 74 68 61 74  nge of data that
265a0 20 69 73 20 62 65 69 6e 67 20 72 65 61 64 20 28   is being read (
265b0 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74  eOp==0) or writt
265c0 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20  en (eOp!=0)..   
265d0 20 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53       */.#ifdef S
265e0 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45  QLITE_DIRECT_OVE
265f0 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20  RFLOW_READ.     
26600 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
26610 2a 66 64 3b 20 20 20 20 20 20 2f 2a 20 46 69 6c  *fd;      /* Fil
26620 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20  e from which to 
26630 64 6f 20 64 69 72 65 63 74 20 6f 76 65 72 66 6c  do direct overfl
26640 6f 77 20 72 65 61 64 20 2a 2f 0a 23 65 6e 64 69  ow read */.#endi
26650 66 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 20  f.        int a 
26660 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20 69  = amt;.        i
26670 66 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20  f( a + offset > 
26680 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  ovflSize ){.    
26690 20 20 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69        a = ovflSi
266a0 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20  ze - offset;.   
266b0 20 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53       }..#ifdef S
266c0 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45  QLITE_DIRECT_OVE
266d0 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20  RFLOW_READ.     
266e0 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 74 68 65     /* If all the
266f0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
26700 72 75 65 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a  rue:.        **.
26710 20 20 20 20 20 20 20 20 2a 2a 20 20 20 31 29 20          **   1) 
26720 74 68 69 73 20 69 73 20 61 20 72 65 61 64 20 6f  this is a read o
26730 70 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20 0a 20  peration, and . 
26740 20 20 20 20 20 20 20 2a 2a 20 20 20 32 29 20 64         **   2) d
26750 61 74 61 20 69 73 20 72 65 71 75 69 72 65 64 20  ata is required 
26760 66 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20 6f  from the start o
26770 66 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20  f this overflow 
26780 70 61 67 65 2c 20 61 6e 64 0a 20 20 20 20 20 20  page, and.      
26790 20 20 2a 2a 20 20 20 33 29 20 74 68 65 72 65 20    **   3) there 
267a0 69 73 20 6e 6f 20 6f 70 65 6e 20 77 72 69 74 65  is no open write
267b0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e  -transaction, an
267c0 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 34  d.        **   4
267d0 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  ) the database i
267e0 73 20 66 69 6c 65 2d 62 61 63 6b 65 64 2c 20 61  s file-backed, a
267f0 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  nd.        **   
26800 35 29 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  5) the page is n
26810 6f 74 20 69 6e 20 74 68 65 20 57 41 4c 20 66 69  ot in the WAL fi
26820 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  le.        **   
26830 36 29 20 61 74 20 6c 65 61 73 74 20 34 20 62 79  6) at least 4 by
26840 74 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  tes have already
26850 20 62 65 65 6e 20 72 65 61 64 20 69 6e 74 6f 20   been read into 
26860 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
26870 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  r .        **.  
26880 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 61        ** then da
26890 74 61 20 63 61 6e 20 62 65 20 72 65 61 64 20 64  ta can be read d
268a0 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 68 65  irectly from the
268b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
268c0 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20  nto the.        
268d0 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  ** output buffer
268e0 2c 20 62 79 70 61 73 73 69 6e 67 20 74 68 65 20  , bypassing the 
268f0 70 61 67 65 2d 63 61 63 68 65 20 61 6c 74 6f 67  page-cache altog
26900 65 74 68 65 72 2e 20 54 68 69 73 20 73 70 65 65  ether. This spee
26910 64 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 70  ds.        ** up
26920 20 6c 6f 61 64 69 6e 67 20 6c 61 72 67 65 20 72   loading large r
26930 65 63 6f 72 64 73 20 74 68 61 74 20 73 70 61 6e  ecords that span
26940 20 6d 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70   many overflow p
26950 61 67 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ages..        */
26960 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 4f 70  .        if( eOp
26970 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20  ==0             
26980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
269a0 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20 20 20  /* (1) */.      
269b0 20 20 20 26 26 20 6f 66 66 73 65 74 3d 3d 30 20     && offset==0 
269c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
269d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
269e0 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 29 20           /* (2) 
269f0 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  */.         && p
26a00 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
26a10 6e 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 20 20  n==TRANS_READ   
26a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a30 20 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20 20 20    /* (3) */.    
26a40 20 20 20 20 20 26 26 20 28 66 64 20 3d 20 73 71       && (fd = sq
26a50 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 70  lite3PagerFile(p
26a60 42 74 2d 3e 70 50 61 67 65 72 29 29 2d 3e 70 4d  Bt->pPager))->pM
26a70 65 74 68 6f 64 73 20 20 20 20 20 2f 2a 20 28 34  ethods     /* (4
26a80 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
26a90 20 30 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72   0==sqlite3Pager
26aa0 55 73 65 57 61 6c 28 70 42 74 2d 3e 70 50 61 67  UseWal(pBt->pPag
26ab0 65 72 2c 20 6e 65 78 74 50 61 67 65 29 20 20 20  er, nextPage)   
26ac0 20 20 20 20 2f 2a 20 28 35 29 20 2a 2f 0a 20 20      /* (5) */.  
26ad0 20 20 20 20 20 20 20 26 26 20 26 70 42 75 66 5b         && &pBuf[
26ae0 2d 34 5d 3e 3d 70 42 75 66 53 74 61 72 74 20 20  -4]>=pBufStart  
26af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26b10 28 36 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 29  (6) */.        )
26b20 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 61  {.          u8 a
26b30 53 61 76 65 5b 34 5d 3b 0a 20 20 20 20 20 20 20  Save[4];.       
26b40 20 20 20 75 38 20 2a 61 57 72 69 74 65 20 3d 20     u8 *aWrite = 
26b50 26 70 42 75 66 5b 2d 34 5d 3b 0a 20 20 20 20 20  &pBuf[-4];.     
26b60 20 20 20 20 20 61 73 73 65 72 74 28 20 61 57 72       assert( aWr
26b70 69 74 65 3e 3d 70 42 75 66 53 74 61 72 74 20 29  ite>=pBufStart )
26b80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26b90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 75 65            /* due
26ba0 20 74 6f 20 28 36 29 20 2a 2f 0a 20 20 20 20 20   to (6) */.     
26bb0 20 20 20 20 20 6d 65 6d 63 70 79 28 61 53 61 76       memcpy(aSav
26bc0 65 2c 20 61 57 72 69 74 65 2c 20 34 29 3b 0a 20  e, aWrite, 4);. 
26bd0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
26be0 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20  lite3OsRead(fd, 
26bf0 61 57 72 69 74 65 2c 20 61 2b 34 2c 20 28 69 36  aWrite, a+4, (i6
26c00 34 29 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a  4)pBt->pageSize*
26c10 28 6e 65 78 74 50 61 67 65 2d 31 29 29 3b 0a 20  (nextPage-1));. 
26c20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67           nextPag
26c30 65 20 3d 20 67 65 74 34 62 79 74 65 28 61 57 72  e = get4byte(aWr
26c40 69 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ite);.          
26c50 6d 65 6d 63 70 79 28 61 57 72 69 74 65 2c 20 61  memcpy(aWrite, a
26c60 53 61 76 65 2c 20 34 29 3b 0a 20 20 20 20 20 20  Save, 4);.      
26c70 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a    }else.#endif..
26c80 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
26c90 20 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50      DbPage *pDbP
26ca0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72  age;.          r
26cb0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
26cc0 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Get(pBt->pPager,
26cd0 20 6e 65 78 74 50 61 67 65 2c 20 26 70 44 62 50   nextPage, &pDbP
26ce0 61 67 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  age,.           
26cf0 20 20 20 28 65 4f 70 3d 3d 30 20 3f 20 50 41 47     (eOp==0 ? PAG
26d00 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
26d10 3a 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 29  : 0).          )
26d20 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
26d30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
26d40 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 50 61  .            aPa
26d50 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65 33 50  yload = sqlite3P
26d60 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
26d70 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
26d80 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74    nextPage = get
26d90 34 62 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b  4byte(aPayload);
26da0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
26db0 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61  = copyPayload(&a
26dc0 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34  Payload[offset+4
26dd0 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c  ], pBuf, a, eOp,
26de0 20 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20   pDbPage);.     
26df0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
26e00 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65  gerUnref(pDbPage
26e10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  );.            o
26e20 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
26e30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
26e40 0a 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d 20  .        amt -= 
26e50 61 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  a;.        if( a
26e60 6d 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 72  mt==0 ) return r
26e70 63 3b 0a 20 20 20 20 20 20 20 20 70 42 75 66 20  c;.        pBuf 
26e80 2b 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20  += a;.      }.  
26e90 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65      if( rc ) bre
26ea0 61 6b 3b 0a 20 20 20 20 20 20 69 49 64 78 2b 2b  ak;.      iIdx++
26eb0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
26ec0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
26ed0 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20   && amt>0 ){.   
26ee0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
26ef0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 2f 2a 20  ORRUPT_BKPT; /* 
26f00 4f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 65  Overflow chain e
26f10 6e 64 73 20 70 72 65 6d 61 74 75 72 65 6c 79 20  nds prematurely 
26f20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  */.  }.  return 
26f30 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  rc;.}../*.** Rea
26f40 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 70 61  d part of the pa
26f50 79 6c 6f 61 64 20 66 6f 72 20 74 68 65 20 72 6f  yload for the ro
26f60 77 20 61 74 20 77 68 69 63 68 20 74 68 61 74 20  w at which that 
26f70 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 63  cursor pCur is c
26f80 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e  urrently.** poin
26f90 74 69 6e 67 2e 20 20 22 61 6d 74 22 20 62 79 74  ting.  "amt" byt
26fa0 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73  es will be trans
26fb0 66 65 72 72 65 64 20 69 6e 74 6f 20 70 42 75 66  ferred into pBuf
26fc0 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65  [].  The transfe
26fd0 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22  r.** begins at "
26fe0 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 70  offset"..**.** p
26ff0 43 75 72 20 63 61 6e 20 62 65 20 70 6f 69 6e 74  Cur can be point
27000 69 6e 67 20 74 6f 20 65 69 74 68 65 72 20 61 20  ing to either a 
27010 74 61 62 6c 65 20 6f 72 20 61 6e 20 69 6e 64 65  table or an inde
27020 78 20 62 2d 74 72 65 65 2e 0a 2a 2a 20 49 66 20  x b-tree..** If 
27030 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 74 61  pointing to a ta
27040 62 6c 65 20 62 74 72 65 65 2c 20 74 68 65 6e 20  ble btree, then 
27050 74 68 65 20 63 6f 6e 74 65 6e 74 20 73 65 63 74  the content sect
27060 69 6f 6e 20 69 73 20 72 65 61 64 2e 20 20 49 66  ion is read.  If
27070 0a 2a 2a 20 70 43 75 72 20 69 73 20 70 6f 69 6e  .** pCur is poin
27080 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65 78  ting to an index
27090 20 62 2d 74 72 65 65 20 74 68 65 6e 20 74 68 65   b-tree then the
270a0 20 6b 65 79 20 73 65 63 74 69 6f 6e 20 69 73 20   key section is 
270b0 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  read..**.** For 
270c0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c  sqlite3BtreePayl
270d0 6f 61 64 28 29 2c 20 74 68 65 20 63 61 6c 6c 65  oad(), the calle
270e0 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68  r must ensure th
270f0 61 74 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74  at pCur is point
27100 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69  ing.** to a vali
27110 64 20 72 6f 77 20 69 6e 20 74 68 65 20 74 61 62  d row in the tab
27120 6c 65 2e 20 20 46 6f 72 20 73 71 6c 69 74 65 33  le.  For sqlite3
27130 42 74 72 65 65 50 61 79 6c 6f 61 64 43 68 65 63  BtreePayloadChec
27140 6b 65 64 28 29 2c 20 74 68 65 0a 2a 2a 20 63 75  ked(), the.** cu
27150 72 73 6f 72 20 6d 69 67 68 74 20 62 65 20 69 6e  rsor might be in
27160 76 61 6c 69 64 20 6f 72 20 6d 69 67 68 74 20 6e  valid or might n
27170 65 65 64 20 74 6f 20 62 65 20 72 65 73 74 6f 72  eed to be restor
27180 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20  ed before being 
27190 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  read..**.** Retu
271a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
271b0 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72  success or an er
271c0 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74  ror code if anyt
271d0 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f  hing goes.** wro
271e0 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73  ng.  An error is
271f0 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66   returned if "of
27200 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72  fset+amt" is lar
27210 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20  ger than.** the 
27220 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61  available payloa
27230 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
27240 33 42 74 72 65 65 50 61 79 6c 6f 61 64 28 42 74  3BtreePayload(Bt
27250 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
27260 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d  2 offset, u32 am
27270 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a  t, void *pBuf){.
27280 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
27290 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
272a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
272b0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
272c0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
272d0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
272e0 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70  e>=0 && pCur->ap
272f0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
27300 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ] );.  assert( p
27310 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
27320 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70  >iPage]<pCur->ap
27330 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
27340 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72 65  ]->nCell );.  re
27350 74 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f  turn accessPaylo
27360 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c  ad(pCur, offset,
27370 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20   amt, (unsigned 
27380 63 68 61 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a  char*)pBuf, 0);.
27390 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 61  }../*.** This va
273a0 72 69 61 6e 74 20 6f 66 20 73 71 6c 69 74 65 33  riant of sqlite3
273b0 42 74 72 65 65 50 61 79 6c 6f 61 64 28 29 20 77  BtreePayload() w
273c0 6f 72 6b 73 20 65 76 65 6e 20 69 66 20 74 68 65  orks even if the
273d0 20 63 75 72 73 6f 72 20 68 61 73 20 6e 6f 74 0a   cursor has not.
273e0 2a 2a 20 69 6e 20 74 68 65 20 43 55 52 53 4f 52  ** in the CURSOR
273f0 5f 56 41 4c 49 44 20 73 74 61 74 65 2e 20 20 49  _VALID state.  I
27400 74 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62  t is only used b
27410 79 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 6c  y the sqlite3_bl
27420 6f 62 5f 72 65 61 64 28 29 0a 2a 2a 20 69 6e 74  ob_read().** int
27430 65 72 66 61 63 65 2e 0a 2a 2f 0a 23 69 66 6e 64  erface..*/.#ifnd
27440 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
27450 4e 43 52 42 4c 4f 42 0a 73 74 61 74 69 63 20 53  NCRBLOB.static S
27460 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69  QLITE_NOINLINE i
27470 6e 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  nt accessPayload
27480 43 68 65 63 6b 65 64 28 0a 20 20 42 74 43 75 72  Checked(.  BtCur
27490 73 6f 72 20 2a 70 43 75 72 2c 0a 20 20 75 33 32  sor *pCur,.  u32
274a0 20 6f 66 66 73 65 74 2c 0a 20 20 75 33 32 20 61   offset,.  u32 a
274b0 6d 74 2c 0a 20 20 76 6f 69 64 20 2a 70 42 75 66  mt,.  void *pBuf
274c0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
274d0 69 66 20 28 20 70 43 75 72 2d 3e 65 53 74 61 74  if ( pCur->eStat
274e0 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
274f0 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  D ){.    return 
27500 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20  SQLITE_ABORT;.  
27510 7d 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  }.  assert( curs
27520 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
27530 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 62  Cur) );.  rc = b
27540 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f  treeRestoreCurso
27550 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
27560 0a 20 20 72 65 74 75 72 6e 20 72 63 20 3f 20 72  .  return rc ? r
27570 63 20 3a 20 61 63 63 65 73 73 50 61 79 6c 6f 61  c : accessPayloa
27580 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCur, offset, 
27590 61 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a 7d  amt, pBuf, 0);.}
275a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
275b0 65 50 61 79 6c 6f 61 64 43 68 65 63 6b 65 64 28  ePayloadChecked(
275c0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
275d0 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20  u32 offset, u32 
275e0 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29  amt, void *pBuf)
275f0 7b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  {.  if( pCur->eS
27600 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
27610 49 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ID ){.    assert
27620 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
27630 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
27640 20 20 72 65 74 75 72 6e 20 61 63 63 65 73 73 50    return accessP
27650 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66  ayload(pCur, off
27660 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20  set, amt, pBuf, 
27670 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
27680 20 72 65 74 75 72 6e 20 61 63 63 65 73 73 50 61   return accessPa
27690 79 6c 6f 61 64 43 68 65 63 6b 65 64 28 70 43 75  yloadChecked(pCu
276a0 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20  r, offset, amt, 
276b0 70 42 75 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  pBuf);.  }.}.#en
276c0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
276d0 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a  IT_INCRBLOB */..
276e0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
276f0 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f 61  ointer to payloa
27700 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  d information fr
27710 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  om the entry tha
27720 74 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20 63  t the .** pCur c
27730 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
27740 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74  g to.  The point
27750 65 72 20 69 73 20 74 6f 20 74 68 65 20 62 65 67  er is to the beg
27760 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65  inning of.** the
27770 20 6b 65 79 20 69 66 20 69 6e 64 65 78 20 62 74   key if index bt
27780 72 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74  rees (pPage->int
27790 4b 65 79 3d 3d 30 29 20 61 6e 64 20 69 73 20 74  Key==0) and is t
277a0 68 65 20 64 61 74 61 20 66 6f 72 0a 2a 2a 20 74  he data for.** t
277b0 61 62 6c 65 20 62 74 72 65 65 73 20 28 70 50 61  able btrees (pPa
277c0 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 31 29 2e 20  ge->intKey==1). 
277d0 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  The number of by
277e0 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  tes of available
277f0 0a 2a 2a 20 6b 65 79 2f 64 61 74 61 20 69 73 20  .** key/data is 
27800 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 41  written into *pA
27810 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30  mt.  If *pAmt==0
27820 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
27830 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 69 6c  .** returned wil
27840 6c 20 6e 6f 74 20 62 65 20 61 20 76 61 6c 69 64  l not be a valid
27850 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20   pointer..**.** 
27860 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
27870 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  an optimization.
27880 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66    It is common f
27890 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65  or the entire ke
278a0 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74 6f  y.** and data to
278b0 20 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61   fit on the loca
278c0 6c 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20 74  l page and for t
278d0 68 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76  here to be no ov
278e0 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e  erflow.** pages.
278f0 20 20 57 68 65 6e 20 74 68 61 74 20 69 73 20 73    When that is s
27900 6f 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  o, this routine 
27910 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61  can be used to a
27920 63 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79  ccess the.** key
27930 20 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f 75   and data withou
27940 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e  t making a copy.
27950 20 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e 64    If the key and
27960 2f 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73 0a  /or data spills.
27970 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77  ** onto overflow
27980 20 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63 63   pages, then acc
27990 65 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75 73  essPayload() mus
279a0 74 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 61  t be used to rea
279b0 73 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b  ssemble.** the k
279c0 65 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79  ey/data and copy
279d0 20 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c   it into a preal
279e0 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a  located buffer..
279f0 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65  **.** The pointe
27a00 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  r returned by th
27a10 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73  is routine looks
27a20 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74   directly into t
27a30 68 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67  he cached.** pag
27a40 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
27a50 65 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69 67  e.  The data mig
27a60 68 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76  ht change or mov
27a70 65 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a  e the next time.
27a80 2a 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75  ** any btree rou
27a90 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
27aa0 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
27ab0 76 6f 69 64 20 2a 66 65 74 63 68 50 61 79 6c 6f  void *fetchPaylo
27ac0 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  ad(.  BtCursor *
27ad0 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75  pCur,      /* Cu
27ae0 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f  rsor pointing to
27af0 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66   entry to read f
27b00 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 2a 70 41  rom */.  u32 *pA
27b10 6d 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  mt            /*
27b20 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65   Write the numbe
27b30 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62  r of available b
27b40 79 74 65 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ytes here */.){.
27b50 20 20 75 33 32 20 61 6d 74 3b 0a 20 20 61 73 73    u32 amt;.  ass
27b60 65 72 74 28 20 70 43 75 72 21 3d 30 20 26 26 20  ert( pCur!=0 && 
27b70 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26  pCur->iPage>=0 &
27b80 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  & pCur->apPage[p
27b90 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20  Cur->iPage]);.  
27ba0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
27bb0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
27bc0 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
27bd0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
27be0 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
27bf0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
27c00 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
27c10 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
27c20 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
27c30 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
27c40 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70  >iPage]<pCur->ap
27c50 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
27c60 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  ]->nCell );.  as
27c70 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f  sert( pCur->info
27c80 2e 6e 53 69 7a 65 3e 30 20 29 3b 0a 20 20 61 73  .nSize>0 );.  as
27c90 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f  sert( pCur->info
27ca0 2e 70 50 61 79 6c 6f 61 64 3e 70 43 75 72 2d 3e  .pPayload>pCur->
27cb0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
27cc0 67 65 5d 2d 3e 61 44 61 74 61 20 7c 7c 20 43 4f  ge]->aData || CO
27cd0 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73  RRUPT_DB );.  as
27ce0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f  sert( pCur->info
27cf0 2e 70 50 61 79 6c 6f 61 64 3c 70 43 75 72 2d 3e  .pPayload<pCur->
27d00 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
27d10 67 65 5d 2d 3e 61 44 61 74 61 45 6e 64 20 7c 7c  ge]->aDataEnd ||
27d20 43 4f 52 52 55 50 54 5f 44 42 29 3b 0a 20 20 61  CORRUPT_DB);.  a
27d30 6d 74 20 3d 20 28 69 6e 74 29 28 70 43 75 72 2d  mt = (int)(pCur-
27d40 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
27d50 61 67 65 5d 2d 3e 61 44 61 74 61 45 6e 64 20 2d  age]->aDataEnd -
27d60 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79   pCur->info.pPay
27d70 6c 6f 61 64 29 3b 0a 20 20 69 66 28 20 70 43 75  load);.  if( pCu
27d80 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 61  r->info.nLocal<a
27d90 6d 74 20 29 20 61 6d 74 20 3d 20 70 43 75 72 2d  mt ) amt = pCur-
27da0 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20  >info.nLocal;.  
27db0 2a 70 41 6d 74 20 3d 20 61 6d 74 3b 0a 20 20 72  *pAmt = amt;.  r
27dc0 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 70 43 75  eturn (void*)pCu
27dd0 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  r->info.pPayload
27de0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20  ;.}.../*.** For 
27df0 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 63  the entry that c
27e00 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f  ursor pCur is po
27e10 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61  int to, return a
27e20 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20  s.** many bytes 
27e30 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61  of the key or da
27e40 74 61 20 61 73 20 61 72 65 20 61 76 61 69 6c 61  ta as are availa
27e50 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ble on the local
27e60 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e  .** b-tree page.
27e70 20 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62    Write the numb
27e80 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  er of available 
27e90 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74  bytes into *pAmt
27ea0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e  ..**.** The poin
27eb0 74 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20  ter returned is 
27ec0 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20  ephemeral.  The 
27ed0 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76  key/data may mov
27ee0 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72  e.** or be destr
27ef0 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74  oyed on the next
27f00 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72   call to any Btr
27f10 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69  ee routine,.** i
27f20 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66  ncluding calls f
27f30 72 6f 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64  rom other thread
27f40 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 73 61  s against the sa
27f50 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e  me cache..** Hen
27f60 63 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74  ce, a mutex on t
27f70 68 65 20 42 74 53 68 61 72 65 64 20 73 68 6f 75  he BtShared shou
27f80 6c 64 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72  ld be held prior
27f90 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74   to calling.** t
27fa0 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  his routine..**.
27fb0 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
27fc0 73 20 69 73 20 75 73 65 64 20 74 6f 20 67 65 74  s is used to get
27fd0 20 71 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f   quick access to
27fe0 20 6b 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a   key and data.**
27ff0 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   in the common c
28000 61 73 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65  ase where no ove
28010 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20  rflow pages are 
28020 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76  used..*/.const v
28030 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65  oid *sqlite3Btre
28040 65 50 61 79 6c 6f 61 64 46 65 74 63 68 28 42 74  ePayloadFetch(Bt
28050 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
28060 32 20 2a 70 41 6d 74 29 7b 0a 20 20 72 65 74 75  2 *pAmt){.  retu
28070 72 6e 20 66 65 74 63 68 50 61 79 6c 6f 61 64 28  rn fetchPayload(
28080 70 43 75 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a 0a  pCur, pAmt);.}..
28090 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
280a0 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61  cursor down to a
280b0 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e   new child page.
280c0 20 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72    The newPgno ar
280d0 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a  gument is the.**
280e0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
280f0 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 74  the child page t
28100 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a  o move to..**.**
28110 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
28120 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f  eturns SQLITE_CO
28130 52 52 55 50 54 20 69 66 20 74 68 65 20 70 61 67  RRUPT if the pag
28140 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20 66  e-header flags f
28150 69 65 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  ield of.** the n
28160 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 64 6f  ew child page do
28170 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  es not match the
28180 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 20   flags field of 
28190 74 68 65 20 70 61 72 65 6e 74 20 28 69 2e 65 2e  the parent (i.e.
281a0 0a 2a 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65 79  .** if an intkey
281b0 20 70 61 67 65 20 61 70 70 65 61 72 73 20 74 6f   page appears to
281c0 20 62 65 20 74 68 65 20 70 61 72 65 6e 74 20 6f   be the parent o
281d0 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70  f a non-intkey p
281e0 61 67 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65 2d  age, or.** vice-
281f0 76 65 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74 69  versa)..*/.stati
28200 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c  c int moveToChil
28210 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
28220 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a  , u32 newPgno){.
28230 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
28240 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20  = pCur->pBt;..  
28250 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
28260 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
28270 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
28280 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
28290 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
282a0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
282b0 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44  e<BTCURSOR_MAX_D
282c0 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74  EPTH );.  assert
282d0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  ( pCur->iPage>=0
282e0 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
282f0 69 50 61 67 65 3e 3d 28 42 54 43 55 52 53 4f 52  iPage>=(BTCURSOR
28300 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29 20 29 7b  _MAX_DEPTH-1) ){
28310 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
28320 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
28330 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 6e 66  .  }.  pCur->inf
28340 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
28350 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
28360 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   ~(BTCF_ValidNKe
28370 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  y|BTCF_ValidOvfl
28380 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65  );.  pCur->iPage
28390 2b 2b 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64  ++;.  pCur->aiId
283a0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
283b0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 67 65 74   0;.  return get
283c0 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c  AndInitPage(pBt,
283d0 20 6e 65 77 50 67 6e 6f 2c 20 26 70 43 75 72 2d   newPgno, &pCur-
283e0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
283f0 61 67 65 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  age],.          
28400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
28410 75 72 2c 20 70 43 75 72 2d 3e 63 75 72 50 61 67  ur, pCur->curPag
28420 65 72 46 6c 61 67 73 29 3b 0a 7d 0a 0a 23 69 66  erFlags);.}..#if
28430 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
28440 0a 2a 2a 20 50 61 67 65 20 70 50 61 72 65 6e 74  .** Page pParent
28450 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   is an internal 
28460 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65 20  (non-leaf) tree 
28470 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74  page. This funct
28480 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73 20  ion .** asserts 
28490 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72  that page number
284a0 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 6c   iChild is the l
284b0 65 66 74 2d 63 68 69 6c 64 20 69 66 20 74 68 65  eft-child if the
284c0 20 69 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c   iIdx'th.** cell
284d0 20 69 6e 20 70 61 67 65 20 70 50 61 72 65 6e 74   in page pParent
284e0 2e 20 4f 72 2c 20 69 66 20 69 49 64 78 20 69 73  . Or, if iIdx is
284f0 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 6f   equal to the to
28500 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  tal number of.**
28510 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e   cells in pParen
28520 74 2c 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d  t, that page num
28530 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68  ber iChild is th
28540 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66  e right-child of
28550 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f  .** the page..*/
28560 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73  .static void ass
28570 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 4d  ertParentIndex(M
28580 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c  emPage *pParent,
28590 20 69 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f 20   int iIdx, Pgno 
285a0 69 43 68 69 6c 64 29 7b 0a 20 20 69 66 28 20 43  iChild){.  if( C
285b0 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65 74 75  ORRUPT_DB ) retu
285c0 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6e 64  rn;  /* The cond
285d0 69 74 69 6f 6e 73 20 74 65 73 74 65 64 20 62 65  itions tested be
285e0 6c 6f 77 20 6d 69 67 68 74 20 6e 6f 74 20 62 65  low might not be
285f0 20 74 72 75 65 0a 20 20 20 20 20 20 20 20 20 20   true.          
28600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28610 20 20 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70    ** in a corrup
28620 74 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  t database */.  
28630 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d 70 50  assert( iIdx<=pP
28640 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  arent->nCell );.
28650 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50 61 72    if( iIdx==pPar
28660 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  ent->nCell ){.  
28670 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79    assert( get4by
28680 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61  te(&pParent->aDa
28690 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  ta[pParent->hdrO
286a0 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c  ffset+8])==iChil
286b0 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  d );.  }else{.  
286c0 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79    assert( get4by
286d0 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72  te(findCell(pPar
286e0 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69 43 68  ent, iIdx))==iCh
286f0 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  ild );.  }.}.#el
28700 73 65 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73  se.#  define ass
28710 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 78  ertParentIndex(x
28720 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f  ,y,z) .#endif../
28730 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
28740 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70  rsor up to the p
28750 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a  arent page..**.*
28760 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73  * pCur->idx is s
28770 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69  et to the cell i
28780 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69  ndex that contai
28790 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a  ns the pointer.*
287a0 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20 77 65  * to the page we
287b0 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d   are coming from
287c0 2e 20 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d  .  If we are com
287d0 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ing from the.** 
287e0 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64  right-most child
287f0 20 70 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d   page then pCur-
28800 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f  >idx is set to o
28810 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20  ne more than.** 
28820 74 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c  the largest cell
28830 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69   index..*/.stati
28840 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72  c void moveToPar
28850 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ent(BtCursor *pC
28860 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ur){.  assert( c
28870 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
28880 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
28890 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
288a0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
288b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
288c0 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20  r->iPage>0 );.  
288d0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
288e0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
288f0 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 50 61 72  ] );.  assertPar
28900 65 6e 74 49 6e 64 65 78 28 0a 20 20 20 20 70 43  entIndex(.    pC
28910 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
28920 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20  >iPage-1], .    
28930 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
28940 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20  ->iPage-1], .   
28950 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
28960 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e 6f  ur->iPage]->pgno
28970 0a 20 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  .  );.  testcase
28980 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
28990 75 72 2d 3e 69 50 61 67 65 2d 31 5d 20 3e 20 70  ur->iPage-1] > p
289a0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
289b0 2d 3e 69 50 61 67 65 2d 31 5d 2d 3e 6e 43 65 6c  ->iPage-1]->nCel
289c0 6c 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  l );.  pCur->inf
289d0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
289e0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
289f0 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   ~(BTCF_ValidNKe
28a00 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  y|BTCF_ValidOvfl
28a10 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  );.  releasePage
28a20 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 61 70  NotNull(pCur->ap
28a30 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
28a40 2d 2d 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  --]);.}../*.** M
28a50 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
28a60 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72  o point to the r
28a70 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 74 73 20  oot page of its 
28a80 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
28a90 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74  ..**.** If the t
28aa0 61 62 6c 65 20 68 61 73 20 61 20 76 69 72 74 75  able has a virtu
28ab0 61 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68  al root page, th
28ac0 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  en the cursor is
28ad0 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74 0a   moved to point.
28ae0 2a 2a 20 74 6f 20 74 68 65 20 76 69 72 74 75 61  ** to the virtua
28af0 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 73 74  l root page inst
28b00 65 61 64 20 6f 66 20 74 68 65 20 61 63 74 75 61  ead of the actua
28b10 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 41 20 74  l root page. A t
28b20 61 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76 69  able has a.** vi
28b30 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  rtual root page 
28b40 77 68 65 6e 20 74 68 65 20 61 63 74 75 61 6c 20  when the actual 
28b50 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74 61 69  root page contai
28b60 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64 20  ns no cells and 
28b70 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68 69  a .** single chi
28b80 6c 64 20 70 61 67 65 2e 20 54 68 69 73 20 63 61  ld page. This ca
28b90 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77 69  n only happen wi
28ba0 74 68 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f  th the table roo
28bb0 74 65 64 20 61 74 20 70 61 67 65 20 31 2e 0a 2a  ted at page 1..*
28bc0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d 74 72  *.** If the b-tr
28bd0 65 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ee structure is 
28be0 65 6d 70 74 79 2c 20 74 68 65 20 63 75 72 73 6f  empty, the curso
28bf0 72 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74  r state is set t
28c00 6f 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e 56  o .** CURSOR_INV
28c10 41 4c 49 44 2e 20 4f 74 68 65 72 77 69 73 65 2c  ALID. Otherwise,
28c20 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 73   the cursor is s
28c30 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  et to point to t
28c40 68 65 20 66 69 72 73 74 0a 2a 2a 20 63 65 6c 6c  he first.** cell
28c50 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20   located on the 
28c60 72 6f 6f 74 20 28 6f 72 20 76 69 72 74 75 61 6c  root (or virtual
28c70 20 72 6f 6f 74 29 20 70 61 67 65 20 61 6e 64 20   root) page and 
28c80 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65  the cursor state
28c90 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 43 55  .** is set to CU
28ca0 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a  RSOR_VALID..**.*
28cb0 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69  * If this functi
28cc0 6f 6e 20 72 65 74 75 72 6e 73 20 73 75 63 63 65  on returns succe
28cd0 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d 61 79 20  ssfully, it may 
28ce0 62 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  be assumed that 
28cf0 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68 65 61 64  the.** page-head
28d00 65 72 20 66 6c 61 67 73 20 69 6e 64 69 63 61 74  er flags indicat
28d10 65 20 74 68 61 74 20 74 68 65 20 5b 76 69 72 74  e that the [virt
28d20 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67 65 20 69  ual] root-page i
28d30 73 20 74 68 65 20 65 78 70 65 63 74 65 64 20 0a  s the expected .
28d40 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d 74 72 65  ** kind of b-tre
28d50 65 20 70 61 67 65 20 28 69 2e 65 2e 20 69 66 20  e page (i.e. if 
28d60 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65  when opening the
28d70 20 63 75 72 73 6f 72 20 74 68 65 20 63 61 6c 6c   cursor the call
28d80 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a 20 73 70  er did not.** sp
28d90 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20  ecify a KeyInfo 
28da0 73 74 72 75 63 74 75 72 65 20 74 68 65 20 66 6c  structure the fl
28db0 61 67 73 20 62 79 74 65 20 69 73 20 73 65 74 20  ags byte is set 
28dc0 74 6f 20 30 78 30 35 20 6f 72 20 30 78 30 44 2c  to 0x05 or 0x0D,
28dd0 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 61  .** indicating a
28de0 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 20 6f   table b-tree, o
28df0 72 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72 20  r if the caller 
28e00 64 69 64 20 73 70 65 63 69 66 79 20 61 20 4b 65  did specify a Ke
28e10 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74  yInfo .** struct
28e20 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62 79  ure the flags by
28e30 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78 30  te is set to 0x0
28e40 32 20 6f 72 20 30 78 30 41 2c 20 69 6e 64 69 63  2 or 0x0A, indic
28e50 61 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 0a 2a  ating an index.*
28e60 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73 74  * b-tree)..*/.st
28e70 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52  atic int moveToR
28e80 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  oot(BtCursor *pC
28e90 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ur){.  MemPage *
28ea0 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20  pRoot;.  int rc 
28eb0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
28ec0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
28ed0 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
28ee0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
28ef0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43  RSOR_INVALID < C
28f00 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
28f10 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  K );.  assert( C
28f20 55 52 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20  URSOR_VALID   < 
28f30 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
28f40 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EK );.  assert( 
28f50 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e  CURSOR_FAULT   >
28f60 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
28f70 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75  EEK );.  if( pCu
28f80 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f  r->eState>=CURSO
28f90 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b  R_REQUIRESEEK ){
28fa0 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65  .    if( pCur->e
28fb0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41  State==CURSOR_FA
28fc0 55 4c 54 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ULT ){.      ass
28fd0 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e  ert( pCur->skipN
28fe0 65 78 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ext!=SQLITE_OK )
28ff0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  ;.      return p
29000 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20  Cur->skipNext;. 
29010 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
29020 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
29030 28 70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69  (pCur);.  }..  i
29040 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  f( pCur->iPage>=
29050 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75  0 ){.    if( pCu
29060 72 2d 3e 69 50 61 67 65 20 29 7b 0a 20 20 20 20  r->iPage ){.    
29070 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 61 73    do{.        as
29080 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
29090 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 21  ge[pCur->iPage]!
290a0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  =0 );.        re
290b0 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c  leasePageNotNull
290c0 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  (pCur->apPage[pC
290d0 75 72 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a 20  ur->iPage--]);. 
290e0 20 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75       }while( pCu
290f0 72 2d 3e 69 50 61 67 65 29 3b 0a 20 20 20 20 20  r->iPage);.     
29100 20 67 6f 74 6f 20 73 6b 69 70 5f 69 6e 69 74 3b   goto skip_init;
29110 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
29120 66 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  f( pCur->pgnoRoo
29130 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 75 72  t==0 ){.    pCur
29140 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
29150 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72  R_INVALID;.    r
29160 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
29170 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
29180 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
29190 65 3d 3d 28 2d 31 29 20 29 3b 0a 20 20 20 20 72  e==(-1) );.    r
291a0 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
291b0 67 65 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ge(pCur->pBtree-
291c0 3e 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  >pBt, pCur->pgno
291d0 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70 50  Root, &pCur->apP
291e0 61 67 65 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20  age[0],.        
291f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29200 30 2c 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65  0, pCur->curPage
29210 72 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28  rFlags);.    if(
29220 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
29230 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53  {.      pCur->eS
29240 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
29250 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 72 65  VALID;.       re
29260 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
29270 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d     pCur->iPage =
29280 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 63 75   0;.    pCur->cu
29290 72 49 6e 74 4b 65 79 20 3d 20 70 43 75 72 2d 3e  rIntKey = pCur->
292a0 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65  apPage[0]->intKe
292b0 79 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f 74 20 3d  y;.  }.  pRoot =
292c0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
292d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f  ;.  assert( pRoo
292e0 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70  t->pgno==pCur->p
292f0 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20 20 2f 2a  gnoRoot );..  /*
29300 20 49 66 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e   If pCur->pKeyIn
29310 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  fo is not NULL, 
29320 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20  then the caller 
29330 74 68 61 74 20 6f 70 65 6e 65 64 20 74 68 69 73  that opened this
29340 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 65 78 70   cursor.  ** exp
29350 65 63 74 65 64 20 74 6f 20 6f 70 65 6e 20 69 74  ected to open it
29360 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d 74   on an index b-t
29370 72 65 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ree. Otherwise, 
29380 69 66 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a 20  if pKeyInfo is. 
29390 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61   ** NULL, the ca
293a0 6c 6c 65 72 20 65 78 70 65 63 74 73 20 61 20 74  ller expects a t
293b0 61 62 6c 65 20 62 2d 74 72 65 65 2e 20 49 66 20  able b-tree. If 
293c0 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20  this is not the 
293d0 63 61 73 65 2c 0a 20 20 2a 2a 20 72 65 74 75 72  case,.  ** retur
293e0 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  n an SQLITE_CORR
293f0 55 50 54 20 65 72 72 6f 72 2e 20 0a 20 20 2a 2a  UPT error. .  **
29400 0a 20 20 2a 2a 20 45 61 72 6c 69 65 72 20 76 65  .  ** Earlier ve
29410 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
29420 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
29430 69 73 20 74 65 73 74 20 63 6f 75 6c 64 20 6e 6f  is test could no
29440 74 20 66 61 69 6c 0a 20 20 2a 2a 20 69 66 20 74  t fail.  ** if t
29450 68 65 20 72 6f 6f 74 20 70 61 67 65 20 77 61 73  he root page was
29460 20 61 6c 72 65 61 64 79 20 6c 6f 61 64 65 64 20   already loaded 
29470 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
29480 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 28 69  on was called (i
29490 2e 65 2e 0a 20 20 2a 2a 20 69 66 20 70 43 75 72  .e..  ** if pCur
294a0 2d 3e 69 50 61 67 65 3e 3d 30 29 2e 20 42 75 74  ->iPage>=0). But
294b0 20 74 68 69 73 20 69 73 20 6e 6f 74 20 73 6f 20   this is not so 
294c0 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
294d0 69 73 20 63 6f 72 72 75 70 74 65 64 20 0a 20 20  is corrupted .  
294e0 2a 2a 20 69 6e 20 73 75 63 68 20 61 20 77 61 79  ** in such a way
294f0 20 74 68 61 74 20 70 61 67 65 20 70 52 6f 6f 74   that page pRoot
29500 20 69 73 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20   is linked into 
29510 61 20 73 65 63 6f 6e 64 20 62 2d 74 72 65 65 20  a second b-tree 
29520 74 61 62 6c 65 20 0a 20 20 2a 2a 20 28 6f 72 20  table .  ** (or 
29530 74 68 65 20 66 72 65 65 6c 69 73 74 29 2e 20 20  the freelist).  
29540 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f  */.  assert( pRo
29550 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c  ot->intKey==1 ||
29560 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d   pRoot->intKey==
29570 30 20 29 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74  0 );.  if( pRoot
29580 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 28  ->isInit==0 || (
29590 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d  pCur->pKeyInfo==
295a0 30 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65  0)!=pRoot->intKe
295b0 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
295c0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
295d0 4b 50 54 3b 0a 20 20 7d 0a 0a 73 6b 69 70 5f 69  KPT;.  }..skip_i
295e0 6e 69 74 3a 20 20 0a 20 20 70 43 75 72 2d 3e 61  nit:  .  pCur->a
295f0 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 70  iIdx[0] = 0;.  p
29600 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
29610 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  = 0;.  pCur->cur
29620 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
29630 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69  AtLast|BTCF_Vali
29640 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64  dNKey|BTCF_Valid
29650 4f 76 66 6c 29 3b 0a 0a 20 20 70 52 6f 6f 74 20  Ovfl);..  pRoot 
29660 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  = pCur->apPage[0
29670 5d 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e  ];.  if( pRoot->
29680 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 70  nCell>0 ){.    p
29690 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
296a0 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65  RSOR_VALID;.  }e
296b0 6c 73 65 20 69 66 28 20 21 70 52 6f 6f 74 2d 3e  lse if( !pRoot->
296c0 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f  leaf ){.    Pgno
296d0 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20 69 66   subpage;.    if
296e0 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31  ( pRoot->pgno!=1
296f0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
29700 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
29710 20 20 20 73 75 62 70 61 67 65 20 3d 20 67 65 74     subpage = get
29720 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44  4byte(&pRoot->aD
29730 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66  ata[pRoot->hdrOf
29740 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43  fset+8]);.    pC
29750 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
29760 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72  SOR_VALID;.    r
29770 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
29780 70 43 75 72 2c 20 73 75 62 70 61 67 65 29 3b 0a  pCur, subpage);.
29790 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75    }else{.    pCu
297a0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
297b0 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 7d 0a  OR_INVALID;.  }.
297c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
297d0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
297e0 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68  ursor down to th
297f0 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66  e left-most leaf
29800 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
29810 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77  he.** entry to w
29820 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65  hich it is curre
29830 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a  ntly pointing..*
29840 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f  *.** The left-mo
29850 73 74 20 6c 65 61 66 20 69 73 20 74 68 65 20 6f  st leaf is the o
29860 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c  ne with the smal
29870 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 66  lest key - the f
29880 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e  irst.** in ascen
29890 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  ding order..*/.s
298a0 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
298b0 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72 73 6f  Leftmost(BtCurso
298c0 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f  r *pCur){.  Pgno
298d0 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20   pgno;.  int rc 
298e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d  = SQLITE_OK;.  M
298f0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
29900 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
29910 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
29920 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
29930 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
29940 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
29950 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
29960 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20  E_OK && !(pPage 
29970 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
29980 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65  Cur->iPage])->le
29990 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  af ){.    assert
299a0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
299b0 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65  ur->iPage]<pPage
299c0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70  ->nCell );.    p
299d0 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66  gno = get4byte(f
299e0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
299f0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
29a00 3e 69 50 61 67 65 5d 29 29 3b 0a 20 20 20 20 72  >iPage]));.    r
29a10 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
29a20 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  pCur, pgno);.  }
29a30 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
29a40 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
29a50 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74  cursor down to t
29a60 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65  he right-most le
29a70 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  af entry beneath
29a80 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20   the.** page to 
29a90 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72  which it is curr
29aa0 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20  ently pointing. 
29ab0 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66 66   Notice the diff
29ac0 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65  erence.** betwee
29ad0 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  n moveToLeftmost
29ae0 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67  () and moveToRig
29af0 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54  htmost().  moveT
29b00 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66  oLeftmost().** f
29b10 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  inds the left-mo
29b20 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  st entry beneath
29b30 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65   the *entry* whe
29b40 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74  reas moveToRight
29b50 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20  most().** finds 
29b60 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65  the right-most e
29b70 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
29b80 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54   *page*..**.** T
29b90 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
29ba0 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77  try is the one w
29bb0 69 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20  ith the largest 
29bc0 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a  key - the last.*
29bd0 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69  * key in ascendi
29be0 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ng order..*/.sta
29bf0 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69  tic int moveToRi
29c00 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72  ghtmost(BtCursor
29c10 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20   *pCur){.  Pgno 
29c20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pgno;.  int rc =
29c30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65   SQLITE_OK;.  Me
29c40 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30  mPage *pPage = 0
29c50 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
29c60 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
29c70 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
29c80 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
29c90 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
29ca0 0a 20 20 77 68 69 6c 65 28 20 21 28 70 50 61 67  .  while( !(pPag
29cb0 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
29cc0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e  [pCur->iPage])->
29cd0 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f  leaf ){.    pgno
29ce0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
29cf0 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
29d00 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
29d10 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
29d20 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70  pCur->iPage] = p
29d30 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20  Page->nCell;.   
29d40 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
29d50 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20  d(pCur, pgno);. 
29d60 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
29d70 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75  rn rc;.  }.  pCu
29d80 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
29d90 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e  Page] = pPage->n
29da0 43 65 6c 6c 2d 31 3b 0a 20 20 61 73 73 65 72 74  Cell-1;.  assert
29db0 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69  ( pCur->info.nSi
29dc0 7a 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ze==0 );.  asser
29dd0 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  t( (pCur->curFla
29de0 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e  gs & BTCF_ValidN
29df0 4b 65 79 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74  Key)==0 );.  ret
29e00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
29e10 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  ../* Move the cu
29e20 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73  rsor to the firs
29e30 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
29e40 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51  able.  Return SQ
29e50 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
29e60 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65  ccess.  Set *pRe
29e70 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75  s to 0 if the cu
29e80 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f  rsor actually po
29e90 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e  ints to somethin
29ea0 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65  g.** or set *pRe
29eb0 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61  s to 1 if the ta
29ec0 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
29ed0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
29ee0 65 46 69 72 73 74 28 42 74 43 75 72 73 6f 72 20  eFirst(BtCursor 
29ef0 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
29f00 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
29f10 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
29f20 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
29f30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
29f40 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
29f50 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
29f60 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  b->mutex) );.  r
29f70 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
29f80 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
29f90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29fa0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
29fb0 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
29fc0 44 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  D ){.      asser
29fd0 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t( pCur->pgnoRoo
29fe0 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70  t==0 || pCur->ap
29ff0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2a000 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  ]->nCell==0 );. 
2a010 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
2a020 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2a030 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
2a040 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2a050 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20  e]->nCell>0 );. 
2a060 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
2a070 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
2a080 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
2a090 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2a0a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f  urn rc;.}../* Mo
2a0b0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
2a0c0 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
2a0d0 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  in the table.  R
2a0e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
2a0f0 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ** on success.  
2a100 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69  Set *pRes to 0 i
2a110 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74  f the cursor act
2a120 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ually points to 
2a130 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20  something.** or 
2a140 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69  set *pRes to 1 i
2a150 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
2a160 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
2a170 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 42 74  ite3BtreeLast(Bt
2a180 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
2a190 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
2a1a0 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20  rc;. .  assert( 
2a1b0 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
2a1c0 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
2a1d0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2a1e0 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
2a1f0 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
2a200 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ) );..  /* If th
2a210 65 20 63 75 72 73 6f 72 20 61 6c 72 65 61 64 79  e cursor already
2a220 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c   points to the l
2a230 61 73 74 20 65 6e 74 72 79 2c 20 74 68 69 73 20  ast entry, this 
2a240 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20  is a no-op. */. 
2a250 20 69 66 28 20 43 55 52 53 4f 52 5f 56 41 4c 49   if( CURSOR_VALI
2a260 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
2a270 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  && (pCur->curFla
2a280 67 73 20 26 20 42 54 43 46 5f 41 74 4c 61 73 74  gs & BTCF_AtLast
2a290 29 21 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53  )!=0 ){.#ifdef S
2a2a0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
2a2b0 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65  /* This block se
2a2c0 72 76 65 73 20 74 6f 20 61 73 73 65 72 74 28 29  rves to assert()
2a2d0 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
2a2e0 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 70 6f 69   really does poi
2a2f0 6e 74 20 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  nt .    ** to th
2a300 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
2a310 74 68 65 20 62 2d 74 72 65 65 2e 20 2a 2f 0a 20  the b-tree. */. 
2a320 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 66     int ii;.    f
2a330 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 43 75 72  or(ii=0; ii<pCur
2a340 2d 3e 69 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a  ->iPage; ii++){.
2a350 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
2a360 75 72 2d 3e 61 69 49 64 78 5b 69 69 5d 3d 3d 70  ur->aiIdx[ii]==p
2a370 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 69 5d 2d  Cur->apPage[ii]-
2a380 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a  >nCell );.    }.
2a390 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2a3a0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2a3b0 61 67 65 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61  age]==pCur->apPa
2a3c0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2a3d0 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20 20 20 20  >nCell-1 );.    
2a3e0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
2a3f0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2a400 5d 2d 3e 6c 65 61 66 20 29 3b 0a 23 65 6e 64 69  ]->leaf );.#endi
2a410 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  f.    return SQL
2a420 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72  ITE_OK;.  }..  r
2a430 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
2a440 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
2a450 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2a460 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41   if( CURSOR_INVA
2a470 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
2a480 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  e ){.      asser
2a490 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t( pCur->pgnoRoo
2a4a0 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70  t==0 || pCur->ap
2a4b0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2a4c0 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  ]->nCell==0 );. 
2a4d0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
2a4e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2a4f0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
2a500 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
2a510 4c 49 44 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  LID );.      *pR
2a520 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  es = 0;.      rc
2a530 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f   = moveToRightmo
2a540 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  st(pCur);.      
2a550 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2a560 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  K ){.        pCu
2a570 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42  r->curFlags |= B
2a580 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20  TCF_AtLast;.    
2a590 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2a5a0 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
2a5b0 26 3d 20 7e 42 54 43 46 5f 41 74 4c 61 73 74 3b  &= ~BTCF_AtLast;
2a5c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 0a 20 20 20  .      }.   .   
2a5d0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2a5e0 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  rc;.}../* Move t
2a5f0 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61  he cursor so tha
2a600 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61  t it points to a
2a610 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 74 68 65  n entry near the
2a620 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69 66 69   key .** specifi
2a630 65 64 20 62 79 20 70 49 64 78 4b 65 79 20 6f 72  ed by pIdxKey or
2a640 20 69 6e 74 4b 65 79 2e 20 20 20 52 65 74 75 72   intKey.   Retur
2a650 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f 64 65  n a success code
2a660 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b  ..**.** For INTK
2a670 45 59 20 74 61 62 6c 65 73 2c 20 74 68 65 20 69  EY tables, the i
2a680 6e 74 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20  ntKey parameter 
2a690 69 73 20 75 73 65 64 2e 20 20 70 49 64 78 4b 65  is used.  pIdxKe
2a6a0 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55  y .** must be NU
2a6b0 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 74  LL.  For index t
2a6c0 61 62 6c 65 73 2c 20 70 49 64 78 4b 65 79 20 69  ables, pIdxKey i
2a6d0 73 20 75 73 65 64 20 61 6e 64 20 69 6e 74 4b 65  s used and intKe
2a6e0 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e  y.** is ignored.
2a6f0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61  .**.** If an exa
2a700 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20  ct match is not 
2a710 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20  found, then the 
2a720 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73  cursor is always
2a730 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e  .** left pointin
2a740 67 20 61 74 20 61 20 6c 65 61 66 20 70 61 67 65  g at a leaf page
2a750 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c   which would hol
2a760 64 20 74 68 65 20 65 6e 74 72 79 20 69 66 20 69  d the entry if i
2a770 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e  t.** were presen
2a780 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d  t.  The cursor m
2a790 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e  ight point to an
2a7a0 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65   entry that come
2a7b0 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61  s.** before or a
2a7c0 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a  fter the key..**
2a7d0 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72 20 69  .** An integer i
2a7e0 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a  s written into *
2a7f0 70 52 65 73 20 77 68 69 63 68 20 69 73 20 74 68  pRes which is th
2a800 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63  e result of.** c
2a810 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79  omparing the key
2a820 20 77 69 74 68 20 74 68 65 20 65 6e 74 72 79 20   with the entry 
2a830 74 6f 20 77 68 69 63 68 20 74 68 65 20 63 75 72  to which the cur
2a840 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74  sor is .** point
2a850 69 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e  ing.  The meanin
2a860 67 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72  g of the integer
2a870 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a   written into.**
2a880 20 2a 70 52 65 73 20 69 73 20 61 73 20 66 6f 6c   *pRes is as fol
2a890 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lows:.**.**     
2a8a0 2a 70 52 65 73 3c 30 20 20 20 20 20 20 54 68 65  *pRes<0      The
2a8b0 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
2a8c0 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
2a8d0 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
2a8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
2a8f0 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e   smaller than in
2a900 74 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f 72 20  tKey/pIdxKey or 
2a910 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
2a920 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20  empty.**        
2a930 20 20 20 20 20 20 20 20 20 20 61 6e 64 20 74 68            and th
2a940 65 20 63 75 72 73 6f 72 20 69 73 20 74 68 65 72  e cursor is ther
2a950 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74  efore left point
2a960 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a   to nothing..**.
2a970 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20  **     *pRes==0 
2a980 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
2a990 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
2a9a0 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
2a9b0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
2a9c0 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74       exactly mat
2a9d0 63 68 65 73 20 69 6e 74 4b 65 79 2f 70 49 64 78  ches intKey/pIdx
2a9e0 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  Key..**.**     *
2a9f0 70 52 65 73 3e 30 20 20 20 20 20 20 54 68 65 20  pRes>0      The 
2aa00 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70  cursor is left p
2aa10 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
2aa20 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  try that.**     
2aa30 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20               is 
2aa40 6c 61 72 67 65 72 20 74 68 61 6e 20 69 6e 74 4b  larger than intK
2aa50 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a  ey/pIdxKey..**.*
2aa60 2a 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c  * For index tabl
2aa70 65 73 2c 20 74 68 65 20 70 49 64 78 4b 65 79 2d  es, the pIdxKey-
2aa80 3e 65 71 53 65 65 6e 20 66 69 65 6c 64 20 69 73  >eqSeen field is
2aa90 20 73 65 74 20 74 6f 20 31 20 69 66 20 74 68 65   set to 1 if the
2aaa0 72 65 0a 2a 2a 20 65 78 69 73 74 73 20 61 6e 20  re.** exists an 
2aab0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
2aac0 6c 65 20 74 68 61 74 20 65 78 61 63 74 6c 79 20  le that exactly 
2aad0 6d 61 74 63 68 65 73 20 70 49 64 78 4b 65 79 2e  matches pIdxKey.
2aae0 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65    .*/.int sqlite
2aaf0 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61  3BtreeMovetoUnpa
2ab00 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72  cked(.  BtCursor
2ab10 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20   *pCur,         
2ab20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74   /* The cursor t
2ab30 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20  o be moved */.  
2ab40 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
2ab50 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61  pIdxKey, /* Unpa
2ab60 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a  cked index key *
2ab70 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65 79 2c 20  /.  i64 intKey, 
2ab80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ab90 54 68 65 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f  The table key */
2aba0 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67 68 74  .  int biasRight
2abb0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
2abc0 66 20 74 72 75 65 2c 20 62 69 61 73 20 74 68 65  f true, bias the
2abd0 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68   search to the h
2abe0 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74  igh end */.  int
2abf0 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20   *pRes          
2ac00 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73        /* Write s
2ac10 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65  earch results he
2ac20 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
2ac30 63 3b 0a 20 20 52 65 63 6f 72 64 43 6f 6d 70 61  c;.  RecordCompa
2ac40 72 65 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72  re xRecordCompar
2ac50 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
2ac60 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2ac70 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2ac80 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2ac90 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
2aca0 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
2acb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65  );.  assert( pRe
2acc0 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  s );.  assert( (
2acd0 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43  pIdxKey==0)==(pC
2ace0 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29  ur->pKeyInfo==0)
2acf0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2ad00 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2ad10 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 28 70 49 64  OR_VALID || (pId
2ad20 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d  xKey==0)==(pCur-
2ad30 3e 63 75 72 49 6e 74 4b 65 79 21 3d 30 29 20 29  >curIntKey!=0) )
2ad40 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
2ad50 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79  ursor is already
2ad60 20 70 6f 73 69 74 69 6f 6e 65 64 20 61 74 20 74   positioned at t
2ad70 68 65 20 70 6f 69 6e 74 20 77 65 20 61 72 65 20  he point we are 
2ad80 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d  trying.  ** to m
2ad90 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73  ove to, then jus
2ada0 74 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  t return without
2adb0 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20   doing any work 
2adc0 2a 2f 0a 20 20 69 66 28 20 70 49 64 78 4b 65 79  */.  if( pIdxKey
2add0 3d 3d 30 0a 20 20 20 26 26 20 70 43 75 72 2d 3e  ==0.   && pCur->
2ade0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
2adf0 41 4c 49 44 20 26 26 20 28 70 43 75 72 2d 3e 63  ALID && (pCur->c
2ae00 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
2ae10 61 6c 69 64 4e 4b 65 79 29 21 3d 30 0a 20 20 29  alidNKey)!=0.  )
2ae20 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
2ae30 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65  info.nKey==intKe
2ae40 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73  y ){.      *pRes
2ae50 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
2ae60 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2ae70 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72    }.    if( pCur
2ae80 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b  ->info.nKey<intK
2ae90 65 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ey ){.      if( 
2aea0 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
2aeb0 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21 3d  & BTCF_AtLast)!=
2aec0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52  0 ){.        *pR
2aed0 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  es = -1;.       
2aee0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2aef0 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
2af00 20 2f 2a 20 49 66 20 74 68 65 20 72 65 71 75 65   /* If the reque
2af10 73 74 65 64 20 6b 65 79 20 69 73 20 6f 6e 65 20  sted key is one 
2af20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20 70 72  more than the pr
2af30 65 76 69 6f 75 73 20 6b 65 79 2c 20 74 68 65 6e  evious key, then
2af40 0a 20 20 20 20 20 20 2a 2a 20 74 72 79 20 74 6f  .      ** try to
2af50 20 67 65 74 20 74 68 65 72 65 20 75 73 69 6e 67   get there using
2af60 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
2af70 74 28 29 20 72 61 74 68 65 72 20 74 68 61 6e 20  t() rather than 
2af80 61 20 66 75 6c 6c 0a 20 20 20 20 20 20 2a 2a 20  a full.      ** 
2af90 62 69 6e 61 72 79 20 73 65 61 72 63 68 2e 20 20  binary search.  
2afa0 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d  This is an optim
2afb0 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 20 54  ization only.  T
2afc0 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65  he correct answe
2afd0 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74  r.      ** is st
2afe0 69 6c 6c 20 6f 62 74 61 69 6e 65 64 20 77 69 74  ill obtained wit
2aff0 68 6f 75 74 20 74 68 69 73 20 61 73 65 2c 20 6f  hout this ase, o
2b000 6e 6c 79 20 61 20 6c 69 74 74 6c 65 20 6d 6f 72  nly a little mor
2b010 65 20 73 6c 6f 77 65 6c 79 20 2a 2f 0a 20 20 20  e slowely */.   
2b020 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66     if( pCur->inf
2b030 6f 2e 6e 4b 65 79 2b 31 3d 3d 69 6e 74 4b 65 79  o.nKey+1==intKey
2b040 20 26 26 20 21 70 43 75 72 2d 3e 73 6b 69 70 4e   && !pCur->skipN
2b050 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  ext ){.        *
2b060 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
2b070 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2b080 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52  reeNext(pCur, pR
2b090 65 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  es);.        if(
2b0a0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2b0b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 70 52  .        if( *pR
2b0c0 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  es==0 ){.       
2b0d0 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70     getCellInfo(p
2b0e0 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Cur);.          
2b0f0 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
2b100 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20  Key==intKey ){. 
2b110 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
2b120 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
2b130 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b140 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
2b150 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 49 64 78  .  }..  if( pIdx
2b160 4b 65 79 20 29 7b 0a 20 20 20 20 78 52 65 63 6f  Key ){.    xReco
2b170 72 64 43 6f 6d 70 61 72 65 20 3d 20 73 71 6c 69  rdCompare = sqli
2b180 74 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70 61  te3VdbeFindCompa
2b190 72 65 28 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  re(pIdxKey);.   
2b1a0 20 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64   pIdxKey->errCod
2b1b0 65 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  e = 0;.    asser
2b1c0 74 28 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61  t( pIdxKey->defa
2b1d0 75 6c 74 5f 72 63 3d 3d 31 20 0a 20 20 20 20 20  ult_rc==1 .     
2b1e0 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e      || pIdxKey->
2b1f0 64 65 66 61 75 6c 74 5f 72 63 3d 3d 30 20 0a 20  default_rc==0 . 
2b200 20 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 4b          || pIdxK
2b210 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d  ey->default_rc==
2b220 2d 31 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73  -1.    );.  }els
2b230 65 7b 0a 20 20 20 20 78 52 65 63 6f 72 64 43 6f  e{.    xRecordCo
2b240 6d 70 61 72 65 20 3d 20 30 3b 20 2f 2a 20 41 6c  mpare = 0; /* Al
2b250 6c 20 6b 65 79 73 20 61 72 65 20 69 6e 74 65 67  l keys are integ
2b260 65 72 73 20 2a 2f 0a 20 20 7d 0a 0a 20 20 72 63  ers */.  }..  rc
2b270 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
2b280 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ur);.  if( rc ){
2b290 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
2b2a0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
2b2b0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
2b2c0 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
2b2d0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a  pCur->iPage] );.
2b2e0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2b2f0 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70  pgnoRoot==0 || p
2b300 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2b310 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49 6e 69 74  ->iPage]->isInit
2b320 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2b330 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2b340 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43  OR_INVALID || pC
2b350 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2b360 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30  >iPage]->nCell>0
2b370 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
2b380 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
2b390 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70  NVALID ){.    *p
2b3a0 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73  Res = -1;.    as
2b3b0 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
2b3c0 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
2b3d0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2b3e0 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  age]->nCell==0 )
2b3f0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
2b400 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73  ITE_OK;.  }.  as
2b410 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
2b420 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 70  ge[0]->intKey==p
2b430 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29  Cur->curIntKey )
2b440 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2b450 2d 3e 63 75 72 49 6e 74 4b 65 79 20 7c 7c 20 70  ->curIntKey || p
2b460 49 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28  IdxKey );.  for(
2b470 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72  ;;){.    int lwr
2b480 2c 20 75 70 72 2c 20 69 64 78 2c 20 63 3b 0a 20  , upr, idx, c;. 
2b490 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a     Pgno chldPg;.
2b4a0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
2b4b0 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
2b4c0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
2b4d0 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20      u8 *pCell;  
2b4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b4f0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
2b500 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20 63 65  er to current ce
2b510 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a 0a  ll in pPage */..
2b520 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 6e 43      /* pPage->nC
2b530 65 6c 6c 20 6d 75 73 74 20 62 65 20 67 72 65 61  ell must be grea
2b540 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e 20 49  ter than zero. I
2b550 66 20 74 68 69 73 20 69 73 20 74 68 65 20 72 6f  f this is the ro
2b560 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20 74  ot-page.    ** t
2b570 68 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20  he cursor would 
2b580 68 61 76 65 20 62 65 65 6e 20 49 4e 56 41 4c 49  have been INVALI
2b590 44 20 61 62 6f 76 65 20 61 6e 64 20 74 68 69 73  D above and this
2b5a0 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20   for(;;) loop.  
2b5b0 20 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20 49 66    ** not run. If
2b5c0 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65   this is not the
2b5d0 20 72 6f 6f 74 2d 70 61 67 65 2c 20 74 68 65 6e   root-page, then
2b5e0 20 74 68 65 20 6d 6f 76 65 54 6f 43 68 69 6c 64   the moveToChild
2b5f0 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a  () routine.    *
2b600 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 61 6c 72  * would have alr
2b610 65 61 64 79 20 64 65 74 65 63 74 65 64 20 64 62  eady detected db
2b620 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 53 69 6d   corruption. Sim
2b630 69 6c 61 72 6c 79 2c 20 70 50 61 67 65 20 6d 75  ilarly, pPage mu
2b640 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 65  st.    ** be the
2b650 20 72 69 67 68 74 20 6b 69 6e 64 20 28 69 6e 64   right kind (ind
2b660 65 78 20 6f 72 20 74 61 62 6c 65 29 20 6f 66 20  ex or table) of 
2b670 62 2d 74 72 65 65 20 70 61 67 65 2e 20 4f 74 68  b-tree page. Oth
2b680 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 20  erwise.    ** a 
2b690 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 6f 72  moveToChild() or
2b6a0 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20 63 61   moveToRoot() ca
2b6b0 6c 6c 20 77 6f 75 6c 64 20 68 61 76 65 20 64 65  ll would have de
2b6c0 74 65 63 74 65 64 20 63 6f 72 72 75 70 74 69 6f  tected corruptio
2b6d0 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  n.  */.    asser
2b6e0 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  t( pPage->nCell>
2b6f0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2b700 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d   pPage->intKey==
2b710 28 70 49 64 78 4b 65 79 3d 3d 30 29 20 29 3b 0a  (pIdxKey==0) );.
2b720 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20      lwr = 0;.   
2b730 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43   upr = pPage->nC
2b740 65 6c 6c 2d 31 3b 0a 20 20 20 20 61 73 73 65 72  ell-1;.    asser
2b750 74 28 20 62 69 61 73 52 69 67 68 74 3d 3d 30 20  t( biasRight==0 
2b760 7c 7c 20 62 69 61 73 52 69 67 68 74 3d 3d 31 20  || biasRight==1 
2b770 29 3b 0a 20 20 20 20 69 64 78 20 3d 20 75 70 72  );.    idx = upr
2b780 3e 3e 28 31 2d 62 69 61 73 52 69 67 68 74 29 3b  >>(1-biasRight);
2b790 20 2f 2a 20 69 64 78 20 3d 20 62 69 61 73 52 69   /* idx = biasRi
2b7a0 67 68 74 20 3f 20 75 70 72 20 3a 20 28 6c 77 72  ght ? upr : (lwr
2b7b0 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20  +upr)/2; */.    
2b7c0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2b7d0 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
2b7e0 69 64 78 3b 0a 20 20 20 20 69 66 28 20 78 52 65  idx;.    if( xRe
2b7f0 63 6f 72 64 43 6f 6d 70 61 72 65 3d 3d 30 20 29  cordCompare==0 )
2b800 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b  {.      for(;;){
2b810 0a 20 20 20 20 20 20 20 20 69 36 34 20 6e 43 65  .        i64 nCe
2b820 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 70  llKey;.        p
2b830 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 50  Cell = findCellP
2b840 61 73 74 50 74 72 28 70 50 61 67 65 2c 20 69 64  astPtr(pPage, id
2b850 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  x);.        if( 
2b860 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61  pPage->intKeyLea
2b870 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  f ){.          w
2b880 68 69 6c 65 28 20 30 78 38 30 20 3c 3d 20 2a 28  hile( 0x80 <= *(
2b890 70 43 65 6c 6c 2b 2b 29 20 29 7b 0a 20 20 20 20  pCell++) ){.    
2b8a0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 65 6c          if( pCel
2b8b0 6c 3e 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45  l>=pPage->aDataE
2b8c0 6e 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  nd ) return SQLI
2b8d0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2b8e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2b8f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67       }.        g
2b900 65 74 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20  etVarint(pCell, 
2b910 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29  (u64*)&nCellKey)
2b920 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43  ;.        if( nC
2b930 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b  ellKey<intKey ){
2b940 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d  .          lwr =
2b950 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 20 20   idx+1;.        
2b960 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b    if( lwr>upr ){
2b970 20 63 20 3d 20 2d 31 3b 20 62 72 65 61 6b 3b 20   c = -1; break; 
2b980 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  }.        }else 
2b990 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74  if( nCellKey>int
2b9a0 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Key ){.         
2b9b0 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20   upr = idx-1;.  
2b9c0 20 20 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e          if( lwr>
2b9d0 75 70 72 20 29 7b 20 63 20 3d 20 2b 31 3b 20 62  upr ){ c = +1; b
2b9e0 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20  reak; }.        
2b9f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2ba00 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65   assert( nCellKe
2ba10 79 3d 3d 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20  y==intKey );.   
2ba20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49         pCur->aiI
2ba30 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
2ba40 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20  = (u16)idx;.    
2ba50 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
2ba60 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
2ba70 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 3b        lwr = idx;
2ba80 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
2ba90 6f 20 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61  o moveto_next_la
2baa0 79 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  yer;.          }
2bab0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2bac0 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
2bad0 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b   |= BTCF_ValidNK
2bae0 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ey;.            
2baf0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20  pCur->info.nKey 
2bb00 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20  = nCellKey;.    
2bb10 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e          pCur->in
2bb20 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
2bb30 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73 20            *pRes 
2bb40 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
2bb50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2bb60 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  K;.          }. 
2bb70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2bb80 20 61 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72   assert( lwr+upr
2bb90 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  >=0 );.        i
2bba0 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e  dx = (lwr+upr)>>
2bbb0 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77  1;  /* idx = (lw
2bbc0 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20  r+upr)/2; */.   
2bbd0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
2bbe0 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20        for(;;){. 
2bbf0 20 20 20 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c         int nCell
2bc00 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68  ;  /* Size of th
2bc10 65 20 70 43 65 6c 6c 20 63 65 6c 6c 20 69 6e 20  e pCell cell in 
2bc20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  bytes */.       
2bc30 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
2bc40 6c 50 61 73 74 50 74 72 28 70 50 61 67 65 2c 20  lPastPtr(pPage, 
2bc50 69 64 78 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  idx);..        /
2bc60 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 75  * The maximum su
2bc70 70 70 6f 72 74 65 64 20 70 61 67 65 2d 73 69 7a  pported page-siz
2bc80 65 20 69 73 20 36 35 35 33 36 20 62 79 74 65 73  e is 65536 bytes
2bc90 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  . This means tha
2bca0 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  t.        ** the
2bcb0 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
2bcc0 6f 66 20 72 65 63 6f 72 64 20 62 79 74 65 73 20  of record bytes 
2bcd0 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64  stored on an ind
2bce0 65 78 20 42 2d 54 72 65 65 0a 20 20 20 20 20 20  ex B-Tree.      
2bcf0 20 20 2a 2a 20 70 61 67 65 20 69 73 20 6c 65 73    ** page is les
2bd00 73 20 74 68 61 6e 20 31 36 33 38 34 20 62 79 74  s than 16384 byt
2bd10 65 73 20 61 6e 64 20 6d 61 79 20 62 65 20 73 74  es and may be st
2bd20 6f 72 65 64 20 61 73 20 61 20 32 2d 62 79 74 65  ored as a 2-byte
2bd30 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61 72 69  .        ** vari
2bd40 6e 74 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  nt. This informa
2bd50 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
2bd60 61 74 74 65 6d 70 74 20 74 6f 20 61 76 6f 69 64  attempt to avoid
2bd70 20 70 61 72 73 69 6e 67 20 0a 20 20 20 20 20 20   parsing .      
2bd80 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20    ** the entire 
2bd90 63 65 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e 67  cell by checking
2bda0 20 66 6f 72 20 74 68 65 20 63 61 73 65 73 20 77   for the cases w
2bdb0 68 65 72 65 20 74 68 65 20 72 65 63 6f 72 64 20  here the record 
2bdc0 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  is .        ** s
2bdd0 74 6f 72 65 64 20 65 6e 74 69 72 65 6c 79 20 77  tored entirely w
2bde0 69 74 68 69 6e 20 74 68 65 20 62 2d 74 72 65 65  ithin the b-tree
2bdf0 20 70 61 67 65 20 62 79 20 69 6e 73 70 65 63 74   page by inspect
2be00 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 0a 20  ing the first . 
2be10 20 20 20 20 20 20 20 2a 2a 20 32 20 62 79 74 65         ** 2 byte
2be20 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20  s of the cell.. 
2be30 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2be40 20 20 6e 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b    nCell = pCell[
2be50 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0];.        if( 
2be60 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61  nCell<=pPage->ma
2be70 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 29 7b  x1bytePayload ){
2be80 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
2be90 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69  is branch runs i
2bea0 66 20 74 68 65 20 72 65 63 6f 72 64 2d 73 69 7a  f the record-siz
2beb0 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63  e field of the c
2bec0 65 6c 6c 20 69 73 20 61 0a 20 20 20 20 20 20 20  ell is a.       
2bed0 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74     ** single byt
2bee0 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65  e varint and the
2bef0 20 72 65 63 6f 72 64 20 66 69 74 73 20 65 6e 74   record fits ent
2bf00 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69  irely on the mai
2bf10 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  n.          ** b
2bf20 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a  -tree page.  */.
2bf30 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2bf40 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b  se( pCell+nCell+
2bf50 31 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45  1==pPage->aDataE
2bf60 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nd );.          
2bf70 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61  c = xRecordCompa
2bf80 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a  re(nCell, (void*
2bf90 29 26 70 43 65 6c 6c 5b 31 5d 2c 20 70 49 64 78  )&pCell[1], pIdx
2bfa0 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  Key);.        }e
2bfb0 6c 73 65 20 69 66 28 20 21 28 70 43 65 6c 6c 5b  lse if( !(pCell[
2bfc0 31 5d 20 26 20 30 78 38 30 29 20 0a 20 20 20 20  1] & 0x80) .    
2bfd0 20 20 20 20 20 20 26 26 20 28 6e 43 65 6c 6c 20        && (nCell 
2bfe0 3d 20 28 28 6e 43 65 6c 6c 26 30 78 37 66 29 3c  = ((nCell&0x7f)<
2bff0 3c 37 29 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c  <7) + pCell[1])<
2c000 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
2c010 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
2c020 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63        /* The rec
2c030 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 69  ord-size field i
2c040 73 20 61 20 32 20 62 79 74 65 20 76 61 72 69 6e  s a 2 byte varin
2c050 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64  t and the record
2c060 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66   .          ** f
2c070 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20  its entirely on 
2c080 74 68 65 20 6d 61 69 6e 20 62 2d 74 72 65 65 20  the main b-tree 
2c090 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  page.  */.      
2c0a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43      testcase( pC
2c0b0 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d 70 50 61  ell+nCell+2==pPa
2c0c0 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a  ge->aDataEnd );.
2c0d0 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52            c = xR
2c0e0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65  ecordCompare(nCe
2c0f0 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c  ll, (void*)&pCel
2c100 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a  l[2], pIdxKey);.
2c110 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2c120 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2c130 72 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65  record flows ove
2c140 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f  r onto one or mo
2c150 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  re overflow page
2c160 73 2e 20 49 6e 0a 20 20 20 20 20 20 20 20 20 20  s. In.          
2c170 2a 2a 20 74 68 69 73 20 63 61 73 65 20 74 68 65  ** this case the
2c180 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64   whole cell need
2c190 73 20 74 6f 20 62 65 20 70 61 72 73 65 64 2c 20  s to be parsed, 
2c1a0 61 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74  a buffer allocat
2c1b0 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ed.          ** 
2c1c0 61 6e 64 20 61 63 63 65 73 73 50 61 79 6c 6f 61  and accessPayloa
2c1d0 64 28 29 20 75 73 65 64 20 74 6f 20 72 65 74 72  d() used to retr
2c1e0 69 65 76 65 20 74 68 65 20 72 65 63 6f 72 64 20  ieve the record 
2c1f0 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  into the.       
2c200 20 20 20 2a 2a 20 62 75 66 66 65 72 20 62 65 66     ** buffer bef
2c210 6f 72 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f  ore VdbeRecordCo
2c220 6d 70 61 72 65 28 29 20 63 61 6e 20 62 65 20 63  mpare() can be c
2c230 61 6c 6c 65 64 2e 20 0a 20 20 20 20 20 20 20 20  alled. .        
2c240 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a    **.          *
2c250 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20  * If the record 
2c260 69 73 20 63 6f 72 72 75 70 74 2c 20 74 68 65 20  is corrupt, the 
2c270 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 72  xRecordCompare r
2c280 6f 75 74 69 6e 65 20 6d 61 79 20 72 65 61 64 0a  outine may read.
2c290 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 70 20            ** up 
2c2a0 74 6f 20 74 77 6f 20 76 61 72 69 6e 74 73 20 70  to two varints p
2c2b0 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
2c2c0 68 65 20 62 75 66 66 65 72 2e 20 41 6e 20 65 78  he buffer. An ex
2c2d0 74 72 61 20 31 38 20 0a 20 20 20 20 20 20 20 20  tra 18 .        
2c2e0 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 70 61    ** bytes of pa
2c2f0 64 64 69 6e 67 20 69 73 20 61 6c 6c 6f 63 61 74  dding is allocat
2c300 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ed at the end of
2c310 20 74 68 65 20 62 75 66 66 65 72 20 69 6e 0a 20   the buffer in. 
2c320 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65           ** case
2c330 20 74 68 69 73 20 68 61 70 70 65 6e 73 2e 20 20   this happens.  
2c340 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 76 6f 69  */.          voi
2c350 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20  d *pCellKey;.   
2c360 20 20 20 20 20 20 20 75 38 20 2a 20 63 6f 6e 73         u8 * cons
2c370 74 20 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43  t pCellBody = pC
2c380 65 6c 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68 69  ell - pPage->chi
2c390 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20  ldPtrSize;.     
2c3a0 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72       pPage->xPar
2c3b0 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  seCell(pPage, pC
2c3c0 65 6c 6c 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e  ellBody, &pCur->
2c3d0 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  info);.         
2c3e0 20 6e 43 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43   nCell = (int)pC
2c3f0 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20  ur->info.nKey;. 
2c400 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2c410 65 28 20 6e 43 65 6c 6c 3c 30 20 29 3b 20 20 20  e( nCell<0 );   
2c420 2f 2a 20 54 72 75 65 20 69 66 20 6b 65 79 20 73  /* True if key s
2c430 69 7a 65 20 69 73 20 32 5e 33 32 20 6f 72 20 6d  ize is 2^32 or m
2c440 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ore */.         
2c450 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c   testcase( nCell
2c460 3d 3d 30 20 29 3b 20 20 2f 2a 20 49 6e 76 61 6c  ==0 );  /* Inval
2c470 69 64 20 6b 65 79 20 73 69 7a 65 3a 20 20 30 78  id key size:  0x
2c480 38 30 20 30 78 38 30 20 30 78 30 30 20 2a 2f 0a  80 0x80 0x00 */.
2c490 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2c4a0 73 65 28 20 6e 43 65 6c 6c 3d 3d 31 20 29 3b 20  se( nCell==1 ); 
2c4b0 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79 20   /* Invalid key 
2c4c0 73 69 7a 65 3a 20 20 30 78 38 30 20 30 78 38 30  size:  0x80 0x80
2c4d0 20 30 78 30 31 20 2a 2f 0a 20 20 20 20 20 20 20   0x01 */.       
2c4e0 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43 65     testcase( nCe
2c4f0 6c 6c 3d 3d 32 20 29 3b 20 20 2f 2a 20 4d 69 6e  ll==2 );  /* Min
2c500 69 6d 75 6d 20 6c 65 67 61 6c 20 69 6e 64 65 78  imum legal index
2c510 20 6b 65 79 20 73 69 7a 65 20 2a 2f 0a 20 20 20   key size */.   
2c520 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c         if( nCell
2c530 3c 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <2 ){.          
2c540 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
2c550 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2c560 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
2c570 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
2c580 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2c590 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c    pCellKey = sql
2c5a0 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c  ite3Malloc( nCel
2c5b0 6c 2b 31 38 20 29 3b 0a 20 20 20 20 20 20 20 20  l+18 );.        
2c5c0 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d    if( pCellKey==
2c5d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2c5e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
2c5f0 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  EM_BKPT;.       
2c600 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
2c610 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
2c620 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
2c630 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2c640 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69  >iPage] = (u16)i
2c650 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  dx;.          rc
2c660 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64   = accessPayload
2c670 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c  (pCur, 0, nCell,
2c680 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
2c690 29 70 43 65 6c 6c 4b 65 79 2c 20 30 29 3b 0a 20  )pCellKey, 0);. 
2c6a0 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63           pCur->c
2c6b0 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46  urFlags &= ~BTCF
2c6c0 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a 20 20 20 20  _ValidOvfl;.    
2c6d0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
2c6e0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2c6f0 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65  te3_free(pCellKe
2c700 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y);.            
2c710 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
2c720 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  sh;.          }.
2c730 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52            c = xR
2c740 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65  ecordCompare(nCe
2c750 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49  ll, pCellKey, pI
2c760 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  dxKey);.        
2c770 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
2c780 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
2c790 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
2c7a0 72 74 28 20 0a 20 20 20 20 20 20 20 20 20 20 20  rt( .           
2c7b0 20 28 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f   (pIdxKey->errCo
2c7c0 64 65 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55  de!=SQLITE_CORRU
2c7d0 50 54 20 7c 7c 20 63 3d 3d 30 29 0a 20 20 20 20  PT || c==0).    
2c7e0 20 20 20 20 20 26 26 20 28 70 49 64 78 4b 65 79       && (pIdxKey
2c7f0 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
2c800 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 70 43 75 72 2d  E_NOMEM || pCur-
2c810 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 61 6c  >pBtree->db->mal
2c820 6c 6f 63 46 61 69 6c 65 64 29 0a 20 20 20 20 20  locFailed).     
2c830 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
2c840 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ( c<0 ){.       
2c850 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a     lwr = idx+1;.
2c860 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
2c870 28 20 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ( c>0 ){.       
2c880 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a     upr = idx-1;.
2c890 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2c8a0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2c8b0 20 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20   c==0 );.       
2c8c0 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
2c8d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2c8e0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
2c8f0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
2c900 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
2c910 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20  6)idx;.         
2c920 20 69 66 28 20 70 49 64 78 4b 65 79 2d 3e 65 72   if( pIdxKey->er
2c930 72 43 6f 64 65 20 29 20 72 63 20 3d 20 53 51 4c  rCode ) rc = SQL
2c940 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  ITE_CORRUPT;.   
2c950 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
2c960 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
2c970 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
2c980 20 6c 77 72 3e 75 70 72 20 29 20 62 72 65 61 6b   lwr>upr ) break
2c990 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2c9a0 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a  ( lwr+upr>=0 );.
2c9b0 20 20 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c          idx = (l
2c9c0 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20  wr+upr)>>1;  /* 
2c9d0 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f  idx = (lwr+upr)/
2c9e0 32 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  2 */.      }.   
2c9f0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c   }.    assert( l
2ca00 77 72 3d 3d 75 70 72 2b 31 20 7c 7c 20 28 70 50  wr==upr+1 || (pP
2ca10 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21  age->intKey && !
2ca20 70 50 61 67 65 2d 3e 6c 65 61 66 29 20 29 3b 0a  pPage->leaf) );.
2ca30 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2ca40 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20  e->isInit );.   
2ca50 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
2ca60 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2ca70 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
2ca80 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d  ur->iPage]<pCur-
2ca90 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2caa0 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  age]->nCell );. 
2cab0 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78       pCur->aiIdx
2cac0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
2cad0 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20  (u16)idx;.      
2cae0 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20  *pRes = c;.     
2caf0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2cb00 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65  .      goto move
2cb10 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d  to_finish;.    }
2cb20 0a 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79  .moveto_next_lay
2cb30 65 72 3a 0a 20 20 20 20 69 66 28 20 6c 77 72 3e  er:.    if( lwr>
2cb40 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b  =pPage->nCell ){
2cb50 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20  .      chldPg = 
2cb60 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
2cb70 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
2cb80 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
2cb90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
2cba0 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28  ldPg = get4byte(
2cbb0 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
2cbc0 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  lwr));.    }.   
2cbd0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2cbe0 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36  r->iPage] = (u16
2cbf0 29 6c 77 72 3b 0a 20 20 20 20 72 63 20 3d 20 6d  )lwr;.    rc = m
2cc00 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
2cc10 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66   chldPg);.    if
2cc20 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20  ( rc ) break;.  
2cc30 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a  }.moveto_finish:
2cc40 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
2cc50 69 7a 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  ize = 0;.  asser
2cc60 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  t( (pCur->curFla
2cc70 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f  gs & BTCF_ValidO
2cc80 76 66 6c 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74  vfl)==0 );.  ret
2cc90 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
2cca0 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
2ccb0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e   the cursor is n
2ccc0 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ot pointing at a
2ccd0 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74  n entry of the t
2cce0 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45  able..**.** TRUE
2ccf0 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
2cd00 64 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74  d after a call t
2cd10 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  o sqlite3BtreeNe
2cd20 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61  xt() moves.** pa
2cd30 73 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  st the last entr
2cd40 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f  y in the table o
2cd50 72 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  r sqlite3BtreePr
2cd60 65 76 28 29 20 6d 6f 76 65 73 20 70 61 73 74 0a  ev() moves past.
2cd70 2a 2a 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  ** the first ent
2cd80 72 79 2e 20 20 54 52 55 45 20 69 73 20 61 6c 73  ry.  TRUE is als
2cd90 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  o returned if th
2cda0 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
2cdb0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2cdc0 42 74 72 65 65 45 6f 66 28 42 74 43 75 72 73 6f  BtreeEof(BtCurso
2cdd0 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54  r *pCur){.  /* T
2cde0 4f 44 4f 3a 20 57 68 61 74 20 69 66 20 74 68 65  ODO: What if the
2cdf0 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20 43 55   cursor is in CU
2ce00 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
2ce10 20 62 75 74 20 61 6c 6c 20 74 61 62 6c 65 20 65   but all table e
2ce20 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68 61 76 65  ntries.  ** have
2ce30 20 62 65 65 6e 20 64 65 6c 65 74 65 64 3f 20 54   been deleted? T
2ce40 68 69 73 20 41 50 49 20 77 69 6c 6c 20 6e 65 65  his API will nee
2ce50 64 20 74 6f 20 63 68 61 6e 67 65 20 74 6f 20 72  d to change to r
2ce60 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
2ce70 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c  ode.  ** as well
2ce80 20 61 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20   as the boolean 
2ce90 72 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20  result value..  
2cea0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 43 55 52  */.  return (CUR
2ceb0 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d  SOR_VALID!=pCur-
2cec0 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a  >eState);.}../*.
2ced0 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 63  ** Advance the c
2cee0 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78  ursor to the nex
2cef0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
2cf00 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20  atabase.  If.** 
2cf10 73 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20  successful then 
2cf20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66  set *pRes=0.  If
2cf30 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77   the cursor.** w
2cf40 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  as already point
2cf50 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74 20  ing to the last 
2cf60 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
2cf70 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20  abase before.** 
2cf80 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
2cf90 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65   called, then se
2cfa0 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a  t *pRes=1..**.**
2cfb0 20 54 68 65 20 6d 61 69 6e 20 65 6e 74 72 79 20   The main entry 
2cfc0 70 6f 69 6e 74 20 69 73 20 73 71 6c 69 74 65 33  point is sqlite3
2cfd0 42 74 72 65 65 4e 65 78 74 28 29 2e 20 20 54 68  BtreeNext().  Th
2cfe0 61 74 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 70  at routine is op
2cff0 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74  timized.** for t
2d000 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f  he common case o
2d010 66 20 6d 65 72 65 6c 79 20 69 6e 63 72 65 6d 65  f merely increme
2d020 6e 74 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 63  nting the cell c
2d030 6f 75 6e 74 65 72 20 42 74 43 75 72 73 6f 72 2e  ounter BtCursor.
2d040 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20  aiIdx.** to the 
2d050 6e 65 78 74 20 63 65 6c 6c 20 6f 6e 20 74 68 65  next cell on the
2d060 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 20   current page.  
2d070 54 68 65 20 28 73 6c 6f 77 65 72 29 20 62 74 72  The (slower) btr
2d080 65 65 4e 65 78 74 28 29 20 68 65 6c 70 65 72 0a  eeNext() helper.
2d090 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ** routine is ca
2d0a0 6c 6c 65 64 20 77 68 65 6e 20 69 74 20 69 73 20  lled when it is 
2d0b0 6e 65 63 65 73 73 61 72 79 20 74 6f 20 6d 6f 76  necessary to mov
2d0c0 65 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74  e to a different
2d0d0 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 6f 20 72   page or.** to r
2d0e0 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f  estore the curso
2d0f0 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  r..**.** The cal
2d100 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 77 69  ling function wi
2d110 6c 6c 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20  ll set *pRes to 
2d120 30 20 6f 72 20 31 2e 20 20 54 68 65 20 69 6e 69  0 or 1.  The ini
2d130 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65  tial *pRes value
2d140 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 31 20 69 66  .** will be 1 if
2d150 20 74 68 65 20 63 75 72 73 6f 72 20 62 65 69 6e   the cursor bein
2d160 67 20 73 74 65 70 70 65 64 20 63 6f 72 72 65 73  g stepped corres
2d170 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c 20  ponds to an SQL 
2d180 69 6e 64 65 78 20 61 6e 64 0a 2a 2a 20 69 66 20  index and.** if 
2d190 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 75  this routine cou
2d1a0 6c 64 20 68 61 76 65 20 62 65 65 6e 20 73 6b 69  ld have been ski
2d1b0 70 70 65 64 20 69 66 20 74 68 61 74 20 53 51 4c  pped if that SQL
2d1c0 20 69 6e 64 65 78 20 68 61 64 20 62 65 65 6e 0a   index had been.
2d1d0 2a 2a 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65  ** a unique inde
2d1e0 78 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68  x.  Otherwise th
2d1f0 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61  e caller will ha
2d200 76 65 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20  ve set *pRes to 
2d210 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73  zero..** Zero is
2d220 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
2d230 2e 20 54 68 65 20 62 74 72 65 65 20 69 6d 70 6c  . The btree impl
2d240 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 66 72  ementation is fr
2d250 65 65 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a  ee to use the.**
2d260 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76   initial *pRes v
2d270 61 6c 75 65 20 61 73 20 61 20 68 69 6e 74 20 74  alue as a hint t
2d280 6f 20 69 6d 70 72 6f 76 65 20 70 65 72 66 6f 72  o improve perfor
2d290 6d 61 6e 63 65 2c 20 62 75 74 20 74 68 65 20 63  mance, but the c
2d2a0 75 72 72 65 6e 74 0a 2a 2a 20 53 51 4c 69 74 65  urrent.** SQLite
2d2b0 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74   btree implement
2d2c0 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 2e 20  ation does not. 
2d2d0 28 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63  (Note that the c
2d2e0 6f 6d 64 62 32 20 62 74 72 65 65 0a 2a 2a 20 69  omdb2 btree.** i
2d2f0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f  mplementation do
2d300 65 73 20 75 73 65 20 74 68 69 73 20 68 69 6e 74  es use this hint
2d310 2c 20 68 6f 77 65 76 65 72 2e 29 0a 2a 2f 0a 73  , however.).*/.s
2d320 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
2d330 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72 65 65 4e  NLINE int btreeN
2d340 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ext(BtCursor *pC
2d350 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
2d360 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
2d370 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  idx;.  MemPage *
2d380 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
2d390 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
2d3a0 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
2d3b0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b  assert( pCur->sk
2d3c0 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75  ipNext==0 || pCu
2d3d0 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2d3e0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
2d3f0 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 29 3b  ert( *pRes==0 );
2d400 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
2d410 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
2d420 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  D ){.    assert(
2d430 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
2d440 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66   & BTCF_ValidOvf
2d450 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  l)==0 );.    rc 
2d460 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
2d470 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
2d480 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2d490 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
2d4a0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
2d4b0 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e     if( CURSOR_IN
2d4c0 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
2d4d0 61 74 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  ate ){.      *pR
2d4e0 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65  es = 1;.      re
2d4f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2d500 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43      }.    if( pC
2d510 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a  ur->skipNext ){.
2d520 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
2d530 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2d540 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  OR_VALID || pCur
2d550 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2d560 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20 20  _SKIPNEXT );.   
2d570 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
2d580 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
2d590 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
2d5a0 73 6b 69 70 4e 65 78 74 3e 30 20 29 7b 0a 20 20  skipNext>0 ){.  
2d5b0 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70        pCur->skip
2d5c0 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Next = 0;.      
2d5d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2d5e0 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
2d5f0 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
2d600 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
2d610 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
2d620 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2d630 61 67 65 5d 3b 0a 20 20 69 64 78 20 3d 20 2b 2b  age];.  idx = ++
2d640 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2d650 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65  ->iPage];.  asse
2d660 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
2d670 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  t );..  /* If th
2d680 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2d690 69 73 20 63 6f 72 72 75 70 74 2c 20 69 74 20 69  is corrupt, it i
2d6a0 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74  s possible for t
2d6b0 68 65 20 76 61 6c 75 65 20 6f 66 20 69 64 78 20  he value of idx 
2d6c0 0a 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76 61  .  ** to be inva
2d6d0 6c 69 64 20 68 65 72 65 2e 20 54 68 69 73 20 63  lid here. This c
2d6e0 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66  an only occur if
2d6f0 20 61 20 73 65 63 6f 6e 64 20 63 75 72 73 6f 72   a second cursor
2d700 20 6d 6f 64 69 66 69 65 73 0a 20 20 2a 2a 20 74   modifies.  ** t
2d710 68 65 20 70 61 67 65 20 77 68 69 6c 65 20 63 75  he page while cu
2d720 72 73 6f 72 20 70 43 75 72 20 69 73 20 68 6f 6c  rsor pCur is hol
2d730 64 69 6e 67 20 61 20 72 65 66 65 72 65 6e 63 65  ding a reference
2d740 20 74 6f 20 69 74 2e 20 57 68 69 63 68 20 63 61   to it. Which ca
2d750 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20 68 61 70 70  n.  ** only happ
2d760 65 6e 20 69 66 20 74 68 65 20 64 61 74 61 62 61  en if the databa
2d770 73 65 20 69 73 20 63 6f 72 72 75 70 74 20 69 6e  se is corrupt in
2d780 20 73 75 63 68 20 61 20 77 61 79 20 61 73 20 74   such a way as t
2d790 6f 20 6c 69 6e 6b 20 74 68 65 0a 20 20 2a 2a 20  o link the.  ** 
2d7a0 70 61 67 65 20 69 6e 74 6f 20 6d 6f 72 65 20 74  page into more t
2d7b0 68 61 6e 20 6f 6e 65 20 62 2d 74 72 65 65 20 73  han one b-tree s
2d7c0 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 74  tructure. */.  t
2d7d0 65 73 74 63 61 73 65 28 20 69 64 78 3e 70 50 61  estcase( idx>pPa
2d7e0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20  ge->nCell );..  
2d7f0 69 66 28 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e  if( idx>=pPage->
2d800 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28  nCell ){.    if(
2d810 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
2d820 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
2d830 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65  ToChild(pCur, ge
2d840 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
2d850 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
2d860 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20  ffset+8]));.    
2d870 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2d880 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75  n rc;.      retu
2d890 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  rn moveToLeftmos
2d8a0 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20  t(pCur);.    }. 
2d8b0 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66 28     do{.      if(
2d8c0 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20   pCur->iPage==0 
2d8d0 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73  ){.        *pRes
2d8e0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43   = 1;.        pC
2d8f0 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
2d900 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
2d910 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2d920 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
2d930 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e       moveToParen
2d940 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70  t(pCur);.      p
2d950 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
2d960 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2d970 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43  ;.    }while( pC
2d980 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2d990 69 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e  iPage]>=pPage->n
2d9a0 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66 28 20  Cell );.    if( 
2d9b0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
2d9c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71  .      return sq
2d9d0 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70  lite3BtreeNext(p
2d9e0 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20  Cur, pRes);.    
2d9f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
2da00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2da10 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
2da20 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2da30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2da40 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
2da50 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65   return moveToLe
2da60 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
2da70 7d 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  }.}.int sqlite3B
2da80 74 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f  treeNext(BtCurso
2da90 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
2daa0 65 73 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  es){.  MemPage *
2dab0 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28  pPage;.  assert(
2dac0 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
2dad0 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
2dae0 73 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29  ssert( pRes!=0 )
2daf0 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52 65  ;.  assert( *pRe
2db00 73 3d 3d 30 20 7c 7c 20 2a 70 52 65 73 3d 3d 31  s==0 || *pRes==1
2db10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2db20 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20  ur->skipNext==0 
2db30 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  || pCur->eState!
2db40 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
2db50 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
2db60 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
2db70 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42  >curFlags &= ~(B
2db80 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54  TCF_ValidNKey|BT
2db90 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20  CF_ValidOvfl);. 
2dba0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 69 66   *pRes = 0;.  if
2dbb0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  ( pCur->eState!=
2dbc0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 20 72  CURSOR_VALID ) r
2dbd0 65 74 75 72 6e 20 62 74 72 65 65 4e 65 78 74 28  eturn btreeNext(
2dbe0 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 70  pCur, pRes);.  p
2dbf0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
2dc00 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2dc10 3b 0a 20 20 69 66 28 20 28 2b 2b 70 43 75 72 2d  ;.  if( (++pCur-
2dc20 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2dc30 67 65 5d 29 3e 3d 70 50 61 67 65 2d 3e 6e 43 65  ge])>=pPage->nCe
2dc40 6c 6c 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  ll ){.    pCur->
2dc50 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2dc60 65 5d 2d 2d 3b 0a 20 20 20 20 72 65 74 75 72 6e  e]--;.    return
2dc70 20 62 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c   btreeNext(pCur,
2dc80 20 70 52 65 73 29 3b 0a 20 20 7d 0a 20 20 69 66   pRes);.  }.  if
2dc90 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
2dca0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2dcb0 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
2dcc0 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54      return moveT
2dcd0 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
2dce0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74  .  }.}../*.** St
2dcf0 65 70 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ep the cursor to
2dd00 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65   the back to the
2dd10 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20   previous entry 
2dd20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
2dd30 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66    If.** successf
2dd40 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  ul then set *pRe
2dd50 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72  s=0.  If the cur
2dd60 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61  sor.** was alrea
2dd70 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  dy pointing to t
2dd80 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
2dd90 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  n the database b
2dda0 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f  efore.** this ro
2ddb0 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
2ddc0 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  , then set *pRes
2ddd0 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  =1..**.** The ma
2dde0 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 69  in entry point i
2ddf0 73 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  s sqlite3BtreePr
2de00 65 76 69 6f 75 73 28 29 2e 20 20 54 68 61 74 20  evious().  That 
2de10 72 6f 75 74 69 6e 65 20 69 73 20 6f 70 74 69 6d  routine is optim
2de20 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20  ized.** for the 
2de30 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d  common case of m
2de40 65 72 65 6c 79 20 64 65 63 72 65 6d 65 6e 74 69  erely decrementi
2de50 6e 67 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e  ng the cell coun
2de60 74 65 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49  ter BtCursor.aiI
2de70 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20 70 72 65  dx.** to the pre
2de80 76 69 6f 75 73 20 63 65 6c 6c 20 6f 6e 20 74 68  vious cell on th
2de90 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20  e current page. 
2dea0 20 54 68 65 20 28 73 6c 6f 77 65 72 29 20 62 74   The (slower) bt
2deb0 72 65 65 50 72 65 76 69 6f 75 73 28 29 0a 2a 2a  reePrevious().**
2dec0 20 68 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20   helper routine 
2ded0 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69  is called when i
2dee0 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  t is necessary t
2def0 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66  o move to a diff
2df00 65 72 65 6e 74 20 70 61 67 65 0a 2a 2a 20 6f 72  erent page.** or
2df10 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
2df20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  cursor..**.** Th
2df30 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
2df40 6f 6e 20 77 69 6c 6c 20 73 65 74 20 2a 70 52 65  on will set *pRe
2df50 73 20 74 6f 20 30 20 6f 72 20 31 2e 20 20 54 68  s to 0 or 1.  Th
2df60 65 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20  e initial *pRes 
2df70 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65  value.** will be
2df80 20 31 20 69 66 20 74 68 65 20 63 75 72 73 6f 72   1 if the cursor
2df90 20 62 65 69 6e 67 20 73 74 65 70 70 65 64 20 63   being stepped c
2dfa0 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e  orresponds to an
2dfb0 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 0a 2a   SQL index and.*
2dfc0 2a 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  * if this routin
2dfd0 65 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65  e could have bee
2dfe0 6e 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 61  n skipped if tha
2dff0 74 20 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20  t SQL index had 
2e000 62 65 65 6e 0a 2a 2a 20 61 20 75 6e 69 71 75 65  been.** a unique
2e010 20 69 6e 64 65 78 2e 20 20 4f 74 68 65 72 77 69   index.  Otherwi
2e020 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  se the caller wi
2e030 6c 6c 20 68 61 76 65 20 73 65 74 20 2a 70 52 65  ll have set *pRe
2e040 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65  s to zero..** Ze
2e050 72 6f 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e  ro is the common
2e060 20 63 61 73 65 2e 20 54 68 65 20 62 74 72 65 65   case. The btree
2e070 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2e080 69 73 20 66 72 65 65 20 74 6f 20 75 73 65 20 74  is free to use t
2e090 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 2a 70  he.** initial *p
2e0a0 52 65 73 20 76 61 6c 75 65 20 61 73 20 61 20 68  Res value as a h
2e0b0 69 6e 74 20 74 6f 20 69 6d 70 72 6f 76 65 20 70  int to improve p
2e0c0 65 72 66 6f 72 6d 61 6e 63 65 2c 20 62 75 74 20  erformance, but 
2e0d0 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 53  the current.** S
2e0e0 51 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c  QLite btree impl
2e0f0 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20  ementation does 
2e100 6e 6f 74 2e 20 28 4e 6f 74 65 20 74 68 61 74 20  not. (Note that 
2e110 74 68 65 20 63 6f 6d 64 62 32 20 62 74 72 65 65  the comdb2 btree
2e120 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  .** implementati
2e130 6f 6e 20 64 6f 65 73 20 75 73 65 20 74 68 69 73  on does use this
2e140 20 68 69 6e 74 2c 20 68 6f 77 65 76 65 72 2e 29   hint, however.)
2e150 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
2e160 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62  E_NOINLINE int b
2e170 74 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43  treePrevious(BtC
2e180 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
2e190 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
2e1a0 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  c;.  MemPage *pP
2e1b0 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
2e1c0 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
2e1d0 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
2e1e0 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b  sert( pRes!=0 );
2e1f0 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52 65 73  .  assert( *pRes
2e200 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
2e210 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d   pCur->skipNext=
2e220 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  =0 || pCur->eSta
2e230 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2e240 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
2e250 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
2e260 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43  (BTCF_AtLast|BTC
2e270 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46  F_ValidOvfl|BTCF
2e280 5f 56 61 6c 69 64 4e 4b 65 79 29 29 3d 3d 30 20  _ValidNKey))==0 
2e290 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2e2a0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30  r->info.nSize==0
2e2b0 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
2e2c0 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2e2d0 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 63 20 3d  ALID ){.    rc =
2e2e0 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
2e2f0 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
2e300 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2e310 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
2e320 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
2e330 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
2e340 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
2e350 74 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  te ){.      *pRe
2e360 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74  s = 1;.      ret
2e370 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2e380 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75     }.    if( pCu
2e390 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20  r->skipNext ){. 
2e3a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
2e3b0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2e3c0 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  R_VALID || pCur-
2e3d0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2e3e0 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20 20 20  SKIPNEXT );.    
2e3f0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2e400 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
2e410 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73       if( pCur->s
2e420 6b 69 70 4e 65 78 74 3c 30 20 29 7b 0a 20 20 20  kipNext<0 ){.   
2e430 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e       pCur->skipN
2e440 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ext = 0;.       
2e450 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2e460 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
2e470 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
2e480 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
2e490 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
2e4a0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2e4b0 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ge];.  assert( p
2e4c0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
2e4d0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
2e4e0 61 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64  af ){.    int id
2e4f0 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  x = pCur->aiIdx[
2e500 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
2e510 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
2e520 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74  ld(pCur, get4byt
2e530 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  e(findCell(pPage
2e540 2c 20 69 64 78 29 29 29 3b 0a 20 20 20 20 69 66  , idx)));.    if
2e550 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2e560 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
2e570 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29  oRightmost(pCur)
2e580 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77  ;.  }else{.    w
2e590 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64  hile( pCur->aiId
2e5a0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d  x[pCur->iPage]==
2e5b0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
2e5c0 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b  Cur->iPage==0 ){
2e5d0 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65  .        pCur->e
2e5e0 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
2e5f0 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20  NVALID;.        
2e600 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
2e610 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2e620 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
2e630 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28     moveToParent(
2e640 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pCur);.    }.   
2e650 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2e660 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a  nfo.nSize==0 );.
2e670 20 20 20 20 61 73 73 65 72 74 28 20 28 70 43 75      assert( (pCu
2e680 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 28 42  r->curFlags & (B
2e690 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 29 3d  TCF_ValidOvfl))=
2e6a0 3d 30 20 29 3b 0a 0a 20 20 20 20 70 43 75 72 2d  =0 );..    pCur-
2e6b0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2e6c0 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65  ge]--;.    pPage
2e6d0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
2e6e0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
2e6f0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
2e700 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c  Key && !pPage->l
2e710 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20  eaf ){.      rc 
2e720 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  = sqlite3BtreePr
2e730 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65  evious(pCur, pRe
2e740 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  s);.    }else{. 
2e750 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2e760 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
2e770 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e   return rc;.}.in
2e780 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  t sqlite3BtreePr
2e790 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20  evious(BtCursor 
2e7a0 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
2e7b0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
2e7c0 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
2e7d0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2e7e0 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20  t( pRes!=0 );.  
2e7f0 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30  assert( *pRes==0
2e800 20 7c 7c 20 2a 70 52 65 73 3d 3d 31 20 29 3b 0a   || *pRes==1 );.
2e810 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2e820 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70  skipNext==0 || p
2e830 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
2e840 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 2a  SOR_VALID );.  *
2e850 70 52 65 73 20 3d 20 30 3b 0a 20 20 70 43 75 72  pRes = 0;.  pCur
2e860 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28  ->curFlags &= ~(
2e870 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46  BTCF_AtLast|BTCF
2e880 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f  _ValidOvfl|BTCF_
2e890 56 61 6c 69 64 4e 4b 65 79 29 3b 0a 20 20 70 43  ValidNKey);.  pC
2e8a0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
2e8b0 20 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   0;.  if( pCur->
2e8c0 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2e8d0 41 4c 49 44 0a 20 20 20 7c 7c 20 70 43 75 72 2d  ALID.   || pCur-
2e8e0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2e8f0 67 65 5d 3d 3d 30 0a 20 20 20 7c 7c 20 70 43 75  ge]==0.   || pCu
2e900 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2e910 69 50 61 67 65 5d 2d 3e 6c 65 61 66 3d 3d 30 0a  iPage]->leaf==0.
2e920 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
2e930 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43  btreePrevious(pC
2e940 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 7d 0a 20  ur, pRes);.  }. 
2e950 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2e960 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 72  r->iPage]--;.  r
2e970 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2e980 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
2e990 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 66 72  te a new page fr
2e9a0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
2e9b0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  file..**.** The 
2e9c0 6e 65 77 20 70 61 67 65 20 69 73 20 6d 61 72 6b  new page is mark
2e9d0 65 64 20 61 73 20 64 69 72 74 79 2e 20 20 28 49  ed as dirty.  (I
2e9e0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73  n other words, s
2e9f0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2ea00 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64  ().** has alread
2ea10 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e  y been called on
2ea20 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 29 20   the new page.) 
2ea30 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 68 61   The new page ha
2ea40 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72  s also.** been r
2ea50 65 66 65 72 65 6e 63 65 64 20 61 6e 64 20 74 68  eferenced and th
2ea60 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e  e calling routin
2ea70 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  e is responsible
2ea80 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   for calling.** 
2ea90 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
2eaa0 66 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 70  f() on the new p
2eab0 61 67 65 20 77 68 65 6e 20 69 74 20 69 73 20 64  age when it is d
2eac0 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  one..**.** SQLIT
2ead0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
2eae0 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 41 6e   on success.  An
2eaf0 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76  y other return v
2eb00 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73 0a 2a  alue indicates.*
2eb10 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70  * an error.  *pp
2eb20 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e  Page is set to N
2eb30 55 4c 4c 20 69 6e 20 74 68 65 20 65 76 65 6e 74  ULL in the event
2eb40 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a   of an error..**
2eb50 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65 61 72  .** If the "near
2eb60 62 79 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  by" parameter is
2eb70 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61 6e 20   not 0, then an 
2eb80 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74  effort is made t
2eb90 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70  o .** locate a p
2eba0 61 67 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65  age close to the
2ebb0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65   page number "ne
2ebc0 61 72 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e  arby".  This can
2ebd0 20 62 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a   be used in an.*
2ebe0 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65  * attempt to kee
2ebf0 70 20 72 65 6c 61 74 65 64 20 70 61 67 65 73 20  p related pages 
2ec00 63 6c 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74  close to each ot
2ec10 68 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62  her in the datab
2ec20 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69  ase file,.** whi
2ec30 63 68 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d  ch in turn can m
2ec40 61 6b 65 20 64 61 74 61 62 61 73 65 20 61 63 63  ake database acc
2ec50 65 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a  ess faster..**.*
2ec60 2a 20 49 66 20 74 68 65 20 65 4d 6f 64 65 20 70  * If the eMode p
2ec70 61 72 61 6d 65 74 65 72 20 69 73 20 42 54 41 4c  arameter is BTAL
2ec80 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64 20 74 68  LOC_EXACT and th
2ec90 65 20 6e 65 61 72 62 79 20 70 61 67 65 20 65 78  e nearby page ex
2eca0 69 73 74 73 0a 2a 2a 20 61 6e 79 77 68 65 72 65  ists.** anywhere
2ecb0 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
2ecc0 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67 75  t, then it is gu
2ecd0 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 72  aranteed to be r
2ece0 65 74 75 72 6e 65 64 2e 20 20 49 66 0a 2a 2a 20  eturned.  If.** 
2ecf0 65 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f 43  eMode is BTALLOC
2ed00 5f 4c 54 20 74 68 65 6e 20 74 68 65 20 70 61 67  _LT then the pag
2ed10 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20  e returned will 
2ed20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  be less than or 
2ed30 65 71 75 61 6c 0a 2a 2a 20 74 6f 20 6e 65 61 72  equal.** to near
2ed40 62 79 20 69 66 20 61 6e 79 20 73 75 63 68 20 70  by if any such p
2ed50 61 67 65 20 65 78 69 73 74 73 2e 20 20 49 66 20  age exists.  If 
2ed60 65 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f 43  eMode is BTALLOC
2ed70 5f 41 4e 59 20 74 68 65 6e 20 74 68 65 72 65 0a  _ANY then there.
2ed80 2a 2a 20 61 72 65 20 6e 6f 20 72 65 73 74 72 69  ** are no restri
2ed90 63 74 69 6f 6e 73 20 6f 6e 20 77 68 69 63 68 20  ctions on which 
2eda0 70 61 67 65 20 69 73 20 72 65 74 75 72 6e 65 64  page is returned
2edb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2edc0 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
2edd0 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
2ede0 42 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  Bt,         /* T
2edf0 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 4d 65  he btree */.  Me
2ee00 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
2ee10 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 70 6f       /* Store po
2ee20 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 6c 6c  inter to the all
2ee30 6f 63 61 74 65 64 20 70 61 67 65 20 68 65 72 65  ocated page here
2ee40 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e   */.  Pgno *pPgn
2ee50 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o,           /* 
2ee60 53 74 6f 72 65 20 74 68 65 20 70 61 67 65 20 6e  Store the page n
2ee70 75 6d 62 65 72 20 68 65 72 65 20 2a 2f 0a 20 20  umber here */.  
2ee80 50 67 6e 6f 20 6e 65 61 72 62 79 2c 20 20 20 20  Pgno nearby,    
2ee90 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68         /* Search
2eea0 20 66 6f 72 20 61 20 70 61 67 65 20 6e 65 61 72   for a page near
2eeb0 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 75   this one */.  u
2eec0 38 20 65 4d 6f 64 65 20 20 20 20 20 20 20 20 20  8 eMode         
2eed0 20 20 20 20 20 20 2f 2a 20 42 54 41 4c 4c 4f 43        /* BTALLOC
2eee0 5f 45 58 41 43 54 2c 20 42 54 41 4c 4c 4f 43 5f  _EXACT, BTALLOC_
2eef0 4c 54 2c 20 6f 72 20 42 54 41 4c 4c 4f 43 5f 41  LT, or BTALLOC_A
2ef00 4e 59 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61  NY */.){.  MemPa
2ef10 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e  ge *pPage1;.  in
2ef20 74 20 72 63 3b 0a 20 20 75 33 32 20 6e 3b 20 20  t rc;.  u32 n;  
2ef30 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2ef40 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
2ef50 65 6c 69 73 74 20 2a 2f 0a 20 20 75 33 32 20 6b  elist */.  u32 k
2ef60 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
2ef70 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 65  of leaves on the
2ef80 20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20 66 72   trunk of the fr
2ef90 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50  eelist */.  MemP
2efa0 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b  age *pTrunk = 0;
2efb0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 72 65  .  MemPage *pPre
2efc0 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 50 67  vTrunk = 0;.  Pg
2efd0 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20 20 20 2f  no mxPage;     /
2efe0 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20  * Total size of 
2eff0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2f000 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
2f010 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2f020 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
2f030 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64  ;.  assert( eMod
2f040 65 3d 3d 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 7c  e==BTALLOC_ANY |
2f050 7c 20 28 6e 65 61 72 62 79 3e 30 20 26 26 20 49  | (nearby>0 && I
2f060 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e  fNotOmitAV(pBt->
2f070 61 75 74 6f 56 61 63 75 75 6d 29 29 20 29 3b 0a  autoVacuum)) );.
2f080 20 20 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e    pPage1 = pBt->
2f090 70 50 61 67 65 31 3b 0a 20 20 6d 78 50 61 67 65  pPage1;.  mxPage
2f0a0 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e   = btreePagecoun
2f0b0 74 28 70 42 74 29 3b 0a 20 20 2f 2a 20 45 56 49  t(pBt);.  /* EVI
2f0c0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 35 31 31  DENCE-OF: R-0511
2f0d0 39 2d 30 32 36 33 37 20 54 68 65 20 34 2d 62 79  9-02637 The 4-by
2f0e0 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
2f0f0 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20  teger at offset 
2f100 33 36 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 73  36.  ** stores s
2f110 74 6f 72 65 73 20 74 68 65 20 74 6f 74 61 6c 20  tores the total 
2f120 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
2f130 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  on the freelist.
2f140 20 2a 2f 0a 20 20 6e 20 3d 20 67 65 74 34 62 79   */.  n = get4by
2f150 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
2f160 61 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74 63 61  a[36]);.  testca
2f170 73 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20  se( n==mxPage-1 
2f180 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61  );.  if( n>=mxPa
2f190 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ge ){.    return
2f1a0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2f1b0 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20  BKPT;.  }.  if( 
2f1c0 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  n>0 ){.    /* Th
2f1d0 65 72 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e  ere are pages on
2f1e0 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
2f1f0 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f  Reuse one of tho
2f200 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20  se pages. */.   
2f210 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20   Pgno iTrunk;.  
2f220 20 20 75 38 20 73 65 61 72 63 68 4c 69 73 74 20    u8 searchList 
2f230 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66  = 0; /* If the f
2f240 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65  ree-list must be
2f250 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e   searched for 'n
2f260 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 75 33  earby' */.    u3
2f270 32 20 6e 53 65 61 72 63 68 20 3d 20 30 3b 20 20  2 nSearch = 0;  
2f280 20 2f 2a 20 43 6f 75 6e 74 20 6f 66 20 74 68 65   /* Count of the
2f290 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 61 72 63   number of searc
2f2a0 68 20 61 74 74 65 6d 70 74 73 20 2a 2f 0a 20 20  h attempts */.  
2f2b0 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 65 4d 6f    .    /* If eMo
2f2c0 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43  de==BTALLOC_EXAC
2f2d0 54 20 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66  T and a query of
2f2e0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
2f2f0 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68  .    ** shows th
2f300 61 74 20 74 68 65 20 70 61 67 65 20 27 6e 65 61  at the page 'nea
2f310 72 62 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72  rby' is somewher
2f320 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e on the free-li
2f330 73 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  st, then.    ** 
2f340 74 68 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20  the entire-list 
2f350 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64  will be searched
2f360 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a   for that page..
2f370 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53      */.#ifndef S
2f380 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
2f390 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 65 4d  ACUUM.    if( eM
2f3a0 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41  ode==BTALLOC_EXA
2f3b0 43 54 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  CT ){.      if( 
2f3c0 6e 65 61 72 62 79 3c 3d 6d 78 50 61 67 65 20 29  nearby<=mxPage )
2f3d0 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65 54 79  {.        u8 eTy
2f3e0 70 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  pe;.        asse
2f3f0 72 74 28 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a  rt( nearby>0 );.
2f400 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2f410 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
2f420 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2f430 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e  ptrmapGet(pBt, n
2f440 65 61 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30  earby, &eType, 0
2f450 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2f460 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
2f470 20 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65         if( eType
2f480 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  ==PTRMAP_FREEPAG
2f490 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  E ){.          s
2f4a0 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20  earchList = 1;. 
2f4b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2f4c0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65  .    }else if( e
2f4d0 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45  Mode==BTALLOC_LE
2f4e0 20 29 7b 0a 20 20 20 20 20 20 73 65 61 72 63 68   ){.      search
2f4f0 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  List = 1;.    }.
2f500 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44  #endif..    /* D
2f510 65 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65  ecrement the fre
2f520 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20  e-list count by 
2f530 31 2e 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f  1. Set iTrunk to
2f540 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
2f550 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66  e.    ** first f
2f560 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
2f570 61 67 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20  age. iPrevTrunk 
2f580 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a  is initially 1..
2f590 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
2f5a0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2f5b0 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
2f5c0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
2f5d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2f5e0 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
2f5f0 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31  ->aData[36], n-1
2f600 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63  );..    /* The c
2f610 6f 64 65 20 77 69 74 68 69 6e 20 74 68 69 73 20  ode within this 
2f620 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79  loop is run only
2f630 20 6f 6e 63 65 20 69 66 20 74 68 65 20 27 73 65   once if the 'se
2f640 61 72 63 68 4c 69 73 74 27 20 76 61 72 69 61 62  archList' variab
2f650 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  le.    ** is not
2f660 20 74 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65   true. Otherwise
2f670 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63 65 20 66  , it runs once f
2f680 6f 72 20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61  or each trunk-pa
2f690 67 65 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ge on the.    **
2f6a0 20 66 72 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c   free-list until
2f6b0 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62   the page 'nearb
2f6c0 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65  y' is located (e
2f6d0 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58  Mode==BTALLOC_EX
2f6e0 41 43 54 29 0a 20 20 20 20 2a 2a 20 6f 72 20 75  ACT).    ** or u
2f6f0 6e 74 69 6c 20 61 20 70 61 67 65 20 6c 65 73 73  ntil a page less
2f700 20 74 68 61 6e 20 27 6e 65 61 72 62 79 27 20 69   than 'nearby' i
2f710 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65  s located (eMode
2f720 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 54 29 0a 20 20  ==BTALLOC_LT).  
2f730 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20    */.    do {.  
2f740 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d      pPrevTrunk =
2f750 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69   pTrunk;.      i
2f760 66 28 20 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  f( pPrevTrunk ){
2f770 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44  .        /* EVID
2f780 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 35 30 36  ENCE-OF: R-01506
2f790 2d 31 31 30 35 33 20 54 68 65 20 66 69 72 73 74  -11053 The first
2f7a0 20 69 6e 74 65 67 65 72 20 6f 6e 20 61 20 66 72   integer on a fr
2f7b0 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
2f7c0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  e.        ** is 
2f7d0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
2f7e0 6f 66 20 74 68 65 20 6e 65 78 74 20 66 72 65 65  of the next free
2f7f0 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  list trunk page 
2f800 69 6e 20 74 68 65 20 6c 69 73 74 20 6f 72 0a 20  in the list or. 
2f810 20 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 69         ** zero i
2f820 66 20 74 68 69 73 20 69 73 20 74 68 65 20 6c 61  f this is the la
2f830 73 74 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e  st freelist trun
2f840 6b 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20  k page. */.     
2f850 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
2f860 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b  byte(&pPrevTrunk
2f870 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20  ->aData[0]);.   
2f880 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2f890 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
2f8a0 3a 20 52 2d 35 39 38 34 31 2d 31 33 37 39 38 20  : R-59841-13798 
2f8b0 54 68 65 20 34 2d 62 79 74 65 20 62 69 67 2d 65  The 4-byte big-e
2f8c0 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 61 74  ndian integer at
2f8d0 20 6f 66 66 73 65 74 20 33 32 0a 20 20 20 20 20   offset 32.     
2f8e0 20 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65     ** stores the
2f8f0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
2f900 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
2f910 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20  f the freelist, 
2f920 6f 72 20 7a 65 72 6f 20 69 66 0a 20 20 20 20 20  or zero if.     
2f930 20 20 20 2a 2a 20 74 68 65 20 66 72 65 65 6c 69     ** the freeli
2f940 73 74 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a  st is empty. */.
2f950 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d          iTrunk =
2f960 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
2f970 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20  1->aData[32]);. 
2f980 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73       }.      tes
2f990 74 63 61 73 65 28 20 69 54 72 75 6e 6b 3d 3d 6d  tcase( iTrunk==m
2f9a0 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 69  xPage );.      i
2f9b0 66 28 20 69 54 72 75 6e 6b 3e 6d 78 50 61 67 65  f( iTrunk>mxPage
2f9c0 20 7c 7c 20 6e 53 65 61 72 63 68 2b 2b 20 3e 20   || nSearch++ > 
2f9d0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  n ){.        rc 
2f9e0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
2f9f0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c  _BKPT;.      }el
2fa00 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
2fa10 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50   btreeGetUnusedP
2fa20 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c  age(pBt, iTrunk,
2fa30 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20   &pTrunk, 0);.  
2fa40 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2fa50 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54  rc ){.        pT
2fa60 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
2fa70 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
2fa80 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
2fa90 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
2faa0 70 54 72 75 6e 6b 21 3d 30 20 29 3b 0a 20 20 20  pTrunk!=0 );.   
2fab0 20 20 20 61 73 73 65 72 74 28 20 70 54 72 75 6e     assert( pTrun
2fac0 6b 2d 3e 61 44 61 74 61 21 3d 30 20 29 3b 0a 20  k->aData!=0 );. 
2fad0 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
2fae0 2d 4f 46 3a 20 52 2d 31 33 35 32 33 2d 30 34 33  -OF: R-13523-043
2faf0 39 34 20 54 68 65 20 73 65 63 6f 6e 64 20 69 6e  94 The second in
2fb00 74 65 67 65 72 20 6f 6e 20 61 20 66 72 65 65 6c  teger on a freel
2fb10 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20  ist trunk page. 
2fb20 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 6e       ** is the n
2fb30 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61  umber of leaf pa
2fb40 67 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66  ge pointers to f
2fb50 6f 6c 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20  ollow. */.      
2fb60 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  k = get4byte(&pT
2fb70 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b  runk->aData[4]);
2fb80 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20  .      if( k==0 
2fb90 26 26 20 21 73 65 61 72 63 68 4c 69 73 74 20 29  && !searchList )
2fba0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
2fbb0 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65   trunk has no le
2fbc0 61 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73  aves and the lis
2fbd0 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73  t is not being s
2fbe0 65 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20  earched. .      
2fbf0 20 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20    ** So extract 
2fc00 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
2fc10 74 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74  tself and use it
2fc20 20 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20   as the newly . 
2fc30 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61         ** alloca
2fc40 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ted page */.    
2fc50 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 65      assert( pPre
2fc60 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20  vTrunk==0 );.   
2fc70 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2fc80 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
2fc90 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
2fca0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
2fcb0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
2fcc0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
2fcd0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2fce0 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72      *pPgno = iTr
2fcf0 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  unk;.        mem
2fd00 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61  cpy(&pPage1->aDa
2fd10 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d  ta[32], &pTrunk-
2fd20 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
2fd30 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
2fd40 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   pTrunk;.       
2fd50 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
2fd60 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
2fd70 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20  OCATE: %d trunk 
2fd80 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20  - %d free pages 
2fd90 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c  left\n", *pPgno,
2fda0 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65   n-1));.      }e
2fdb0 6c 73 65 20 69 66 28 20 6b 3e 28 75 33 32 29 28  lse if( k>(u32)(
2fdc0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
2fdd0 34 20 2d 20 32 29 20 29 7b 0a 20 20 20 20 20 20  4 - 2) ){.      
2fde0 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20    /* Value of k 
2fdf0 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  is out of range.
2fe00 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75    Database corru
2fe10 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ption */.       
2fe20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
2fe30 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
2fe40 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
2fe50 63 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64  cate_page;.#ifnd
2fe60 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2fe70 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
2fe80 7d 65 6c 73 65 20 69 66 28 20 73 65 61 72 63 68  }else if( search
2fe90 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20 20 20  List .          
2fea0 20 20 26 26 20 28 6e 65 61 72 62 79 3d 3d 69 54    && (nearby==iT
2feb0 72 75 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c  runk || (iTrunk<
2fec0 6e 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d  nearby && eMode=
2fed0 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20  =BTALLOC_LE)) . 
2fee0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2fef0 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 62  /* The list is b
2ff00 65 69 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e  eing searched an
2ff10 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67  d this trunk pag
2ff20 65 20 69 73 20 74 68 65 20 70 61 67 65 0a 20 20  e is the page.  
2ff30 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f        ** to allo
2ff40 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73  cate, regardless
2ff50 20 6f 66 20 77 68 65 74 68 65 72 20 69 74 20 68   of whether it h
2ff60 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20  as leaves..     
2ff70 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70     */.        *p
2ff80 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20  Pgno = iTrunk;. 
2ff90 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
2ffa0 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   pTrunk;.       
2ffb0 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
2ffc0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
2ffd0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2ffe0 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
2fff0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
30000 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
30010 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
30020 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
30030 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30          if( k==0
30040 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
30050 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  ( !pPrevTrunk ){
30060 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
30070 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61  cpy(&pPage1->aDa
30080 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d  ta[32], &pTrunk-
30090 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
300a0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
300b0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
300c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
300d0 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70  te(pPrevTrunk->p
300e0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
300f0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
30100 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
30110 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
30120 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
30130 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
30140 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
30150 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
30160 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[0], &pTrunk-
30170 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
30180 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
30190 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
301a0 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b      /* The trunk
301b0 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65   page is require
301c0 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
301d0 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  but it contains 
301e0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  .          ** po
301f0 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c  inters to free-l
30200 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20  ist leaves. The 
30210 66 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d  first leaf becom
30220 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20  es a trunk.     
30230 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20       ** page in 
30240 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20  this case..     
30250 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
30260 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54    MemPage *pNewT
30270 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  runk;.          
30280 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d  Pgno iNewTrunk =
30290 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
302a0 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20  k->aData[8]);.  
302b0 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77          if( iNew
302c0 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20  Trunk>mxPage ){ 
302d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
302e0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
302f0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
30300 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
30310 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
30320 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
30330 20 74 65 73 74 63 61 73 65 28 20 69 4e 65 77 54   testcase( iNewT
30340 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a  runk==mxPage );.
30350 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62            rc = b
30360 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67  treeGetUnusedPag
30370 65 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b  e(pBt, iNewTrunk
30380 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29  , &pNewTrunk, 0)
30390 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
303a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
303b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
303c0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
303d0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
303e0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
303f0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
30400 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62  e(pNewTrunk->pDb
30410 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
30420 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
30430 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
30440 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
30450 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
30460 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
30470 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
30480 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30490 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
304a0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
304b0 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
304c0 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
304d0 20 20 70 75 74 34 62 79 74 65 28 26 70 4e 65 77    put4byte(&pNew
304e0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c  Trunk->aData[4],
304f0 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20   k-1);.         
30500 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75   memcpy(&pNewTru
30510 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70  nk->aData[8], &p
30520 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d  Trunk->aData[12]
30530 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20  , (k-1)*4);.    
30540 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
30550 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  e(pNewTrunk);.  
30560 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72          if( !pPr
30570 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
30580 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
30590 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
305a0 74 65 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70  teable(pPage1->p
305b0 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20  DbPage) );.     
305c0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
305d0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
305e0 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a  2], iNewTrunk);.
305f0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
30600 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
30610 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
30620 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e  ite(pPrevTrunk->
30630 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
30640 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
30650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f                go
30660 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
30670 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
30680 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
30690 70 75 74 34 62 79 74 65 28 26 70 50 72 65 76 54  put4byte(&pPrevT
306a0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
306b0 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  iNewTrunk);.    
306c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
306d0 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  }.        pTrunk
306e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52   = 0;.        TR
306f0 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
30700 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72  %d trunk - %d fr
30710 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22  ee pages left\n"
30720 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b  , *pPgno, n-1));
30730 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65  .#endif.      }e
30740 6c 73 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20  lse if( k>0 ){. 
30750 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63         /* Extrac
30760 74 20 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68  t a leaf from th
30770 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20  e trunk */.     
30780 20 20 20 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a     u32 closest;.
30790 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61          Pgno iPa
307a0 67 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69  ge;.        unsi
307b0 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74 61  gned char *aData
307c0 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61   = pTrunk->aData
307d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65  ;.        if( ne
307e0 61 72 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20  arby>0 ){.      
307f0 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20      u32 i;.     
30800 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30       closest = 0
30810 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
30820 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c  eMode==BTALLOC_L
30830 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  E ){.           
30840 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69   for(i=0; i<k; i
30850 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
30860 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62     iPage = get4b
30870 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34  yte(&aData[8+i*4
30880 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]);.            
30890 20 20 69 66 28 20 69 50 61 67 65 3c 3d 6e 65 61    if( iPage<=nea
308a0 72 62 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rby ){.         
308b0 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
308c0 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   i;.            
308d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
308e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
308f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
30900 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30910 20 20 20 20 20 20 69 6e 74 20 64 69 73 74 3b 0a        int dist;.
30920 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74              dist
30930 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74   = sqlite3AbsInt
30940 33 32 28 67 65 74 34 62 79 74 65 28 26 61 44 61  32(get4byte(&aDa
30950 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 29  ta[8]) - nearby)
30960 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
30970 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29  r(i=1; i<k; i++)
30980 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
30990 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33  int d2 = sqlite3
309a0 41 62 73 49 6e 74 33 32 28 67 65 74 34 62 79 74  AbsInt32(get4byt
309b0 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29  e(&aData[8+i*4])
309c0 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20   - nearby);.    
309d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32            if( d2
309e0 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  <dist ){.       
309f0 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
30a00 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20   = i;.          
30a10 20 20 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b        dist = d2;
30a20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
30a30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
30a40 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
30a50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30a60 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b      closest = 0;
30a70 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
30a80 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34      iPage = get4
30a90 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c  byte(&aData[8+cl
30aa0 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20  osest*4]);.     
30ab0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61     testcase( iPa
30ac0 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  ge==mxPage );.  
30ad0 20 20 20 20 20 20 69 66 28 20 69 50 61 67 65 3e        if( iPage>
30ae0 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  mxPage ){.      
30af0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
30b00 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
30b10 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
30b20 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
30b30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30b40 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61 67    testcase( iPag
30b50 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  e==mxPage );.   
30b60 20 20 20 20 20 69 66 28 20 21 73 65 61 72 63 68       if( !search
30b70 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20 20 7c  List .         |
30b80 7c 20 28 69 50 61 67 65 3d 3d 6e 65 61 72 62 79  | (iPage==nearby
30b90 20 7c 7c 20 28 69 50 61 67 65 3c 6e 65 61 72 62   || (iPage<nearb
30ba0 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c  y && eMode==BTAL
30bb0 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20  LOC_LE)) .      
30bc0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69    ){.          i
30bd0 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20  nt noContent;.  
30be0 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d          *pPgno =
30bf0 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20   iPage;.        
30c00 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
30c10 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20  TE: %d was leaf 
30c20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e  %d of %d on trun
30c30 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20 20 20  k %d".          
30c40 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72         ": %d mor
30c50 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c  e free pages\n",
30c60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
30c70 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73    *pPgno, closes
30c80 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e  t+1, k, pTrunk->
30c90 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20  pgno, n-1));.   
30ca0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
30cb0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
30cc0 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
30cd0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
30ce0 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f   ) goto end_allo
30cf0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
30d00 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74       if( closest
30d10 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  <k-1 ){.        
30d20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74      memcpy(&aDat
30d30 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20  a[8+closest*4], 
30d40 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34  &aData[4+k*4], 4
30d50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
30d60 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
30d70 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31  e(&aData[4], k-1
30d80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43  );.          noC
30d90 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47  ontent = !btreeG
30da0 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  etHasContent(pBt
30db0 2c 20 2a 70 50 67 6e 6f 29 3f 20 50 41 47 45 52  , *pPgno)? PAGER
30dc0 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a  _GET_NOCONTENT :
30dd0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   0;.          rc
30de0 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65   = btreeGetUnuse
30df0 64 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e  dPage(pBt, *pPgn
30e00 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e  o, ppPage, noCon
30e10 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20  tent);.         
30e20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
30e30 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
30e40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
30e50 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67  gerWrite((*ppPag
30e60 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e)->pDbPage);.  
30e70 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
30e80 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
30e90 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c               rel
30ea0 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
30eb0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
30ec0 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
30ed0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
30ee0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30ef0 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30    searchList = 0
30f00 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
30f10 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73    }.      releas
30f20 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b  ePage(pPrevTrunk
30f30 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72  );.      pPrevTr
30f40 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68  unk = 0;.    }wh
30f50 69 6c 65 28 20 73 65 61 72 63 68 4c 69 73 74 20  ile( searchList 
30f60 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
30f70 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20  /* There are no 
30f80 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
30f90 65 6c 69 73 74 2c 20 73 6f 20 61 70 70 65 6e 64  elist, so append
30fa0 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74   a new page to t
30fb0 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
30fc0 73 65 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a  se image..    **
30fd0 0a 20 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79  .    ** Normally
30fe0 2c 20 6e 65 77 20 70 61 67 65 73 20 61 6c 6c 6f  , new pages allo
30ff0 63 61 74 65 64 20 62 79 20 74 68 69 73 20 62 6c  cated by this bl
31000 6f 63 6b 20 63 61 6e 20 62 65 20 72 65 71 75 65  ock can be reque
31010 73 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 20 20  sted from the.  
31020 20 20 2a 2a 20 70 61 67 65 72 20 6c 61 79 65 72    ** pager layer
31030 20 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f   with the 'no-co
31040 6e 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e  ntent' flag set.
31050 20 54 68 69 73 20 70 72 65 76 65 6e 74 73 20 74   This prevents t
31060 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20  he pager.    ** 
31070 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 72  from trying to r
31080 65 61 64 20 74 68 65 20 70 61 67 65 73 20 63 6f  ead the pages co
31090 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 2e  ntent from disk.
310a0 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65   However, if the
310b0 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  .    ** current 
310c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
310d0 61 6c 72 65 61 64 79 20 72 75 6e 20 6f 6e 65 20  already run one 
310e0 6f 72 20 6d 6f 72 65 20 69 6e 63 72 65 6d 65 6e  or more incremen
310f0 74 61 6c 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a  tal-vacuum.    *
31100 2a 20 73 74 65 70 73 2c 20 74 68 65 6e 20 74 68  * steps, then th
31110 65 20 70 61 67 65 20 77 65 20 61 72 65 20 61 62  e page we are ab
31120 6f 75 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  out to allocate 
31130 6d 61 79 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74  may contain cont
31140 65 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  ent.    ** that 
31150 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 74  is required in t
31160 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f  he event of a ro
31170 6c 6c 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20  llback. In this 
31180 63 61 73 65 2c 20 64 6f 0a 20 20 20 20 2a 2a 20  case, do.    ** 
31190 6e 6f 74 20 73 65 74 20 74 68 65 20 6e 6f 2d 63  not set the no-c
311a0 6f 6e 74 65 6e 74 20 66 6c 61 67 2e 20 54 68 69  ontent flag. Thi
311b0 73 20 63 61 75 73 65 73 20 74 68 65 20 70 61 67  s causes the pag
311c0 65 72 20 74 6f 20 6c 6f 61 64 20 61 6e 64 20 6a  er to load and j
311d0 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 74 68  ournal.    ** th
311e0 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 63  e current page c
311f0 6f 6e 74 65 6e 74 20 62 65 66 6f 72 65 20 6f 76  ontent before ov
31200 65 72 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20  erwriting it..  
31210 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65    **.    ** Note
31220 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
31230 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c  will not actuall
31240 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61  y attempt to loa
31250 64 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a 20 20  d or journal .  
31260 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 6f 72    ** content for
31270 20 61 6e 79 20 70 61 67 65 20 74 68 61 74 20 72   any page that r
31280 65 61 6c 6c 79 20 64 6f 65 73 20 6c 69 65 20 70  eally does lie p
31290 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
312a0 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
312b0 2a 2a 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  ** file on disk.
312c0 20 53 6f 20 74 68 65 20 65 66 66 65 63 74 73 20   So the effects 
312d0 6f 66 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65  of disabling the
312e0 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70 74 69   no-content opti
312f0 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  mization.    ** 
31300 68 65 72 65 20 61 72 65 20 63 6f 6e 66 69 6e 65  here are confine
31310 64 20 74 6f 20 74 68 6f 73 65 20 70 61 67 65 73  d to those pages
31320 20 74 68 61 74 20 6c 69 65 20 62 65 74 77 65 65   that lie betwee
31330 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  n the end of the
31340 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
31350 20 69 6d 61 67 65 20 61 6e 64 20 74 68 65 20 65   image and the e
31360 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  nd of the databa
31370 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
31380 20 20 20 20 69 6e 74 20 62 4e 6f 43 6f 6e 74 65      int bNoConte
31390 6e 74 20 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f 6d  nt = (0==IfNotOm
313a0 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75  itAV(pBt->bDoTru
313b0 6e 63 61 74 65 29 29 3f 20 50 41 47 45 52 5f 47  ncate))? PAGER_G
313c0 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 3a 30 3b 0a  ET_NOCONTENT:0;.
313d0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
313e0 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d  3PagerWrite(pBt-
313f0 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  >pPage1->pDbPage
31400 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
31410 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
31420 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20  Bt->nPage++;.   
31430 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d   if( pBt->nPage=
31440 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
31450 47 45 28 70 42 74 29 20 29 20 70 42 74 2d 3e 6e  GE(pBt) ) pBt->n
31460 50 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66  Page++;..#ifndef
31470 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
31480 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
31490 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
314a0 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  && PTRMAP_ISPAGE
314b0 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65  (pBt, pBt->nPage
314c0 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  ) ){.      /* If
314d0 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74   *pPgno refers t
314e0 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  o a pointer-map 
314f0 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74  page, allocate t
31500 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20  wo new pages.   
31510 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64     ** at the end
31520 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73   of the file ins
31530 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65  tead of one. The
31540 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64   first allocated
31550 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62   page.      ** b
31560 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69  ecomes a new poi
31570 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74  nter-map page, t
31580 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65  he second is use
31590 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  d by the caller.
315a0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
315b0 4d 65 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30  MemPage *pPg = 0
315c0 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  ;.      TRACE(("
315d0 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f  ALLOCATE: %d fro
315e0 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70  m end of file (p
315f0 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29  ointer-map page)
31600 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  \n", pBt->nPage)
31610 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
31620 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45 4e   pBt->nPage!=PEN
31630 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
31640 42 74 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20  Bt) );.      rc 
31650 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64  = btreeGetUnused
31660 50 61 67 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e  Page(pBt, pBt->n
31670 50 61 67 65 2c 20 26 70 50 67 2c 20 62 4e 6f 43  Page, &pPg, bNoC
31680 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 69  ontent);.      i
31690 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
316a0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
316b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
316c0 74 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29  te(pPg->pDbPage)
316d0 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
316e0 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  ePage(pPg);.    
316f0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
31700 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
31710 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b      pBt->nPage++
31720 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  ;.      if( pBt-
31730 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f  >nPage==PENDING_
31740 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
31750 7b 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20  { pBt->nPage++; 
31760 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
31770 20 20 20 70 75 74 34 62 79 74 65 28 32 38 20 2b     put4byte(28 +
31780 20 28 75 38 2a 29 70 42 74 2d 3e 70 50 61 67 65   (u8*)pBt->pPage
31790 31 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 6e  1->aData, pBt->n
317a0 50 61 67 65 29 3b 0a 20 20 20 20 2a 70 50 67 6e  Page);.    *pPgn
317b0 6f 20 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a  o = pBt->nPage;.
317c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50  .    assert( *pP
317d0 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno!=PENDING_BYT
317e0 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20  E_PAGE(pBt) );. 
317f0 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
31800 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20  UnusedPage(pBt, 
31810 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  *pPgno, ppPage, 
31820 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20  bNoContent);.   
31830 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
31840 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71   rc;.    rc = sq
31850 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
31860 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
31870 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
31880 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
31890 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
318a0 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  *ppPage);.      
318b0 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  *ppPage = 0;.   
318c0 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22 41   }.    TRACE(("A
318d0 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d  LLOCATE: %d from
318e0 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c   end of file\n",
318f0 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a   *pPgno));.  }..
31900 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f    assert( *pPgno
31910 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
31920 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64  AGE(pBt) );..end
31930 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a  _allocate_page:.
31940 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
31950 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65  runk);.  release
31960 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29  Page(pPrevTrunk)
31970 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
31980 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c  SQLITE_OK || sql
31990 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
319a0 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d  count((*ppPage)-
319b0 3e 70 44 62 50 61 67 65 29 3c 3d 31 20 29 3b 0a  >pDbPage)<=1 );.
319c0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
319d0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 2a 70 70 50  LITE_OK || (*ppP
319e0 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20  age)->isInit==0 
319f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
31a00 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
31a10 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
31a20 6f 20 61 64 64 20 70 61 67 65 20 69 50 61 67 65  o add page iPage
31a30 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
31a40 20 66 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e   file free-list.
31a50 20 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d   .** It is assum
31a60 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ed that the page
31a70 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
31a80 61 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 72  a part of the fr
31a90 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  ee-list..**.** T
31aa0 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  he value passed 
31ab0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
31ac0 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
31ad0 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f  unction is optio
31ae0 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63  nal..** If the c
31af0 61 6c 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f  aller happens to
31b00 20 68 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20   have a pointer 
31b10 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f  to the MemPage o
31b20 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73  bject .** corres
31b30 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20  ponding to page 
31b40 69 50 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20  iPage handy, it 
31b50 6d 61 79 20 70 61 73 73 20 69 74 20 61 73 20 74  may pass it as t
31b60 68 65 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e  he second value.
31b70 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20   .** Otherwise, 
31b80 69 74 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c  it may pass NULL
31b90 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69  ..**.** If a poi
31ba0 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67  nter to a MemPag
31bb0 65 20 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73  e object is pass
31bc0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
31bd0 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74   argument,.** it
31be0 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  s reference coun
31bf0 74 20 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64  t is not altered
31c00 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
31c10 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
31c20 20 66 72 65 65 50 61 67 65 32 28 42 74 53 68 61   freePage2(BtSha
31c30 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67  red *pBt, MemPag
31c40 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e  e *pMemPage, Pgn
31c50 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50  o iPage){.  MemP
31c60 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b  age *pTrunk = 0;
31c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c80 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75  /* Free-list tru
31c90 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e  nk page */.  Pgn
31ca0 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20  o iTrunk = 0;   
31cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31cc0 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
31cd0 6f 66 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  of free-list tru
31ce0 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65  nk page */ .  Me
31cf0 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20  mPage *pPage1 = 
31d00 70 42 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20  pBt->pPage1;    
31d10 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72    /* Local refer
31d20 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a  ence to page 1 *
31d30 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
31d40 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
31d50 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
31d60 62 65 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79  being freed. May
31d70 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69   be NULL. */.  i
31d80 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
31d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31da0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
31db0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65  e */.  int nFree
31dc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
31dd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
31de0 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  itial number of 
31df0 70 61 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69  pages on free-li
31e00 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  st */..  assert(
31e10 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
31e20 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
31e30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  );.  assert( COR
31e40 52 55 50 54 5f 44 42 20 7c 7c 20 69 50 61 67 65  RUPT_DB || iPage
31e50 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >1 );.  assert( 
31e60 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65  !pMemPage || pMe
31e70 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61  mPage->pgno==iPa
31e80 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 69 50 61  ge );..  if( iPa
31e90 67 65 3c 32 20 29 20 72 65 74 75 72 6e 20 53 51  ge<2 ) return SQ
31ea0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
31eb0 54 3b 0a 20 20 69 66 28 20 70 4d 65 6d 50 61 67  T;.  if( pMemPag
31ec0 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 20 3d  e ){.    pPage =
31ed0 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20 73   pMemPage;.    s
31ee0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70  qlite3PagerRef(p
31ef0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
31f00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
31f10 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f  ge = btreePageLo
31f20 6f 6b 75 70 28 70 42 74 2c 20 69 50 61 67 65 29  okup(pBt, iPage)
31f30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72  ;.  }..  /* Incr
31f40 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 20 70  ement the free p
31f50 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61  age count on pPa
31f60 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ge1 */.  rc = sq
31f70 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
31f80 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
31f90 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
31fa0 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
31fb0 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79    nFree = get4by
31fc0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
31fd0 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79  a[36]);.  put4by
31fe0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
31ff0 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b  a[36], nFree+1);
32000 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73  ..  if( pBt->bts
32010 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55  Flags & BTS_SECU
32020 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20  RE_DELETE ){.   
32030 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63 75 72   /* If the secur
32040 65 5f 64 65 6c 65 74 65 20 6f 70 74 69 6f 6e 20  e_delete option 
32050 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  is enabled, then
32060 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 66  .    ** always f
32070 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64  ully overwrite d
32080 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69  eleted informati
32090 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20  on with zeros.. 
320a0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21     */.    if( (!
320b0 70 50 61 67 65 20 26 26 20 28 28 72 63 20 3d 20  pPage && ((rc = 
320c0 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
320d0 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c  , iPage, &pPage,
320e0 20 30 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20   0))!=0) ).     
320f0 7c 7c 20 20 20 20 20 20 20 20 20 20 20 20 28 28  ||            ((
32100 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
32110 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
32120 62 50 61 67 65 29 29 21 3d 30 29 0a 20 20 20 20  bPage))!=0).    
32130 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72  ){.      goto fr
32140 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  eepage_out;.    
32150 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61  }.    memset(pPa
32160 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50  ge->aData, 0, pP
32170 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  age->pBt->pageSi
32180 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ze);.  }..  /* I
32190 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
321a0 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63  upports auto-vac
321b0 75 75 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e  uum, write an en
321c0 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74  try in the point
321d0 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69  er-map.  ** to i
321e0 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
321f0 20 70 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20   page is free.. 
32200 20 2a 2f 0a 20 20 69 66 28 20 49 53 41 55 54 4f   */.  if( ISAUTO
32210 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 70 74  VACUUM ){.    pt
32220 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 50 61  rmapPut(pBt, iPa
32230 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50  ge, PTRMAP_FREEP
32240 41 47 45 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20  AGE, 0, &rc);.  
32250 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
32260 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
32270 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69  }..  /* Now mani
32280 70 75 6c 61 74 65 20 74 68 65 20 61 63 74 75 61  pulate the actua
32290 6c 20 64 61 74 61 62 61 73 65 20 66 72 65 65 2d  l database free-
322a0 6c 69 73 74 20 73 74 72 75 63 74 75 72 65 2e 20  list structure. 
322b0 54 68 65 72 65 20 61 72 65 20 74 77 6f 0a 20 20  There are two.  
322c0 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73  ** possibilities
322d0 2e 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69  . If the free-li
322e0 73 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  st is currently 
322f0 65 6d 70 74 79 2c 20 6f 72 20 69 66 20 74 68 65  empty, or if the
32300 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e   first.  ** trun
32310 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72  k page in the fr
32320 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c  ee-list is full,
32330 20 74 68 65 6e 20 74 68 69 73 20 70 61 67 65 20   then this page 
32340 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20  will become a.  
32350 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74  ** new free-list
32360 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68   trunk page. Oth
32370 65 72 77 69 73 65 2c 20 69 74 20 77 69 6c 6c 20  erwise, it will 
32380 62 65 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66  become a leaf of
32390 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20   the.  ** first 
323a0 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
323b0 65 20 63 75 72 72 65 6e 74 20 66 72 65 65 2d 6c  e current free-l
323c0 69 73 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20  ist. This block 
323d0 74 65 73 74 73 20 69 66 20 69 74 0a 20 20 2a 2a  tests if it.  **
323e0 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
323f0 61 64 64 20 74 68 65 20 70 61 67 65 20 61 73 20  add the page as 
32400 61 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20  a new free-list 
32410 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  leaf..  */.  if(
32420 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a 20 20 20   nFree!=0 ){.   
32430 20 75 33 32 20 6e 4c 65 61 66 3b 20 20 20 20 20   u32 nLeaf;     
32440 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
32450 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  itial number of 
32460 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72  leaf cells on tr
32470 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20  unk page */..   
32480 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
32490 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
324a0 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d  a[32]);.    rc =
324b0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
324c0 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75  t, iTrunk, &pTru
324d0 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  nk, 0);.    if( 
324e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
324f0 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
32500 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
32510 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20 67 65 74  .    nLeaf = get
32520 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
32530 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 61 73  Data[4]);.    as
32540 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c  sert( pBt->usabl
32550 65 53 69 7a 65 3e 33 32 20 29 3b 0a 20 20 20 20  eSize>32 );.    
32560 69 66 28 20 6e 4c 65 61 66 20 3e 20 28 75 33 32  if( nLeaf > (u32
32570 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
32580 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20 20 20 20  /4 - 2 ){.      
32590 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
325a0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
325b0 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
325c0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
325d0 20 6e 4c 65 61 66 20 3c 20 28 75 33 32 29 70 42   nLeaf < (u32)pB
325e0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
325f0 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  - 8 ){.      /* 
32600 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
32610 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68  re is room on th
32620 65 20 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20  e trunk page to 
32630 69 6e 73 65 72 74 20 74 68 65 20 70 61 67 65 0a  insert the page.
32640 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 66        ** being f
32650 72 65 65 64 20 61 73 20 61 20 6e 65 77 20 6c 65  reed as a new le
32660 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  af..      **.   
32670 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
32680 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
32690 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c  s not really ful
326a0 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61  l until it conta
326b0 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61  ins.      ** usa
326c0 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e  bleSize/4 - 2 en
326d0 74 72 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c  tries, not usabl
326e0 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72  eSize/4 - 8 entr
326f0 69 65 73 20 61 73 20 77 65 20 68 61 76 65 0a 20  ies as we have. 
32700 20 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20       ** coded.  
32710 42 75 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64  But due to a cod
32720 69 6e 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72  ing error in ver
32730 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
32740 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a  prior to.      *
32750 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73  * 3.6.0, databas
32760 65 73 20 77 69 74 68 20 66 72 65 65 6c 69 73 74  es with freelist
32770 20 74 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c   trunk pages hol
32780 64 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20  ding more than. 
32790 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69       ** usableSi
327a0 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73  ze/4 - 8 entries
327b0 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65   will be reporte
327c0 64 20 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49  d as corrupt.  I
327d0 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a  n order.      **
327e0 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63   to maintain bac
327f0 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
32800 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20  lity with older 
32810 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
32820 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20  te,.      ** we 
32830 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f  will continue to
32840 20 72 65 73 74 72 69 63 74 20 74 68 65 20 6e 75   restrict the nu
32850 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
32860 74 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  to usableSize/4 
32870 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  - 8.      ** for
32880 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70   now.  At some p
32890 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  oint in the futu
328a0 72 65 20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e  re (once everyon
328b0 65 20 68 61 73 20 75 70 67 72 61 64 65 64 0a 20  e has upgraded. 
328c0 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30       ** to 3.6.0
328d0 20 6f 72 20 6c 61 74 65 72 29 20 77 65 20 73 68   or later) we sh
328e0 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72 20 66 69  ould consider fi
328f0 78 69 6e 67 20 74 68 65 20 63 6f 6e 64 69 74 69  xing the conditi
32900 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20 20 20  onal above.     
32910 20 2a 2a 20 74 6f 20 72 65 61 64 20 22 75 73 61   ** to read "usa
32920 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73  bleSize/4-2" ins
32930 74 65 61 64 20 6f 66 20 22 75 73 61 62 6c 65 53  tead of "usableS
32940 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20  ize/4-8"..      
32950 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44  **.      ** EVID
32960 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 39 32 30  ENCE-OF: R-19920
32970 2d 31 31 35 37 36 20 48 6f 77 65 76 65 72 2c 20  -11576 However, 
32980 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  newer versions o
32990 66 20 53 51 4c 69 74 65 20 73 74 69 6c 6c 0a 20  f SQLite still. 
329a0 20 20 20 20 20 2a 2a 20 61 76 6f 69 64 20 75 73       ** avoid us
329b0 69 6e 67 20 74 68 65 20 6c 61 73 74 20 73 69 78  ing the last six
329c0 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
329d0 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
329e0 61 67 65 20 61 72 72 61 79 20 69 6e 0a 20 20 20  age array in.   
329f0 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 68 61 74     ** order that
32a00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
32a10 63 72 65 61 74 65 64 20 62 79 20 6e 65 77 65 72  created by newer
32a20 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
32a30 69 74 65 20 63 61 6e 20 62 65 0a 20 20 20 20 20  ite can be.     
32a40 20 2a 2a 20 72 65 61 64 20 62 79 20 6f 6c 64 65   ** read by olde
32a50 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
32a60 4c 69 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  Lite..      */. 
32a70 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
32a80 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
32a90 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
32aa0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
32ab0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
32ac0 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e   put4byte(&pTrun
32ad0 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65  k->aData[4], nLe
32ae0 61 66 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70  af+1);.        p
32af0 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  ut4byte(&pTrunk-
32b00 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34  >aData[8+nLeaf*4
32b10 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20  ], iPage);.     
32b20 20 20 20 69 66 28 20 70 50 61 67 65 20 26 26 20     if( pPage && 
32b30 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
32b40 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
32b50 54 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  TE)==0 ){.      
32b60 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
32b70 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d  DontWrite(pPage-
32b80 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
32b90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
32ba0 3d 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e  = btreeSetHasCon
32bb0 74 65 6e 74 28 70 42 74 2c 20 69 50 61 67 65 29  tent(pBt, iPage)
32bc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
32bd0 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47  TRACE(("FREE-PAG
32be0 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72  E: %d leaf on tr
32bf0 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70  unk page %d\n",p
32c00 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e  Page->pgno,pTrun
32c10 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  k->pgno));.     
32c20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
32c30 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ut;.    }.  }.. 
32c40 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66   /* If control f
32c50 6c 6f 77 73 20 74 6f 20 74 68 69 73 20 70 6f 69  lows to this poi
32c60 6e 74 2c 20 74 68 65 6e 20 69 74 20 77 61 73 20  nt, then it was 
32c70 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
32c80 61 64 64 20 74 68 65 0a 20 20 2a 2a 20 74 68 65  add the.  ** the
32c90 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   page being free
32ca0 64 20 61 73 20 61 20 6c 65 61 66 20 70 61 67 65  d as a leaf page
32cb0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 72   of the first tr
32cc0 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d  unk in the free-
32cd0 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69  list..  ** Possi
32ce0 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20  bly because the 
32cf0 66 72 65 65 2d 6c 69 73 74 20 69 73 20 65 6d 70  free-list is emp
32d00 74 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79 20  ty, or possibly 
32d10 62 65 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a  because the .  *
32d20 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e  * first trunk in
32d30 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
32d40 73 20 66 75 6c 6c 2e 20 45 69 74 68 65 72 20 77  s full. Either w
32d50 61 79 2c 20 74 68 65 20 70 61 67 65 20 62 65 69  ay, the page bei
32d60 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a 20 77 69  ng freed.  ** wi
32d70 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65  ll become the ne
32d80 77 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61  w first trunk pa
32d90 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  ge in the free-l
32da0 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ist..  */.  if( 
32db0 70 50 61 67 65 3d 3d 30 20 26 26 20 53 51 4c 49  pPage==0 && SQLI
32dc0 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72  TE_OK!=(rc = btr
32dd0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
32de0 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29  Page, &pPage, 0)
32df0 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72  ) ){.    goto fr
32e00 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  eepage_out;.  }.
32e10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
32e20 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
32e30 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
32e40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
32e50 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61  .    goto freepa
32e60 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75  ge_out;.  }.  pu
32e70 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
32e80 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20  ata, iTrunk);.  
32e90 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
32ea0 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20  >aData[4], 0);. 
32eb0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
32ec0 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 50  1->aData[32], iP
32ed0 61 67 65 29 3b 0a 20 20 54 52 41 43 45 28 28 22  age);.  TRACE(("
32ee0 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65  FREE-PAGE: %d ne
32ef0 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70  w trunk page rep
32f00 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50  lacing %d\n", pP
32f10 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e  age->pgno, iTrun
32f20 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f  k));..freepage_o
32f30 75 74 3a 0a 20 20 69 66 28 20 70 50 61 67 65 20  ut:.  if( pPage 
32f40 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  ){.    pPage->is
32f50 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Init = 0;.  }.  
32f60 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
32f70 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67  e);.  releasePag
32f80 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74  e(pTrunk);.  ret
32f90 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63  urn rc;.}.static
32fa0 20 76 6f 69 64 20 66 72 65 65 50 61 67 65 28 4d   void freePage(M
32fb0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
32fc0 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20  nt *pRC){.  if( 
32fd0 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f  (*pRC)==SQLITE_O
32fe0 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  K ){.    *pRC = 
32ff0 66 72 65 65 50 61 67 65 32 28 70 50 61 67 65 2d  freePage2(pPage-
33000 3e 70 42 74 2c 20 70 50 61 67 65 2c 20 70 50 61  >pBt, pPage, pPa
33010 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d  ge->pgno);.  }.}
33020 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79  ../*.** Free any
33030 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
33040 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
33050 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 20  the given Cell. 
33060 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 6c 6f   Write the.** lo
33070 63 61 6c 20 43 65 6c 6c 20 73 69 7a 65 20 28 74  cal Cell size (t
33080 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
33090 65 73 20 6f 6e 20 74 68 65 20 6f 72 69 67 69 6e  es on the origin
330a0 61 6c 20 70 61 67 65 2c 20 6f 6d 69 74 74 69 6e  al page, omittin
330b0 67 0a 2a 2a 20 6f 76 65 72 66 6c 6f 77 29 20 69  g.** overflow) i
330c0 6e 74 6f 20 2a 70 6e 53 69 7a 65 2e 0a 2a 2f 0a  nto *pnSize..*/.
330d0 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72  static int clear
330e0 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
330f0 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
33100 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61   /* The page tha
33110 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 43  t contains the C
33120 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ell */.  unsigne
33130 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20  d char *pCell,  
33140 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
33150 6f 66 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20  of the Cell */. 
33160 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f   CellInfo *pInfo
33170 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
33180 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  e information ab
33190 6f 75 74 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  out the cell */.
331a0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
331b0 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
331c0 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f  .  Pgno ovflPgno
331d0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
331e0 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 33 32 20 6f  t nOvfl;.  u32 o
331f0 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20  vflPageSize;..  
33200 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
33210 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
33220 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
33230 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65  .  pPage->xParse
33240 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c  Cell(pPage, pCel
33250 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 69 66 28  l, pInfo);.  if(
33260 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 3d 3d   pInfo->nLocal==
33270 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20  pInfo->nPayload 
33280 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
33290 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20  LITE_OK;  /* No 
332a0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
332b0 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  Return without d
332c0 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f  oing anything */
332d0 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 65 6c 6c  .  }.  if( pCell
332e0 2b 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 2d 31 20  +pInfo->nSize-1 
332f0 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70  > pPage->aData+p
33300 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 29  Page->maskPage )
33310 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
33320 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
33330 3b 20 20 2f 2a 20 43 65 6c 6c 20 65 78 74 65 6e  ;  /* Cell exten
33340 64 73 20 70 61 73 74 20 65 6e 64 20 6f 66 20 70  ds past end of p
33350 61 67 65 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66  age */.  }.  ovf
33360 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  lPgno = get4byte
33370 28 70 43 65 6c 6c 20 2b 20 70 49 6e 66 6f 2d 3e  (pCell + pInfo->
33380 6e 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 61 73  nSize - 4);.  as
33390 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c  sert( pBt->usabl
333a0 65 53 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f  eSize > 4 );.  o
333b0 76 66 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42  vflPageSize = pB
333c0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
333d0 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 70 49  4;.  nOvfl = (pI
333e0 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 2d 20  nfo->nPayload - 
333f0 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20  pInfo->nLocal + 
33400 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 2d 20 31  ovflPageSize - 1
33410 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a  )/ovflPageSize;.
33420 20 20 61 73 73 65 72 74 28 20 6e 4f 76 66 6c 3e    assert( nOvfl>
33430 30 20 7c 7c 20 0a 20 20 20 20 28 43 4f 52 52 55  0 || .    (CORRU
33440 50 54 5f 44 42 20 26 26 20 28 70 49 6e 66 6f 2d  PT_DB && (pInfo-
33450 3e 6e 50 61 79 6c 6f 61 64 20 2b 20 6f 76 66 6c  >nPayload + ovfl
33460 50 61 67 65 53 69 7a 65 29 3c 6f 76 66 6c 50 61  PageSize)<ovflPa
33470 67 65 53 69 7a 65 29 0a 20 20 29 3b 0a 20 20 77  geSize).  );.  w
33480 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b  hile( nOvfl-- ){
33490 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65 78 74 20  .    Pgno iNext 
334a0 3d 20 30 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65  = 0;.    MemPage
334b0 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20   *pOvfl = 0;.   
334c0 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20   if( ovflPgno<2 
334d0 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 62 74 72 65  || ovflPgno>btre
334e0 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  ePagecount(pBt) 
334f0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 30 20 69 73  ){.      /* 0 is
33500 20 6e 6f 74 20 61 20 6c 65 67 61 6c 20 70 61 67   not a legal pag
33510 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67  e number and pag
33520 65 20 31 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e  e 1 cannot be an
33530 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66   .      ** overf
33540 6c 6f 77 20 70 61 67 65 2e 20 54 68 65 72 65 66  low page. Theref
33550 6f 72 65 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c  ore if ovflPgno<
33560 32 20 6f 72 20 70 61 73 74 20 74 68 65 20 65 6e  2 or past the en
33570 64 20 6f 66 20 74 68 65 20 0a 20 20 20 20 20 20  d of the .      
33580 2a 2a 20 66 69 6c 65 20 74 68 65 20 64 61 74 61  ** file the data
33590 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72  base must be cor
335a0 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72  rupt. */.      r
335b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
335c0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
335d0 0a 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 29  .    if( nOvfl )
335e0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65 74  {.      rc = get
335f0 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74  OverflowPage(pBt
33600 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76  , ovflPgno, &pOv
33610 66 6c 2c 20 26 69 4e 65 78 74 29 3b 0a 20 20 20  fl, &iNext);.   
33620 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
33630 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
33640 20 20 69 66 28 20 28 20 70 4f 76 66 6c 20 7c 7c    if( ( pOvfl ||
33650 20 28 28 70 4f 76 66 6c 20 3d 20 62 74 72 65 65   ((pOvfl = btree
33660 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20  PageLookup(pBt, 
33670 6f 76 66 6c 50 67 6e 6f 29 29 21 3d 30 29 20 29  ovflPgno))!=0) )
33680 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33  .     && sqlite3
33690 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
336a0 74 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65  t(pOvfl->pDbPage
336b0 29 21 3d 31 0a 20 20 20 20 29 7b 0a 20 20 20 20  )!=1.    ){.    
336c0 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f    /* There is no
336d0 20 72 65 61 73 6f 6e 20 61 6e 79 20 63 75 72 73   reason any curs
336e0 6f 72 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61  or should have a
336f0 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  n outstanding re
33700 66 65 72 65 6e 63 65 20 0a 20 20 20 20 20 20 2a  ference .      *
33710 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  * to an overflow
33720 20 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20   page belonging 
33730 74 6f 20 61 20 63 65 6c 6c 20 74 68 61 74 20 69  to a cell that i
33740 73 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2f  s being deleted/
33750 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20 2a  updated..      *
33760 2a 20 53 6f 20 69 66 20 74 68 65 72 65 20 65 78  * So if there ex
33770 69 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f  ists more than o
33780 6e 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ne reference to 
33790 74 68 69 73 20 70 61 67 65 2c 20 74 68 65 6e 20  this page, then 
337a0 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 75 73  it .      ** mus
337b0 74 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65 20  t not really be 
337c0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
337d0 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
337e0 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
337f0 74 2e 20 0a 20 20 20 20 20 20 2a 2a 20 49 74 20  t. .      ** It 
33800 69 73 20 68 65 6c 70 66 75 6c 20 74 6f 20 64 65  is helpful to de
33810 74 65 63 74 20 74 68 69 73 20 62 65 66 6f 72 65  tect this before
33820 20 63 61 6c 6c 69 6e 67 20 66 72 65 65 50 61 67   calling freePag
33830 65 32 28 29 2c 20 61 73 20 0a 20 20 20 20 20 20  e2(), as .      
33840 2a 2a 20 66 72 65 65 50 61 67 65 32 28 29 20 6d  ** freePage2() m
33850 61 79 20 7a 65 72 6f 20 74 68 65 20 70 61 67 65  ay zero the page
33860 20 63 6f 6e 74 65 6e 74 73 20 69 66 20 73 65 63   contents if sec
33870 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 20  ure-delete mode 
33880 69 73 0a 20 20 20 20 20 20 2a 2a 20 65 6e 61 62  is.      ** enab
33890 6c 65 64 2e 20 49 66 20 74 68 69 73 20 27 6f 76  led. If this 'ov
338a0 65 72 66 6c 6f 77 27 20 70 61 67 65 20 68 61 70  erflow' page hap
338b0 70 65 6e 73 20 74 6f 20 62 65 20 61 20 70 61 67  pens to be a pag
338c0 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20  e that the.     
338d0 20 2a 2a 20 63 61 6c 6c 65 72 20 69 73 20 69 74   ** caller is it
338e0 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20  erating through 
338f0 6f 72 20 75 73 69 6e 67 20 69 6e 20 73 6f 6d 65  or using in some
33900 20 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69 73   other way, this
33910 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e 20 62 65  .      ** can be
33920 20 70 72 6f 62 6c 65 6d 61 74 69 63 2e 0a 20 20   problematic..  
33930 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
33940 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
33950 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _BKPT;.    }else
33960 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 72 65  {.      rc = fre
33970 65 50 61 67 65 32 28 70 42 74 2c 20 70 4f 76 66  ePage2(pBt, pOvf
33980 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20  l, ovflPgno);.  
33990 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f 76    }..    if( pOv
339a0 66 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  fl ){.      sqli
339b0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f  te3PagerUnref(pO
339c0 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  vfl->pDbPage);. 
339d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20     }.    if( rc 
339e0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
339f0 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e 65 78   ovflPgno = iNex
33a00 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
33a10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
33a20 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20 62  .** Create the b
33a30 79 74 65 20 73 65 71 75 65 6e 63 65 20 75 73 65  yte sequence use
33a40 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61  d to represent a
33a50 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50   cell on page pP
33a60 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65  age.** and write
33a70 20 74 68 61 74 20 62 79 74 65 20 73 65 71 75 65   that byte seque
33a80 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d  nce into pCell[]
33a90 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65  .  Overflow page
33aa0 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74  s are.** allocat
33ab0 65 64 20 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e  ed and filled in
33ac0 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20   as necessary.  
33ad0 54 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63  The calling proc
33ae0 65 64 75 72 65 0a 2a 2a 20 69 73 20 72 65 73 70  edure.** is resp
33af0 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69  onsible for maki
33b00 6e 67 20 73 75 72 65 20 73 75 66 66 69 63 69 65  ng sure sufficie
33b10 6e 74 20 73 70 61 63 65 20 68 61 73 20 62 65 65  nt space has bee
33b20 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66  n allocated.** f
33b30 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a  or pCell[]..**.*
33b40 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 43 65 6c  * Note that pCel
33b50 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73  l does not neces
33b60 73 61 72 79 20 6e 65 65 64 20 74 6f 20 70 6f 69  sary need to poi
33b70 6e 74 20 74 6f 20 74 68 65 20 70 50 61 67 65 2d  nt to the pPage-
33b80 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20  >aData.** area. 
33b90 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69   pCell might poi
33ba0 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f  nt to some tempo
33bb0 72 61 72 79 20 73 74 6f 72 61 67 65 2e 20 20 54  rary storage.  T
33bc0 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20  he cell will.** 
33bd0 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69  be constructed i
33be0 6e 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79  n this temporary
33bf0 20 61 72 65 61 20 74 68 65 6e 20 63 6f 70 69 65   area then copie
33c00 64 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44  d into pPage->aD
33c10 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f  ata.** later..*/
33c20 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c  .static int fill
33c30 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  InCell(.  MemPag
33c40 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
33c50 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
33c60 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
33c70 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ns the cell */. 
33c80 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
33c90 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
33ca0 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65 78 74  /* Complete text
33cb0 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a   of the cell */.
33cc0 20 20 63 6f 6e 73 74 20 42 74 72 65 65 50 61 79    const BtreePay
33cd0 6c 6f 61 64 20 2a 70 58 2c 20 20 20 20 20 20 20  load *pX,       
33ce0 20 2f 2a 20 50 61 79 6c 6f 61 64 20 77 69 74 68   /* Payload with
33cf0 20 77 68 69 63 68 20 74 6f 20 63 6f 6e 73 74 72   which to constr
33d00 75 63 74 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  uct the cell */.
33d10 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20    int *pnSize   
33d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33d30 20 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73   /* Write cell s
33d40 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ize here */.){. 
33d50 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20   int nPayload;. 
33d60 20 63 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b   const u8 *pSrc;
33d70 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20  .  int nSrc, n, 
33d80 72 63 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c  rc;.  int spaceL
33d90 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  eft;.  MemPage *
33da0 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d  pOvfl = 0;.  Mem
33db0 50 61 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65  Page *pToRelease
33dc0 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64   = 0;.  unsigned
33dd0 20 63 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20   char *pPrior;. 
33de0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
33df0 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68  pPayload;.  BtSh
33e00 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
33e10 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70  e->pBt;.  Pgno p
33e20 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69  gnoOvfl = 0;.  i
33e30 6e 74 20 6e 48 65 61 64 65 72 3b 0a 0a 20 20 61  nt nHeader;..  a
33e40 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
33e50 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
33e60 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
33e70 0a 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20 6e  .  /* pPage is n
33e80 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77  ot necessarily w
33e90 72 69 74 65 61 62 6c 65 20 73 69 6e 63 65 20 70  riteable since p
33ea0 43 65 6c 6c 20 6d 69 67 68 74 20 62 65 20 61 75  Cell might be au
33eb0 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75 66  xiliary.  ** buf
33ec0 66 65 72 20 73 70 61 63 65 20 74 68 61 74 20 69  fer space that i
33ed0 73 20 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20  s separate from 
33ee0 74 68 65 20 70 50 61 67 65 20 62 75 66 66 65 72  the pPage buffer
33ef0 20 61 72 65 61 20 2a 2f 0a 20 20 61 73 73 65 72   area */.  asser
33f00 74 28 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e  t( pCell<pPage->
33f10 61 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d  aData || pCell>=
33f20 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
33f30 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20  t->pageSize].   
33f40 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
33f50 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
33f60 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
33f70 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c  ge) );..  /* Fil
33f80 6c 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e  l in the header.
33f90 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20   */.  nHeader = 
33fa0 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
33fb0 69 7a 65 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ize;.  if( pPage
33fc0 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
33fd0 6e 50 61 79 6c 6f 61 64 20 3d 20 70 58 2d 3e 6e  nPayload = pX->n
33fe0 44 61 74 61 20 2b 20 70 58 2d 3e 6e 5a 65 72 6f  Data + pX->nZero
33ff0 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 58 2d  ;.    pSrc = pX-
34000 3e 70 44 61 74 61 3b 0a 20 20 20 20 6e 53 72 63  >pData;.    nSrc
34010 20 3d 20 70 58 2d 3e 6e 44 61 74 61 3b 0a 20 20   = pX->nData;.  
34020 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
34030 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 3b 20 2f  >intKeyLeaf ); /
34040 2a 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f  * fillInCell() o
34050 6e 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72 20 6c  nly called for l
34060 65 61 76 65 73 20 2a 2f 0a 20 20 20 20 6e 48 65  eaves */.    nHe
34070 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e  ader += putVarin
34080 74 33 32 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64  t32(&pCell[nHead
34090 65 72 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a  er], nPayload);.
340a0 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70      nHeader += p
340b0 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b  utVarint(&pCell[
340c0 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a  nHeader], *(u64*
340d0 29 26 70 58 2d 3e 6e 4b 65 79 29 3b 0a 20 20 7d  )&pX->nKey);.  }
340e0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
340f0 28 20 70 58 2d 3e 6e 4b 65 79 3c 3d 30 78 37 66  ( pX->nKey<=0x7f
34100 66 66 66 66 66 66 20 26 26 20 70 58 2d 3e 70 4b  ffffff && pX->pK
34110 65 79 21 3d 30 20 29 3b 0a 20 20 20 20 6e 53 72  ey!=0 );.    nSr
34120 63 20 3d 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28  c = nPayload = (
34130 69 6e 74 29 70 58 2d 3e 6e 4b 65 79 3b 0a 20 20  int)pX->nKey;.  
34140 20 20 70 53 72 63 20 3d 20 70 58 2d 3e 70 4b 65    pSrc = pX->pKe
34150 79 3b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b  y;.    nHeader +
34160 3d 20 70 75 74 56 61 72 69 6e 74 33 32 28 26 70  = putVarint32(&p
34170 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e  Cell[nHeader], n
34180 50 61 79 6c 6f 61 64 29 3b 0a 20 20 7d 0a 20 20  Payload);.  }.  
34190 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68  .  /* Fill in th
341a0 65 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 69  e payload */.  i
341b0 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61  f( nPayload<=pPa
341c0 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a  ge->maxLocal ){.
341d0 20 20 20 20 6e 20 3d 20 6e 48 65 61 64 65 72 20      n = nHeader 
341e0 2b 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  + nPayload;.    
341f0 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 33 20 29  testcase( n==3 )
34200 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
34210 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 69 66 28 20  n==4 );.    if( 
34220 6e 3c 34 20 29 20 6e 20 3d 20 34 3b 0a 20 20 20  n<4 ) n = 4;.   
34230 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 3b 0a 20 20   *pnSize = n;.  
34240 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 6e 50    spaceLeft = nP
34250 61 79 6c 6f 61 64 3b 0a 20 20 20 20 70 50 72 69  ayload;.    pPri
34260 6f 72 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 7d 65  or = pCell;.  }e
34270 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6d 6e 20  lse{.    int mn 
34280 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61  = pPage->minLoca
34290 6c 3b 0a 20 20 20 20 6e 20 3d 20 6d 6e 20 2b 20  l;.    n = mn + 
342a0 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 6e 29 20  (nPayload - mn) 
342b0 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  % (pPage->pBt->u
342c0 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a  sableSize - 4);.
342d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d      testcase( n=
342e0 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
342f0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
34300 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ( n==pPage->maxL
34310 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66  ocal+1 );.    if
34320 28 20 6e 20 3e 20 70 50 61 67 65 2d 3e 6d 61 78  ( n > pPage->max
34330 4c 6f 63 61 6c 20 29 20 6e 20 3d 20 6d 6e 3b 0a  Local ) n = mn;.
34340 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20      spaceLeft = 
34350 6e 3b 0a 20 20 20 20 2a 70 6e 53 69 7a 65 20 3d  n;.    *pnSize =
34360 20 6e 20 2b 20 6e 48 65 61 64 65 72 20 2b 20 34   n + nHeader + 4
34370 3b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20 26  ;.    pPrior = &
34380 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 2b 6e 5d  pCell[nHeader+n]
34390 3b 0a 20 20 7d 0a 20 20 70 50 61 79 6c 6f 61 64  ;.  }.  pPayload
343a0 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65   = &pCell[nHeade
343b0 72 5d 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69  r];..  /* At thi
343c0 73 20 70 6f 69 6e 74 20 76 61 72 69 61 62 6c 65  s point variable
343d0 73 20 73 68 6f 75 6c 64 20 62 65 20 73 65 74 20  s should be set 
343e0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a  as follows:.  **
343f0 0a 20 20 2a 2a 20 20 20 6e 50 61 79 6c 6f 61 64  .  **   nPayload
34400 20 20 20 20 20 20 20 20 20 20 20 54 6f 74 61 6c             Total
34410 20 70 61 79 6c 6f 61 64 20 73 69 7a 65 20 69 6e   payload size in
34420 20 62 79 74 65 73 0a 20 20 2a 2a 20 20 20 70 50   bytes.  **   pP
34430 61 79 6c 6f 61 64 20 20 20 20 20 20 20 20 20 20  ayload          
34440 20 42 65 67 69 6e 20 77 72 69 74 69 6e 67 20 70   Begin writing p
34450 61 79 6c 6f 61 64 20 68 65 72 65 0a 20 20 2a 2a  ayload here.  **
34460 20 20 20 73 70 61 63 65 4c 65 66 74 20 20 20 20     spaceLeft    
34470 20 20 20 20 20 20 53 70 61 63 65 20 61 76 61 69        Space avai
34480 6c 61 62 6c 65 20 61 74 20 70 50 61 79 6c 6f 61  lable at pPayloa
34490 64 2e 20 20 49 66 20 6e 50 61 79 6c 6f 61 64 3e  d.  If nPayload>
344a0 73 70 61 63 65 4c 65 66 74 2c 0a 20 20 2a 2a 20  spaceLeft,.  ** 
344b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
344c0 20 20 20 20 20 74 68 61 74 20 6d 65 61 6e 73 20       that means 
344d0 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 73 70 69  content must spi
344e0 6c 6c 20 69 6e 74 6f 20 6f 76 65 72 66 6c 6f 77  ll into overflow
344f0 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 20 20 2a   pages..  **   *
34500 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  pnSize          
34510 20 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6c 6f    Size of the lo
34520 63 61 6c 20 63 65 6c 6c 20 28 6e 6f 74 20 63 6f  cal cell (not co
34530 75 6e 74 69 6e 67 20 6f 76 65 72 66 6c 6f 77 20  unting overflow 
34540 70 61 67 65 73 29 0a 20 20 2a 2a 20 20 20 70 50  pages).  **   pP
34550 72 69 6f 72 20 20 20 20 20 20 20 20 20 20 20 20  rior            
34560 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20   Where to write 
34570 74 68 65 20 70 67 6e 6f 20 6f 66 20 74 68 65 20  the pgno of the 
34580 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70  first overflow p
34590 61 67 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 55 73  age.  **.  ** Us
345a0 65 20 61 20 63 61 6c 6c 20 74 6f 20 62 74 72 65  e a call to btre
345b0 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20  eParseCellPtr() 
345c0 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74  to verify that t
345d0 68 65 20 76 61 6c 75 65 73 20 61 62 6f 76 65 0a  he values above.
345e0 20 20 2a 2a 20 77 65 72 65 20 63 6f 6d 70 75 74    ** were comput
345f0 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20  ed correctly..  
34600 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45  */.#if SQLITE_DE
34610 42 55 47 0a 20 20 7b 0a 20 20 20 20 43 65 6c 6c  BUG.  {.    Cell
34620 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 70  Info info;.    p
34630 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
34640 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
34650 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72  info);.    asser
34660 74 28 20 6e 48 65 61 64 65 72 3d 3d 28 69 6e 74  t( nHeader==(int
34670 29 28 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 20  )(info.pPayload 
34680 2d 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20 20 20  - pCell) );.    
34690 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65  assert( info.nKe
346a0 79 3d 3d 70 58 2d 3e 6e 4b 65 79 20 29 3b 0a 20  y==pX->nKey );. 
346b0 20 20 20 61 73 73 65 72 74 28 20 2a 70 6e 53 69     assert( *pnSi
346c0 7a 65 20 3d 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65  ze == info.nSize
346d0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
346e0 73 70 61 63 65 4c 65 66 74 20 3d 3d 20 69 6e 66  spaceLeft == inf
346f0 6f 2e 6e 4c 6f 63 61 6c 20 29 3b 0a 20 20 7d 0a  o.nLocal );.  }.
34700 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 57 72 69  #endif..  /* Wri
34710 74 65 20 74 68 65 20 70 61 79 6c 6f 61 64 20 69  te the payload i
34720 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 43 65  nto the local Ce
34730 6c 6c 20 61 6e 64 20 61 6e 79 20 65 78 74 72 61  ll and any extra
34740 20 69 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70   into overflow p
34750 61 67 65 73 20 2a 2f 0a 20 20 77 68 69 6c 65 28  ages */.  while(
34760 20 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20   nPayload>0 ){. 
34770 20 20 20 69 66 28 20 73 70 61 63 65 4c 65 66 74     if( spaceLeft
34780 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  ==0 ){.#ifndef S
34790 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
347a0 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f  ACUUM.      Pgno
347b0 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67   pgnoPtrmap = pg
347c0 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66  noOvfl; /* Overf
347d0 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72  low page pointer
347e0 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67 65 20  -map entry page 
347f0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  */.      if( pBt
34800 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
34810 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20          do{.    
34820 20 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b        pgnoOvfl++
34830 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c  ;.        } whil
34840 65 28 20 0a 20 20 20 20 20 20 20 20 20 20 50 54  e( .          PT
34850 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
34860 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67   pgnoOvfl) || pg
34870 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f  noOvfl==PENDING_
34880 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 0a  BYTE_PAGE(pBt) .
34890 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
348a0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
348b0 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
348c0 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4f 76  eePage(pBt, &pOv
348d0 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70  fl, &pgnoOvfl, p
348e0 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66  gnoOvfl, 0);.#if
348f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
34900 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
34910 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
34920 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75  base supports au
34930 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20 74  to-vacuum, and t
34940 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 73 75 62  he second or sub
34950 73 65 71 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a  sequent.      **
34960 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
34970 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65  s being allocate
34980 64 2c 20 61 64 64 20 61 6e 20 65 6e 74 72 79 20  d, add an entry 
34990 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  to the pointer-m
349a0 61 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  ap.      ** for 
349b0 74 68 61 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a  that page now. .
349c0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
349d0 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
349e0 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20   first overflow 
349f0 70 61 67 65 2c 20 74 68 65 6e 20 77 72 69 74 65  page, then write
34a00 20 61 20 70 61 72 74 69 61 6c 20 65 6e 74 72 79   a partial entry
34a10 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68   .      ** to th
34a20 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49  e pointer-map. I
34a30 66 20 77 65 20 77 72 69 74 65 20 6e 6f 74 68 69  f we write nothi
34a40 6e 67 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ng to this point
34a50 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20  er-map slot,.   
34a60 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f     ** then the o
34a70 70 74 69 6d 69 73 74 69 63 20 6f 76 65 72 66 6c  ptimistic overfl
34a80 6f 77 20 63 68 61 69 6e 20 70 72 6f 63 65 73 73  ow chain process
34a90 69 6e 67 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c  ing in clearCell
34aa0 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20  ().      ** may 
34ab0 6d 69 73 69 6e 74 65 72 70 72 65 74 20 74 68 65  misinterpret the
34ac0 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 76   uninitialized v
34ad0 61 6c 75 65 73 20 61 6e 64 20 64 65 6c 65 74 65  alues and delete
34ae0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 77 72   the.      ** wr
34af0 6f 6e 67 20 70 61 67 65 73 20 66 72 6f 6d 20 74  ong pages from t
34b00 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20  he database..   
34b10 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
34b20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
34b30 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
34b40 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65   ){.        u8 e
34b50 54 79 70 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d  Type = (pgnoPtrm
34b60 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ap?PTRMAP_OVERFL
34b70 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46  OW2:PTRMAP_OVERF
34b80 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20 20 20 70  LOW1);.        p
34b90 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67  trmapPut(pBt, pg
34ba0 6e 6f 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20 70  noOvfl, eType, p
34bb0 67 6e 6f 50 74 72 6d 61 70 2c 20 26 72 63 29 3b  gnoPtrmap, &rc);
34bc0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
34bd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c  ){.          rel
34be0 65 61 73 65 50 61 67 65 28 70 4f 76 66 6c 29 3b  easePage(pOvfl);
34bf0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
34c00 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
34c10 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
34c20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
34c30 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20  oRelease);.     
34c40 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
34c50 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
34c60 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73  If pToRelease is
34c70 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70   not zero than p
34c80 50 72 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e 74  Prior points int
34c90 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a  o the data area.
34ca0 20 20 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52        ** of pToR
34cb0 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75  elease.  Make su
34cc0 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73  re pToRelease is
34cd0 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65   still writeable
34ce0 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
34cf0 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30  t( pToRelease==0
34d00 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
34d10 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52  Iswriteable(pToR
34d20 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29  elease->pDbPage)
34d30 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66   );..      /* If
34d40 20 70 50 72 69 6f 72 20 69 73 20 70 61 72 74 20   pPrior is part 
34d50 6f 66 20 74 68 65 20 64 61 74 61 20 61 72 65 61  of the data area
34d60 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20   of pPage, then 
34d70 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a  make sure pPage.
34d80 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c        ** is stil
34d90 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20  l writeable */. 
34da0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72       assert( pPr
34db0 69 6f 72 3c 70 50 61 67 65 2d 3e 61 44 61 74 61  ior<pPage->aData
34dc0 20 7c 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50 61   || pPrior>=&pPa
34dd0 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70  ge->aData[pBt->p
34de0 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20  ageSize].       
34df0 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50       || sqlite3P
34e00 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
34e10 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
34e20 29 3b 0a 0a 20 20 20 20 20 20 70 75 74 34 62 79  );..      put4by
34e30 74 65 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f  te(pPrior, pgnoO
34e40 76 66 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c 65  vfl);.      rele
34e50 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61  asePage(pToRelea
34e60 73 65 29 3b 0a 20 20 20 20 20 20 70 54 6f 52 65  se);.      pToRe
34e70 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20  lease = pOvfl;. 
34e80 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 4f       pPrior = pO
34e90 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  vfl->aData;.    
34ea0 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f    put4byte(pPrio
34eb0 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61  r, 0);.      pPa
34ec0 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e  yload = &pOvfl->
34ed0 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20  aData[4];.      
34ee0 73 70 61 63 65 4c 65 66 74 20 3d 20 70 42 74 2d  spaceLeft = pBt-
34ef0 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
34f00 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e  .    }.    n = n
34f10 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28  Payload;.    if(
34f20 20 6e 3e 73 70 61 63 65 4c 65 66 74 20 29 20 6e   n>spaceLeft ) n
34f30 20 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a 20   = spaceLeft;.. 
34f40 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65     /* If pToRele
34f50 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20  ase is not zero 
34f60 74 68 61 6e 20 70 50 61 79 6c 6f 61 64 20 70 6f  than pPayload po
34f70 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61  ints into the da
34f80 74 61 20 61 72 65 61 0a 20 20 20 20 2a 2a 20 6f  ta area.    ** o
34f90 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d  f pToRelease.  M
34fa0 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65  ake sure pToRele
34fb0 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69  ase is still wri
34fc0 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 61  teable. */.    a
34fd0 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73  ssert( pToReleas
34fe0 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50  e==0 || sqlite3P
34ff0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
35000 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50  pToRelease->pDbP
35010 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  age) );..    /* 
35020 49 66 20 70 50 61 79 6c 6f 61 64 20 69 73 20 70  If pPayload is p
35030 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20  art of the data 
35040 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74  area of pPage, t
35050 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50  hen make sure pP
35060 61 67 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 74  age.    ** is st
35070 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f  ill writeable */
35080 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
35090 79 6c 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44 61  yload<pPage->aDa
350a0 74 61 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e 3d  ta || pPayload>=
350b0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
350c0 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20  t->pageSize].   
350d0 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
350e0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
350f0 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
35100 67 65 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  ge) );..    if( 
35110 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 20 20  nSrc>0 ){.      
35120 69 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d  if( n>nSrc ) n =
35130 20 6e 53 72 63 3b 0a 20 20 20 20 20 20 61 73 73   nSrc;.      ass
35140 65 72 74 28 20 70 53 72 63 20 29 3b 0a 20 20 20  ert( pSrc );.   
35150 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f     memcpy(pPaylo
35160 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20  ad, pSrc, n);.  
35170 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d    }else{.      m
35180 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2c 20  emset(pPayload, 
35190 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, n);.    }.   
351a0 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a   nPayload -= n;.
351b0 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20      pPayload += 
351c0 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20 6e  n;.    pSrc += n
351d0 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b  ;.    nSrc -= n;
351e0 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 2d  .    spaceLeft -
351f0 3d 20 6e 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61  = n;.  }.  relea
35200 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73  sePage(pToReleas
35210 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e);.  return SQL
35220 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
35230 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68   Remove the i-th
35240 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65   cell from pPage
35250 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
35260 65 66 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e  effects pPage on
35270 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20  ly..** The cell 
35280 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66  content is not f
35290 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61  reed or dealloca
352a0 74 65 64 2e 20 20 49 74 20 69 73 20 61 73 73 75  ted.  It is assu
352b0 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  med that.** the 
352c0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73  cell content has
352d0 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d   been copied som
352e0 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68  eplace else.  Th
352f0 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a  is routine just.
35300 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72  ** removes the r
35310 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
35320 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e  cell from pPage.
35330 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74  .**.** "sz" must
35340 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   be the number o
35350 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 63  f bytes in the c
35360 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ell..*/.static v
35370 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d  oid dropCell(Mem
35380 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
35390 20 69 64 78 2c 20 69 6e 74 20 73 7a 2c 20 69 6e   idx, int sz, in
353a0 74 20 2a 70 52 43 29 7b 0a 20 20 75 33 32 20 70  t *pRC){.  u32 p
353b0 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  c;         /* Of
353c0 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e  fset to cell con
353d0 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65 69  tent of cell bei
353e0 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20  ng deleted */.  
353f0 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
35400 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  /* pPage->aData 
35410 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20  */.  u8 *ptr;   
35420 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
35430 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f 75 6e  move bytes aroun
35440 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b 5d 20  d within data[] 
35450 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
35460 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75       /* The retu
35470 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
35480 20 68 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20   hdr;        /* 
35490 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  Beginning of the
354a0 20 68 65 61 64 65 72 2e 20 20 30 20 6d 6f 73 74   header.  0 most
354b0 20 70 61 67 65 73 2e 20 20 31 30 30 20 70 61 67   pages.  100 pag
354c0 65 20 31 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70  e 1 */..  if( *p
354d0 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  RC ) return;.  a
354e0 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26  ssert( idx>=0 &&
354f0 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c   idx<pPage->nCel
35500 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  l );.  assert( C
35510 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 73 7a 3d  ORRUPT_DB || sz=
35520 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c  =cellSize(pPage,
35530 20 69 64 78 29 20 29 3b 0a 20 20 61 73 73 65 72   idx) );.  asser
35540 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
35550 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
35560 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
35570 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
35580 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
35590 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
355a0 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  .  data = pPage-
355b0 3e 61 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20  >aData;.  ptr = 
355c0 26 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78  &pPage->aCellIdx
355d0 5b 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20  [2*idx];.  pc = 
355e0 67 65 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20  get2byte(ptr);. 
355f0 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
35600 72 4f 66 66 73 65 74 3b 0a 20 20 74 65 73 74 63  rOffset;.  testc
35610 61 73 65 28 20 70 63 3d 3d 67 65 74 32 62 79 74  ase( pc==get2byt
35620 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20  e(&data[hdr+5]) 
35630 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
35640 63 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e 70 42 74  c+sz==pPage->pBt
35650 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
35660 20 20 69 66 28 20 70 63 20 3c 20 28 75 33 32 29    if( pc < (u32)
35670 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
35680 64 72 2b 35 5d 29 20 7c 7c 20 70 63 2b 73 7a 20  dr+5]) || pc+sz 
35690 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  > pPage->pBt->us
356a0 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
356b0 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f  *pRC = SQLITE_CO
356c0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
356d0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63  return;.  }.  rc
356e0 20 3d 20 66 72 65 65 53 70 61 63 65 28 70 50 61   = freeSpace(pPa
356f0 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69  ge, pc, sz);.  i
35700 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 52  f( rc ){.    *pR
35710 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75  C = rc;.    retu
35720 72 6e 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d  rn;.  }.  pPage-
35730 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 69 66 28 20  >nCell--;.  if( 
35740 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  pPage->nCell==0 
35750 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64  ){.    memset(&d
35760 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34  ata[hdr+1], 0, 4
35770 29 3b 0a 20 20 20 20 64 61 74 61 5b 68 64 72 2b  );.    data[hdr+
35780 37 5d 20 3d 20 30 3b 0a 20 20 20 20 70 75 74 32  7] = 0;.    put2
35790 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
357a0 5d 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  ], pPage->pBt->u
357b0 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20  sableSize);.    
357c0 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70  pPage->nFree = p
357d0 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
357e0 65 53 69 7a 65 20 2d 20 70 50 61 67 65 2d 3e 68  eSize - pPage->h
357f0 64 72 4f 66 66 73 65 74 0a 20 20 20 20 20 20 20  drOffset.       
35800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35810 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  - pPage->childPt
35820 72 53 69 7a 65 20 2d 20 38 3b 0a 20 20 7d 65 6c  rSize - 8;.  }el
35830 73 65 7b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28  se{.    memmove(
35840 70 74 72 2c 20 70 74 72 2b 32 2c 20 32 2a 28 70  ptr, ptr+2, 2*(p
35850 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 69 64  Page->nCell - id
35860 78 29 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  x));.    put2byt
35870 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20  e(&data[hdr+3], 
35880 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20  pPage->nCell);. 
35890 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20     pPage->nFree 
358a0 2b 3d 20 32 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  += 2;.  }.}../*.
358b0 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20  ** Insert a new 
358c0 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61 74  cell on pPage at
358d0 20 63 65 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e   cell index "i".
358e0 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74    pCell points t
358f0 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  o the.** content
35900 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a   of the cell..**
35910 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20  .** If the cell 
35920 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69 74  content will fit
35930 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68   on the page, th
35940 65 6e 20 70 75 74 20 69 74 20 74 68 65 72 65 2e  en put it there.
35950 20 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20    If it.** will 
35960 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e 20 6d 61  not fit, then ma
35970 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
35980 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e   cell content in
35990 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70  to pTemp if.** p
359a0 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c  Temp is not null
359b0 2e 20 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  .  Regardless of
359c0 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65   pTemp, allocate
359d0 20 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20   a new entry.** 
359e0 69 6e 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c  in pPage->apOvfl
359f0 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74 20 70  [] and make it p
35a00 6f 69 6e 74 20 74 6f 20 74 68 65 20 63 65 6c 6c  oint to the cell
35a10 20 63 6f 6e 74 65 6e 74 20 28 65 69 74 68 65 72   content (either
35a20 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72 20  .** in pTemp or 
35a30 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 43 65  the original pCe
35a40 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72 65 63  ll) and also rec
35a50 6f 72 64 20 69 74 73 20 69 6e 64 65 78 2e 20 0a  ord its index. .
35a60 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20  ** Allocating a 
35a70 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70 50 61  new entry in pPa
35a80 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c  ge->aCell[] impl
35a90 69 65 73 20 74 68 61 74 20 0a 2a 2a 20 70 50 61  ies that .** pPa
35aa0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73  ge->nOverflow is
35ab0 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a   incremented..**
35ac0 0a 2a 2a 20 2a 70 52 43 20 6d 75 73 74 20 62 65  .** *pRC must be
35ad0 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20   SQLITE_OK when 
35ae0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
35af0 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
35b00 63 20 76 6f 69 64 20 69 6e 73 65 72 74 43 65 6c  c void insertCel
35b10 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  l(.  MemPage *pP
35b20 61 67 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69  age,   /* Page i
35b30 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61 72 65  nto which we are
35b40 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e   copying */.  in
35b50 74 20 69 2c 20 20 20 20 20 20 20 20 20 20 20 20  t i,            
35b60 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f  /* New cell beco
35b70 6d 65 73 20 74 68 65 20 69 2d 74 68 20 63 65 6c  mes the i-th cel
35b80 6c 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f  l of the page */
35b90 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20  .  u8 *pCell,   
35ba0 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20       /* Content 
35bb0 6f 66 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20  of the new cell 
35bc0 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20 20  */.  int sz,    
35bd0 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
35be0 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43  of content in pC
35bf0 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65  ell */.  u8 *pTe
35c00 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65  mp,        /* Te
35c10 6d 70 20 73 74 6f 72 61 67 65 20 73 70 61 63 65  mp storage space
35c20 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e   for pCell, if n
35c30 65 65 64 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20  eeded */.  Pgno 
35c40 69 43 68 69 6c 64 2c 20 20 20 20 20 20 2f 2a 20  iChild,      /* 
35c50 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70  If non-zero, rep
35c60 6c 61 63 65 20 66 69 72 73 74 20 34 20 62 79 74  lace first 4 byt
35c70 65 73 20 77 69 74 68 20 74 68 69 73 20 76 61 6c  es with this val
35c80 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 43  ue */.  int *pRC
35c90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61            /* Rea
35ca0 64 20 61 6e 64 20 77 72 69 74 65 20 72 65 74 75  d and write retu
35cb0 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 68 65 72  rn code from her
35cc0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64  e */.){.  int id
35cd0 78 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 57  x = 0;      /* W
35ce0 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e 65  here to write ne
35cf0 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  w cell content i
35d00 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
35d10 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  t j;            
35d20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
35d30 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20  */.  u8 *data;  
35d40 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
35d50 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 77 68 6f  ntent of the who
35d60 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  le page */.  u8 
35d70 2a 70 49 6e 73 3b 20 20 20 20 20 20 20 20 20 2f  *pIns;         /
35d80 2a 20 54 68 65 20 70 6f 69 6e 74 20 69 6e 20 70  * The point in p
35d90 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 5d  Page->aCellIdx[]
35da0 20 77 68 65 72 65 20 6e 6f 20 63 65 6c 6c 20 69   where no cell i
35db0 6e 73 65 72 74 65 64 20 2a 2f 0a 0a 20 20 61 73  nserted */..  as
35dc0 73 65 72 74 28 20 2a 70 52 43 3d 3d 53 51 4c 49  sert( *pRC==SQLI
35dd0 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72  TE_OK );.  asser
35de0 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50  t( i>=0 && i<=pP
35df0 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65  age->nCell+pPage
35e00 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20  ->nOverflow );. 
35e10 20 61 73 73 65 72 74 28 20 4d 58 5f 43 45 4c 4c   assert( MX_CELL
35e20 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 31 30  (pPage->pBt)<=10
35e30 39 32 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  921 );.  assert(
35e40 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d   pPage->nCell<=M
35e50 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42  X_CELL(pPage->pB
35e60 74 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  t) || CORRUPT_DB
35e70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
35e80 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d  age->nOverflow<=
35e90 41 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d  ArraySize(pPage-
35ea0 3e 61 70 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73  >apOvfl) );.  as
35eb0 73 65 72 74 28 20 41 72 72 61 79 53 69 7a 65 28  sert( ArraySize(
35ec0 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 3d 3d  pPage->apOvfl)==
35ed0 41 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d  ArraySize(pPage-
35ee0 3e 61 69 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73  >aiOvfl) );.  as
35ef0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
35f00 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
35f10 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
35f20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 73 68 6f   /* The cell sho
35f30 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 20  uld normally be 
35f40 73 69 7a 65 64 20 63 6f 72 72 65 63 74 6c 79 2e  sized correctly.
35f50 20 20 48 6f 77 65 76 65 72 2c 20 77 68 65 6e 20    However, when 
35f60 6d 6f 76 69 6e 67 20 61 0a 20 20 2a 2a 20 6d 61  moving a.  ** ma
35f70 6c 66 6f 72 6d 65 64 20 63 65 6c 6c 20 66 72 6f  lformed cell fro
35f80 6d 20 61 20 6c 65 61 66 20 70 61 67 65 20 74 6f  m a leaf page to
35f90 20 61 6e 20 69 6e 74 65 72 69 6f 72 20 70 61 67   an interior pag
35fa0 65 2c 20 69 66 20 74 68 65 20 63 65 6c 6c 20 73  e, if the cell s
35fb0 69 7a 65 0a 20 20 2a 2a 20 77 61 6e 74 65 64 20  ize.  ** wanted 
35fc0 74 6f 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20  to be less than 
35fd0 34 20 62 75 74 20 67 6f 74 20 72 6f 75 6e 64 65  4 but got rounde
35fe0 64 20 75 70 20 74 6f 20 34 20 6f 6e 20 74 68 65  d up to 4 on the
35ff0 20 6c 65 61 66 2c 20 74 68 65 6e 20 73 69 7a 65   leaf, then size
36000 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 6c  .  ** might be l
36010 65 73 73 20 74 68 61 6e 20 38 20 28 6c 65 61 66  ess than 8 (leaf
36020 2d 73 69 7a 65 20 2b 20 70 6f 69 6e 74 65 72 29  -size + pointer)
36030 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 69 6f 72   on the interior
36040 20 6e 6f 64 65 2e 20 20 48 65 6e 63 65 0a 20 20   node.  Hence.  
36050 2a 2a 20 74 68 65 20 74 65 72 6d 20 61 66 74 65  ** the term afte
36060 72 20 74 68 65 20 7c 7c 20 69 6e 20 74 68 65 20  r the || in the 
36070 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
36080 28 29 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  (). */.  assert(
36090 20 73 7a 3d 3d 70 50 61 67 65 2d 3e 78 43 65 6c   sz==pPage->xCel
360a0 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 70 43 65  lSize(pPage, pCe
360b0 6c 6c 29 20 7c 7c 20 28 73 7a 3d 3d 38 20 26 26  ll) || (sz==8 &&
360c0 20 69 43 68 69 6c 64 3e 30 29 20 29 3b 0a 20 20   iChild>0) );.  
360d0 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  if( pPage->nOver
360e0 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61  flow || sz+2>pPa
360f0 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20  ge->nFree ){.   
36100 20 69 66 28 20 70 54 65 6d 70 20 29 7b 0a 20 20   if( pTemp ){.  
36110 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70      memcpy(pTemp
36120 2c 20 70 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20 20  , pCell, sz);.  
36130 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d      pCell = pTem
36140 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  p;.    }.    if(
36150 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20   iChild ){.     
36160 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c   put4byte(pCell,
36170 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a   iChild);.    }.
36180 20 20 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e      j = pPage->n
36190 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20  Overflow++;.    
361a0 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 61 67  /* Comparison ag
361b0 61 69 6e 73 74 20 41 72 72 61 79 53 69 7a 65 2d  ainst ArraySize-
361c0 31 20 73 69 6e 63 65 20 77 65 20 68 6f 6c 64 20  1 since we hold 
361d0 62 61 63 6b 20 6f 6e 65 20 65 78 74 72 61 20 73  back one extra s
361e0 6c 6f 74 0a 20 20 20 20 2a 2a 20 61 73 20 61 20  lot.    ** as a 
361f0 63 6f 6e 74 69 6e 67 65 6e 63 79 2e 20 20 49 6e  contingency.  In
36200 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6e 65   other words, ne
36210 76 65 72 20 6e 65 65 64 20 6d 6f 72 65 20 74 68  ver need more th
36220 61 6e 20 33 20 6f 76 65 72 66 6c 6f 77 0a 20 20  an 3 overflow.  
36230 20 20 2a 2a 20 73 6c 6f 74 73 20 62 75 74 20 34    ** slots but 4
36240 20 61 72 65 20 61 6c 6c 6f 63 61 74 65 64 2c 20   are allocated, 
36250 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e  just to be safe.
36260 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
36270 6a 20 3c 20 41 72 72 61 79 53 69 7a 65 28 70 50  j < ArraySize(pP
36280 61 67 65 2d 3e 61 70 4f 76 66 6c 29 2d 31 20 29  age->apOvfl)-1 )
36290 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 70 4f  ;.    pPage->apO
362a0 76 66 6c 5b 6a 5d 20 3d 20 70 43 65 6c 6c 3b 0a  vfl[j] = pCell;.
362b0 20 20 20 20 70 50 61 67 65 2d 3e 61 69 4f 76 66      pPage->aiOvf
362c0 6c 5b 6a 5d 20 3d 20 28 75 31 36 29 69 3b 0a 0a  l[j] = (u16)i;..
362d0 20 20 20 20 2f 2a 20 57 68 65 6e 20 6d 75 6c 74      /* When mult
362e0 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 73 20 6f  iple overflows o
362f0 63 63 75 72 2c 20 74 68 65 79 20 61 72 65 20 61  ccur, they are a
36300 6c 77 61 79 73 20 73 65 71 75 65 6e 74 69 61 6c  lways sequential
36310 20 61 6e 64 20 69 6e 0a 20 20 20 20 2a 2a 20 73   and in.    ** s
36320 6f 72 74 65 64 20 6f 72 64 65 72 2e 20 20 54 68  orted order.  Th
36330 69 73 20 69 6e 76 61 72 69 61 6e 74 73 20 61 72  is invariants ar
36340 69 73 65 20 62 65 63 61 75 73 65 20 6d 75 6c 74  ise because mult
36350 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 73 20 63  iple overflows c
36360 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 6f  an.    ** only o
36370 63 63 75 72 20 77 68 65 6e 20 69 6e 73 65 72 74  ccur when insert
36380 69 6e 67 20 64 69 76 69 64 65 72 20 63 65 6c 6c  ing divider cell
36390 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e  s into the paren
363a0 74 20 70 61 67 65 20 64 75 72 69 6e 67 0a 20 20  t page during.  
363b0 20 20 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 2c 20    ** balancing, 
363c0 61 6e 64 20 74 68 65 20 64 69 76 69 64 65 72 73  and the dividers
363d0 20 61 72 65 20 61 64 6a 61 63 65 6e 74 20 61 6e   are adjacent an
363e0 64 20 73 6f 72 74 65 64 2e 0a 20 20 20 20 2a 2f  d sorted..    */
363f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d  .    assert( j==
36400 30 20 7c 7c 20 70 50 61 67 65 2d 3e 61 69 4f 76  0 || pPage->aiOv
36410 66 6c 5b 6a 2d 31 5d 3c 28 75 31 36 29 69 20 29  fl[j-1]<(u16)i )
36420 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 73 20 69  ; /* Overflows i
36430 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 20 2a  n sorted order *
36440 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d  /.    assert( j=
36450 3d 30 20 7c 7c 20 69 3d 3d 70 50 61 67 65 2d 3e  =0 || i==pPage->
36460 61 69 4f 76 66 6c 5b 6a 2d 31 5d 2b 31 20 29 3b  aiOvfl[j-1]+1 );
36470 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 73 20     /* Overflows 
36480 61 72 65 20 73 65 71 75 65 6e 74 69 61 6c 20 2a  are sequential *
36490 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  /.  }else{.    i
364a0 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  nt rc = sqlite3P
364b0 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
364c0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
364d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
364e0 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d   ){.      *pRC =
364f0 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72   rc;.      retur
36500 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  n;.    }.    ass
36510 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
36520 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
36530 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
36540 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65      data = pPage
36550 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 61 73 73  ->aData;.    ass
36560 65 72 74 28 20 26 64 61 74 61 5b 70 50 61 67 65  ert( &data[pPage
36570 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 5d 3d 3d 70  ->cellOffset]==p
36580 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 29  Page->aCellIdx )
36590 3b 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63  ;.    rc = alloc
365a0 61 74 65 53 70 61 63 65 28 70 50 61 67 65 2c 20  ateSpace(pPage, 
365b0 73 7a 2c 20 26 69 64 78 29 3b 0a 20 20 20 20 69  sz, &idx);.    i
365c0 66 28 20 72 63 20 29 7b 20 2a 70 52 43 20 3d 20  f( rc ){ *pRC = 
365d0 72 63 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20  rc; return; }.  
365e0 20 20 2f 2a 20 54 68 65 20 61 6c 6c 6f 63 61 74    /* The allocat
365f0 65 53 70 61 63 65 28 29 20 72 6f 75 74 69 6e 65  eSpace() routine
36600 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 65 20   guarantees the 
36610 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 70 65 72  following proper
36620 74 69 65 73 0a 20 20 20 20 2a 2a 20 69 66 20 69  ties.    ** if i
36630 74 20 72 65 74 75 72 6e 73 20 73 75 63 63 65 73  t returns succes
36640 73 66 75 6c 6c 79 20 2a 2f 0a 20 20 20 20 61 73  sfully */.    as
36650 73 65 72 74 28 20 69 64 78 20 3e 3d 20 30 20 29  sert( idx >= 0 )
36660 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64  ;.    assert( id
36670 78 20 3e 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c  x >= pPage->cell
36680 4f 66 66 73 65 74 2b 32 2a 70 50 61 67 65 2d 3e  Offset+2*pPage->
36690 6e 43 65 6c 6c 2b 32 20 7c 7c 20 43 4f 52 52 55  nCell+2 || CORRU
366a0 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 61 73 73  PT_DB );.    ass
366b0 65 72 74 28 20 69 64 78 2b 73 7a 20 3c 3d 20 28  ert( idx+sz <= (
366c0 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e  int)pPage->pBt->
366d0 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
366e0 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d    pPage->nFree -
366f0 3d 20 28 75 31 36 29 28 32 20 2b 20 73 7a 29 3b  = (u16)(2 + sz);
36700 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74  .    memcpy(&dat
36710 61 5b 69 64 78 5d 2c 20 70 43 65 6c 6c 2c 20 73  a[idx], pCell, s
36720 7a 29 3b 0a 20 20 20 20 69 66 28 20 69 43 68 69  z);.    if( iChi
36730 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34  ld ){.      put4
36740 62 79 74 65 28 26 64 61 74 61 5b 69 64 78 5d 2c  byte(&data[idx],
36750 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a   iChild);.    }.
36760 20 20 20 20 70 49 6e 73 20 3d 20 70 50 61 67 65      pIns = pPage
36770 2d 3e 61 43 65 6c 6c 49 64 78 20 2b 20 69 2a 32  ->aCellIdx + i*2
36780 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 49  ;.    memmove(pI
36790 6e 73 2b 32 2c 20 70 49 6e 73 2c 20 32 2a 28 70  ns+2, pIns, 2*(p
367a0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 69 29  Page->nCell - i)
367b0 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
367c0 70 49 6e 73 2c 20 69 64 78 29 3b 0a 20 20 20 20  pIns, idx);.    
367d0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a  pPage->nCell++;.
367e0 20 20 20 20 2f 2a 20 69 6e 63 72 65 6d 65 6e 74      /* increment
367f0 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 20   the cell count 
36800 2a 2f 0a 20 20 20 20 69 66 28 20 28 2b 2b 64 61  */.    if( (++da
36810 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
36820 73 65 74 2b 34 5d 29 3d 3d 30 20 29 20 64 61 74  set+4])==0 ) dat
36830 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
36840 65 74 2b 33 5d 2b 2b 3b 0a 20 20 20 20 61 73 73  et+3]++;.    ass
36850 65 72 74 28 20 67 65 74 32 62 79 74 65 28 26 64  ert( get2byte(&d
36860 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
36870 66 73 65 74 2b 33 5d 29 3d 3d 70 50 61 67 65 2d  fset+3])==pPage-
36880 3e 6e 43 65 6c 6c 20 29 3b 0a 23 69 66 6e 64 65  >nCell );.#ifnde
36890 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
368a0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
368b0 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61 75 74   pPage->pBt->aut
368c0 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
368d0 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d 61 79   /* The cell may
368e0 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69 6e 74   contain a point
368f0 65 72 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  er to an overflo
36900 77 20 70 61 67 65 2e 20 49 66 20 73 6f 2c 20 77  w page. If so, w
36910 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  rite.      ** th
36920 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  e entry for the 
36930 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
36940 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  to the pointer m
36950 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ap..      */.   
36960 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c     ptrmapPutOvfl
36970 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
36980 2c 20 70 52 43 29 3b 0a 20 20 20 20 7d 0a 23 65  , pRC);.    }.#e
36990 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ndif.  }.}../*.*
369a0 2a 20 41 20 43 65 6c 6c 41 72 72 61 79 20 6f 62  * A CellArray ob
369b0 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73 20 61 20  ject contains a 
369c0 63 61 63 68 65 20 6f 66 20 70 6f 69 6e 74 65 72  cache of pointer
369d0 73 20 61 6e 64 20 73 69 7a 65 73 20 66 6f 72 20  s and sizes for 
369e0 61 0a 2a 2a 20 63 6f 6e 73 65 63 75 74 69 76 65  a.** consecutive
369f0 20 73 65 71 75 65 6e 63 65 20 6f 66 20 63 65 6c   sequence of cel
36a00 6c 73 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  ls that might be
36a10 20 68 65 6c 64 20 6f 6e 20 6d 75 6c 74 69 70 6c   held on multipl
36a20 65 20 70 61 67 65 73 2e 0a 2a 2f 0a 74 79 70 65  e pages..*/.type
36a30 64 65 66 20 73 74 72 75 63 74 20 43 65 6c 6c 41  def struct CellA
36a40 72 72 61 79 20 43 65 6c 6c 41 72 72 61 79 3b 0a  rray CellArray;.
36a50 73 74 72 75 63 74 20 43 65 6c 6c 41 72 72 61 79  struct CellArray
36a60 20 7b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20   {.  int nCell; 
36a70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36a80 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
36a90 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20  in apCell[] */. 
36aa0 20 4d 65 6d 50 61 67 65 20 2a 70 52 65 66 3b 20   MemPage *pRef; 
36ab0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 66 65           /* Refe
36ac0 72 65 6e 63 65 20 70 61 67 65 20 2a 2f 0a 20 20  rence page */.  
36ad0 75 38 20 2a 2a 61 70 43 65 6c 6c 3b 20 20 20 20  u8 **apCell;    
36ae0 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63          /* All c
36af0 65 6c 6c 73 20 62 65 67 69 6e 20 62 61 6c 61 6e  ells begin balan
36b00 63 65 64 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a  ced */.  u16 *sz
36b10 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
36b20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f   /* Local size o
36b30 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61  f all cells in a
36b40 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 7d 3b 0a 0a 2f  pCell[] */.};../
36b50 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  *.** Make sure t
36b60 68 65 20 63 65 6c 6c 20 73 69 7a 65 73 20 61 74  he cell sizes at
36b70 20 69 64 78 2c 20 69 64 78 2b 31 2c 20 2e 2e 2e   idx, idx+1, ...
36b80 2c 20 69 64 78 2b 4e 2d 31 20 68 61 76 65 20 62  , idx+N-1 have b
36b90 65 65 6e 0a 2a 2a 20 63 6f 6d 70 75 74 65 64 2e  een.** computed.
36ba0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
36bb0 70 6f 70 75 6c 61 74 65 43 65 6c 6c 43 61 63 68  populateCellCach
36bc0 65 28 43 65 6c 6c 41 72 72 61 79 20 2a 70 2c 20  e(CellArray *p, 
36bd0 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 4e 29 7b  int idx, int N){
36be0 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d  .  assert( idx>=
36bf0 30 20 26 26 20 69 64 78 2b 4e 3c 3d 70 2d 3e 6e  0 && idx+N<=p->n
36c00 43 65 6c 6c 20 29 3b 0a 20 20 77 68 69 6c 65 28  Cell );.  while(
36c10 20 4e 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65   N>0 ){.    asse
36c20 72 74 28 20 70 2d 3e 61 70 43 65 6c 6c 5b 69 64  rt( p->apCell[id
36c30 78 5d 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  x]!=0 );.    if(
36c40 20 70 2d 3e 73 7a 43 65 6c 6c 5b 69 64 78 5d 3d   p->szCell[idx]=
36c50 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73  =0 ){.      p->s
36c60 7a 43 65 6c 6c 5b 69 64 78 5d 20 3d 20 70 2d 3e  zCell[idx] = p->
36c70 70 52 65 66 2d 3e 78 43 65 6c 6c 53 69 7a 65 28  pRef->xCellSize(
36c80 70 2d 3e 70 52 65 66 2c 20 70 2d 3e 61 70 43 65  p->pRef, p->apCe
36c90 6c 6c 5b 69 64 78 5d 29 3b 0a 20 20 20 20 7d 65  ll[idx]);.    }e
36ca0 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
36cb0 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
36cc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
36cd0 2d 3e 73 7a 43 65 6c 6c 5b 69 64 78 5d 3d 3d 70  ->szCell[idx]==p
36ce0 2d 3e 70 52 65 66 2d 3e 78 43 65 6c 6c 53 69 7a  ->pRef->xCellSiz
36cf0 65 28 70 2d 3e 70 52 65 66 2c 20 70 2d 3e 61 70  e(p->pRef, p->ap
36d00 43 65 6c 6c 5b 69 64 78 5d 29 20 29 3b 0a 20 20  Cell[idx]) );.  
36d10 20 20 7d 0a 20 20 20 20 69 64 78 2b 2b 3b 0a 20    }.    idx++;. 
36d20 20 20 20 4e 2d 2d 3b 0a 20 20 7d 0a 7d 0a 0a 2f     N--;.  }.}../
36d30 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
36d40 73 69 7a 65 20 6f 66 20 74 68 65 20 4e 74 68 20  size of the Nth 
36d50 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 63  element of the c
36d60 65 6c 6c 20 61 72 72 61 79 0a 2a 2f 0a 73 74 61  ell array.*/.sta
36d70 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
36d80 49 4e 45 20 75 31 36 20 63 6f 6d 70 75 74 65 43  INE u16 computeC
36d90 65 6c 6c 53 69 7a 65 28 43 65 6c 6c 41 72 72 61  ellSize(CellArra
36da0 79 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20  y *p, int N){.  
36db0 61 73 73 65 72 74 28 20 4e 3e 3d 30 20 26 26 20  assert( N>=0 && 
36dc0 4e 3c 70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  N<p->nCell );.  
36dd0 61 73 73 65 72 74 28 20 70 2d 3e 73 7a 43 65 6c  assert( p->szCel
36de0 6c 5b 4e 5d 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e  l[N]==0 );.  p->
36df0 73 7a 43 65 6c 6c 5b 4e 5d 20 3d 20 70 2d 3e 70  szCell[N] = p->p
36e00 52 65 66 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70  Ref->xCellSize(p
36e10 2d 3e 70 52 65 66 2c 20 70 2d 3e 61 70 43 65 6c  ->pRef, p->apCel
36e20 6c 5b 4e 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20  l[N]);.  return 
36e30 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 3b 0a 7d 0a  p->szCell[N];.}.
36e40 73 74 61 74 69 63 20 75 31 36 20 63 61 63 68 65  static u16 cache
36e50 64 43 65 6c 6c 53 69 7a 65 28 43 65 6c 6c 41 72  dCellSize(CellAr
36e60 72 61 79 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a  ray *p, int N){.
36e70 20 20 61 73 73 65 72 74 28 20 4e 3e 3d 30 20 26    assert( N>=0 &
36e80 26 20 4e 3c 70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  & N<p->nCell );.
36e90 20 20 69 66 28 20 70 2d 3e 73 7a 43 65 6c 6c 5b    if( p->szCell[
36ea0 4e 5d 20 29 20 72 65 74 75 72 6e 20 70 2d 3e 73  N] ) return p->s
36eb0 7a 43 65 6c 6c 5b 4e 5d 3b 0a 20 20 72 65 74 75  zCell[N];.  retu
36ec0 72 6e 20 63 6f 6d 70 75 74 65 43 65 6c 6c 53 69  rn computeCellSi
36ed0 7a 65 28 70 2c 20 4e 29 3b 0a 7d 0a 0a 2f 2a 0a  ze(p, N);.}../*.
36ee0 2a 2a 20 41 72 72 61 79 20 61 70 43 65 6c 6c 5b  ** Array apCell[
36ef0 5d 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74  ] contains point
36f00 65 72 73 20 74 6f 20 6e 43 65 6c 6c 20 62 2d 74  ers to nCell b-t
36f10 72 65 65 20 70 61 67 65 20 63 65 6c 6c 73 2e 20  ree page cells. 
36f20 54 68 65 20 0a 2a 2a 20 73 7a 43 65 6c 6c 5b 5d  The .** szCell[]
36f30 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 20   array contains 
36f40 74 68 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65  the size in byte
36f50 73 20 6f 66 20 65 61 63 68 20 63 65 6c 6c 2e 20  s of each cell. 
36f60 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  This function.**
36f70 20 72 65 70 6c 61 63 65 73 20 74 68 65 20 63 75   replaces the cu
36f80 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f  rrent contents o
36f90 66 20 70 61 67 65 20 70 50 67 20 77 69 74 68 20  f page pPg with 
36fa0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
36fb0 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 61 72 72 61  the cell.** arra
36fc0 79 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 20 6f 66  y..**.** Some of
36fd0 20 74 68 65 20 63 65 6c 6c 73 20 69 6e 20 61 70   the cells in ap
36fe0 43 65 6c 6c 5b 5d 20 6d 61 79 20 63 75 72 72 65  Cell[] may curre
36ff0 6e 74 6c 79 20 62 65 20 73 74 6f 72 65 64 20 69  ntly be stored i
37000 6e 20 70 50 67 2e 20 54 68 69 73 0a 2a 2a 20 66  n pPg. This.** f
37010 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 61 72  unction works ar
37020 6f 75 6e 64 20 70 72 6f 62 6c 65 6d 73 20 63 61  ound problems ca
37030 75 73 65 64 20 62 79 20 74 68 69 73 20 62 79 20  used by this by 
37040 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 20 6f 66  making a copy of
37050 20 61 6e 79 20 0a 2a 2a 20 73 75 63 68 20 63 65   any .** such ce
37060 6c 6c 73 20 62 65 66 6f 72 65 20 6f 76 65 72 77  lls before overw
37070 72 69 74 69 6e 67 20 74 68 65 20 70 61 67 65 20  riting the page 
37080 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  data..**.** The 
37090 4d 65 6d 50 61 67 65 2e 6e 46 72 65 65 20 66 69  MemPage.nFree fi
370a0 65 6c 64 20 69 73 20 69 6e 76 61 6c 69 64 61 74  eld is invalidat
370b0 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
370c0 69 6f 6e 2e 20 49 74 20 69 73 20 74 68 65 20 0a  ion. It is the .
370d0 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  ** responsibilit
370e0 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
370f0 74 6f 20 73 65 74 20 69 74 20 63 6f 72 72 65 63  to set it correc
37100 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tly..*/.static i
37110 6e 74 20 72 65 62 75 69 6c 64 50 61 67 65 28 0a  nt rebuildPage(.
37120 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20    MemPage *pPg, 
37130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37140 20 20 2f 2a 20 45 64 69 74 20 74 68 69 73 20 70    /* Edit this p
37150 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  age */.  int nCe
37160 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
37170 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 61           /* Fina
37180 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  l number of cell
37190 73 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20 75  s on page */.  u
371a0 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20  8 **apCell,     
371b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
371c0 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 73  * Array of cells
371d0 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c   */.  u16 *szCel
371e0 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l               
371f0 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
37200 66 20 63 65 6c 6c 20 73 69 7a 65 73 20 2a 2f 0a  f cell sizes */.
37210 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68  ){.  const int h
37220 64 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f 66 66  dr = pPg->hdrOff
37230 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  set;          /*
37240 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65   Offset of heade
37250 72 20 6f 6e 20 70 50 67 20 2a 2f 0a 20 20 75 38  r on pPg */.  u8
37260 20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61 20 3d   * const aData =
37270 20 70 50 67 2d 3e 61 44 61 74 61 3b 20 20 20 20   pPg->aData;    
37280 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
37290 72 20 74 6f 20 64 61 74 61 20 66 6f 72 20 70 50  r to data for pP
372a0 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74  g */.  const int
372b0 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50   usableSize = pP
372c0 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  g->pBt->usableSi
372d0 7a 65 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74  ze;.  u8 * const
372e0 20 70 45 6e 64 20 3d 20 26 61 44 61 74 61 5b 75   pEnd = &aData[u
372f0 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 69 6e  sableSize];.  in
37300 74 20 69 3b 0a 20 20 75 38 20 2a 70 43 65 6c 6c  t i;.  u8 *pCell
37310 70 74 72 20 3d 20 70 50 67 2d 3e 61 43 65 6c 6c  ptr = pPg->aCell
37320 49 64 78 3b 0a 20 20 75 38 20 2a 70 54 6d 70 20  Idx;.  u8 *pTmp 
37330 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 65  = sqlite3PagerTe
37340 6d 70 53 70 61 63 65 28 70 50 67 2d 3e 70 42 74  mpSpace(pPg->pBt
37350 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 75 38 20  ->pPager);.  u8 
37360 2a 70 44 61 74 61 3b 0a 0a 20 20 69 20 3d 20 67  *pData;..  i = g
37370 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 68  et2byte(&aData[h
37380 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79  dr+5]);.  memcpy
37390 28 26 70 54 6d 70 5b 69 5d 2c 20 26 61 44 61 74  (&pTmp[i], &aDat
373a0 61 5b 69 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65  a[i], usableSize
373b0 20 2d 20 69 29 3b 0a 0a 20 20 70 44 61 74 61 20   - i);..  pData 
373c0 3d 20 70 45 6e 64 3b 0a 20 20 66 6f 72 28 69 3d  = pEnd;.  for(i=
373d0 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
373e0 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20  {.    u8 *pCell 
373f0 3d 20 61 70 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20  = apCell[i];.   
37400 20 69 66 28 20 53 51 4c 49 54 45 5f 57 49 54 48   if( SQLITE_WITH
37410 49 4e 28 70 43 65 6c 6c 2c 61 44 61 74 61 2c 70  IN(pCell,aData,p
37420 45 6e 64 29 20 29 7b 0a 20 20 20 20 20 20 70 43  End) ){.      pC
37430 65 6c 6c 20 3d 20 26 70 54 6d 70 5b 70 43 65 6c  ell = &pTmp[pCel
37440 6c 20 2d 20 61 44 61 74 61 5d 3b 0a 20 20 20 20  l - aData];.    
37450 7d 0a 20 20 20 20 70 44 61 74 61 20 2d 3d 20 73  }.    pData -= s
37460 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 70 75  zCell[i];.    pu
37470 74 32 62 79 74 65 28 70 43 65 6c 6c 70 74 72 2c  t2byte(pCellptr,
37480 20 28 70 44 61 74 61 20 2d 20 61 44 61 74 61 29   (pData - aData)
37490 29 3b 0a 20 20 20 20 70 43 65 6c 6c 70 74 72 20  );.    pCellptr 
374a0 2b 3d 20 32 3b 0a 20 20 20 20 69 66 28 20 70 44  += 2;.    if( pD
374b0 61 74 61 20 3c 20 70 43 65 6c 6c 70 74 72 20 29  ata < pCellptr )
374c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
374d0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
374e0 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20 70   memcpy(pData, p
374f0 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 5b 69 5d 29  Cell, szCell[i])
37500 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 7a  ;.    assert( sz
37510 43 65 6c 6c 5b 69 5d 3d 3d 70 50 67 2d 3e 78 43  Cell[i]==pPg->xC
37520 65 6c 6c 53 69 7a 65 28 70 50 67 2c 20 70 43 65  ellSize(pPg, pCe
37530 6c 6c 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  ll) || CORRUPT_D
37540 42 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  B );.    testcas
37550 65 28 20 73 7a 43 65 6c 6c 5b 69 5d 21 3d 70 50  e( szCell[i]!=pP
37560 67 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 67  g->xCellSize(pPg
37570 2c 70 43 65 6c 6c 29 20 29 3b 0a 20 20 7d 0a 0a  ,pCell) );.  }..
37580 20 20 2f 2a 20 54 68 65 20 70 50 67 2d 3e 6e 46    /* The pPg->nF
37590 72 65 65 20 66 69 65 6c 64 20 69 73 20 6e 6f 77  ree field is now
375a0 20 73 65 74 20 69 6e 63 6f 72 72 65 63 74 6c 79   set incorrectly
375b0 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  . The caller wil
375c0 6c 20 66 69 78 20 69 74 2e 20 2a 2f 0a 20 20 70  l fix it. */.  p
375d0 50 67 2d 3e 6e 43 65 6c 6c 20 3d 20 6e 43 65 6c  Pg->nCell = nCel
375e0 6c 3b 0a 20 20 70 50 67 2d 3e 6e 4f 76 65 72 66  l;.  pPg->nOverf
375f0 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 70 75 74 32  low = 0;..  put2
37600 62 79 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b  byte(&aData[hdr+
37610 31 5d 2c 20 30 29 3b 0a 20 20 70 75 74 32 62 79  1], 0);.  put2by
37620 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b 33 5d  te(&aData[hdr+3]
37630 2c 20 70 50 67 2d 3e 6e 43 65 6c 6c 29 3b 0a 20  , pPg->nCell);. 
37640 20 70 75 74 32 62 79 74 65 28 26 61 44 61 74 61   put2byte(&aData
37650 5b 68 64 72 2b 35 5d 2c 20 70 44 61 74 61 20 2d  [hdr+5], pData -
37660 20 61 44 61 74 61 29 3b 0a 20 20 61 44 61 74 61   aData);.  aData
37670 5b 68 64 72 2b 37 5d 20 3d 20 30 78 30 30 3b 0a  [hdr+7] = 0x00;.
37680 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
37690 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72  OK;.}../*.** Arr
376a0 61 79 20 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74  ay apCell[] cont
376b0 61 69 6e 73 20 6e 43 65 6c 6c 20 70 6f 69 6e 74  ains nCell point
376c0 65 72 73 20 74 6f 20 62 2d 74 72 65 65 20 63 65  ers to b-tree ce
376d0 6c 6c 73 2e 20 41 72 72 61 79 20 73 7a 43 65 6c  lls. Array szCel
376e0 6c 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68  l.** contains th
376f0 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20  e size in bytes 
37700 6f 66 20 65 61 63 68 20 73 75 63 68 20 63 65 6c  of each such cel
37710 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  l. This function
37720 20 61 74 74 65 6d 70 74 73 20 74 6f 20 0a 2a 2a   attempts to .**
37730 20 61 64 64 20 74 68 65 20 63 65 6c 6c 73 20 73   add the cells s
37740 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61 72 72  tored in the arr
37750 61 79 20 74 6f 20 70 61 67 65 20 70 50 67 2e 20  ay to page pPg. 
37760 49 66 20 69 74 20 63 61 6e 6e 6f 74 20 28 62 65  If it cannot (be
37770 63 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61  cause .** the pa
37780 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 64  ge needs to be d
37790 65 66 72 61 67 6d 65 6e 74 65 64 20 62 65 66 6f  efragmented befo
377a0 72 65 20 74 68 65 20 63 65 6c 6c 73 20 77 69 6c  re the cells wil
377b0 6c 20 66 69 74 29 2c 20 6e 6f 6e 2d 7a 65 72 6f  l fit), non-zero
377c0 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e  .** is returned.
377d0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
377e0 68 65 20 63 65 6c 6c 73 20 61 72 65 20 61 64 64  he cells are add
377f0 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ed successfully,
37800 20 7a 65 72 6f 20 69 73 0a 2a 2a 20 72 65 74 75   zero is.** retu
37810 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75  rned..**.** Argu
37820 6d 65 6e 74 20 70 43 65 6c 6c 70 74 72 20 70 6f  ment pCellptr po
37830 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73  ints to the firs
37840 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 63  t entry in the c
37850 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72 61  ell-pointer arra
37860 79 0a 2a 2a 20 28 70 61 72 74 20 6f 66 20 70 61  y.** (part of pa
37870 67 65 20 70 50 67 29 20 74 6f 20 70 6f 70 75 6c  ge pPg) to popul
37880 61 74 65 2e 20 41 66 74 65 72 20 63 65 6c 6c 20  ate. After cell 
37890 61 70 43 65 6c 6c 5b 30 5d 20 69 73 20 77 72 69  apCell[0] is wri
378a0 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 70  tten to the.** p
378b0 61 67 65 20 62 6f 64 79 2c 20 61 20 31 36 2d 62  age body, a 16-b
378c0 69 74 20 6f 66 66 73 65 74 20 69 73 20 77 72 69  it offset is wri
378d0 74 74 65 6e 20 74 6f 20 70 43 65 6c 6c 70 74 72  tten to pCellptr
378e0 2e 20 41 6e 64 20 73 6f 20 6f 6e 2c 20 66 6f 72  . And so on, for
378f0 20 65 61 63 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e   each.** cell in
37900 20 74 68 65 20 61 72 72 61 79 2e 20 49 74 20 69   the array. It i
37910 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
37920 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
37930 65 72 20 74 6f 20 65 6e 73 75 72 65 0a 2a 2a 20  er to ensure.** 
37940 74 68 61 74 20 69 74 20 69 73 20 73 61 66 65 20  that it is safe 
37950 74 6f 20 6f 76 65 72 77 72 69 74 65 20 74 68 69  to overwrite thi
37960 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 63 65  s part of the ce
37970 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll-pointer array
37980 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
37990 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
379a0 6c 6c 65 64 2c 20 2a 70 70 44 61 74 61 20 70 6f  lled, *ppData po
379b0 69 6e 74 73 20 74 6f 20 74 68 65 20 73 74 61 72  ints to the star
379c0 74 20 6f 66 20 74 68 65 20 0a 2a 2a 20 63 6f 6e  t of the .** con
379d0 74 65 6e 74 20 61 72 65 61 20 6f 6e 20 70 61 67  tent area on pag
379e0 65 20 70 50 67 2e 20 49 66 20 74 68 65 20 73 69  e pPg. If the si
379f0 7a 65 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e  ze of the conten
37a00 74 20 61 72 65 61 20 69 73 20 65 78 74 65 6e 64  t area is extend
37a10 65 64 2c 0a 2a 2a 20 2a 70 70 44 61 74 61 20 69  ed,.** *ppData i
37a20 73 20 75 70 64 61 74 65 64 20 74 6f 20 70 6f 69  s updated to poi
37a30 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 73 74  nt to the new st
37a40 61 72 74 20 6f 66 20 74 68 65 20 63 6f 6e 74 65  art of the conte
37a50 6e 74 20 61 72 65 61 0a 2a 2a 20 62 65 66 6f 72  nt area.** befor
37a60 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
37a70 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 61 72 67 75  ** Finally, argu
37a80 6d 65 6e 74 20 70 42 65 67 69 6e 20 70 6f 69 6e  ment pBegin poin
37a90 74 73 20 74 6f 20 74 68 65 20 62 79 74 65 20 69  ts to the byte i
37aa0 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
37ab0 77 69 6e 67 20 74 68 65 0a 2a 2a 20 65 6e 64 20  wing the.** end 
37ac0 6f 66 20 74 68 65 20 73 70 61 63 65 20 72 65 71  of the space req
37ad0 75 69 72 65 64 20 62 79 20 74 68 69 73 20 70 61  uired by this pa
37ae0 67 65 20 66 6f 72 20 74 68 65 20 63 65 6c 6c 2d  ge for the cell-
37af0 70 6f 69 6e 74 65 72 20 61 72 65 61 20 28 66 6f  pointer area (fo
37b00 72 0a 2a 2a 20 61 6c 6c 20 63 65 6c 6c 73 20 2d  r.** all cells -
37b10 20 6e 6f 74 20 6a 75 73 74 20 74 68 6f 73 65 20   not just those 
37b20 69 6e 73 65 72 74 65 64 20 62 79 20 74 68 65 20  inserted by the 
37b30 63 75 72 72 65 6e 74 20 63 61 6c 6c 29 2e 20 49  current call). I
37b40 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a  f the content.**
37b50 20 61 72 65 61 20 6d 75 73 74 20 62 65 20 65 78   area must be ex
37b60 74 65 6e 64 65 64 20 74 6f 20 62 65 66 6f 72 65  tended to before
37b70 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f   this point in o
37b80 72 64 65 72 20 74 6f 20 61 63 63 6f 6d 6f 64 61  rder to accomoda
37b90 74 65 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c 73 20  te all.** cells 
37ba0 69 6e 20 61 70 43 65 6c 6c 5b 5d 2c 20 74 68 65  in apCell[], the
37bb0 6e 20 74 68 65 20 63 65 6c 6c 73 20 64 6f 20 6e  n the cells do n
37bc0 6f 74 20 66 69 74 20 61 6e 64 20 6e 6f 6e 2d 7a  ot fit and non-z
37bd0 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ero is returned.
37be0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
37bf0 61 67 65 49 6e 73 65 72 74 41 72 72 61 79 28 0a  ageInsertArray(.
37c00 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20    MemPage *pPg, 
37c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37c20 20 20 2f 2a 20 50 61 67 65 20 74 6f 20 61 64 64    /* Page to add
37c30 20 63 65 6c 6c 73 20 74 6f 20 2a 2f 0a 20 20 75   cells to */.  u
37c40 38 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 20  8 *pBegin,      
37c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
37c60 2a 20 45 6e 64 20 6f 66 20 63 65 6c 6c 2d 70 6f  * End of cell-po
37c70 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20  inter array */. 
37c80 20 75 38 20 2a 2a 70 70 44 61 74 61 2c 20 20 20   u8 **ppData,   
37c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37ca0 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 61 67 65   /* IN/OUT: Page
37cb0 20 63 6f 6e 74 65 6e 74 20 2d 61 72 65 61 20 70   content -area p
37cc0 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a  ointer */.  u8 *
37cd0 70 43 65 6c 6c 70 74 72 2c 20 20 20 20 20 20 20  pCellptr,       
37ce0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
37cf0 6f 69 6e 74 65 72 20 74 6f 20 63 65 6c 6c 2d 70  ointer to cell-p
37d00 6f 69 6e 74 65 72 20 61 72 65 61 20 2a 2f 0a 20  ointer area */. 
37d10 20 69 6e 74 20 69 46 69 72 73 74 2c 20 20 20 20   int iFirst,    
37d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37d30 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72   /* Index of fir
37d40 73 74 20 63 65 6c 6c 20 74 6f 20 61 64 64 20 2a  st cell to add *
37d50 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20  /.  int nCell,  
37d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37d70 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
37d80 20 63 65 6c 6c 73 20 74 6f 20 61 64 64 20 74 6f   cells to add to
37d90 20 70 50 67 20 2a 2f 0a 20 20 43 65 6c 6c 41 72   pPg */.  CellAr
37da0 72 61 79 20 2a 70 43 41 72 72 61 79 20 20 20 20  ray *pCArray    
37db0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
37dc0 61 79 20 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a 29  ay of cells */.)
37dd0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 38 20  {.  int i;.  u8 
37de0 2a 61 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44  *aData = pPg->aD
37df0 61 74 61 3b 0a 20 20 75 38 20 2a 70 44 61 74 61  ata;.  u8 *pData
37e00 20 3d 20 2a 70 70 44 61 74 61 3b 0a 20 20 69 6e   = *ppData;.  in
37e10 74 20 69 45 6e 64 20 3d 20 69 46 69 72 73 74 20  t iEnd = iFirst 
37e20 2b 20 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  + nCell;.  asser
37e30 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
37e40 20 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3d   pPg->hdrOffset=
37e50 3d 30 20 29 3b 20 20 20 20 2f 2a 20 4e 65 76 65  =0 );    /* Neve
37e60 72 20 63 61 6c 6c 65 64 20 6f 6e 20 70 61 67 65  r called on page
37e70 20 31 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 69 46   1 */.  for(i=iF
37e80 69 72 73 74 3b 20 69 3c 69 45 6e 64 3b 20 69 2b  irst; i<iEnd; i+
37e90 2b 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 2c 20  +){.    int sz, 
37ea0 72 63 3b 0a 20 20 20 20 75 38 20 2a 70 53 6c 6f  rc;.    u8 *pSlo
37eb0 74 3b 0a 20 20 20 20 73 7a 20 3d 20 63 61 63 68  t;.    sz = cach
37ec0 65 64 43 65 6c 6c 53 69 7a 65 28 70 43 41 72 72  edCellSize(pCArr
37ed0 61 79 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20  ay, i);.    if( 
37ee0 28 61 44 61 74 61 5b 31 5d 3d 3d 30 20 26 26 20  (aData[1]==0 && 
37ef0 61 44 61 74 61 5b 32 5d 3d 3d 30 29 20 7c 7c 20  aData[2]==0) || 
37f00 28 70 53 6c 6f 74 20 3d 20 70 61 67 65 46 69 6e  (pSlot = pageFin
37f10 64 53 6c 6f 74 28 70 50 67 2c 73 7a 2c 26 72 63  dSlot(pPg,sz,&rc
37f20 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ))==0 ){.      i
37f30 66 28 20 28 70 44 61 74 61 20 2d 20 70 42 65 67  f( (pData - pBeg
37f40 69 6e 29 3c 73 7a 20 29 20 72 65 74 75 72 6e 20  in)<sz ) return 
37f50 31 3b 0a 20 20 20 20 20 20 70 44 61 74 61 20 2d  1;.      pData -
37f60 3d 20 73 7a 3b 0a 20 20 20 20 20 20 70 53 6c 6f  = sz;.      pSlo
37f70 74 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 7d  t = pData;.    }
37f80 0a 20 20 20 20 2f 2a 20 70 53 6c 6f 74 20 61 6e  .    /* pSlot an
37f90 64 20 70 43 41 72 72 61 79 2d 3e 61 70 43 65 6c  d pCArray->apCel
37fa0 6c 5b 69 5d 20 77 69 6c 6c 20 6e 65 76 65 72 20  l[i] will never 
37fb0 6f 76 65 72 6c 61 70 20 6f 6e 20 61 20 77 65 6c  overlap on a wel
37fc0 6c 2d 66 6f 72 6d 65 64 0a 20 20 20 20 2a 2a 20  l-formed.    ** 
37fd0 64 61 74 61 62 61 73 65 2e 20 20 42 75 74 20 74  database.  But t
37fe0 68 65 79 20 6d 69 67 68 74 20 66 6f 72 20 61 20  hey might for a 
37ff0 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
38000 2e 20 20 48 65 6e 63 65 20 75 73 65 20 6d 65 6d  .  Hence use mem
38010 6d 6f 76 65 28 29 0a 20 20 20 20 2a 2a 20 73 69  move().    ** si
38020 6e 63 65 20 6d 65 6d 63 70 79 28 29 20 73 65 6e  nce memcpy() sen
38030 64 73 20 53 49 47 41 42 4f 52 54 20 77 69 74 68  ds SIGABORT with
38040 20 6f 76 65 72 6c 61 70 70 69 6e 67 20 62 75 66   overlapping buf
38050 66 65 72 73 20 6f 6e 20 4f 70 65 6e 42 53 44 20  fers on OpenBSD 
38060 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
38070 70 53 6c 6f 74 2b 73 7a 29 3c 3d 70 43 41 72 72  pSlot+sz)<=pCArr
38080 61 79 2d 3e 61 70 43 65 6c 6c 5b 69 5d 0a 20 20  ay->apCell[i].  
38090 20 20 20 20 20 20 20 7c 7c 20 70 53 6c 6f 74 3e         || pSlot>
380a0 3d 28 70 43 41 72 72 61 79 2d 3e 61 70 43 65 6c  =(pCArray->apCel
380b0 6c 5b 69 5d 2b 73 7a 29 0a 20 20 20 20 20 20 20  l[i]+sz).       
380c0 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20    || CORRUPT_DB 
380d0 29 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70  );.    memmove(p
380e0 53 6c 6f 74 2c 20 70 43 41 72 72 61 79 2d 3e 61  Slot, pCArray->a
380f0 70 43 65 6c 6c 5b 69 5d 2c 20 73 7a 29 3b 0a 20  pCell[i], sz);. 
38100 20 20 20 70 75 74 32 62 79 74 65 28 70 43 65 6c     put2byte(pCel
38110 6c 70 74 72 2c 20 28 70 53 6c 6f 74 20 2d 20 61  lptr, (pSlot - a
38120 44 61 74 61 29 29 3b 0a 20 20 20 20 70 43 65 6c  Data));.    pCel
38130 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20  lptr += 2;.  }. 
38140 20 2a 70 70 44 61 74 61 20 3d 20 70 44 61 74 61   *ppData = pData
38150 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
38160 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79 20 61 70 43  ./*.** Array apC
38170 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 6e  ell[] contains n
38180 43 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f  Cell pointers to
38190 20 62 2d 74 72 65 65 20 63 65 6c 6c 73 2e 20 41   b-tree cells. A
381a0 72 72 61 79 20 73 7a 43 65 6c 6c 20 0a 2a 2a 20  rray szCell .** 
381b0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a  contains the siz
381c0 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 65 61  e in bytes of ea
381d0 63 68 20 73 75 63 68 20 63 65 6c 6c 2e 20 54 68  ch such cell. Th
381e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 64 64 73  is function adds
381f0 20 74 68 65 0a 2a 2a 20 73 70 61 63 65 20 61 73   the.** space as
38200 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 61  sociated with ea
38210 63 68 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 61  ch cell in the a
38220 72 72 61 79 20 74 68 61 74 20 69 73 20 63 75 72  rray that is cur
38230 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 0a 2a  rently stored .*
38240 2a 20 77 69 74 68 69 6e 20 74 68 65 20 62 6f 64  * within the bod
38250 79 20 6f 66 20 70 50 67 20 74 6f 20 74 68 65 20  y of pPg to the 
38260 70 50 67 20 66 72 65 65 2d 6c 69 73 74 2e 20 54  pPg free-list. T
38270 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 73  he cell-pointers
38280 20 61 6e 64 20 6f 74 68 65 72 0a 2a 2a 20 66 69   and other.** fi
38290 65 6c 64 73 20 6f 66 20 74 68 65 20 70 61 67 65  elds of the page
382a0 20 61 72 65 20 6e 6f 74 20 75 70 64 61 74 65 64   are not updated
382b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
382c0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
382d0 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
382e0 66 20 63 65 6c 6c 73 20 61 64 64 65 64 20 74 6f  f cells added to
382f0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a   the free-list..
38300 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
38310 67 65 46 72 65 65 41 72 72 61 79 28 0a 20 20 4d  geFreeArray(.  M
38320 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 20 20 20  emPage *pPg,    
38330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
38340 2a 20 50 61 67 65 20 74 6f 20 65 64 69 74 20 2a  * Page to edit *
38350 2f 0a 20 20 69 6e 74 20 69 46 69 72 73 74 2c 20  /.  int iFirst, 
38360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38370 20 20 20 20 2f 2a 20 46 69 72 73 74 20 63 65 6c      /* First cel
38380 6c 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20  l to delete */. 
38390 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20   int nCell,     
383a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
383b0 20 2f 2a 20 43 65 6c 6c 73 20 74 6f 20 64 65 6c   /* Cells to del
383c0 65 74 65 20 2a 2f 0a 20 20 43 65 6c 6c 41 72 72  ete */.  CellArr
383d0 61 79 20 2a 70 43 41 72 72 61 79 20 20 20 20 20  ay *pCArray     
383e0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
383f0 79 20 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b  y of cells */.){
38400 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44  .  u8 * const aD
38410 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61  ata = pPg->aData
38420 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70  ;.  u8 * const p
38430 45 6e 64 20 3d 20 26 61 44 61 74 61 5b 70 50 67  End = &aData[pPg
38440 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
38450 65 5d 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74  e];.  u8 * const
38460 20 70 53 74 61 72 74 20 3d 20 26 61 44 61 74 61   pStart = &aData
38470 5b 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 20  [pPg->hdrOffset 
38480 2b 20 38 20