/ Hex Artifact Content
Login

Artifact 0d377e5769657d3ac2a1b6ba081ba77a128610d5:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0e90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0ea0: 44 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20  D_CACHE..#ifdef 
0eb0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
0ec0: 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  **** This functi
0ed0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
0ee0: 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73  as part of an as
0ef0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
0f00: 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63  . ***.**.** Chec
0f10: 6b 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72  k to see if pBtr
0f20: 65 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71  ee holds the req
0f30: 75 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72  uired locks to r
0f40: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20  ead or write to 
0f50: 74 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69  the .** table wi
0f60: 74 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f  th root page iRo
0f70: 6f 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69  ot.   Return 1 i
0f80: 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20  f it does and 0 
0f90: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  if not..**.** Fo
0fa0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
0fb0: 77 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62  writing to a tab
0fc0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
0fd0: 65 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20  e iRoot via .** 
0fe0: 42 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  Btree connection
0ff0: 20 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20   pBtree:.**.**  
1000: 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
1010: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1020: 6b 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c  k(pBtree, iRoot,
1030: 20 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20   0, WRITE_LOCK) 
1040: 29 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72  );.**.** When wr
1050: 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65  iting to an inde
1060: 78 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69  x that resides i
1070: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74  n a sharable dat
1080: 61 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63  abase, the .** c
1090: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76  aller should hav
10a0: 65 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64  e first obtained
10b0: 20 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69   a lock specifyi
10c0: 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ng the root page
10d0: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   of.** the corre
10e0: 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20  sponding table. 
10f0: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67  This makes thing
1100: 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d  s a bit more com
1110: 70 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20  plicated,.** as 
1120: 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61  this module trea
1130: 74 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73  ts each table as
1140: 20 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75   a separate stru
1150: 63 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d  cture. To determ
1160: 69 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ine.** the table
1170: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1180: 6f 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  o the index bein
1190: 67 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a  g written, this.
11a0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
11b0: 74 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67  to search throug
11c0: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  h the database s
11d0: 63 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73  chema..**.** Ins
11e0: 74 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f  tead of a lock o
11f0: 6e 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  n the table/inde
1200: 78 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  x rooted at page
1210: 20 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c   iRoot, the call
1220: 65 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61  er may.** hold a
1230: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
1240: 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20  he schema table 
1250: 28 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54  (root page 1). T
1260: 68 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61  his is also.** a
1270: 63 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  cceptable..*/.st
1280: 61 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72  atic int hasShar
1290: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
12a0: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
12b0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61  e,         /* Ha
12c0: 6e 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68  ndle that must h
12d0: 6f 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67  old lock */.  Pg
12e0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
12f0: 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1300: 65 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20  e of b-tree */. 
1310: 20 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20   int isIndex,   
1320: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1330: 69 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20  if iRoot is the 
1340: 72 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  root of an index
1350: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
1360: 20 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20   eLockType      
1370: 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
1380: 6c 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f  lock type (READ_
1390: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
13a0: 43 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65  CK) */.){.  Sche
13b0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53  ma *pSchema = (S
13c0: 63 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e  chema *)pBtree->
13d0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  pBt->pSchema;.  
13e0: 50 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20  Pgno iTab = 0;. 
13f0: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
1400: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
1410: 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68  tabase is not sh
1420: 61 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74  areable, or if t
1430: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1440: 64 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61  ding.  ** and ha
1450: 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  s the read-uncom
1460: 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c  mitted flag set,
1470: 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73   then no lock is
1480: 20 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a   required. .  **
1490: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d   Return true imm
14a0: 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
14b0: 20 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68   if( (pBtree->sh
14c0: 61 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c  arable==0).   ||
14d0: 20 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41   (eLockType==REA
14e0: 44 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65  D_LOCK && (pBtre
14f0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1500: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1510: 69 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20  itted)).  ){.   
1520: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
1530: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65    /* If the clie
1540: 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f  nt is reading  o
1550: 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64  r writing an ind
1560: 65 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d  ex and the schem
1570: 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f  a is.  ** not lo
1580: 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73  aded, then it is
1590: 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74   too difficult t
15a0: 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b  o actually check
15b0: 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20   to see if.  ** 
15c0: 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
15d0: 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20  s are held.  So 
15e0: 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20  do not bother - 
15f0: 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65  just return true
1600: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65  ..  ** This case
1610: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75   does not come u
1620: 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79  p very often any
1630: 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  how..  */.  if( 
1640: 69 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63  isIndex && (!pSc
1650: 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61  hema || (pSchema
1660: 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26 44 42  ->schemaFlags&DB
1670: 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d  _SchemaLoaded)==
1680: 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1690: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69   1;.  }..  /* Fi
16a0: 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f 6f  gure out the roo
16b0: 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65 20  t-page that the 
16c0: 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20 68  lock should be h
16d0: 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62 6c  eld on. For tabl
16e0: 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c 20  e.  ** b-trees, 
16f0: 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68 65  this is just the
1700: 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
1710: 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 72  e b-tree being r
1720: 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69 74  ead or.  ** writ
1730: 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20 62  ten. For index b
1740: 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74 68  -trees, it is th
1750: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
1760: 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  he associated.  
1770: 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  ** table.  */.  
1780: 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a 20  if( isIndex ){. 
1790: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a     HashElem *p;.
17a0: 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65      for(p=sqlite
17b0: 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65  HashFirst(&pSche
17c0: 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70 3b  ma->idxHash); p;
17d0: 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   p=sqliteHashNex
17e0: 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e 64  t(p)){.      Ind
17f0: 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64 65  ex *pIdx = (Inde
1800: 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  x *)sqliteHashDa
1810: 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28  ta(p);.      if(
1820: 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69 6e   pIdx->tnum==(in
1830: 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20  t)iRoot ){.     
1840: 20 20 20 69 66 28 20 69 54 61 62 20 29 7b 0a 20     if( iTab ){. 
1850: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20           /* Two 
1860: 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65 73 20  or more indexes 
1870: 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 72  share the same r
1880: 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65 72 65  oot page.  There
1890: 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20 20 20   must.          
18a0: 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72 20 74  ** be imposter t
18b0: 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73 74 20  ables.  So just 
18c0: 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20 54 68  return true.  Th
18d0: 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f 74 0a  e assert is not.
18e0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65            ** use
18f0: 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61 73 65  ful in that case
1900: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
1910: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
1920: 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61 62 20   }.        iTab 
1930: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
1940: 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tnum;.      }.  
1950: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1960: 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a 20   iTab = iRoot;. 
1970: 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20   }..  /* Search 
1980: 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65 64  for the required
1990: 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61 20   lock. Either a 
19a0: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72 6f  write-lock on ro
19b0: 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61 20  ot-page iTab, a 
19c0: 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b  .  ** write-lock
19d0: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
19e0: 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68 65  able, or (if the
19f0: 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64 69   client is readi
1a00: 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64 2d  ng) a.  ** read-
1a10: 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69 6c  lock on iTab wil
1a20: 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75 72  l suffice. Retur
1a30: 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74 68  n 1 if any of th
1a40: 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20 20  ese are found.  
1a50: 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70  */.  for(pLock=p
1a60: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f 63  Btree->pBt->pLoc
1a70: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
1a80: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
1a90: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42     if( pLock->pB
1aa0: 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20 20  tree==pBtree .  
1ab0: 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69 54     && (pLock->iT
1ac0: 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28 70  able==iTab || (p
1ad0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Lock->eLock==WRI
1ae0: 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b  TE_LOCK && pLock
1af0: 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20 20  ->iTable==1)).  
1b00: 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c 6f     && pLock->eLo
1b10: 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a 20  ck>=eLockType . 
1b20: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1b30: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1b40: 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20  .  /* Failed to 
1b50: 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72 65  find the require
1b60: 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65 74  d lock. */.  ret
1b70: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
1b80: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
1b90: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
1ba0: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20  E_DEBUG./*.**** 
1bb0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
1bc0: 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61 72  y be used as par
1bd0: 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  t of assert() st
1be0: 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20 2a  atements only. *
1bf0: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ***.**.** Return
1c00: 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75 6c   true if it woul
1c10: 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f 72  d be illegal for
1c20: 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74 65   pBtree to write
1c30: 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61 62   into the.** tab
1c40: 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f 74  le or index root
1c50: 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63 61  ed at iRoot beca
1c60: 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65 64  use other shared
1c70: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
1c80: 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  .** simultaneous
1c90: 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74 20  ly reading that 
1ca0: 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69 6e  same table or in
1cb0: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  dex..**.** It is
1cc0: 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42 74   illegal for pBt
1cd0: 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66 20  ree to write if 
1ce0: 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65 65  some other Btree
1cf0: 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20   object that.** 
1d00: 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65 20  shares the same 
1d10: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
1d20: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65 61  is currently rea
1d30: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 0a  ding or writing.
1d40: 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61 62  ** the iRoot tab
1d50: 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20  le.  Except, if 
1d60: 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65 20  the other Btree 
1d70: 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a 2a  object has the.*
1d80: 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  * read-uncommitt
1d90: 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68 65  ed flag set, the
1da0: 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74  n it is OK for t
1db0: 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74 20  he other object 
1dc0: 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65 61  to.** have a rea
1dd0: 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  d cursor..**.** 
1de0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65 66  For example, bef
1df0: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61  ore writing to a
1e00: 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  ny part of the t
1e10: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a 2a  able or index.**
1e20: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
1e30: 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75 6c  iRoot, one shoul
1e40: 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20  d call:.**.**   
1e50: 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65 61   assert( !hasRea
1e60: 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72 65  dConflicts(pBtre
1e70: 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f 0a  e, iRoot) );.*/.
1e80: 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52 65  static int hasRe
1e90: 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72 65  adConflicts(Btre
1ea0: 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f 20  e *pBtree, Pgno 
1eb0: 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72 73  iRoot){.  BtCurs
1ec0: 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  or *p;.  for(p=p
1ed0: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
1ee0: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
1ef0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  xt){.    if( p->
1f00: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 20  pgnoRoot==iRoot 
1f10: 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74 72  .     && p->pBtr
1f20: 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20 20  ee!=pBtree.     
1f30: 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65 65  && 0==(p->pBtree
1f40: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1f50: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1f60: 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20 20  tted).    ){.   
1f70: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1f80: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1f90: 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f  0;.}.#endif    /
1fa0: 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  * #ifdef SQLITE_
1fb0: 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
1fc0: 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20  Query to see if 
1fd0: 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d  Btree handle p m
1fe0: 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  ay obtain a lock
1ff0: 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a   of type eLock .
2000: 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72  ** (READ_LOCK or
2010: 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20   WRITE_LOCK) on 
2020: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
2030: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52  oot-page iTab. R
2040: 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  eturn.** SQLITE_
2050: 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d  OK if the lock m
2060: 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28  ay be obtained (
2070: 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65  by calling.** se
2080: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2090: 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c  eLock()), or SQL
20a0: 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f  ITE_LOCKED if no
20b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
20c0: 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68   querySharedCach
20d0: 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  eTableLock(Btree
20e0: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20   *p, Pgno iTab, 
20f0: 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53  u8 eLock){.  BtS
2100: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2110: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  pBt;.  BtLock *p
2120: 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Iter;..  assert(
2130: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2140: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
2150: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
2160: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  EAD_LOCK || eLoc
2170: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
2180: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
2190: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
21a0: 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26   !(p->db->flags&
21b0: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
21c0: 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d 3d  mitted)||eLock==
21d0: 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62  WRITE_LOCK||iTab
21e0: 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49  ==1 );.  .  /* I
21f0: 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 77  f requesting a w
2200: 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20  rite-lock, then 
2210: 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20 68  the Btree must h
2220: 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
2230: 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  e.  ** transacti
2240: 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2e  on on this file.
2250: 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79 2c   And, obviously,
2260: 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65 20   for this to be 
2270: 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20 6d  so there .  ** m
2280: 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 77  ust be an open w
2290: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
22a0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74 73   on the file its
22b0: 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  elf..  */.  asse
22c0: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
22d0: 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74 2d  LOCK || (p==pBt-
22e0: 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e 69  >pWriter && p->i
22f0: 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
2300: 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ITE) );.  assert
2310: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2320: 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61  CK || pBt->inTra
2330: 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
2340: 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f 2a  WRITE );.  .  /*
2350: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2360: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
2370: 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73 20  shared-cache is 
2380: 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20  not enabled */. 
2390: 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
23a0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
23b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
23c0: 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74 68    /* If some oth
23d0: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  er connection is
23e0: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63 6c   holding an excl
23f0: 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65 0a  usive lock, the.
2400: 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20 6c    ** requested l
2410: 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f  ock may not be o
2420: 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20  btained..  */.  
2430: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
2440: 21 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74 73  !=p && (pBt->bts
2450: 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43 4c  Flags & BTS_EXCL
2460: 55 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20 20  USIVE)!=0 ){.   
2470: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
2480: 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
2490: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
24a0: 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  b);.    return S
24b0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
24c0: 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20  REDCACHE;.  }.. 
24d0: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
24e0: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
24f0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
2500: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ){.    /* The co
2510: 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d 3e  ndition (pIter->
2520: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e  eLock!=eLock) in
2530: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
2540: 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20 73  f(...) .    ** s
2550: 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73 69  tatement is a si
2560: 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66 3a  mplification of:
2570: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2580: 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c   (eLock==WRITE_L
2590: 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c  OCK || pIter->eL
25a0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 29  ock==WRITE_LOCK)
25b0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73  .    **.    ** s
25c0: 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61  ince we know tha
25d0: 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  t if eLock==WRIT
25e0: 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f 20  E_LOCK, then no 
25f0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2600: 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c 64  .    ** may hold
2610: 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e   a WRITE_LOCK on
2620: 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74 68   any table in th
2630: 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20 74  is file (since t
2640: 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a 20  here can.    ** 
2650: 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65  only be a single
2660: 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a 2f   writer)..    */
2670: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
2680: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  er->eLock==READ_
2690: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
26a0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
26b0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
26c0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26d0: 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72 65   || pIter->pBtre
26e0: 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e 65  e==p || pIter->e
26f0: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29  Lock==READ_LOCK)
2700: 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
2710: 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49  >pBtree!=p && pI
2720: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
2730: 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f 63  b && pIter->eLoc
2740: 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k!=eLock ){.    
2750: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2760: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
2770: 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  , pIter->pBtree-
2780: 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
2790: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
27a0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
27b0: 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57 72  ert( p==pBt->pWr
27c0: 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20  iter );.        
27d0: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
27e0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20   BTS_PENDING;.  
27f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
2800: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2810: 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
2820: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2830: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
2840: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
2850: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
2860: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
2870: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2880: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64  _CACHE./*.** Add
2890: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74   a lock on the t
28a0: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
28b0: 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74 68  age iTable to th
28c0: 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 75  e shared-btree u
28d0: 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65 20  sed.** by Btree 
28e0: 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d 65  handle p. Parame
28f0: 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62  ter eLock must b
2900: 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c 4f  e either READ_LO
2910: 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f  CK or .** WRITE_
2920: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  LOCK..**.** This
2930: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
2940: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
2950: 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68 65  .**.**   (a) The
2960: 20 73 70 65 63 69 66 69 65 64 20 42 74 72 65 65   specified Btree
2970: 20 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f 6e   object p is con
2980: 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68 61 72  nected to a shar
2990: 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64 61  able.**       da
29a0: 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74 68  tabase (one with
29b0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73 68   the BtShared.sh
29c0: 61 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74 29  arable flag set)
29d0: 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62  , and.**.**   (b
29e0: 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65 65  ) No other Btree
29f0: 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61 20   objects hold a 
2a00: 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c 69  lock that confli
2a10: 63 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69 74  cts.**       wit
2a20: 68 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  h the requested 
2a30: 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72 79  lock (i.e. query
2a40: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2a50: 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20 20  Lock() has.**   
2a60: 20 20 20 20 61 6c 72 65 61 64 79 20 62 65 65 6e      already been
2a70: 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74 75   called and retu
2a80: 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29 2e  rned SQLITE_OK).
2a90: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
2aa0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2ab0: 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64 65  the lock is adde
2ac0: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20  d successfully. 
2ad0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a  SQLITE_NOMEM .**
2ae0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2af0: 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70 74  a malloc attempt
2b00: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
2b10: 63 20 69 6e 74 20 73 65 74 53 68 61 72 65 64 43  c int setSharedC
2b20: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74  acheTableLock(Bt
2b30: 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61  ree *p, Pgno iTa
2b40: 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a  ble, u8 eLock){.
2b50: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2b60: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f  = p->pBt;.  BtLo
2b70: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20  ck *pLock = 0;. 
2b80: 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
2b90: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2ba0: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
2bb0: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
2bc0: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2bd0: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49  CK || eLock==WRI
2be0: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  TE_LOCK );.  ass
2bf0: 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b  ert( p->db!=0 );
2c00: 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74  ..  /* A connect
2c10: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65 61  ion with the rea
2c20: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
2c30: 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76 65  ag set will neve
2c40: 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f 62  r try to.  ** ob
2c50: 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b  tain a read-lock
2c60: 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63   using this func
2c70: 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 72  tion. The only r
2c80: 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65  ead-lock obtaine
2c90: 64 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e 6e  d.  ** by a conn
2ca0: 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d 75  ection in read-u
2cb0: 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65 20  ncommitted mode 
2cc0: 69 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65  is on the sqlite
2cd0: 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74 61  _master .  ** ta
2ce0: 62 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c 6f  ble, and that lo
2cf0: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69  ck is obtained i
2d00: 6e 20 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  n BtreeBeginTran
2d10: 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  s().  */.  asser
2d20: 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c  t( 0==(p->db->fl
2d30: 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55  ags&SQLITE_ReadU
2d40: 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 65  ncommitted) || e
2d50: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
2d60: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   );..  /* This f
2d70: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f  unction should o
2d80: 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  nly be called on
2d90: 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74 72   a sharable b-tr
2da0: 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20 2a  ee after it .  *
2db0: 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65 72  * has been deter
2dc0: 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f 74  mined that no ot
2dd0: 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64 73  her b-tree holds
2de0: 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c   a conflicting l
2df0: 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ock.  */.  asser
2e00: 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  t( p->sharable )
2e10: 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
2e20: 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72  TE_OK==queryShar
2e30: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e40: 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63  (p, iTable, eLoc
2e50: 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72 73  k) );..  /* Firs
2e60: 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69 73  t search the lis
2e70: 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  t for an existin
2e80: 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74  g lock on this t
2e90: 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70  able. */.  for(p
2ea0: 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
2eb0: 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
2ec0: 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
2ed0: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61 62   if( pIter->iTab
2ee0: 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 49  le==iTable && pI
2ef0: 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ter->pBtree==p )
2f00: 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20  {.      pLock = 
2f10: 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72 65  pIter;.      bre
2f20: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
2f30: 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65   /* If the above
2f40: 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74 20   search did not 
2f50: 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73 74  find a BtLock st
2f60: 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e 67  ruct associating
2f70: 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77 69   Btree p.  ** wi
2f80: 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2c  th table iTable,
2f90: 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e   allocate one an
2fa0: 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74  d link it into t
2fb0: 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  he list..  */.  
2fc0: 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20  if( !pLock ){.  
2fd0: 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63    pLock = (BtLoc
2fe0: 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  k *)sqlite3Mallo
2ff0: 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c  cZero(sizeof(BtL
3000: 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20 21  ock));.    if( !
3010: 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72  pLock ){.      r
3020: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
3030: 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
3040: 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65     pLock->iTable
3050: 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 70   = iTable;.    p
3060: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 3d 20 70  Lock->pBtree = p
3070: 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ;.    pLock->pNe
3080: 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b  xt = pBt->pLock;
3090: 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20  .    pBt->pLock 
30a0: 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20  = pLock;.  }..  
30b0: 2f 2a 20 53 65 74 20 74 68 65 20 42 74 4c 6f 63  /* Set the BtLoc
30c0: 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65  k.eLock variable
30d0: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
30e0: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  of the current l
30f0: 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ock.  ** and the
3100: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2e   requested lock.
3110: 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20 61   This means if a
3120: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 61 73 20   write-lock was 
3130: 61 6c 72 65 61 64 79 20 68 65 6c 64 0a 20 20 2a  already held.  *
3140: 2a 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63  * and a read-loc
3150: 6b 20 72 65 71 75 65 73 74 65 64 2c 20 77 65 20  k requested, we 
3160: 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63 74 6c  don't incorrectl
3170: 79 20 64 6f 77 6e 67 72 61 64 65 20 74 68 65 20  y downgrade the 
3180: 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  lock..  */.  ass
3190: 65 72 74 28 20 57 52 49 54 45 5f 4c 4f 43 4b 3e  ert( WRITE_LOCK>
31a0: 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  READ_LOCK );.  i
31b0: 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e  f( eLock>pLock->
31c0: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f  eLock ){.    pLo
31d0: 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63  ck->eLock = eLoc
31e0: 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  k;.  }..  return
31f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
3200: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
3210: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
3220: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
3230: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
3240: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c  _CACHE./*.** Rel
3250: 65 61 73 65 20 61 6c 6c 20 74 68 65 20 74 61 62  ease all the tab
3260: 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73 20  le locks (locks 
3270: 6f 62 74 61 69 6e 65 64 20 76 69 61 20 63 61 6c  obtained via cal
3280: 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20 73 65 74  ls to.** the set
3290: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
32a0: 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64 75 72 65  Lock() procedure
32b0: 29 20 68 65 6c 64 20 62 79 20 42 74 72 65 65 20  ) held by Btree 
32c0: 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a 0a 2a 2a 20  object p..**.** 
32d0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  This function as
32e0: 73 75 6d 65 73 20 74 68 61 74 20 42 74 72 65 65  sumes that Btree
32f0: 20 70 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 72   p has an open r
3300: 65 61 64 20 6f 72 20 77 72 69 74 65 20 0a 2a 2a  ead or write .**
3310: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66   transaction. If
3320: 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c 20 74 68   it does not, th
3330: 65 6e 20 74 68 65 20 42 54 53 5f 50 45 4e 44 49  en the BTS_PENDI
3340: 4e 47 20 66 6c 61 67 0a 2a 2a 20 6d 61 79 20 62  NG flag.** may b
3350: 65 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 63 6c  e incorrectly cl
3360: 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eared..*/.static
3370: 20 76 6f 69 64 20 63 6c 65 61 72 41 6c 6c 53 68   void clearAllSh
3380: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
3390: 63 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  cks(Btree *p){. 
33a0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
33b0: 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63   p->pBt;.  BtLoc
33c0: 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20 26 70 42  k **ppIter = &pB
33d0: 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73  t->pLock;..  ass
33e0: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
33f0: 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
3400: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  ;.  assert( p->s
3410: 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70  harable || 0==*p
3420: 70 49 74 65 72 20 29 3b 0a 20 20 61 73 73 65 72  pIter );.  asser
3430: 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 30 20  t( p->inTrans>0 
3440: 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 2a 70 70  );..  while( *pp
3450: 49 74 65 72 20 29 7b 0a 20 20 20 20 42 74 4c 6f  Iter ){.    BtLo
3460: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70 70 49  ck *pLock = *ppI
3470: 74 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ter;.    assert(
3480: 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
3490: 26 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45 29  & BTS_EXCLUSIVE)
34a0: 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69  ==0 || pBt->pWri
34b0: 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72  ter==pLock->pBtr
34c0: 65 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ee );.    assert
34d0: 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 2d  ( pLock->pBtree-
34e0: 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c 6f 63 6b 2d  >inTrans>=pLock-
34f0: 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66  >eLock );.    if
3500: 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d  ( pLock->pBtree=
3510: 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 49  =p ){.      *ppI
3520: 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ter = pLock->pNe
3530: 78 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  xt;.      assert
3540: 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21  ( pLock->iTable!
3550: 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d 3d 26 70 2d  =1 || pLock==&p-
3560: 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20 69  >lock );.      i
3570: 66 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65  f( pLock->iTable
3580: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=1 ){.        s
3590: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 6f 63  qlite3_free(pLoc
35a0: 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  k);.      }.    
35b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 49  }else{.      ppI
35c0: 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e  ter = &pLock->pN
35d0: 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ext;.    }.  }..
35e0: 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
35f0: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50  btsFlags & BTS_P
3600: 45 4e 44 49 4e 47 29 3d 3d 30 20 7c 7c 20 70 42  ENDING)==0 || pB
3610: 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20  t->pWriter );.  
3620: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
3630: 3d 3d 70 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  ==p ){.    pBt->
3640: 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20 20  pWriter = 0;.   
3650: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
3660: 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49 56  = ~(BTS_EXCLUSIV
3670: 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a  E|BTS_PENDING);.
3680: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 74 2d    }else if( pBt-
3690: 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 32  >nTransaction==2
36a0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
36b0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
36c0: 65 64 20 77 68 65 6e 20 42 74 72 65 65 20 70 20  ed when Btree p 
36d0: 69 73 20 63 6f 6e 63 6c 75 64 69 6e 67 20 69 74  is concluding it
36e0: 73 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  s .    ** transa
36f0: 63 74 69 6f 6e 2e 20 49 66 20 74 68 65 72 65 20  ction. If there 
3700: 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74 73  currently exists
3710: 20 61 20 77 72 69 74 65 72 2c 20 61 6e 64 20 70   a writer, and p
3720: 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 74   is not.    ** t
3730: 68 61 74 20 77 72 69 74 65 72 2c 20 74 68 65 6e  hat writer, then
3740: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c   the number of l
3750: 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e  ocks held by con
3760: 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 0a 20  nections other. 
3770: 20 20 20 2a 2a 20 74 68 61 6e 20 74 68 65 20 77     ** than the w
3780: 72 69 74 65 72 20 6d 75 73 74 20 62 65 20 61 62  riter must be ab
3790: 6f 75 74 20 74 6f 20 64 72 6f 70 20 74 6f 20 7a  out to drop to z
37a0: 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ero. In this cas
37b0: 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65  e.    ** set the
37c0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c 61   BTS_PENDING fla
37d0: 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a 2a 0a 20  g to 0..    **. 
37e0: 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69     ** If there i
37f0: 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  s not currently 
3800: 61 20 77 72 69 74 65 72 2c 20 74 68 65 6e 20 42  a writer, then B
3810: 54 53 5f 50 45 4e 44 49 4e 47 20 6d 75 73 74 0a  TS_PENDING must.
3820: 20 20 20 20 2a 2a 20 62 65 20 7a 65 72 6f 20 61      ** be zero a
3830: 6c 72 65 61 64 79 2e 20 53 6f 20 74 68 69 73 20  lready. So this 
3840: 6e 65 78 74 20 6c 69 6e 65 20 69 73 20 68 61 72  next line is har
3850: 6d 6c 65 73 73 20 69 6e 20 74 68 61 74 20 63 61  mless in that ca
3860: 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  se..    */.    p
3870: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
3880: 7e 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20  ~BTS_PENDING;.  
3890: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
38a0: 66 75 6e 63 74 69 6f 6e 20 63 68 61 6e 67 65 73  function changes
38b0: 20 61 6c 6c 20 77 72 69 74 65 2d 6c 6f 63 6b 73   all write-locks
38c0: 20 68 65 6c 64 20 62 79 20 42 74 72 65 65 20 70   held by Btree p
38d0: 20 69 6e 74 6f 20 72 65 61 64 2d 6c 6f 63 6b 73   into read-locks
38e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
38f0: 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61   downgradeAllSha
3900: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
3910: 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ks(Btree *p){.  
3920: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
3930: 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 70 42  p->pBt;.  if( pB
3940: 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b  t->pWriter==p ){
3950: 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f  .    BtLock *pLo
3960: 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72  ck;.    pBt->pWr
3970: 69 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42  iter = 0;.    pB
3980: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e  t->btsFlags &= ~
3990: 28 42 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42  (BTS_EXCLUSIVE|B
39a0: 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 20  TS_PENDING);.   
39b0: 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42 74 2d 3e   for(pLock=pBt->
39c0: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c  pLock; pLock; pL
39d0: 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74  ock=pLock->pNext
39e0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
39f0: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52   pLock->eLock==R
3a00: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63  EAD_LOCK || pLoc
3a10: 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 3b 0a  k->pBtree==p );.
3a20: 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f        pLock->eLo
3a30: 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a  ck = READ_LOCK;.
3a40: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e      }.  }.}..#en
3a50: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
3a60: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
3a70: 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */..static void 
3a80: 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50  releasePage(MemP
3a90: 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a  age *pPage);  /*
3aa0: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
3ab0: 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20  ce */../*.***** 
3ac0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
3ad0: 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61  used inside of a
3ae0: 73 73 65 72 74 28 29 20 6f 6e 6c 79 20 2a 2a 2a  ssert() only ***
3af0: 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74  *.**.** Verify t
3b00: 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 68  hat the cursor h
3b10: 6f 6c 64 73 20 74 68 65 20 6d 75 74 65 78 20 6f  olds the mutex o
3b20: 6e 20 69 74 73 20 42 74 53 68 61 72 65 64 0a 2a  n its BtShared.*
3b30: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
3b40: 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74  DEBUG.static int
3b50: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
3b60: 78 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a  x(BtCursor *p){.
3b70: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
3b80: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70  _mutex_held(p->p
3b90: 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 0a 2f  Bt->mutex);.}../
3ba0: 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
3bb0: 65 20 63 75 72 73 6f 72 20 61 6e 64 20 74 68 65  e cursor and the
3bc0: 20 42 74 53 68 61 72 65 64 20 61 67 72 65 65 20   BtShared agree 
3bd0: 61 62 6f 75 74 20 77 68 61 74 20 69 73 20 74 68  about what is th
3be0: 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 64 61 74  e current.** dat
3bf0: 61 62 61 73 65 20 63 6f 6e 6e 65 74 69 6f 6e 2e  abase connetion.
3c00: 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61   This is importa
3c10: 6e 74 20 69 6e 20 73 68 61 72 65 64 2d 63 61 63  nt in shared-cac
3c20: 68 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20  he mode. If the 
3c30: 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 63 6f 6e  database .** con
3c40: 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73  nection pointers
3c50: 20 67 65 74 20 6f 75 74 2d 6f 66 2d 73 79 6e 63   get out-of-sync
3c60: 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  , it is possible
3c70: 20 66 6f 72 20 72 6f 75 74 69 6e 65 73 20 6c 69   for routines li
3c80: 6b 65 0a 2a 2a 20 62 74 72 65 65 49 6e 69 74 50  ke.** btreeInitP
3c90: 61 67 65 28 29 20 74 6f 20 72 65 66 65 72 65 6e  age() to referen
3ca0: 63 65 20 61 6e 20 73 74 61 6c 65 20 63 6f 6e 6e  ce an stale conn
3cb0: 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 74  ection pointer t
3cc0: 68 61 74 20 72 65 66 65 72 65 6e 63 65 73 20 61  hat references a
3cd0: 0a 2a 2a 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e  .** a connection
3ce0: 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64   that has alread
3cf0: 79 20 63 6c 6f 73 65 64 2e 20 20 54 68 69 73 20  y closed.  This 
3d00: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
3d10: 69 6e 73 69 64 65 20 61 73 73 65 72 74 28 29 0a  inside assert().
3d20: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e  ** statements on
3d30: 6c 79 20 61 6e 64 20 66 6f 72 20 74 68 65 20 70  ly and for the p
3d40: 75 72 70 6f 73 65 20 6f 66 20 64 6f 75 62 6c 65  urpose of double
3d50: 2d 63 68 65 63 6b 69 6e 67 20 74 68 61 74 20 74  -checking that t
3d60: 68 65 20 62 74 72 65 65 20 63 6f 64 65 0a 2a 2a  he btree code.**
3d70: 20 64 6f 65 73 20 6b 65 65 70 20 74 68 65 20 64   does keep the d
3d80: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
3d90: 6f 6e 20 70 6f 69 6e 74 65 72 73 20 75 70 2d 74  on pointers up-t
3da0: 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69  o-date..*/.stati
3db0: 63 20 69 6e 74 20 63 75 72 73 6f 72 4f 77 6e 73  c int cursorOwns
3dc0: 42 74 53 68 61 72 65 64 28 42 74 43 75 72 73 6f  BtShared(BtCurso
3dd0: 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  r *p){.  assert(
3de0: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
3df0: 78 28 70 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  x(p) );.  return
3e00: 20 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d   (p->pBtree->db=
3e10: 3d 70 2d 3e 70 42 74 2d 3e 64 62 29 3b 0a 7d 0a  =p->pBt->db);.}.
3e20: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
3e30: 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65  validate the ove
3e40: 72 66 6c 6f 77 20 63 61 63 68 65 20 6f 66 20 74  rflow cache of t
3e50: 68 65 20 63 75 72 73 6f 72 20 70 61 73 73 65 64  he cursor passed
3e60: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
3e70: 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e 20 74 68  gument..** on th
3e80: 65 20 73 68 61 72 65 64 20 62 74 72 65 65 20 73  e shared btree s
3e90: 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a 2a 2f  tructure pBt..*/
3ea0: 0a 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64  .#define invalid
3eb0: 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
3ec0: 28 70 43 75 72 29 20 28 70 43 75 72 2d 3e 63 75  (pCur) (pCur->cu
3ed0: 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f  rFlags &= ~BTCF_
3ee0: 56 61 6c 69 64 4f 76 66 6c 29 0a 0a 2f 2a 0a 2a  ValidOvfl)../*.*
3ef0: 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65  * Invalidate the
3f00: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
3f10: 69 73 74 20 63 61 63 68 65 20 66 6f 72 20 61 6c  ist cache for al
3f20: 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64  l cursors opened
3f30: 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65  .** on the share
3f40: 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d btree structur
3f50: 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  e pBt..*/.static
3f60: 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65   void invalidate
3f70: 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
3f80: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
3f90: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
3fa0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
3fb0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
3fc0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f  ->mutex) );.  fo
3fd0: 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  r(p=pBt->pCursor
3fe0: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
3ff0: 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65  {.    invalidate
4000: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 29  OverflowCache(p)
4010: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
4020: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
4030: 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54 68 69 73  RBLOB./*.** This
4040: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
4050: 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f 64 69 66  led before modif
4060: 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ying the content
4070: 73 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2a 20  s of a table.** 
4080: 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e  to invalidate an
4090: 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f  y incrblob curso
40a0: 72 73 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e  rs that are open
40b0: 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77 20 6f   on the.** row o
40c0: 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 77  r one of the row
40d0: 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64  s being modified
40e0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d  ..**.** If argum
40f0: 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65  ent isClearTable
4100: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
4110: 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  he entire conten
4120: 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61 62  ts of the.** tab
4130: 6c 65 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62  le is about to b
4140: 65 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68  e deleted. In th
4150: 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61  is case invalida
4160: 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f 62 0a  te all incrblob.
4170: 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  ** cursors open 
4180: 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69 74 68 69  on any row withi
4190: 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  n the table with
41a0: 20 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e 6f 52   root-page pgnoR
41b0: 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  oot..**.** Other
41c0: 77 69 73 65 2c 20 69 66 20 61 72 67 75 6d 65 6e  wise, if argumen
41d0: 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 69  t isClearTable i
41e0: 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 74 68  s false, then th
41f0: 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20 72 6f  e row with.** ro
4200: 77 69 64 20 69 52 6f 77 20 69 73 20 62 65 69 6e  wid iRow is bein
4210: 67 20 72 65 70 6c 61 63 65 64 20 6f 72 20 64 65  g replaced or de
4220: 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63  leted. In this c
4230: 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65 0a 2a  ase invalidate.*
4240: 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69 6e 63  * only those inc
4250: 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f 70  rblob cursors op
4260: 65 6e 20 6f 6e 20 74 68 61 74 20 73 70 65 63 69  en on that speci
4270: 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74  fic row..*/.stat
4280: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
4290: 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72  teIncrblobCursor
42a0: 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72  s(.  Btree *pBtr
42b0: 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ee,          /* 
42c0: 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
42d0: 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  e to check */.  
42e0: 69 36 34 20 69 52 6f 77 2c 20 20 20 20 20 20 20  i64 iRow,       
42f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
4300: 6f 77 69 64 20 74 68 61 74 20 6d 69 67 68 74 20  owid that might 
4310: 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f 0a 20  be changing */. 
4320: 20 69 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c   int isClearTabl
4330: 65 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  e        /* True
4340: 20 69 66 20 61 6c 6c 20 72 6f 77 73 20 61 72 65   if all rows are
4350: 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a   being deleted *
4360: 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  /.){.  BtCursor 
4370: 2a 70 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65  *p;.  if( pBtree
4380: 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75 72  ->hasIncrblobCur
4390: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
43a0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
43b0: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
43c0: 42 74 72 65 65 29 20 29 3b 0a 20 20 70 42 74 72  Btree) );.  pBtr
43d0: 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43  ee->hasIncrblobC
43e0: 75 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 3d  ur = 0;.  for(p=
43f0: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75  pBtree->pBt->pCu
4400: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
4410: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28 70  ext){.    if( (p
4420: 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
4430: 46 5f 49 6e 63 72 62 6c 6f 62 29 21 3d 30 20 29  F_Incrblob)!=0 )
4440: 7b 0a 20 20 20 20 20 20 70 42 74 72 65 65 2d 3e  {.      pBtree->
4450: 68 61 73 49 6e 63 72 62 6c 6f 62 43 75 72 20 3d  hasIncrblobCur =
4460: 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73   1;.      if( is
4470: 43 6c 65 61 72 54 61 62 6c 65 20 7c 7c 20 70 2d  ClearTable || p-
4480: 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77  >info.nKey==iRow
4490: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65   ){.        p->e
44a0: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
44b0: 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 7d 0a  NVALID;.      }.
44c0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c      }.  }.}..#el
44d0: 73 65 0a 20 20 2f 2a 20 53 74 75 62 20 66 75 6e  se.  /* Stub fun
44e0: 63 74 69 6f 6e 20 77 68 65 6e 20 49 4e 43 52 42  ction when INCRB
44f0: 4c 4f 42 20 69 73 20 6f 6d 69 74 74 65 64 20 2a  LOB is omitted *
4500: 2f 0a 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61  /.  #define inva
4510: 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75  lidateIncrblobCu
4520: 72 73 6f 72 73 28 78 2c 79 2c 7a 29 0a 23 65 6e  rsors(x,y,z).#en
4530: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
4540: 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a  IT_INCRBLOB */..
4550: 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70 67  /*.** Set bit pg
4560: 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61 72  no of the BtShar
4570: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
4580: 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20 63  itvec. This is c
4590: 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61  alled .** when a
45a0: 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76 69   page that previ
45b0: 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  ously contained 
45c0: 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20 66  data becomes a f
45d0: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a  ree-list leaf .*
45e0: 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  * page..**.** Th
45f0: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
4600: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65 78  ontent bitvec ex
4610: 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f  ists to work aro
4620: 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a  und an obscure.*
4630: 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79 20  * bug caused by 
4640: 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e 20  the interaction 
4650: 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49 4f  of two useful IO
4660: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73   optimizations s
4670: 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72  urrounding.** fr
4680: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4690: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57  es:.**.**   1) W
46a0: 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73 20  hen all data is 
46b0: 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20 70  deleted from a p
46c0: 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  age and the page
46d0: 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20   becomes.**     
46e0: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
46f0: 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67 65  f page, the page
4700: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
4710: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
4720: 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65 65  **      (as free
4730: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73  -list leaf pages
4740: 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e   contain no mean
4750: 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53 6f  ingful data). So
4760: 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20  metimes.**      
4770: 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20 6e  such a page is n
4780: 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c  ot even journall
4790: 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20 6e  ed (as it will n
47a0: 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a  ot be modified,.
47b0: 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74 68  **      why both
47c0: 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69  er journalling i
47d0: 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  t?)..**.**   2) 
47e0: 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74  When a free-list
47f0: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72 65   leaf page is re
4800: 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e  used, its conten
4810: 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a  t is not read.**
4820: 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 64        from the d
4830: 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74 74  atabase or writt
4840: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
4850: 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f 75  l file (why shou
4860: 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62 65  ld it.**      be
4870: 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  , if it is not a
4880: 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c  t all meaningful
4890: 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65  ?)..**.** By the
48a0: 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20 6f  mselves, these o
48b0: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72  ptimizations wor
48c0: 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76 69  k fine and provi
48d0: 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65  de a handy.** pe
48e0: 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20  rformance boost 
48f0: 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f  to bulk delete o
4900: 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69  r insert operati
4910: 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ons. However, if
4920: 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d 6f  .** a page is mo
4930: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
4940: 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72 65  list and then re
4950: 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  used within the 
4960: 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  same.** transact
4970: 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63  ion, a problem c
4980: 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65 20  omes up. If the 
4990: 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72  page is not jour
49a0: 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69  nalled when.** i
49b0: 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68  t is moved to th
49c0: 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20  e free-list and 
49d0: 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a  it is also not j
49e0: 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69  ournalled when i
49f0: 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74 65  t.** is extracte
4a00: 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  d from the free-
4a10: 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64 2c  list and reused,
4a20: 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e   then the origin
4a30: 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62  al data.** may b
4a40: 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20 65  e lost. In the e
4a50: 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  vent of a rollba
4a60: 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20 62  ck, it may not b
4a70: 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f  e possible.** to
4a80: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
4a90: 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
4aa0: 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74  ginal configurat
4ab0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ion..**.** The s
4ac0: 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20 42  olution is the B
4ad0: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
4ae0: 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65 6e  ent bitvec. When
4af0: 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20 0a  ever a page is .
4b00: 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f  ** moved to beco
4b10: 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  me a free-list l
4b20: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63 6f  eaf page, the co
4b30: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
4b40: 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68 65  is.** set in the
4b50: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
4b60: 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69 73  r a leaf page is
4b70: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
4b80: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a  the free-list,.*
4b90: 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32  * optimization 2
4ba0: 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74 74 65   above is omitte
4bb0: 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73 70  d if the corresp
4bc0: 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61 6c  onding bit is al
4bd0: 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20  ready.** set in 
4be0: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
4bf0: 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e  tent. The conten
4c00: 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65 63  ts of the bitvec
4c10: 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20   are cleared.** 
4c20: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  at the end of ev
4c30: 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ery transaction.
4c40: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
4c50: 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e  treeSetHasConten
4c60: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
4c70: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
4c80: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
4c90: 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  K;.  if( !pBt->p
4ca0: 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  HasContent ){.  
4cb0: 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d    assert( pgno<=
4cc0: 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a 20 20  pBt->nPage );.  
4cd0: 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65    pBt->pHasConte
4ce0: 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  nt = sqlite3Bitv
4cf0: 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e 6e 50  ecCreate(pBt->nP
4d00: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  age);.    if( !p
4d10: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
4d20: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
4d30: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
4d40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
4d50: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
4d60: 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42  & pgno<=sqlite3B
4d70: 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70  itvecSize(pBt->p
4d80: 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20  HasContent) ){. 
4d90: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
4da0: 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48  itvecSet(pBt->pH
4db0: 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29  asContent, pgno)
4dc0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
4dd0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72  c;.}../*.** Quer
4de0: 79 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  y the BtShared.p
4df0: 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f  HasContent vecto
4e00: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  r..**.** This fu
4e10: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
4e20: 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   when a free-lis
4e30: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
4e40: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a  emoved from the.
4e50: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72  ** free-list for
4e60: 20 72 65 75 73 65 2e 20 49 74 20 72 65 74 75 72   reuse. It retur
4e70: 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ns false if it i
4e80: 73 20 73 61 66 65 20 74 6f 20 72 65 74 72 69 65  s safe to retrie
4e90: 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66  ve the.** page f
4ea0: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61  rom the pager la
4eb0: 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
4ec0: 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
4ed0: 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69  et. True otherwi
4ee0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
4ef0: 74 20 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e  t btreeGetHasCon
4f00: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
4f10: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
4f20: 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42    Bitvec *p = pB
4f30: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a  t->pHasContent;.
4f40: 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28    return (p && (
4f50: 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76  pgno>sqlite3Bitv
4f60: 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c  ecSize(p) || sql
4f70: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
4f80: 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a  , pgno)));.}../*
4f90: 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72  .** Clear (destr
4fa0: 6f 79 29 20 74 68 65 20 42 74 53 68 61 72 65 64  oy) the BtShared
4fb0: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
4fc0: 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  vec. This should
4fd0: 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61   be.** invoked a
4fe0: 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
4ff0: 20 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d 74   of each write-t
5000: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
5010: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
5020: 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
5030: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
5040: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
5050: 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73  estroy(pBt->pHas
5060: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d  Content);.  pBt-
5070: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30  >pHasContent = 0
5080: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
5090: 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 70  se all of the ap
50a0: 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66 6f 72  Page[] pages for
50b0: 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74   a cursor..*/.st
50c0: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 52  atic void btreeR
50d0: 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
50e0: 61 67 65 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ages(BtCursor *p
50f0: 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cur){.  int i;. 
5100: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75   for(i=0; i<=pCu
5110: 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  r->iPage; i++){.
5120: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
5130: 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29  pCur->apPage[i])
5140: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61  ;.    pCur->apPa
5150: 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20  ge[i] = 0;.  }. 
5160: 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d   pCur->iPage = -
5170: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  1;.}../*.** The 
5180: 63 75 72 73 6f 72 20 70 61 73 73 65 64 20 61 73  cursor passed as
5190: 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
51a0: 6e 74 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  nt must point to
51b0: 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 0a 2a   a valid entry.*
51c0: 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * when this func
51d0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 28  tion is called (
51e0: 69 2e 65 2e 20 68 61 76 65 20 65 53 74 61 74 65  i.e. have eState
51f0: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 2e  ==CURSOR_VALID).
5200: 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
5210: 6e 20 73 61 76 65 73 20 74 68 65 20 63 75 72 72  n saves the curr
5220: 65 6e 74 20 63 75 72 73 6f 72 20 6b 65 79 20 69  ent cursor key i
5230: 6e 20 76 61 72 69 61 62 6c 65 73 20 70 43 75 72  n variables pCur
5240: 2d 3e 6e 4b 65 79 20 61 6e 64 0a 2a 2a 20 70 43  ->nKey and.** pC
5250: 75 72 2d 3e 70 4b 65 79 2e 20 53 51 4c 49 54 45  ur->pKey. SQLITE
5260: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
5270: 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72  if successful or
5280: 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
5290: 20 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72 77   .** code otherw
52a0: 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ise..**.** If th
52b0: 65 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e  e cursor is open
52c0: 20 6f 6e 20 61 6e 20 69 6e 74 6b 65 79 20 74 61   on an intkey ta
52d0: 62 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 69 6e  ble, then the in
52e0: 74 65 67 65 72 20 6b 65 79 0a 2a 2a 20 28 74 68  teger key.** (th
52f0: 65 20 72 6f 77 69 64 29 20 69 73 20 73 74 6f 72  e rowid) is stor
5300: 65 64 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79  ed in pCur->nKey
5310: 20 61 6e 64 20 70 43 75 72 2d 3e 70 4b 65 79 20   and pCur->pKey 
5320: 69 73 20 6c 65 66 74 20 73 65 74 20 74 6f 0a 2a  is left set to.*
5330: 2a 20 4e 55 4c 4c 2e 20 49 66 20 74 68 65 20 63  * NULL. If the c
5340: 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 20 6f 6e  ursor is open on
5350: 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 74 61   a non-intkey ta
5360: 62 6c 65 2c 20 74 68 65 6e 20 70 43 75 72 2d 3e  ble, then pCur->
5370: 70 4b 65 79 20 69 73 20 0a 2a 2a 20 73 65 74 20  pKey is .** set 
5380: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 6d 61  to point to a ma
5390: 6c 6c 6f 63 65 64 20 62 75 66 66 65 72 20 70 43  lloced buffer pC
53a0: 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 69  ur->nKey bytes i
53b0: 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e  n size containin
53c0: 67 20 0a 2a 2a 20 74 68 65 20 6b 65 79 2e 0a 2a  g .** the key..*
53d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  /.static int sav
53e0: 65 43 75 72 73 6f 72 4b 65 79 28 42 74 43 75 72  eCursorKey(BtCur
53f0: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
5400: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
5410: 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
5420: 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  OR_VALID==pCur->
5430: 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65  eState );.  asse
5440: 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65  rt( 0==pCur->pKe
5450: 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  y );.  assert( c
5460: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
5470: 70 43 75 72 29 20 29 3b 0a 0a 20 20 69 66 28 20  pCur) );..  if( 
5480: 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20  pCur->curIntKey 
5490: 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 74  ){.    /* Only t
54a0: 68 65 20 72 6f 77 69 64 20 69 73 20 72 65 71 75  he rowid is requ
54b0: 69 72 65 64 20 66 6f 72 20 61 20 74 61 62 6c 65  ired for a table
54c0: 20 62 74 72 65 65 20 2a 2f 0a 20 20 20 20 70 43   btree */.    pC
54d0: 75 72 2d 3e 6e 4b 65 79 20 3d 20 73 71 6c 69 74  ur->nKey = sqlit
54e0: 65 33 42 74 72 65 65 49 6e 74 65 67 65 72 4b 65  e3BtreeIntegerKe
54f0: 79 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65  y(pCur);.  }else
5500: 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61 6e 20  {.    /* For an 
5510: 69 6e 64 65 78 20 62 74 72 65 65 2c 20 73 61 76  index btree, sav
5520: 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 6b  e the complete k
5530: 65 79 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ey content */.  
5540: 20 20 76 6f 69 64 20 2a 70 4b 65 79 3b 0a 20 20    void *pKey;.  
5550: 20 20 70 43 75 72 2d 3e 6e 4b 65 79 20 3d 20 73    pCur->nKey = s
5560: 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f  qlite3BtreePaylo
5570: 61 64 53 69 7a 65 28 70 43 75 72 29 3b 0a 20 20  adSize(pCur);.  
5580: 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33    pKey = sqlite3
5590: 4d 61 6c 6c 6f 63 28 20 70 43 75 72 2d 3e 6e 4b  Malloc( pCur->nK
55a0: 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b  ey );.    if( pK
55b0: 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ey ){.      rc =
55c0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
55d0: 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c 20 28 69  load(pCur, 0, (i
55e0: 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 70  nt)pCur->nKey, p
55f0: 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Key);.      if( 
5600: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
5610: 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70  .        pCur->p
5620: 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20  Key = pKey;.    
5630: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
5640: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4b   sqlite3_free(pK
5650: 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ey);.      }.   
5660: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
5670: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
5680: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  BKPT;.    }.  }.
5690: 20 20 61 73 73 65 72 74 28 20 21 70 43 75 72 2d    assert( !pCur-
56a0: 3e 63 75 72 49 6e 74 4b 65 79 20 7c 7c 20 21 70  >curIntKey || !p
56b0: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 72  Cur->pKey );.  r
56c0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
56d0: 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75 72 72  ** Save the curr
56e0: 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ent cursor posit
56f0: 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72 69 61  ion in the varia
5700: 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b  bles BtCursor.nK
5710: 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72  ey .** and BtCur
5720: 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20 63 75  sor.pKey. The cu
5730: 72 73 6f 72 27 73 20 73 74 61 74 65 20 69 73 20  rsor's state is 
5740: 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 52 45  set to CURSOR_RE
5750: 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a  QUIRESEEK..**.**
5760: 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
5770: 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
5780: 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64   cursor is valid
5790: 20 28 68 61 73 20 65 53 74 61 74 65 3d 3d 43 55   (has eState==CU
57a0: 52 53 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a 20 70  RSOR_VALID).** p
57b0: 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20  rior to calling 
57c0: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 0a  this routine.  .
57d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  */.static int sa
57e0: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
57f0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
5800: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
5810: 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41  ssert( CURSOR_VA
5820: 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
5830: 65 20 7c 7c 20 43 55 52 53 4f 52 5f 53 4b 49 50  e || CURSOR_SKIP
5840: 4e 45 58 54 3d 3d 70 43 75 72 2d 3e 65 53 74 61  NEXT==pCur->eSta
5850: 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  te );.  assert( 
5860: 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b  0==pCur->pKey );
5870: 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
5880: 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
5890: 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 43 75 72  ) );..  if( pCur
58a0: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
58b0: 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20  _SKIPNEXT ){.   
58c0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
58d0: 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20  CURSOR_VALID;.  
58e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d  }else{.    pCur-
58f0: 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20  >skipNext = 0;. 
5900: 20 7d 0a 0a 20 20 72 63 20 3d 20 73 61 76 65 43   }..  rc = saveC
5910: 75 72 73 6f 72 4b 65 79 28 70 43 75 72 29 3b 0a  ursorKey(pCur);.
5920: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5930: 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 74 72 65 65  _OK ){.    btree
5940: 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72  ReleaseAllCursor
5950: 50 61 67 65 73 28 70 43 75 72 29 3b 0a 20 20 20  Pages(pCur);.   
5960: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
5970: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
5980: 45 4b 3b 0a 20 20 7d 0a 0a 20 20 70 43 75 72 2d  EK;.  }..  pCur-
5990: 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42  >curFlags &= ~(B
59a0: 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54  TCF_ValidNKey|BT
59b0: 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43  CF_ValidOvfl|BTC
59c0: 46 5f 41 74 4c 61 73 74 29 3b 0a 20 20 72 65 74  F_AtLast);.  ret
59d0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  urn rc;.}../* Fo
59e0: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
59f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
5a00: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61  LITE_NOINLINE sa
5a10: 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28  veCursorsOnList(
5a20: 42 74 43 75 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42  BtCursor*,Pgno,B
5a30: 74 43 75 72 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a  tCursor*);../*.*
5a40: 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73 69 74  * Save the posit
5a50: 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72 73  ions of all curs
5a60: 6f 72 73 20 28 65 78 63 65 70 74 20 70 45 78 63  ors (except pExc
5a70: 65 70 74 29 20 74 68 61 74 20 61 72 65 20 6f 70  ept) that are op
5a80: 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 74 61 62  en on.** the tab
5a90: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
5aa0: 65 20 69 52 6f 6f 74 2e 20 20 22 53 61 76 69 6e  e iRoot.  "Savin
5ab0: 67 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f 73  g the cursor pos
5ac0: 69 74 69 6f 6e 22 20 6d 65 61 6e 73 20 74 68 61  ition" means tha
5ad0: 74 0a 2a 2a 20 74 68 65 20 6c 6f 63 61 74 69 6f  t.** the locatio
5ae0: 6e 20 69 6e 20 74 68 65 20 62 74 72 65 65 20 69  n in the btree i
5af0: 73 20 72 65 6d 65 6d 62 65 72 65 64 20 69 6e 20  s remembered in 
5b00: 73 75 63 68 20 61 20 77 61 79 20 74 68 61 74 20  such a way that 
5b10: 69 74 20 63 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76  it can be.** mov
5b20: 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65 20 73  ed back to the s
5b30: 61 6d 65 20 73 70 6f 74 20 61 66 74 65 72 20 74  ame spot after t
5b40: 68 65 20 62 74 72 65 65 20 68 61 73 20 62 65 65  he btree has bee
5b50: 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 54 68 69  n modified.  Thi
5b60: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20  s.** routine is 
5b70: 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65 66 6f  called just befo
5b80: 72 65 20 63 75 72 73 6f 72 20 70 45 78 63 65 70  re cursor pExcep
5b90: 74 20 69 73 20 75 73 65 64 20 74 6f 20 6d 6f 64  t is used to mod
5ba0: 69 66 79 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65  ify the.** table
5bb0: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 20 69 6e  , for example in
5bc0: 20 42 74 72 65 65 44 65 6c 65 74 65 28 29 20 6f   BtreeDelete() o
5bd0: 72 20 42 74 72 65 65 49 6e 73 65 72 74 28 29 2e  r BtreeInsert().
5be0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
5bf0: 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  are two or more 
5c00: 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 73  cursors on the s
5c10: 61 6d 65 20 62 74 72 65 65 2c 20 74 68 65 6e 20  ame btree, then 
5c20: 61 6c 6c 20 73 75 63 68 20 0a 2a 2a 20 63 75 72  all such .** cur
5c30: 73 6f 72 73 20 73 68 6f 75 6c 64 20 68 61 76 65  sors should have
5c40: 20 74 68 65 69 72 20 42 54 43 46 5f 4d 75 6c 74   their BTCF_Mult
5c50: 69 70 6c 65 20 66 6c 61 67 20 73 65 74 2e 20 20  iple flag set.  
5c60: 54 68 65 20 62 74 72 65 65 43 75 72 73 6f 72 28  The btreeCursor(
5c70: 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 65 6e 66  ).** routine enf
5c80: 6f 72 63 65 73 20 74 68 61 74 20 72 75 6c 65 2e  orces that rule.
5c90: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6f    This routine o
5ca0: 6e 6c 79 20 6e 65 65 64 73 20 74 6f 20 62 65 20  nly needs to be 
5cb0: 63 61 6c 6c 65 64 20 69 6e 0a 2a 2a 20 74 68 65  called in.** the
5cc0: 20 75 6e 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77   uncommon case w
5cd0: 68 65 6e 20 70 45 78 70 65 63 74 20 68 61 73 20  hen pExpect has 
5ce0: 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c  the BTCF_Multipl
5cf0: 65 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a  e flag set..**.*
5d00: 2a 20 49 66 20 70 45 78 70 65 63 74 21 3d 4e 55  * If pExpect!=NU
5d10: 4c 4c 20 61 6e 64 20 69 66 20 6e 6f 20 6f 74 68  LL and if no oth
5d20: 65 72 20 63 75 72 73 6f 72 73 20 61 72 65 20 66  er cursors are f
5d30: 6f 75 6e 64 20 6f 6e 20 74 68 65 20 73 61 6d 65  ound on the same
5d40: 20 72 6f 6f 74 2d 70 61 67 65 2c 0a 2a 2a 20 74   root-page,.** t
5d50: 68 65 6e 20 74 68 65 20 42 54 43 46 5f 4d 75 6c  hen the BTCF_Mul
5d60: 74 69 70 6c 65 20 66 6c 61 67 20 6f 6e 20 70 45  tiple flag on pE
5d70: 78 70 65 63 74 20 69 73 20 63 6c 65 61 72 65 64  xpect is cleared
5d80: 2c 20 74 6f 20 61 76 6f 69 64 20 61 6e 6f 74 68  , to avoid anoth
5d90: 65 72 0a 2a 2a 20 70 6f 69 6e 74 6c 65 73 73 20  er.** pointless 
5da0: 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75  call to this rou
5db0: 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c  tine..**.** Impl
5dc0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6e 6f 74 65 3a  ementation note:
5dd0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
5de0: 65 72 65 6c 79 20 63 68 65 63 6b 73 20 74 6f 20  erely checks to 
5df0: 73 65 65 20 69 66 20 61 6e 79 20 63 75 72 73 6f  see if any curso
5e00: 72 73 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65  rs.** need to be
5e10: 20 73 61 76 65 64 2e 20 20 49 74 20 63 61 6c 6c   saved.  It call
5e20: 73 20 6f 75 74 20 74 6f 20 73 61 76 65 43 75 72  s out to saveCur
5e30: 73 6f 72 73 4f 6e 4c 69 73 74 28 29 20 69 6e 20  sorsOnList() in 
5e40: 74 68 65 20 28 75 6e 75 73 75 61 6c 29 0a 2a 2a  the (unusual).**
5e50: 20 65 76 65 6e 74 20 74 68 61 74 20 63 75 72 73   event that curs
5e60: 6f 72 73 20 61 72 65 20 69 6e 20 6e 65 65 64 20  ors are in need 
5e70: 74 6f 20 62 65 69 6e 67 20 73 61 76 65 64 2e 0a  to being saved..
5e80: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  */.static int sa
5e90: 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 53  veAllCursors(BtS
5ea0: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
5eb0: 20 69 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72   iRoot, BtCursor
5ec0: 20 2a 70 45 78 63 65 70 74 29 7b 0a 20 20 42 74   *pExcept){.  Bt
5ed0: 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73  Cursor *p;.  ass
5ee0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
5ef0: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
5f00: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
5f10: 20 70 45 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70   pExcept==0 || p
5f20: 45 78 63 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74  Except->pBt==pBt
5f30: 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d   );.  for(p=pBt-
5f40: 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
5f50: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
5f60: 28 20 70 21 3d 70 45 78 63 65 70 74 20 26 26 20  ( p!=pExcept && 
5f70: 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e  (0==iRoot || p->
5f80: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29  pgnoRoot==iRoot)
5f90: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
5fa0: 69 66 28 20 70 20 29 20 72 65 74 75 72 6e 20 73  if( p ) return s
5fb0: 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74  aveCursorsOnList
5fc0: 28 70 2c 20 69 52 6f 6f 74 2c 20 70 45 78 63 65  (p, iRoot, pExce
5fd0: 70 74 29 3b 0a 20 20 69 66 28 20 70 45 78 63 65  pt);.  if( pExce
5fe0: 70 74 20 29 20 70 45 78 63 65 70 74 2d 3e 63 75  pt ) pExcept->cu
5ff0: 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f  rFlags &= ~BTCF_
6000: 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 72 65 74 75  Multiple;.  retu
6010: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
6020: 0a 2f 2a 20 54 68 69 73 20 68 65 6c 70 65 72 20  ./* This helper 
6030: 72 6f 75 74 69 6e 65 20 74 6f 20 73 61 76 65 41  routine to saveA
6040: 6c 6c 43 75 72 73 6f 72 73 20 64 6f 65 73 20 74  llCursors does t
6050: 68 65 20 61 63 74 75 61 6c 20 77 6f 72 6b 20 6f  he actual work o
6060: 66 20 73 61 76 69 6e 67 0a 2a 2a 20 74 68 65 20  f saving.** the 
6070: 63 75 72 73 6f 72 73 20 69 66 20 61 6e 64 20 77  cursors if and w
6080: 68 65 6e 20 61 20 63 75 72 73 6f 72 20 69 73 20  hen a cursor is 
6090: 66 6f 75 6e 64 20 74 68 61 74 20 61 63 74 75 61  found that actua
60a0: 6c 6c 79 20 72 65 71 75 69 72 65 73 20 73 61 76  lly requires sav
60b0: 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d  ing..** The comm
60c0: 6f 6e 20 63 61 73 65 20 69 73 20 74 68 61 74 20  on case is that 
60d0: 6e 6f 20 63 75 72 73 6f 72 73 20 6e 65 65 64 20  no cursors need 
60e0: 74 6f 20 62 65 20 73 61 76 65 64 2c 20 73 6f 20  to be saved, so 
60f0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a  this routine is.
6100: 2a 2a 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72  ** broken out fr
6110: 6f 6d 20 69 74 73 20 63 61 6c 6c 65 72 20 74 6f  om its caller to
6120: 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61   avoid unnecessa
6130: 72 79 20 73 74 61 63 6b 20 70 6f 69 6e 74 65 72  ry stack pointer
6140: 20 6d 6f 76 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   movement..*/.st
6150: 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
6160: 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43 75 72  NOINLINE saveCur
6170: 73 6f 72 73 4f 6e 4c 69 73 74 28 0a 20 20 42 74  sorsOnList(.  Bt
6180: 43 75 72 73 6f 72 20 2a 70 2c 20 20 20 20 20 20  Cursor *p,      
6190: 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20     /* The first 
61a0: 63 75 72 73 6f 72 20 74 68 61 74 20 6e 65 65 64  cursor that need
61b0: 73 20 73 61 76 69 6e 67 20 2a 2f 0a 20 20 50 67  s saving */.  Pg
61c0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
61d0: 20 20 20 2f 2a 20 4f 6e 6c 79 20 73 61 76 65 20     /* Only save 
61e0: 63 75 72 73 6f 72 20 77 69 74 68 20 74 68 69 73  cursor with this
61f0: 20 69 52 6f 6f 74 2e 20 53 61 76 65 20 61 6c 6c   iRoot. Save all
6200: 20 69 66 20 7a 65 72 6f 20 2a 2f 0a 20 20 42 74   if zero */.  Bt
6210: 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74 20  Cursor *pExcept 
6220: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 61 76     /* Do not sav
6230: 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f  e this cursor */
6240: 0a 29 7b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66  .){.  do{.    if
6250: 28 20 70 21 3d 70 45 78 63 65 70 74 20 26 26 20  ( p!=pExcept && 
6260: 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e  (0==iRoot || p->
6270: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29  pgnoRoot==iRoot)
6280: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
6290: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
62a0: 56 41 4c 49 44 20 7c 7c 20 70 2d 3e 65 53 74 61  VALID || p->eSta
62b0: 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e  te==CURSOR_SKIPN
62c0: 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69  EXT ){.        i
62d0: 6e 74 20 72 63 20 3d 20 73 61 76 65 43 75 72 73  nt rc = saveCurs
62e0: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20  orPosition(p);. 
62f0: 20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54         if( SQLIT
6300: 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK!=rc ){.    
6310: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
6320: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6330: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6340: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 69 50 61  testcase( p->iPa
6350: 67 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ge>0 );.        
6360: 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43  btreeReleaseAllC
6370: 75 72 73 6f 72 50 61 67 65 73 28 70 29 3b 0a 20  ursorPages(p);. 
6380: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
6390: 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20   p = p->pNext;. 
63a0: 20 7d 77 68 69 6c 65 28 20 70 20 29 3b 0a 20 20   }while( p );.  
63b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
63c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
63d0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
63e0: 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f  sor position..*/
63f0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
6400: 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 42 74  eeClearCursor(Bt
6410: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
6420: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
6430: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
6440: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
6450: 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20  e(pCur->pKey);. 
6460: 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b   pCur->pKey = 0;
6470: 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20  .  pCur->eState 
6480: 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
6490: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68  ;.}../*.** In th
64a0: 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 42 74  is version of Bt
64b0: 72 65 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20  reeMoveto, pKey 
64c0: 69 73 20 61 20 70 61 63 6b 65 64 20 69 6e 64 65  is a packed inde
64d0: 78 20 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68  x record.** such
64e0: 20 61 73 20 69 73 20 67 65 6e 65 72 61 74 65 64   as is generated
64f0: 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52   by the OP_MakeR
6500: 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20 55  ecord opcode.  U
6510: 6e 70 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63  npack the.** rec
6520: 6f 72 64 20 61 6e 64 20 74 68 65 6e 20 63 61 6c  ord and then cal
6530: 6c 20 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  l BtreeMovetoUnp
6540: 61 63 6b 65 64 28 29 20 74 6f 20 64 6f 20 74 68  acked() to do th
6550: 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69  e work..*/.stati
6560: 63 20 69 6e 74 20 62 74 72 65 65 4d 6f 76 65 74  c int btreeMovet
6570: 6f 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  o(.  BtCursor *p
6580: 43 75 72 2c 20 20 20 20 20 2f 2a 20 43 75 72 73  Cur,     /* Curs
6590: 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62  or open on the b
65a0: 74 72 65 65 20 74 6f 20 62 65 20 73 65 61 72 63  tree to be searc
65b0: 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  hed */.  const v
65c0: 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20  oid *pKey,   /* 
65d0: 50 61 63 6b 65 64 20 6b 65 79 20 69 66 20 74 68  Packed key if th
65e0: 65 20 62 74 72 65 65 20 69 73 20 61 6e 20 69 6e  e btree is an in
65f0: 64 65 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65  dex */.  i64 nKe
6600: 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y,           /* 
6610: 49 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20  Integer key for 
6620: 74 61 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66  tables.  Size of
6630: 20 70 4b 65 79 20 66 6f 72 20 69 6e 64 69 63 65   pKey for indice
6640: 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c  s */.  int bias,
6650: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
6660: 61 73 20 73 65 61 72 63 68 20 74 6f 20 74 68 65  as search to the
6670: 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69   high end */.  i
6680: 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20  nt *pRes        
6690: 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72     /* Write sear
66a0: 63 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  ch results here 
66b0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
66c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66d0: 20 20 20 2f 2a 20 53 74 61 74 75 73 20 63 6f 64     /* Status cod
66e0: 65 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  e */.  UnpackedR
66f0: 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b 20  ecord *pIdxKey; 
6700: 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e    /* Unpacked in
6710: 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 63 68 61  dex key */.  cha
6720: 72 20 61 53 70 61 63 65 5b 33 38 34 5d 3b 20 20  r aSpace[384];  
6730: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20          /* Temp 
6740: 73 70 61 63 65 20 66 6f 72 20 70 49 64 78 4b 65  space for pIdxKe
6750: 79 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20 6d  y - to avoid a m
6760: 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20  alloc */.  char 
6770: 2a 70 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 69  *pFree = 0;..  i
6780: 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61  f( pKey ){.    a
6790: 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36  ssert( nKey==(i6
67a0: 34 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a 20  4)(int)nKey );. 
67b0: 20 20 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c     pIdxKey = sql
67c0: 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70  ite3VdbeAllocUnp
67d0: 61 63 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 20  ackedRecord(.   
67e0: 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 49       pCur->pKeyI
67f0: 6e 66 6f 2c 20 61 53 70 61 63 65 2c 20 73 69 7a  nfo, aSpace, siz
6800: 65 6f 66 28 61 53 70 61 63 65 29 2c 20 26 70 46  eof(aSpace), &pF
6810: 72 65 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  ree.    );.    i
6820: 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20  f( pIdxKey==0 ) 
6830: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
6840: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 73 71  MEM_BKPT;.    sq
6850: 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55  lite3VdbeRecordU
6860: 6e 70 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65 79  npack(pCur->pKey
6870: 49 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b 65 79 2c  Info, (int)nKey,
6880: 20 70 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b   pKey, pIdxKey);
6890: 0a 20 20 20 20 69 66 28 20 70 49 64 78 4b 65 79  .    if( pIdxKey
68a0: 2d 3e 6e 46 69 65 6c 64 3d 3d 30 20 29 7b 0a 20  ->nField==0 ){. 
68b0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
68c0: 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  ee(pCur->pKeyInf
68d0: 6f 2d 3e 64 62 2c 20 70 46 72 65 65 29 3b 0a 20  o->db, pFree);. 
68e0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
68f0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
6900: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
6910: 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 30 3b      pIdxKey = 0;
6920: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
6930: 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  te3BtreeMovetoUn
6940: 70 61 63 6b 65 64 28 70 43 75 72 2c 20 70 49 64  packed(pCur, pId
6950: 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61 73  xKey, nKey, bias
6960: 2c 20 70 52 65 73 29 3b 0a 20 20 69 66 28 20 70  , pRes);.  if( p
6970: 46 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Free ){.    sqli
6980: 74 65 33 44 62 46 72 65 65 28 70 43 75 72 2d 3e  te3DbFree(pCur->
6990: 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 46  pKeyInfo->db, pF
69a0: 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ree);.  }.  retu
69b0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
69c0: 52 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73  Restore the curs
69d0: 6f 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69  or to the positi
69e0: 6f 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f 72  on it was in (or
69f0: 20 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73 20   as close to as 
6a00: 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68 65  possible).** whe
6a10: 6e 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  n saveCursorPosi
6a20: 74 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c 65  tion() was calle
6a30: 64 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69  d. Note that thi
6a40: 73 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20 74  s call deletes t
6a50: 68 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f 73  he .** saved pos
6a60: 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72 65  ition info store
6a70: 64 20 62 79 20 73 61 76 65 43 75 72 73 6f 72 50  d by saveCursorP
6a80: 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74 68  osition(), so th
6a90: 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61 74  ere can be.** at
6aa0: 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63 74   most one effect
6ab0: 69 76 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f  ive restoreCurso
6ac0: 72 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c  rPosition() call
6ad0: 20 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a 20   after each .** 
6ae0: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
6af0: 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  on()..*/.static 
6b00: 69 6e 74 20 62 74 72 65 65 52 65 73 74 6f 72 65  int btreeRestore
6b10: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42  CursorPosition(B
6b20: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
6b30: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
6b40: 73 6b 69 70 4e 65 78 74 3b 0a 20 20 61 73 73 65  skipNext;.  asse
6b50: 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
6b60: 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
6b70: 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
6b80: 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52  eState>=CURSOR_R
6b90: 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
6ba0: 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
6bb0: 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  ==CURSOR_FAULT )
6bc0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 75  {.    return pCu
6bd0: 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 7d  r->skipNext;.  }
6be0: 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20  .  pCur->eState 
6bf0: 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
6c00: 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 4d 6f  ;.  rc = btreeMo
6c10: 76 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72 2d  veto(pCur, pCur-
6c20: 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65  >pKey, pCur->nKe
6c30: 79 2c 20 30 2c 20 26 73 6b 69 70 4e 65 78 74 29  y, 0, &skipNext)
6c40: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
6c50: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
6c60: 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e  ite3_free(pCur->
6c70: 70 4b 65 79 29 3b 0a 20 20 20 20 70 43 75 72 2d  pKey);.    pCur-
6c80: 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 61  >pKey = 0;.    a
6c90: 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
6ca0: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
6cb0: 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  D || pCur->eStat
6cc0: 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
6cd0: 44 20 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 73  D );.    pCur->s
6ce0: 6b 69 70 4e 65 78 74 20 7c 3d 20 73 6b 69 70 4e  kipNext |= skipN
6cf0: 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 43 75  ext;.    if( pCu
6d00: 72 2d 3e 73 6b 69 70 4e 65 78 74 20 26 26 20 70  r->skipNext && p
6d10: 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
6d20: 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
6d30: 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
6d40: 3d 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58  = CURSOR_SKIPNEX
6d50: 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  T;.    }.  }.  r
6d60: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65  eturn rc;.}..#de
6d70: 66 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72 73  fine restoreCurs
6d80: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a  orPosition(p) \.
6d90: 20 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55    (p->eState>=CU
6da0: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
6db0: 20 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 62 74   ? \.         bt
6dc0: 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72  reeRestoreCursor
6dd0: 50 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a  Position(p) : \.
6de0: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
6df0: 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  OK)../*.** Deter
6e00: 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20  mine whether or 
6e10: 6e 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61 73  not a cursor has
6e20: 20 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20   moved from the 
6e30: 70 6f 73 69 74 69 6f 6e 20 77 68 65 72 65 0a 2a  position where.*
6e40: 2a 20 69 74 20 77 61 73 20 6c 61 73 74 20 70 6c  * it was last pl
6e50: 61 63 65 64 2c 20 6f 72 20 68 61 73 20 62 65 65  aced, or has bee
6e60: 6e 20 69 6e 76 61 6c 69 64 61 74 65 64 20 66 6f  n invalidated fo
6e70: 72 20 61 6e 79 20 6f 74 68 65 72 20 72 65 61 73  r any other reas
6e80: 6f 6e 2e 0a 2a 2a 20 43 75 72 73 6f 72 73 20 63  on..** Cursors c
6e90: 61 6e 20 6d 6f 76 65 20 77 68 65 6e 20 74 68 65  an move when the
6ea0: 20 72 6f 77 20 74 68 65 79 20 61 72 65 20 70 6f   row they are po
6eb0: 69 6e 74 69 6e 67 20 61 74 20 69 73 20 64 65 6c  inting at is del
6ec0: 65 74 65 64 20 6f 75 74 0a 2a 2a 20 66 72 6f 6d  eted out.** from
6ed0: 20 75 6e 64 65 72 20 74 68 65 6d 2c 20 66 6f 72   under them, for
6ee0: 20 65 78 61 6d 70 6c 65 2e 20 20 43 75 72 73 6f   example.  Curso
6ef0: 72 20 6d 69 67 68 74 20 61 6c 73 6f 20 6d 6f 76  r might also mov
6f00: 65 20 69 66 20 61 20 62 74 72 65 65 0a 2a 2a 20  e if a btree.** 
6f10: 69 73 20 72 65 62 61 6c 61 6e 63 65 64 2e 0a 2a  is rebalanced..*
6f20: 2a 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69  *.** Calling thi
6f30: 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 61  s routine with a
6f40: 20 4e 55 4c 4c 20 63 75 72 73 6f 72 20 70 6f 69   NULL cursor poi
6f50: 6e 74 65 72 20 72 65 74 75 72 6e 73 20 66 61 6c  nter returns fal
6f60: 73 65 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68  se..**.** Use th
6f70: 65 20 73 65 70 61 72 61 74 65 20 73 71 6c 69 74  e separate sqlit
6f80: 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65 73  e3BtreeCursorRes
6f90: 74 6f 72 65 28 29 20 72 6f 75 74 69 6e 65 20 74  tore() routine t
6fa0: 6f 20 72 65 73 74 6f 72 65 20 61 20 63 75 72 73  o restore a curs
6fb0: 6f 72 0a 2a 2a 20 62 61 63 6b 20 74 6f 20 77 68  or.** back to wh
6fc0: 65 72 65 20 69 74 20 6f 75 67 68 74 20 74 6f 20  ere it ought to 
6fd0: 62 65 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  be if this routi
6fe0: 6e 65 20 72 65 74 75 72 6e 73 20 74 72 75 65 2e  ne returns true.
6ff0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
7000: 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76  treeCursorHasMov
7010: 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ed(BtCursor *pCu
7020: 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75  r){.  return pCu
7030: 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
7040: 52 5f 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a  R_VALID;.}../*.*
7050: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
7060: 65 73 74 6f 72 65 73 20 61 20 63 75 72 73 6f 72  estores a cursor
7070: 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69   back to its ori
7080: 67 69 6e 61 6c 20 70 6f 73 69 74 69 6f 6e 20 61  ginal position a
7090: 66 74 65 72 20 69 74 0a 2a 2a 20 68 61 73 20 62  fter it.** has b
70a0: 65 65 6e 20 6d 6f 76 65 64 20 62 79 20 73 6f 6d  een moved by som
70b0: 65 20 6f 75 74 73 69 64 65 20 61 63 74 69 76 69  e outside activi
70c0: 74 79 20 28 73 75 63 68 20 61 73 20 61 20 62 74  ty (such as a bt
70d0: 72 65 65 20 72 65 62 61 6c 61 6e 63 65 20 6f 72  ree rebalance or
70e0: 0a 2a 2a 20 61 20 72 6f 77 20 68 61 76 69 6e 67  .** a row having
70f0: 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75   been deleted ou
7100: 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  t from under the
7110: 20 63 75 72 73 6f 72 29 2e 20 20 0a 2a 2a 0a 2a   cursor).  .**.*
7120: 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 74 68  * On success, th
7130: 65 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77  e *pDifferentRow
7140: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 66 61   parameter is fa
7150: 6c 73 65 20 69 66 20 74 68 65 20 63 75 72 73 6f  lse if the curso
7160: 72 20 69 73 20 6c 65 66 74 0a 2a 2a 20 70 6f 69  r is left.** poi
7170: 6e 74 69 6e 67 20 61 74 20 65 78 61 63 74 6c 79  nting at exactly
7180: 20 74 68 65 20 73 61 6d 65 20 72 6f 77 2e 20 20   the same row.  
7190: 2a 70 44 69 66 66 65 72 6e 74 52 6f 77 20 69 73  *pDifferntRow is
71a0: 20 74 68 65 20 72 6f 77 20 74 68 65 20 63 75 72   the row the cur
71b0: 73 6f 72 0a 2a 2a 20 77 61 73 20 70 6f 69 6e 74  sor.** was point
71c0: 69 6e 67 20 74 6f 20 68 61 73 20 62 65 65 6e 20  ing to has been 
71d0: 64 65 6c 65 74 65 64 2c 20 66 6f 72 63 69 6e 67  deleted, forcing
71e0: 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70   the cursor to p
71f0: 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 0a 2a 2a 20  oint to some.** 
7200: 6e 65 61 72 62 79 20 72 6f 77 2e 0a 2a 2a 0a 2a  nearby row..**.*
7210: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
7220: 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61  hould only be ca
7230: 6c 6c 65 64 20 66 6f 72 20 61 20 63 75 72 73 6f  lled for a curso
7240: 72 20 74 68 61 74 20 6a 75 73 74 20 72 65 74 75  r that just retu
7250: 72 6e 65 64 0a 2a 2a 20 54 52 55 45 20 66 72 6f  rned.** TRUE fro
7260: 6d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  m sqlite3BtreeCu
7270: 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 29 2e 0a  rsorHasMoved()..
7280: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
7290: 72 65 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65  reeCursorRestore
72a0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
72b0: 20 69 6e 74 20 2a 70 44 69 66 66 65 72 65 6e 74   int *pDifferent
72c0: 52 6f 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Row){.  int rc;.
72d0: 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21  .  assert( pCur!
72e0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
72f0: 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
7300: 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
7310: 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
7320: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
7330: 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
7340: 20 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77    *pDifferentRow
7350: 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
7360: 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70   rc;.  }.  if( p
7370: 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
7380: 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
7390: 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20   *pDifferentRow 
73a0: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
73b0: 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
73c0: 73 6b 69 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 20  skipNext==0 );. 
73d0: 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f     *pDifferentRo
73e0: 77 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  w = 0;.  }.  ret
73f0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
7400: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
7410: 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49  ENABLE_CURSOR_HI
7420: 4e 54 53 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64  NTS./*.** Provid
7430: 65 20 68 69 6e 74 73 20 74 6f 20 74 68 65 20 63  e hints to the c
7440: 75 72 73 6f 72 2e 20 20 54 68 65 20 70 61 72 74  ursor.  The part
7450: 69 63 75 6c 61 72 20 68 69 6e 74 20 67 69 76 65  icular hint give
7460: 6e 20 28 61 6e 64 20 74 68 65 20 74 79 70 65 0a  n (and the type.
7470: 2a 2a 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66  ** and number of
7480: 20 74 68 65 20 76 61 72 61 72 67 73 20 70 61 72   the varargs par
7490: 61 6d 65 74 65 72 73 29 20 69 73 20 64 65 74 65  ameters) is dete
74a0: 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 65 48  rmined by the eH
74b0: 69 6e 74 54 79 70 65 0a 2a 2a 20 70 61 72 61 6d  intType.** param
74c0: 65 74 65 72 2e 20 20 53 65 65 20 74 68 65 20 64  eter.  See the d
74d0: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 74 68  efinitions of th
74e0: 65 20 42 54 52 45 45 5f 48 49 4e 54 5f 2a 20 6d  e BTREE_HINT_* m
74f0: 61 63 72 6f 73 20 66 6f 72 20 64 65 74 61 69 6c  acros for detail
7500: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
7510: 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 69 6e  e3BtreeCursorHin
7520: 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
7530: 2c 20 69 6e 74 20 65 48 69 6e 74 54 79 70 65 2c  , int eHintType,
7540: 20 2e 2e 2e 29 7b 0a 20 20 2f 2a 20 55 73 65 64   ...){.  /* Used
7550: 20 6f 6e 6c 79 20 62 79 20 73 79 73 74 65 6d 20   only by system 
7560: 74 68 61 74 20 73 75 62 73 74 69 74 75 74 65 20  that substitute 
7570: 74 68 65 69 72 20 6f 77 6e 20 73 74 6f 72 61 67  their own storag
7580: 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 7d 0a 23 65  e engine */.}.#e
7590: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76  ndif../*.** Prov
75a0: 69 64 65 20 66 6c 61 67 20 68 69 6e 74 73 20 74  ide flag hints t
75b0: 6f 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2f  o the cursor..*/
75c0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
75d0: 65 65 43 75 72 73 6f 72 48 69 6e 74 46 6c 61 67  eeCursorHintFlag
75e0: 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  s(BtCursor *pCur
75f0: 2c 20 75 6e 73 69 67 6e 65 64 20 78 29 7b 0a 20  , unsigned x){. 
7600: 20 61 73 73 65 72 74 28 20 78 3d 3d 42 54 52 45   assert( x==BTRE
7610: 45 5f 53 45 45 4b 5f 45 51 20 7c 7c 20 78 3d 3d  E_SEEK_EQ || x==
7620: 42 54 52 45 45 5f 42 55 4c 4b 4c 4f 41 44 20 7c  BTREE_BULKLOAD |
7630: 7c 20 78 3d 3d 30 20 29 3b 0a 20 20 70 43 75 72  | x==0 );.  pCur
7640: 2d 3e 68 69 6e 74 73 20 3d 20 78 3b 0a 7d 0a 0a  ->hints = x;.}..
7650: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
7660: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
7670: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 70 61  /*.** Given a pa
7680: 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 72  ge number of a r
7690: 65 67 75 6c 61 72 20 64 61 74 61 62 61 73 65 20  egular database 
76a0: 70 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65  page, return the
76b0: 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20   page.** number 
76c0: 66 6f 72 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  for the pointer-
76d0: 6d 61 70 20 70 61 67 65 20 74 68 61 74 20 63 6f  map page that co
76e0: 6e 74 61 69 6e 73 20 74 68 65 20 65 6e 74 72 79  ntains the entry
76f0: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 70 75   for the.** inpu
7700: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a  t page number..*
7710: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 28 6e  *.** Return 0 (n
7720: 6f 74 20 61 20 76 61 6c 69 64 20 70 61 67 65 29  ot a valid page)
7730: 20 66 6f 72 20 70 67 6e 6f 3d 3d 31 20 73 69 6e   for pgno==1 sin
7740: 63 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e  ce there is.** n
7750: 6f 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 61 73  o pointer map as
7760: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 61  sociated with pa
7770: 67 65 20 31 2e 20 20 54 68 65 20 69 6e 74 65 67  ge 1.  The integ
7780: 72 69 74 79 5f 63 68 65 63 6b 20 6c 6f 67 69 63  rity_check logic
7790: 0a 2a 2a 20 72 65 71 75 69 72 65 73 20 74 68 61  .** requires tha
77a0: 74 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 2a  t ptrmapPageno(*
77b0: 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69  ,1)!=1..*/.stati
77c0: 63 20 50 67 6e 6f 20 70 74 72 6d 61 70 50 61 67  c Pgno ptrmapPag
77d0: 65 6e 6f 28 42 74 53 68 61 72 65 64 20 2a 70 42  eno(BtShared *pB
77e0: 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  t, Pgno pgno){. 
77f0: 20 69 6e 74 20 6e 50 61 67 65 73 50 65 72 4d 61   int nPagesPerMa
7800: 70 50 61 67 65 3b 0a 20 20 50 67 6e 6f 20 69 50  pPage;.  Pgno iP
7810: 74 72 4d 61 70 2c 20 72 65 74 3b 0a 20 20 61 73  trMap, ret;.  as
7820: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
7830: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
7840: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 67  tex) );.  if( pg
7850: 6e 6f 3c 32 20 29 20 72 65 74 75 72 6e 20 30 3b  no<2 ) return 0;
7860: 0a 20 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50  .  nPagesPerMapP
7870: 61 67 65 20 3d 20 28 70 42 74 2d 3e 75 73 61 62  age = (pBt->usab
7880: 6c 65 53 69 7a 65 2f 35 29 2b 31 3b 0a 20 20 69  leSize/5)+1;.  i
7890: 50 74 72 4d 61 70 20 3d 20 28 70 67 6e 6f 2d 32  PtrMap = (pgno-2
78a0: 29 2f 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61  )/nPagesPerMapPa
78b0: 67 65 3b 0a 20 20 72 65 74 20 3d 20 28 69 50 74  ge;.  ret = (iPt
78c0: 72 4d 61 70 2a 6e 50 61 67 65 73 50 65 72 4d 61  rMap*nPagesPerMa
78d0: 70 50 61 67 65 29 20 2b 20 32 3b 20 0a 20 20 69  pPage) + 2; .  i
78e0: 66 28 20 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f  f( ret==PENDING_
78f0: 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
7900: 7b 0a 20 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d  {.    ret++;.  }
7910: 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d  .  return ret;.}
7920: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e  ../*.** Write an
7930: 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20   entry into the 
7940: 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a  pointer map..**.
7950: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
7960: 75 70 64 61 74 65 73 20 74 68 65 20 70 6f 69 6e  updates the poin
7970: 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f  ter map entry fo
7980: 72 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27 6b  r page number 'k
7990: 65 79 27 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69  ey'.** so that i
79a0: 74 20 6d 61 70 73 20 74 6f 20 74 79 70 65 20 27  t maps to type '
79b0: 65 54 79 70 65 27 20 61 6e 64 20 70 61 72 65 6e  eType' and paren
79c0: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27 70  t page number 'p
79d0: 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a  gno'..**.** If *
79e0: 70 52 43 20 69 73 20 69 6e 69 74 69 61 6c 6c 79  pRC is initially
79f0: 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e 6f 6e 2d 53   non-zero (non-S
7a00: 51 4c 49 54 45 5f 4f 4b 29 20 74 68 65 6e 20 74  QLITE_OK) then t
7a10: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a  his routine is.*
7a20: 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 61  * a no-op.  If a
7a30: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
7a40: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
7a50: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 77 72  error code is wr
7a60: 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70  itten.** into *p
7a70: 52 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  RC..*/.static vo
7a80: 69 64 20 70 74 72 6d 61 70 50 75 74 28 42 74 53  id ptrmapPut(BtS
7a90: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
7aa0: 20 6b 65 79 2c 20 75 38 20 65 54 79 70 65 2c 20   key, u8 eType, 
7ab0: 50 67 6e 6f 20 70 61 72 65 6e 74 2c 20 69 6e 74  Pgno parent, int
7ac0: 20 2a 70 52 43 29 7b 0a 20 20 44 62 50 61 67 65   *pRC){.  DbPage
7ad0: 20 2a 70 44 62 50 61 67 65 3b 20 20 2f 2a 20 54   *pDbPage;  /* T
7ae0: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  he pointer map p
7af0: 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74  age */.  u8 *pPt
7b00: 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20 54 68  rmap;      /* Th
7b10: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 64 61  e pointer map da
7b20: 74 61 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74  ta */.  Pgno iPt
7b30: 72 6d 61 70 3b 20 20 20 20 20 2f 2a 20 54 68 65  rmap;     /* The
7b40: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
7b50: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e  e number */.  in
7b60: 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20  t offset;       
7b70: 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 70 6f 69  /* Offset in poi
7b80: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
7b90: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
7ba0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
7bb0: 6f 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63  ode from subfunc
7bc0: 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 69 66 28 20  tions */..  if( 
7bd0: 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a  *pRC ) return;..
7be0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
7bf0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
7c00: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a  ->mutex) );.  /*
7c10: 20 54 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   The master-jour
7c20: 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20  nal page number 
7c30: 6d 75 73 74 20 6e 65 76 65 72 20 62 65 20 75 73  must never be us
7c40: 65 64 20 61 73 20 61 20 70 6f 69 6e 74 65 72 20  ed as a pointer 
7c50: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 61 73  map page */.  as
7c60: 73 65 72 74 28 20 30 3d 3d 50 54 52 4d 41 50 5f  sert( 0==PTRMAP_
7c70: 49 53 50 41 47 45 28 70 42 74 2c 20 50 45 4e 44  ISPAGE(pBt, PEND
7c80: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
7c90: 74 29 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  t)) );..  assert
7ca0: 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
7cb0: 6d 20 29 3b 0a 20 20 69 66 28 20 6b 65 79 3d 3d  m );.  if( key==
7cc0: 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  0 ){.    *pRC = 
7cd0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
7ce0: 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  KPT;.    return;
7cf0: 0a 20 20 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d  .  }.  iPtrmap =
7d00: 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70   PTRMAP_PAGENO(p
7d10: 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d  Bt, key);.  rc =
7d20: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
7d30: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50  (pBt->pPager, iP
7d40: 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 2c  trmap, &pDbPage,
7d50: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
7d60: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7d70: 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72  *pRC = rc;.    r
7d80: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 66 66  eturn;.  }.  off
7d90: 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52  set = PTRMAP_PTR
7da0: 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20  OFFSET(iPtrmap, 
7db0: 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73  key);.  if( offs
7dc0: 65 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70 52 43  et<0 ){.    *pRC
7dd0: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
7de0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f  T_BKPT;.    goto
7df0: 20 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20   ptrmap_exit;.  
7e00: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
7e10: 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  et <= (int)pBt->
7e20: 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a  usableSize-5 );.
7e30: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
7e40: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
7e50: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
7e60: 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 70 50  .  if( eType!=pP
7e70: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c  trmap[offset] ||
7e80: 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d   get4byte(&pPtrm
7e90: 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70  ap[offset+1])!=p
7ea0: 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41  arent ){.    TRA
7eb0: 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41  CE(("PTRMAP_UPDA
7ec0: 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c  TE: %d->(%d,%d)\
7ed0: 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20  n", key, eType, 
7ee0: 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 2a 70  parent));.    *p
7ef0: 52 43 3d 20 72 63 20 3d 20 73 71 6c 69 74 65 33  RC= rc = sqlite3
7f00: 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61  PagerWrite(pDbPa
7f10: 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
7f20: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7f30: 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66 73      pPtrmap[offs
7f40: 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20 20  et] = eType;.   
7f50: 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 74     put4byte(&pPt
7f60: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20  rmap[offset+1], 
7f70: 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  parent);.    }. 
7f80: 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78 69 74 3a   }..ptrmap_exit:
7f90: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
7fa0: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 7d  nref(pDbPage);.}
7fb0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20  ../*.** Read an 
7fc0: 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70  entry from the p
7fd0: 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a  ointer map..**.*
7fe0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
7ff0: 65 74 72 69 65 76 65 73 20 74 68 65 20 70 6f 69  etrieves the poi
8000: 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
8010: 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77  or page 'key', w
8020: 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79  riting.** the ty
8030: 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61  pe and parent pa
8040: 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45  ge number to *pE
8050: 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20  Type and *pPgno 
8060: 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a  respectively..**
8070: 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   An error code i
8080: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f  s returned if so
8090: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
80a0: 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51  ng, otherwise SQ
80b0: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
80c0: 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74  ic int ptrmapGet
80d0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
80e0: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45  Pgno key, u8 *pE
80f0: 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e  Type, Pgno *pPgn
8100: 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  o){.  DbPage *pD
8110: 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20  bPage;   /* The 
8120: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
8130: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d 61   */.  int iPtrma
8140: 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  p;       /* Poin
8150: 74 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64  ter map page ind
8160: 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72  ex */.  u8 *pPtr
8170: 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f  map;       /* Po
8180: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 64  inter map page d
8190: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66  ata */.  int off
81a0: 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f  set;        /* O
81b0: 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69  ffset of entry i
81c0: 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f  n pointer map */
81d0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
81e0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
81f0: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
8200: 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d  tex) );..  iPtrm
8210: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
8220: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
8230: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
8240: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
8250: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
8260: 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  age, 0);.  if( r
8270: 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  c!=0 ){.    retu
8280: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74  rn rc;.  }.  pPt
8290: 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c  rmap = (u8 *)sql
82a0: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
82b0: 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66  (pDbPage);..  of
82c0: 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54  fset = PTRMAP_PT
82d0: 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c  ROFFSET(iPtrmap,
82e0: 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66   key);.  if( off
82f0: 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c  set<0 ){.    sql
8300: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
8310: 44 62 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74  DbPage);.    ret
8320: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
8330: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61  PT_BKPT;.  }.  a
8340: 73 73 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d  ssert( offset <=
8350: 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c   (int)pBt->usabl
8360: 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73  eSize-5 );.  ass
8370: 65 72 74 28 20 70 45 54 79 70 65 21 3d 30 20 29  ert( pEType!=0 )
8380: 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d 20 70 50  ;.  *pEType = pP
8390: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20  trmap[offset];. 
83a0: 20 69 66 28 20 70 50 67 6e 6f 20 29 20 2a 70 50   if( pPgno ) *pP
83b0: 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
83c0: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
83d0: 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61  ]);..  sqlite3Pa
83e0: 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65  gerUnref(pDbPage
83f0: 29 3b 0a 20 20 69 66 28 20 2a 70 45 54 79 70 65  );.  if( *pEType
8400: 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20  <1 || *pEType>5 
8410: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
8420: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
8430: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
8440: 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66  ;.}..#else /* if
8450: 20 64 65 66 69 6e 65 64 20 53 51 4c 49 54 45 5f   defined SQLITE_
8460: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  OMIT_AUTOVACUUM 
8470: 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72  */.  #define ptr
8480: 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72  mapPut(w,x,y,z,r
8490: 63 29 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72  c).  #define ptr
84a0: 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20  mapGet(w,x,y,z) 
84b0: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66  SQLITE_OK.  #def
84c0: 69 6e 65 20 70 74 72 6d 61 70 50 75 74 4f 76 66  ine ptrmapPutOvf
84d0: 6c 50 74 72 28 78 2c 20 79 2c 20 72 63 29 0a 23  lPtr(x, y, rc).#
84e0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  endif../*.** Giv
84f0: 65 6e 20 61 20 62 74 72 65 65 20 70 61 67 65 20  en a btree page 
8500: 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65 78  and a cell index
8510: 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66 69   (0 means the fi
8520: 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74  rst cell on.** t
8530: 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e 73  he page, 1 means
8540: 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c   the second cell
8550: 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 20  , and so forth) 
8560: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
8570: 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  .** to the cell 
8580: 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 66  content..**.** f
8590: 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28 29  indCellPastPtr()
85a0: 20 64 6f 65 73 20 74 68 65 20 73 61 6d 65 20 65   does the same e
85b0: 78 63 65 70 74 20 69 74 20 73 6b 69 70 73 20 70  xcept it skips p
85c0: 61 73 74 20 74 68 65 20 69 6e 69 74 69 61 6c 0a  ast the initial.
85d0: 2a 2a 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20  ** 4-byte child 
85e0: 70 6f 69 6e 74 65 72 20 66 6f 75 6e 64 20 6f 6e  pointer found on
85f0: 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65 73 2c   interior pages,
8600: 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
8610: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
8620: 74 69 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20  tine works only 
8630: 66 6f 72 20 70 61 67 65 73 20 74 68 61 74 20 64  for pages that d
8640: 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76  o not contain ov
8650: 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f  erflow cells..*/
8660: 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c  .#define findCel
8670: 6c 28 50 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d  l(P,I) \.  ((P)-
8680: 3e 61 44 61 74 61 20 2b 20 28 28 50 29 2d 3e 6d  >aData + ((P)->m
8690: 61 73 6b 50 61 67 65 20 26 20 67 65 74 32 62 79  askPage & get2by
86a0: 74 65 41 6c 69 67 6e 65 64 28 26 28 50 29 2d 3e  teAligned(&(P)->
86b0: 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29  aCellIdx[2*(I)])
86c0: 29 29 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43  )).#define findC
86d0: 65 6c 6c 50 61 73 74 50 74 72 28 50 2c 49 29 20  ellPastPtr(P,I) 
86e0: 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61 4f  \.  ((P)->aDataO
86f0: 66 73 74 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b  fst + ((P)->mask
8700: 50 61 67 65 20 26 20 67 65 74 32 62 79 74 65 41  Page & get2byteA
8710: 6c 69 67 6e 65 64 28 26 28 50 29 2d 3e 61 43 65  ligned(&(P)->aCe
8720: 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a  llIdx[2*(I)]))).
8730: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
8740: 63 6f 6d 6d 6f 6e 20 74 61 69 6c 20 70 72 6f 63  common tail proc
8750: 65 73 73 69 6e 67 20 66 6f 72 20 62 74 72 65 65  essing for btree
8760: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 61  ParseCellPtr() a
8770: 6e 64 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65  nd.** btreeParse
8780: 43 65 6c 6c 50 74 72 49 6e 64 65 78 28 29 20 66  CellPtrIndex() f
8790: 6f 72 20 74 68 65 20 63 61 73 65 20 77 68 65 6e  or the case when
87a0: 20 74 68 65 20 63 65 6c 6c 20 64 6f 65 73 20 6e   the cell does n
87b0: 6f 74 20 66 69 74 20 65 6e 74 69 72 65 6c 79 0a  ot fit entirely.
87c0: 2a 2a 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 42  ** on a single B
87d0: 2d 74 72 65 65 20 70 61 67 65 2e 20 20 4d 61 6b  -tree page.  Mak
87e0: 65 20 6e 65 63 65 73 73 61 72 79 20 61 64 6a 75  e necessary adju
87f0: 73 74 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 43  stments to the C
8800: 65 6c 6c 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63  ellInfo.** struc
8810: 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
8820: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
8830: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
8840: 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f 72  ellAdjustSizeFor
8850: 4f 76 65 72 66 6c 6f 77 28 0a 20 20 4d 65 6d 50  Overflow(.  MemP
8860: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
8870: 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
8880: 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  aining the cell 
8890: 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
88a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
88b0: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  Pointer to the c
88c0: 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43  ell text. */.  C
88d0: 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20  ellInfo *pInfo  
88e0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
88f0: 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
8900: 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 49 66 20 74   */.){.  /* If t
8910: 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20  he payload will 
8920: 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74 65  not fit complete
8930: 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  ly on the local 
8940: 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20 20  page, we have.  
8950: 2a 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f 77  ** to decide how
8960: 20 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20 6c   much to store l
8970: 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d  ocally and how m
8980: 75 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74  uch to spill ont
8990: 6f 0a 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20  o.  ** overflow 
89a0: 70 61 67 65 73 2e 20 20 54 68 65 20 73 74 72 61  pages.  The stra
89b0: 74 65 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d  tegy is to minim
89c0: 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  ize the amount o
89d0: 66 20 75 6e 75 73 65 64 0a 20 20 2a 2a 20 73 70  f unused.  ** sp
89e0: 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20  ace on overflow 
89f0: 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65 70  pages while keep
8a00: 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  ing the amount o
8a10: 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a  f local storage.
8a20: 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e 20    ** in between 
8a30: 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78  minLocal and max
8a40: 4c 6f 63 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  Local..  **.  **
8a50: 20 57 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67   Warning:  chang
8a60: 69 6e 67 20 74 68 65 20 77 61 79 20 6f 76 65 72  ing the way over
8a70: 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69 73 20  flow payload is 
8a80: 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 61  distributed in a
8a90: 6e 79 0a 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c  ny.  ** way will
8aa0: 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e   result in an in
8ab0: 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 20  compatible file 
8ac0: 66 6f 72 6d 61 74 2e 0a 20 20 2a 2f 0a 20 20 69  format..  */.  i
8ad0: 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a  nt minLocal;  /*
8ae0: 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20   Minimum amount 
8af0: 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20  of payload held 
8b00: 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74  locally */.  int
8b10: 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d   maxLocal;  /* M
8b20: 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  aximum amount of
8b30: 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f   payload held lo
8b40: 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 73  cally */.  int s
8b50: 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65  urplus;   /* Ove
8b60: 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61 76  rflow payload av
8b70: 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61  ailable for loca
8b80: 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20  l storage */..  
8b90: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65  minLocal = pPage
8ba0: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 6d 61  ->minLocal;.  ma
8bb0: 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e  xLocal = pPage->
8bc0: 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 73 75 72 70  maxLocal;.  surp
8bd0: 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b  lus = minLocal +
8be0: 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61   (pInfo->nPayloa
8bf0: 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70  d - minLocal)%(p
8c00: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
8c10: 65 53 69 7a 65 2d 34 29 3b 0a 20 20 74 65 73 74  eSize-4);.  test
8c20: 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d  case( surplus==m
8c30: 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73  axLocal );.  tes
8c40: 74 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d  tcase( surplus==
8c50: 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20  maxLocal+1 );.  
8c60: 69 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d  if( surplus <= m
8c70: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 70  axLocal ){.    p
8c80: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28  Info->nLocal = (
8c90: 75 31 36 29 73 75 72 70 6c 75 73 3b 0a 20 20 7d  u16)surplus;.  }
8ca0: 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d  else{.    pInfo-
8cb0: 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d  >nLocal = (u16)m
8cc0: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 70  inLocal;.  }.  p
8cd0: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28 75  Info->nSize = (u
8ce0: 31 36 29 28 26 70 49 6e 66 6f 2d 3e 70 50 61 79  16)(&pInfo->pPay
8cf0: 6c 6f 61 64 5b 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  load[pInfo->nLoc
8d00: 61 6c 5d 20 2d 20 70 43 65 6c 6c 29 20 2b 20 34  al] - pCell) + 4
8d10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
8d20: 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
8d30: 73 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s are implementa
8d40: 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65 6d  tions of the Mem
8d50: 50 61 67 65 2e 78 50 61 72 73 65 43 65 6c 6c 28  Page.xParseCell(
8d60: 29 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a  ).** method..**.
8d70: 2a 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c 20  ** Parse a cell 
8d80: 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e  content block an
8d90: 64 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43 65  d fill in the Ce
8da0: 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  llInfo structure
8db0: 2e 0a 2a 2a 0a 2a 2a 20 62 74 72 65 65 50 61 72  ..**.** btreePar
8dc0: 73 65 43 65 6c 6c 50 74 72 28 29 20 20 20 20 20  seCellPtr()     
8dd0: 20 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 62 74     =>   table bt
8de0: 72 65 65 20 6c 65 61 66 20 6e 6f 64 65 73 0a 2a  ree leaf nodes.*
8df0: 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  * btreeParseCell
8e00: 4e 6f 50 61 79 6c 6f 61 64 28 29 20 20 3d 3e 20  NoPayload()  => 
8e10: 20 20 74 61 62 6c 65 20 62 74 72 65 65 20 69 6e    table btree in
8e20: 74 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20  ternal nodes.** 
8e30: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
8e40: 72 49 6e 64 65 78 28 29 20 20 20 3d 3e 20 20 20  rIndex()   =>   
8e50: 69 6e 64 65 78 20 62 74 72 65 65 20 6e 6f 64 65  index btree node
8e60: 73 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73  s.**.** There is
8e70: 20 61 6c 73 6f 20 61 20 77 72 61 70 70 65 72 20   also a wrapper 
8e80: 66 75 6e 63 74 69 6f 6e 20 62 74 72 65 65 50 61  function btreePa
8e90: 72 73 65 43 65 6c 6c 28 29 20 74 68 61 74 20 77  rseCell() that w
8ea0: 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20  orks for.** all 
8eb0: 4d 65 6d 50 61 67 65 20 74 79 70 65 73 20 61 6e  MemPage types an
8ec0: 64 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  d that reference
8ed0: 73 20 74 68 65 20 63 65 6c 6c 20 62 79 20 69 6e  s the cell by in
8ee0: 64 65 78 20 72 61 74 68 65 72 20 74 68 61 6e 0a  dex rather than.
8ef0: 2a 2a 20 62 79 20 70 6f 69 6e 74 65 72 2e 0a 2a  ** by pointer..*
8f00: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  /.static void bt
8f10: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 4e  reeParseCellPtrN
8f20: 6f 50 61 79 6c 6f 61 64 28 0a 20 20 4d 65 6d 50  oPayload(.  MemP
8f30: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
8f40: 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
8f50: 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  aining the cell 
8f60: 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
8f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8f80: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  Pointer to the c
8f90: 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43  ell text. */.  C
8fa0: 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20  ellInfo *pInfo  
8fb0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
8fc0: 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
8fd0: 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
8fe0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
8ff0: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
9000: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
9010: 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d  rt( pPage->leaf=
9020: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
9030: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
9040: 69 7a 65 3d 3d 34 20 29 3b 0a 23 69 66 6e 64 65  ize==4 );.#ifnde
9050: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
9060: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
9070: 52 28 70 50 61 67 65 29 3b 0a 23 65 6e 64 69 66  R(pPage);.#endif
9080: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20  .  pInfo->nSize 
9090: 3d 20 34 20 2b 20 67 65 74 56 61 72 69 6e 74 28  = 4 + getVarint(
90a0: 26 70 43 65 6c 6c 5b 34 5d 2c 20 28 75 36 34 2a  &pCell[4], (u64*
90b0: 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a  )&pInfo->nKey);.
90c0: 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61    pInfo->nPayloa
90d0: 64 20 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e  d = 0;.  pInfo->
90e0: 6e 4c 6f 63 61 6c 20 3d 20 30 3b 0a 20 20 70 49  nLocal = 0;.  pI
90f0: 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20  nfo->pPayload = 
9100: 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 73  0;.  return;.}.s
9110: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
9120: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 0a 20 20  ParseCellPtr(.  
9130: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
9140: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
9150: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
9160: 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  ell */.  u8 *pCe
9170: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
9180: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
9190: 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f  he cell text. */
91a0: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e  .  CellInfo *pIn
91b0: 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  fo         /* Fi
91c0: 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ll in this struc
91d0: 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20  ture */.){.  u8 
91e0: 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20 20 20  *pIter;         
91f0: 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e       /* For scan
9200: 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 70 43 65  ning through pCe
9210: 6c 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79  ll */.  u32 nPay
9220: 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20  load;           
9230: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
9240: 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f  es of cell paylo
9250: 61 64 20 2a 2f 0a 20 20 75 36 34 20 69 4b 65 79  ad */.  u64 iKey
9260: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9270: 2f 2a 20 45 78 74 72 61 63 74 65 64 20 4b 65 79  /* Extracted Key
9280: 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 61 73 73   value */..  ass
9290: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
92a0: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
92b0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
92c0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c  assert( pPage->l
92d0: 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d  eaf==0 || pPage-
92e0: 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 61 73  >leaf==1 );.  as
92f0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74  sert( pPage->int
9300: 4b 65 79 4c 65 61 66 20 29 3b 0a 20 20 61 73 73  KeyLeaf );.  ass
9310: 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c  ert( pPage->chil
9320: 64 50 74 72 53 69 7a 65 3d 3d 30 20 29 3b 0a 20  dPtrSize==0 );. 
9330: 20 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 3b 0a   pIter = pCell;.
9340: 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 62  .  /* The next b
9350: 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 69 73 20  lock of code is 
9360: 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20  equivalent to:. 
9370: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 70 49 74   **.  **     pIt
9380: 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  er += getVarint3
9390: 32 28 70 49 74 65 72 2c 20 6e 50 61 79 6c 6f 61  2(pIter, nPayloa
93a0: 64 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  d);.  **.  ** Th
93b0: 65 20 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65  e code is inline
93c0: 64 20 74 6f 20 61 76 6f 69 64 20 61 20 66 75 6e  d to avoid a fun
93d0: 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f  ction call..  */
93e0: 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70  .  nPayload = *p
93f0: 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 50 61 79  Iter;.  if( nPay
9400: 6c 6f 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20  load>=0x80 ){.  
9410: 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49    u8 *pEnd = &pI
9420: 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79  ter[8];.    nPay
9430: 6c 6f 61 64 20 26 3d 20 30 78 37 66 3b 0a 20 20  load &= 0x7f;.  
9440: 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79    do{.      nPay
9450: 6c 6f 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64  load = (nPayload
9460: 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72  <<7) | (*++pIter
9470: 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77   & 0x7f);.    }w
9480: 68 69 6c 65 28 20 28 2a 70 49 74 65 72 29 3e 3d  hile( (*pIter)>=
9490: 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45  0x80 && pIter<pE
94a0: 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65  nd );.  }.  pIte
94b0: 72 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e  r++;..  /* The n
94c0: 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64  ext block of cod
94d0: 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  e is equivalent 
94e0: 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  to:.  **.  **   
94f0: 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61    pIter += getVa
9500: 72 69 6e 74 28 70 49 74 65 72 2c 20 28 75 36 34  rint(pIter, (u64
9510: 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b  *)&pInfo->nKey);
9520: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63  .  **.  ** The c
9530: 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65 64 20 74  ode is inlined t
9540: 6f 20 61 76 6f 69 64 20 61 20 66 75 6e 63 74 69  o avoid a functi
9550: 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20  on call..  */.  
9560: 69 4b 65 79 20 3d 20 2a 70 49 74 65 72 3b 0a 20  iKey = *pIter;. 
9570: 20 69 66 28 20 69 4b 65 79 3e 3d 30 78 38 30 20   if( iKey>=0x80 
9580: 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20  ){.    u8 *pEnd 
9590: 3d 20 26 70 49 74 65 72 5b 37 5d 3b 0a 20 20 20  = &pIter[7];.   
95a0: 20 69 4b 65 79 20 26 3d 20 30 78 37 66 3b 0a 20   iKey &= 0x7f;. 
95b0: 20 20 20 77 68 69 6c 65 28 31 29 7b 0a 20 20 20     while(1){.   
95c0: 20 20 20 69 4b 65 79 20 3d 20 28 69 4b 65 79 3c     iKey = (iKey<
95d0: 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20  <7) | (*++pIter 
95e0: 26 20 30 78 37 66 29 3b 0a 20 20 20 20 20 20 69  & 0x7f);.      i
95f0: 66 28 20 28 2a 70 49 74 65 72 29 3c 30 78 38 30  f( (*pIter)<0x80
9600: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
9610: 69 66 28 20 70 49 74 65 72 3e 3d 70 45 6e 64 20  if( pIter>=pEnd 
9620: 29 7b 0a 20 20 20 20 20 20 20 20 69 4b 65 79 20  ){.        iKey 
9630: 3d 20 28 69 4b 65 79 3c 3c 38 29 20 7c 20 2a 2b  = (iKey<<8) | *+
9640: 2b 70 49 74 65 72 3b 0a 20 20 20 20 20 20 20 20  +pIter;.        
9650: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
9660: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49 74 65 72     }.  }.  pIter
9670: 2b 2b 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b  ++;..  pInfo->nK
9680: 65 79 20 3d 20 2a 28 69 36 34 2a 29 26 69 4b 65  ey = *(i64*)&iKe
9690: 79 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79  y;.  pInfo->nPay
96a0: 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b  load = nPayload;
96b0: 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f  .  pInfo->pPaylo
96c0: 61 64 20 3d 20 70 49 74 65 72 3b 0a 20 20 74 65  ad = pIter;.  te
96d0: 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64  stcase( nPayload
96e0: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
96f0: 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  l );.  testcase(
9700: 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65   nPayload==pPage
9710: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
9720: 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d    if( nPayload<=
9730: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
9740: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  ){.    /* This i
9750: 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d  s the (easy) com
9760: 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74  mon case where t
9770: 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61  he entire payloa
9780: 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e  d fits.    ** on
9790: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e   the local page.
97a0: 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73    No overflow is
97b0: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
97c0: 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69  /.    pInfo->nSi
97d0: 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20  ze = nPayload + 
97e0: 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43  (u16)(pIter - pC
97f0: 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 70 49  ell);.    if( pI
9800: 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20 70  nfo->nSize<4 ) p
9810: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b  Info->nSize = 4;
9820: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  .    pInfo->nLoc
9830: 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f  al = (u16)nPaylo
9840: 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ad;.  }else{.   
9850: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 41   btreeParseCellA
9860: 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65 72  djustSizeForOver
9870: 66 6c 6f 77 28 70 50 61 67 65 2c 20 70 43 65 6c  flow(pPage, pCel
9880: 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d  l, pInfo);.  }.}
9890: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
98a0: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e  eeParseCellPtrIn
98b0: 64 65 78 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  dex(.  MemPage *
98c0: 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f  pPage,         /
98d0: 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  * Page containin
98e0: 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  g the cell */.  
98f0: 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  u8 *pCell,      
9900: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
9910: 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74  er to the cell t
9920: 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  ext. */.  CellIn
9930: 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20  fo *pInfo       
9940: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69    /* Fill in thi
9950: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29  s structure */.)
9960: 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 3b 20 20  {.  u8 *pIter;  
9970: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
9980: 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f  or scanning thro
9990: 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75  ugh pCell */.  u
99a0: 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20  32 nPayload;    
99b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
99c0: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c   of bytes of cel
99d0: 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20  l payload */..  
99e0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
99f0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
9a00: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
9a10: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9a20: 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61  ->leaf==0 || pPa
9a30: 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20  ge->leaf==1 );. 
9a40: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
9a50: 69 6e 74 4b 65 79 4c 65 61 66 3d 3d 30 20 29 3b  intKeyLeaf==0 );
9a60: 0a 20 20 70 49 74 65 72 20 3d 20 70 43 65 6c 6c  .  pIter = pCell
9a70: 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   + pPage->childP
9a80: 74 72 53 69 7a 65 3b 0a 20 20 6e 50 61 79 6c 6f  trSize;.  nPaylo
9a90: 61 64 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69  ad = *pIter;.  i
9aa0: 66 28 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78 38  f( nPayload>=0x8
9ab0: 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e  0 ){.    u8 *pEn
9ac0: 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20  d = &pIter[8];. 
9ad0: 20 20 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20 30     nPayload &= 0
9ae0: 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20  x7f;.    do{.   
9af0: 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28 6e     nPayload = (n
9b00: 50 61 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28 2a  Payload<<7) | (*
9b10: 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b  ++pIter & 0x7f);
9b20: 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 2a 28 70  .    }while( *(p
9b30: 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70  Iter)>=0x80 && p
9b40: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
9b50: 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20 70 49  .  pIter++;.  pI
9b60: 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61 79  nfo->nKey = nPay
9b70: 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e  load;.  pInfo->n
9b80: 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f  Payload = nPaylo
9b90: 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61  ad;.  pInfo->pPa
9ba0: 79 6c 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a 20  yload = pIter;. 
9bb0: 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c   testcase( nPayl
9bc0: 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  oad==pPage->maxL
9bd0: 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61  ocal );.  testca
9be0: 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50  se( nPayload==pP
9bf0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20  age->maxLocal+1 
9c00: 29 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61  );.  if( nPayloa
9c10: 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d<=pPage->maxLoc
9c20: 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  al ){.    /* Thi
9c30: 73 20 69 73 20 74 68 65 20 28 65 61 73 79 29 20  s is the (easy) 
9c40: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
9c50: 65 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 79  e the entire pay
9c60: 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a  load fits.    **
9c70: 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61   on the local pa
9c80: 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77  ge.  No overflow
9c90: 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20   is required..  
9ca0: 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e    */.    pInfo->
9cb0: 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64  nSize = nPayload
9cc0: 20 2b 20 28 75 31 36 29 28 70 49 74 65 72 20 2d   + (u16)(pIter -
9cd0: 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28   pCell);.    if(
9ce0: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20   pInfo->nSize<4 
9cf0: 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d  ) pInfo->nSize =
9d00: 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   4;.    pInfo->n
9d10: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61  Local = (u16)nPa
9d20: 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a  yload;.  }else{.
9d30: 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
9d40: 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f  llAdjustSizeForO
9d50: 76 65 72 66 6c 6f 77 28 70 50 61 67 65 2c 20 70  verflow(pPage, p
9d60: 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20  Cell, pInfo);.  
9d70: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
9d80: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 0a  btreeParseCell(.
9d90: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
9da0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67  ,         /* Pag
9db0: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
9dc0: 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69   cell */.  int i
9dd0: 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
9de0: 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69     /* The cell i
9df0: 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63 65 6c  ndex.  First cel
9e00: 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c  l is 0 */.  Cell
9e10: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
9e20: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
9e30: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
9e40: 0a 29 7b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61  .){.  pPage->xPa
9e50: 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 66  rseCell(pPage, f
9e60: 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
9e70: 43 65 6c 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a 7d  Cell), pInfo);.}
9e80: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
9e90: 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61  owing routines a
9ea0: 72 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  re implementatio
9eb0: 6e 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67  ns of the MemPag
9ec0: 65 2e 78 43 65 6c 6c 53 69 7a 65 0a 2a 2a 20 6d  e.xCellSize.** m
9ed0: 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6d  ethod..**.** Com
9ee0: 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 6e  pute the total n
9ef0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
9f00: 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64 73  hat a Cell needs
9f10: 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20   in the cell.** 
9f20: 64 61 74 61 20 61 72 65 61 20 6f 66 20 74 68 65  data area of the
9f30: 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54 68   btree-page.  Th
9f40: 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72 20  e return number 
9f50: 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65 6c  includes the cel
9f60: 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65 72  l.** data header
9f70: 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20 70   and the local p
9f80: 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20  ayload, but not 
9f90: 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
9fa0: 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61 63  e or.** the spac
9fb0: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63 65  e used by the ce
9fc0: 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a  ll pointer..**.*
9fd0: 2a 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50  * cellSizePtrNoP
9fe0: 61 79 6c 6f 61 64 28 29 20 20 20 20 3d 3e 20 20  ayload()    =>  
9ff0: 20 74 61 62 6c 65 20 69 6e 74 65 72 6e 61 6c 20   table internal 
a000: 6e 6f 64 65 73 0a 2a 2a 20 63 65 6c 6c 53 69 7a  nodes.** cellSiz
a010: 65 50 74 72 28 29 20 20 20 20 20 20 20 20 20 20  ePtr()          
a020: 20 20 20 3d 3e 20 20 20 61 6c 6c 20 69 6e 64 65     =>   all inde
a030: 78 20 6e 6f 64 65 73 20 26 20 74 61 62 6c 65 20  x nodes & table 
a040: 6c 65 61 66 20 6e 6f 64 65 73 0a 2a 2f 0a 73 74  leaf nodes.*/.st
a050: 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a  atic u16 cellSiz
a060: 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50  ePtr(MemPage *pP
a070: 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b  age, u8 *pCell){
a080: 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d 20 70  .  u8 *pIter = p
a090: 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e 63 68  Cell + pPage->ch
a0a0: 69 6c 64 50 74 72 53 69 7a 65 3b 20 2f 2a 20 46  ildPtrSize; /* F
a0b0: 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
a0c0: 62 79 74 65 73 20 6f 66 20 70 43 65 6c 6c 20 2a  bytes of pCell *
a0d0: 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20 20 20  /.  u8 *pEnd;   
a0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a100: 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61 20 76  End mark for a v
a110: 61 72 69 6e 74 20 2a 2f 0a 20 20 75 33 32 20 6e  arint */.  u32 n
a120: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
a130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a140: 20 20 20 20 2f 2a 20 53 69 7a 65 20 76 61 6c 75      /* Size valu
a150: 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a  e to return */..
a160: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
a170: 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c  BUG.  /* The val
a180: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ue returned by t
a190: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
a1a0: 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74 68  uld always be th
a1b0: 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74  e same as.  ** t
a1c0: 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69  he (CellInfo.nSi
a1d0: 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64 20  ze) value found 
a1e0: 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20  by doing a full 
a1f0: 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20 2a  parse of the.  *
a200: 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54  * cell. If SQLIT
a210: 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69 6e  E_DEBUG is defin
a220: 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20  ed, an assert() 
a230: 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66  at the bottom of
a240: 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  .  ** this funct
a250: 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68 61  ion verifies tha
a260: 74 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e 74  t this invariant
a270: 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64   is not violated
a280: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
a290: 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70 50 61  debuginfo;.  pPa
a2a0: 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70  ge->xParseCell(p
a2b0: 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65  Page, pCell, &de
a2c0: 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64 69 66  buginfo);.#endif
a2d0: 0a 0a 20 20 6e 53 69 7a 65 20 3d 20 2a 70 49 74  ..  nSize = *pIt
a2e0: 65 72 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65 3e  er;.  if( nSize>
a2f0: 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 70 45 6e  =0x80 ){.    pEn
a300: 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20  d = &pIter[8];. 
a310: 20 20 20 6e 53 69 7a 65 20 26 3d 20 30 78 37 66     nSize &= 0x7f
a320: 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  ;.    do{.      
a330: 6e 53 69 7a 65 20 3d 20 28 6e 53 69 7a 65 3c 3c  nSize = (nSize<<
a340: 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26  7) | (*++pIter &
a350: 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69   0x7f);.    }whi
a360: 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d 30 78  le( *(pIter)>=0x
a370: 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64  80 && pIter<pEnd
a380: 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b   );.  }.  pIter+
a390: 2b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  +;.  if( pPage->
a3a0: 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a  intKey ){.    /*
a3b0: 20 70 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e 74   pIter now point
a3c0: 73 20 61 74 20 74 68 65 20 36 34 2d 62 69 74 20  s at the 64-bit 
a3d0: 69 6e 74 65 67 65 72 20 6b 65 79 20 76 61 6c 75  integer key valu
a3e0: 65 2c 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65  e, a variable le
a3f0: 6e 67 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e 74  ngth .    ** int
a400: 65 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77  eger. The follow
a410: 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73 20  ing block moves 
a420: 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61  pIter to point a
a430: 74 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  t the first byte
a440: 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65  .    ** past the
a450: 20 65 6e 64 20 6f 66 20 74 68 65 20 6b 65 79 20   end of the key 
a460: 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70 45  value. */.    pE
a470: 6e 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a  nd = &pIter[9];.
a480: 20 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49 74      while( (*pIt
a490: 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70 49  er++)&0x80 && pI
a4a0: 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a  ter<pEnd );.  }.
a4b0: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
a4c0: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
a4d0: 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  al );.  testcase
a4e0: 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e  ( nSize==pPage->
a4f0: 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20  maxLocal+1 );.  
a500: 69 66 28 20 6e 53 69 7a 65 3c 3d 70 50 61 67 65  if( nSize<=pPage
a510: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20  ->maxLocal ){.  
a520: 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32 29    nSize += (u32)
a530: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b  (pIter - pCell);
a540: 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c 34  .    if( nSize<4
a550: 20 29 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20   ) nSize = 4;.  
a560: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6d  }else{.    int m
a570: 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d  inLocal = pPage-
a580: 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e  >minLocal;.    n
a590: 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20  Size = minLocal 
a5a0: 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f  + (nSize - minLo
a5b0: 63 61 6c 29 20 25 20 28 70 50 61 67 65 2d 3e 70  cal) % (pPage->p
a5c0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
a5d0: 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73   4);.    testcas
a5e0: 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d  e( nSize==pPage-
a5f0: 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20  >maxLocal );.   
a600: 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65   testcase( nSize
a610: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
a620: 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e  l+1 );.    if( n
a630: 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c  Size>pPage->maxL
a640: 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e 53  ocal ){.      nS
a650: 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a  ize = minLocal;.
a660: 20 20 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65 20      }.    nSize 
a670: 2b 3d 20 34 20 2b 20 28 75 31 36 29 28 70 49 74  += 4 + (u16)(pIt
a680: 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 7d  er - pCell);.  }
a690: 0a 20 20 61 73 73 65 72 74 28 20 6e 53 69 7a 65  .  assert( nSize
a6a0: 3d 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a  ==debuginfo.nSiz
a6b0: 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  e || CORRUPT_DB 
a6c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31 36  );.  return (u16
a6d0: 29 6e 53 69 7a 65 3b 0a 7d 0a 73 74 61 74 69 63  )nSize;.}.static
a6e0: 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74 72   u16 cellSizePtr
a6f0: 4e 6f 50 61 79 6c 6f 61 64 28 4d 65 6d 50 61 67  NoPayload(MemPag
a700: 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43  e *pPage, u8 *pC
a710: 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74 65  ell){.  u8 *pIte
a720: 72 20 3d 20 70 43 65 6c 6c 20 2b 20 34 3b 20 2f  r = pCell + 4; /
a730: 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
a740: 65 72 20 62 79 74 65 73 20 6f 66 20 70 43 65 6c  er bytes of pCel
a750: 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b  l */.  u8 *pEnd;
a760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a770: 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61 20   End mark for a 
a780: 76 61 72 69 6e 74 20 2a 2f 0a 0a 23 69 66 64 65  varint */..#ifde
a790: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
a7a0: 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65   /* The value re
a7b0: 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 66  turned by this f
a7c0: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61  unction should a
a7d0: 6c 77 61 79 73 20 62 65 20 74 68 65 20 73 61 6d  lways be the sam
a7e0: 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43  e as.  ** the (C
a7f0: 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76  ellInfo.nSize) v
a800: 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f  alue found by do
a810: 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65  ing a full parse
a820: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c   of the.  ** cel
a830: 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42  l. If SQLITE_DEB
a840: 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61  UG is defined, a
a850: 6e 20 61 73 73 65 72 74 28 29 20 61 74 20 74 68  n assert() at th
a860: 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a  e bottom of.  **
a870: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76   this function v
a880: 65 72 69 66 69 65 73 20 74 68 61 74 20 74 68 69  erifies that thi
a890: 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e  s invariant is n
a8a0: 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a  ot violated. */.
a8b0: 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67    CellInfo debug
a8c0: 69 6e 66 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 78  info;.  pPage->x
a8d0: 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  ParseCell(pPage,
a8e0: 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e   pCell, &debugin
a8f0: 66 6f 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55  fo);.#else.  UNU
a900: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50  SED_PARAMETER(pP
a910: 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  age);.#endif..  
a920: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63  assert( pPage->c
a930: 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20 29  hildPtrSize==4 )
a940: 3b 0a 20 20 70 45 6e 64 20 3d 20 70 49 74 65 72  ;.  pEnd = pIter
a950: 20 2b 20 39 3b 0a 20 20 77 68 69 6c 65 28 20 28   + 9;.  while( (
a960: 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20 26  *pIter++)&0x80 &
a970: 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a  & pIter<pEnd );.
a980: 20 20 61 73 73 65 72 74 28 20 64 65 62 75 67 69    assert( debugi
a990: 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 28 75 31 36 29  nfo.nSize==(u16)
a9a0: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 20  (pIter - pCell) 
a9b0: 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
a9c0: 0a 20 20 72 65 74 75 72 6e 20 28 75 31 36 29 28  .  return (u16)(
a9d0: 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a  pIter - pCell);.
a9e0: 7d 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  }...#ifdef SQLIT
a9f0: 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 20  E_DEBUG./* This 
aa00: 76 61 72 69 61 74 69 6f 6e 20 6f 6e 20 63 65 6c  variation on cel
aa10: 6c 53 69 7a 65 50 74 72 28 29 20 69 73 20 75 73  lSizePtr() is us
aa20: 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73  ed inside of ass
aa30: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
aa40: 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61  .** only. */.sta
aa50: 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65  tic u16 cellSize
aa60: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
aa70: 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72   int iCell){.  r
aa80: 65 74 75 72 6e 20 70 50 61 67 65 2d 3e 78 43 65  eturn pPage->xCe
aa90: 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 66 69  llSize(pPage, fi
aaa0: 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  ndCell(pPage, iC
aab0: 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ell));.}.#endif.
aac0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
aad0: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
aae0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c  /*.** If the cel
aaf0: 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20 6f 66  l pCell, part of
ab00: 20 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e 74   page pPage cont
ab10: 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a  ains a pointer.*
ab20: 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  * to an overflow
ab30: 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61 6e   page, insert an
ab40: 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20   entry into the 
ab50: 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66  pointer-map.** f
ab60: 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
ab70: 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
ab80: 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74 4f 76  void ptrmapPutOv
ab90: 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70  flPtr(MemPage *p
aba0: 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 2c  Page, u8 *pCell,
abb0: 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 43 65   int *pRC){.  Ce
abc0: 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 69  llInfo info;.  i
abd0: 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e  f( *pRC ) return
abe0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 65 6c  ;.  assert( pCel
abf0: 6c 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 2d  l!=0 );.  pPage-
ac00: 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67  >xParseCell(pPag
ac10: 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
ac20: 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f  ;.  if( info.nLo
ac30: 63 61 6c 3c 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  cal<info.nPayloa
ac40: 64 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76  d ){.    Pgno ov
ac50: 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  fl = get4byte(&p
ac60: 43 65 6c 6c 5b 69 6e 66 6f 2e 6e 53 69 7a 65 2d  Cell[info.nSize-
ac70: 34 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50  4]);.    ptrmapP
ac80: 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f  ut(pPage->pBt, o
ac90: 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52  vfl, PTRMAP_OVER
aca0: 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67  FLOW1, pPage->pg
acb0: 6e 6f 2c 20 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a  no, pRC);.  }.}.
acc0: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44  #endif.../*.** D
acd0: 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61  efragment the pa
ace0: 67 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43  ge given.  All C
acf0: 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64 20 74  ells are moved t
ad00: 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20  o the.** end of 
ad10: 74 68 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c  the page and all
ad20: 20 66 72 65 65 20 73 70 61 63 65 20 69 73 20 63   free space is c
ad30: 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e  ollected into on
ad40: 65 0a 2a 2a 20 62 69 67 20 46 72 65 65 42 6c 6b  e.** big FreeBlk
ad50: 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20   that occurs in 
ad60: 62 65 74 77 65 65 6e 20 74 68 65 20 68 65 61 64  between the head
ad70: 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70  er and cell.** p
ad80: 6f 69 6e 74 65 72 20 61 72 72 61 79 20 61 6e 64  ointer array and
ad90: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
ada0: 74 20 61 72 65 61 2e 0a 2a 2a 0a 2a 2a 20 45 56  t area..**.** EV
adb0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 35  IDENCE-OF: R-445
adc0: 38 32 2d 36 30 31 33 38 20 53 51 4c 69 74 65 20  82-60138 SQLite 
add0: 6d 61 79 20 66 72 6f 6d 20 74 69 6d 65 20 74 6f  may from time to
ade0: 20 74 69 6d 65 20 72 65 6f 72 67 61 6e 69 7a 65   time reorganize
adf0: 20 61 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67   a.** b-tree pag
ae00: 65 20 73 6f 20 74 68 61 74 20 74 68 65 72 65 20  e so that there 
ae10: 61 72 65 20 6e 6f 20 66 72 65 65 62 6c 6f 63 6b  are no freeblock
ae20: 73 20 6f 72 20 66 72 61 67 6d 65 6e 74 20 62 79  s or fragment by
ae30: 74 65 73 2c 20 61 6c 6c 0a 2a 2a 20 75 6e 75 73  tes, all.** unus
ae40: 65 64 20 62 79 74 65 73 20 61 72 65 20 63 6f 6e  ed bytes are con
ae50: 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 75 6e  tained in the un
ae60: 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 20  allocated space 
ae70: 72 65 67 69 6f 6e 2c 20 61 6e 64 20 61 6c 6c 0a  region, and all.
ae80: 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20 70 61 63  ** cells are pac
ae90: 6b 65 64 20 74 69 67 68 74 6c 79 20 61 74 20 74  ked tightly at t
aea0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  he end of the pa
aeb0: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ge..*/.static in
aec0: 74 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65  t defragmentPage
aed0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
aee0: 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
aef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
af00: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
af10: 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20  /.  int pc;     
af20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
af30: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
af40: 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20   i-th cell */.  
af50: 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20  int hdr;        
af60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
af70: 66 73 65 74 20 74 6f 20 74 68 65 20 70 61 67 65  fset to the page
af80: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
af90: 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20   size;          
afa0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
afb0: 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69  of a cell */.  i
afc0: 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20  nt usableSize;  
afd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
afe0: 62 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79  ber of usable by
aff0: 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f  tes on a page */
b000: 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65  .  int cellOffse
b010: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
b020: 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63   Offset to the c
b030: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
b040: 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b  y */.  int cbrk;
b050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b060: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
b070: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
b080: 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  area */.  int nC
b090: 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
b0a0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
b0b0: 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70  f cells on the p
b0c0: 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  age */.  unsigne
b0d0: 64 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20  d char *data;   
b0e0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
b0f0: 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  data */.  unsign
b100: 65 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20 20  ed char *temp;  
b110: 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72 65       /* Temp are
b120: 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65  a for cell conte
b130: 6e 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  nt */.  unsigned
b140: 20 63 68 61 72 20 2a 73 72 63 3b 20 20 20 20 20   char *src;     
b150: 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6f 66 20     /* Source of 
b160: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  content */.  int
b170: 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20   iCellFirst;    
b180: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
b190: 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20   allowable cell 
b1a0: 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69  index */.  int i
b1b0: 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 20 20  CellLast;       
b1c0: 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f        /* Last po
b1d0: 73 73 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65  ssible cell inde
b1e0: 78 20 2a 2f 0a 0a 0a 20 20 61 73 73 65 72 74 28  x */...  assert(
b1f0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
b200: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
b210: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
b220: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
b230: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
b240: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
b250: 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54  bleSize <= SQLIT
b260: 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20  E_MAX_PAGE_SIZE 
b270: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
b280: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
b290: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
b2a0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
b2b0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
b2c0: 65 78 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20  ex) );.  temp = 
b2d0: 30 3b 0a 20 20 73 72 63 20 3d 20 64 61 74 61 20  0;.  src = data 
b2e0: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
b2f0: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
b300: 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c  drOffset;.  cell
b310: 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e  Offset = pPage->
b320: 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43  cellOffset;.  nC
b330: 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
b340: 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43  ll;.  assert( nC
b350: 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28 26 64  ell==get2byte(&d
b360: 61 74 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20  ata[hdr+3]) );. 
b370: 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50   usableSize = pP
b380: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
b390: 53 69 7a 65 3b 0a 20 20 63 62 72 6b 20 3d 20 75  Size;.  cbrk = u
b3a0: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65  sableSize;.  iCe
b3b0: 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66  llFirst = cellOf
b3c0: 66 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a  fset + 2*nCell;.
b3d0: 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73    iCellLast = us
b3e0: 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
b3f0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
b400: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a  ; i++){.    u8 *
b410: 70 41 64 64 72 3b 20 20 20 20 20 2f 2a 20 54 68  pAddr;     /* Th
b420: 65 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e  e i-th cell poin
b430: 74 65 72 20 2a 2f 0a 20 20 20 20 70 41 64 64 72  ter */.    pAddr
b440: 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66   = &data[cellOff
b450: 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20  set + i*2];.    
b460: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 41  pc = get2byte(pA
b470: 64 64 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61  ddr);.    testca
b480: 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72  se( pc==iCellFir
b490: 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  st );.    testca
b4a0: 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73  se( pc==iCellLas
b4b0: 74 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 73  t );.    /* Thes
b4c0: 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76  e conditions hav
b4d0: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 76  e already been v
b4e0: 65 72 69 66 69 65 64 20 69 6e 20 62 74 72 65 65  erified in btree
b4f0: 49 6e 69 74 50 61 67 65 28 29 0a 20 20 20 20 2a  InitPage().    *
b500: 2a 20 69 66 20 50 52 41 47 4d 41 20 63 65 6c 6c  * if PRAGMA cell
b510: 5f 73 69 7a 65 5f 63 68 65 63 6b 3d 4f 4e 2e 0a  _size_check=ON..
b520: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
b530: 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20  c<iCellFirst || 
b540: 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
b550: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
b560: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
b570: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
b580: 72 74 28 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72  rt( pc>=iCellFir
b590: 73 74 20 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c  st && pc<=iCellL
b5a0: 61 73 74 20 29 3b 0a 20 20 20 20 73 69 7a 65 20  ast );.    size 
b5b0: 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69  = pPage->xCellSi
b5c0: 7a 65 28 70 50 61 67 65 2c 20 26 73 72 63 5b 70  ze(pPage, &src[p
b5d0: 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d 3d  c]);.    cbrk -=
b5e0: 20 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 63   size;.    if( c
b5f0: 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c  brk<iCellFirst |
b600: 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65  | pc+size>usable
b610: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65  Size ){.      re
b620: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
b630: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
b640: 20 20 20 20 61 73 73 65 72 74 28 20 63 62 72 6b      assert( cbrk
b650: 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a  +size<=usableSiz
b660: 65 20 26 26 20 63 62 72 6b 3e 3d 69 43 65 6c 6c  e && cbrk>=iCell
b670: 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73  First );.    tes
b680: 74 63 61 73 65 28 20 63 62 72 6b 2b 73 69 7a 65  tcase( cbrk+size
b690: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ==usableSize );.
b6a0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
b6b0: 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a  +size==usableSiz
b6c0: 65 20 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  e );.    put2byt
b6d0: 65 28 70 41 64 64 72 2c 20 63 62 72 6b 29 3b 0a  e(pAddr, cbrk);.
b6e0: 20 20 20 20 69 66 28 20 74 65 6d 70 3d 3d 30 20      if( temp==0 
b6f0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 3b 0a  ){.      int x;.
b700: 20 20 20 20 20 20 69 66 28 20 63 62 72 6b 3d 3d        if( cbrk==
b710: 70 63 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  pc ) continue;. 
b720: 20 20 20 20 20 74 65 6d 70 20 3d 20 73 71 6c 69       temp = sqli
b730: 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63  te3PagerTempSpac
b740: 65 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50  e(pPage->pBt->pP
b750: 61 67 65 72 29 3b 0a 20 20 20 20 20 20 78 20 3d  ager);.      x =
b760: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
b770: 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20 6d  hdr+5]);.      m
b780: 65 6d 63 70 79 28 26 74 65 6d 70 5b 78 5d 2c 20  emcpy(&temp[x], 
b790: 26 64 61 74 61 5b 78 5d 2c 20 28 63 62 72 6b 2b  &data[x], (cbrk+
b7a0: 73 69 7a 65 29 20 2d 20 78 29 3b 0a 20 20 20 20  size) - x);.    
b7b0: 20 20 73 72 63 20 3d 20 74 65 6d 70 3b 0a 20 20    src = temp;.  
b7c0: 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 26    }.    memcpy(&
b7d0: 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 73 72 63  data[cbrk], &src
b7e0: 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 7d  [pc], size);.  }
b7f0: 0a 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 3e  .  assert( cbrk>
b800: 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20  =iCellFirst );. 
b810: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
b820: 68 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20  hdr+5], cbrk);. 
b830: 20 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30   data[hdr+1] = 0
b840: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d 20  ;.  data[hdr+2] 
b850: 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b  = 0;.  data[hdr+
b860: 37 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74  7] = 0;.  memset
b870: 28 26 64 61 74 61 5b 69 43 65 6c 6c 46 69 72 73  (&data[iCellFirs
b880: 74 5d 2c 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c  t], 0, cbrk-iCel
b890: 6c 46 69 72 73 74 29 3b 0a 20 20 61 73 73 65 72  lFirst);.  asser
b8a0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
b8b0: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
b8c0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
b8d0: 69 66 28 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69  if( cbrk-iCellFi
b8e0: 72 73 74 21 3d 70 50 61 67 65 2d 3e 6e 46 72 65  rst!=pPage->nFre
b8f0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
b900: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
b910: 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  KPT;.  }.  retur
b920: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
b930: 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68 65  /*.** Search the
b940: 20 66 72 65 65 2d 6c 69 73 74 20 6f 6e 20 70 61   free-list on pa
b950: 67 65 20 70 50 67 20 66 6f 72 20 73 70 61 63 65  ge pPg for space
b960: 20 74 6f 20 73 74 6f 72 65 20 61 20 63 65 6c 6c   to store a cell
b970: 20 6e 42 79 74 65 20 62 79 74 65 73 20 69 6e 0a   nByte bytes in.
b980: 2a 2a 20 73 69 7a 65 2e 20 49 66 20 6f 6e 65 20  ** size. If one 
b990: 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72 65  can be found, re
b9a0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
b9b0: 6f 20 74 68 65 20 73 70 61 63 65 20 61 6e 64 20  o the space and 
b9c0: 72 65 6d 6f 76 65 20 69 74 0a 2a 2a 20 66 72 6f  remove it.** fro
b9d0: 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  m the free-list.
b9e0: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69  .**.** If no sui
b9f0: 74 61 62 6c 65 20 73 70 61 63 65 20 63 61 6e 20  table space can 
ba00: 62 65 20 66 6f 75 6e 64 20 6f 6e 20 74 68 65 20  be found on the 
ba10: 66 72 65 65 2d 6c 69 73 74 2c 20 72 65 74 75 72  free-list, retur
ba20: 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  n NULL..**.** Th
ba30: 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
ba40: 64 65 74 65 63 74 20 63 6f 72 72 75 70 74 69 6f  detect corruptio
ba50: 6e 20 77 69 74 68 69 6e 20 70 50 67 2e 20 20 49  n within pPg.  I
ba60: 66 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 0a  f corruption is.
ba70: 2a 2a 20 64 65 74 65 63 74 65 64 20 74 68 65 6e  ** detected then
ba80: 20 2a 70 52 63 20 69 73 20 73 65 74 20 74 6f 20   *pRc is set to 
ba90: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 61  SQLITE_CORRUPT a
baa0: 6e 64 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  nd NULL is retur
bab0: 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 6c 6f 74 73  ned..**.** Slots
bac0: 20 6f 6e 20 74 68 65 20 66 72 65 65 20 6c 69 73   on the free lis
bad0: 74 20 74 68 61 74 20 61 72 65 20 62 65 74 77 65  t that are betwe
bae0: 65 6e 20 31 20 61 6e 64 20 33 20 62 79 74 65 73  en 1 and 3 bytes
baf0: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 42 79   larger than nBy
bb00: 74 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 69 67  te.** will be ig
bb10: 6e 6f 72 65 64 20 69 66 20 61 64 64 69 6e 67 20  nored if adding 
bb20: 74 68 65 20 65 78 74 72 61 20 73 70 61 63 65 20  the extra space 
bb30: 74 6f 20 74 68 65 20 66 72 61 67 6d 65 6e 74 61  to the fragmenta
bb40: 74 69 6f 6e 20 63 6f 75 6e 74 0a 2a 2a 20 63 61  tion count.** ca
bb50: 75 73 65 73 20 74 68 65 20 66 72 61 67 6d 65 6e  uses the fragmen
bb60: 74 61 74 69 6f 6e 20 63 6f 75 6e 74 20 74 6f 20  tation count to 
bb70: 65 78 63 65 65 64 20 36 30 2e 0a 2a 2f 0a 73 74  exceed 60..*/.st
bb80: 61 74 69 63 20 75 38 20 2a 70 61 67 65 46 69 6e  atic u8 *pageFin
bb90: 64 53 6c 6f 74 28 4d 65 6d 50 61 67 65 20 2a 70  dSlot(MemPage *p
bba0: 50 67 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69  Pg, int nByte, i
bbb0: 6e 74 20 2a 70 52 63 29 7b 0a 20 20 63 6f 6e 73  nt *pRc){.  cons
bbc0: 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 67 2d  t int hdr = pPg-
bbd0: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 38  >hdrOffset;.  u8
bbe0: 20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61 20 3d   * const aData =
bbf0: 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20 69   pPg->aData;.  i
bc00: 6e 74 20 69 41 64 64 72 20 3d 20 68 64 72 20 2b  nt iAddr = hdr +
bc10: 20 31 3b 0a 20 20 69 6e 74 20 70 63 20 3d 20 67   1;.  int pc = g
bc20: 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 69  et2byte(&aData[i
bc30: 41 64 64 72 5d 29 3b 0a 20 20 69 6e 74 20 78 3b  Addr]);.  int x;
bc40: 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  .  int usableSiz
bc50: 65 20 3d 20 70 50 67 2d 3e 70 42 74 2d 3e 75 73  e = pPg->pBt->us
bc60: 61 62 6c 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73  ableSize;..  ass
bc70: 65 72 74 28 20 70 63 3e 30 20 29 3b 0a 20 20 64  ert( pc>0 );.  d
bc80: 6f 7b 0a 20 20 20 20 69 6e 74 20 73 69 7a 65 3b  o{.    int size;
bc90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
bca0: 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65 20  ize of the free 
bcb0: 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 45  slot */.    /* E
bcc0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 36  VIDENCE-OF: R-06
bcd0: 38 36 36 2d 33 39 31 32 35 20 46 72 65 65 62 6c  866-39125 Freebl
bce0: 6f 63 6b 73 20 61 72 65 20 61 6c 77 61 79 73 20  ocks are always 
bcf0: 63 6f 6e 6e 65 63 74 65 64 20 69 6e 20 6f 72 64  connected in ord
bd00: 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 69 6e 63  er of.    ** inc
bd10: 72 65 61 73 69 6e 67 20 6f 66 66 73 65 74 2e 20  reasing offset. 
bd20: 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3e 75 73  */.    if( pc>us
bd30: 61 62 6c 65 53 69 7a 65 2d 34 20 7c 7c 20 70 63  ableSize-4 || pc
bd40: 3c 69 41 64 64 72 2b 34 20 29 7b 0a 20 20 20 20  <iAddr+4 ){.    
bd50: 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f    *pRc = SQLITE_
bd60: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
bd70: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
bd80: 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45    }.    /* EVIDE
bd90: 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 37 31 30 2d  NCE-OF: R-22710-
bda0: 35 33 33 32 38 20 54 68 65 20 74 68 69 72 64 20  53328 The third 
bdb0: 61 6e 64 20 66 6f 75 72 74 68 20 62 79 74 65 73  and fourth bytes
bdc0: 20 6f 66 20 65 61 63 68 0a 20 20 20 20 2a 2a 20   of each.    ** 
bdd0: 66 72 65 65 62 6c 6f 63 6b 20 66 6f 72 6d 20 61  freeblock form a
bde0: 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
bdf0: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
be00: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65   size of the fre
be10: 65 62 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 69 6e  eblock.    ** in
be20: 20 62 79 74 65 73 2c 20 69 6e 63 6c 75 64 69 6e   bytes, includin
be30: 67 20 74 68 65 20 34 2d 62 79 74 65 20 68 65 61  g the 4-byte hea
be40: 64 65 72 2e 20 2a 2f 0a 20 20 20 20 73 69 7a 65  der. */.    size
be50: 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44 61   = get2byte(&aDa
be60: 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 69  ta[pc+2]);.    i
be70: 66 28 20 28 78 20 3d 20 73 69 7a 65 20 2d 20 6e  f( (x = size - n
be80: 42 79 74 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20  Byte)>=0 ){.    
be90: 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 34    testcase( x==4
bea0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
beb0: 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20 20 20  se( x==3 );.    
bec0: 20 20 69 66 28 20 70 63 20 3c 20 70 50 67 2d 3e    if( pc < pPg->
bed0: 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 70 50 67  cellOffset+2*pPg
bee0: 2d 3e 6e 43 65 6c 6c 20 7c 7c 20 73 69 7a 65 2b  ->nCell || size+
bef0: 70 63 20 3e 20 75 73 61 62 6c 65 53 69 7a 65 20  pc > usableSize 
bf00: 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 63 20  ){.        *pRc 
bf10: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
bf20: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 72  _BKPT;.        r
bf30: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
bf40: 65 6c 73 65 20 69 66 28 20 78 3c 34 20 29 7b 0a  else if( x<4 ){.
bf50: 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45          /* EVIDE
bf60: 4e 43 45 2d 4f 46 3a 20 52 2d 31 31 34 39 38 2d  NCE-OF: R-11498-
bf70: 35 38 30 32 32 20 49 6e 20 61 20 77 65 6c 6c 2d  58022 In a well-
bf80: 66 6f 72 6d 65 64 20 62 2d 74 72 65 65 20 70 61  formed b-tree pa
bf90: 67 65 2c 20 74 68 65 20 74 6f 74 61 6c 0a 20 20  ge, the total.  
bfa0: 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20        ** number 
bfb0: 6f 66 20 62 79 74 65 73 20 69 6e 20 66 72 61 67  of bytes in frag
bfc0: 6d 65 6e 74 73 20 6d 61 79 20 6e 6f 74 20 65 78  ments may not ex
bfd0: 63 65 65 64 20 36 30 2e 20 2a 2f 0a 20 20 20 20  ceed 60. */.    
bfe0: 20 20 20 20 69 66 28 20 61 44 61 74 61 5b 68 64      if( aData[hd
bff0: 72 2b 37 5d 3e 35 37 20 29 20 72 65 74 75 72 6e  r+7]>57 ) return
c000: 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   0;..        /* 
c010: 52 65 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74 20  Remove the slot 
c020: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69  from the free-li
c030: 73 74 2e 20 55 70 64 61 74 65 20 74 68 65 20 6e  st. Update the n
c040: 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 20 20  umber of.       
c050: 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65 64 20 62   ** fragmented b
c060: 79 74 65 73 20 77 69 74 68 69 6e 20 74 68 65 20  ytes within the 
c070: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  page. */.       
c080: 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b 69   memcpy(&aData[i
c090: 41 64 64 72 5d 2c 20 26 61 44 61 74 61 5b 70 63  Addr], &aData[pc
c0a0: 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 61  ], 2);.        a
c0b0: 44 61 74 61 5b 68 64 72 2b 37 5d 20 2b 3d 20 28  Data[hdr+7] += (
c0c0: 75 38 29 78 3b 0a 20 20 20 20 20 20 7d 65 6c 73  u8)x;.      }els
c0d0: 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e{.        /* Th
c0e0: 65 20 73 6c 6f 74 20 72 65 6d 61 69 6e 73 20 6f  e slot remains o
c0f0: 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  n the free-list.
c100: 20 52 65 64 75 63 65 20 69 74 73 20 73 69 7a 65   Reduce its size
c110: 20 74 6f 20 61 63 63 6f 75 6e 74 0a 20 20 20 20   to account.    
c120: 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20       ** for the 
c130: 70 6f 72 74 69 6f 6e 20 75 73 65 64 20 62 79 20  portion used by 
c140: 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69  the new allocati
c150: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  on. */.        p
c160: 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 70  ut2byte(&aData[p
c170: 63 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20  c+2], x);.      
c180: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26  }.      return &
c190: 61 44 61 74 61 5b 70 63 20 2b 20 78 5d 3b 0a 20  aData[pc + x];. 
c1a0: 20 20 20 7d 0a 20 20 20 20 69 41 64 64 72 20 3d     }.    iAddr =
c1b0: 20 70 63 3b 0a 20 20 20 20 70 63 20 3d 20 67 65   pc;.    pc = ge
c1c0: 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 70 63  t2byte(&aData[pc
c1d0: 5d 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 70 63  ]);.  }while( pc
c1e0: 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b   );..  return 0;
c1f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
c200: 74 65 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f  te nByte bytes o
c210: 66 20 73 70 61 63 65 20 66 72 6f 6d 20 77 69 74  f space from wit
c220: 68 69 6e 20 74 68 65 20 42 2d 54 72 65 65 20 70  hin the B-Tree p
c230: 61 67 65 20 70 61 73 73 65 64 0a 2a 2a 20 61 73  age passed.** as
c240: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
c250: 65 6e 74 2e 20 57 72 69 74 65 20 69 6e 74 6f 20  ent. Write into 
c260: 2a 70 49 64 78 20 74 68 65 20 69 6e 64 65 78 20  *pIdx the index 
c270: 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74  into pPage->aDat
c280: 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69  a[].** of the fi
c290: 72 73 74 20 62 79 74 65 20 6f 66 20 61 6c 6c 6f  rst byte of allo
c2a0: 63 61 74 65 64 20 73 70 61 63 65 2e 20 52 65 74  cated space. Ret
c2b0: 75 72 6e 20 65 69 74 68 65 72 20 53 51 4c 49 54  urn either SQLIT
c2c0: 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65 72  E_OK or.** an er
c2d0: 72 6f 72 20 63 6f 64 65 20 28 75 73 75 61 6c 6c  ror code (usuall
c2e0: 79 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  y SQLITE_CORRUPT
c2f0: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  )..**.** The cal
c300: 6c 65 72 20 67 75 61 72 61 6e 74 65 65 73 20 74  ler guarantees t
c310: 68 61 74 20 74 68 65 72 65 20 69 73 20 73 75 66  hat there is suf
c320: 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 74 6f  ficient space to
c330: 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 61 6c 6c   make the.** all
c340: 6f 63 61 74 69 6f 6e 2e 20 20 54 68 69 73 20 72  ocation.  This r
c350: 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 6e 65 65  outine might nee
c360: 64 20 74 6f 20 64 65 66 72 61 67 6d 65 6e 74 20  d to defragment 
c370: 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 69 6e  in order to brin
c380: 67 0a 2a 2a 20 61 6c 6c 20 74 68 65 20 73 70 61  g.** all the spa
c390: 63 65 20 74 6f 67 65 74 68 65 72 2c 20 68 6f 77  ce together, how
c3a0: 65 76 65 72 2e 20 20 54 68 69 73 20 72 6f 75 74  ever.  This rout
c3b0: 69 6e 65 20 77 69 6c 6c 20 61 76 6f 69 64 20 75  ine will avoid u
c3c0: 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 72 73  sing.** the firs
c3d0: 74 20 74 77 6f 20 62 79 74 65 73 20 70 61 73 74  t two bytes past
c3e0: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
c3f0: 72 20 61 72 65 61 20 73 69 6e 63 65 20 70 72 65  r area since pre
c400: 73 75 6d 61 62 6c 79 20 74 68 69 73 0a 2a 2a 20  sumably this.** 
c410: 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 62 65  allocation is be
c420: 69 6e 67 20 6d 61 64 65 20 69 6e 20 6f 72 64 65  ing made in orde
c430: 72 20 74 6f 20 69 6e 73 65 72 74 20 61 20 6e 65  r to insert a ne
c440: 77 20 63 65 6c 6c 2c 20 73 6f 20 77 65 20 77 69  w cell, so we wi
c450: 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65 6e 64 20 75  ll.** also end u
c460: 70 20 6e 65 65 64 69 6e 67 20 61 20 6e 65 77 20  p needing a new 
c470: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  cell pointer..*/
c480: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
c490: 63 61 74 65 53 70 61 63 65 28 4d 65 6d 50 61 67  cateSpace(MemPag
c4a0: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e 42  e *pPage, int nB
c4b0: 79 74 65 2c 20 69 6e 74 20 2a 70 49 64 78 29 7b  yte, int *pIdx){
c4c0: 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72  .  const int hdr
c4d0: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
c4e0: 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  set;    /* Local
c4f0: 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d   cache of pPage-
c500: 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f 0a 20 20  >hdrOffset */.  
c510: 75 38 20 2a 20 63 6f 6e 73 74 20 64 61 74 61 20  u8 * const data 
c520: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20  = pPage->aData; 
c530: 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61       /* Local ca
c540: 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 61 44  che of pPage->aD
c550: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70  ata */.  int top
c560: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c580: 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 63   First byte of c
c590: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
c5a0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
c5b0: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
c5c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
c5d0: 74 65 67 65 72 20 72 65 74 75 72 6e 20 63 6f 64  teger return cod
c5e0: 65 20 2a 2f 0a 20 20 69 6e 74 20 67 61 70 3b 20  e */.  int gap; 
c5f0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
c600: 62 79 74 65 20 6f 66 20 67 61 70 20 62 65 74 77  byte of gap betw
c610: 65 65 6e 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  een cell pointer
c620: 73 20 61 6e 64 20 63 65 6c 6c 20 63 6f 6e 74 65  s and cell conte
c630: 6e 74 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72  nt */.  .  asser
c640: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
c650: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
c660: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
c670: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
c680: 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Bt );.  assert( 
c690: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
c6a0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
c6b0: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
c6c0: 74 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20  t( nByte>=0 );  
c6d0: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20  /* Minimum cell 
c6e0: 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61  size is 4 */.  a
c6f0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46  ssert( pPage->nF
c700: 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20  ree>=nByte );.  
c710: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
c720: 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20  Overflow==0 );. 
c730: 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 20 3c   assert( nByte <
c740: 20 28 69 6e 74 29 28 70 50 61 67 65 2d 3e 70 42   (int)(pPage->pB
c750: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 38 29  t->usableSize-8)
c760: 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
c770: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
c780: 20 3d 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34   == hdr + 12 - 4
c790: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a  *pPage->leaf );.
c7a0: 20 20 67 61 70 20 3d 20 70 50 61 67 65 2d 3e 63    gap = pPage->c
c7b0: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50  ellOffset + 2*pP
c7c0: 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73  age->nCell;.  as
c7d0: 73 65 72 74 28 20 67 61 70 3c 3d 36 35 35 33 36  sert( gap<=65536
c7e0: 20 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43   );.  /* EVIDENC
c7f0: 45 2d 4f 46 3a 20 52 2d 32 39 33 35 36 2d 30 32  E-OF: R-29356-02
c800: 33 39 31 20 49 66 20 74 68 65 20 64 61 74 61 62  391 If the datab
c810: 61 73 65 20 75 73 65 73 20 61 20 36 35 35 33 36  ase uses a 65536
c820: 2d 62 79 74 65 20 70 61 67 65 20 73 69 7a 65 0a  -byte page size.
c830: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 73    ** and the res
c840: 65 72 76 65 64 20 73 70 61 63 65 20 69 73 20 7a  erved space is z
c850: 65 72 6f 20 28 74 68 65 20 75 73 75 61 6c 20 76  ero (the usual v
c860: 61 6c 75 65 20 66 6f 72 20 72 65 73 65 72 76 65  alue for reserve
c870: 64 20 73 70 61 63 65 29 0a 20 20 2a 2a 20 74 68  d space).  ** th
c880: 65 6e 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  en the cell cont
c890: 65 6e 74 20 6f 66 66 73 65 74 20 6f 66 20 61 6e  ent offset of an
c8a0: 20 65 6d 70 74 79 20 70 61 67 65 20 77 61 6e 74   empty page want
c8b0: 73 20 74 6f 20 62 65 20 36 35 35 33 36 2e 0a 20  s to be 65536.. 
c8c0: 20 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74 68 61   ** However, tha
c8d0: 74 20 69 6e 74 65 67 65 72 20 69 73 20 74 6f 6f  t integer is too
c8e0: 20 6c 61 72 67 65 20 74 6f 20 62 65 20 73 74 6f   large to be sto
c8f0: 72 65 64 20 69 6e 20 61 20 32 2d 62 79 74 65 20  red in a 2-byte 
c900: 75 6e 73 69 67 6e 65 64 0a 20 20 2a 2a 20 69 6e  unsigned.  ** in
c910: 74 65 67 65 72 2c 20 73 6f 20 61 20 76 61 6c 75  teger, so a valu
c920: 65 20 6f 66 20 30 20 69 73 20 75 73 65 64 20 69  e of 0 is used i
c930: 6e 20 69 74 73 20 70 6c 61 63 65 2e 20 2a 2f 0a  n its place. */.
c940: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
c950: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
c960: 20 20 61 73 73 65 72 74 28 20 74 6f 70 3c 3d 28    assert( top<=(
c970: 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e  int)pPage->pBt->
c980: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 20 2f 2a  usableSize ); /*
c990: 20 50 72 65 76 65 6e 74 20 62 79 20 67 65 74 41   Prevent by getA
c9a0: 6e 64 49 6e 69 74 50 61 67 65 28 29 20 2a 2f 0a  ndInitPage() */.
c9b0: 20 20 69 66 28 20 67 61 70 3e 74 6f 70 20 29 7b    if( gap>top ){
c9c0: 0a 20 20 20 20 69 66 28 20 74 6f 70 3d 3d 30 20  .    if( top==0 
c9d0: 26 26 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  && pPage->pBt->u
c9e0: 73 61 62 6c 65 53 69 7a 65 3d 3d 36 35 35 33 36  sableSize==65536
c9f0: 20 29 7b 0a 20 20 20 20 20 20 74 6f 70 20 3d 20   ){.      top = 
ca00: 36 35 35 33 36 3b 0a 20 20 20 20 7d 65 6c 73 65  65536;.    }else
ca10: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
ca20: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
ca30: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  PT;.    }.  }.. 
ca40: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
ca50: 65 6e 6f 75 67 68 20 73 70 61 63 65 20 62 65 74  enough space bet
ca60: 77 65 65 6e 20 67 61 70 20 61 6e 64 20 74 6f 70  ween gap and top
ca70: 20 66 6f 72 20 6f 6e 65 20 6d 6f 72 65 20 63 65   for one more ce
ca80: 6c 6c 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20  ll pointer.  ** 
ca90: 61 72 72 61 79 20 65 6e 74 72 79 20 6f 66 66 73  array entry offs
caa0: 65 74 2c 20 61 6e 64 20 69 66 20 74 68 65 20 66  et, and if the f
cab0: 72 65 65 6c 69 73 74 20 69 73 20 6e 6f 74 20 65  reelist is not e
cac0: 6d 70 74 79 2c 20 74 68 65 6e 20 73 65 61 72 63  mpty, then searc
cad0: 68 20 74 68 65 0a 20 20 2a 2a 20 66 72 65 65 6c  h the.  ** freel
cae0: 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ist looking for 
caf0: 61 20 66 72 65 65 20 73 6c 6f 74 20 62 69 67 20  a free slot big 
cb00: 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66  enough to satisf
cb10: 79 20 74 68 65 20 72 65 71 75 65 73 74 2e 0a 20  y the request.. 
cb20: 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
cb30: 67 61 70 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20 20  gap+2==top );.  
cb40: 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 31 3d  testcase( gap+1=
cb50: 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61  =top );.  testca
cb60: 73 65 28 20 67 61 70 3d 3d 74 6f 70 20 29 3b 0a  se( gap==top );.
cb70: 20 20 69 66 28 20 28 64 61 74 61 5b 68 64 72 2b    if( (data[hdr+
cb80: 32 5d 20 7c 7c 20 64 61 74 61 5b 68 64 72 2b 31  2] || data[hdr+1
cb90: 5d 29 20 26 26 20 67 61 70 2b 32 3c 3d 74 6f 70  ]) && gap+2<=top
cba0: 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 53 70 61   ){.    u8 *pSpa
cbb0: 63 65 20 3d 20 70 61 67 65 46 69 6e 64 53 6c 6f  ce = pageFindSlo
cbc0: 74 28 70 50 61 67 65 2c 20 6e 42 79 74 65 2c 20  t(pPage, nByte, 
cbd0: 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 70 53  &rc);.    if( pS
cbe0: 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 61 73  pace ){.      as
cbf0: 73 65 72 74 28 20 70 53 70 61 63 65 3e 3d 64 61  sert( pSpace>=da
cc00: 74 61 20 26 26 20 28 70 53 70 61 63 65 20 2d 20  ta && (pSpace - 
cc10: 64 61 74 61 29 3c 36 35 35 33 36 20 29 3b 0a 20  data)<65536 );. 
cc20: 20 20 20 20 20 2a 70 49 64 78 20 3d 20 28 69 6e       *pIdx = (in
cc30: 74 29 28 70 53 70 61 63 65 20 2d 20 64 61 74 61  t)(pSpace - data
cc40: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
cc50: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
cc60: 65 6c 73 65 20 69 66 28 20 72 63 20 29 7b 0a 20  else if( rc ){. 
cc70: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
cc80: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
cc90: 54 68 65 20 72 65 71 75 65 73 74 20 63 6f 75 6c  The request coul
cca0: 64 20 6e 6f 74 20 62 65 20 66 75 6c 66 69 6c 6c  d not be fulfill
ccb0: 65 64 20 75 73 69 6e 67 20 61 20 66 72 65 65 6c  ed using a freel
ccc0: 69 73 74 20 73 6c 6f 74 2e 20 20 43 68 65 63 6b  ist slot.  Check
ccd0: 0a 20 20 2a 2a 20 74 6f 20 73 65 65 20 69 66 20  .  ** to see if 
cce0: 64 65 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20  defragmentation 
ccf0: 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  is necessary..  
cd00: 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  */.  testcase( g
cd10: 61 70 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f 70 20  ap+2+nByte==top 
cd20: 29 3b 0a 20 20 69 66 28 20 67 61 70 2b 32 2b 6e  );.  if( gap+2+n
cd30: 42 79 74 65 3e 74 6f 70 20 29 7b 0a 20 20 20 20  Byte>top ){.    
cd40: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
cd50: 43 65 6c 6c 3e 30 20 7c 7c 20 43 4f 52 52 55 50  Cell>0 || CORRUP
cd60: 54 5f 44 42 20 29 3b 0a 20 20 20 20 72 63 20 3d  T_DB );.    rc =
cd70: 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28   defragmentPage(
cd80: 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  pPage);.    if( 
cd90: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
cda0: 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
cdb0: 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b  teNotZero(&data[
cdc0: 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 61 73 73  hdr+5]);.    ass
cdd0: 65 72 74 28 20 67 61 70 2b 6e 42 79 74 65 3c 3d  ert( gap+nByte<=
cde0: 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f  top );.  }...  /
cdf0: 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  * Allocate memor
ce00: 79 20 66 72 6f 6d 20 74 68 65 20 67 61 70 20 69  y from the gap i
ce10: 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 65  n between the ce
ce20: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll pointer array
ce30: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 63 65  .  ** and the ce
ce40: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e  ll content area.
ce50: 20 20 54 68 65 20 62 74 72 65 65 49 6e 69 74 50    The btreeInitP
ce60: 61 67 65 28 29 20 63 61 6c 6c 20 68 61 73 20 61  age() call has a
ce70: 6c 72 65 61 64 79 0a 20 20 2a 2a 20 76 61 6c 69  lready.  ** vali
ce80: 64 61 74 65 64 20 74 68 65 20 66 72 65 65 6c 69  dated the freeli
ce90: 73 74 2e 20 20 47 69 76 65 6e 20 74 68 61 74 20  st.  Given that 
cea0: 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20  the freelist is 
ceb0: 76 61 6c 69 64 2c 20 74 68 65 72 65 0a 20 20 2a  valid, there.  *
cec0: 2a 20 69 73 20 6e 6f 20 77 61 79 20 74 68 61 74  * is no way that
ced0: 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   the allocation 
cee0: 63 61 6e 20 65 78 74 65 6e 64 20 6f 66 66 20 74  can extend off t
cef0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  he end of the pa
cf00: 67 65 2e 0a 20 20 2a 2a 20 54 68 65 20 61 73 73  ge..  ** The ass
cf10: 65 72 74 28 29 20 62 65 6c 6f 77 20 76 65 72 69  ert() below veri
cf20: 66 69 65 73 20 74 68 65 20 70 72 65 76 69 6f 75  fies the previou
cf30: 73 20 73 65 6e 74 65 6e 63 65 2e 0a 20 20 2a 2f  s sentence..  */
cf40: 0a 20 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b  .  top -= nByte;
cf50: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
cf60: 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a  a[hdr+5], top);.
cf70: 20 20 61 73 73 65 72 74 28 20 74 6f 70 2b 6e 42    assert( top+nB
cf80: 79 74 65 20 3c 3d 20 28 69 6e 74 29 70 50 61 67  yte <= (int)pPag
cf90: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
cfa0: 7a 65 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20  ze );.  *pIdx = 
cfb0: 74 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  top;.  return SQ
cfc0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
cfd0: 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63 74 69  * Return a secti
cfe0: 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67 65 2d  on of the pPage-
cff0: 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20 66 72  >aData to the fr
d000: 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66  eelist..** The f
d010: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
d020: 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63 6b 20   new free block 
d030: 69 73 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  is pPage->aData[
d040: 69 53 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74  iStart].** and t
d050: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62  he size of the b
d060: 6c 6f 63 6b 20 69 73 20 69 53 69 7a 65 20 62 79  lock is iSize by
d070: 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 64 6a 61 63  tes..**.** Adjac
d080: 65 6e 74 20 66 72 65 65 62 6c 6f 63 6b 73 20 61  ent freeblocks a
d090: 72 65 20 63 6f 61 6c 65 73 63 65 64 2e 0a 2a 2a  re coalesced..**
d0a0: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 65 76  .** Note that ev
d0b0: 65 6e 20 74 68 6f 75 67 68 20 74 68 65 20 66 72  en though the fr
d0c0: 65 65 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73  eeblock list was
d0d0: 20 63 68 65 63 6b 65 64 20 62 79 20 62 74 72 65   checked by btre
d0e0: 65 49 6e 69 74 50 61 67 65 28 29 2c 0a 2a 2a 20  eInitPage(),.** 
d0f0: 74 68 61 74 20 72 6f 75 74 69 6e 65 20 77 69 6c  that routine wil
d100: 6c 20 6e 6f 74 20 64 65 74 65 63 74 20 6f 76 65  l not detect ove
d110: 72 6c 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c  rlap between cel
d120: 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73  ls or freeblocks
d130: 2e 20 20 4e 6f 72 0a 2a 2a 20 64 6f 65 73 20 69  .  Nor.** does i
d140: 74 20 64 65 74 65 63 74 20 63 65 6c 6c 73 20 6f  t detect cells o
d150: 72 20 66 72 65 65 62 6c 6f 63 6b 73 20 74 68 61  r freeblocks tha
d160: 74 20 65 6e 63 72 6f 75 63 68 20 69 6e 74 6f 20  t encrouch into 
d170: 74 68 65 20 72 65 73 65 72 76 65 64 20 62 79 74  the reserved byt
d180: 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64  es.** at the end
d190: 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 20 53   of the page.  S
d1a0: 6f 20 64 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20  o do additional 
d1b0: 63 6f 72 72 75 70 74 69 6f 6e 20 63 68 65 63 6b  corruption check
d1c0: 73 20 69 6e 73 69 64 65 20 74 68 69 73 0a 2a 2a  s inside this.**
d1d0: 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 72 65 74   routine and ret
d1e0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
d1f0: 50 54 20 69 66 20 61 6e 79 20 70 72 6f 62 6c 65  PT if any proble
d200: 6d 73 20 61 72 65 20 66 6f 75 6e 64 2e 0a 2a 2f  ms are found..*/
d210: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65  .static int free
d220: 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70  Space(MemPage *p
d230: 50 61 67 65 2c 20 75 31 36 20 69 53 74 61 72 74  Page, u16 iStart
d240: 2c 20 75 31 36 20 69 53 69 7a 65 29 7b 0a 20 20  , u16 iSize){.  
d250: 75 31 36 20 69 50 74 72 3b 20 20 20 20 20 20 20  u16 iPtr;       
d260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d270: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
d280: 20 6f 66 20 70 74 72 20 74 6f 20 6e 65 78 74 20   of ptr to next 
d290: 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75  freeblock */.  u
d2a0: 31 36 20 69 46 72 65 65 42 6c 6b 3b 20 20 20 20  16 iFreeBlk;    
d2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2c0: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
d2d0: 6f 66 20 74 68 65 20 6e 65 78 74 20 66 72 65 65  of the next free
d2e0: 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 38 20 68 64  block */.  u8 hd
d2f0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
d300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d310: 20 2f 2a 20 50 61 67 65 20 68 65 61 64 65 72 20   /* Page header 
d320: 73 69 7a 65 2e 20 20 30 20 6f 72 20 31 30 30 20  size.  0 or 100 
d330: 2a 2f 0a 20 20 75 38 20 6e 46 72 61 67 20 3d 20  */.  u8 nFrag = 
d340: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
d350: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
d360: 64 75 63 74 69 6f 6e 20 69 6e 20 66 72 61 67 6d  duction in fragm
d370: 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 31  entation */.  u1
d380: 36 20 69 4f 72 69 67 53 69 7a 65 20 3d 20 69 53  6 iOrigSize = iS
d390: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
d3a0: 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
d3b0: 76 61 6c 75 65 20 6f 66 20 69 53 69 7a 65 20 2a  value of iSize *
d3c0: 2f 0a 20 20 75 33 32 20 69 4c 61 73 74 20 3d 20  /.  u32 iLast = 
d3d0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
d3e0: 6c 65 53 69 7a 65 2d 34 3b 20 2f 2a 20 4c 61 72  leSize-4; /* Lar
d3f0: 67 65 73 74 20 70 6f 73 73 69 62 6c 65 20 66 72  gest possible fr
d400: 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a  eeblock offset *
d410: 2f 0a 20 20 75 33 32 20 69 45 6e 64 20 3d 20 69  /.  u32 iEnd = i
d420: 53 74 61 72 74 20 2b 20 69 53 69 7a 65 3b 20 20  Start + iSize;  
d430: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
d440: 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65  st byte past the
d450: 20 69 53 74 61 72 74 20 62 75 66 66 65 72 20 2a   iStart buffer *
d460: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
d470: 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d  r *data = pPage-
d480: 3e 61 44 61 74 61 3b 20 20 20 2f 2a 20 50 61 67  >aData;   /* Pag
d490: 65 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20  e content */..  
d4a0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
d4b0: 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
d4c0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
d4d0: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
d4e0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
d4f0: 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
d500: 44 42 20 7c 7c 20 69 53 74 61 72 74 3e 3d 70 50  DB || iStart>=pP
d510: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36  age->hdrOffset+6
d520: 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72  +pPage->childPtr
d530: 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Size );.  assert
d540: 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
d550: 69 45 6e 64 20 3c 3d 20 70 50 61 67 65 2d 3e 70  iEnd <= pPage->p
d560: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
d570: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
d580: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
d590: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
d5a0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ) );.  assert( i
d5b0: 53 69 7a 65 3e 3d 34 20 29 3b 20 20 20 2f 2a 20  Size>=4 );   /* 
d5c0: 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a  Minimum cell siz
d5d0: 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65  e is 4 */.  asse
d5e0: 72 74 28 20 69 53 74 61 72 74 3c 3d 69 4c 61 73  rt( iStart<=iLas
d5f0: 74 20 29 3b 0a 0a 20 20 2f 2a 20 4f 76 65 72 77  t );..  /* Overw
d600: 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66  rite deleted inf
d610: 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65  ormation with ze
d620: 72 6f 73 20 77 68 65 6e 20 74 68 65 20 73 65 63  ros when the sec
d630: 75 72 65 5f 64 65 6c 65 74 65 0a 20 20 2a 2a 20  ure_delete.  ** 
d640: 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  option is enable
d650: 64 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65  d */.  if( pPage
d660: 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ->pBt->btsFlags 
d670: 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  & BTS_SECURE_DEL
d680: 45 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  ETE ){.    memse
d690: 74 28 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c  t(&data[iStart],
d6a0: 20 30 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a   0, iSize);.  }.
d6b0: 0a 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 6f  .  /* The list o
d6c0: 66 20 66 72 65 65 62 6c 6f 63 6b 73 20 6d 75 73  f freeblocks mus
d6d0: 74 20 62 65 20 69 6e 20 61 73 63 65 6e 64 69 6e  t be in ascendin
d6e0: 67 20 6f 72 64 65 72 2e 20 20 46 69 6e 64 20 74  g order.  Find t
d6f0: 68 65 20 0a 20 20 2a 2a 20 73 70 6f 74 20 6f 6e  he .  ** spot on
d700: 20 74 68 65 20 6c 69 73 74 20 77 68 65 72 65 20   the list where 
d710: 69 53 74 61 72 74 20 73 68 6f 75 6c 64 20 62 65  iStart should be
d720: 20 69 6e 73 65 72 74 65 64 2e 0a 20 20 2a 2f 0a   inserted..  */.
d730: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
d740: 64 72 4f 66 66 73 65 74 3b 0a 20 20 69 50 74 72  drOffset;.  iPtr
d750: 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69 66   = hdr + 1;.  if
d760: 28 20 64 61 74 61 5b 69 50 74 72 2b 31 5d 3d 3d  ( data[iPtr+1]==
d770: 30 20 26 26 20 64 61 74 61 5b 69 50 74 72 5d 3d  0 && data[iPtr]=
d780: 3d 30 20 29 7b 0a 20 20 20 20 69 46 72 65 65 42  =0 ){.    iFreeB
d790: 6c 6b 20 3d 20 30 3b 20 20 2f 2a 20 53 68 6f 72  lk = 0;  /* Shor
d7a0: 74 63 75 74 20 66 6f 72 20 74 68 65 20 63 61 73  tcut for the cas
d7b0: 65 20 77 68 65 6e 20 74 68 65 20 66 72 65 65 6c  e when the freel
d7c0: 69 73 74 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a  ist is empty */.
d7d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69    }else{.    whi
d7e0: 6c 65 28 20 28 69 46 72 65 65 42 6c 6b 20 3d 20  le( (iFreeBlk = 
d7f0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
d800: 50 74 72 5d 29 29 3c 69 53 74 61 72 74 20 29 7b  Ptr]))<iStart ){
d810: 0a 20 20 20 20 20 20 69 66 28 20 69 46 72 65 65  .      if( iFree
d820: 42 6c 6b 3c 69 50 74 72 2b 34 20 29 7b 0a 20 20  Blk<iPtr+4 ){.  
d830: 20 20 20 20 20 20 69 66 28 20 69 46 72 65 65 42        if( iFreeB
d840: 6c 6b 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  lk==0 ) break;. 
d850: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
d860: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
d870: 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  T;.      }.     
d880: 20 69 50 74 72 20 3d 20 69 46 72 65 65 42 6c 6b   iPtr = iFreeBlk
d890: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
d8a0: 69 46 72 65 65 42 6c 6b 3e 69 4c 61 73 74 20 29  iFreeBlk>iLast )
d8b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
d8c0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
d8d0: 20 61 73 73 65 72 74 28 20 69 46 72 65 65 42 6c   assert( iFreeBl
d8e0: 6b 3e 69 50 74 72 20 7c 7c 20 69 46 72 65 65 42  k>iPtr || iFreeB
d8f0: 6c 6b 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 20 20  lk==0 );.  .    
d900: 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
d910: 3a 0a 20 20 20 20 2a 2a 20 20 20 20 69 46 72 65  :.    **    iFre
d920: 65 42 6c 6b 3a 20 20 20 46 69 72 73 74 20 66 72  eBlk:   First fr
d930: 65 65 62 6c 6f 63 6b 20 61 66 74 65 72 20 69 53  eeblock after iS
d940: 74 61 72 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66  tart, or zero if
d950: 20 6e 6f 6e 65 0a 20 20 20 20 2a 2a 20 20 20 20   none.    **    
d960: 69 50 74 72 3a 20 20 20 20 20 20 20 54 68 65 20  iPtr:       The 
d970: 61 64 64 72 65 73 73 20 6f 66 20 61 20 70 6f 69  address of a poi
d980: 6e 74 65 72 20 74 6f 20 69 46 72 65 65 42 6c 6b  nter to iFreeBlk
d990: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43  .    **.    ** C
d9a0: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69  heck to see if i
d9b0: 46 72 65 65 42 6c 6b 20 73 68 6f 75 6c 64 20 62  FreeBlk should b
d9c0: 65 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f  e coalesced onto
d9d0: 20 74 68 65 20 65 6e 64 20 6f 66 20 69 53 74 61   the end of iSta
d9e0: 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  rt..    */.    i
d9f0: 66 28 20 69 46 72 65 65 42 6c 6b 20 26 26 20 69  f( iFreeBlk && i
da00: 45 6e 64 2b 33 3e 3d 69 46 72 65 65 42 6c 6b 20  End+3>=iFreeBlk 
da10: 29 7b 0a 20 20 20 20 20 20 6e 46 72 61 67 20 3d  ){.      nFrag =
da20: 20 69 46 72 65 65 42 6c 6b 20 2d 20 69 45 6e 64   iFreeBlk - iEnd
da30: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45 6e 64  ;.      if( iEnd
da40: 3e 69 46 72 65 65 42 6c 6b 20 29 20 72 65 74 75  >iFreeBlk ) retu
da50: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
da60: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 69 45  T_BKPT;.      iE
da70: 6e 64 20 3d 20 69 46 72 65 65 42 6c 6b 20 2b 20  nd = iFreeBlk + 
da80: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
da90: 46 72 65 65 42 6c 6b 2b 32 5d 29 3b 0a 20 20 20  FreeBlk+2]);.   
daa0: 20 20 20 69 66 28 20 69 45 6e 64 20 3e 20 70 50     if( iEnd > pP
dab0: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
dac0: 53 69 7a 65 20 29 20 72 65 74 75 72 6e 20 53 51  Size ) return SQ
dad0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
dae0: 54 3b 0a 20 20 20 20 20 20 69 53 69 7a 65 20 3d  T;.      iSize =
daf0: 20 69 45 6e 64 20 2d 20 69 53 74 61 72 74 3b 0a   iEnd - iStart;.
db00: 20 20 20 20 20 20 69 46 72 65 65 42 6c 6b 20 3d        iFreeBlk =
db10: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
db20: 69 46 72 65 65 42 6c 6b 5d 29 3b 0a 20 20 20 20  iFreeBlk]);.    
db30: 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 69  }.  .    /* If i
db40: 50 74 72 20 69 73 20 61 6e 6f 74 68 65 72 20 66  Ptr is another f
db50: 72 65 65 62 6c 6f 63 6b 20 28 74 68 61 74 20 69  reeblock (that i
db60: 73 2c 20 69 66 20 69 50 74 72 20 69 73 20 6e 6f  s, if iPtr is no
db70: 74 20 74 68 65 20 66 72 65 65 6c 69 73 74 0a 20  t the freelist. 
db80: 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 69 6e     ** pointer in
db90: 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72   the page header
dba0: 29 20 74 68 65 6e 20 63 68 65 63 6b 20 74 6f 20  ) then check to 
dbb0: 73 65 65 20 69 66 20 69 53 74 61 72 74 20 73 68  see if iStart sh
dbc0: 6f 75 6c 64 20 62 65 0a 20 20 20 20 2a 2a 20 63  ould be.    ** c
dbd0: 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f 20 74 68  oalesced onto th
dbe0: 65 20 65 6e 64 20 6f 66 20 69 50 74 72 2e 0a 20  e end of iPtr.. 
dbf0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50     */.    if( iP
dc00: 74 72 3e 68 64 72 2b 31 20 29 7b 0a 20 20 20 20  tr>hdr+1 ){.    
dc10: 20 20 69 6e 74 20 69 50 74 72 45 6e 64 20 3d 20    int iPtrEnd = 
dc20: 69 50 74 72 20 2b 20 67 65 74 32 62 79 74 65 28  iPtr + get2byte(
dc30: 26 64 61 74 61 5b 69 50 74 72 2b 32 5d 29 3b 0a  &data[iPtr+2]);.
dc40: 20 20 20 20 20 20 69 66 28 20 69 50 74 72 45 6e        if( iPtrEn
dc50: 64 2b 33 3e 3d 69 53 74 61 72 74 20 29 7b 0a 20  d+3>=iStart ){. 
dc60: 20 20 20 20 20 20 20 69 66 28 20 69 50 74 72 45         if( iPtrE
dc70: 6e 64 3e 69 53 74 61 72 74 20 29 20 72 65 74 75  nd>iStart ) retu
dc80: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
dc90: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
dca0: 6e 46 72 61 67 20 2b 3d 20 69 53 74 61 72 74 20  nFrag += iStart 
dcb0: 2d 20 69 50 74 72 45 6e 64 3b 0a 20 20 20 20 20  - iPtrEnd;.     
dcc0: 20 20 20 69 53 69 7a 65 20 3d 20 69 45 6e 64 20     iSize = iEnd 
dcd0: 2d 20 69 50 74 72 3b 0a 20 20 20 20 20 20 20 20  - iPtr;.        
dce0: 69 53 74 61 72 74 20 3d 20 69 50 74 72 3b 0a 20  iStart = iPtr;. 
dcf0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
dd00: 20 69 66 28 20 6e 46 72 61 67 3e 64 61 74 61 5b   if( nFrag>data[
dd10: 68 64 72 2b 37 5d 20 29 20 72 65 74 75 72 6e 20  hdr+7] ) return 
dd20: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
dd30: 4b 50 54 3b 0a 20 20 20 20 64 61 74 61 5b 68 64  KPT;.    data[hd
dd40: 72 2b 37 5d 20 2d 3d 20 6e 46 72 61 67 3b 0a 20  r+7] -= nFrag;. 
dd50: 20 7d 0a 20 20 69 66 28 20 69 53 74 61 72 74 3d   }.  if( iStart=
dd60: 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b  =get2byte(&data[
dd70: 68 64 72 2b 35 5d 29 20 29 7b 0a 20 20 20 20 2f  hdr+5]) ){.    /
dd80: 2a 20 54 68 65 20 6e 65 77 20 66 72 65 65 62 6c  * The new freebl
dd90: 6f 63 6b 20 69 73 20 61 74 20 74 68 65 20 62 65  ock is at the be
dda0: 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63  ginning of the c
ddb0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
ddc0: 2c 0a 20 20 20 20 2a 2a 20 73 6f 20 6a 75 73 74  ,.    ** so just
ddd0: 20 65 78 74 65 6e 64 20 74 68 65 20 63 65 6c 6c   extend the cell
dde0: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 72 61   content area ra
ddf0: 74 68 65 72 20 74 68 61 6e 20 63 72 65 61 74 65  ther than create
de00: 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20   another.    ** 
de10: 66 72 65 65 6c 69 73 74 20 65 6e 74 72 79 20 2a  freelist entry *
de20: 2f 0a 20 20 20 20 69 66 28 20 69 50 74 72 21 3d  /.    if( iPtr!=
de30: 68 64 72 2b 31 20 29 20 72 65 74 75 72 6e 20 53  hdr+1 ) return S
de40: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
de50: 50 54 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  PT;.    put2byte
de60: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 69  (&data[hdr+1], i
de70: 46 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75  FreeBlk);.    pu
de80: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
de90: 2b 35 5d 2c 20 69 45 6e 64 29 3b 0a 20 20 7d 65  +5], iEnd);.  }e
dea0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 73 65  lse{.    /* Inse
deb0: 72 74 20 74 68 65 20 6e 65 77 20 66 72 65 65 62  rt the new freeb
dec0: 6c 6f 63 6b 20 69 6e 74 6f 20 74 68 65 20 66 72  lock into the fr
ded0: 65 65 6c 69 73 74 20 2a 2f 0a 20 20 20 20 70 75  eelist */.    pu
dee0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 50 74  t2byte(&data[iPt
def0: 72 5d 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20  r], iStart);.   
df00: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
df10: 69 53 74 61 72 74 5d 2c 20 69 46 72 65 65 42 6c  iStart], iFreeBl
df20: 6b 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  k);.    put2byte
df30: 28 26 64 61 74 61 5b 69 53 74 61 72 74 2b 32 5d  (&data[iStart+2]
df40: 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20  , iSize);.  }.  
df50: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20  pPage->nFree += 
df60: 69 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72 65 74  iOrigSize;.  ret
df70: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
df80: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74  ../*.** Decode t
df90: 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 28 74  he flags byte (t
dfa0: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
dfb0: 20 74 68 65 20 68 65 61 64 65 72 29 20 66 6f 72   the header) for
dfc0: 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69   a page.** and i
dfd0: 6e 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64 73  nitialize fields
dfe0: 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20   of the MemPage 
dff0: 73 74 72 75 63 74 75 72 65 20 61 63 63 6f 72 64  structure accord
e000: 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  ingly..**.** Onl
e010: 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  y the following 
e020: 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72 65  combinations are
e030: 20 73 75 70 70 6f 72 74 65 64 2e 20 20 41 6e 79   supported.  Any
e040: 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a  thing different.
e050: 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 61 20 63  ** indicates a c
e060: 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  orrupt database 
e070: 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  files:.**.**    
e080: 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54       PTF_ZERODAT
e090: 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  A.**         PTF
e0a0: 5f 5a 45 52 4f 44 41 54 41 20 7c 20 50 54 46 5f  _ZERODATA | PTF_
e0b0: 4c 45 41 46 0a 2a 2a 20 20 20 20 20 20 20 20 20  LEAF.**         
e0c0: 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50  PTF_LEAFDATA | P
e0d0: 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20  TF_INTKEY.**    
e0e0: 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54       PTF_LEAFDAT
e0f0: 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c  A | PTF_INTKEY |
e100: 20 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61   PTF_LEAF.*/.sta
e110: 74 69 63 20 69 6e 74 20 64 65 63 6f 64 65 46 6c  tic int decodeFl
e120: 61 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ags(MemPage *pPa
e130: 67 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65  ge, int flagByte
e140: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
e150: 42 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70  Bt;     /* A cop
e160: 79 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20  y of pPage->pBt 
e170: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
e180: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d  age->hdrOffset==
e190: 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20  (pPage->pgno==1 
e1a0: 3f 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20  ? 100 : 0) );.  
e1b0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
e1c0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
e1d0: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
e1e0: 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d  .  pPage->leaf =
e1f0: 20 28 75 38 29 28 66 6c 61 67 42 79 74 65 3e 3e   (u8)(flagByte>>
e200: 33 29 3b 20 20 61 73 73 65 72 74 28 20 50 54 46  3);  assert( PTF
e210: 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b  _LEAF == 1<<3 );
e220: 0a 20 20 66 6c 61 67 42 79 74 65 20 26 3d 20 7e  .  flagByte &= ~
e230: 50 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67  PTF_LEAF;.  pPag
e240: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20  e->childPtrSize 
e250: 3d 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61  = 4-4*pPage->lea
e260: 66 3b 0a 20 20 70 50 61 67 65 2d 3e 78 43 65 6c  f;.  pPage->xCel
e270: 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65  lSize = cellSize
e280: 50 74 72 3b 0a 20 20 70 42 74 20 3d 20 70 50 61  Ptr;.  pBt = pPa
e290: 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 66  ge->pBt;.  if( f
e2a0: 6c 61 67 42 79 74 65 3d 3d 28 50 54 46 5f 4c 45  lagByte==(PTF_LE
e2b0: 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54  AFDATA | PTF_INT
e2c0: 4b 45 59 29 20 29 7b 0a 20 20 20 20 2f 2a 20 45  KEY) ){.    /* E
e2d0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 37  VIDENCE-OF: R-07
e2e0: 32 39 31 2d 33 35 33 32 38 20 41 20 76 61 6c 75  291-35328 A valu
e2f0: 65 20 6f 66 20 35 20 28 30 78 30 35 29 20 6d 65  e of 5 (0x05) me
e300: 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20  ans the page is 
e310: 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72 69  an.    ** interi
e320: 6f 72 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20  or table b-tree 
e330: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  page. */.    ass
e340: 65 72 74 28 20 28 50 54 46 5f 4c 45 41 46 44 41  ert( (PTF_LEAFDA
e350: 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59 29 3d 3d  TA|PTF_INTKEY)==
e360: 35 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  5 );.    /* EVID
e370: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 36 39 30 30  ENCE-OF: R-26900
e380: 2d 30 39 31 37 36 20 41 20 76 61 6c 75 65 20 6f  -09176 A value o
e390: 66 20 31 33 20 28 30 78 30 64 29 20 6d 65 61 6e  f 13 (0x0d) mean
e3a0: 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61 0a  s the page is a.
e3b0: 20 20 20 20 2a 2a 20 6c 65 61 66 20 74 61 62 6c      ** leaf tabl
e3c0: 65 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a  e b-tree page. *
e3d0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  /.    assert( (P
e3e0: 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f  TF_LEAFDATA|PTF_
e3f0: 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 29  INTKEY|PTF_LEAF)
e400: 3d 3d 31 33 20 29 3b 0a 20 20 20 20 70 50 61 67  ==13 );.    pPag
e410: 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b 0a 20  e->intKey = 1;. 
e420: 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65     if( pPage->le
e430: 61 66 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  af ){.      pPag
e440: 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20  e->intKeyLeaf = 
e450: 31 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  1;.      pPage->
e460: 78 50 61 72 73 65 43 65 6c 6c 20 3d 20 62 74 72  xParseCell = btr
e470: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 3b 0a  eeParseCellPtr;.
e480: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e490: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65   pPage->intKeyLe
e4a0: 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  af = 0;.      pP
e4b0: 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20 3d  age->xCellSize =
e4c0: 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61   cellSizePtrNoPa
e4d0: 79 6c 6f 61 64 3b 0a 20 20 20 20 20 20 70 50 61  yload;.      pPa
e4e0: 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d  ge->xParseCell =
e4f0: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
e500: 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20 20 20  trNoPayload;.   
e510: 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61   }.    pPage->ma
e520: 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61  xLocal = pBt->ma
e530: 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65  xLeaf;.    pPage
e540: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
e550: 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c  ->minLeaf;.  }el
e560: 73 65 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d  se if( flagByte=
e570: 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 29 7b  =PTF_ZERODATA ){
e580: 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
e590: 2d 4f 46 3a 20 52 2d 34 33 33 31 36 2d 33 37 33  -OF: R-43316-373
e5a0: 30 38 20 41 20 76 61 6c 75 65 20 6f 66 20 32 20  08 A value of 2 
e5b0: 28 30 78 30 32 29 20 6d 65 61 6e 73 20 74 68 65  (0x02) means the
e5c0: 20 70 61 67 65 20 69 73 20 61 6e 0a 20 20 20 20   page is an.    
e5d0: 2a 2a 20 69 6e 74 65 72 69 6f 72 20 69 6e 64 65  ** interior inde
e5e0: 78 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a  x b-tree page. *
e5f0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  /.    assert( (P
e600: 54 46 5f 5a 45 52 4f 44 41 54 41 29 3d 3d 32 20  TF_ZERODATA)==2 
e610: 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  );.    /* EVIDEN
e620: 43 45 2d 4f 46 3a 20 52 2d 35 39 36 31 35 2d 34  CE-OF: R-59615-4
e630: 32 38 32 38 20 41 20 76 61 6c 75 65 20 6f 66 20  2828 A value of 
e640: 31 30 20 28 30 78 30 61 29 20 6d 65 61 6e 73 20  10 (0x0a) means 
e650: 74 68 65 20 70 61 67 65 20 69 73 20 61 0a 20 20  the page is a.  
e660: 20 20 2a 2a 20 6c 65 61 66 20 69 6e 64 65 78 20    ** leaf index 
e670: 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a  b-tree page. */.
e680: 20 20 20 20 61 73 73 65 72 74 28 20 28 50 54 46      assert( (PTF
e690: 5f 5a 45 52 4f 44 41 54 41 7c 50 54 46 5f 4c 45  _ZERODATA|PTF_LE
e6a0: 41 46 29 3d 3d 31 30 20 29 3b 0a 20 20 20 20 70  AF)==10 );.    p
e6b0: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30  Page->intKey = 0
e6c0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74  ;.    pPage->int
e6d0: 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20  KeyLeaf = 0;.   
e6e0: 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
e6f0: 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65 43  ll = btreeParseC
e700: 65 6c 6c 50 74 72 49 6e 64 65 78 3b 0a 20 20 20  ellPtrIndex;.   
e710: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
e720: 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c   = pBt->maxLocal
e730: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e  ;.    pPage->min
e740: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e  Local = pBt->min
e750: 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Local;.  }else{.
e760: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
e770: 4f 46 3a 20 52 2d 34 37 36 30 38 2d 35 36 34 36  OF: R-47608-5646
e780: 39 20 41 6e 79 20 6f 74 68 65 72 20 76 61 6c 75  9 Any other valu
e790: 65 20 66 6f 72 20 74 68 65 20 62 2d 74 72 65 65  e for the b-tree
e7a0: 20 70 61 67 65 20 74 79 70 65 20 69 73 0a 20 20   page type is.  
e7b0: 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 2a    ** an error. *
e7c0: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
e7d0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
e7e0: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6d  ;.  }.  pPage->m
e7f0: 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d  ax1bytePayload =
e800: 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61   pBt->max1bytePa
e810: 79 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e 20  yload;.  return 
e820: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
e830: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
e840: 68 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66  he auxiliary inf
e850: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 64  ormation for a d
e860: 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  isk block..**.**
e870: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
e880: 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49  K on success.  I
e890: 66 20 77 65 20 73 65 65 20 74 68 61 74 20 74 68  f we see that th
e8a0: 65 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e  e page does.** n
e8b0: 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c  ot contain a wel
e8c0: 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73  l-formed databas
e8d0: 65 20 70 61 67 65 2c 20 74 68 65 6e 20 72 65 74  e page, then ret
e8e0: 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43  urn .** SQLITE_C
e8f0: 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65 20 74 68  ORRUPT.  Note th
e900: 61 74 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53  at a return of S
e910: 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f  QLITE_OK does no
e920: 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 20 74  t.** guarantee t
e930: 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
e940: 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74  well-formed.  It
e950: 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68 61 74   only shows that
e960: 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64 20 74 6f  .** we failed to
e970: 20 64 65 74 65 63 74 20 61 6e 79 20 63 6f 72 72   detect any corr
e980: 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  uption..*/.stati
e990: 63 20 69 6e 74 20 62 74 72 65 65 49 6e 69 74 50  c int btreeInitP
e9a0: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
e9b0: 67 65 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20  ge){..  assert( 
e9c0: 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b  pPage->pBt!=0 );
e9d0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
e9e0: 2d 3e 70 42 74 2d 3e 64 62 21 3d 30 20 29 3b 0a  ->pBt->db!=0 );.
e9f0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
ea00: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
ea10: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
ea20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
ea30: 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65  ge->pgno==sqlite
ea40: 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
ea50: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
ea60: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
ea70: 61 67 65 20 3d 3d 20 73 71 6c 69 74 65 33 50 61  age == sqlite3Pa
ea80: 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
ea90: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
eaa0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
eab0: 61 44 61 74 61 20 3d 3d 20 73 71 6c 69 74 65 33  aData == sqlite3
eac0: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61  PagerGetData(pPa
ead0: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
eae0: 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69  .  if( !pPage->i
eaf0: 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 75 33 32  sInit ){.    u32
eb00: 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   pc;            
eb10: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 20  /* Address of a 
eb20: 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e  freeblock within
eb30: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20   pPage->aData[] 
eb40: 2a 2f 0a 20 20 20 20 75 38 20 68 64 72 3b 20 20  */.    u8 hdr;  
eb50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
eb60: 73 65 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67  set to beginning
eb70: 20 6f 66 20 70 61 67 65 20 68 65 61 64 65 72 20   of page header 
eb80: 2a 2f 0a 20 20 20 20 75 38 20 2a 64 61 74 61 3b  */.    u8 *data;
eb90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71 75            /* Equ
eba0: 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61 44 61  al to pPage->aDa
ebb0: 74 61 20 2a 2f 0a 20 20 20 20 42 74 53 68 61 72  ta */.    BtShar
ebc0: 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20  ed *pBt;        
ebd0: 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62 74 72 65  /* The main btre
ebe0: 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  e structure */. 
ebf0: 20 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a     int usableSiz
ec00: 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20  e;    /* Amount 
ec10: 6f 66 20 75 73 61 62 6c 65 20 73 70 61 63 65 20  of usable space 
ec20: 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a  on each page */.
ec30: 20 20 20 20 75 31 36 20 63 65 6c 6c 4f 66 66 73      u16 cellOffs
ec40: 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65 74  et;    /* Offset
ec50: 20 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20 70   from start of p
ec60: 61 67 65 20 74 6f 20 66 69 72 73 74 20 63 65 6c  age to first cel
ec70: 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20  l pointer */.   
ec80: 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20   int nFree;     
ec90: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
eca0: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e   unused bytes on
ecb0: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20   the page */.   
ecc0: 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20   int top;       
ecd0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
ece0: 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  e of the cell co
ecf0: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
ed00: 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74    int iCellFirst
ed10: 3b 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c  ;    /* First al
ed20: 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20  lowable cell or 
ed30: 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74  freeblock offset
ed40: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c   */.    int iCel
ed50: 6c 4c 61 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61  lLast;     /* La
ed60: 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c  st possible cell
ed70: 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66   or freeblock of
ed80: 66 73 65 74 20 2a 2f 0a 0a 20 20 20 20 70 42 74  fset */..    pBt
ed90: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a   = pPage->pBt;..
eda0: 20 20 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d      hdr = pPage-
edb0: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20  >hdrOffset;.    
edc0: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
edd0: 61 74 61 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  ata;.    /* EVID
ede0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 35 39 34  ENCE-OF: R-28594
edf0: 2d 30 32 38 39 30 20 54 68 65 20 6f 6e 65 2d 62  -02890 The one-b
ee00: 79 74 65 20 66 6c 61 67 20 61 74 20 6f 66 66 73  yte flag at offs
ee10: 65 74 20 30 20 69 6e 64 69 63 61 74 69 6e 67 0a  et 0 indicating.
ee20: 20 20 20 20 2a 2a 20 74 68 65 20 62 2d 74 72 65      ** the b-tre
ee30: 65 20 70 61 67 65 20 74 79 70 65 2e 20 2a 2f 0a  e page type. */.
ee40: 20 20 20 20 69 66 28 20 64 65 63 6f 64 65 46 6c      if( decodeFl
ee50: 61 67 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b  ags(pPage, data[
ee60: 68 64 72 5d 29 20 29 20 72 65 74 75 72 6e 20 53  hdr]) ) return S
ee70: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
ee80: 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  PT;.    assert( 
ee90: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35  pBt->pageSize>=5
eea0: 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53  12 && pBt->pageS
eeb0: 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20  ize<=65536 );.  
eec0: 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67    pPage->maskPag
eed0: 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70  e = (u16)(pBt->p
eee0: 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20  ageSize - 1);.  
eef0: 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c    pPage->nOverfl
ef00: 6f 77 20 3d 20 30 3b 0a 20 20 20 20 75 73 61 62  ow = 0;.    usab
ef10: 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  leSize = pBt->us
ef20: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 70 50  ableSize;.    pP
ef30: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
ef40: 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68  = cellOffset = h
ef50: 64 72 20 2b 20 38 20 2b 20 70 50 61 67 65 2d 3e  dr + 8 + pPage->
ef60: 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
ef70: 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e    pPage->aDataEn
ef80: 64 20 3d 20 26 64 61 74 61 5b 75 73 61 62 6c 65  d = &data[usable
ef90: 53 69 7a 65 5d 3b 0a 20 20 20 20 70 50 61 67 65  Size];.    pPage
efa0: 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61  ->aCellIdx = &da
efb0: 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a  ta[cellOffset];.
efc0: 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61      pPage->aData
efd0: 4f 66 73 74 20 3d 20 26 64 61 74 61 5b 70 50 61  Ofst = &data[pPa
efe0: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
eff0: 5d 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  ];.    /* EVIDEN
f000: 43 45 2d 4f 46 3a 20 52 2d 35 38 30 31 35 2d 34  CE-OF: R-58015-4
f010: 38 31 37 35 20 54 68 65 20 74 77 6f 2d 62 79 74  8175 The two-byt
f020: 65 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66  e integer at off
f030: 73 65 74 20 35 20 64 65 73 69 67 6e 61 74 65 73  set 5 designates
f040: 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 72  .    ** the star
f050: 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  t of the cell co
f060: 6e 74 65 6e 74 20 61 72 65 61 2e 20 41 20 7a 65  ntent area. A ze
f070: 72 6f 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69  ro value for thi
f080: 73 20 69 6e 74 65 67 65 72 20 69 73 0a 20 20 20  s integer is.   
f090: 20 2a 2a 20 69 6e 74 65 72 70 72 65 74 65 64 20   ** interpreted 
f0a0: 61 73 20 36 35 35 33 36 2e 20 2a 2f 0a 20 20 20  as 65536. */.   
f0b0: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e   top = get2byteN
f0c0: 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72  otZero(&data[hdr
f0d0: 2b 35 5d 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49  +5]);.    /* EVI
f0e0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 30 30  DENCE-OF: R-3700
f0f0: 32 2d 33 32 37 37 34 20 54 68 65 20 74 77 6f 2d  2-32774 The two-
f100: 62 79 74 65 20 69 6e 74 65 67 65 72 20 61 74 20  byte integer at 
f110: 6f 66 66 73 65 74 20 33 20 67 69 76 65 73 20 74  offset 3 gives t
f120: 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72  he.    ** number
f130: 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65   of cells on the
f140: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 70 50   page. */.    pP
f150: 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74  age->nCell = get
f160: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
f170: 33 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  3]);.    if( pPa
f180: 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c  ge->nCell>MX_CEL
f190: 4c 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  L(pBt) ){.      
f1a0: 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73  /* To many cells
f1b0: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 70 61   for a single pa
f1c0: 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 6d 75  ge.  The page mu
f1d0: 73 74 20 62 65 20 63 6f 72 72 75 70 74 20 2a 2f  st be corrupt */
f1e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
f1f0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
f200: 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73  T;.    }.    tes
f210: 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 43  tcase( pPage->nC
f220: 65 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42 74  ell==MX_CELL(pBt
f230: 29 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  ) );.    /* EVID
f240: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 30 38 39  ENCE-OF: R-24089
f250: 2d 35 37 39 37 39 20 49 66 20 61 20 70 61 67 65  -57979 If a page
f260: 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c   contains no cel
f270: 6c 73 20 28 77 68 69 63 68 20 69 73 20 6f 6e 6c  ls (which is onl
f280: 79 0a 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c  y.    ** possibl
f290: 65 20 66 6f 72 20 61 20 72 6f 6f 74 20 70 61 67  e for a root pag
f2a0: 65 20 6f 66 20 61 20 74 61 62 6c 65 20 74 68 61  e of a table tha
f2b0: 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 6f  t contains no ro
f2c0: 77 73 29 20 74 68 65 6e 20 74 68 65 0a 20 20 20  ws) then the.   
f2d0: 20 2a 2a 20 6f 66 66 73 65 74 20 74 6f 20 74 68   ** offset to th
f2e0: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
f2f0: 72 65 61 20 77 69 6c 6c 20 65 71 75 61 6c 20 74  rea will equal t
f300: 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 69 6e  he page size min
f310: 75 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 62 79  us the.    ** by
f320: 74 65 73 20 6f 66 20 72 65 73 65 72 76 65 64 20  tes of reserved 
f330: 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61 73  space. */.    as
f340: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
f350: 6c 6c 3e 30 20 7c 7c 20 74 6f 70 3d 3d 75 73 61  ll>0 || top==usa
f360: 62 6c 65 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55  bleSize || CORRU
f370: 50 54 5f 44 42 20 29 3b 0a 0a 20 20 20 20 2f 2a  PT_DB );..    /*
f380: 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20 64 61 74   A malformed dat
f390: 61 62 61 73 65 20 70 61 67 65 20 6d 69 67 68 74  abase page might
f3a0: 20 63 61 75 73 65 20 75 73 20 74 6f 20 72 65 61   cause us to rea
f3b0: 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 0a 20  d past the end. 
f3c0: 20 20 20 2a 2a 20 6f 66 20 70 61 67 65 20 77 68     ** of page wh
f3d0: 65 6e 20 70 61 72 73 69 6e 67 20 61 20 63 65 6c  en parsing a cel
f3e0: 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  l.  .    **.    
f3f0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
f400: 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 63   block of code c
f410: 68 65 63 6b 73 20 65 61 72 6c 79 20 74 6f 20 73  hecks early to s
f420: 65 65 20 69 66 20 61 20 63 65 6c 6c 20 65 78 74  ee if a cell ext
f430: 65 6e 64 73 0a 20 20 20 20 2a 2a 20 70 61 73 74  ends.    ** past
f440: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 70 61   the end of a pa
f450: 67 65 20 62 6f 75 6e 64 61 72 79 20 61 6e 64 20  ge boundary and 
f460: 63 61 75 73 65 73 20 53 51 4c 49 54 45 5f 43 4f  causes SQLITE_CO
f470: 52 52 55 50 54 20 74 6f 20 62 65 20 0a 20 20 20  RRUPT to be .   
f480: 20 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 66 20   ** returned if 
f490: 69 74 20 64 6f 65 73 2e 0a 20 20 20 20 2a 2f 0a  it does..    */.
f4a0: 20 20 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d      iCellFirst =
f4b0: 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
f4c0: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
f4d0: 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73    iCellLast = us
f4e0: 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
f4f0: 20 20 69 66 28 20 70 42 74 2d 3e 64 62 2d 3e 66    if( pBt->db->f
f500: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43 65  lags & SQLITE_Ce
f510: 6c 6c 53 69 7a 65 43 6b 20 29 7b 0a 20 20 20 20  llSizeCk ){.    
f520: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
f530: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74      /* Index int
f540: 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  o the cell point
f550: 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20  er array */.    
f560: 20 20 69 6e 74 20 73 7a 3b 20 20 20 20 20 20 20    int sz;       
f570: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
f580: 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20 20 20   cell */..      
f590: 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
f5a0: 20 29 20 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a   ) iCellLast--;.
f5b0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
f5c0: 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69  <pPage->nCell; i
f5d0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 63 20  ++){.        pc 
f5e0: 3d 20 67 65 74 32 62 79 74 65 41 6c 69 67 6e 65  = get2byteAligne
f5f0: 64 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  d(&data[cellOffs
f600: 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20  et+i*2]);.      
f610: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
f620: 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20  iCellFirst );.  
f630: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
f640: 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b  pc==iCellLast );
f650: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63 3c  .        if( pc<
f660: 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63  iCellFirst || pc
f670: 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20  >iCellLast ){.  
f680: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
f690: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
f6a0: 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  PT;.        }.  
f6b0: 20 20 20 20 20 20 73 7a 20 3d 20 70 50 61 67 65        sz = pPage
f6c0: 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67  ->xCellSize(pPag
f6d0: 65 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20  e, &data[pc]);. 
f6e0: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
f6f0: 20 70 63 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69   pc+sz==usableSi
f700: 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ze );.        if
f710: 28 20 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69  ( pc+sz>usableSi
f720: 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
f730: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
f740: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
f750: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
f760: 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
f770: 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74  leaf ) iCellLast
f780: 2b 2b 3b 0a 20 20 20 20 7d 20 20 0a 0a 20 20 20  ++;.    }  ..   
f790: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
f7a0: 74 6f 74 61 6c 20 66 72 65 65 20 73 70 61 63 65  total free space
f7b0: 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20   on the page.   
f7c0: 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   ** EVIDENCE-OF:
f7d0: 20 52 2d 32 33 35 38 38 2d 33 34 34 35 30 20 54   R-23588-34450 T
f7e0: 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65  he two-byte inte
f7f0: 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 31 20  ger at offset 1 
f800: 67 69 76 65 73 20 74 68 65 0a 20 20 20 20 2a 2a  gives the.    **
f810: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 66 69   start of the fi
f820: 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 6f 6e  rst freeblock on
f830: 20 74 68 65 20 70 61 67 65 2c 20 6f 72 20 69 73   the page, or is
f840: 20 7a 65 72 6f 20 69 66 20 74 68 65 72 65 20 61   zero if there a
f850: 72 65 20 6e 6f 0a 20 20 20 20 2a 2a 20 66 72 65  re no.    ** fre
f860: 65 62 6c 6f 63 6b 73 2e 20 2a 2f 0a 20 20 20 20  eblocks. */.    
f870: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  pc = get2byte(&d
f880: 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20  ata[hdr+1]);.   
f890: 20 6e 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64   nFree = data[hd
f8a0: 72 2b 37 5d 20 2b 20 74 6f 70 3b 20 20 2f 2a 20  r+7] + top;  /* 
f8b0: 49 6e 69 74 20 6e 46 72 65 65 20 74 6f 20 6e 6f  Init nFree to no
f8c0: 6e 2d 66 72 65 65 62 6c 6f 63 6b 20 66 72 65 65  n-freeblock free
f8d0: 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 69 66   space */.    if
f8e0: 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20 20 20  ( pc>0 ){.      
f8f0: 75 33 32 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a  u32 next, size;.
f900: 20 20 20 20 20 20 69 66 28 20 70 63 3c 69 43 65        if( pc<iCe
f910: 6c 6c 46 69 72 73 74 20 29 7b 0a 20 20 20 20 20  llFirst ){.     
f920: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
f930: 46 3a 20 52 2d 35 35 35 33 30 2d 35 32 39 33 30  F: R-55530-52930
f940: 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65   In a well-forme
f950: 64 20 62 2d 74 72 65 65 20 70 61 67 65 2c 20 74  d b-tree page, t
f960: 68 65 72 65 20 77 69 6c 6c 0a 20 20 20 20 20 20  here will.      
f970: 20 20 2a 2a 20 61 6c 77 61 79 73 20 62 65 20 61    ** always be a
f980: 74 20 6c 65 61 73 74 20 6f 6e 65 20 63 65 6c 6c  t least one cell
f990: 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
f9a0: 74 20 66 72 65 65 62 6c 6f 63 6b 2e 0a 20 20 20  t freeblock..   
f9b0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
f9c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
f9d0: 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20  RRUPT_BKPT; .   
f9e0: 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65     }.      while
f9f0: 28 20 31 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ( 1 ){.        i
fa00: 66 28 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20  f( pc>iCellLast 
fa10: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
fa20: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
fa30: 50 54 5f 42 4b 50 54 3b 20 2f 2a 20 46 72 65 65  PT_BKPT; /* Free
fa40: 62 6c 6f 63 6b 20 6f 66 66 20 74 68 65 20 65 6e  block off the en
fa50: 64 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f  d of the page */
fa60: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
fa70: 20 20 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79     next = get2by
fa80: 74 65 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20  te(&data[pc]);. 
fa90: 20 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65         size = ge
faa0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b  t2byte(&data[pc+
fab0: 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 6e 46 72  2]);.        nFr
fac0: 65 65 20 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a  ee = nFree + siz
fad0: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  e;.        if( n
fae0: 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 20 29  ext<=pc+size+3 )
faf0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
fb00: 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20 20  pc = next;.     
fb10: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 65 78   }.      if( nex
fb20: 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  t>0 ){.        r
fb30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
fb40: 52 55 50 54 5f 42 4b 50 54 3b 20 20 2f 2a 20 46  RUPT_BKPT;  /* F
fb50: 72 65 65 62 6c 6f 63 6b 20 6e 6f 74 20 69 6e 20  reeblock not in 
fb60: 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  ascending order 
fb70: 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
fb80: 20 69 66 28 20 70 63 2b 73 69 7a 65 3e 75 73 61   if( pc+size>usa
fb90: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
fba0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
fbb0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 20  _CORRUPT_BKPT;  
fbc0: 2f 2a 20 4c 61 73 74 20 66 72 65 65 62 6c 6f 63  /* Last freebloc
fbd0: 6b 20 65 78 74 65 6e 64 73 20 70 61 73 74 20 70  k extends past p
fbe0: 61 67 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20 20  age end */.     
fbf0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
fc00: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
fc10: 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 74  nFree contains t
fc20: 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6f 66  he sum of the of
fc30: 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72  fset to the star
fc40: 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  t.    ** of the 
fc50: 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65  cell-content are
fc60: 61 20 70 6c 75 73 20 74 68 65 20 6e 75 6d 62 65  a plus the numbe
fc70: 72 20 6f 66 20 66 72 65 65 20 62 79 74 65 73 20  r of free bytes 
fc80: 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a 20 74 68  within.    ** th
fc90: 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61  e cell-content a
fca0: 72 65 61 2e 20 49 66 20 74 68 69 73 20 69 73 20  rea. If this is 
fcb0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
fcc0: 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20 20   usable-size.   
fcd0: 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2c   ** of the page,
fce0: 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d   then the page m
fcf0: 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  ust be corrupted
fd00: 2e 20 54 68 69 73 20 63 68 65 63 6b 20 61 6c 73  . This check als
fd10: 6f 0a 20 20 20 20 2a 2a 20 73 65 72 76 65 73 20  o.    ** serves 
fd20: 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74  to verify that t
fd30: 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65  he offset to the
fd40: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63 65   start of the ce
fd50: 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a  ll-content.    *
fd60: 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64 69 6e  * area, accordin
fd70: 67 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65  g to the page he
fd80: 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74 68 69  ader, lies withi
fd90: 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20 20  n the page..    
fda0: 2a 2f 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65  */.    if( nFree
fdb0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
fdc0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
fdd0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
fde0: 20 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67   .    }.    pPag
fdf0: 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29  e->nFree = (u16)
fe00: 28 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c 46 69  (nFree - iCellFi
fe10: 72 73 74 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  rst);.    pPage-
fe20: 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 7d  >isInit = 1;.  }
fe30: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
fe40: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
fe50: 74 20 75 70 20 61 20 72 61 77 20 70 61 67 65 20  t up a raw page 
fe60: 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73  so that it looks
fe70: 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73 65   like a database
fe80: 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a   page holding.**
fe90: 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a   no entries..*/.
fea0: 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f  static void zero
feb0: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
fec0: 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  age, int flags){
fed0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
fee0: 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e   *data = pPage->
fef0: 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65  aData;.  BtShare
ff00: 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
ff10: 70 42 74 3b 0a 20 20 75 38 20 68 64 72 20 3d 20  pBt;.  u8 hdr = 
ff20: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
ff30: 3b 0a 20 20 75 31 36 20 66 69 72 73 74 3b 0a 0a  ;.  u16 first;..
ff40: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
ff50: 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
ff60: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
ff70: 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b  ==pPage->pgno );
ff80: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
ff90: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
ffa0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
ffb0: 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20  == (void*)pPage 
ffc0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
ffd0: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
ffe0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
fff0: 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20 61 73   == data );.  as
10000 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
10010 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
10020 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
10030 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
10040 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
10050 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
10060 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  f( pBt->btsFlags
10070 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45   & BTS_SECURE_DE
10080 4c 45 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73  LETE ){.    mems
10090 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30  et(&data[hdr], 0
100a0 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  , pBt->usableSiz
100b0 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d 0a 20 20  e - hdr);.  }.  
100c0 64 61 74 61 5b 68 64 72 5d 20 3d 20 28 63 68 61  data[hdr] = (cha
100d0 72 29 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74  r)flags;.  first
100e0 20 3d 20 68 64 72 20 2b 20 28 28 66 6c 61 67 73   = hdr + ((flags
100f0 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 3f 20  &PTF_LEAF)==0 ? 
10100 31 32 20 3a 20 38 29 3b 0a 20 20 6d 65 6d 73 65  12 : 8);.  memse
10110 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20  t(&data[hdr+1], 
10120 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68 64  0, 4);.  data[hd
10130 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32  r+7] = 0;.  put2
10140 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
10150 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ], pBt->usableSi
10160 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46  ze);.  pPage->nF
10170 72 65 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d  ree = (u16)(pBt-
10180 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66 69  >usableSize - fi
10190 72 73 74 29 3b 0a 20 20 64 65 63 6f 64 65 46 6c  rst);.  decodeFl
101a0 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73  ags(pPage, flags
101b0 29 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c  );.  pPage->cell
101c0 4f 66 66 73 65 74 20 3d 20 66 69 72 73 74 3b 0a  Offset = first;.
101d0 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e    pPage->aDataEn
101e0 64 20 3d 20 26 64 61 74 61 5b 70 42 74 2d 3e 75  d = &data[pBt->u
101f0 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50  sableSize];.  pP
10200 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20  age->aCellIdx = 
10210 26 64 61 74 61 5b 66 69 72 73 74 5d 3b 0a 20 20  &data[first];.  
10220 70 50 61 67 65 2d 3e 61 44 61 74 61 4f 66 73 74  pPage->aDataOfst
10230 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e   = &data[pPage->
10240 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20  childPtrSize];. 
10250 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
10260 77 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  w = 0;.  assert(
10270 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d   pBt->pageSize>=
10280 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65  512 && pBt->page
10290 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20  Size<=65536 );. 
102a0 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65   pPage->maskPage
102b0 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61   = (u16)(pBt->pa
102c0 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70  geSize - 1);.  p
102d0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b  Page->nCell = 0;
102e0 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  .  pPage->isInit
102f0 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   = 1;.}.../*.** 
10300 43 6f 6e 76 65 72 74 20 61 20 44 62 50 61 67 65  Convert a DbPage
10310 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 74   obtained from t
10320 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 61 20  he pager into a 
10330 4d 65 6d 50 61 67 65 20 75 73 65 64 20 62 79 0a  MemPage used by.
10340 2a 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61 79  ** the btree lay
10350 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65  er..*/.static Me
10360 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65  mPage *btreePage
10370 46 72 6f 6d 44 62 50 61 67 65 28 44 62 50 61 67  FromDbPage(DbPag
10380 65 20 2a 70 44 62 50 61 67 65 2c 20 50 67 6e 6f  e *pDbPage, Pgno
10390 20 70 67 6e 6f 2c 20 42 74 53 68 61 72 65 64 20   pgno, BtShared 
103a0 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65  *pBt){.  MemPage
103b0 20 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61   *pPage = (MemPa
103c0 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  ge*)sqlite3Pager
103d0 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65  GetExtra(pDbPage
103e0 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 21 3d 70  );.  if( pgno!=p
103f0 50 61 67 65 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20  Page->pgno ){.  
10400 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d    pPage->aData =
10410 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
10420 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20  Data(pDbPage);. 
10430 20 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67     pPage->pDbPag
10440 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 20  e = pDbPage;.   
10450 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42   pPage->pBt = pB
10460 74 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 67  t;.    pPage->pg
10470 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 70  no = pgno;.    p
10480 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20  Page->hdrOffset 
10490 3d 20 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20  = pgno==1 ? 100 
104a0 3a 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  : 0;.  }.  asser
104b0 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3d  t( pPage->aData=
104c0 3d 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  =sqlite3PagerGet
104d0 44 61 74 61 28 70 44 62 50 61 67 65 29 20 29 3b  Data(pDbPage) );
104e0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 3b  .  return pPage;
104f0 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61   .}../*.** Get a
10500 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70   page from the p
10510 61 67 65 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a  ager.  Initializ
10520 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42  e the MemPage.pB
10530 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65  t and.** MemPage
10540 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20  .aData elements 
10550 69 66 20 6e 65 65 64 65 64 2e 20 20 53 65 65 20  if needed.  See 
10560 61 6c 73 6f 3a 20 62 74 72 65 65 47 65 74 55 6e  also: btreeGetUn
10570 75 73 65 64 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a  usedPage()..**.*
10580 2a 20 49 66 20 74 68 65 20 50 41 47 45 52 5f 47  * If the PAGER_G
10590 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 66 6c 61  ET_NOCONTENT fla
105a0 67 20 69 73 20 73 65 74 2c 20 69 74 20 6d 65 61  g is set, it mea
105b0 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ns that we do no
105c0 74 20 63 61 72 65 0a 2a 2a 20 61 62 6f 75 74 20  t care.** about 
105d0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
105e0 68 65 20 70 61 67 65 20 61 74 20 74 68 69 73 20  he page at this 
105f0 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74  time.  So do not
10600 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 0a   go to the disk.
10610 2a 2a 20 74 6f 20 66 65 74 63 68 20 74 68 65 20  ** to fetch the 
10620 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20 66  content.  Just f
10630 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74 65  ill in the conte
10640 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 20 66 6f  nt with zeros fo
10650 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20  r now..** If in 
10660 74 68 65 20 66 75 74 75 72 65 20 77 65 20 63 61  the future we ca
10670 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  ll sqlite3PagerW
10680 72 69 74 65 28 29 20 6f 6e 20 74 68 69 73 20 70  rite() on this p
10690 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61  age, that.** mea
106a0 6e 73 20 77 65 20 68 61 76 65 20 73 74 61 72 74  ns we have start
106b0 65 64 20 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e  ed to be concern
106c0 65 64 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74  ed about content
106d0 20 61 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a   and the disk.**
106e0 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63   read should occ
106f0 75 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74  ur at that point
10700 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10710 62 74 72 65 65 47 65 74 50 61 67 65 28 0a 20 20  btreeGetPage(.  
10720 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
10730 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
10740 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
10750 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ,           /* N
10760 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
10770 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20  e to fetch */.  
10780 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
10790 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74  ,    /* Return t
107a0 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  he page in this 
107b0 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69  parameter */.  i
107c0 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  nt flags        
107d0 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54      /* PAGER_GET
107e0 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41  _NOCONTENT or PA
107f0 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59  GER_GET_READONLY
10800 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
10810 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
10820 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 66  ge;..  assert( f
10830 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73  lags==0 || flags
10840 3d 3d 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f  ==PAGER_GET_NOCO
10850 4e 54 45 4e 54 20 7c 7c 20 66 6c 61 67 73 3d 3d  NTENT || flags==
10860 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e  PAGER_GET_READON
10870 4c 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  LY );.  assert( 
10880 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
10890 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
108a0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
108b0 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
108c0 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50  ager, pgno, (DbP
108d0 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20  age**)&pDbPage, 
108e0 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63  flags);.  if( rc
108f0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
10900 2a 70 70 50 61 67 65 20 3d 20 62 74 72 65 65 50  *ppPage = btreeP
10910 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44  ageFromDbPage(pD
10920 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74  bPage, pgno, pBt
10930 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
10940 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
10950 52 65 74 72 69 65 76 65 20 61 20 70 61 67 65 20  Retrieve a page 
10960 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63  from the pager c
10970 61 63 68 65 2e 20 49 66 20 74 68 65 20 72 65 71  ache. If the req
10980 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e  uested page is n
10990 6f 74 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e  ot.** already in
109a0 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
109b0 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e   return NULL. In
109c0 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d  itialize the Mem
109d0 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20  Page.pBt and.** 
109e0 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c  MemPage.aData el
109f0 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64  ements if needed
10a00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50  ..*/.static MemP
10a10 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 4c 6f  age *btreePageLo
10a20 6f 6b 75 70 28 42 74 53 68 61 72 65 64 20 2a 70  okup(BtShared *p
10a30 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
10a40 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
10a50 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  e;.  assert( sql
10a60 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
10a70 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
10a80 20 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74   pDbPage = sqlit
10a90 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42  e3PagerLookup(pB
10aa0 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  t->pPager, pgno)
10ab0 3b 0a 20 20 69 66 28 20 70 44 62 50 61 67 65 20  ;.  if( pDbPage 
10ac0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74  ){.    return bt
10ad0 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67  reePageFromDbPag
10ae0 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c  e(pDbPage, pgno,
10af0 20 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74   pBt);.  }.  ret
10b00 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
10b10 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20  Return the size 
10b20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
10b30 66 69 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 49  file in pages. I
10b40 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b  f there is any k
10b50 69 6e 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c  ind of.** error,
10b60 20 72 65 74 75 72 6e 20 28 28 75 6e 73 69 67 6e   return ((unsign
10b70 65 64 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73  ed int)-1)..*/.s
10b80 74 61 74 69 63 20 50 67 6e 6f 20 62 74 72 65 65  tatic Pgno btree
10b90 50 61 67 65 63 6f 75 6e 74 28 42 74 53 68 61 72  Pagecount(BtShar
10ba0 65 64 20 2a 70 42 74 29 7b 0a 20 20 72 65 74 75  ed *pBt){.  retu
10bb0 72 6e 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d  rn pBt->nPage;.}
10bc0 0a 75 33 32 20 73 71 6c 69 74 65 33 42 74 72 65  .u32 sqlite3Btre
10bd0 65 4c 61 73 74 50 61 67 65 28 42 74 72 65 65 20  eLastPage(Btree 
10be0 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  *p){.  assert( s
10bf0 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
10c00 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73  Mutex(p) );.  as
10c10 73 65 72 74 28 20 28 28 70 2d 3e 70 42 74 2d 3e  sert( ((p->pBt->
10c20 6e 50 61 67 65 29 26 30 78 38 30 30 30 30 30 30  nPage)&0x8000000
10c30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  )==0 );.  return
10c40 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
10c50 70 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  p->pBt);.}../*.*
10c60 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f  * Get a page fro
10c70 6d 20 74 68 65 20 70 61 67 65 72 20 61 6e 64 20  m the pager and 
10c80 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 0a 2a  initialize it..*
10c90 2a 0a 2a 2a 20 49 66 20 70 43 75 72 21 3d 30 20  *.** If pCur!=0 
10ca0 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 69 73  then the page is
10cb0 20 62 65 69 6e 67 20 66 65 74 63 68 65 64 20 61   being fetched a
10cc0 73 20 70 61 72 74 20 6f 66 20 61 20 6d 6f 76 65  s part of a move
10cd0 54 6f 43 68 69 6c 64 28 29 0a 2a 2a 20 63 61 6c  ToChild().** cal
10ce0 6c 2e 20 20 44 6f 20 61 64 64 69 74 69 6f 6e 61  l.  Do additiona
10cf0 6c 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  l sanity checkin
10d00 67 20 6f 6e 20 74 68 65 20 70 61 67 65 20 69 6e  g on the page in
10d10 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 20 41   this case..** A
10d20 6e 64 20 69 66 20 74 68 65 20 66 65 74 63 68 20  nd if the fetch 
10d30 66 61 69 6c 73 2c 20 74 68 69 73 20 72 6f 75 74  fails, this rout
10d40 69 6e 65 20 6d 75 73 74 20 64 65 63 72 65 6d 65  ine must decreme
10d50 6e 74 20 70 43 75 72 2d 3e 69 50 61 67 65 2e 0a  nt pCur->iPage..
10d60 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 69  **.** The page i
10d70 73 20 66 65 74 63 68 65 64 20 61 73 20 72 65 61  s fetched as rea
10d80 64 2d 77 72 69 74 65 20 75 6e 6c 65 73 73 20 70  d-write unless p
10d90 43 75 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  Cur is not NULL 
10da0 61 6e 64 20 69 73 0a 2a 2a 20 61 20 72 65 61 64  and is.** a read
10db0 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2e 0a 2a 2a  -only cursor..**
10dc0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
10dd0 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 2a 70 70  occurs, then *pp
10de0 50 61 67 65 20 69 73 20 75 6e 64 65 66 69 6e 65  Page is undefine
10df0 64 2e 20 49 74 0a 2a 2a 20 6d 61 79 20 72 65 6d  d. It.** may rem
10e00 61 69 6e 20 75 6e 63 68 61 6e 67 65 64 2c 20 6f  ain unchanged, o
10e10 72 20 69 74 20 6d 61 79 20 62 65 20 73 65 74 20  r it may be set 
10e20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 76 61  to an invalid va
10e30 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lue..*/.static i
10e40 6e 74 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67  nt getAndInitPag
10e50 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
10e60 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt,             
10e70 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
10e80 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50  base file */.  P
10e90 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
10ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10eb0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  * Number of the 
10ec0 70 61 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20  page to get */. 
10ed0 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
10ee0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
10ef0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61   /* Write the pa
10f00 67 65 20 70 6f 69 6e 74 65 72 20 68 65 72 65 20  ge pointer here 
10f10 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  */.  BtCursor *p
10f20 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Cur,            
10f30 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74       /* Cursor t
10f40 6f 20 72 65 63 65 69 76 65 20 74 68 65 20 70 61  o receive the pa
10f50 67 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  ge, or NULL */. 
10f60 20 69 6e 74 20 62 52 65 61 64 4f 6e 6c 79 20 20   int bReadOnly  
10f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f80 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 72   /* True for a r
10f90 65 61 64 2d 6f 6e 6c 79 20 70 61 67 65 20 2a 2f  ead-only page */
10fa0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
10fb0 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
10fc0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
10fd0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
10fe0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
10ff0 73 73 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c  ssert( pCur==0 |
11000 7c 20 70 70 50 61 67 65 3d 3d 26 70 43 75 72 2d  | ppPage==&pCur-
11010 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
11020 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74  age] );.  assert
11030 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 62 52 65  ( pCur==0 || bRe
11040 61 64 4f 6e 6c 79 3d 3d 70 43 75 72 2d 3e 63 75  adOnly==pCur->cu
11050 72 50 61 67 65 72 46 6c 61 67 73 20 29 3b 0a 20  rPagerFlags );. 
11060 20 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d 30   assert( pCur==0
11070 20 7c 7c 20 70 43 75 72 2d 3e 69 50 61 67 65 3e   || pCur->iPage>
11080 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f  0 );..  if( pgno
11090 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28  >btreePagecount(
110a0 70 42 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  pBt) ){.    rc =
110b0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
110c0 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 67  BKPT;.    goto g
110d0 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72  etAndInitPage_er
110e0 72 6f 72 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ror;.  }.  rc = 
110f0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
11100 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e  pBt->pPager, pgn
11110 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44  o, (DbPage**)&pD
11120 62 50 61 67 65 2c 20 62 52 65 61 64 4f 6e 6c 79  bPage, bReadOnly
11130 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
11140 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e     goto getAndIn
11150 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20  itPage_error;.  
11160 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 28 4d  }.  *ppPage = (M
11170 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33 50  emPage*)sqlite3P
11180 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44 62  agerGetExtra(pDb
11190 50 61 67 65 29 3b 0a 20 20 69 66 28 20 28 2a 70  Page);.  if( (*p
111a0 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d  pPage)->isInit==
111b0 30 20 29 7b 0a 20 20 20 20 62 74 72 65 65 50 61  0 ){.    btreePa
111c0 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62  geFromDbPage(pDb
111d0 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29  Page, pgno, pBt)
111e0 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  ;.    rc = btree
111f0 49 6e 69 74 50 61 67 65 28 2a 70 70 50 61 67 65  InitPage(*ppPage
11200 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
11210 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11220 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
11230 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 67 6f  pPage);.      go
11240 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67  to getAndInitPag
11250 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
11260 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70   }.  assert( (*p
11270 70 50 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67  pPage)->pgno==pg
11280 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  no );.  assert( 
11290 28 2a 70 70 50 61 67 65 29 2d 3e 61 44 61 74 61  (*ppPage)->aData
112a0 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ==sqlite3PagerGe
112b0 74 44 61 74 61 28 70 44 62 50 61 67 65 29 20 29  tData(pDbPage) )
112c0 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 62 74 61 69  ;..  /* If obtai
112d0 6e 69 6e 67 20 61 20 63 68 69 6c 64 20 70 61 67  ning a child pag
112e0 65 20 66 6f 72 20 61 20 63 75 72 73 6f 72 2c 20  e for a cursor, 
112f0 77 65 20 6d 75 73 74 20 76 65 72 69 66 79 20 74  we must verify t
11300 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 0a  hat the page is.
11310 20 20 2a 2a 20 63 6f 6d 70 61 74 69 62 6c 65 20    ** compatible 
11320 77 69 74 68 20 74 68 65 20 72 6f 6f 74 20 70 61  with the root pa
11330 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 43 75  ge. */.  if( pCu
11340 72 20 26 26 20 28 28 2a 70 70 50 61 67 65 29 2d  r && ((*ppPage)-
11350 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20 28 2a 70 70  >nCell<1 || (*pp
11360 50 61 67 65 29 2d 3e 69 6e 74 4b 65 79 21 3d 70  Page)->intKey!=p
11370 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 29 20  Cur->curIntKey) 
11380 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
11390 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
113a0 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
113b0 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 67  (*ppPage);.    g
113c0 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61  oto getAndInitPa
113d0 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  ge_error;.  }.  
113e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
113f0 3b 0a 0a 67 65 74 41 6e 64 49 6e 69 74 50 61 67  ;..getAndInitPag
11400 65 5f 65 72 72 6f 72 3a 0a 20 20 69 66 28 20 70  e_error:.  if( p
11410 43 75 72 20 29 20 70 43 75 72 2d 3e 69 50 61 67  Cur ) pCur->iPag
11420 65 2d 2d 3b 0a 20 20 74 65 73 74 63 61 73 65 28  e--;.  testcase(
11430 20 70 67 6e 6f 3d 3d 30 20 29 3b 0a 20 20 61 73   pgno==0 );.  as
11440 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 7c 7c  sert( pgno!=0 ||
11450 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52   rc==SQLITE_CORR
11460 55 50 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  UPT );.  return 
11470 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  rc;.}../*.** Rel
11480 65 61 73 65 20 61 20 4d 65 6d 50 61 67 65 2e 20  ease a MemPage. 
11490 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20   This should be 
114a0 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20  called once for 
114b0 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61  each prior.** ca
114c0 6c 6c 20 74 6f 20 62 74 72 65 65 47 65 74 50 61  ll to btreeGetPa
114d0 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
114e0 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f  id releasePageNo
114f0 74 4e 75 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  tNull(MemPage *p
11500 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Page){.  assert(
11510 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b   pPage->aData );
11520 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
11530 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72  ->pBt );.  asser
11540 74 28 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67  t( pPage->pDbPag
11550 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
11560 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
11570 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44  tExtra(pPage->pD
11580 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a  bPage) == (void*
11590 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65  )pPage );.  asse
115a0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
115b0 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70  GetData(pPage->p
115c0 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e  DbPage)==pPage->
115d0 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72  aData );.  asser
115e0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
115f0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
11600 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
11610 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e  lite3PagerUnrefN
11620 6f 74 4e 75 6c 6c 28 70 50 61 67 65 2d 3e 70 44  otNull(pPage->pD
11630 62 50 61 67 65 29 3b 0a 7d 0a 73 74 61 74 69 63  bPage);.}.static
11640 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67   void releasePag
11650 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
11660 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 20 29  ){.  if( pPage )
11670 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e   releasePageNotN
11680 75 6c 6c 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f  ull(pPage);.}../
11690 2a 0a 2a 2a 20 47 65 74 20 61 6e 20 75 6e 75 73  *.** Get an unus
116a0 65 64 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  ed page..**.** T
116b0 68 69 73 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c  his works just l
116c0 69 6b 65 20 62 74 72 65 65 47 65 74 50 61 67 65  ike btreeGetPage
116d0 28 29 20 77 69 74 68 20 74 68 65 20 61 64 64 69  () with the addi
116e0 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  tion:.**.**   * 
116f0 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
11700 61 6c 72 65 61 64 79 20 69 6e 20 75 73 65 20 66  already in use f
11710 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75  or some other pu
11720 72 70 6f 73 65 2c 20 69 6d 6d 65 64 69 61 74 65  rpose, immediate
11730 6c 79 0a 2a 2a 20 20 20 20 20 20 72 65 6c 65 61  ly.**      relea
11740 73 65 20 69 74 20 61 6e 64 20 72 65 74 75 72 6e  se it and return
11750 20 61 6e 20 53 51 4c 49 54 45 5f 43 55 52 52 55   an SQLITE_CURRU
11760 50 54 20 65 72 72 6f 72 2e 0a 2a 2a 20 20 20 2a  PT error..**   *
11770 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20    Make sure the 
11780 69 73 49 6e 69 74 20 66 6c 61 67 20 69 73 20 63  isInit flag is c
11790 6c 65 61 72 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lear.*/.static i
117a0 6e 74 20 62 74 72 65 65 47 65 74 55 6e 75 73 65  nt btreeGetUnuse
117b0 64 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  dPage(.  BtShare
117c0 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a  d *pBt,       /*
117d0 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
117e0 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
117f0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
11800 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66 65  f the page to fe
11810 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  tch */.  MemPage
11820 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
11830 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   Return the page
11840 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74   in this paramet
11850 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  er */.  int flag
11860 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s            /* 
11870 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
11880 45 4e 54 20 6f 72 20 50 41 47 45 52 5f 47 45 54  ENT or PAGER_GET
11890 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a  _READONLY */.){.
118a0 20 20 69 6e 74 20 72 63 20 3d 20 62 74 72 65 65    int rc = btree
118b0 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e  GetPage(pBt, pgn
118c0 6f 2c 20 70 70 50 61 67 65 2c 20 66 6c 61 67 73  o, ppPage, flags
118d0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
118e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
118f0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
11900 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50  geRefcount((*ppP
11910 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3e 31  age)->pDbPage)>1
11920 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
11930 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
11940 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
11950 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
11960 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
11970 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28  KPT;.    }.    (
11980 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74  *ppPage)->isInit
11990 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
119a0 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a     *ppPage = 0;.
119b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
119c0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e  .}.../*.** Durin
119d0 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68  g a rollback, wh
119e0 65 6e 20 74 68 65 20 70 61 67 65 72 20 72 65 6c  en the pager rel
119f0 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  oads information
11a00 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 0a   into the cache.
11a10 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 63  ** so that the c
11a20 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65 64  ache is restored
11a30 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
11a40 20 73 74 61 74 65 20 61 74 20 74 68 65 20 73 74   state at the st
11a50 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72  art of.** the tr
11a60 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65  ansaction, for e
11a70 61 63 68 20 70 61 67 65 20 72 65 73 74 6f 72 65  ach page restore
11a80 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  d this routine i
11a90 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
11aa0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 65  This routine nee
11ab0 64 73 20 74 6f 20 72 65 73 65 74 20 74 68 65 20  ds to reset the 
11ac0 65 78 74 72 61 20 64 61 74 61 20 73 65 63 74 69  extra data secti
11ad0 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  on at the end of
11ae0 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20   the.** page to 
11af0 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72  agree with the r
11b00 65 73 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f  estored data..*/
11b10 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
11b20 65 52 65 69 6e 69 74 28 44 62 50 61 67 65 20 2a  eReinit(DbPage *
11b30 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67  pData){.  MemPag
11b40 65 20 2a 70 50 61 67 65 3b 0a 20 20 70 50 61 67  e *pPage;.  pPag
11b50 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73  e = (MemPage *)s
11b60 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
11b70 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20 61 73  tra(pData);.  as
11b80 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
11b90 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  erPageRefcount(p
11ba0 44 61 74 61 29 3e 30 20 29 3b 0a 20 20 69 66 28  Data)>0 );.  if(
11bb0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
11bc0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
11bd0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
11be0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
11bf0 65 78 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ex) );.    pPage
11c00 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
11c10 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
11c20 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  erPageRefcount(p
11c30 44 61 74 61 29 3e 31 20 29 7b 0a 20 20 20 20 20  Data)>1 ){.     
11c40 20 2f 2a 20 70 50 61 67 65 20 6d 69 67 68 74 20   /* pPage might 
11c50 6e 6f 74 20 62 65 20 61 20 62 74 72 65 65 20 70  not be a btree p
11c60 61 67 65 3b 20 20 69 74 20 6d 69 67 68 74 20 62  age;  it might b
11c70 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
11c80 67 65 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 70  ge.      ** or p
11c90 74 72 6d 61 70 20 70 61 67 65 20 6f 72 20 61 20  trmap page or a 
11ca0 66 72 65 65 20 70 61 67 65 2e 20 20 49 6e 20 74  free page.  In t
11cb0 68 6f 73 65 20 63 61 73 65 73 2c 20 74 68 65 20  hose cases, the 
11cc0 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20  following.      
11cd0 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65  ** call to btree
11ce0 49 6e 69 74 50 61 67 65 28 29 20 77 69 6c 6c 20  InitPage() will 
11cf0 6c 69 6b 65 6c 79 20 72 65 74 75 72 6e 20 53 51  likely return SQ
11d00 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20  LITE_CORRUPT..  
11d10 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61      ** But no ha
11d20 72 6d 20 69 73 20 64 6f 6e 65 20 62 79 20 74 68  rm is done by th
11d30 69 73 2e 20 20 41 6e 64 20 69 74 20 69 73 20 76  is.  And it is v
11d40 65 72 79 20 69 6d 70 6f 72 74 61 6e 74 20 74 68  ery important th
11d50 61 74 0a 20 20 20 20 20 20 2a 2a 20 62 74 72 65  at.      ** btre
11d60 65 49 6e 69 74 50 61 67 65 28 29 20 62 65 20 63  eInitPage() be c
11d70 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72 79 20 62  alled on every b
11d80 74 72 65 65 20 70 61 67 65 20 73 6f 20 77 65 20  tree page so we 
11d90 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  make.      ** th
11da0 65 20 63 61 6c 6c 20 66 6f 72 20 65 76 65 72 79  e call for every
11db0 20 70 61 67 65 20 74 68 61 74 20 63 6f 6d 65 73   page that comes
11dc0 20 69 6e 20 66 6f 72 20 72 65 2d 69 6e 69 74 69   in for re-initi
11dd0 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 62 74 72  ng. */.      btr
11de0 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
11df0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
11e00 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
11e10 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 6f   busy handler fo
11e20 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74  r a btree..*/.st
11e30 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e  atic int btreeIn
11e40 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
11e50 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 42  void *pArg){.  B
11e60 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 28  tShared *pBt = (
11e70 42 74 53 68 61 72 65 64 2a 29 70 41 72 67 3b 0a  BtShared*)pArg;.
11e80 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 64    assert( pBt->d
11e90 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  b );.  assert( s
11ea0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
11eb0 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78  d(pBt->db->mutex
11ec0 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  ) );.  return sq
11ed0 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48  lite3InvokeBusyH
11ee0 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d  andler(&pBt->db-
11ef0 3e 62 75 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d  >busyHandler);.}
11f00 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64  ../*.** Open a d
11f10 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
11f20 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69   .** zFilename i
11f30 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
11f40 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
11f50 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69    If zFilename i
11f60 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 61  s NULL.** then a
11f70 6e 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61  n ephemeral data
11f80 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64 2e  base is created.
11f90 20 20 54 68 65 20 65 70 68 65 6d 65 72 61 6c 20    The ephemeral 
11fa0 64 61 74 61 62 61 73 65 20 6d 69 67 68 74 0a 2a  database might.*
11fb0 2a 20 62 65 20 65 78 63 6c 75 73 69 76 65 6c 79  * be exclusively
11fc0 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 6f 72 20 69   in memory, or i
11fd0 74 20 6d 69 67 68 74 20 75 73 65 20 61 20 64 69  t might use a di
11fe0 73 6b 2d 62 61 73 65 64 20 6d 65 6d 6f 72 79 20  sk-based memory 
11ff0 63 61 63 68 65 2e 0a 2a 2a 20 45 69 74 68 65 72  cache..** Either
12000 20 77 61 79 2c 20 74 68 65 20 65 70 68 65 6d 65   way, the epheme
12010 72 61 6c 20 64 61 74 61 62 61 73 65 20 77 69 6c  ral database wil
12020 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c  l be automatical
12030 6c 79 20 64 65 6c 65 74 65 64 20 0a 2a 2a 20 77  ly deleted .** w
12040 68 65 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65  hen sqlite3Btree
12050 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65  Close() is calle
12060 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c  d..**.** If zFil
12070 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72  ename is ":memor
12080 79 3a 22 20 74 68 65 6e 20 61 6e 20 69 6e 2d 6d  y:" then an in-m
12090 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 69  emory database i
120a0 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 74 68 61  s created.** tha
120b0 74 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c  t is automatical
120c0 6c 79 20 64 65 73 74 72 6f 79 65 64 20 77 68 65  ly destroyed whe
120d0 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a  n it is closed..
120e0 2a 2a 0a 2a 2a 20 54 68 65 20 22 66 6c 61 67 73  **.** The "flags
120f0 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  " parameter is a
12100 20 62 69 74 6d 61 73 6b 20 74 68 61 74 20 6d 69   bitmask that mi
12110 67 68 74 20 63 6f 6e 74 61 69 6e 20 62 69 74 73  ght contain bits
12120 20 6c 69 6b 65 0a 2a 2a 20 42 54 52 45 45 5f 4f   like.** BTREE_O
12130 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f  MIT_JOURNAL and/
12140 6f 72 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59 2e  or BTREE_MEMORY.
12150 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61  .**.** If the da
12160 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64  tabase is alread
12170 79 20 6f 70 65 6e 65 64 20 69 6e 20 74 68 65 20  y opened in the 
12180 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f  same database co
12190 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20  nnection.** and 
121a0 77 65 20 61 72 65 20 69 6e 20 73 68 61 72 65 64  we are in shared
121b0 20 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65   cache mode, the
121c0 6e 20 74 68 65 20 6f 70 65 6e 20 77 69 6c 6c 20  n the open will 
121d0 66 61 69 6c 20 77 69 74 68 20 61 6e 0a 2a 2a 20  fail with an.** 
121e0 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
121f0 54 20 65 72 72 6f 72 2e 20 20 57 65 20 63 61 6e  T error.  We can
12200 6e 6f 74 20 61 6c 6c 6f 77 20 74 77 6f 20 6f 72  not allow two or
12210 20 6d 6f 72 65 20 42 74 53 68 61 72 65 64 0a 2a   more BtShared.*
12220 2a 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 65  * objects in the
12230 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 63   same database c
12240 6f 6e 6e 65 63 74 69 6f 6e 20 73 69 6e 63 65 20  onnection since 
12250 64 6f 69 6e 67 20 73 6f 20 77 69 6c 6c 20 6c 65  doing so will le
12260 61 64 0a 2a 2a 20 74 6f 20 70 72 6f 62 6c 65 6d  ad.** to problem
12270 73 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a  s with locking..
12280 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
12290 72 65 65 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74  reeOpen(.  sqlit
122a0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
122b0 20 20 20 2f 2a 20 56 46 53 20 74 6f 20 75 73 65     /* VFS to use
122c0 20 66 6f 72 20 74 68 69 73 20 62 2d 74 72 65 65   for this b-tree
122d0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
122e0 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a   *zFilename,  /*
122f0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
12300 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
12310 20 42 54 72 65 65 20 64 61 74 61 62 61 73 65 20   BTree database 
12320 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
12330 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
12340 41 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62  Associated datab
12350 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
12360 42 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65 2c  Btree **ppBtree,
12370 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
12380 65 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20  er to new Btree 
12390 6f 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68  object written h
123a0 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ere */.  int fla
123b0 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
123c0 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20   /* Options */. 
123d0 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20   int vfsFlags   
123e0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
123f0 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68  s passed through
12400 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e   to sqlite3_vfs.
12410 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20  xOpen() */.){.  
12420 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
12430 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
12440 2a 20 53 68 61 72 65 64 20 70 61 72 74 20 6f 66  * Shared part of
12450 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
12460 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b 20   */.  Btree *p; 
12470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12480 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74       /* Handle t
12490 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71  o return */.  sq
124a0 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
124b0 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20  exOpen = 0;  /* 
124c0 50 72 65 76 65 6e 74 73 20 61 20 72 61 63 65 20  Prevents a race 
124d0 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65  condition. Ticke
124e0 74 20 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74  t #3537 */.  int
124f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
12500 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
12510 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20  esult code from 
12520 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
12530 0a 20 20 75 38 20 6e 52 65 73 65 72 76 65 3b 20  .  u8 nReserve; 
12540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12550 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e 75    /* Byte of unu
12560 73 65 64 20 73 70 61 63 65 20 6f 6e 20 65 61 63  sed space on eac
12570 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69  h page */.  unsi
12580 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48 65 61  gned char zDbHea
12590 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61  der[100];  /* Da
125a0 74 61 62 61 73 65 20 68 65 61 64 65 72 20 63 6f  tabase header co
125b0 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54  ntent */..  /* T
125c0 72 75 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 61  rue if opening a
125d0 6e 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 65 6d  n ephemeral, tem
125e0 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20  porary database 
125f0 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  */.  const int i
12600 73 54 65 6d 70 44 62 20 3d 20 7a 46 69 6c 65 6e  sTempDb = zFilen
12610 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e  ame==0 || zFilen
12620 61 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a  ame[0]==0;..  /*
12630 20 53 65 74 20 74 68 65 20 76 61 72 69 61 62 6c   Set the variabl
12640 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 75  e isMemdb to tru
12650 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  e for an in-memo
12660 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20  ry database, or 
12670 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20  .  ** false for 
12680 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64 61 74  a file-based dat
12690 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 23 69 66 64  abase..  */.#ifd
126a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
126b0 45 4d 4f 52 59 44 42 0a 20 20 63 6f 6e 73 74 20  EMORYDB.  const 
126c0 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b  int isMemdb = 0;
126d0 0a 23 65 6c 73 65 0a 20 20 63 6f 6e 73 74 20 69  .#else.  const i
126e0 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 28 7a 46  nt isMemdb = (zF
126f0 69 6c 65 6e 61 6d 65 20 26 26 20 73 74 72 63 6d  ilename && strcm
12700 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d  p(zFilename, ":m
12710 65 6d 6f 72 79 3a 22 29 3d 3d 30 29 0a 20 20 20  emory:")==0).   
12720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12730 20 20 20 20 7c 7c 20 28 69 73 54 65 6d 70 44 62      || (isTempDb
12740 20 26 26 20 73 71 6c 69 74 65 33 54 65 6d 70 49   && sqlite3TempI
12750 6e 4d 65 6d 6f 72 79 28 64 62 29 29 0a 20 20 20  nMemory(db)).   
12760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12770 20 20 20 20 7c 7c 20 28 76 66 73 46 6c 61 67 73      || (vfsFlags
12780 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d   & SQLITE_OPEN_M
12790 45 4d 4f 52 59 29 21 3d 30 3b 0a 23 65 6e 64 69  EMORY)!=0;.#endi
127a0 66 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  f..  assert( db!
127b0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
127c0 70 56 66 73 21 3d 30 20 29 3b 0a 20 20 61 73 73  pVfs!=0 );.  ass
127d0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
127e0 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
127f0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
12800 28 66 6c 61 67 73 26 30 78 66 66 29 3d 3d 66 6c  (flags&0xff)==fl
12810 61 67 73 20 29 3b 20 20 20 2f 2a 20 66 6c 61 67  ags );   /* flag
12820 73 20 66 69 74 20 69 6e 20 38 20 62 69 74 73 20  s fit in 8 bits 
12830 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61 20  */..  /* Only a 
12840 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61 74  BTREE_SINGLE dat
12850 61 62 61 73 65 20 63 61 6e 20 62 65 20 42 54 52  abase can be BTR
12860 45 45 5f 55 4e 4f 52 44 45 52 45 44 20 2a 2f 0a  EE_UNORDERED */.
12870 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73    assert( (flags
12880 20 26 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52   & BTREE_UNORDER
12890 45 44 29 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73  ED)==0 || (flags
128a0 20 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 29   & BTREE_SINGLE)
128b0 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 42  !=0 );..  /* A B
128c0 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61 74 61  TREE_SINGLE data
128d0 62 61 73 65 20 69 73 20 61 6c 77 61 79 73 20 61  base is always a
128e0 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 2f 6f   temporary and/o
128f0 72 20 65 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 20  r ephemeral */. 
12900 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 20   assert( (flags 
12910 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 29 3d  & BTREE_SINGLE)=
12920 3d 30 20 7c 7c 20 69 73 54 65 6d 70 44 62 20 29  =0 || isTempDb )
12930 3b 0a 0a 20 20 69 66 28 20 69 73 4d 65 6d 64 62  ;..  if( isMemdb
12940 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d   ){.    flags |=
12950 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59 3b 0a 20   BTREE_MEMORY;. 
12960 20 7d 0a 20 20 69 66 28 20 28 76 66 73 46 6c 61   }.  if( (vfsFla
12970 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
12980 5f 4d 41 49 4e 5f 44 42 29 21 3d 30 20 26 26 20  _MAIN_DB)!=0 && 
12990 28 69 73 4d 65 6d 64 62 20 7c 7c 20 69 73 54 65  (isMemdb || isTe
129a0 6d 70 44 62 29 20 29 7b 0a 20 20 20 20 76 66 73  mpDb) ){.    vfs
129b0 46 6c 61 67 73 20 3d 20 28 76 66 73 46 6c 61 67  Flags = (vfsFlag
129c0 73 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e  s & ~SQLITE_OPEN
129d0 5f 4d 41 49 4e 5f 44 42 29 20 7c 20 53 51 4c 49  _MAIN_DB) | SQLI
129e0 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b  TE_OPEN_TEMP_DB;
129f0 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74  .  }.  p = sqlit
12a00 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a  e3MallocZero(siz
12a10 65 6f 66 28 42 74 72 65 65 29 29 3b 0a 20 20 69  eof(Btree));.  i
12a20 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74  f( !p ){.    ret
12a30 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
12a40 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 2d 3e  _BKPT;.  }.  p->
12a50 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
12a60 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  NONE;.  p->db = 
12a70 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  db;.#ifndef SQLI
12a80 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
12a90 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70  ACHE.  p->lock.p
12aa0 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e  Btree = p;.  p->
12ab0 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b  lock.iTable = 1;
12ac0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
12ad0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
12ae0 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
12af0 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
12b00 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
12b10 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69    /*.  ** If thi
12b20 73 20 42 74 72 65 65 20 69 73 20 61 20 63 61 6e  s Btree is a can
12b30 64 69 64 61 74 65 20 66 6f 72 20 73 68 61 72 65  didate for share
12b40 64 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20  d cache, try to 
12b50 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69  find an.  ** exi
12b60 73 74 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f  sting BtShared o
12b70 62 6a 65 63 74 20 74 68 61 74 20 77 65 20 63 61  bject that we ca
12b80 6e 20 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a  n share with.  *
12b90 2f 0a 20 20 69 66 28 20 69 73 54 65 6d 70 44 62  /.  if( isTempDb
12ba0 3d 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62 3d  ==0 && (isMemdb=
12bb0 3d 30 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 26  =0 || (vfsFlags&
12bc0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29  SQLITE_OPEN_URI)
12bd0 21 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28 20  !=0) ){.    if( 
12be0 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54  vfsFlags & SQLIT
12bf0 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43  E_OPEN_SHAREDCAC
12c00 48 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  HE ){.      int 
12c10 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69  nFilename = sqli
12c20 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
12c30 65 6e 61 6d 65 29 2b 31 3b 0a 20 20 20 20 20 20  ename)+1;.      
12c40 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d  int nFullPathnam
12c50 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  e = pVfs->mxPath
12c60 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20 20 63 68  name+1;.      ch
12c70 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ar *zFullPathnam
12c80 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  e = sqlite3Mallo
12c90 63 28 4d 41 58 28 6e 46 75 6c 6c 50 61 74 68 6e  c(MAX(nFullPathn
12ca0 61 6d 65 2c 6e 46 69 6c 65 6e 61 6d 65 29 29 3b  ame,nFilename));
12cb0 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47  .      MUTEX_LOG
12cc0 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  IC( sqlite3_mute
12cd0 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20  x *mutexShared; 
12ce0 29 0a 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  )..      p->shar
12cf0 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  able = 1;.      
12d00 69 66 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61  if( !zFullPathna
12d10 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  me ){.        sq
12d20 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
12d30 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
12d40 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
12d50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
12d60 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20  f( isMemdb ){.  
12d70 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 46 75        memcpy(zFu
12d80 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 69 6c  llPathname, zFil
12d90 65 6e 61 6d 65 2c 20 6e 46 69 6c 65 6e 61 6d 65  ename, nFilename
12da0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
12db0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
12dc0 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61  ite3OsFullPathna
12dd0 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61  me(pVfs, zFilena
12de0 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
12df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e00 20 20 20 20 20 20 20 6e 46 75 6c 6c 50 61 74 68         nFullPath
12e10 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e  name, zFullPathn
12e20 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ame);.        if
12e30 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
12e40 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
12e50 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
12e60 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
12e70 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20  _free(p);.      
12e80 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
12e90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
12ea0 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
12eb0 41 44 53 41 46 45 0a 20 20 20 20 20 20 6d 75 74  ADSAFE.      mut
12ec0 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65 33  exOpen = sqlite3
12ed0 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
12ee0 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4f  E_MUTEX_STATIC_O
12ef0 50 45 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  PEN);.      sqli
12f00 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
12f10 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20  mutexOpen);.    
12f20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20    mutexShared = 
12f30 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
12f40 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
12f50 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20  TATIC_MASTER);. 
12f60 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
12f70 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68  ex_enter(mutexSh
12f80 61 72 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ared);.#endif.  
12f90 20 20 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f 42      for(pBt=GLOB
12fa0 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
12fb0 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
12fc0 69 73 74 29 3b 20 70 42 74 3b 20 70 42 74 3d 70  ist); pBt; pBt=p
12fd0 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  Bt->pNext){.    
12fe0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
12ff0 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 20  >nRef>0 );.     
13000 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70     if( 0==strcmp
13010 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  (zFullPathname, 
13020 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
13030 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65 72  name(pBt->pPager
13040 2c 20 30 29 29 0a 20 20 20 20 20 20 20 20 20 20  , 0)).          
13050 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
13060 33 50 61 67 65 72 56 66 73 28 70 42 74 2d 3e 70  3PagerVfs(pBt->p
13070 50 61 67 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a  Pager)==pVfs ){.
13080 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44            int iD
13090 62 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  b;.          for
130a0 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20  (iDb=db->nDb-1; 
130b0 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a  iDb>=0; iDb--){.
130c0 20 20 20 20 20 20 20 20 20 20 20 20 42 74 72 65              Btre
130d0 65 20 2a 70 45 78 69 73 74 69 6e 67 20 3d 20 64  e *pExisting = d
130e0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b  b->aDb[iDb].pBt;
130f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
13100 20 70 45 78 69 73 74 69 6e 67 20 26 26 20 70 45   pExisting && pE
13110 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d 3d 70 42  xisting->pBt==pB
13120 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
13130 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
13140 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72  _leave(mutexShar
13150 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ed);.           
13160 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
13170 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e  _leave(mutexOpen
13180 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
13190 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
131a0 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
131b0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
131c0 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
131d0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
131e0 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  n SQLITE_CONSTRA
131f0 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  INT;.           
13200 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
13210 20 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74 20           p->pBt 
13220 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20  = pBt;.         
13230 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20   pBt->nRef++;.  
13240 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
13250 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
13260 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
13270 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
13280 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 73  Shared);.      s
13290 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c  qlite3_free(zFul
132a0 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
132b0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
132c0 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a  DEBUG.    else{.
132d0 20 20 20 20 20 20 2f 2a 20 49 6e 20 64 65 62 75        /* In debu
132e0 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20  g mode, we mark 
132f0 61 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20 64  all persistent d
13300 61 74 61 62 61 73 65 73 20 61 73 20 73 68 61 72  atabases as shar
13310 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65 76  able.      ** ev
13320 65 6e 20 77 68 65 6e 20 74 68 65 79 20 61 72 65  en when they are
13330 20 6e 6f 74 2e 20 20 54 68 69 73 20 65 78 65 72   not.  This exer
13340 63 69 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e  cises the lockin
13350 67 20 63 6f 64 65 20 61 6e 64 0a 20 20 20 20 20  g code and.     
13360 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65 20 6f   ** gives more o
13370 70 70 6f 72 74 75 6e 69 74 79 20 66 6f 72 20 61  pportunity for a
13380 73 73 65 72 74 73 28 73 71 6c 69 74 65 33 5f 6d  sserts(sqlite3_m
13390 75 74 65 78 5f 68 65 6c 64 28 29 29 0a 20 20 20  utex_held()).   
133a0 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73     ** statements
133b0 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67   to find locking
133c0 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20   problems..     
133d0 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68 61   */.      p->sha
133e0 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d  rable = 1;.    }
133f0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64  .#endif.  }.#end
13400 69 66 0a 20 20 69 66 28 20 70 42 74 3d 3d 30 20  if.  if( pBt==0 
13410 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
13420 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
13430 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72 65  sserts make sure
13440 20 74 68 61 74 20 73 74 72 75 63 74 75 72 65 73   that structures
13450 20 75 73 65 64 20 62 79 20 74 68 65 20 62 74 72   used by the btr
13460 65 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68  ee are.    ** th
13470 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20 54  e right size.  T
13480 68 69 73 20 69 73 20 74 6f 20 67 75 61 72 64 20  his is to guard 
13490 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68 61  against size cha
134a0 6e 67 65 73 20 74 68 61 74 20 72 65 73 75 6c 74  nges that result
134b0 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d  .    ** when com
134c0 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66 66  piling on a diff
134d0 65 72 65 6e 74 20 61 72 63 68 69 74 65 63 74 75  erent architectu
134e0 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  re..    */.    a
134f0 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69 36  ssert( sizeof(i6
13500 34 29 3d 3d 38 20 29 3b 0a 20 20 20 20 61 73 73  4)==8 );.    ass
13510 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36 34 29  ert( sizeof(u64)
13520 3d 3d 38 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==8 );.    asser
13530 74 28 20 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d  t( sizeof(u32)==
13540 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  4 );.    assert(
13550 20 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20   sizeof(u16)==2 
13560 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
13570 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29  izeof(Pgno)==4 )
13580 3b 0a 20 20 0a 20 20 20 20 70 42 74 20 3d 20 73  ;.  .    pBt = s
13590 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
135a0 28 20 73 69 7a 65 6f 66 28 2a 70 42 74 29 20 29  ( sizeof(*pBt) )
135b0 3b 0a 20 20 20 20 69 66 28 20 70 42 74 3d 3d 30  ;.    if( pBt==0
135c0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
135d0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
135e0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72  ;.      goto btr
135f0 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
13600 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
13610 74 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56 66  te3PagerOpen(pVf
13620 73 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72 2c  s, &pBt->pPager,
13630 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20   zFilename,.    
13640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13650 20 20 20 20 20 20 73 69 7a 65 6f 66 28 4d 65 6d        sizeof(Mem
13660 50 61 67 65 29 2c 20 66 6c 61 67 73 2c 20 76 66  Page), flags, vf
13670 73 46 6c 61 67 73 2c 20 70 61 67 65 52 65 69 6e  sFlags, pageRein
13680 69 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  it);.    if( rc=
13690 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
136a0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
136b0 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74  SetMmapLimit(pBt
136c0 2d 3e 70 50 61 67 65 72 2c 20 64 62 2d 3e 73 7a  ->pPager, db->sz
136d0 4d 6d 61 70 29 3b 0a 20 20 20 20 20 20 72 63 20  Mmap);.      rc 
136e0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  = sqlite3PagerRe
136f0 61 64 46 69 6c 65 68 65 61 64 65 72 28 70 42 74  adFileheader(pBt
13700 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f 66 28  ->pPager,sizeof(
13710 7a 44 62 48 65 61 64 65 72 29 2c 7a 44 62 48 65  zDbHeader),zDbHe
13720 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ader);.    }.   
13730 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13740 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
13750 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
13760 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
13770 6f 70 65 6e 46 6c 61 67 73 20 3d 20 28 75 38 29  openFlags = (u8)
13780 66 6c 61 67 73 3b 0a 20 20 20 20 70 42 74 2d 3e  flags;.    pBt->
13790 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 73 71 6c  db = db;.    sql
137a0 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79  ite3PagerSetBusy
137b0 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50 61  handler(pBt->pPa
137c0 67 65 72 2c 20 62 74 72 65 65 49 6e 76 6f 6b 65  ger, btreeInvoke
137d0 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 42 74  BusyHandler, pBt
137e0 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d 20  );.    p->pBt = 
137f0 70 42 74 3b 0a 20 20 0a 20 20 20 20 70 42 74 2d  pBt;.  .    pBt-
13800 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20  >pCursor = 0;.  
13810 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
13820 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  0;.    if( sqlit
13830 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c  e3PagerIsreadonl
13840 79 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29  y(pBt->pPager) )
13850 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
13860 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b  = BTS_READ_ONLY;
13870 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53  .#ifdef SQLITE_S
13880 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 20  ECURE_DELETE.   
13890 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
138a0 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  = BTS_SECURE_DEL
138b0 45 54 45 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ETE;.#endif.    
138c0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
138d0 52 2d 35 31 38 37 33 2d 33 39 36 31 38 20 54 68  R-51873-39618 Th
138e0 65 20 70 61 67 65 20 73 69 7a 65 20 66 6f 72 20  e page size for 
138f0 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
13900 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d  is.    ** determ
13910 69 6e 65 64 20 62 79 20 74 68 65 20 32 2d 62 79  ined by the 2-by
13920 74 65 20 69 6e 74 65 67 65 72 20 6c 6f 63 61 74  te integer locat
13930 65 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20  ed at an offset 
13940 6f 66 20 31 36 20 62 79 74 65 73 20 66 72 6f 6d  of 16 bytes from
13950 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 65 67 69  .    ** the begi
13960 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74  nning of the dat
13970 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20  abase file. */. 
13980 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
13990 20 3d 20 28 7a 44 62 48 65 61 64 65 72 5b 31 36   = (zDbHeader[16
139a0 5d 3c 3c 38 29 20 7c 20 28 7a 44 62 48 65 61 64  ]<<8) | (zDbHead
139b0 65 72 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20  er[17]<<16);.   
139c0 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69   if( pBt->pageSi
139d0 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70  ze<512 || pBt->p
139e0 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  ageSize>SQLITE_M
139f0 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20  AX_PAGE_SIZE.   
13a00 20 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e        || ((pBt->
13a10 70 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d  pageSize-1)&pBt-
13a20 3e 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b  >pageSize)!=0 ){
13a30 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65  .      pBt->page
13a40 53 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65  Size = 0;.#ifnde
13a50 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
13a60 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f  TOVACUUM.      /
13a70 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e  * If the magic n
13a80 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77  ame ":memory:" w
13a90 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e  ill create an in
13aa0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
13ab0 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  , then.      ** 
13ac0 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f 56 61  leave the autoVa
13ad0 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20 28  cuum mode at 0 (
13ae0 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75  do not auto-vacu
13af0 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20 20  um), even if.   
13b00 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46     ** SQLITE_DEF
13b10 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  AULT_AUTOVACUUM 
13b20 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65 20  is true. On the 
13b30 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a 20  other hand, if. 
13b40 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f       ** SQLITE_O
13b50 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73  MIT_MEMORYDB has
13b60 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20 74   been defined, t
13b70 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69  hen ":memory:" i
13b80 73 20 6a 75 73 74 20 61 0a 20 20 20 20 20 20 2a  s just a.      *
13b90 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e  * regular file-n
13ba0 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ame. In this cas
13bb0 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  e the auto-vacuu
13bc0 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70 65 72  m applies as per
13bd0 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a   normal..      *
13be0 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c  /.      if( zFil
13bf0 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64  ename && !isMemd
13c00 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  b ){.        pBt
13c10 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28  ->autoVacuum = (
13c20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
13c30 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a 20  UTOVACUUM ? 1 : 
13c40 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d  0);.        pBt-
13c50 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 53  >incrVacuum = (S
13c60 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
13c70 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20  TOVACUUM==2 ? 1 
13c80 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  : 0);.      }.#e
13c90 6e 64 69 66 0a 20 20 20 20 20 20 6e 52 65 73 65  ndif.      nRese
13ca0 72 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  rve = 0;.    }el
13cb0 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49  se{.      /* EVI
13cc0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 34 39  DENCE-OF: R-3749
13cd0 37 2d 34 32 34 31 32 20 54 68 65 20 73 69 7a 65  7-42412 The size
13ce0 20 6f 66 20 74 68 65 20 72 65 73 65 72 76 65 64   of the reserved
13cf0 20 72 65 67 69 6f 6e 20 69 73 0a 20 20 20 20 20   region is.     
13d00 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62   ** determined b
13d10 79 20 74 68 65 20 6f 6e 65 2d 62 79 74 65 20 75  y the one-byte u
13d20 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20  nsigned integer 
13d30 66 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66 66 73  found at an offs
13d40 65 74 20 6f 66 20 32 30 0a 20 20 20 20 20 20 2a  et of 20.      *
13d50 2a 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  * into the datab
13d60 61 73 65 20 66 69 6c 65 20 68 65 61 64 65 72 2e  ase file header.
13d70 20 2a 2f 0a 20 20 20 20 20 20 6e 52 65 73 65 72   */.      nReser
13d80 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32  ve = zDbHeader[2
13d90 30 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62  0];.      pBt->b
13da0 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50  tsFlags |= BTS_P
13db0 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23  AGESIZE_FIXED;.#
13dc0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13dd0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
13de0 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
13df0 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
13e00 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20  &zDbHeader[36 + 
13e10 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20  4*4])?1:0);.    
13e20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
13e30 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a  m = (get4byte(&z
13e40 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37 2a  DbHeader[36 + 7*
13e50 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66  4])?1:0);.#endif
13e60 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
13e70 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
13e80 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
13e90 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
13ea0 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a  ize, nReserve);.
13eb0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
13ec0 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
13ed0 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c  ;.    pBt->usabl
13ee0 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67  eSize = pBt->pag
13ef0 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65  eSize - nReserve
13f00 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
13f10 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20 37  Bt->pageSize & 7
13f20 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79  )==0 );  /* 8-by
13f30 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  te alignment of 
13f40 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a  pageSize */.   .
13f50 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
13f60 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
13f70 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
13f80 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
13f90 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64  ISKIO).    /* Ad
13fa0 64 20 74 68 65 20 6e 65 77 20 42 74 53 68 61 72  d the new BtShar
13fb0 65 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65  ed object to the
13fc0 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68 61   linked list sha
13fd0 72 61 62 6c 65 20 42 74 53 68 61 72 65 64 73 2e  rable BtShareds.
13fe0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d  .    */.    pBt-
13ff0 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 69  >nRef = 1;.    i
14000 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  f( p->sharable )
14010 7b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f  {.      MUTEX_LO
14020 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  GIC( sqlite3_mut
14030 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b  ex *mutexShared;
14040 20 29 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c   ).      MUTEX_L
14050 4f 47 49 43 28 20 6d 75 74 65 78 53 68 61 72 65  OGIC( mutexShare
14060 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  d = sqlite3Mutex
14070 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
14080 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
14090 29 3b 29 0a 20 20 20 20 20 20 69 66 28 20 53 51  );).      if( SQ
140a0 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20  LITE_THREADSAFE 
140b0 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  && sqlite3Global
140c0 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65  Config.bCoreMute
140d0 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  x ){.        pBt
140e0 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65  ->mutex = sqlite
140f0 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
14100 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a  TE_MUTEX_FAST);.
14110 20 20 20 20 20 20 20 20 69 66 28 20 70 42 74 2d          if( pBt-
14120 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  >mutex==0 ){.   
14130 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
14140 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
14150 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 74           goto bt
14160 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
14170 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
14180 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
14190 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53  tex_enter(mutexS
141a0 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42  hared);.      pB
141b0 74 2d 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41  t->pNext = GLOBA
141c0 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
141d0 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
141e0 73 74 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41  st);.      GLOBA
141f0 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
14200 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
14210 73 74 29 20 3d 20 70 42 74 3b 0a 20 20 20 20 20  st) = pBt;.     
14220 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
14230 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64  eave(mutexShared
14240 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
14250 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65    }..#if !define
14260 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
14270 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21  ARED_CACHE) && !
14280 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
14290 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a  MIT_DISKIO).  /*
142a0 20 49 66 20 74 68 65 20 6e 65 77 20 42 74 72 65   If the new Btre
142b0 65 20 75 73 65 73 20 61 20 73 68 61 72 61 62 6c  e uses a sharabl
142c0 65 20 70 42 74 53 68 61 72 65 64 2c 20 74 68 65  e pBtShared, the
142d0 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20  n link the new. 
142e0 20 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f 20 74   ** Btree into t
142f0 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73  he list of all s
14300 68 61 72 61 62 6c 65 20 42 74 72 65 65 73 20 66  harable Btrees f
14310 6f 72 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e  or the same conn
14320 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65  ection..  ** The
14330 20 6c 69 73 74 20 69 73 20 6b 65 70 74 20 69 6e   list is kept in
14340 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
14350 20 62 79 20 70 42 74 20 61 64 64 72 65 73 73 2e   by pBt address.
14360 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73  .  */.  if( p->s
14370 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 69  harable ){.    i
14380 6e 74 20 69 3b 0a 20 20 20 20 42 74 72 65 65 20  nt i;.    Btree 
14390 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f 72 28 69  *pSib;.    for(i
143a0 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
143b0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  ++){.      if( (
143c0 70 53 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69  pSib = db->aDb[i
143d0 5d 2e 70 42 74 29 21 3d 30 20 26 26 20 70 53 69  ].pBt)!=0 && pSi
143e0 62 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  b->sharable ){. 
143f0 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53         while( pS
14400 69 62 2d 3e 70 50 72 65 76 20 29 7b 20 70 53 69  ib->pPrev ){ pSi
14410 62 20 3d 20 70 53 69 62 2d 3e 70 50 72 65 76 3b  b = pSib->pPrev;
14420 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28   }.        if( (
14430 75 70 74 72 29 70 2d 3e 70 42 74 3c 28 75 70 74  uptr)p->pBt<(upt
14440 72 29 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20  r)pSib->pBt ){. 
14450 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78           p->pNex
14460 74 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20  t = pSib;.      
14470 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30      p->pPrev = 0
14480 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62  ;.          pSib
14490 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20  ->pPrev = p;.   
144a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
144b0 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69        while( pSi
144c0 62 2d 3e 70 4e 65 78 74 20 26 26 20 28 75 70 74  b->pNext && (upt
144d0 72 29 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70  r)pSib->pNext->p
144e0 42 74 3c 28 75 70 74 72 29 70 2d 3e 70 42 74 20  Bt<(uptr)p->pBt 
144f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
14500 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78  Sib = pSib->pNex
14510 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
14520 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78           p->pNex
14530 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b  t = pSib->pNext;
14540 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50  .          p->pP
14550 72 65 76 20 3d 20 70 53 69 62 3b 0a 20 20 20 20  rev = pSib;.    
14560 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65        if( p->pNe
14570 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  xt ){.          
14580 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65    p->pNext->pPre
14590 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20  v = p;.         
145a0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 53 69   }.          pSi
145b0 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20  b->pNext = p;.  
145c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
145d0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
145e0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
145f0 20 20 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a    *ppBtree = p;.
14600 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a  .btree_open_out:
14610 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
14620 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
14630 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67  pBt && pBt->pPag
14640 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  er ){.      sqli
14650 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42  te3PagerClose(pB
14660 74 2d 3e 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  t->pPager, 0);. 
14670 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
14680 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20  _free(pBt);.    
14690 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
146a0 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20  .    *ppBtree = 
146b0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
146c0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
146d0 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  ile;..    /* If 
146e0 74 68 65 20 42 2d 54 72 65 65 20 77 61 73 20 73  the B-Tree was s
146f0 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e  uccessfully open
14700 65 64 2c 20 73 65 74 20 74 68 65 20 70 61 67 65  ed, set the page
14710 72 2d 63 61 63 68 65 20 73 69 7a 65 20 74 6f 20  r-cache size to 
14720 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61 75  the.    ** defau
14730 6c 74 20 76 61 6c 75 65 2e 20 45 78 63 65 70 74  lt value. Except
14740 2c 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 6f  , when opening o
14750 6e 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 68  n an existing sh
14760 61 72 65 64 20 70 61 67 65 72 2d 63 61 63 68 65  ared pager-cache
14770 2c 0a 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20  ,.    ** do not 
14780 63 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 72  change the pager
14790 2d 63 61 63 68 65 20 73 69 7a 65 2e 0a 20 20 20  -cache size..   
147a0 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
147b0 74 65 33 42 74 72 65 65 53 63 68 65 6d 61 28 70  te3BtreeSchema(p
147c0 2c 20 30 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20  , 0, 0)==0 ){.  
147d0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
147e0 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 2d 3e  SetCachesize(p->
147f0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 53 51 4c  pBt->pPager, SQL
14800 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48  ITE_DEFAULT_CACH
14810 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 0a  E_SIZE);.    }..
14820 20 20 20 20 70 46 69 6c 65 20 3d 20 73 71 6c 69      pFile = sqli
14830 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 42 74  te3PagerFile(pBt
14840 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  ->pPager);.    i
14850 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  f( pFile->pMetho
14860 64 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ds ){.      sqli
14870 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
14880 48 69 6e 74 28 70 46 69 6c 65 2c 20 53 51 4c 49  Hint(pFile, SQLI
14890 54 45 5f 46 43 4e 54 4c 5f 50 44 42 2c 20 28 76  TE_FCNTL_PDB, (v
148a0 6f 69 64 2a 29 26 70 42 74 2d 3e 64 62 29 3b 0a  oid*)&pBt->db);.
148b0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
148c0 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20 20 20  mutexOpen ){.   
148d0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
148e0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75 74 65  _mutex_held(mute
148f0 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20 73 71  xOpen) );.    sq
14900 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
14910 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20  e(mutexOpen);.  
14920 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  }.  assert( rc!=
14930 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c  SQLITE_OK || sql
14940 69 74 65 33 42 74 72 65 65 43 6f 6e 6e 65 63 74  ite3BtreeConnect
14950 69 6f 6e 43 6f 75 6e 74 28 2a 70 70 42 74 72 65  ionCount(*ppBtre
14960 65 29 3e 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  e)>0 );.  return
14970 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   rc;.}../*.** De
14980 63 72 65 6d 65 6e 74 20 74 68 65 20 42 74 53 68  crement the BtSh
14990 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65  ared.nRef counte
149a0 72 2e 20 20 57 68 65 6e 20 69 74 20 72 65 61 63  r.  When it reac
149b0 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d  hes zero,.** rem
149c0 6f 76 65 20 74 68 65 20 42 74 53 68 61 72 65 64  ove the BtShared
149d0 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20   structure from 
149e0 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74  the sharing list
149f0 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75  .  Return.** tru
14a00 65 20 69 66 20 74 68 65 20 42 74 53 68 61 72 65  e if the BtShare
14a10 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 20 72  d.nRef counter r
14a20 65 61 63 68 65 73 20 7a 65 72 6f 20 61 6e 64 20  eaches zero and 
14a30 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20  return.** false 
14a40 69 66 20 69 74 20 69 73 20 73 74 69 6c 6c 20 70  if it is still p
14a50 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74  ositive..*/.stat
14a60 69 63 20 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f  ic int removeFro
14a70 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 42 74 53  mSharingList(BtS
14a80 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 23 69 66  hared *pBt){.#if
14a90 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14aa0 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
14ab0 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c  MUTEX_LOGIC( sql
14ac0 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73  ite3_mutex *pMas
14ad0 74 65 72 3b 20 29 0a 20 20 42 74 53 68 61 72 65  ter; ).  BtShare
14ae0 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20  d *pList;.  int 
14af0 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20  removed = 0;..  
14b00 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
14b10 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42  mutex_notheld(pB
14b20 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 4d  t->mutex) );.  M
14b30 55 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d 61 73  UTEX_LOGIC( pMas
14b40 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  ter = sqlite3Mut
14b50 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
14b60 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
14b70 45 52 29 3b 20 29 0a 20 20 73 71 6c 69 74 65 33  ER); ).  sqlite3
14b80 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61  _mutex_enter(pMa
14b90 73 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52  ster);.  pBt->nR
14ba0 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d  ef--;.  if( pBt-
14bb0 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20  >nRef<=0 ){.    
14bc0 69 66 28 20 47 4c 4f 42 41 4c 28 42 74 53 68 61  if( GLOBAL(BtSha
14bd0 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
14be0 65 64 43 61 63 68 65 4c 69 73 74 29 3d 3d 70 42  edCacheList)==pB
14bf0 74 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41  t ){.      GLOBA
14c00 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
14c10 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
14c20 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74  st) = pBt->pNext
14c30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
14c40 20 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41     pList = GLOBA
14c50 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
14c60 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
14c70 73 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  st);.      while
14c80 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20  ( ALWAYS(pList) 
14c90 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21  && pList->pNext!
14ca0 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  =pBt ){.        
14cb0 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65  pList=pList->pNe
14cc0 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
14cd0 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c 69    if( ALWAYS(pLi
14ce0 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  st) ){.        p
14cf0 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42  List->pNext = pB
14d00 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  t->pNext;.      
14d10 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
14d20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
14d30 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E ){.      sqlit
14d40 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 42  e3_mutex_free(pB
14d50 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d  t->mutex);.    }
14d60 0a 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20 31  .    removed = 1
14d70 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
14d80 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73  mutex_leave(pMas
14d90 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ter);.  return r
14da0 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20  emoved;.#else.  
14db0 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66  return 1;.#endif
14dc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
14dd0 75 72 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  ure pBt->pTmpSpa
14de0 63 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  ce points to an 
14df0 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a  allocation of .*
14e00 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  * MX_CELL_SIZE(p
14e10 42 74 29 20 62 79 74 65 73 20 77 69 74 68 20 61  Bt) bytes with a
14e20 20 34 2d 62 79 74 65 20 70 72 65 66 69 78 20 66   4-byte prefix f
14e30 6f 72 20 61 20 6c 65 66 74 2d 63 68 69 6c 64 0a  or a left-child.
14e40 2a 2a 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73  ** pointer..*/.s
14e50 74 61 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63  tatic void alloc
14e60 61 74 65 54 65 6d 70 53 70 61 63 65 28 42 74 53  ateTempSpace(BtS
14e70 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
14e80 66 28 20 21 70 42 74 2d 3e 70 54 6d 70 53 70 61  f( !pBt->pTmpSpa
14e90 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70  ce ){.    pBt->p
14ea0 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74  TmpSpace = sqlit
14eb0 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42  e3PageMalloc( pB
14ec0 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 0a  t->pageSize );..
14ed0 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
14ee0 65 20 75 73 65 73 20 6f 66 20 70 42 74 2d 3e 70  e uses of pBt->p
14ef0 54 6d 70 53 70 61 63 65 20 69 73 20 74 6f 20 66  TmpSpace is to f
14f00 6f 72 6d 61 74 20 63 65 6c 6c 73 20 62 65 66 6f  ormat cells befo
14f10 72 65 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74  re.    ** insert
14f20 69 6e 67 20 74 68 65 6d 20 69 6e 74 6f 20 61 20  ing them into a 
14f30 6c 65 61 66 20 70 61 67 65 20 28 66 75 6e 63 74  leaf page (funct
14f40 69 6f 6e 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29  ion fillInCell()
14f50 29 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 20 63  ). If.    ** a c
14f60 65 6c 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ell is less than
14f70 20 34 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65   4 bytes in size
14f80 2c 20 69 74 20 69 73 20 72 6f 75 6e 64 65 64 20  , it is rounded 
14f90 75 70 20 74 6f 20 34 20 62 79 74 65 73 0a 20 20  up to 4 bytes.  
14fa0 20 20 2a 2a 20 62 79 20 74 68 65 20 76 61 72 69    ** by the vari
14fb0 6f 75 73 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ous routines tha
14fc0 74 20 6d 61 6e 69 70 75 6c 61 74 65 20 62 69 6e  t manipulate bin
14fd0 61 72 79 20 63 65 6c 6c 73 2e 20 57 68 69 63 68  ary cells. Which
14fe0 0a 20 20 20 20 2a 2a 20 63 61 6e 20 6d 65 61 6e  .    ** can mean
14ff0 20 74 68 61 74 20 66 69 6c 6c 49 6e 43 65 6c 6c   that fillInCell
15000 28 29 20 6f 6e 6c 79 20 69 6e 69 74 69 61 6c 69  () only initiali
15010 7a 65 73 20 74 68 65 20 66 69 72 73 74 20 32 20  zes the first 2 
15020 6f 72 20 33 0a 20 20 20 20 2a 2a 20 62 79 74 65  or 3.    ** byte
15030 73 20 6f 66 20 70 54 6d 70 53 70 61 63 65 2c 20  s of pTmpSpace, 
15040 62 75 74 20 74 68 61 74 20 74 68 65 20 66 69 72  but that the fir
15050 73 74 20 34 20 62 79 74 65 73 20 61 72 65 20 63  st 4 bytes are c
15060 6f 70 69 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a  opied from.    *
15070 2a 20 69 74 20 69 6e 74 6f 20 61 20 64 61 74 61  * it into a data
15080 62 61 73 65 20 70 61 67 65 2e 20 54 68 69 73 20  base page. This 
15090 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  is not actually 
150a0 61 20 70 72 6f 62 6c 65 6d 2c 20 62 75 74 20 69  a problem, but i
150b0 74 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 63 61  t.    ** does ca
150c0 75 73 65 20 61 20 76 61 6c 67 72 69 6e 64 20 65  use a valgrind e
150d0 72 72 6f 72 20 77 68 65 6e 20 74 68 65 20 31 20  rror when the 1 
150e0 6f 72 20 32 20 62 79 74 65 73 20 6f 66 20 75 6e  or 2 bytes of un
150f0 69 74 69 61 6c 69 7a 65 64 20 0a 20 20 20 20 2a  itialized .    *
15100 2a 20 64 61 74 61 20 69 73 20 70 61 73 73 65 64  * data is passed
15110 20 74 6f 20 73 79 73 74 65 6d 20 63 61 6c 6c 20   to system call 
15120 77 72 69 74 65 28 29 2e 20 53 6f 20 74 6f 20 61  write(). So to a
15130 76 6f 69 64 20 74 68 69 73 20 65 72 72 6f 72 2c  void this error,
15140 0a 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74 68 65  .    ** zero the
15150 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f   first 4 bytes o
15160 66 20 74 65 6d 70 20 73 70 61 63 65 20 68 65 72  f temp space her
15170 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
15180 20 41 6c 73 6f 3a 20 20 50 72 6f 76 69 64 65 20   Also:  Provide 
15190 66 6f 75 72 20 62 79 74 65 73 20 6f 66 20 69 6e  four bytes of in
151a0 69 74 69 61 6c 69 7a 65 64 20 73 70 61 63 65 20  itialized space 
151b0 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a  before the.    *
151c0 2a 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70  * beginning of p
151d0 54 6d 70 53 70 61 63 65 20 61 73 20 61 6e 20 61  TmpSpace as an a
151e0 72 65 61 20 61 76 61 69 6c 61 62 6c 65 20 74 6f  rea available to
151f0 20 70 72 65 70 65 6e 64 20 74 68 65 0a 20 20 20   prepend the.   
15200 20 2a 2a 20 6c 65 66 74 2d 63 68 69 6c 64 20 70   ** left-child p
15210 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62 65  ointer to the be
15220 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 63 65 6c  ginning of a cel
15230 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  l..    */.    if
15240 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  ( pBt->pTmpSpace
15250 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   ){.      memset
15260 28 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 2c  (pBt->pTmpSpace,
15270 20 30 2c 20 38 29 3b 0a 20 20 20 20 20 20 70 42   0, 8);.      pB
15280 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 2b 3d 20  t->pTmpSpace += 
15290 34 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  4;.    }.  }.}..
152a0 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70  /*.** Free the p
152b0 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 61 6c  Bt->pTmpSpace al
152c0 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74  location.*/.stat
152d0 69 63 20 76 6f 69 64 20 66 72 65 65 54 65 6d 70  ic void freeTemp
152e0 53 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a  Space(BtShared *
152f0 70 42 74 29 7b 0a 20 20 69 66 28 20 70 42 74 2d  pBt){.  if( pBt-
15300 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20  >pTmpSpace ){.  
15310 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65    pBt->pTmpSpace
15320 20 2d 3d 20 34 3b 0a 20 20 20 20 73 71 6c 69 74   -= 4;.    sqlit
15330 65 33 50 61 67 65 46 72 65 65 28 70 42 74 2d 3e  e3PageFree(pBt->
15340 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20  pTmpSpace);.    
15350 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  pBt->pTmpSpace =
15360 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
15370 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64   Close an open d
15380 61 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61  atabase and inva
15390 6c 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f  lidate all curso
153a0 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
153b0 65 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72  e3BtreeClose(Btr
153c0 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
153d0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
153e0 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  ;.  BtCursor *pC
153f0 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20  ur;..  /* Close 
15400 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
15410 65 64 20 76 69 61 20 74 68 69 73 20 68 61 6e 64  ed via this hand
15420 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  le.  */.  assert
15430 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
15440 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
15450 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
15460 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
15470 70 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72  pCur = pBt->pCur
15480 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43  sor;.  while( pC
15490 75 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73  ur ){.    BtCurs
154a0 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b  or *pTmp = pCur;
154b0 0a 20 20 20 20 70 43 75 72 20 3d 20 70 43 75 72  .    pCur = pCur
154c0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28  ->pNext;.    if(
154d0 20 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70   pTmp->pBtree==p
154e0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
154f0 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  3BtreeCloseCurso
15500 72 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20  r(pTmp);.    }. 
15510 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63   }..  /* Rollbac
15520 6b 20 61 6e 79 20 61 63 74 69 76 65 20 74 72 61  k any active tra
15530 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65  nsaction and fre
15540 65 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72  e the handle str
15550 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65  ucture..  ** The
15560 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
15570 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20  BtreeRollback() 
15580 64 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d  drops any table-
15590 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20  locks held by.  
155a0 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a  ** this handle..
155b0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74    */.  sqlite3Bt
155c0 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 53  reeRollback(p, S
155d0 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20  QLITE_OK, 0);.  
155e0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
155f0 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  e(p);..  /* If t
15600 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f  here are still o
15610 74 68 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67  ther outstanding
15620 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
15630 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a  he shared-btree.
15640 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20    ** structure, 
15650 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20  return now. The 
15660 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69  remainder of thi
15670 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61  s procedure clea
15680 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20  ns .  ** up the 
15690 73 68 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20  shared-btree..  
156a0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
156b0 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26  wantToLock==0 &&
156c0 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b   p->locked==0 );
156d0 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61  .  if( !p->shara
156e0 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f  ble || removeFro
156f0 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74  mSharingList(pBt
15700 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  ) ){.    /* The 
15710 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  pBt is no longer
15720 20 6f 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20   on the sharing 
15730 6c 69 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20  list, so we can 
15740 61 63 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74  access.    ** it
15750 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
15760 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65  to hold the mute
15770 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  x..    **.    **
15780 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64   Clean out and d
15790 65 6c 65 74 65 20 74 68 65 20 42 74 53 68 61 72  elete the BtShar
157a0 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a  ed object..    *
157b0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  /.    assert( !p
157c0 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20  Bt->pCursor );. 
157d0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43     sqlite3PagerC
157e0 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72  lose(pBt->pPager
157f0 2c 20 70 2d 3e 64 62 29 3b 0a 20 20 20 20 69 66  , p->db);.    if
15800 28 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65  ( pBt->xFreeSche
15810 6d 61 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65  ma && pBt->pSche
15820 6d 61 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  ma ){.      pBt-
15830 3e 78 46 72 65 65 53 63 68 65 6d 61 28 70 42 74  >xFreeSchema(pBt
15840 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
15850 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
15860 72 65 65 28 30 2c 20 70 42 74 2d 3e 70 53 63 68  ree(0, pBt->pSch
15870 65 6d 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65  ema);.    freeTe
15880 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
15890 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
158a0 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  Bt);.  }..#ifnde
158b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
158c0 41 52 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73  ARED_CACHE.  ass
158d0 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f  ert( p->wantToLo
158e0 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ck==0 );.  asser
158f0 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20  t( p->locked==0 
15900 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65  );.  if( p->pPre
15910 76 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e  v ) p->pPrev->pN
15920 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
15930 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
15940 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
15950 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e   = p->pPrev;.#en
15960 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66  dif..  sqlite3_f
15970 72 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ree(p);.  return
15980 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
15990 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
159a0 22 73 6f 66 74 22 20 6c 69 6d 69 74 20 6f 6e 20  "soft" limit on 
159b0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
159c0 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65  ges in the cache
159d0 2e 0a 2a 2a 20 55 6e 75 73 65 64 20 61 6e 64 20  ..** Unused and 
159e0 75 6e 6d 6f 64 69 66 69 65 64 20 70 61 67 65 73  unmodified pages
159f0 20 77 69 6c 6c 20 62 65 20 72 65 63 79 63 6c 65   will be recycle
15a00 64 20 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  d when the numbe
15a10 72 20 6f 66 0a 2a 2a 20 70 61 67 65 73 20 69 6e  r of.** pages in
15a20 20 74 68 65 20 63 61 63 68 65 20 65 78 63 65 65   the cache excee
15a30 64 73 20 74 68 69 73 20 73 6f 66 74 20 6c 69 6d  ds this soft lim
15a40 69 74 2e 20 20 42 75 74 20 74 68 65 20 73 69 7a  it.  But the siz
15a50 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 63 68  e of the.** cach
15a60 65 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20  e is allowed to 
15a70 67 72 6f 77 20 6c 61 72 67 65 72 20 74 68 61 6e  grow larger than
15a80 20 74 68 69 73 20 6c 69 6d 69 74 20 69 66 20 69   this limit if i
15a90 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 64 69  t contains.** di
15aa0 72 74 79 20 70 61 67 65 73 20 6f 72 20 70 61 67  rty pages or pag
15ab0 65 73 20 73 74 69 6c 6c 20 69 6e 20 61 63 74 69  es still in acti
15ac0 76 65 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  ve use..*/.int s
15ad0 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 61  qlite3BtreeSetCa
15ae0 63 68 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  cheSize(Btree *p
15af0 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
15b00 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
15b10 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
15b20 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
15b30 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
15b40 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
15b50 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
15b60 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
15b70 43 61 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70  Cachesize(pBt->p
15b80 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a  Pager, mxPage);.
15b90 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
15ba0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
15bb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
15bc0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
15bd0 22 73 70 69 6c 6c 22 20 6c 69 6d 69 74 20 6f 6e  "spill" limit on
15be0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
15bf0 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68  ages in the cach
15c00 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d  e..** If the num
15c10 62 65 72 20 6f 66 20 70 61 67 65 73 20 65 78 63  ber of pages exc
15c20 65 65 64 73 20 74 68 69 73 20 6c 69 6d 69 74 20  eeds this limit 
15c30 64 75 72 69 6e 67 20 61 20 77 72 69 74 65 20 74  during a write t
15c40 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 74  ransaction,.** t
15c50 68 65 20 70 61 67 65 72 20 6d 69 67 68 74 20 61  he pager might a
15c60 74 74 65 6d 70 74 20 74 6f 20 22 73 70 69 6c 6c  ttempt to "spill
15c70 22 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 6a  " pages to the j
15c80 6f 75 72 6e 61 6c 20 65 61 72 6c 79 20 69 6e 0a  ournal early in.
15c90 2a 2a 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65  ** order to free
15ca0 20 75 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a   up memory..**.*
15cb0 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
15cc0 72 6e 65 64 20 69 73 20 74 68 65 20 63 75 72 72  rned is the curr
15cd0 65 6e 74 20 73 70 69 6c 6c 20 73 69 7a 65 2e 20  ent spill size. 
15ce0 20 49 66 20 7a 65 72 6f 20 69 73 20 70 61 73 73   If zero is pass
15cf0 65 64 0a 2a 2a 20 61 73 20 61 6e 20 61 72 67 75  ed.** as an argu
15d00 6d 65 6e 74 2c 20 6e 6f 20 63 68 61 6e 67 65 73  ment, no changes
15d10 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65   are made to the
15d20 20 73 70 69 6c 6c 20 73 69 7a 65 20 73 65 74 74   spill size sett
15d30 69 6e 67 2c 20 73 6f 0a 2a 2a 20 75 73 69 6e 67  ing, so.** using
15d40 20 6d 78 50 61 67 65 20 6f 66 20 30 20 69 73 20   mxPage of 0 is 
15d50 61 20 77 61 79 20 74 6f 20 71 75 65 72 79 20 74  a way to query t
15d60 68 65 20 63 75 72 72 65 6e 74 20 73 70 69 6c 6c  he current spill
15d70 20 73 69 7a 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   size..*/.int sq
15d80 6c 69 74 65 33 42 74 72 65 65 53 65 74 53 70 69  lite3BtreeSetSpi
15d90 6c 6c 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c  llSize(Btree *p,
15da0 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
15db0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
15dc0 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 65  p->pBt;.  int re
15dd0 73 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  s;.  assert( sql
15de0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
15df0 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
15e00 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
15e10 6e 74 65 72 28 70 29 3b 0a 20 20 72 65 73 20 3d  nter(p);.  res =
15e20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
15e30 53 70 69 6c 6c 73 69 7a 65 28 70 42 74 2d 3e 70  Spillsize(pBt->p
15e40 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a  Pager, mxPage);.
15e50 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
15e60 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
15e70 20 72 65 73 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c   res;.}..#if SQL
15e80 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
15e90 45 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  E>0./*.** Change
15ea0 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68   the limit on th
15eb0 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20  e amount of the 
15ec0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 68  database file th
15ed0 61 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6d 65 6d  at may be.** mem
15ee0 6f 72 79 20 6d 61 70 70 65 64 2e 0a 2a 2f 0a 69  ory mapped..*/.i
15ef0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
15f00 65 74 4d 6d 61 70 4c 69 6d 69 74 28 42 74 72 65  etMmapLimit(Btre
15f10 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e  e *p, sqlite3_in
15f20 74 36 34 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 42  t64 szMmap){.  B
15f30 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
15f40 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
15f50 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
15f60 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
15f70 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
15f80 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73  reeEnter(p);.  s
15f90 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d  qlite3PagerSetMm
15fa0 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50 61  apLimit(pBt->pPa
15fb0 67 65 72 2c 20 73 7a 4d 6d 61 70 29 3b 0a 20 20  ger, szMmap);.  
15fc0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
15fd0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
15fe0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
15ff0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58  if /* SQLITE_MAX
16000 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a  _MMAP_SIZE>0 */.
16010 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
16020 65 20 77 61 79 20 64 61 74 61 20 69 73 20 73 79  e way data is sy
16030 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 69 6e 20  nced to disk in 
16040 6f 72 64 65 72 20 74 6f 20 69 6e 63 72 65 61 73  order to increas
16050 65 20 6f 72 20 64 65 63 72 65 61 73 65 0a 2a 2a  e or decrease.**
16060 20 68 6f 77 20 77 65 6c 6c 20 74 68 65 20 64 61   how well the da
16070 74 61 62 61 73 65 20 72 65 73 69 73 74 73 20 64  tabase resists d
16080 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20  amage due to OS 
16090 63 72 61 73 68 65 73 20 61 6e 64 20 70 6f 77 65  crashes and powe
160a0 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20 20  r.** failures.  
160b0 4c 65 76 65 6c 20 31 20 69 73 20 74 68 65 20 73  Level 1 is the s
160c0 61 6d 65 20 61 73 20 61 73 79 6e 63 68 72 6f 6e  ame as asynchron
160d0 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73 28 29 20  ous (no syncs() 
160e0 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65  occur and.** the
160f0 72 65 20 69 73 20 61 20 68 69 67 68 20 70 72 6f  re is a high pro
16100 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61  bability of dama
16110 67 65 29 20 20 4c 65 76 65 6c 20 32 20 69 73 20  ge)  Level 2 is 
16120 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20 54 68  the default.  Th
16130 65 72 65 0a 2a 2a 20 69 73 20 61 20 76 65 72 79  ere.** is a very
16140 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72   low but non-zer
16150 6f 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  o probability of
16160 20 64 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20   damage.  Level 
16170 33 20 72 65 64 75 63 65 73 20 74 68 65 0a 2a 2a  3 reduces the.**
16180 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
16190 64 61 6d 61 67 65 20 74 6f 20 6e 65 61 72 20 7a  damage to near z
161a0 65 72 6f 20 62 75 74 20 77 69 74 68 20 61 20 77  ero but with a w
161b0 72 69 74 65 20 70 65 72 66 6f 72 6d 61 6e 63 65  rite performance
161c0 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23   reduction..*/.#
161d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
161e0 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
161f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
16200 65 53 65 74 50 61 67 65 72 46 6c 61 67 73 28 0a  eSetPagerFlags(.
16210 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
16220 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
16230 62 74 72 65 65 20 74 6f 20 73 65 74 20 74 68 65  btree to set the
16240 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 6f 6e   safety level on
16250 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 70   */.  unsigned p
16260 67 46 6c 61 67 73 20 20 20 20 20 20 20 2f 2a 20  gFlags       /* 
16270 56 61 72 69 6f 75 73 20 50 41 47 45 52 5f 2a 20  Various PAGER_* 
16280 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 42 74  flags */.){.  Bt
16290 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
162a0 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
162b0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
162c0 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
162d0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
162e0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71  eeEnter(p);.  sq
162f0 6c 69 74 65 33 50 61 67 65 72 53 65 74 46 6c 61  lite3PagerSetFla
16300 67 73 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  gs(pBt->pPager, 
16310 70 67 46 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69  pgFlags);.  sqli
16320 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
16330 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
16340 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
16350 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
16360 20 64 65 66 61 75 6c 74 20 70 61 67 65 73 20 73   default pages s
16370 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62  ize and the numb
16380 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62  er of reserved b
16390 79 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a  ytes per page..*
163a0 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 70 61 67  * Or, if the pag
163b0 65 20 73 69 7a 65 20 68 61 73 20 61 6c 72 65 61  e size has alrea
163c0 64 79 20 62 65 65 6e 20 66 69 78 65 64 2c 20 72  dy been fixed, r
163d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
163e0 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75  DONLY .** withou
163f0 74 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 74 68  t changing anyth
16400 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ing..**.** The p
16410 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65  age size must be
16420 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65   a power of 2 be
16430 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35  tween 512 and 65
16440 35 33 36 2e 20 20 49 66 20 74 68 65 20 70 61 67  536.  If the pag
16450 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69  e.** size suppli
16460 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74  ed does not meet
16470 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74   this constraint
16480 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 73   then the page s
16490 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68  ize is not.** ch
164a0 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67  anged..**.** Pag
164b0 65 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73  e sizes are cons
164c0 74 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20  trained to be a 
164d0 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20  power of two so 
164e0 74 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a  that the region.
164f0 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ** of the databa
16500 73 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72  se file used for
16510 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e   locking (beginn
16520 69 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42  ing at PENDING_B
16530 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73  YTE,.** the firs
16540 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20  t byte past the 
16550 31 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78  1GB boundary, 0x
16560 34 30 30 30 30 30 30 30 29 20 6e 65 65 64 73 20  40000000) needs 
16570 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74  to occur.** at t
16580 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
16590 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  a page..**.** If
165a0 20 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65   parameter nRese
165b0 72 76 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e  rve is less than
165c0 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
165d0 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76  number of reserv
165e0 65 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20  ed.** bytes per 
165f0 70 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63  page is left unc
16600 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  hanged..**.** If
16610 20 74 68 65 20 69 46 69 78 21 3d 30 20 74 68 65   the iFix!=0 the
16620 6e 20 74 68 65 20 42 54 53 5f 50 41 47 45 53 49  n the BTS_PAGESI
16630 5a 45 5f 46 49 58 45 44 20 66 6c 61 67 20 69 73  ZE_FIXED flag is
16640 20 73 65 74 20 73 6f 20 74 68 61 74 20 74 68 65   set so that the
16650 20 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e   page size.** an
16660 64 20 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64  d autovacuum mod
16670 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20  e can no longer 
16680 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69  be changed..*/.i
16690 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
166a0 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65  etPageSize(Btree
166b0 20 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a   *p, int pageSiz
166c0 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 2c  e, int nReserve,
166d0 20 69 6e 74 20 69 46 69 78 29 7b 0a 20 20 69 6e   int iFix){.  in
166e0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
166f0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
16700 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
16710 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d  sert( nReserve>=
16720 2d 31 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d  -1 && nReserve<=
16730 32 35 35 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  255 );.  sqlite3
16740 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23  BtreeEnter(p);.#
16750 69 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  if SQLITE_HAS_CO
16760 44 45 43 0a 20 20 69 66 28 20 6e 52 65 73 65 72  DEC.  if( nReser
16770 76 65 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52  ve>pBt->optimalR
16780 65 73 65 72 76 65 20 29 20 70 42 74 2d 3e 6f 70  eserve ) pBt->op
16790 74 69 6d 61 6c 52 65 73 65 72 76 65 20 3d 20 28  timalReserve = (
167a0 75 38 29 6e 52 65 73 65 72 76 65 3b 0a 23 65 6e  u8)nReserve;.#en
167b0 64 69 66 0a 20 20 69 66 28 20 70 42 74 2d 3e 62  dif.  if( pBt->b
167c0 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41  tsFlags & BTS_PA
167d0 47 45 53 49 5a 45 5f 46 49 58 45 44 20 29 7b 0a  GESIZE_FIXED ){.
167e0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
167f0 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65  Leave(p);.    re
16800 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
16810 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ONLY;.  }.  if( 
16820 6e 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20 20  nReserve<0 ){.  
16830 20 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42 74    nReserve = pBt
16840 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74  ->pageSize - pBt
16850 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
16860 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73  }.  assert( nRes
16870 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65  erve>=0 && nRese
16880 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66  rve<=255 );.  if
16890 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ( pageSize>=512 
168a0 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c  && pageSize<=SQL
168b0 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
168c0 45 20 26 26 0a 20 20 20 20 20 20 20 20 28 28 70  E &&.        ((p
168d0 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53  ageSize-1)&pageS
168e0 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61  ize)==0 ){.    a
168f0 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65  ssert( (pageSize
16900 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20   & 7)==0 );.    
16910 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43  assert( !pBt->pC
16920 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42 74  ursor );.    pBt
16930 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75 33  ->pageSize = (u3
16940 32 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  2)pageSize;.    
16950 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42  freeTempSpace(pB
16960 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  t);.  }.  rc = s
16970 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
16980 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
16990 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
169a0 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20  ze, nReserve);. 
169b0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
169c0 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
169d0 20 2d 20 28 75 31 36 29 6e 52 65 73 65 72 76 65   - (u16)nReserve
169e0 3b 0a 20 20 69 66 28 20 69 46 69 78 20 29 20 70  ;.  if( iFix ) p
169f0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
16a00 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
16a10 45 44 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ED;.  sqlite3Btr
16a20 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
16a30 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
16a40 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72  * Return the cur
16a50 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 70  rently defined p
16a60 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20  age size.*/.int 
16a70 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
16a80 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  ageSize(Btree *p
16a90 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70  ){.  return p->p
16aa0 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a  Bt->pageSize;.}.
16ab0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
16ac0 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20  tion is similar 
16ad0 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  to sqlite3BtreeG
16ae0 65 74 52 65 73 65 72 76 65 28 29 2c 20 65 78 63  etReserve(), exc
16af0 65 70 74 20 74 68 61 74 20 69 74 0a 2a 2a 20 6d  ept that it.** m
16b00 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ay only be calle
16b10 64 20 69 66 20 69 74 20 69 73 20 67 75 61 72 61  d if it is guara
16b20 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20 62  nteed that the b
16b30 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73 20 61  -tree mutex is a
16b40 6c 72 65 61 64 79 0a 2a 2a 20 68 65 6c 64 2e 0a  lready.** held..
16b50 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 75 73  **.** This is us
16b60 65 66 75 6c 20 69 6e 20 6f 6e 65 20 73 70 65 63  eful in one spec
16b70 69 61 6c 20 63 61 73 65 20 69 6e 20 74 68 65 20  ial case in the 
16b80 62 61 63 6b 75 70 20 41 50 49 20 63 6f 64 65 20  backup API code 
16b90 77 68 65 72 65 20 69 74 20 69 73 0a 2a 2a 20 6b  where it is.** k
16ba0 6e 6f 77 6e 20 74 68 61 74 20 74 68 65 20 73 68  nown that the sh
16bb0 61 72 65 64 20 62 2d 74 72 65 65 20 6d 75 74 65  ared b-tree mute
16bc0 78 20 69 73 20 68 65 6c 64 2c 20 62 75 74 20 74  x is held, but t
16bd0 68 65 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20  he mutex on the 
16be0 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e  .** database han
16bf0 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70  dle that owns *p
16c00 20 69 73 20 6e 6f 74 2e 20 49 6e 20 74 68 69 73   is not. In this
16c10 20 63 61 73 65 20 69 66 20 73 71 6c 69 74 65 33   case if sqlite3
16c20 42 74 72 65 65 45 6e 74 65 72 28 29 0a 2a 2a 20  BtreeEnter().** 
16c30 77 65 72 65 20 74 6f 20 62 65 20 63 61 6c 6c 65  were to be calle
16c40 64 2c 20 69 74 20 6d 69 67 68 74 20 63 6f 6c 6c  d, it might coll
16c50 69 64 65 20 77 69 74 68 20 73 6f 6d 65 20 6f 74  ide with some ot
16c60 68 65 72 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e  her operation on
16c70 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
16c80 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e   handle that own
16c90 73 20 2a 70 2c 20 63 61 75 73 69 6e 67 20 75 6e  s *p, causing un
16ca0 64 65 66 69 6e 65 64 20 62 65 68 61 76 69 6f 72  defined behavior
16cb0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16cc0 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65 4e  BtreeGetReserveN
16cd0 6f 4d 75 74 65 78 28 42 74 72 65 65 20 2a 70 29  oMutex(Btree *p)
16ce0 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 61 73 73  {.  int n;.  ass
16cf0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
16d00 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e  ex_held(p->pBt->
16d10 6d 75 74 65 78 29 20 29 3b 0a 20 20 6e 20 3d 20  mutex) );.  n = 
16d20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  p->pBt->pageSize
16d30 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c   - p->pBt->usabl
16d40 65 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20  eSize;.  return 
16d50 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  n;.}../*.** Retu
16d60 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
16d70 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
16d80 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  at the end of ev
16d90 65 72 79 20 70 61 67 65 20 74 68 61 74 0a 2a 2a  ery page that.**
16da0 20 61 72 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79   are intentually
16db0 20 6c 65 66 74 20 75 6e 75 73 65 64 2e 20 20 54   left unused.  T
16dc0 68 69 73 20 69 73 20 74 68 65 20 22 72 65 73 65  his is the "rese
16dd0 72 76 65 64 22 20 73 70 61 63 65 20 74 68 61 74  rved" space that
16de0 20 69 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73   is.** sometimes
16df0 20 75 73 65 64 20 62 79 20 65 78 74 65 6e 73 69   used by extensi
16e00 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  ons..**.** If SQ
16e10 4c 49 54 45 5f 48 41 53 5f 4d 55 54 45 58 20 69  LITE_HAS_MUTEX i
16e20 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20 74  s defined then t
16e30 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e  he number return
16e40 65 64 20 69 73 20 74 68 65 0a 2a 2a 20 67 72 65  ed is the.** gre
16e50 61 74 65 72 20 6f 66 20 74 68 65 20 63 75 72 72  ater of the curr
16e60 65 6e 74 20 72 65 73 65 72 76 65 64 20 73 70 61  ent reserved spa
16e70 63 65 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d  ce and the maxim
16e80 75 6d 20 72 65 71 75 65 73 74 65 64 0a 2a 2a 20  um requested.** 
16e90 72 65 73 65 72 76 65 20 73 70 61 63 65 2e 0a 2a  reserve space..*
16ea0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
16eb0 65 65 47 65 74 4f 70 74 69 6d 61 6c 52 65 73 65  eeGetOptimalRese
16ec0 72 76 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  rve(Btree *p){. 
16ed0 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65   int n;.  sqlite
16ee0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
16ef0 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 42 74 72    n = sqlite3Btr
16f00 65 65 47 65 74 52 65 73 65 72 76 65 4e 6f 4d 75  eeGetReserveNoMu
16f10 74 65 78 28 70 29 3b 0a 23 69 66 64 65 66 20 53  tex(p);.#ifdef S
16f20 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
16f30 20 20 69 66 28 20 6e 3c 70 2d 3e 70 42 74 2d 3e    if( n<p->pBt->
16f40 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20 29  optimalReserve )
16f50 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 6f 70 74   n = p->pBt->opt
16f60 69 6d 61 6c 52 65 73 65 72 76 65 3b 0a 23 65 6e  imalReserve;.#en
16f70 64 69 66 0a 20 20 73 71 6c 69 74 65 33 42 74 72  dif.  sqlite3Btr
16f80 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
16f90 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn n;.}.../*.*
16fa0 2a 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75  * Set the maximu
16fb0 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72  m page count for
16fc0 20 61 20 64 61 74 61 62 61 73 65 20 69 66 20 6d   a database if m
16fd0 78 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76  xPage is positiv
16fe0 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73  e..** No changes
16ff0 20 61 72 65 20 6d 61 64 65 20 69 66 20 6d 78 50   are made if mxP
17000 61 67 65 20 69 73 20 30 20 6f 72 20 6e 65 67 61  age is 0 or nega
17010 74 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c  tive..** Regardl
17020 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65  ess of the value
17030 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75   of mxPage, retu
17040 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70  rn the maximum p
17050 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e  age count..*/.in
17060 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61  t sqlite3BtreeMa
17070 78 50 61 67 65 43 6f 75 6e 74 28 42 74 72 65 65  xPageCount(Btree
17080 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29   *p, int mxPage)
17090 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c  {.  int n;.  sql
170a0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
170b0 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  );.  n = sqlite3
170c0 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e  PagerMaxPageCoun
170d0 74 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  t(p->pBt->pPager
170e0 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c  , mxPage);.  sql
170f0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
17100 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d  );.  return n;.}
17110 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
17120 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
17130 45 20 66 6c 61 67 20 69 66 20 6e 65 77 46 6c 61  E flag if newFla
17140 67 20 69 73 20 30 20 6f 72 20 31 2e 20 20 49 66  g is 0 or 1.  If
17150 20 6e 65 77 46 6c 61 67 20 69 73 20 2d 31 2c 0a   newFlag is -1,.
17160 2a 2a 20 74 68 65 6e 20 6d 61 6b 65 20 6e 6f 20  ** then make no 
17170 63 68 61 6e 67 65 73 2e 20 20 41 6c 77 61 79 73  changes.  Always
17180 20 72 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   return the valu
17190 65 20 6f 66 20 74 68 65 20 42 54 53 5f 53 45 43  e of the BTS_SEC
171a0 55 52 45 5f 44 45 4c 45 54 45 0a 2a 2a 20 73 65  URE_DELETE.** se
171b0 74 74 69 6e 67 20 61 66 74 65 72 20 74 68 65 20  tting after the 
171c0 63 68 61 6e 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73  change..*/.int s
171d0 71 6c 69 74 65 33 42 74 72 65 65 53 65 63 75 72  qlite3BtreeSecur
171e0 65 44 65 6c 65 74 65 28 42 74 72 65 65 20 2a 70  eDelete(Btree *p
171f0 2c 20 69 6e 74 20 6e 65 77 46 6c 61 67 29 7b 0a  , int newFlag){.
17200 20 20 69 6e 74 20 62 3b 0a 20 20 69 66 28 20 70    int b;.  if( p
17210 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
17220 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
17230 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 6e 65  ter(p);.  if( ne
17240 77 46 6c 61 67 3e 3d 30 20 29 7b 0a 20 20 20 20  wFlag>=0 ){.    
17250 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  p->pBt->btsFlags
17260 20 26 3d 20 7e 42 54 53 5f 53 45 43 55 52 45 5f   &= ~BTS_SECURE_
17270 44 45 4c 45 54 45 3b 0a 20 20 20 20 69 66 28 20  DELETE;.    if( 
17280 6e 65 77 46 6c 61 67 20 29 20 70 2d 3e 70 42 74  newFlag ) p->pBt
17290 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
172a0 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b  S_SECURE_DELETE;
172b0 0a 20 20 7d 20 0a 20 20 62 20 3d 20 28 70 2d 3e  .  } .  b = (p->
172c0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
172d0 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
172e0 45 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33  E)!=0;.  sqlite3
172f0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
17300 20 72 65 74 75 72 6e 20 62 3b 0a 7d 0a 0a 2f 2a   return b;.}../*
17310 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 27  .** Change the '
17320 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f  auto-vacuum' pro
17330 70 65 72 74 79 20 6f 66 20 74 68 65 20 64 61 74  perty of the dat
17340 61 62 61 73 65 2e 20 49 66 20 74 68 65 20 27 61  abase. If the 'a
17350 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61  utoVacuum'.** pa
17360 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a  rameter is non-z
17370 65 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76  ero, then auto-v
17380 61 63 75 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e  acuum mode is en
17390 61 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20  abled. If zero, 
173a0 69 74 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c 65  it.** is disable
173b0 64 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 76  d. The default v
173c0 61 6c 75 65 20 66 6f 72 20 74 68 65 20 61 75 74  alue for the aut
173d0 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70 65 72 74  o-vacuum propert
173e0 79 20 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69  y is .** determi
173f0 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 49 54  ned by the SQLIT
17400 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
17410 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69  CUUM macro..*/.i
17420 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
17430 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72  etAutoVacuum(Btr
17440 65 65 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56  ee *p, int autoV
17450 61 63 75 75 6d 29 7b 0a 23 69 66 64 65 66 20 53  acuum){.#ifdef S
17460 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
17470 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 53  ACUUM.  return S
17480 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
17490 23 65 6c 73 65 0a 20 20 42 74 53 68 61 72 65 64  #else.  BtShared
174a0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
174b0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
174c0 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20  E_OK;.  u8 av = 
174d0 28 75 38 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a  (u8)autoVacuum;.
174e0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
174f0 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 28  nter(p);.  if( (
17500 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
17510 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
17520 45 44 29 21 3d 30 20 26 26 20 28 61 76 20 3f 31  ED)!=0 && (av ?1
17530 3a 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61  :0)!=pBt->autoVa
17540 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d  cuum ){.    rc =
17550 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
17560 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
17570 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
17580 20 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42   av ?1:0;.    pB
17590 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
175a0 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a  av==2 ?1:0;.  }.
175b0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
175c0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
175d0 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f   rc;.#endif.}../
175e0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
175f0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75  value of the 'au
17600 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65  to-vacuum' prope
17610 72 74 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63  rty. If auto-vac
17620 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c  uum is .** enabl
17630 65 64 20 31 20 69 73 20 72 65 74 75 72 6e 65 64  ed 1 is returned
17640 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a  . Otherwise 0..*
17650 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
17660 65 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28  eeGetAutoVacuum(
17670 42 74 72 65 65 20 2a 70 29 7b 0a 23 69 66 64 65  Btree *p){.#ifde
17680 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
17690 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72  TOVACUUM.  retur
176a0 6e 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  n BTREE_AUTOVACU
176b0 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20  UM_NONE;.#else. 
176c0 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
176d0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
176e0 0a 20 20 72 63 20 3d 20 28 0a 20 20 20 20 28 21  .  rc = (.    (!
176f0 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  p->pBt->autoVacu
17700 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41  um)?BTREE_AUTOVA
17710 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28  CUUM_NONE:.    (
17720 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63  !p->pBt->incrVac
17730 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56  uum)?BTREE_AUTOV
17740 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20  ACUUM_FULL:.    
17750 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
17760 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c  _INCR.  );.  sql
17770 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
17780 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
17790 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  #endif.}.../*.**
177a0 20 47 65 74 20 61 20 72 65 66 65 72 65 6e 63 65   Get a reference
177b0 20 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68   to pPage1 of th
177c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
177d0 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61    This will.** a
177e0 6c 73 6f 20 61 63 71 75 69 72 65 20 61 20 72 65  lso acquire a re
177f0 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66  adlock on that f
17800 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  ile..**.** SQLIT
17810 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
17820 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
17830 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74   the file is not
17840 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65   a.** well-forme
17850 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  d database file,
17860 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52   then SQLITE_COR
17870 52 55 50 54 20 69 73 20 72 65 74 75 72 6e 65 64  RUPT is returned
17880 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59  ..** SQLITE_BUSY
17890 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
178a0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
178b0 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f  locked.  SQLITE_
178c0 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75  NOMEM.** is retu
178d0 72 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f  rned if we run o
178e0 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a  ut of memory. .*
178f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63  /.static int loc
17900 6b 42 74 72 65 65 28 42 74 53 68 61 72 65 64 20  kBtree(BtShared 
17910 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b  *pBt){.  int rc;
17920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17930 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f   Result code fro
17940 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a  m subfunctions *
17950 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
17960 67 65 31 3b 20 20 20 20 20 2f 2a 20 50 61 67 65  ge1;     /* Page
17970 20 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61   1 of the databa
17980 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
17990 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
179a0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
179b0 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
179c0 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  base */.  int nP
179d0 61 67 65 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f  ageFile = 0;   /
179e0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
179f0 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
17a00 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
17a10 6e 50 61 67 65 48 65 61 64 65 72 3b 20 20 20 20  nPageHeader;    
17a20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
17a30 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
17a40 61 73 65 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ase according to
17a50 20 68 64 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72   hdr */..  asser
17a60 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
17a70 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
17a80 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
17a90 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b  Bt->pPage1==0 );
17aa0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
17ab0 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70  agerSharedLock(p
17ac0 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69  Bt->pPager);.  i
17ad0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17ae0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
17af0 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
17b00 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65  e(pBt, 1, &pPage
17b10 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  1, 0);.  if( rc!
17b20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
17b30 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f  urn rc;..  /* Do
17b40 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74   some checking t
17b50 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68  o help insure th
17b60 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64  e file we opened
17b70 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20   really is.  ** 
17b80 61 20 76 61 6c 69 64 20 64 61 74 61 62 61 73 65  a valid database
17b90 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e   file. .  */.  n
17ba0 50 61 67 65 20 3d 20 6e 50 61 67 65 48 65 61 64  Page = nPageHead
17bb0 65 72 20 3d 20 67 65 74 34 62 79 74 65 28 32 38  er = get4byte(28
17bc0 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44  +(u8*)pPage1->aD
17bd0 61 74 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  ata);.  sqlite3P
17be0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
17bf0 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67  t->pPager, &nPag
17c00 65 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 6e 50  eFile);.  if( nP
17c10 61 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70  age==0 || memcmp
17c20 28 32 34 2b 28 75 38 2a 29 70 50 61 67 65 31 2d  (24+(u8*)pPage1-
17c30 3e 61 44 61 74 61 2c 20 39 32 2b 28 75 38 2a 29  >aData, 92+(u8*)
17c40 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 34 29  pPage1->aData,4)
17c50 21 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61 67 65  !=0 ){.    nPage
17c60 20 3d 20 6e 50 61 67 65 46 69 6c 65 3b 0a 20 20   = nPageFile;.  
17c70 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20  }.  if( nPage>0 
17c80 29 7b 0a 20 20 20 20 75 33 32 20 70 61 67 65 53  ){.    u32 pageS
17c90 69 7a 65 3b 0a 20 20 20 20 75 33 32 20 75 73 61  ize;.    u32 usa
17ca0 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20  bleSize;.    u8 
17cb0 2a 70 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d  *page1 = pPage1-
17cc0 3e 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d  >aData;.    rc =
17cd0 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a   SQLITE_NOTADB;.
17ce0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
17cf0 4f 46 3a 20 52 2d 34 33 37 33 37 2d 33 39 39 39  OF: R-43737-3999
17d00 39 20 45 76 65 72 79 20 76 61 6c 69 64 20 53 51  9 Every valid SQ
17d10 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 66 69  Lite database fi
17d20 6c 65 20 62 65 67 69 6e 73 0a 20 20 20 20 2a 2a  le begins.    **
17d30 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77   with the follow
17d40 69 6e 67 20 31 36 20 62 79 74 65 73 20 28 69 6e  ing 16 bytes (in
17d50 20 68 65 78 29 3a 20 35 33 20 35 31 20 34 63 20   hex): 53 51 4c 
17d60 36 39 20 37 34 20 36 35 20 32 30 20 36 36 20 36  69 74 65 20 66 6
17d70 66 20 37 32 20 36 64 0a 20 20 20 20 2a 2a 20 36  f 72 6d.    ** 6
17d80 31 20 37 34 20 32 30 20 33 33 20 30 30 2e 20 2a  1 74 20 33 00. *
17d90 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70  /.    if( memcmp
17da0 28 70 61 67 65 31 2c 20 7a 4d 61 67 69 63 48 65  (page1, zMagicHe
17db0 61 64 65 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a  ader, 16)!=0 ){.
17dc0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
17dd0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
17de0 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
17df0 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20  TE_OMIT_WAL.    
17e00 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 31 20  if( page1[18]>1 
17e10 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74  ){.      pBt->bt
17e20 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45  sFlags |= BTS_RE
17e30 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20  AD_ONLY;.    }. 
17e40 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d     if( page1[19]
17e50 3e 31 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  >1 ){.      goto
17e60 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
17e70 65 64 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a  ed;.    }.#else.
17e80 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38      if( page1[18
17e90 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ]>2 ){.      pBt
17ea0 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
17eb0 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20  S_READ_ONLY;.   
17ec0 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31   }.    if( page1
17ed0 5b 31 39 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20  [19]>2 ){.      
17ee0 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
17ef0 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20  failed;.    }.. 
17f00 20 20 20 2f 2a 20 49 66 20 74 68 65 20 77 72 69     /* If the wri
17f10 74 65 20 76 65 72 73 69 6f 6e 20 69 73 20 73 65  te version is se
17f20 74 20 74 6f 20 32 2c 20 74 68 69 73 20 64 61 74  t to 2, this dat
17f30 61 62 61 73 65 20 73 68 6f 75 6c 64 20 62 65 20  abase should be 
17f40 61 63 63 65 73 73 65 64 0a 20 20 20 20 2a 2a 20  accessed.    ** 
17f50 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 49 66 20  in WAL mode. If 
17f60 74 68 65 20 6c 6f 67 20 69 73 20 6e 6f 74 20 61  the log is not a
17f70 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 6f 70 65  lready open, ope
17f80 6e 20 69 74 20 6e 6f 77 2e 20 54 68 65 6e 20 0a  n it now. Then .
17f90 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51      ** return SQ
17fa0 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 74 75  LITE_OK and retu
17fb0 72 6e 20 77 69 74 68 6f 75 74 20 70 6f 70 75 6c  rn without popul
17fc0 61 74 69 6e 67 20 42 74 53 68 61 72 65 64 2e 70  ating BtShared.p
17fd0 50 61 67 65 31 2e 0a 20 20 20 20 2a 2a 20 54 68  Page1..    ** Th
17fe0 65 20 63 61 6c 6c 65 72 20 64 65 74 65 63 74 73  e caller detects
17ff0 20 74 68 69 73 20 61 6e 64 20 63 61 6c 6c 73 20   this and calls 
18000 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67  this function ag
18010 61 69 6e 2e 20 54 68 69 73 20 69 73 0a 20 20 20  ain. This is.   
18020 20 2a 2a 20 72 65 71 75 69 72 65 64 20 61 73 20   ** required as 
18030 74 68 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 70  the version of p
18040 61 67 65 20 31 20 63 75 72 72 65 6e 74 6c 79 20  age 1 currently 
18050 69 6e 20 74 68 65 20 70 61 67 65 31 20 62 75 66  in the page1 buf
18060 66 65 72 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e  fer.    ** may n
18070 6f 74 20 62 65 20 74 68 65 20 6c 61 74 65 73 74  ot be the latest
18080 20 76 65 72 73 69 6f 6e 20 2d 20 74 68 65 72 65   version - there
18090 20 6d 61 79 20 62 65 20 61 20 6e 65 77 65 72 20   may be a newer 
180a0 6f 6e 65 20 69 6e 20 74 68 65 20 6c 6f 67 0a 20  one in the log. 
180b0 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20     ** file..    
180c0 2a 2f 0a 20 20 20 20 69 66 28 20 70 61 67 65 31  */.    if( page1
180d0 5b 31 39 5d 3d 3d 32 20 26 26 20 28 70 42 74 2d  [19]==2 && (pBt-
180e0 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
180f0 4e 4f 5f 57 41 4c 29 3d 3d 30 20 29 7b 0a 20 20  NO_WAL)==0 ){.  
18100 20 20 20 20 69 6e 74 20 69 73 4f 70 65 6e 20 3d      int isOpen =
18110 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   0;.      rc = s
18120 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 57  qlite3PagerOpenW
18130 61 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  al(pBt->pPager, 
18140 26 69 73 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20  &isOpen);.      
18150 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18160 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
18170 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
18180 6c 65 64 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  led;.      }else
18190 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46  {.#if SQLITE_DEF
181a0 41 55 4c 54 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  AULT_SYNCHRONOUS
181b0 21 3d 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  !=SQLITE_DEFAULT
181c0 5f 57 41 4c 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  _WAL_SYNCHRONOUS
181d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
181e0 20 2a 64 62 3b 0a 20 20 20 20 20 20 20 20 44 62   *db;.        Db
181f0 20 2a 70 44 62 3b 0a 20 20 20 20 20 20 20 20 69   *pDb;.        i
18200 66 28 20 28 64 62 3d 70 42 74 2d 3e 64 62 29 21  f( (db=pBt->db)!
18210 3d 30 20 26 26 20 28 70 44 62 3d 64 62 2d 3e 61  =0 && (pDb=db->a
18220 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  Db)!=0 ){.      
18230 20 20 20 20 77 68 69 6c 65 28 20 70 44 62 2d 3e      while( pDb->
18240 70 42 74 3d 3d 30 20 7c 7c 20 70 44 62 2d 3e 70  pBt==0 || pDb->p
18250 42 74 2d 3e 70 42 74 21 3d 70 42 74 20 29 7b 20  Bt->pBt!=pBt ){ 
18260 70 44 62 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20  pDb++; }.       
18270 20 20 20 69 66 28 20 70 44 62 2d 3e 62 53 79 6e     if( pDb->bSyn
18280 63 53 65 74 3d 3d 30 0a 20 20 20 20 20 20 20 20  cSet==0.        
18290 20 20 20 26 26 20 70 44 62 2d 3e 73 61 66 65 74     && pDb->safet
182a0 79 5f 6c 65 76 65 6c 3d 3d 53 51 4c 49 54 45 5f  y_level==SQLITE_
182b0 44 45 46 41 55 4c 54 5f 53 59 4e 43 48 52 4f 4e  DEFAULT_SYNCHRON
182c0 4f 55 53 2b 31 0a 20 20 20 20 20 20 20 20 20 20  OUS+1.          
182d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
182e0 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
182f0 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
18300 54 5f 57 41 4c 5f 53 59 4e 43 48 52 4f 4e 4f 55  T_WAL_SYNCHRONOU
18310 53 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  S+1;.           
18320 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
18330 46 6c 61 67 73 28 70 42 74 2d 3e 70 50 61 67 65  Flags(pBt->pPage
18340 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
18350 20 20 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65    pDb->safety_le
18360 76 65 6c 20 7c 20 28 64 62 2d 3e 66 6c 61 67 73  vel | (db->flags
18370 20 26 20 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d   & PAGER_FLAGS_M
18380 41 53 4b 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ASK));.         
18390 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e   }.        }.#en
183a0 64 69 66 0a 20 20 20 20 20 20 20 20 69 66 28 20  dif.        if( 
183b0 69 73 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20  isOpen==0 ){.   
183c0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
183d0 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20  ge(pPage1);.    
183e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
183f0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
18400 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
18410 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41  rc = SQLITE_NOTA
18420 44 42 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  DB;.    }.#endif
18430 0a 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ..    /* EVIDENC
18440 45 2d 4f 46 3a 20 52 2d 31 35 34 36 35 2d 32 30  E-OF: R-15465-20
18450 38 31 33 20 54 68 65 20 6d 61 78 69 6d 75 6d 20  813 The maximum 
18460 61 6e 64 20 6d 69 6e 69 6d 75 6d 20 65 6d 62 65  and minimum embe
18470 64 64 65 64 20 70 61 79 6c 6f 61 64 0a 20 20 20  dded payload.   
18480 20 2a 2a 20 66 72 61 63 74 69 6f 6e 73 20 61 6e   ** fractions an
18490 64 20 74 68 65 20 6c 65 61 66 20 70 61 79 6c 6f  d the leaf paylo
184a0 61 64 20 66 72 61 63 74 69 6f 6e 20 76 61 6c 75  ad fraction valu
184b0 65 73 20 6d 75 73 74 20 62 65 20 36 34 2c 20 33  es must be 64, 3
184c0 32 2c 20 61 6e 64 20 33 32 2e 0a 20 20 20 20 2a  2, and 32..    *
184d0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 72 69  *.    ** The ori
184e0 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c  ginal design all
184f0 6f 77 65 64 20 74 68 65 73 65 20 61 6d 6f 75 6e  owed these amoun
18500 74 73 20 74 6f 20 76 61 72 79 2c 20 62 75 74 20  ts to vary, but 
18510 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72  as of.    ** ver
18520 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72  sion 3.6.0, we r
18530 65 71 75 69 72 65 20 74 68 65 6d 20 74 6f 20 62  equire them to b
18540 65 20 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a  e fixed..    */.
18550 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 26      if( memcmp(&
18560 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30  page1[21], "\100
18570 5c 30 34 30 5c 30 34 30 22 2c 33 29 21 3d 30 20  \040\040",3)!=0 
18580 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
18590 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
185a0 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56  .    }.    /* EV
185b0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38  IDENCE-OF: R-518
185c0 37 33 2d 33 39 36 31 38 20 54 68 65 20 70 61 67  73-39618 The pag
185d0 65 20 73 69 7a 65 20 66 6f 72 20 61 20 64 61 74  e size for a dat
185e0 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 20 20  abase file is.  
185f0 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20    ** determined 
18600 62 79 20 74 68 65 20 32 2d 62 79 74 65 20 69 6e  by the 2-byte in
18610 74 65 67 65 72 20 6c 6f 63 61 74 65 64 20 61 74  teger located at
18620 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 31 36   an offset of 16
18630 20 62 79 74 65 73 20 66 72 6f 6d 0a 20 20 20 20   bytes from.    
18640 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  ** the beginning
18650 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
18660 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 61   file. */.    pa
18670 67 65 53 69 7a 65 20 3d 20 28 70 61 67 65 31 5b  geSize = (page1[
18680 31 36 5d 3c 3c 38 29 20 7c 20 28 70 61 67 65 31  16]<<8) | (page1
18690 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 2f  [17]<<16);.    /
186a0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
186b0 2d 32 35 30 30 38 2d 32 31 36 38 38 20 54 68 65  -25008-21688 The
186c0 20 73 69 7a 65 20 6f 66 20 61 20 70 61 67 65 20   size of a page 
186d0 69 73 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77  is a power of tw
186e0 6f 0a 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e  o.    ** between
186f0 20 35 31 32 20 61 6e 64 20 36 35 35 33 36 20 69   512 and 65536 i
18700 6e 63 6c 75 73 69 76 65 2e 20 2a 2f 0a 20 20 20  nclusive. */.   
18710 20 69 66 28 20 28 28 70 61 67 65 53 69 7a 65 2d   if( ((pageSize-
18720 31 29 26 70 61 67 65 53 69 7a 65 29 21 3d 30 0a  1)&pageSize)!=0.
18730 20 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65       || pageSize
18740 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  >SQLITE_MAX_PAGE
18750 5f 53 49 5a 45 20 0a 20 20 20 20 20 7c 7c 20 70  _SIZE .     || p
18760 61 67 65 53 69 7a 65 3c 3d 32 35 36 20 0a 20 20  ageSize<=256 .  
18770 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20    ){.      goto 
18780 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
18790 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  d;.    }.    ass
187a0 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26  ert( (pageSize &
187b0 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 2f 2a   7)==0 );.    /*
187c0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
187d0 35 39 33 31 30 2d 35 31 32 30 35 20 54 68 65 20  59310-51205 The 
187e0 22 72 65 73 65 72 76 65 64 20 73 70 61 63 65 22  "reserved space"
187f0 20 73 69 7a 65 20 69 6e 20 74 68 65 20 31 2d 62   size in the 1-b
18800 79 74 65 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67  yte.    ** integ
18810 65 72 20 61 74 20 6f 66 66 73 65 74 20 32 30 20  er at offset 20 
18820 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
18830 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
18840 61 74 20 74 68 65 20 65 6e 64 20 6f 66 0a 20 20  at the end of.  
18850 20 20 2a 2a 20 65 61 63 68 20 70 61 67 65 20 74    ** each page t
18860 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20 65 78  o reserve for ex
18870 74 65 6e 73 69 6f 6e 73 2e 20 0a 20 20 20 20 2a  tensions. .    *
18880 2a 0a 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43  *.    ** EVIDENC
18890 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34 32  E-OF: R-37497-42
188a0 34 31 32 20 54 68 65 20 73 69 7a 65 20 6f 66 20  412 The size of 
188b0 74 68 65 20 72 65 73 65 72 76 65 64 20 72 65 67  the reserved reg
188c0 69 6f 6e 20 69 73 0a 20 20 20 20 2a 2a 20 64 65  ion is.    ** de
188d0 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
188e0 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69 67 6e 65  one-byte unsigne
188f0 64 20 69 6e 74 65 67 65 72 20 66 6f 75 6e 64 20  d integer found 
18900 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20  at an offset of 
18910 32 30 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74  20.    ** into t
18920 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
18930 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20   header. */.    
18940 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61 67  usableSize = pag
18950 65 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32 30  eSize - page1[20
18960 5d 3b 0a 20 20 20 20 69 66 28 20 28 75 33 32 29  ];.    if( (u32)
18970 70 61 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70  pageSize!=pBt->p
18980 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ageSize ){.     
18990 20 2f 2a 20 41 66 74 65 72 20 72 65 61 64 69 6e   /* After readin
189a0 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  g the first page
189b0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
189c0 20 61 73 73 75 6d 69 6e 67 20 61 20 70 61 67 65   assuming a page
189d0 20 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f   size.      ** o
189e0 66 20 42 74 53 68 61 72 65 64 2e 70 61 67 65 53  f BtShared.pageS
189f0 69 7a 65 2c 20 77 65 20 68 61 76 65 20 64 69 73  ize, we have dis
18a00 63 6f 76 65 72 65 64 20 74 68 61 74 20 74 68 65  covered that the
18a10 20 70 61 67 65 2d 73 69 7a 65 20 69 73 0a 20 20   page-size is.  
18a20 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20      ** actually 
18a30 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b  pageSize. Unlock
18a40 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 6c   the database, l
18a50 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31  eave pBt->pPage1
18a60 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72   at.      ** zer
18a70 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  o and return SQL
18a80 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c  ITE_OK. The call
18a90 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69  er will call thi
18aa0 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20  s function.     
18ab0 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 20 74   ** again with t
18ac0 68 65 20 63 6f 72 72 65 63 74 20 70 61 67 65 2d  he correct page-
18ad0 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  size..      */. 
18ae0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
18af0 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20  (pPage1);.      
18b00 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
18b10 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  = usableSize;.  
18b20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
18b30 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  e = pageSize;.  
18b40 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63      freeTempSpac
18b50 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72 63  e(pBt);.      rc
18b60 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
18b70 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
18b80 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
18b90 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20  geSize,.        
18ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18bb0 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 53             pageS
18bc0 69 7a 65 2d 75 73 61 62 6c 65 53 69 7a 65 29 3b  ize-usableSize);
18bd0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
18be0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
18bf0 28 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  (pBt->db->flags 
18c00 26 20 53 51 4c 49 54 45 5f 52 65 63 6f 76 65 72  & SQLITE_Recover
18c10 79 4d 6f 64 65 29 3d 3d 30 20 26 26 20 6e 50 61  yMode)==0 && nPa
18c20 67 65 3e 6e 50 61 67 65 46 69 6c 65 20 29 7b 0a  ge>nPageFile ){.
18c30 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
18c40 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
18c50 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
18c60 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
18c70 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45    }.    /* EVIDE
18c80 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 33 31 32 2d  NCE-OF: R-28312-
18c90 36 34 37 30 34 20 48 6f 77 65 76 65 72 2c 20 74  64704 However, t
18ca0 68 65 20 75 73 61 62 6c 65 20 73 69 7a 65 20 69  he usable size i
18cb0 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f  s not allowed to
18cc0 0a 20 20 20 20 2a 2a 20 62 65 20 6c 65 73 73 20  .    ** be less 
18cd0 74 68 61 6e 20 34 38 30 2e 20 49 6e 20 6f 74 68  than 480. In oth
18ce0 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68 65  er words, if the
18cf0 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 35 31   page size is 51
18d00 32 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20  2, then the.    
18d10 2a 2a 20 72 65 73 65 72 76 65 64 20 73 70 61 63  ** reserved spac
18d20 65 20 73 69 7a 65 20 63 61 6e 6e 6f 74 20 65 78  e size cannot ex
18d30 63 65 65 64 20 33 32 2e 20 2a 2f 0a 20 20 20 20  ceed 32. */.    
18d40 69 66 28 20 75 73 61 62 6c 65 53 69 7a 65 3c 34  if( usableSize<4
18d50 38 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  80 ){.      goto
18d60 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
18d70 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  ed;.    }.    pB
18d80 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61  t->pageSize = pa
18d90 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d  geSize;.    pBt-
18da0 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73  >usableSize = us
18db0 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65  ableSize;.#ifnde
18dc0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
18dd0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74  TOVACUUM.    pBt
18de0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28  ->autoVacuum = (
18df0 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b  get4byte(&page1[
18e00 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 4*4])?1:0);
18e10 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61  .    pBt->incrVa
18e20 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
18e30 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37 2a 34  (&page1[36 + 7*4
18e40 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a  ])?1:0);.#endif.
18e50 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63    }..  /* maxLoc
18e60 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75  al is the maximu
18e70 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c  m amount of payl
18e80 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63  oad to store loc
18e90 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20  ally for.  ** a 
18ea0 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65  cell.  Make sure
18eb0 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f   it is small eno
18ec0 75 67 68 20 73 6f 20 74 68 61 74 20 61 74 20 6c  ugh so that at l
18ed0 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20  east minFanout. 
18ee0 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77 69   ** cells can wi
18ef0 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61  ll fit on one pa
18f00 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65 20 61  ge.  We assume a
18f10 20 31 30 2d 62 79 74 65 20 70 61 67 65 20 68 65   10-byte page he
18f20 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64  ader..  ** Besid
18f30 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c 20  es the payload, 
18f40 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73 74  the cell must st
18f50 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d  ore:.  **     2-
18f60 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20  byte pointer to 
18f70 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20  the cell.  **   
18f80 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70    4-byte child p
18f90 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20 20  ointer.  **     
18fa0 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 6c 75  9-byte nKey valu
18fb0 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74  e.  **     4-byt
18fc0 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a 20 20  e nData value.  
18fd0 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6f 76  **     4-byte ov
18fe0 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e  erflow page poin
18ff0 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65  ter.  ** So a ce
19000 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  ll consists of a
19010 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 2c   2-byte pointer,
19020 20 61 20 68 65 61 64 65 72 20 77 68 69 63 68 20   a header which 
19030 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20 20  is as much as.  
19040 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67  ** 17 bytes long
19050 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f  , 0 to N bytes o
19060 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61  f payload, and a
19070 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79 74  n optional 4 byt
19080 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20  e overflow.  ** 
19090 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20  page pointer..  
190a0 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63  */.  pBt->maxLoc
190b0 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d  al = (u16)((pBt-
190c0 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
190d0 36 34 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20  64/255 - 23);.  
190e0 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  pBt->minLocal = 
190f0 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62  (u16)((pBt->usab
19100 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35  leSize-12)*32/25
19110 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e  5 - 23);.  pBt->
19120 6d 61 78 4c 65 61 66 20 3d 20 28 75 31 36 29 28  maxLeaf = (u16)(
19130 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
19140 2d 20 33 35 29 3b 0a 20 20 70 42 74 2d 3e 6d 69  - 35);.  pBt->mi
19150 6e 4c 65 61 66 20 3d 20 28 75 31 36 29 28 28 70  nLeaf = (u16)((p
19160 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31  Bt->usableSize-1
19170 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b  2)*32/255 - 23);
19180 0a 20 20 69 66 28 20 70 42 74 2d 3e 6d 61 78 4c  .  if( pBt->maxL
19190 6f 63 61 6c 3e 31 32 37 20 29 7b 0a 20 20 20 20  ocal>127 ){.    
191a0 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79  pBt->max1bytePay
191b0 6c 6f 61 64 20 3d 20 31 32 37 3b 0a 20 20 7d 65  load = 127;.  }e
191c0 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61  lse{.    pBt->ma
191d0 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20  x1bytePayload = 
191e0 28 75 38 29 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  (u8)pBt->maxLoca
191f0 6c 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  l;.  }.  assert(
19200 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20   pBt->maxLeaf + 
19210 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49  23 <= MX_CELL_SI
19220 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 70 42 74  ZE(pBt) );.  pBt
19230 2d 3e 70 50 61 67 65 31 20 3d 20 70 50 61 67 65  ->pPage1 = pPage
19240 31 3b 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20  1;.  pBt->nPage 
19250 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72  = nPage;.  retur
19260 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61  n SQLITE_OK;..pa
19270 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a  ge1_init_failed:
19280 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
19290 50 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70  Page1);.  pBt->p
192a0 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65 74  Page1 = 0;.  ret
192b0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
192c0 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ef NDEBUG./*.** 
192d0 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
192e0 72 20 6f 66 20 63 75 72 73 6f 72 73 20 6f 70 65  r of cursors ope
192f0 6e 20 6f 6e 20 70 42 74 2e 20 54 68 69 73 20 69  n on pBt. This i
19300 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20  s for use.** in 
19310 61 73 73 65 72 74 28 29 20 65 78 70 72 65 73 73  assert() express
19320 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20 6f  ions, so it is o
19330 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66 20  nly compiled if 
19340 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a  NDEBUG is not.**
19350 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20   defined..**.** 
19360 4f 6e 6c 79 20 77 72 69 74 65 20 63 75 72 73 6f  Only write curso
19370 72 73 20 61 72 65 20 63 6f 75 6e 74 65 64 20 69  rs are counted i
19380 66 20 77 72 4f 6e 6c 79 20 69 73 20 74 72 75 65  f wrOnly is true
19390 2e 20 20 49 66 20 77 72 4f 6e 6c 79 20 69 73 0a  .  If wrOnly is.
193a0 2a 2a 20 66 61 6c 73 65 20 74 68 65 6e 20 61 6c  ** false then al
193b0 6c 20 63 75 72 73 6f 72 73 20 61 72 65 20 63 6f  l cursors are co
193c0 75 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  unted..**.** For
193d0 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66   the purposes of
193e0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61   this routine, a
193f0 20 63 75 72 73 6f 72 20 69 73 20 61 6e 79 20 63   cursor is any c
19400 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73  ursor that.** is
19410 20 63 61 70 61 62 6c 65 20 6f 66 20 72 65 61 64   capable of read
19420 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ing or writing t
19430 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
19440 20 43 75 72 73 6f 72 73 20 74 68 61 74 0a 2a 2a   Cursors that.**
19450 20 68 61 76 65 20 62 65 65 6e 20 74 72 69 70 70   have been tripp
19460 65 64 20 69 6e 74 6f 20 74 68 65 20 43 55 52 53  ed into the CURS
19470 4f 52 5f 46 41 55 4c 54 20 73 74 61 74 65 20 61  OR_FAULT state a
19480 72 65 20 6e 6f 74 20 63 6f 75 6e 74 65 64 2e 0a  re not counted..
19490 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
194a0 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28  untValidCursors(
194b0 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 69  BtShared *pBt, i
194c0 6e 74 20 77 72 4f 6e 6c 79 29 7b 0a 20 20 42 74  nt wrOnly){.  Bt
194d0 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20  Cursor *pCur;.  
194e0 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72  int r = 0;.  for
194f0 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73  (pCur=pBt->pCurs
19500 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70  or; pCur; pCur=p
19510 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Cur->pNext){.   
19520 20 69 66 28 20 28 77 72 4f 6e 6c 79 3d 3d 30 20   if( (wrOnly==0 
19530 7c 7c 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  || (pCur->curFla
19540 67 73 20 26 20 42 54 43 46 5f 57 72 69 74 65 46  gs & BTCF_WriteF
19550 6c 61 67 29 21 3d 30 29 0a 20 20 20 20 20 26 26  lag)!=0).     &&
19560 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
19570 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b  URSOR_FAULT ) r+
19580 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  +; .  }.  return
19590 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   r;.}.#endif../*
195a0 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
195b0 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
195c0 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20 61  cursors and we a
195d0 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69  re not in the mi
195e0 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61  ddle.** of a tra
195f0 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68 65  nsaction but the
19600 72 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f 63  re is a read loc
19610 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
19620 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20  e, then.** this 
19630 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20 74  routine unrefs t
19640 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
19650 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
19660 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73  le which .** has
19670 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 72   the effect of r
19680 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65 61  eleasing the rea
19690 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  d lock..**.** If
196a0 20 74 68 65 72 65 20 69 73 20 61 20 74 72 61 6e   there is a tran
196b0 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72  saction in progr
196c0 65 73 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ess, this routin
196d0 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
196e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c  .static void unl
196f0 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
19700 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
19710 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
19720 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
19730 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
19740 73 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c 69  ssert( countVali
19750 64 43 75 72 73 6f 72 73 28 70 42 74 2c 30 29 3d  dCursors(pBt,0)=
19760 3d 30 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61  =0 || pBt->inTra
19770 6e 73 61 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e  nsaction>TRANS_N
19780 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ONE );.  if( pBt
19790 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
197a0 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70  =TRANS_NONE && p
197b0 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 7b  Bt->pPage1!=0 ){
197c0 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
197d0 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
197e0 65 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e1;.    assert( 
197f0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b  pPage1->aData );
19800 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
19810 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
19820 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d  t(pBt->pPager)==
19830 31 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50  1 );.    pBt->pP
19840 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 72 65  age1 = 0;.    re
19850 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c  leasePageNotNull
19860 28 70 50 61 67 65 31 29 3b 0a 20 20 7d 0a 7d 0a  (pPage1);.  }.}.
19870 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42 74 20 70 6f  ./*.** If pBt po
19880 69 6e 74 73 20 74 6f 20 61 6e 20 65 6d 70 74 79  ints to an empty
19890 20 66 69 6c 65 20 74 68 65 6e 20 63 6f 6e 76 65   file then conve
198a0 72 74 20 74 68 61 74 20 65 6d 70 74 79 20 66 69  rt that empty fi
198b0 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77  le.** into a new
198c0 20 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 20   empty database 
198d0 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  by initializing 
198e0 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
198f0 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  f.** the databas
19900 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
19910 20 6e 65 77 44 61 74 61 62 61 73 65 28 42 74 53   newDatabase(BtS
19920 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d  hared *pBt){.  M
19930 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75  emPage *pP1;.  u
19940 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
19950 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ta;.  int rc;.. 
19960 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
19970 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
19980 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
19990 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b   pBt->nPage>0 ){
199a0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
199b0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 31  TE_OK;.  }.  pP1
199c0 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
199d0 20 20 61 73 73 65 72 74 28 20 70 50 31 21 3d 30    assert( pP1!=0
199e0 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 31   );.  data = pP1
199f0 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20  ->aData;.  rc = 
19a00 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
19a10 65 28 70 50 31 2d 3e 70 44 62 50 61 67 65 29 3b  e(pP1->pDbPage);
19a20 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
19a30 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28  rn rc;.  memcpy(
19a40 64 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61 64  data, zMagicHead
19a50 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69  er, sizeof(zMagi
19a60 63 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73 73  cHeader));.  ass
19a70 65 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67  ert( sizeof(zMag
19a80 69 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29 3b  icHeader)==16 );
19a90 0a 20 20 64 61 74 61 5b 31 36 5d 20 3d 20 28 75  .  data[16] = (u
19aa0 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  8)((pBt->pageSiz
19ab0 65 3e 3e 38 29 26 30 78 66 66 29 3b 0a 20 20 64  e>>8)&0xff);.  d
19ac0 61 74 61 5b 31 37 5d 20 3d 20 28 75 38 29 28 28  ata[17] = (u8)((
19ad0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 31  pBt->pageSize>>1
19ae0 36 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61  6)&0xff);.  data
19af0 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61  [18] = 1;.  data
19b00 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65  [19] = 1;.  asse
19b10 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  rt( pBt->usableS
19b20 69 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69  ize<=pBt->pageSi
19b30 7a 65 20 26 26 20 70 42 74 2d 3e 75 73 61 62 6c  ze && pBt->usabl
19b40 65 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e  eSize+255>=pBt->
19b50 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74  pageSize);.  dat
19b60 61 5b 32 30 5d 20 3d 20 28 75 38 29 28 70 42 74  a[20] = (u8)(pBt
19b70 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74  ->pageSize - pBt
19b80 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  ->usableSize);. 
19b90 20 64 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a   data[21] = 64;.
19ba0 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b    data[22] = 32;
19bb0 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 33 32  .  data[23] = 32
19bc0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
19bd0 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29  [24], 0, 100-24)
19be0 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50 31  ;.  zeroPage(pP1
19bf0 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46  , PTF_INTKEY|PTF
19c00 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44 41  _LEAF|PTF_LEAFDA
19c10 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 62 74 73  TA );.  pBt->bts
19c20 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47  Flags |= BTS_PAG
19c30 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66  ESIZE_FIXED;.#if
19c40 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
19c50 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73  _AUTOVACUUM.  as
19c60 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
19c70 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d  acuum==1 || pBt-
19c80 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29  >autoVacuum==0 )
19c90 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
19ca0 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c  >incrVacuum==1 |
19cb0 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  | pBt->incrVacuu
19cc0 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79  m==0 );.  put4by
19cd0 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a  te(&data[36 + 4*
19ce0 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  4], pBt->autoVac
19cf0 75 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65  uum);.  put4byte
19d00 28 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d  (&data[36 + 7*4]
19d10 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  , pBt->incrVacuu
19d20 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42 74  m);.#endif.  pBt
19d30 2d 3e 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 64  ->nPage = 1;.  d
19d40 61 74 61 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72  ata[31] = 1;.  r
19d50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
19d60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
19d70 6c 69 7a 65 20 74 68 65 20 66 69 72 73 74 20 70  lize the first p
19d80 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
19d90 61 73 65 20 66 69 6c 65 20 28 63 72 65 61 74 69  ase file (creati
19da0 6e 67 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a  ng a database.**
19db0 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61   consisting of a
19dc0 20 73 69 6e 67 6c 65 20 70 61 67 65 20 61 6e 64   single page and
19dd0 20 6e 6f 20 73 63 68 65 6d 61 20 6f 62 6a 65 63   no schema objec
19de0 74 73 29 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ts). Return SQLI
19df0 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75 63 63  TE_OK.** if succ
19e00 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51  essful, or an SQ
19e10 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
19e20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e  otherwise..*/.in
19e30 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  t sqlite3BtreeNe
19e40 77 44 62 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  wDb(Btree *p){. 
19e50 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
19e60 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
19e70 0a 20 20 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65  .  p->pBt->nPage
19e80 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6e 65 77   = 0;.  rc = new
19e90 44 61 74 61 62 61 73 65 28 70 2d 3e 70 42 74 29  Database(p->pBt)
19ea0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
19eb0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
19ec0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
19ed0 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72 74  Attempt to start
19ee0 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
19ef0 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61 6e  on. A write-tran
19f00 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74  saction.** is st
19f10 61 72 74 65 64 20 69 66 20 74 68 65 20 73 65 63  arted if the sec
19f20 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
19f30 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69  nonzero, otherwi
19f40 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72  se a read-.** tr
19f50 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 74  ansaction.  If t
19f60 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
19f70 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20  nt is 2 or more 
19f80 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a  and exclusive.**
19f90 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
19fa0 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67  started, meaning
19fb0 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70   that no other p
19fc0 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77 65  rocess is allowe
19fd0 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74  d.** to access t
19fe0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 41 20  he database.  A 
19ff0 70 72 65 65 78 69 73 74 69 6e 67 20 74 72 61 6e  preexisting tran
1a000 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20  saction may not 
1a010 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20 74  be.** upgraded t
1a020 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79 20 63  o exclusive by c
1a030 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
1a040 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69 6d  ine a second tim
1a050 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75  e - the.** exclu
1a060 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79  sivity flag only
1a070 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65 77   works for a new
1a080 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
1a090 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e  .** A write-tran
1a0a0 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
1a0b0 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61  started before a
1a0c0 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a  ttempting any .*
1a0d0 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  * changes to the
1a0e0 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65   database.  None
1a0f0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1a100 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77  g routines .** w
1a110 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20  ill work unless 
1a120 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
1a130 20 73 74 61 72 74 65 64 20 66 69 72 73 74 3a 0a   started first:.
1a140 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  **.**      sqlit
1a150 65 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62  e3BtreeCreateTab
1a160 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
1a170 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 49  ite3BtreeCreateI
1a180 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20 73  ndex().**      s
1a190 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
1a1a0 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20  Table().**      
1a1b0 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70  sqlite3BtreeDrop
1a1c0 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20  Table().**      
1a1d0 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65  sqlite3BtreeInse
1a1e0 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  rt().**      sql
1a1f0 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28  ite3BtreeDelete(
1a200 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
1a210 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61  3BtreeUpdateMeta
1a220 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69  ().**.** If an i
1a230 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20 74  nitial attempt t
1a240 6f 20 61 63 71 75 69 72 65 20 74 68 65 20 6c 6f  o acquire the lo
1a250 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73 65  ck fails because
1a260 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74   of lock content
1a270 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64  ion.** and the d
1a280 61 74 61 62 61 73 65 20 77 61 73 20 70 72 65 76  atabase was prev
1a290 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c  iously unlocked,
1a2a0 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65   then invoke the
1a2b0 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a   busy handler.**
1a2c0 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
1a2d0 2e 20 20 42 75 74 20 69 66 20 74 68 65 72 65 20  .  But if there 
1a2e0 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61  was previously a
1a2f0 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e   read-lock, do n
1a300 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65  ot.** invoke the
1a310 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d 20   busy handler - 
1a320 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49  just return SQLI
1a330 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54 45  TE_BUSY.  SQLITE
1a340 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65 74  _BUSY is .** ret
1a350 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72 65  urned when there
1a360 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 72 65   is already a re
1a370 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72  ad-lock in order
1a380 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61 64   to avoid a dead
1a390 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70  lock..**.** Supp
1a3a0 6f 73 65 20 74 68 65 72 65 20 61 72 65 20 74 77  ose there are tw
1a3b0 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20 61 6e  o processes A an
1a3c0 64 20 42 2e 20 20 41 20 68 61 73 20 61 20 72 65  d B.  A has a re
1a3d0 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61  ad lock and B ha
1a3e0 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64 20  s.** a reserved 
1a3f0 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20 74  lock.  B tries t
1a400 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63  o promote to exc
1a410 6c 75 73 69 76 65 20 62 75 74 20 69 73 20 62 6c  lusive but is bl
1a420 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a 2a  ocked because.**
1a430 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f 63   of A's read loc
1a440 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20 70  k.  A tries to p
1a450 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72 76  romote to reserv
1a460 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65  ed but is blocke
1a470 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f  d by B..** One o
1a480 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74  r the other of t
1a490 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73  he two processes
1a4a0 20 6d 75 73 74 20 67 69 76 65 20 77 61 79 20 6f   must give way o
1a4b0 72 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a  r there can be.*
1a4c0 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20 20  * no progress.  
1a4d0 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c  By returning SQL
1a4e0 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74  ITE_BUSY and not
1a4f0 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62 75   invoking the bu
1a500 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77  sy callback.** w
1a510 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68 61  hen A already ha
1a520 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77  s a read lock, w
1a530 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74 6f  e encourage A to
1a540 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65 74   give up and let
1a550 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a   B.** proceed..*
1a560 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1a570 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74 72  eeBeginTrans(Btr
1a580 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61  ee *p, int wrfla
1a590 67 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  g){.  BtShared *
1a5a0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1a5b0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1a5c0 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  OK;..  sqlite3Bt
1a5d0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62  reeEnter(p);.  b
1a5e0 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
1a5f0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62  ;..  /* If the b
1a600 74 72 65 65 20 69 73 20 61 6c 72 65 61 64 79 20  tree is already 
1a610 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  in a write-trans
1a620 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20  action, or it.  
1a630 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ** is already in
1a640 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
1a650 69 6f 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74  ion and a read-t
1a660 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
1a670 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68  is requested, th
1a680 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  is is a no-op.. 
1a690 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54   */.  if( p->inT
1a6a0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
1a6b0 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73  E || (p->inTrans
1a6c0 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20  ==TRANS_READ && 
1a6d0 21 77 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20  !wrflag) ){.    
1a6e0 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
1a6f0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1a700 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1a710 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
1a720 7c 7c 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70  || IfNotOmitAV(p
1a730 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 29  Bt->bDoTruncate)
1a740 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69  ==0 );..  /* Wri
1a750 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  te transactions 
1a760 61 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65  are not possible
1a770 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   on a read-only 
1a780 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66  database */.  if
1a790 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  ( (pBt->btsFlags
1a7a0 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59   & BTS_READ_ONLY
1a7b0 29 21 3d 30 20 26 26 20 77 72 66 6c 61 67 20 29  )!=0 && wrflag )
1a7c0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
1a7d0 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  E_READONLY;.    
1a7e0 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
1a7f0 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
1a800 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
1a810 44 5f 43 41 43 48 45 0a 20 20 7b 0a 20 20 20 20  D_CACHE.  {.    
1a820 73 71 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20  sqlite3 *pBlock 
1a830 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 49 66 20 61  = 0;.    /* If a
1a840 6e 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20  nother database 
1a850 68 61 6e 64 6c 65 20 68 61 73 20 61 6c 72 65 61  handle has alrea
1a860 64 79 20 6f 70 65 6e 65 64 20 61 20 77 72 69 74  dy opened a writ
1a870 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20  e transaction . 
1a880 20 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68     ** on this sh
1a890 61 72 65 64 2d 62 74 72 65 65 20 73 74 72 75 63  ared-btree struc
1a8a0 74 75 72 65 20 61 6e 64 20 61 20 73 65 63 6f 6e  ture and a secon
1a8b0 64 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  d write transact
1a8c0 69 6f 6e 20 69 73 0a 20 20 20 20 2a 2a 20 72 65  ion is.    ** re
1a8d0 71 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20  quested, return 
1a8e0 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20  SQLITE_LOCKED.. 
1a8f0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 77     */.    if( (w
1a900 72 66 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e  rflag && pBt->in
1a910 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
1a920 4e 53 5f 57 52 49 54 45 29 0a 20 20 20 20 20 7c  NS_WRITE).     |
1a930 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  | (pBt->btsFlags
1a940 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29 21   & BTS_PENDING)!
1a950 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =0.    ){.      
1a960 70 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57  pBlock = pBt->pW
1a970 72 69 74 65 72 2d 3e 64 62 3b 0a 20 20 20 20 7d  riter->db;.    }
1a980 65 6c 73 65 20 69 66 28 20 77 72 66 6c 61 67 3e  else if( wrflag>
1a990 31 20 29 7b 0a 20 20 20 20 20 20 42 74 4c 6f 63  1 ){.      BtLoc
1a9a0 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 20 20  k *pIter;.      
1a9b0 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70  for(pIter=pBt->p
1a9c0 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74  Lock; pIter; pIt
1a9d0 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29  er=pIter->pNext)
1a9e0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  {.        if( pI
1a9f0 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29  ter->pBtree!=p )
1aa00 7b 0a 20 20 20 20 20 20 20 20 20 20 70 42 6c 6f  {.          pBlo
1aa10 63 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42 74 72  ck = pIter->pBtr
1aa20 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20  ee->db;.        
1aa30 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1aa40 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1aa50 0a 20 20 20 20 69 66 28 20 70 42 6c 6f 63 6b 20  .    if( pBlock 
1aa60 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1aa70 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
1aa80 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29  d(p->db, pBlock)
1aa90 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
1aaa0 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45  ITE_LOCKED_SHARE
1aab0 44 43 41 43 48 45 3b 0a 20 20 20 20 20 20 67 6f  DCACHE;.      go
1aac0 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a  to trans_begun;.
1aad0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
1aae0 0a 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d  ..  /* Any read-
1aaf0 6f 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77 72 69  only or read-wri
1ab00 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
1ab10 6d 70 6c 69 65 73 20 61 20 72 65 61 64 2d 6c 6f  mplies a read-lo
1ab20 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65  ck on .  ** page
1ab30 20 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f   1. So if some o
1ab40 74 68 65 72 20 73 68 61 72 65 64 2d 63 61 63 68  ther shared-cach
1ab50 65 20 63 6c 69 65 6e 74 20 61 6c 72 65 61 64 79  e client already
1ab60 20 68 61 73 20 61 20 77 72 69 74 65 2d 6c 6f 63   has a write-loc
1ab70 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20  k .  ** on page 
1ab80 31 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  1, the transacti
1ab90 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65  on cannot be ope
1aba0 6e 65 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71  ned. */.  rc = q
1abb0 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
1abc0 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54  ableLock(p, MAST
1abd0 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f  ER_ROOT, READ_LO
1abe0 43 4b 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  CK);.  if( SQLIT
1abf0 45 5f 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20  E_OK!=rc ) goto 
1ac00 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20  trans_begun;..  
1ac10 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d  pBt->btsFlags &=
1ac20 20 7e 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f   ~BTS_INITIALLY_
1ac30 45 4d 50 54 59 3b 0a 20 20 69 66 28 20 70 42 74  EMPTY;.  if( pBt
1ac40 2d 3e 6e 50 61 67 65 3d 3d 30 20 29 20 70 42 74  ->nPage==0 ) pBt
1ac50 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
1ac60 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54  S_INITIALLY_EMPT
1ac70 59 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a  Y;.  do {.    /*
1ac80 20 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28   Call lockBtree(
1ac90 29 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20 70  ) until either p
1aca0 42 74 2d 3e 70 50 61 67 65 31 20 69 73 20 70 6f  Bt->pPage1 is po
1acb0 70 75 6c 61 74 65 64 20 6f 72 0a 20 20 20 20 2a  pulated or.    *
1acc0 2a 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 72 65  * lockBtree() re
1acd0 74 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20  turns something 
1ace0 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
1acf0 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28  E_OK. lockBtree(
1ad00 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72 65 74  ).    ** may ret
1ad10 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75  urn SQLITE_OK bu
1ad20 74 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61  t leave pBt->pPa
1ad30 67 65 31 20 73 65 74 20 74 6f 20 30 20 69 66 20  ge1 set to 0 if 
1ad40 61 66 74 65 72 0a 20 20 20 20 2a 2a 20 72 65 61  after.    ** rea
1ad50 64 69 6e 67 20 70 61 67 65 20 31 20 69 74 20 64  ding page 1 it d
1ad60 69 73 63 6f 76 65 72 73 20 74 68 61 74 20 74 68  iscovers that th
1ad70 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74  e page-size of t
1ad80 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20  he database .   
1ad90 20 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74 20   ** file is not 
1ada0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49  pBt->pageSize. I
1adb0 6e 20 74 68 69 73 20 63 61 73 65 20 6c 6f 63 6b  n this case lock
1adc0 42 74 72 65 65 28 29 20 77 69 6c 6c 20 75 70 64  Btree() will upd
1add0 61 74 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e  ate.    ** pBt->
1ade0 70 61 67 65 53 69 7a 65 20 74 6f 20 74 68 65 20  pageSize to the 
1adf0 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65  page-size of the
1ae00 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20   file on disk.. 
1ae10 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28     */.    while(
1ae20 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
1ae30 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72  && SQLITE_OK==(r
1ae40 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42  c = lockBtree(pB
1ae50 74 29 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  t)) );..    if( 
1ae60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1ae70 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20   wrflag ){.     
1ae80 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c   if( (pBt->btsFl
1ae90 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f  ags & BTS_READ_O
1aea0 4e 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  NLY)!=0 ){.     
1aeb0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
1aec0 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d  EADONLY;.      }
1aed0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
1aee0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42   = sqlite3PagerB
1aef0 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 72  egin(pBt->pPager
1af00 2c 77 72 66 6c 61 67 3e 31 2c 73 71 6c 69 74 65  ,wrflag>1,sqlite
1af10 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 70 2d  3TempInMemory(p-
1af20 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20 69  >db));.        i
1af30 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1af40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1af50 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70   = newDatabase(p
1af60 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Bt);.        }. 
1af70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
1af80 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1af90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75  TE_OK ){.      u
1afa0 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
1afb0 65 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20  ed(pBt);.    }. 
1afc0 20 7d 77 68 69 6c 65 28 20 28 72 63 26 30 78 46   }while( (rc&0xF
1afd0 46 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  F)==SQLITE_BUSY 
1afe0 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  && pBt->inTransa
1aff0 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  ction==TRANS_NON
1b000 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 62  E &&.          b
1b010 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61  treeInvokeBusyHa
1b020 6e 64 6c 65 72 28 70 42 74 29 20 29 3b 0a 0a 20  ndler(pBt) );.. 
1b030 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1b040 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  OK ){.    if( p-
1b050 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1b060 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 42  NONE ){.      pB
1b070 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b  t->nTransaction+
1b080 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  +;.#ifndef SQLIT
1b090 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
1b0a0 43 48 45 0a 20 20 20 20 20 20 69 66 28 20 70 2d  CHE.      if( p-
1b0b0 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
1b0c0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
1b0d0 6c 6f 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26  lock.pBtree==p &
1b0e0 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65  & p->lock.iTable
1b0f0 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==1 );.        p
1b100 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52  ->lock.eLock = R
1b110 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  EAD_LOCK;.      
1b120 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20    p->lock.pNext 
1b130 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20  = pBt->pLock;.  
1b140 20 20 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b        pBt->pLock
1b150 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20   = &p->lock;.   
1b160 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1b170 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  }.    p->inTrans
1b180 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53   = (wrflag?TRANS
1b190 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41  _WRITE:TRANS_REA
1b1a0 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  D);.    if( p->i
1b1b0 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72  nTrans>pBt->inTr
1b1c0 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20  ansaction ){.   
1b1d0 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
1b1e0 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61  ction = p->inTra
1b1f0 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ns;.    }.    if
1b200 28 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  ( wrflag ){.    
1b210 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1b220 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
1b230 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1b240 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
1b250 45 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  E.      assert( 
1b260 21 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b  !pBt->pWriter );
1b270 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 57 72 69  .      pBt->pWri
1b280 74 65 72 20 3d 20 70 3b 0a 20 20 20 20 20 20 70  ter = p;.      p
1b290 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
1b2a0 7e 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a  ~BTS_EXCLUSIVE;.
1b2b0 20 20 20 20 20 20 69 66 28 20 77 72 66 6c 61 67        if( wrflag
1b2c0 3e 31 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61  >1 ) pBt->btsFla
1b2d0 67 73 20 7c 3d 20 42 54 53 5f 45 58 43 4c 55 53  gs |= BTS_EXCLUS
1b2e0 49 56 45 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  IVE;.#endif..   
1b2f0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d     /* If the db-
1b300 73 69 7a 65 20 68 65 61 64 65 72 20 66 69 65 6c  size header fiel
1b310 64 20 69 73 20 69 6e 63 6f 72 72 65 63 74 20 28  d is incorrect (
1b320 61 73 20 69 74 20 6d 61 79 20 62 65 20 69 66 20  as it may be if 
1b330 61 6e 20 6f 6c 64 0a 20 20 20 20 20 20 2a 2a 20  an old.      ** 
1b340 63 6c 69 65 6e 74 20 68 61 73 20 62 65 65 6e 20  client has been 
1b350 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61  writing the data
1b360 62 61 73 65 20 66 69 6c 65 29 2c 20 75 70 64 61  base file), upda
1b370 74 65 20 69 74 20 6e 6f 77 2e 20 44 6f 69 6e 67  te it now. Doing
1b380 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 73  .      ** this s
1b390 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68 61  ooner rather tha
1b3a0 6e 20 6c 61 74 65 72 20 6d 65 61 6e 73 20 74 68  n later means th
1b3b0 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
1b3c0 63 61 6e 20 73 61 66 65 6c 79 20 0a 20 20 20 20  can safely .    
1b3d0 20 20 2a 2a 20 72 65 2d 72 65 61 64 20 74 68 65    ** re-read the
1b3e0 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66   database size f
1b3f0 72 6f 6d 20 70 61 67 65 20 31 20 69 66 20 61 20  rom page 1 if a 
1b400 73 61 76 65 70 6f 69 6e 74 20 6f 72 20 74 72 61  savepoint or tra
1b410 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  nsaction.      *
1b420 2a 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  * rollback occur
1b430 73 20 77 69 74 68 69 6e 20 74 68 65 20 74 72 61  s within the tra
1b440 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  nsaction..      
1b450 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  */.      if( pBt
1b460 2d 3e 6e 50 61 67 65 21 3d 67 65 74 34 62 79 74  ->nPage!=get4byt
1b470 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
1b480 5b 32 38 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  [28]) ){.       
1b490 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1b4a0 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e  erWrite(pPage1->
1b4b0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1b4c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1b4d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1b4e0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
1b4f0 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42  1->aData[28], pB
1b500 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  t->nPage);.     
1b510 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1b520 20 7d 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62   }.  }...trans_b
1b530 65 67 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d  egun:.  if( rc==
1b540 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66  SQLITE_OK && wrf
1b550 6c 61 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  lag ){.    /* Th
1b560 69 73 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75  is call makes su
1b570 72 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  re that the page
1b580 72 20 68 61 73 20 74 68 65 20 63 6f 72 72 65 63  r has the correc
1b590 74 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20  t number of.    
1b5a0 2a 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ** open savepoin
1b5b0 74 73 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e  ts. If the secon
1b5c0 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 67  d parameter is g
1b5d0 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 61 6e  reater than 0 an
1b5e0 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62  d.    ** the sub
1b5f0 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20  -journal is not 
1b600 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68  already open, th
1b610 65 6e 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70  en it will be op
1b620 65 6e 65 64 20 68 65 72 65 2e 0a 20 20 20 20 2a  ened here..    *
1b630 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
1b640 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70  e3PagerOpenSavep
1b650 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  oint(pBt->pPager
1b660 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f  , p->db->nSavepo
1b670 69 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72  int);.  }..  btr
1b680 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
1b690 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1b6a0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
1b6b0 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
1b6c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1b6d0 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65  VACUUM../*.** Se
1b6e0 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  t the pointer-ma
1b6f0 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c  p entries for al
1b700 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 61  l children of pa
1b710 67 65 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20  ge pPage. Also, 
1b720 69 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74  if.** pPage cont
1b730 61 69 6e 73 20 63 65 6c 6c 73 20 74 68 61 74 20  ains cells that 
1b740 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f  point to overflo
1b750 77 20 70 61 67 65 73 2c 20 73 65 74 20 74 68 65  w pages, set the
1b760 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20   pointer.** map 
1b770 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20  entries for the 
1b780 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
1b790 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  s well..*/.stati
1b7a0 63 20 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74  c int setChildPt
1b7b0 72 6d 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70  rmaps(MemPage *p
1b7c0 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Page){.  int i; 
1b7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1b7f0 6f 75 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20  ounter variable 
1b800 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20  */.  int nCell; 
1b810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b820 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1b830 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61  r of cells in pa
1b840 67 65 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e  ge pPage */.  in
1b850 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1b860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b870 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
1b880 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
1b890 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
1b8a0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70  .  Pgno pgno = p
1b8b0 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61  Page->pgno;..  a
1b8c0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1b8d0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
1b8e0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
1b8f0 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74    rc = btreeInit
1b900 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 69  Page(pPage);.  i
1b910 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1b920 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1b930 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e  nCell = pPage->n
1b940 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  Cell;..  for(i=0
1b950 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
1b960 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d  .    u8 *pCell =
1b970 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
1b980 20 69 29 3b 0a 0a 20 20 20 20 70 74 72 6d 61 70   i);..    ptrmap
1b990 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65  PutOvflPtr(pPage
1b9a0 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a  , pCell, &rc);..
1b9b0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
1b9c0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67  leaf ){.      Pg
1b9d0 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67  no childPgno = g
1b9e0 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a  et4byte(pCell);.
1b9f0 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
1ba00 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20  pBt, childPgno, 
1ba10 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67  PTRMAP_BTREE, pg
1ba20 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a  no, &rc);.    }.
1ba30 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67    }..  if( !pPag
1ba40 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50  e->leaf ){.    P
1ba50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20  gno childPgno = 
1ba60 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
1ba70 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
1ba80 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
1ba90 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
1baa0 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41  childPgno, PTRMA
1bab0 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26  P_BTREE, pgno, &
1bac0 72 63 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  rc);.  }..  retu
1bad0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1bae0 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61  Somewhere on pPa
1baf0 67 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ge is a pointer 
1bb00 74 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 20  to page iFrom.  
1bb10 4d 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e  Modify this poin
1bb20 74 65 72 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69  ter so.** that i
1bb30 74 20 70 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e  t points to iTo.
1bb40 20 50 61 72 61 6d 65 74 65 72 20 65 54 79 70 65   Parameter eType
1bb50 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 74   describes the t
1bb60 79 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74  ype of pointer t
1bb70 6f 0a 2a 2a 20 62 65 20 6d 6f 64 69 66 69 65 64  o.** be modified
1bb80 2c 20 61 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  , as  follows:.*
1bb90 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45  *.** PTRMAP_BTRE
1bba0 45 3a 20 20 20 20 20 70 50 61 67 65 20 69 73 20  E:     pPage is 
1bbb0 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68  a btree-page. Th
1bbc0 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
1bbd0 20 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20   at a child .** 
1bbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbf0 20 20 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e    page of pPage.
1bc00 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56  .**.** PTRMAP_OV
1bc10 45 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69  ERFLOW1: pPage i
1bc20 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20  s a btree-page. 
1bc30 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  The pointer poin
1bc40 74 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f  ts at an overflo
1bc50 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  w.**            
1bc60 20 20 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e         page poin
1bc70 74 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66  ted to by one of
1bc80 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50   the cells on pP
1bc90 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  age..**.** PTRMA
1bca0 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61  P_OVERFLOW2: pPa
1bcb0 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f  ge is an overflo
1bcc0 77 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  w-page. The poin
1bcd0 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68  ter points at th
1bce0 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20  e next.**       
1bcf0 20 20 20 20 20 20 20 20 20 20 20 20 6f 76 65 72              over
1bd00 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65  flow page in the
1bd10 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
1bd20 20 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50   int modifyPageP
1bd30 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a  ointer(MemPage *
1bd40 70 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f  pPage, Pgno iFro
1bd50 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20  m, Pgno iTo, u8 
1bd60 65 54 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74  eType){.  assert
1bd70 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1bd80 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
1bd90 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
1bda0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
1bdb0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
1bdc0 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
1bdd0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
1bde0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b  MAP_OVERFLOW2 ){
1bdf0 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e  .    /* The poin
1be00 74 65 72 20 69 73 20 61 6c 77 61 79 73 20 74 68  ter is always th
1be10 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
1be20 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  of the page in t
1be30 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20  his case.  */.  
1be40 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70    if( get4byte(p
1be50 50 61 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46  Page->aData)!=iF
1be60 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74  rom ){.      ret
1be70 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1be80 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
1be90 20 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67     put4byte(pPag
1bea0 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a  e->aData, iTo);.
1beb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
1bec0 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c   i;.    int nCel
1bed0 6c 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a  l;.    int rc;..
1bee0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e      rc = btreeIn
1bef0 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
1bf00 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
1bf10 72 6e 20 72 63 3b 0a 20 20 20 20 6e 43 65 6c 6c  rn rc;.    nCell
1bf20 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
1bf30 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ..    for(i=0; i
1bf40 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
1bf50 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20      u8 *pCell = 
1bf60 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
1bf70 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54  i);.      if( eT
1bf80 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
1bf90 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20 20 20  FLOW1 ){.       
1bfa0 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
1bfb0 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78          pPage->x
1bfc0 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  ParseCell(pPage,
1bfd0 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
1bfe0 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f          if( info
1bff0 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f 2e 6e 50 61  .nLocal<info.nPa
1c000 79 6c 6f 61 64 0a 20 20 20 20 20 20 20 20 20 26  yload.         &
1c010 26 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69  & pCell+info.nSi
1c020 7a 65 2d 31 3c 3d 70 50 61 67 65 2d 3e 61 44 61  ze-1<=pPage->aDa
1c030 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61  ta+pPage->maskPa
1c040 67 65 0a 20 20 20 20 20 20 20 20 20 26 26 20 69  ge.         && i
1c050 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28 70  From==get4byte(p
1c060 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d  Cell+info.nSize-
1c070 34 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  4).        ){.  
1c080 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
1c090 28 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a  (pCell+info.nSiz
1c0a0 65 2d 34 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20  e-4, iTo);.     
1c0b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c0c0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
1c0d0 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67  e{.        if( g
1c0e0 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d  et4byte(pCell)==
1c0f0 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20  iFrom ){.       
1c100 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c     put4byte(pCel
1c110 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20  l, iTo);.       
1c120 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1c130 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1c140 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 69 3d 3d  }.  .    if( i==
1c150 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69  nCell ){.      i
1c160 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50  f( eType!=PTRMAP
1c170 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20 20 20 20  _BTREE || .     
1c180 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70       get4byte(&p
1c190 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
1c1a0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
1c1b0 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  !=iFrom ){.     
1c1c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1c1d0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1c1e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74       }.      put
1c1f0 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
1c200 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
1c210 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20  fset+8], iTo);. 
1c220 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1c230 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1c240 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
1c250 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 70 61  open database pa
1c260 67 65 20 70 44 62 50 61 67 65 20 74 6f 20 6c 6f  ge pDbPage to lo
1c270 63 61 74 69 6f 6e 20 69 46 72 65 65 50 61 67 65  cation iFreePage
1c280 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61   in the .** data
1c290 62 61 73 65 2e 20 54 68 65 20 70 44 62 50 61 67  base. The pDbPag
1c2a0 65 20 72 65 66 65 72 65 6e 63 65 20 72 65 6d 61  e reference rema
1c2b0 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a  ins valid..**.**
1c2c0 20 54 68 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c   The isCommit fl
1c2d0 61 67 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  ag indicates tha
1c2e0 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  t there is no ne
1c2f0 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74  ed to remember t
1c300 68 61 74 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  hat.** the journ
1c310 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73  al needs to be s
1c320 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 64  ync()ed before d
1c330 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
1c340 50 61 67 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63  Page->pgno .** c
1c350 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  an be written to
1c360 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 68 61 73  . The caller has
1c370 20 61 6c 72 65 61 64 79 20 70 72 6f 6d 69 73 65   already promise
1c380 64 20 6e 6f 74 20 74 6f 20 77 72 69 74 65 20 74  d not to write t
1c390 6f 20 74 68 61 74 0a 2a 2a 20 70 61 67 65 2e 0a  o that.** page..
1c3a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
1c3b0 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20 42 74  locatePage(.  Bt
1c3c0 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
1c3d0 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
1c3e0 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 44  */.  MemPage *pD
1c3f0 62 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a  bPage,        /*
1c400 20 4f 70 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f   Open page to mo
1c410 76 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65  ve */.  u8 eType
1c420 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1c430 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
1c440 27 74 79 70 65 27 20 65 6e 74 72 79 20 66 6f 72  'type' entry for
1c450 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67   pDbPage */.  Pg
1c460 6e 6f 20 69 50 74 72 50 61 67 65 2c 20 20 20 20  no iPtrPage,    
1c470 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
1c480 72 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27 20  r map 'page-no' 
1c490 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67  entry for pDbPag
1c4a0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65  e */.  Pgno iFre
1c4b0 65 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  ePage,          
1c4c0 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20  /* The location 
1c4d0 74 6f 20 6d 6f 76 65 20 70 44 62 50 61 67 65 20  to move pDbPage 
1c4e0 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f  to */.  int isCo
1c4f0 6d 6d 69 74 20 20 20 20 20 20 20 20 20 20 20 20  mmit            
1c500 20 2f 2a 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61   /* isCommit fla
1c510 67 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  g passed to sqli
1c520 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
1c530 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65   */.){.  MemPage
1c540 20 2a 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a   *pPtrPage;   /*
1c550 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63   The page that c
1c560 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
1c570 72 20 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a  r to pDbPage */.
1c580 20 20 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d    Pgno iDbPage =
1c590 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a   pDbPage->pgno;.
1c5a0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1c5b0 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20  = pBt->pPager;. 
1c5c0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
1c5d0 72 74 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  rt( eType==PTRMA
1c5e0 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65  P_OVERFLOW2 || e
1c5f0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
1c600 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20  RFLOW1 || .     
1c610 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42   eType==PTRMAP_B
1c620 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50  TREE || eType==P
1c630 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
1c640 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
1c650 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1c660 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1c670 61 73 73 65 72 74 28 20 70 44 62 50 61 67 65 2d  assert( pDbPage-
1c680 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20  >pBt==pBt );..  
1c690 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20 69 44 62  /* Move page iDb
1c6a0 50 61 67 65 20 66 72 6f 6d 20 69 74 73 20 63 75  Page from its cu
1c6b0 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74  rrent location t
1c6c0 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 46  o page number iF
1c6d0 72 65 65 50 61 67 65 20 2a 2f 0a 20 20 54 52 41  reePage */.  TRA
1c6e0 43 45 28 28 22 41 55 54 4f 56 41 43 55 55 4d 3a  CE(("AUTOVACUUM:
1c6f0 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20 66 72   Moving %d to fr
1c700 65 65 20 70 61 67 65 20 25 64 20 28 70 74 72 20  ee page %d (ptr 
1c710 70 61 67 65 20 25 64 20 74 79 70 65 20 25 64 29  page %d type %d)
1c720 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69 44 62 50  \n", .      iDbP
1c730 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20  age, iFreePage, 
1c740 69 50 74 72 50 61 67 65 2c 20 65 54 79 70 65 29  iPtrPage, eType)
1c750 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1c760 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 70  3PagerMovepage(p
1c770 50 61 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e  Pager, pDbPage->
1c780 70 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61  pDbPage, iFreePa
1c790 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20  ge, isCommit);. 
1c7a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1c7b0 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
1c7c0 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61   rc;.  }.  pDbPa
1c7d0 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65  ge->pgno = iFree
1c7e0 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  Page;..  /* If p
1c7f0 44 62 50 61 67 65 20 77 61 73 20 61 20 62 74 72  DbPage was a btr
1c800 65 65 2d 70 61 67 65 2c 20 74 68 65 6e 20 69 74  ee-page, then it
1c810 20 6d 61 79 20 68 61 76 65 20 63 68 69 6c 64 20   may have child 
1c820 70 61 67 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c  pages and/or cel
1c830 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f 69  ls.  ** that poi
1c840 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70  nt to overflow p
1c850 61 67 65 73 2e 20 54 68 65 20 70 6f 69 6e 74 65  ages. The pointe
1c860 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r map entries fo
1c870 72 20 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a  r all these.  **
1c880 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62   pages need to b
1c890 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a  e changed..  **.
1c8a0 20 20 2a 2a 20 49 66 20 70 44 62 50 61 67 65 20    ** If pDbPage 
1c8b0 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  is an overflow p
1c8c0 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69  age, then the fi
1c8d0 72 73 74 20 34 20 62 79 74 65 73 20 6d 61 79 20  rst 4 bytes may 
1c8e0 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69  store a.  ** poi
1c8f0 6e 74 65 72 20 74 6f 20 61 20 73 75 62 73 65 71  nter to a subseq
1c900 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  uent overflow pa
1c910 67 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  ge. If this is t
1c920 68 65 20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20  he case, then.  
1c930 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  ** the pointer m
1c940 61 70 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75  ap needs to be u
1c950 70 64 61 74 65 64 20 66 6f 72 20 74 68 65 20 73  pdated for the s
1c960 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c  ubsequent overfl
1c970 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  ow page..  */.  
1c980 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
1c990 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65  P_BTREE || eType
1c9a0 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
1c9b0 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65  E ){.    rc = se
1c9c0 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 44  tChildPtrmaps(pD
1c9d0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
1c9e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1c9f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1ca00 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
1ca10 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76  .    Pgno nextOv
1ca20 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 70 44  fl = get4byte(pD
1ca30 62 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20  bPage->aData);. 
1ca40 20 20 20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21     if( nextOvfl!
1ca50 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d  =0 ){.      ptrm
1ca60 61 70 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f  apPut(pBt, nextO
1ca70 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52  vfl, PTRMAP_OVER
1ca80 46 4c 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65  FLOW2, iFreePage
1ca90 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66  , &rc);.      if
1caa0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1cab0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1cac0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
1cad0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69    }.  }..  /* Fi
1cae0 78 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70  x the database p
1caf0 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67 65 20 69  ointer on page i
1cb00 50 74 72 50 61 67 65 20 74 68 61 74 20 70 6f 69  PtrPage that poi
1cb10 6e 74 65 64 20 61 74 20 69 44 62 50 61 67 65 20  nted at iDbPage 
1cb20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69 74 20  so.  ** that it 
1cb30 70 6f 69 6e 74 73 20 61 74 20 69 46 72 65 65 50  points at iFreeP
1cb40 61 67 65 2e 20 41 6c 73 6f 20 66 69 78 20 74 68  age. Also fix th
1cb50 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
1cb60 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74  try for.  ** iPt
1cb70 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  rPage..  */.  if
1cb80 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f  ( eType!=PTRMAP_
1cb90 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
1cba0 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
1cbb0 65 28 70 42 74 2c 20 69 50 74 72 50 61 67 65 2c  e(pBt, iPtrPage,
1cbc0 20 26 70 50 74 72 50 61 67 65 2c 20 30 29 3b 0a   &pPtrPage, 0);.
1cbd0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1cbe0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1cbf0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1cc00 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1cc10 50 61 67 65 72 57 72 69 74 65 28 70 50 74 72 50  PagerWrite(pPtrP
1cc20 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
1cc30 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1cc40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1cc50 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61  leasePage(pPtrPa
1cc60 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ge);.      retur
1cc70 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1cc80 72 63 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50  rc = modifyPageP
1cc90 6f 69 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c  ointer(pPtrPage,
1cca0 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50   iDbPage, iFreeP
1ccb0 61 67 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20  age, eType);.   
1ccc0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74   releasePage(pPt
1ccd0 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  rPage);.    if( 
1cce0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1ccf0 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
1cd00 28 70 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c  (pBt, iFreePage,
1cd10 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65   eType, iPtrPage
1cd20 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20  , &rc);.    }.  
1cd30 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1cd40 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63  ../* Forward dec
1cd50 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65  laration require
1cd60 64 20 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53  d by incrVacuumS
1cd70 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63  tep(). */.static
1cd80 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72   int allocateBtr
1cd90 65 65 50 61 67 65 28 42 74 53 68 61 72 65 64 20  eePage(BtShared 
1cda0 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50  *, MemPage **, P
1cdb0 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29  gno *, Pgno, u8)
1cdc0 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d  ;../*.** Perform
1cdd0 20 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f   a single step o
1cde0 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  f an incremental
1cdf0 2d 76 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63  -vacuum. If succ
1ce00 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a 2a  essful, return.*
1ce10 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20  * SQLITE_OK. If 
1ce20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b  there is no work
1ce30 20 74 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72   to do (and ther
1ce40 65 66 6f 72 65 20 6e 6f 20 70 6f 69 6e 74 20 69  efore no point i
1ce50 6e 20 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68  n .** calling th
1ce60 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69  is function agai
1ce70 6e 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  n), return SQLIT
1ce80 45 5f 44 4f 4e 45 2e 20 4f 72 2c 20 69 66 20 61  E_DONE. Or, if a
1ce90 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75  n error .** occu
1cea0 72 73 2c 20 72 65 74 75 72 6e 20 73 6f 6d 65 20  rs, return some 
1ceb0 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65  other error code
1cec0 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65  ..**.** More spe
1ced0 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 69 73 20  cifically, this 
1cee0 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
1cef0 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65  s to re-organize
1cf00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6f   the database so
1cf10 20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6c 61   .** that the la
1cf20 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 66  st page of the f
1cf30 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ile currently in
1cf40 20 75 73 65 20 69 73 20 6e 6f 20 6c 6f 6e 67 65   use is no longe
1cf50 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  r in use..**.** 
1cf60 50 61 72 61 6d 65 74 65 72 20 6e 46 69 6e 20 69  Parameter nFin i
1cf70 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1cf80 70 61 67 65 73 20 74 68 61 74 20 74 68 69 73 20  pages that this 
1cf90 64 61 74 61 62 61 73 65 20 77 6f 75 6c 64 20 63  database would c
1cfa0 6f 6e 74 61 69 6e 0a 2a 2a 20 77 65 72 65 20 74  ontain.** were t
1cfb0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  his function cal
1cfc0 6c 65 64 20 75 6e 74 69 6c 20 69 74 20 72 65 74  led until it ret
1cfd0 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45  urns SQLITE_DONE
1cfe0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62  ..**.** If the b
1cff0 43 6f 6d 6d 69 74 20 70 61 72 61 6d 65 74 65 72  Commit parameter
1d000 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
1d010 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75  is function assu
1d020 6d 65 73 20 74 68 61 74 20 74 68 65 20 0a 2a 2a  mes that the .**
1d030 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65   caller will kee
1d040 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61  p calling incrVa
1d050 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c  cuumStep() until
1d060 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49   it returns SQLI
1d070 54 45 5f 44 4f 4e 45 20 0a 2a 2a 20 6f 72 20 61  TE_DONE .** or a
1d080 6e 20 65 72 72 6f 72 2e 20 62 43 6f 6d 6d 69 74  n error. bCommit
1d090 20 69 73 20 70 61 73 73 65 64 20 74 72 75 65 20   is passed true 
1d0a0 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  for an auto-vacu
1d0b0 75 6d 2d 6f 6e 2d 63 6f 6d 6d 69 74 20 0a 2a 2a  um-on-commit .**
1d0c0 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6f 72 20 66   operation, or f
1d0d0 61 6c 73 65 20 66 6f 72 20 61 6e 20 69 6e 63 72  alse for an incr
1d0e0 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a  emental vacuum..
1d0f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
1d100 63 72 56 61 63 75 75 6d 53 74 65 70 28 42 74 53  crVacuumStep(BtS
1d110 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
1d120 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73   nFin, Pgno iLas
1d130 74 50 67 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74  tPg, int bCommit
1d140 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c  ){.  Pgno nFreeL
1d150 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ist;           /
1d160 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
1d170 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66  s still on the f
1d180 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69 6e  ree-list */.  in
1d190 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
1d1a0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1d1b0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
1d1c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c 61  );.  assert( iLa
1d1d0 73 74 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20  stPg>nFin );..  
1d1e0 69 66 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41  if( !PTRMAP_ISPA
1d1f0 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29  GE(pBt, iLastPg)
1d200 20 26 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e   && iLastPg!=PEN
1d210 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1d220 42 74 29 20 29 7b 0a 20 20 20 20 75 38 20 65 54  Bt) ){.    u8 eT
1d230 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50  ype;.    Pgno iP
1d240 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72  trPage;..    nFr
1d250 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74  eeList = get4byt
1d260 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
1d270 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20  aData[36]);.    
1d280 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30  if( nFreeList==0
1d290 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1d2a0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
1d2b0 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70 74    }..    rc = pt
1d2c0 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c 61  rmapGet(pBt, iLa
1d2d0 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26 69  stPg, &eType, &i
1d2e0 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66  PtrPage);.    if
1d2f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1d300 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1d310 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
1d320 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
1d330 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
1d340 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d350 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1d360 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79    }..    if( eTy
1d370 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50  pe==PTRMAP_FREEP
1d380 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28  AGE ){.      if(
1d390 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20   bCommit==0 ){. 
1d3a0 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65         /* Remove
1d3b0 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74   the page from t
1d3c0 68 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69  he files free-li
1d3d0 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20  st. This is not 
1d3e0 72 65 71 75 69 72 65 64 0a 20 20 20 20 20 20 20  required.       
1d3f0 20 2a 2a 20 69 66 20 62 43 6f 6d 6d 69 74 20 69   ** if bCommit i
1d400 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74  s non-zero. In t
1d410 68 61 74 20 63 61 73 65 2c 20 74 68 65 20 66 72  hat case, the fr
1d420 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a  ee-list will be.
1d430 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63          ** trunc
1d440 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74  ated to zero aft
1d450 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
1d460 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20   returns, so it 
1d470 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20  doesn't .       
1d480 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74   ** matter if it
1d490 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20   still contains 
1d4a0 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74  some garbage ent
1d4b0 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ries..        */
1d4c0 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46  .        Pgno iF
1d4d0 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d  reePg;.        M
1d4e0 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b  emPage *pFreePg;
1d4f0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c  .        rc = al
1d500 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
1d510 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26  pBt, &pFreePg, &
1d520 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67  iFreePg, iLastPg
1d530 2c 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29  , BTALLOC_EXACT)
1d540 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1d550 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1d560 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1d570 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
1d580 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46        assert( iF
1d590 72 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29  reePg==iLastPg )
1d5a0 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
1d5b0 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a  ePage(pFreePg);.
1d5c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c        }.    } el
1d5d0 73 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  se {.      Pgno 
1d5e0 69 46 72 65 65 50 67 3b 20 20 20 20 20 20 20 20  iFreePg;        
1d5f0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1d600 20 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f   free page to mo
1d610 76 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f  ve pLastPg to */
1d620 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
1d630 70 4c 61 73 74 50 67 3b 0a 20 20 20 20 20 20 75  pLastPg;.      u
1d640 38 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f  8 eMode = BTALLO
1d650 43 5f 41 4e 59 3b 20 20 20 2f 2a 20 4d 6f 64 65  C_ANY;   /* Mode
1d660 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61   parameter for a
1d670 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
1d680 28 29 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f  () */.      Pgno
1d690 20 69 4e 65 61 72 20 3d 20 30 3b 20 20 20 20 20   iNear = 0;     
1d6a0 20 20 20 20 20 20 2f 2a 20 6e 65 61 72 62 79 20        /* nearby 
1d6b0 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c  parameter for al
1d6c0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
1d6d0 29 20 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d  ) */..      rc =
1d6e0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
1d6f0 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c 61  t, iLastPg, &pLa
1d700 73 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  stPg, 0);.      
1d710 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1d720 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
1d730 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
1d740 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 62 43 6f  .      /* If bCo
1d750 6d 6d 69 74 20 69 73 20 7a 65 72 6f 2c 20 74 68  mmit is zero, th
1d760 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61  is loop runs exa
1d770 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61  ctly once and pa
1d780 67 65 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20  ge pLastPg.     
1d790 20 2a 2a 20 69 73 20 73 77 61 70 70 65 64 20 77   ** is swapped w
1d7a0 69 74 68 20 74 68 65 20 66 69 72 73 74 20 66 72  ith the first fr
1d7b0 65 65 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f  ee page pulled o
1d7c0 66 66 20 74 68 65 20 66 72 65 65 20 6c 69 73 74  ff the free list
1d7d0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
1d7e0 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72   ** On the other
1d7f0 20 68 61 6e 64 2c 20 69 66 20 62 43 6f 6d 6d 69   hand, if bCommi
1d800 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
1d810 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65  n zero, then kee
1d820 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69  p.      ** loopi
1d830 6e 67 20 75 6e 74 69 6c 20 61 20 66 72 65 65 2d  ng until a free-
1d840 70 61 67 65 20 6c 6f 63 61 74 65 64 20 77 69 74  page located wit
1d850 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e 46  hin the first nF
1d860 69 6e 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a  in pages.      *
1d870 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73  * of the file is
1d880 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f   found..      */
1d890 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d  .      if( bComm
1d8a0 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  it==0 ){.       
1d8b0 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43   eMode = BTALLOC
1d8c0 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20 69 4e 65  _LE;.        iNe
1d8d0 61 72 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 20  ar = nFin;.     
1d8e0 20 7d 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20   }.      do {.  
1d8f0 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
1d900 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20  FreePg;.        
1d910 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
1d920 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72  eePage(pBt, &pFr
1d930 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20  eePg, &iFreePg, 
1d940 69 4e 65 61 72 2c 20 65 4d 6f 64 65 29 3b 0a 20  iNear, eMode);. 
1d950 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1d960 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d970 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1d980 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20  e(pLastPg);.    
1d990 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1d9a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1d9b0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1d9c0 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d  FreePg);.      }
1d9d0 77 68 69 6c 65 28 20 62 43 6f 6d 6d 69 74 20 26  while( bCommit &
1d9e0 26 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20 29  & iFreePg>nFin )
1d9f0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1da00 69 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67 20  iFreePg<iLastPg 
1da10 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20  );.      .      
1da20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67  rc = relocatePag
1da30 65 28 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20  e(pBt, pLastPg, 
1da40 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c  eType, iPtrPage,
1da50 20 69 46 72 65 65 50 67 2c 20 62 43 6f 6d 6d 69   iFreePg, bCommi
1da60 74 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  t);.      releas
1da70 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a  ePage(pLastPg);.
1da80 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1da90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1daa0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1dab0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1dac0 0a 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d  .  if( bCommit==
1dad0 30 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  0 ){.    do {.  
1dae0 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20      iLastPg--;. 
1daf0 20 20 20 7d 77 68 69 6c 65 28 20 69 4c 61 73 74     }while( iLast
1db00 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  Pg==PENDING_BYTE
1db10 5f 50 41 47 45 28 70 42 74 29 20 7c 7c 20 50 54  _PAGE(pBt) || PT
1db20 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
1db30 20 69 4c 61 73 74 50 67 29 20 29 3b 0a 20 20 20   iLastPg) );.   
1db40 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74   pBt->bDoTruncat
1db50 65 20 3d 20 31 3b 0a 20 20 20 20 70 42 74 2d 3e  e = 1;.    pBt->
1db60 6e 50 61 67 65 20 3d 20 69 4c 61 73 74 50 67 3b  nPage = iLastPg;
1db70 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1db80 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1db90 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6f  * The database o
1dba0 70 65 6e 65 64 20 62 79 20 74 68 65 20 66 69 72  pened by the fir
1dbb0 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
1dbc0 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
1dbd0 74 61 62 61 73 65 0a 2a 2a 20 6e 4f 72 69 67 20  tabase.** nOrig 
1dbe0 70 61 67 65 73 20 69 6e 20 73 69 7a 65 20 63 6f  pages in size co
1dbf0 6e 74 61 69 6e 69 6e 67 20 6e 46 72 65 65 20 66  ntaining nFree f
1dc00 72 65 65 20 70 61 67 65 73 2e 20 52 65 74 75 72  ree pages. Retur
1dc10 6e 20 74 68 65 20 65 78 70 65 63 74 65 64 20 0a  n the expected .
1dc20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  ** size of the d
1dc30 61 74 61 62 61 73 65 20 69 6e 20 70 61 67 65 73  atabase in pages
1dc40 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 61 75   following an au
1dc50 74 6f 2d 76 61 63 75 75 6d 20 6f 70 65 72 61 74  to-vacuum operat
1dc60 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  ion..*/.static P
1dc70 67 6e 6f 20 66 69 6e 61 6c 44 62 53 69 7a 65 28  gno finalDbSize(
1dc80 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
1dc90 67 6e 6f 20 6e 4f 72 69 67 2c 20 50 67 6e 6f 20  gno nOrig, Pgno 
1dca0 6e 46 72 65 65 29 7b 0a 20 20 69 6e 74 20 6e 45  nFree){.  int nE
1dcb0 6e 74 72 79 3b 20 20 20 20 20 20 20 20 20 20 20  ntry;           
1dcc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1dcd0 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 6f  ber of entries o
1dce0 6e 20 6f 6e 65 20 70 74 72 6d 61 70 20 70 61 67  n one ptrmap pag
1dcf0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 74 72  e */.  Pgno nPtr
1dd00 6d 61 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  map;            
1dd10 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1dd20 20 6f 66 20 50 74 72 4d 61 70 20 70 61 67 65 73   of PtrMap pages
1dd30 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a   to be freed */.
1dd40 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20    Pgno nFin;    
1dd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd60 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
1dd70 65 20 2a 2f 0a 0a 20 20 6e 45 6e 74 72 79 20 3d  e */..  nEntry =
1dd80 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
1dd90 2f 35 3b 0a 20 20 6e 50 74 72 6d 61 70 20 3d 20  /5;.  nPtrmap = 
1dda0 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52  (nFree-nOrig+PTR
1ddb0 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
1ddc0 6e 4f 72 69 67 29 2b 6e 45 6e 74 72 79 29 2f 6e  nOrig)+nEntry)/n
1ddd0 45 6e 74 72 79 3b 0a 20 20 6e 46 69 6e 20 3d 20  Entry;.  nFin = 
1dde0 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d 20  nOrig - nFree - 
1ddf0 6e 50 74 72 6d 61 70 3b 0a 20 20 69 66 28 20 6e  nPtrmap;.  if( n
1de00 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54  Orig>PENDING_BYT
1de10 45 5f 50 41 47 45 28 70 42 74 29 20 26 26 20 6e  E_PAGE(pBt) && n
1de20 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54 45  Fin<PENDING_BYTE
1de30 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
1de40 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 20 20    nFin--;.  }.  
1de50 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53  while( PTRMAP_IS
1de60 50 41 47 45 28 70 42 74 2c 20 6e 46 69 6e 29 20  PAGE(pBt, nFin) 
1de70 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47  || nFin==PENDING
1de80 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1de90 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20  ){.    nFin--;. 
1dea0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 46 69   }..  return nFi
1deb0 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72  n;.}../*.** A wr
1dec0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
1ded0 6d 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62  must be opened b
1dee0 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68  efore calling th
1def0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20  is function..** 
1df00 49 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69  It performs a si
1df10 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72  ngle unit of wor
1df20 6b 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63  k towards an inc
1df30 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e  remental vacuum.
1df40 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  .**.** If the in
1df50 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
1df60 20 69 73 20 66 69 6e 69 73 68 65 64 20 61 66 74   is finished aft
1df70 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
1df80 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c   has run,.** SQL
1df90 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75  ITE_DONE is retu
1dfa0 72 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e  rned. If it is n
1dfb0 6f 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74  ot finished, but
1dfc0 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 72   no error occurr
1dfd0 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  ed,.** SQLITE_OK
1dfe0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
1dff0 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74  herwise an SQLit
1e000 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a  e error code. .*
1e010 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1e020 65 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72  eeIncrVacuum(Btr
1e030 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
1e040 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
1e050 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73  t = p->pBt;..  s
1e060 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1e070 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
1e080 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1e090 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26  n==TRANS_WRITE &
1e0a0 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  & p->inTrans==TR
1e0b0 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69  ANS_WRITE );.  i
1e0c0 66 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63  f( !pBt->autoVac
1e0d0 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  uum ){.    rc = 
1e0e0 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
1e0f0 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  else{.    Pgno n
1e100 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61 67 65  Orig = btreePage
1e110 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20  count(pBt);.    
1e120 50 67 6e 6f 20 6e 46 72 65 65 20 3d 20 67 65 74  Pgno nFree = get
1e130 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
1e140 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
1e150 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d 20      Pgno nFin = 
1e160 66 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c  finalDbSize(pBt,
1e170 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a   nOrig, nFree);.
1e180 0a 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3c 6e  .    if( nOrig<n
1e190 46 69 6e 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Fin ){.      rc 
1e1a0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
1e1b0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _BKPT;.    }else
1e1c0 20 69 66 28 20 6e 46 72 65 65 3e 30 20 29 7b 0a   if( nFree>0 ){.
1e1d0 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 41        rc = saveA
1e1e0 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30  llCursors(pBt, 0
1e1f0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
1e200 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1e210 0a 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64  .        invalid
1e220 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
1e230 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  che(pBt);.      
1e240 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75    rc = incrVacuu
1e250 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c  mStep(pBt, nFin,
1e260 20 6e 4f 72 69 67 2c 20 30 29 3b 0a 20 20 20 20   nOrig, 0);.    
1e270 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
1e280 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1e290 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1e2a0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42  te3PagerWrite(pB
1e2b0 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
1e2c0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  ge);.        put
1e2d0 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
1e2e0 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70  e1->aData[28], p
1e2f0 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
1e300 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
1e310 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1e320 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _DONE;.    }.  }
1e330 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1e340 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
1e350 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1e360 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1e370 61 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73  alled prior to s
1e380 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
1e390 74 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63  t when a transac
1e3a0 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69  tion.** is commi
1e3b0 74 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f  tted for an auto
1e3c0 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
1e3d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ..**.** If SQLIT
1e3e0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1e3f0 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20  , then *pnTrunc 
1e400 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
1e410 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a  mber of pages.**
1e420 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1e430 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75  le should be tru
1e440 6e 63 61 74 65 64 20 74 6f 20 64 75 72 69 6e 67  ncated to during
1e450 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63   the commit proc
1e460 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68  ess. .** i.e. th
1e470 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62  e database has b
1e480 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64 20  een reorganized 
1e490 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74 68 65  so that only the
1e4a0 20 66 69 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a   first *pnTrunc.
1e4b0 2a 2a 20 70 61 67 65 73 20 61 72 65 20 69 6e 20  ** pages are in 
1e4c0 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  use..*/.static i
1e4d0 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d  nt autoVacuumCom
1e4e0 6d 69 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  mit(BtShared *pB
1e4f0 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
1e500 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65  QLITE_OK;.  Page
1e510 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d  r *pPager = pBt-
1e520 3e 70 50 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f  >pPager;.  VVA_O
1e530 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66 20 3d 20  NLY( int nRef = 
1e540 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
1e550 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 20 29 0a  ount(pPager); ).
1e560 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1e570 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
1e580 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
1e590 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
1e5a0 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a  flowCache(pBt);.
1e5b0 20 20 61 73 73 65 72 74 28 70 42 74 2d 3e 61 75    assert(pBt->au
1e5c0 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69 66 28  toVacuum);.  if(
1e5d0 20 21 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75   !pBt->incrVacuu
1e5e0 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46  m ){.    Pgno nF
1e5f0 69 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  in;         /* N
1e600 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
1e610 6e 20 64 61 74 61 62 61 73 65 20 61 66 74 65 72  n database after
1e620 20 61 75 74 6f 76 61 63 75 75 6d 69 6e 67 20 2a   autovacuuming *
1e630 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65  /.    Pgno nFree
1e640 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ;        /* Numb
1e650 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74  er of pages on t
1e660 68 65 20 66 72 65 65 6c 69 73 74 20 69 6e 69 74  he freelist init
1e670 69 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 50 67 6e  ially */.    Pgn
1e680 6f 20 69 46 72 65 65 3b 20 20 20 20 20 20 20 20  o iFree;        
1e690 2f 2a 20 54 68 65 20 6e 65 78 74 20 70 61 67 65  /* The next page
1e6a0 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a   to be freed */.
1e6b0 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20      Pgno nOrig; 
1e6c0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
1e6d0 73 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20 66  se size before f
1e6e0 72 65 65 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e  reeing */..    n
1e6f0 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61 67 65  Orig = btreePage
1e700 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20  count(pBt);.    
1e710 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  if( PTRMAP_ISPAG
1e720 45 28 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c 7c  E(pBt, nOrig) ||
1e730 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f   nOrig==PENDING_
1e740 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
1e750 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73  {.      /* It is
1e760 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
1e770 20 63 72 65 61 74 65 20 61 20 64 61 74 61 62 61   create a databa
1e780 73 65 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  se for which the
1e790 20 66 69 6e 61 6c 20 70 61 67 65 0a 20 20 20 20   final page.    
1e7a0 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20 61    ** is either a
1e7b0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
1e7c0 65 20 6f 72 20 74 68 65 20 70 65 6e 64 69 6e 67  e or the pending
1e7d0 2d 62 79 74 65 20 70 61 67 65 2e 20 49 66 20 6f  -byte page. If o
1e7e0 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65  ne.      ** is e
1e7f0 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 69 73  ncountered, this
1e800 20 69 6e 64 69 63 61 74 65 73 20 63 6f 72 72 75   indicates corru
1e810 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ption..      */.
1e820 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1e830 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1e840 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46 72  ;.    }..    nFr
1e850 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ee = get4byte(&p
1e860 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1e870 61 5b 33 36 5d 29 3b 0a 20 20 20 20 6e 46 69 6e  a[36]);.    nFin
1e880 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70   = finalDbSize(p
1e890 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65  Bt, nOrig, nFree
1e8a0 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3e  );.    if( nFin>
1e8b0 6e 4f 72 69 67 20 29 20 72 65 74 75 72 6e 20 53  nOrig ) return S
1e8c0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1e8d0 50 54 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e  PT;.    if( nFin
1e8e0 3c 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20  <nOrig ){.      
1e8f0 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
1e900 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a  ors(pBt, 0, 0);.
1e910 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 46      }.    for(iF
1e920 72 65 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65  ree=nOrig; iFree
1e930 3e 6e 46 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c  >nFin && rc==SQL
1e940 49 54 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29  ITE_OK; iFree--)
1e950 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63  {.      rc = inc
1e960 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c  rVacuumStep(pBt,
1e970 20 6e 46 69 6e 2c 20 69 46 72 65 65 2c 20 31 29   nFin, iFree, 1)
1e980 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1e990 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45  (rc==SQLITE_DONE
1e9a0 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   || rc==SQLITE_O
1e9b0 4b 29 20 26 26 20 6e 46 72 65 65 3e 30 20 29 7b  K) && nFree>0 ){
1e9c0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1e9d0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42  te3PagerWrite(pB
1e9e0 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
1e9f0 67 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ge);.      put4b
1ea00 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
1ea10 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b  ->aData[32], 0);
1ea20 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
1ea30 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
1ea40 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20  ata[36], 0);.   
1ea50 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
1ea60 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
1ea70 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20  28], nFin);.    
1ea80 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61    pBt->bDoTrunca
1ea90 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 42  te = 1;.      pB
1eaa0 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 46 69 6e 3b  t->nPage = nFin;
1eab0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
1eac0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1ead0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1eae0 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  erRollback(pPage
1eaf0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  r);.    }.  }.. 
1eb00 20 61 73 73 65 72 74 28 20 6e 52 65 66 3e 3d 73   assert( nRef>=s
1eb10 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
1eb20 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20  unt(pPager) );. 
1eb30 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
1eb40 65 6c 73 65 20 2f 2a 20 69 66 6e 64 65 66 20 53  else /* ifndef S
1eb50 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1eb60 41 43 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e  ACUUM */.# defin
1eb70 65 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  e setChildPtrmap
1eb80 73 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23  s(x) SQLITE_OK.#
1eb90 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
1eba0 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  s routine does t
1ebb0 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20 6f  he first phase o
1ebc0 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f  f a two-phase co
1ebd0 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74  mmit.  This rout
1ebe0 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61 20  ine.** causes a 
1ebf0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1ec00 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 28   to be created (
1ec10 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61  if it does not a
1ec20 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a 2a  lready exist).**
1ec30 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77   and populated w
1ec40 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72  ith enough infor
1ec50 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 69  mation so that i
1ec60 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f  f a power loss o
1ec70 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61 74  ccurs.** the dat
1ec80 61 62 61 73 65 20 63 61 6e 20 62 65 20 72 65 73  abase can be res
1ec90 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
1eca0 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20 70  ginal state by p
1ecb0 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74  laying back.** t
1ecc0 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  he journal.  The
1ecd0 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  n the contents o
1ece0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72  f the journal ar
1ecf0 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74 6f  e flushed out to
1ed00 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20 41  .** the disk.  A
1ed10 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  fter the journal
1ed20 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78   is safely on ox
1ed30 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65 73  ide, the changes
1ed40 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   to the.** datab
1ed50 61 73 65 20 61 72 65 20 77 72 69 74 74 65 6e 20  ase are written 
1ed60 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
1ed70 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73 68  e file and flush
1ed80 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20  ed to oxide..** 
1ed90 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  At the end of th
1eda0 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c  is call, the rol
1edb0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74  lback journal st
1edc0 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74 68  ill exists on th
1edd0 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77 65  e.** disk and we
1ede0 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69   are still holdi
1edf0 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f  ng all locks, so
1ee00 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1ee10 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d   has not.** comm
1ee20 69 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c 69  itted.  See sqli
1ee30 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
1ee40 61 73 65 54 77 6f 28 29 20 66 6f 72 20 74 68 65  aseTwo() for the
1ee50 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66   second phase of
1ee60 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70   the.** commit p
1ee70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  rocess..**.** Th
1ee80 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  is call is a no-
1ee90 6f 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74  op if no write-t
1eea0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75  ransaction is cu
1eeb0 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f  rrently active o
1eec0 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  n pBt..**.** Oth
1eed0 65 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65  erwise, sync the
1eee0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
1eef0 6f 72 20 74 68 65 20 62 74 72 65 65 20 70 42 74  or the btree pBt
1ef00 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73  . zMaster points
1ef10 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20   to.** the name 
1ef20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
1ef30 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68  nal file that sh
1ef40 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20  ould be written 
1ef50 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69  into the.** indi
1ef60 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66  vidual journal f
1ef70 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c  ile, or is NULL,
1ef80 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d   indicating no m
1ef90 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1efa0 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64  le .** (single d
1efb0 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
1efc0 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ion)..**.** When
1efd0 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c   this is called,
1efe0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
1eff0 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  nal should alrea
1f000 64 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20  dy have been.** 
1f010 63 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74  created, populat
1f020 65 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75  ed with this jou
1f030 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64  rnal pointer and
1f040 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
1f050 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73  .**.** Once this
1f060 20 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20   is routine has 
1f070 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e  returned, the on
1f080 6c 79 20 74 68 69 6e 67 20 72 65 71 75 69 72 65  ly thing require
1f090 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74  d to commit.** t
1f0a0 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  he write-transac
1f0b0 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61  tion for this da
1f0c0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 74  tabase file is t
1f0d0 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  o delete the jou
1f0e0 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rnal..*/.int sql
1f0f0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
1f100 68 61 73 65 4f 6e 65 28 42 74 72 65 65 20 2a 70  haseOne(Btree *p
1f110 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
1f120 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
1f130 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1f140 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
1f150 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
1f160 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
1f170 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73   = p->pBt;.    s
1f180 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1f190 28 70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  (p);.#ifndef SQL
1f1a0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1f1b0 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d  UUM.    if( pBt-
1f1c0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
1f1d0 20 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56 61       rc = autoVa
1f1e0 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b  cuumCommit(pBt);
1f1f0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1f200 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1f210 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1f220 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
1f230 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1f240 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
1f250 66 28 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  f( pBt->bDoTrunc
1f260 61 74 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ate ){.      sql
1f270 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
1f280 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50 61 67  eImage(pBt->pPag
1f290 65 72 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b  er, pBt->nPage);
1f2a0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
1f2b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1f2c0 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
1f2d0 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a  e(pBt->pPager, z
1f2e0 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  Master, 0);.    
1f2f0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1f300 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
1f310 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1f320 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1f330 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 6f 74   called from bot
1f340 68 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  h BtreeCommitPha
1f350 73 65 54 77 6f 28 29 20 61 6e 64 20 42 74 72 65  seTwo() and Btre
1f360 65 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 61  eRollback().** a
1f370 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
1f380 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
1f390 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
1f3a0 64 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61  d btreeEndTransa
1f3b0 63 74 69 6f 6e 28 42 74 72 65 65 20 2a 70 29 7b  ction(Btree *p){
1f3c0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1f3d0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c   = p->pBt;.  sql
1f3e0 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
1f3f0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
1f400 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
1f410 65 78 28 70 29 20 29 3b 0a 0a 23 69 66 6e 64 65  ex(p) );..#ifnde
1f420 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1f430 54 4f 56 41 43 55 55 4d 0a 20 20 70 42 74 2d 3e  TOVACUUM.  pBt->
1f440 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 30 3b  bDoTruncate = 0;
1f450 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d  .#endif.  if( p-
1f460 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e  >inTrans>TRANS_N
1f470 4f 4e 45 20 26 26 20 64 62 2d 3e 6e 56 64 62 65  ONE && db->nVdbe
1f480 52 65 61 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a  Read>1 ){.    /*
1f490 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 74   If there are ot
1f4a0 68 65 72 20 61 63 74 69 76 65 20 73 74 61 74 65  her active state
1f4b0 6d 65 6e 74 73 20 74 68 61 74 20 62 65 6c 6f 6e  ments that belon
1f4c0 67 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61  g to this databa
1f4d0 73 65 0a 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65  se.    ** handle
1f4e0 2c 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 61  , downgrade to a
1f4f0 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73   read-only trans
1f500 61 63 74 69 6f 6e 2e 20 54 68 65 20 6f 74 68 65  action. The othe
1f510 72 20 73 74 61 74 65 6d 65 6e 74 73 0a 20 20 20  r statements.   
1f520 20 2a 2a 20 6d 61 79 20 73 74 69 6c 6c 20 62 65   ** may still be
1f530 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68   reading from th
1f540 65 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a  e database.  */.
1f550 20 20 20 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c      downgradeAll
1f560 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
1f570 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 70 2d  Locks(p);.    p-
1f580 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
1f590 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _READ;.  }else{.
1f5a0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61      /* If the ha
1f5b0 6e 64 6c 65 20 68 61 64 20 61 6e 79 20 6b 69 6e  ndle had any kin
1f5c0 64 20 6f 66 20 74 72 61 6e 73 61 63 74 69 6f 6e  d of transaction
1f5d0 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74   open, decrement
1f5e0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 74 72 61   the .    ** tra
1f5f0 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 6f  nsaction count o
1f600 66 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72  f the shared btr
1f610 65 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73  ee. If the trans
1f620 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 0a 20 20  action count .  
1f630 20 20 2a 2a 20 72 65 61 63 68 65 73 20 30 2c 20    ** reaches 0, 
1f640 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73  set the shared s
1f650 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f  tate to TRANS_NO
1f660 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74  NE. The unlockBt
1f670 72 65 65 49 66 55 6e 75 73 65 64 28 29 0a 20 20  reeIfUnused().  
1f680 20 20 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f 77 20    ** call below 
1f690 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20  will unlock the 
1f6a0 70 61 67 65 72 2e 20 20 2a 2f 0a 20 20 20 20 69  pager.  */.    i
1f6b0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54  f( p->inTrans!=T
1f6c0 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  RANS_NONE ){.   
1f6d0 20 20 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65     clearAllShare
1f6e0 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73  dCacheTableLocks
1f6f0 28 70 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  (p);.      pBt->
1f700 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a  nTransaction--;.
1f710 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74        if( 0==pBt
1f720 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  ->nTransaction )
1f730 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69  {.        pBt->i
1f740 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
1f750 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  RANS_NONE;.     
1f760 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1f770 20 53 65 74 20 74 68 65 20 63 75 72 72 65 6e 74   Set the current
1f780 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61   transaction sta
1f790 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45  te to TRANS_NONE
1f7a0 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
1f7b0 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 69 66  .    ** pager if
1f7c0 20 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65   this call close
1f7d0 64 20 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20  d the only read 
1f7e0 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
1f7f0 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 70 2d  tion.  */.    p-
1f800 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
1f810 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f 63  _NONE;.    unloc
1f820 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
1f830 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65  Bt);.  }..  btre
1f840 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 7d  eIntegrity(p);.}
1f850 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74  ../*.** Commit t
1f860 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
1f870 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67  urrently in prog
1f880 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ress..**.** This
1f890 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65   routine impleme
1f8a0 6e 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70  nts the second p
1f8b0 68 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73  hase of a 2-phas
1f8c0 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a  e commit.  The.*
1f8d0 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  * sqlite3BtreeCo
1f8e0 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 72  mmitPhaseOne() r
1f8f0 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
1f900 66 69 72 73 74 20 70 68 61 73 65 20 61 6e 64 20  first phase and 
1f910 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e 76  should.** be inv
1f920 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f 20 63 61  oked prior to ca
1f930 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
1f940 6e 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  ne.  The sqlite3
1f950 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
1f960 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  One().** routine
1f970 20 64 69 64 20 61 6c 6c 20 74 68 65 20 77 6f 72   did all the wor
1f980 6b 20 6f 66 20 77 72 69 74 69 6e 67 20 69 6e 66  k of writing inf
1f990 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20  ormation out to 
1f9a0 64 69 73 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e  disk and flushin
1f9b0 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  g the.** content
1f9c0 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 61  s so that they a
1f9d0 72 65 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20  re written onto 
1f9e0 74 68 65 20 64 69 73 6b 20 70 6c 61 74 74 65 72  the disk platter
1f9f0 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72  .  All this.** r
1fa00 6f 75 74 69 6e 65 20 68 61 73 20 74 6f 20 64 6f  outine has to do
1fa10 20 69 73 20 64 65 6c 65 74 65 20 6f 72 20 74 72   is delete or tr
1fa20 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74  uncate or zero t
1fa30 68 65 20 68 65 61 64 65 72 20 69 6e 20 74 68 65  he header in the
1fa40 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
1fa50 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63 68 20   journal (which 
1fa60 63 61 75 73 65 73 20 74 68 65 20 74 72 61 6e 73  causes the trans
1fa70 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74  action to commit
1fa80 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f  ) and.** drop lo
1fa90 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61  cks..**.** Norma
1faa0 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72  lly, if an error
1fab0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68   occurs while th
1fac0 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 69 73  e pager layer is
1fad0 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 0a   attempting to .
1fae0 2a 2a 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20  ** finalize the 
1faf0 75 6e 64 65 72 6c 79 69 6e 67 20 6a 6f 75 72 6e  underlying journ
1fb00 61 6c 20 66 69 6c 65 2c 20 74 68 69 73 20 66 75  al file, this fu
1fb10 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61  nction returns a
1fb20 6e 20 65 72 72 6f 72 20 61 6e 64 0a 2a 2a 20 74  n error and.** t
1fb30 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 77  he upper layer w
1fb40 69 6c 6c 20 61 74 74 65 6d 70 74 20 61 20 72 6f  ill attempt a ro
1fb50 6c 6c 62 61 63 6b 2e 20 48 6f 77 65 76 65 72 2c  llback. However,
1fb60 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   if the second a
1fb70 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f  rgument.** is no
1fb80 6e 2d 7a 65 72 6f 20 74 68 65 6e 20 74 68 69 73  n-zero then this
1fb90 20 62 2d 74 72 65 65 20 74 72 61 6e 73 61 63 74   b-tree transact
1fba0 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20 61  ion is part of a
1fbb0 20 6d 75 6c 74 69 2d 66 69 6c 65 20 0a 2a 2a 20   multi-file .** 
1fbc0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20  transaction. In 
1fbd0 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 74  this case, the t
1fbe0 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61  ransaction has a
1fbf0 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6d 6d  lready been comm
1fc00 69 74 74 65 64 20 0a 2a 2a 20 28 62 79 20 64 65  itted .** (by de
1fc10 6c 65 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20  leting a master 
1fc20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e  journal file) an
1fc30 64 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  d the caller wil
1fc40 6c 20 69 67 6e 6f 72 65 20 74 68 69 73 20 0a 2a  l ignore this .*
1fc50 2a 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75  * functions retu
1fc60 72 6e 20 63 6f 64 65 2e 20 53 6f 2c 20 65 76 65  rn code. So, eve
1fc70 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  n if an error oc
1fc80 63 75 72 73 20 69 6e 20 74 68 65 20 70 61 67 65  curs in the page
1fc90 72 20 6c 61 79 65 72 2c 0a 2a 2a 20 72 65 73 65  r layer,.** rese
1fca0 74 20 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a  t the b-tree obj
1fcb0 65 63 74 73 20 69 6e 74 65 72 6e 61 6c 20 73 74  ects internal st
1fcc0 61 74 65 20 74 6f 20 69 6e 64 69 63 61 74 65 20  ate to indicate 
1fcd0 74 68 61 74 20 74 68 65 20 77 72 69 74 65 0a 2a  that the write.*
1fce0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  * transaction ha
1fcf0 73 20 62 65 65 6e 20 63 6c 6f 73 65 64 2e 20 54  s been closed. T
1fd00 68 69 73 20 69 73 20 71 75 69 74 65 20 73 61 66  his is quite saf
1fd10 65 2c 20 61 73 20 74 68 65 20 70 61 67 65 72 20  e, as the pager 
1fd20 77 69 6c 6c 20 68 61 76 65 0a 2a 2a 20 74 72 61  will have.** tra
1fd30 6e 73 69 74 69 6f 6e 65 64 20 74 6f 20 74 68 65  nsitioned to the
1fd40 20 65 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a   error state..**
1fd50 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65  .** This will re
1fd60 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20  lease the write 
1fd70 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
1fd80 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74  base file.  If t
1fd90 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61  here.** are no a
1fda0 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69  ctive cursors, i
1fdb0 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20  t also releases 
1fdc0 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a  the read lock..*
1fdd0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1fde0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
1fdf0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 62  (Btree *p, int b
1fe00 43 6c 65 61 6e 75 70 29 7b 0a 0a 20 20 69 66 28  Cleanup){..  if(
1fe10 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1fe20 4e 53 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72 6e  NS_NONE ) return
1fe30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71   SQLITE_OK;.  sq
1fe40 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1fe50 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67  p);.  btreeInteg
1fe60 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  rity(p);..  /* I
1fe70 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73  f the handle has
1fe80 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
1fe90 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69  tion open, commi
1fea0 74 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  t the shared-btr
1feb0 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61  ees .  ** transa
1fec0 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68  ction and set th
1fed0 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74  e shared state t
1fee0 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20  o TRANS_READ..  
1fef0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  */.  if( p->inTr
1ff00 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1ff10 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
1ff20 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
1ff30 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20  t = p->pBt;.    
1ff40 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
1ff50 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
1ff60 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61  S_WRITE );.    a
1ff70 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61  ssert( pBt->nTra
1ff80 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20  nsaction>0 );.  
1ff90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1ffa0 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
1ffb0 6f 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  o(pBt->pPager);.
1ffc0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1ffd0 54 45 5f 4f 4b 20 26 26 20 62 43 6c 65 61 6e 75  TE_OK && bCleanu
1ffe0 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  p==0 ){.      sq
1fff0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
20000 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  p);.      return
20010 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
20020 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2d 2d  ->iDataVersion--
20030 3b 20 20 2f 2a 20 43 6f 6d 70 65 6e 73 61 74 65  ;  /* Compensate
20040 20 66 6f 72 20 70 50 61 67 65 72 2d 3e 69 44 61   for pPager->iDa
20050 74 61 56 65 72 73 69 6f 6e 2b 2b 3b 20 2a 2f 0a  taVersion++; */.
20060 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
20070 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52  action = TRANS_R
20080 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c  EAD;.    btreeCl
20090 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42  earHasContent(pB
200a0 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  t);.  }..  btree
200b0 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  EndTransaction(p
200c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
200d0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
200e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
200f0 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20  ../*.** Do both 
20100 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d  phases of a comm
20110 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  it..*/.int sqlit
20120 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74  e3BtreeCommit(Bt
20130 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
20140 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
20150 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
20160 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
20170 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20  mmitPhaseOne(p, 
20180 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
20190 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
201a0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
201b0 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
201c0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 0);.  }.  sqli
201d0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
201e0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
201f0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
20200 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 73 74  tine sets the st
20210 61 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41  ate to CURSOR_FA
20220 55 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f  ULT and the erro
20230 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72  r.** code to err
20240 43 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 63  Code for every c
20250 75 72 73 6f 72 20 6f 6e 20 61 6e 79 20 42 74 53  ursor on any BtS
20260 68 61 72 65 64 20 74 68 61 74 20 70 42 74 72 65  hared that pBtre
20270 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e  e.** references.
20280 20 20 4f 72 20 69 66 20 74 68 65 20 77 72 69 74    Or if the writ
20290 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 73 65  eOnly flag is se
202a0 74 20 74 6f 20 31 2c 20 74 68 65 6e 20 6f 6e 6c  t to 1, then onl
202b0 79 0a 2a 2a 20 74 72 69 70 20 77 72 69 74 65 20  y.** trip write 
202c0 63 75 72 73 6f 72 73 20 61 6e 64 20 6c 65 61 76  cursors and leav
202d0 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 75  e read cursors u
202e0 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20  nchanged..**.** 
202f0 45 76 65 72 79 20 63 75 72 73 6f 72 20 69 73 20  Every cursor is 
20300 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 62  a candidate to b
20310 65 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75  e tripped, inclu
20320 64 69 6e 67 20 63 75 72 73 6f 72 73 0a 2a 2a 20  ding cursors.** 
20330 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 6f  that belong to o
20340 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
20350 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68  nnections that h
20360 61 70 70 65 6e 20 74 6f 20 62 65 0a 2a 2a 20 73  appen to be.** s
20370 68 61 72 69 6e 67 20 74 68 65 20 63 61 63 68 65  haring the cache
20380 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a   with pBtree..**
20390 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
203a0 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65   gets called whe
203b0 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  n a rollback occ
203c0 75 72 73 2e 20 49 66 20 74 68 65 20 77 72 69 74  urs. If the writ
203d0 65 4f 6e 6c 79 0a 2a 2a 20 66 6c 61 67 20 69 73  eOnly.** flag is
203e0 20 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e 6c 79   true, then only
203f0 20 77 72 69 74 65 2d 63 75 72 73 6f 72 73 20 6e   write-cursors n
20400 65 65 64 20 62 65 20 74 72 69 70 70 65 64 20 2d  eed be tripped -
20410 20 72 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 63 75   read-only.** cu
20420 72 73 6f 72 73 20 73 61 76 65 20 74 68 65 69 72  rsors save their
20430 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f   current positio
20440 6e 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20  ns so that they 
20450 6d 61 79 20 63 6f 6e 74 69 6e 75 65 20 0a 2a 2a  may continue .**
20460 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 72   following the r
20470 6f 6c 6c 62 61 63 6b 2e 20 4f 72 2c 20 69 66 20  ollback. Or, if 
20480 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c  writeOnly is fal
20490 73 65 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  se, all cursors 
204a0 61 72 65 20 0a 2a 2a 20 74 72 69 70 70 65 64 2e  are .** tripped.
204b0 20 49 6e 20 67 65 6e 65 72 61 6c 2c 20 77 72 69   In general, wri
204c0 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 20  teOnly is false 
204d0 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  if the transacti
204e0 6f 6e 20 62 65 69 6e 67 0a 2a 2a 20 72 6f 6c 6c  on being.** roll
204f0 65 64 20 62 61 63 6b 20 6d 6f 64 69 66 69 65 64  ed back modified
20500 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
20510 68 65 6d 61 2e 20 49 6e 20 74 68 69 73 20 63 61  hema. In this ca
20520 73 65 20 62 2d 74 72 65 65 20 72 6f 6f 74 0a 2a  se b-tree root.*
20530 2a 20 70 61 67 65 73 20 6d 61 79 20 62 65 20 6d  * pages may be m
20540 6f 76 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20  oved or deleted 
20550 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
20560 65 20 61 6c 74 6f 67 65 74 68 65 72 2c 20 6d 61  e altogether, ma
20570 6b 69 6e 67 0a 2a 2a 20 69 74 20 75 6e 73 61 66  king.** it unsaf
20580 65 20 66 6f 72 20 72 65 61 64 20 63 75 72 73 6f  e for read curso
20590 72 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0a  rs to continue..
205a0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 72 69  **.** If the wri
205b0 74 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 74  teOnly flag is t
205c0 72 75 65 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  rue and an error
205d0 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
205e0 77 68 69 6c 65 20 0a 2a 2a 20 73 61 76 69 6e 67  while .** saving
205f0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73   the current pos
20600 69 74 69 6f 6e 20 6f 66 20 61 20 72 65 61 64 2d  ition of a read-
20610 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20 61 6c 6c  only cursor, all
20620 20 63 75 72 73 6f 72 73 2c 20 0a 2a 2a 20 69 6e   cursors, .** in
20630 63 6c 75 64 69 6e 67 20 61 6c 6c 20 72 65 61 64  cluding all read
20640 2d 63 75 72 73 6f 72 73 20 61 72 65 20 74 72 69  -cursors are tri
20650 70 70 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  pped..**.** SQLI
20660 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
20670 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c  d if successful,
20680 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20   or if an error 
20690 6f 63 63 75 72 73 20 77 68 69 6c 65 0a 2a 2a 20  occurs while.** 
206a0 73 61 76 69 6e 67 20 61 20 63 75 72 73 6f 72 20  saving a cursor 
206b0 70 6f 73 69 74 69 6f 6e 2c 20 61 6e 20 53 51 4c  position, an SQL
206c0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
206d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
206e0 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72  reeTripAllCursor
206f0 73 28 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c  s(Btree *pBtree,
20700 20 69 6e 74 20 65 72 72 43 6f 64 65 2c 20 69 6e   int errCode, in
20710 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20  t writeOnly){.  
20720 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69  BtCursor *p;.  i
20730 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
20740 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 77  K;..  assert( (w
20750 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 77  riteOnly==0 || w
20760 72 69 74 65 4f 6e 6c 79 3d 3d 31 29 20 26 26 20  riteOnly==1) && 
20770 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 3d 3d  BTCF_WriteFlag==
20780 31 20 29 3b 0a 20 20 69 66 28 20 70 42 74 72 65  1 );.  if( pBtre
20790 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
207a0 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65  BtreeEnter(pBtre
207b0 65 29 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 42  e);.    for(p=pB
207c0 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73  tree->pBt->pCurs
207d0 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
207e0 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  t){.      int i;
207f0 0a 20 20 20 20 20 20 69 66 28 20 77 72 69 74 65  .      if( write
20800 4f 6e 6c 79 20 26 26 20 28 70 2d 3e 63 75 72 46  Only && (p->curF
20810 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72 69 74  lags & BTCF_Writ
20820 65 46 6c 61 67 29 3d 3d 30 20 29 7b 0a 20 20 20  eFlag)==0 ){.   
20830 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61       if( p->eSta
20840 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
20850 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43   || p->eState==C
20860 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29  URSOR_SKIPNEXT )
20870 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
20880 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
20890 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ion(p);.        
208a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
208b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
208c0 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33     (void)sqlite3
208d0 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73  BtreeTripAllCurs
208e0 6f 72 73 28 70 42 74 72 65 65 2c 20 72 63 2c 20  ors(pBtree, rc, 
208f0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
20900 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
20910 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
20920 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20930 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
20940 65 61 72 43 75 72 73 6f 72 28 70 29 3b 0a 20 20  earCursor(p);.  
20950 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20        p->eState 
20960 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a  = CURSOR_FAULT;.
20970 20 20 20 20 20 20 20 20 70 2d 3e 73 6b 69 70 4e          p->skipN
20980 65 78 74 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20  ext = errCode;. 
20990 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
209a0 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50 61 67  (i=0; i<=p->iPag
209b0 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  e; i++){.       
209c0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 2d 3e   releasePage(p->
209d0 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20  apPage[i]);.    
209e0 20 20 20 20 70 2d 3e 61 70 50 61 67 65 5b 69 5d      p->apPage[i]
209f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
20a00 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
20a10 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65  treeLeave(pBtree
20a20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
20a30 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  rc;.}../*.** Rol
20a40 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
20a50 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73  ction in progres
20a60 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 72 69 70  s..**.** If trip
20a70 43 6f 64 65 20 69 73 20 6e 6f 74 20 53 51 4c 49  Code is not SQLI
20a80 54 45 5f 4f 4b 20 74 68 65 6e 20 63 75 72 73 6f  TE_OK then curso
20a90 72 73 20 77 69 6c 6c 20 62 65 20 69 6e 76 61 6c  rs will be inval
20aa0 69 64 61 74 65 64 20 28 74 72 69 70 70 65 64 29  idated (tripped)
20ab0 2e 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20  ..** Only write 
20ac0 63 75 72 73 6f 72 73 20 61 72 65 20 74 72 69 70  cursors are trip
20ad0 70 65 64 20 69 66 20 77 72 69 74 65 4f 6e 6c 79  ped if writeOnly
20ae0 20 69 73 20 74 72 75 65 20 62 75 74 20 61 6c 6c   is true but all
20af0 20 63 75 72 73 6f 72 73 20 61 72 65 0a 2a 2a 20   cursors are.** 
20b00 74 72 69 70 70 65 64 20 69 66 20 77 72 69 74 65  tripped if write
20b10 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 2e 20 20  Only is false.  
20b20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75  Any attempt to u
20b30 73 65 0a 2a 2a 20 61 20 74 72 69 70 70 65 64 20  se.** a tripped 
20b40 63 75 72 73 6f 72 20 77 69 6c 6c 20 72 65 73 75  cursor will resu
20b50 6c 74 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a  lt in an error..
20b60 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20  **.** This will 
20b70 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74  release the writ
20b80 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
20b90 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
20ba0 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
20bb0 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c   active cursors,
20bc0 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65   it also release
20bd0 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  s the read lock.
20be0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
20bf0 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72  treeRollback(Btr
20c00 65 65 20 2a 70 2c 20 69 6e 74 20 74 72 69 70 43  ee *p, int tripC
20c10 6f 64 65 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e  ode, int writeOn
20c20 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ly){.  int rc;. 
20c30 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
20c40 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61   p->pBt;.  MemPa
20c50 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 61  ge *pPage1;..  a
20c60 73 73 65 72 74 28 20 77 72 69 74 65 4f 6e 6c 79  ssert( writeOnly
20c70 3d 3d 31 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79  ==1 || writeOnly
20c80 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
20c90 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54   tripCode==SQLIT
20ca0 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b  E_ABORT_ROLLBACK
20cb0 20 7c 7c 20 74 72 69 70 43 6f 64 65 3d 3d 53 51   || tripCode==SQ
20cc0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c  LITE_OK );.  sql
20cd0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
20ce0 29 3b 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64  );.  if( tripCod
20cf0 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  e==SQLITE_OK ){.
20d00 20 20 20 20 72 63 20 3d 20 74 72 69 70 43 6f 64      rc = tripCod
20d10 65 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  e = saveAllCurso
20d20 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20  rs(pBt, 0, 0);. 
20d30 20 20 20 69 66 28 20 72 63 20 29 20 77 72 69 74     if( rc ) writ
20d40 65 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 7d 65 6c  eOnly = 0;.  }el
20d50 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  se{.    rc = SQL
20d60 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
20d70 28 20 74 72 69 70 43 6f 64 65 20 29 7b 0a 20 20  ( tripCode ){.  
20d80 20 20 69 6e 74 20 72 63 32 20 3d 20 73 71 6c 69    int rc2 = sqli
20d90 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43  te3BtreeTripAllC
20da0 75 72 73 6f 72 73 28 70 2c 20 74 72 69 70 43 6f  ursors(p, tripCo
20db0 64 65 2c 20 77 72 69 74 65 4f 6e 6c 79 29 3b 0a  de, writeOnly);.
20dc0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
20dd0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 77 72  SQLITE_OK || (wr
20de0 69 74 65 4f 6e 6c 79 3d 3d 30 20 26 26 20 72 63  iteOnly==0 && rc
20df0 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 3b  2==SQLITE_OK) );
20e00 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51  .    if( rc2!=SQ
20e10 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72  LITE_OK ) rc = r
20e20 63 32 3b 0a 20 20 7d 0a 20 20 62 74 72 65 65 49  c2;.  }.  btreeI
20e30 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20  ntegrity(p);..  
20e40 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
20e50 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
20e60 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20     int rc2;..   
20e70 20 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f 57   assert( TRANS_W
20e80 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61  RITE==pBt->inTra
20e90 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20  nsaction );.    
20ea0 72 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67  rc2 = sqlite3Pag
20eb0 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e  erRollback(pBt->
20ec0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
20ed0 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20   rc2!=SQLITE_OK 
20ee0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63  ){.      rc = rc
20ef0 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  2;.    }..    /*
20f00 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61   The rollback ma
20f10 79 20 68 61 76 65 20 64 65 73 74 72 6f 79 65 64  y have destroyed
20f20 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44 61   the pPage1->aDa
20f30 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20  ta value.  So.  
20f40 20 20 2a 2a 20 63 61 6c 6c 20 62 74 72 65 65 47    ** call btreeG
20f50 65 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65  etPage() on page
20f60 20 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65   1 again to make
20f70 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50 61  .    ** sure pPa
20f80 67 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73 65  ge1->aData is se
20f90 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a  t correctly. */.
20fa0 20 20 20 20 69 66 28 20 62 74 72 65 65 47 65 74      if( btreeGet
20fb0 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50  Page(pBt, 1, &pP
20fc0 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45  age1, 0)==SQLITE
20fd0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  _OK ){.      int
20fe0 20 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79 74   nPage = get4byt
20ff0 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31  e(28+(u8*)pPage1
21000 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20  ->aData);.      
21010 74 65 73 74 63 61 73 65 28 20 6e 50 61 67 65 3d  testcase( nPage=
21020 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
21030 6e 50 61 67 65 3d 3d 30 20 29 20 73 71 6c 69 74  nPage==0 ) sqlit
21040 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
21050 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e  (pBt->pPager, &n
21060 50 61 67 65 29 3b 0a 20 20 20 20 20 20 74 65 73  Page);.      tes
21070 74 63 61 73 65 28 20 70 42 74 2d 3e 6e 50 61 67  tcase( pBt->nPag
21080 65 21 3d 6e 50 61 67 65 20 29 3b 0a 20 20 20 20  e!=nPage );.    
21090 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e    pBt->nPage = n
210a0 50 61 67 65 3b 0a 20 20 20 20 20 20 72 65 6c 65  Page;.      rele
210b0 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
210c0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
210d0 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72  t( countValidCur
210e0 73 6f 72 73 28 70 42 74 2c 20 31 29 3d 3d 30 20  sors(pBt, 1)==0 
210f0 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  );.    pBt->inTr
21100 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
21110 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74 72 65  S_READ;.    btre
21120 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74  eClearHasContent
21130 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74  (pBt);.  }..  bt
21140 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f  reeEndTransactio
21150 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  n(p);.  sqlite3B
21160 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
21170 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
21180 0a 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61 74  .** Start a stat
21190 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63  ement subtransac
211a0 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61  tion. The subtra
211b0 6e 73 61 63 74 69 6f 6e 20 63 61 6e 20 62 65 20  nsaction can be 
211c0 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69  rolled.** back i
211d0 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20  ndependently of 
211e0 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63  the main transac
211f0 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73  tion. You must s
21200 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69  tart a transacti
21210 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74  on .** before st
21220 61 72 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e  arting a subtran
21230 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62  saction. The sub
21240 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65  transaction is e
21250 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  nded automatical
21260 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61  ly .** if the ma
21270 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  in transaction c
21280 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20  ommits or rolls 
21290 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74  back..**.** Stat
212a0 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63  ement subtransac
212b0 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61  tions are used a
212c0 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c  round individual
212d0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a   SQL statements.
212e0 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74  ** that are cont
212f0 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42  ained within a B
21300 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c  EGIN...COMMIT bl
21310 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74  ock.  If a const
21320 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f  raint.** error o
21330 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65  ccurs within the
21340 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20   statement, the 
21350 65 66 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f  effect of that o
21360 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  ne statement.** 
21370 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  can be rolled ba
21380 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  ck without havin
21390 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68  g to rollback th
213a0 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63  e entire transac
213b0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74  tion..**.** A st
213c0 61 74 65 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e  atement sub-tran
213d0 73 61 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65  saction is imple
213e0 6d 65 6e 74 65 64 20 61 73 20 61 6e 20 61 6e 6f  mented as an ano
213f0 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74  nymous savepoint
21400 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70  . The.** value p
21410 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
21420 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  ond parameter is
21430 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
21440 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 2c  r of savepoints,
21450 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  .** including th
21460 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20  e new anonymous 
21470 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20  savepoint, open 
21480 6f 6e 20 74 68 65 20 42 2d 54 72 65 65 2e 20 69  on the B-Tree. i
21490 2e 65 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a 20  .e. if there.** 
214a0 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 73 61  are no active sa
214b0 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20  vepoints and no 
214c0 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 2d  other statement-
214d0 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65  transactions ope
214e0 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74  n,.** iStatement
214f0 20 69 73 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e   is 1. This anon
21500 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 20  ymous savepoint 
21510 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20  can be released 
21520 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a  or rolled back.*
21530 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69  * using the sqli
21540 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e  te3BtreeSavepoin
21550 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  t() function..*/
21560 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
21570 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65  eBeginStmt(Btree
21580 20 2a 70 2c 20 69 6e 74 20 69 53 74 61 74 65 6d   *p, int iStatem
21590 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ent){.  int rc;.
215a0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
215b0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69  = p->pBt;.  sqli
215c0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
215d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
215e0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
215f0 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ITE );.  assert(
21600 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
21610 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29  & BTS_READ_ONLY)
21620 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
21630 20 69 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b   iStatement>0 );
21640 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74  .  assert( iStat
21650 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61  ement>p->db->nSa
21660 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 61 73 73  vepoint );.  ass
21670 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
21680 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
21690 52 49 54 45 20 29 3b 0a 20 20 2f 2a 20 41 74 20  RITE );.  /* At 
216a0 74 68 65 20 70 61 67 65 72 20 6c 65 76 65 6c 2c  the pager level,
216b0 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
216c0 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 20 73 61  nsaction is a sa
216d0 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 20 20 2a  vepoint with.  *
216e0 2a 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74  * an index great
216f0 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 76 65  er than all save
21700 70 6f 69 6e 74 73 20 63 72 65 61 74 65 64 20 65  points created e
21710 78 70 6c 69 63 69 74 6c 79 20 75 73 69 6e 67 0a  xplicitly using.
21720 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65    ** SQL stateme
21730 6e 74 73 2e 20 49 74 20 69 73 20 69 6c 6c 65 67  nts. It is illeg
21740 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65  al to open, rele
21750 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  ase or rollback 
21760 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20 73 61  any.  ** such sa
21770 76 65 70 6f 69 6e 74 73 20 77 68 69 6c 65 20 74  vepoints while t
21780 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  he statement tra
21790 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69  nsaction savepoi
217a0 6e 74 20 69 73 20 61 63 74 69 76 65 2e 0a 20 20  nt is active..  
217b0 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
217c0 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f  3PagerOpenSavepo
217d0 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  int(pBt->pPager,
217e0 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20   iStatement);.  
217f0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
21800 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
21810 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
21820 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
21830 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
21840 2c 20 6f 70 2c 20 69 73 20 61 6c 77 61 79 73 20  , op, is always 
21850 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
21860 43 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49  CK.** or SAVEPOI
21870 4e 54 5f 52 45 4c 45 41 53 45 2e 20 54 68 69 73  NT_RELEASE. This
21880 20 66 75 6e 63 74 69 6f 6e 20 65 69 74 68 65 72   function either
21890 20 72 65 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c   releases or rol
218a0 6c 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73  ls back the.** s
218b0 61 76 65 70 6f 69 6e 74 20 69 64 65 6e 74 69 66  avepoint identif
218c0 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
218d0 20 69 53 61 76 65 70 6f 69 6e 74 2c 20 64 65 70   iSavepoint, dep
218e0 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 76 61  ending on the va
218f0 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a  lue .** of op..*
21900 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69  *.** Normally, i
21910 53 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65  Savepoint is gre
21920 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
21930 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65  al to zero. Howe
21940 76 65 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a  ver, if op is.**
21950 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
21960 41 43 4b 2c 20 74 68 65 6e 20 69 53 61 76 65 70  ACK, then iSavep
21970 6f 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62 65  oint may also be
21980 20 2d 31 2e 20 49 6e 20 74 68 69 73 20 63 61 73   -1. In this cas
21990 65 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e  e the .** conten
219a0 74 73 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65  ts of the entire
219b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65   transaction are
219c0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68   rolled back. Th
219d0 69 73 20 69 73 20 64 69 66 66 65 72 65 6e 74 0a  is is different.
219e0 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c  ** from a normal
219f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c   transaction rol
21a00 6c 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63  lback, as no loc
21a10 6b 73 20 61 72 65 20 72 65 6c 65 61 73 65 64 20  ks are released 
21a20 61 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73  and the.** trans
21a30 61 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f  action remains o
21a40 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pen..*/.int sqli
21a50 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e  te3BtreeSavepoin
21a60 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  t(Btree *p, int 
21a70 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69  op, int iSavepoi
21a80 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  nt){.  int rc = 
21a90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
21aa0 20 70 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73   p && p->inTrans
21ab0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
21ac0 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
21ad0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20  Bt = p->pBt;.   
21ae0 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56   assert( op==SAV
21af0 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c  EPOINT_RELEASE |
21b00 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  | op==SAVEPOINT_
21b10 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20  ROLLBACK );.    
21b20 61 73 73 65 72 74 28 20 69 53 61 76 65 70 6f 69  assert( iSavepoi
21b30 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65 70  nt>=0 || (iSavep
21b40 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d  oint==-1 && op==
21b50 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
21b60 43 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  CK) );.    sqlit
21b70 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
21b80 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
21b90 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28  3PagerSavepoint(
21ba0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c  pBt->pPager, op,
21bb0 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
21bc0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
21bd0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
21be0 20 69 53 61 76 65 70 6f 69 6e 74 3c 30 20 26 26   iSavepoint<0 &&
21bf0 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
21c00 26 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f  & BTS_INITIALLY_
21c10 45 4d 50 54 59 29 21 3d 30 20 29 7b 0a 20 20 20  EMPTY)!=0 ){.   
21c20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20       pBt->nPage 
21c30 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
21c40 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62     rc = newDatab
21c50 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ase(pBt);.      
21c60 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74  pBt->nPage = get
21c70 34 62 79 74 65 28 32 38 20 2b 20 70 42 74 2d 3e  4byte(28 + pBt->
21c80 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a  pPage1->aData);.
21c90 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61  .      /* The da
21ca0 74 61 62 61 73 65 20 73 69 7a 65 20 77 61 73 20  tabase size was 
21cb0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
21cc0 20 6f 66 66 73 65 74 20 32 38 20 6f 66 20 74 68   offset 28 of th
21cd0 65 20 68 65 61 64 65 72 0a 20 20 20 20 20 20 2a  e header.      *
21ce0 2a 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73  * when the trans
21cf0 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20  action started, 
21d00 73 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  so we know that 
21d10 74 68 65 20 76 61 6c 75 65 20 61 74 20 6f 66 66  the value at off
21d20 73 65 74 0a 20 20 20 20 20 20 2a 2a 20 32 38 20  set.      ** 28 
21d30 69 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20  is nonzero. */. 
21d40 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
21d50 2d 3e 6e 50 61 67 65 3e 30 20 29 3b 0a 20 20 20  ->nPage>0 );.   
21d60 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
21d70 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d  reeLeave(p);.  }
21d80 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
21d90 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
21da0 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74  new cursor for t
21db0 68 65 20 42 54 72 65 65 20 77 68 6f 73 65 20 72  he BTree whose r
21dc0 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61  oot is on the pa
21dd0 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66  ge.** iTable. If
21de0 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72   a read-only cur
21df0 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64  sor is requested
21e00 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20  , it is assumed 
21e10 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c  that.** the call
21e20 65 72 20 61 6c 72 65 61 64 79 20 68 61 73 20 61  er already has a
21e30 74 20 6c 65 61 73 74 20 61 20 72 65 61 64 2d 6f  t least a read-o
21e40 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  nly transaction 
21e50 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64  open.** on the d
21e60 61 74 61 62 61 73 65 20 61 6c 72 65 61 64 79 2e  atabase already.
21e70 20 49 66 20 61 20 77 72 69 74 65 2d 63 75 72 73   If a write-curs
21e80 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  or is requested,
21e90 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c   then.** the cal
21ea0 6c 65 72 20 69 73 20 61 73 73 75 6d 65 64 20 74  ler is assumed t
21eb0 6f 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77  o have an open w
21ec0 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
21ed0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 42  ..**.** If the B
21ee0 54 52 45 45 5f 57 52 43 53 52 20 62 69 74 20 6f  TREE_WRCSR bit o
21ef0 66 20 77 72 46 6c 61 67 20 69 73 20 63 6c 65 61  f wrFlag is clea
21f00 72 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  r, then the curs
21f10 6f 72 20 63 61 6e 20 6f 6e 6c 79 0a 2a 2a 20 62  or can only.** b
21f20 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69  e used for readi
21f30 6e 67 2e 20 20 49 66 20 74 68 65 20 42 54 52 45  ng.  If the BTRE
21f40 45 5f 57 52 43 53 52 20 62 69 74 20 69 73 20 73  E_WRCSR bit is s
21f50 65 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  et, then the cur
21f60 73 6f 72 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73  sor.** can be us
21f70 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f  ed for reading o
21f80 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20 69 66  r for writing if
21f90 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e   other condition
21fa0 73 20 66 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a  s for writing.**
21fb0 20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20   are also met.  
21fc0 54 68 65 73 65 20 61 72 65 20 74 68 65 20 63 6f  These are the co
21fd0 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75  nditions that mu
21fe0 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64  st be met in ord
21ff0 65 72 0a 2a 2a 20 66 6f 72 20 77 72 69 74 69 6e  er.** for writin
22000 67 20 74 6f 20 62 65 20 61 6c 6c 6f 77 65 64 3a  g to be allowed:
22010 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63  .**.** 1:  The c
22020 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20  ursor must have 
22030 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68  been opened with
22040 20 77 72 46 6c 61 67 20 63 6f 6e 74 61 69 6e 69   wrFlag containi
22050 6e 67 20 42 54 52 45 45 5f 57 52 43 53 52 0a 2a  ng BTREE_WRCSR.*
22060 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64  *.** 2:  Other d
22070 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
22080 6f 6e 73 20 74 68 61 74 20 73 68 61 72 65 20 74  ons that share t
22090 68 65 20 73 61 6d 65 20 70 61 67 65 72 20 63 61  he same pager ca
220a0 63 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77  che.**     but w
220b0 68 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20  hich are not in 
220c0 74 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49  the READ_UNCOMMI
220d0 54 54 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e  TTED state may n
220e0 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63  ot have.**     c
220f0 75 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68  ursors open with
22100 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68   wrFlag==0 on th
22110 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f  e same table.  O
22120 74 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20  therwise.**     
22130 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65  the changes made
22140 20 62 79 20 74 68 69 73 20 77 72 69 74 65 20 63   by this write c
22150 75 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76  ursor would be v
22160 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20  isible to.**    
22170 20 74 68 65 20 72 65 61 64 20 63 75 72 73 6f 72   the read cursor
22180 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64  s in the other d
22190 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
221a0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68  on..**.** 3:  Th
221b0 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
221c0 62 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74  be writable (not
221d0 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65   on read-only me
221e0 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54  dia).**.** 4:  T
221f0 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20  here must be an 
22200 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69  active transacti
22210 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 54  on..**.** The BT
22220 52 45 45 5f 46 4f 52 44 45 4c 45 54 45 20 62 69  REE_FORDELETE bi
22230 74 20 6f 66 20 77 72 46 6c 61 67 20 6d 61 79 20  t of wrFlag may 
22240 6f 70 74 69 6f 6e 61 6c 6c 79 20 62 65 20 73 65  optionally be se
22250 74 20 69 66 20 42 54 52 45 45 5f 57 52 43 53 52  t if BTREE_WRCSR
22260 0a 2a 2a 20 69 73 20 73 65 74 2e 20 20 49 66 20  .** is set.  If 
22270 46 4f 52 44 45 4c 45 54 45 20 69 73 20 73 65 74  FORDELETE is set
22280 2c 20 74 68 61 74 20 69 73 20 61 20 68 69 6e 74  , that is a hint
22290 20 74 6f 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e   to the implemen
222a0 74 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 74  tation that.** t
222b0 68 69 73 20 63 75 72 73 6f 72 20 77 69 6c 6c 20  his cursor will 
222c0 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 74 6f 20  only be used to 
222d0 73 65 65 6b 20 74 6f 20 61 6e 64 20 64 65 6c 65  seek to and dele
222e0 74 65 20 65 6e 74 72 69 65 73 20 6f 66 20 61 6e  te entries of an
222f0 20 69 6e 64 65 78 0a 2a 2a 20 61 73 20 70 61 72   index.** as par
22300 74 20 6f 66 20 61 20 6c 61 72 67 65 72 20 44 45  t of a larger DE
22310 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  LETE statement. 
22320 20 54 68 65 20 46 4f 52 44 45 4c 45 54 45 20 68   The FORDELETE h
22330 69 6e 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20  int is not used 
22340 62 79 0a 2a 2a 20 74 68 69 73 20 69 6d 70 6c 65  by.** this imple
22350 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 42 75 74 20  mentation.  But 
22360 69 6e 20 61 20 68 79 70 6f 74 68 65 74 69 63 61  in a hypothetica
22370 6c 20 61 6c 74 65 72 6e 61 74 69 76 65 20 73 74  l alternative st
22380 6f 72 61 67 65 20 65 6e 67 69 6e 65 20 0a 2a 2a  orage engine .**
22390 20 69 6e 20 77 68 69 63 68 20 69 6e 64 65 78 20   in which index 
223a0 65 6e 74 72 69 65 73 20 61 72 65 20 61 75 74 6f  entries are auto
223b0 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
223c0 64 20 77 68 65 6e 20 63 6f 72 72 65 73 70 6f 6e  d when correspon
223d0 64 69 6e 67 20 74 61 62 6c 65 0a 2a 2a 20 72 6f  ding table.** ro
223e0 77 73 20 61 72 65 20 64 65 6c 65 74 65 64 2c 20  ws are deleted, 
223f0 74 68 65 20 46 4f 52 44 45 4c 45 54 45 20 66 6c  the FORDELETE fl
22400 61 67 20 69 73 20 61 20 68 69 6e 74 20 74 68 61  ag is a hint tha
22410 74 20 61 6c 6c 20 53 45 45 4b 20 61 6e 64 20 44  t all SEEK and D
22420 45 4c 45 54 45 0a 2a 2a 20 6f 70 65 72 61 74 69  ELETE.** operati
22430 6f 6e 73 20 6f 6e 20 74 68 69 73 20 63 75 72 73  ons on this curs
22440 6f 72 20 63 61 6e 20 62 65 20 6e 6f 2d 6f 70 73  or can be no-ops
22450 20 61 6e 64 20 61 6c 6c 20 52 45 41 44 20 6f 70   and all READ op
22460 65 72 61 74 69 6f 6e 73 20 63 61 6e 20 0a 2a 2a  erations can .**
22470 20 72 65 74 75 72 6e 20 61 20 6e 75 6c 6c 20 72   return a null r
22480 6f 77 20 28 32 2d 62 79 74 65 73 3a 20 30 78 30  ow (2-bytes: 0x0
22490 31 20 30 78 30 30 29 2e 0a 2a 2a 0a 2a 2a 20 4e  1 0x00)..**.** N
224a0 6f 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f  o checking is do
224b0 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ne to make sure 
224c0 74 68 61 74 20 70 61 67 65 20 69 54 61 62 6c 65  that page iTable
224d0 20 72 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a   really is the.*
224e0 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61  * root page of a
224f0 20 62 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20   b-tree.  If it 
22500 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65  is not, then the
22510 20 63 75 72 73 6f 72 20 61 63 71 75 69 72 65 64   cursor acquired
22520 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72  .** will not wor
22530 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a  k correctly..**.
22540 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  ** It is assumed
22550 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65   that the sqlite
22560 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f  3BtreeCursorZero
22570 28 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c  () has been call
22580 65 64 0a 2a 2a 20 6f 6e 20 70 43 75 72 20 74 6f  ed.** on pCur to
22590 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
225a0 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 70 72 69  memory space pri
225b0 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74  or to invoking t
225c0 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  his routine..*/.
225d0 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
225e0 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20  Cursor(.  Btree 
225f0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
22600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22610 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
22620 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
22630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22640 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
22650 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20  t page of table 
22660 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
22670 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20   wrFlag,        
22680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22690 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74      /* 1 to writ
226a0 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a  e. 0 read-only *
226b0 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e  /.  struct KeyIn
226c0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
226d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
226e0 72 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70 61  rst arg to compa
226f0 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a  rison function *
22700 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  /.  BtCursor *pC
22710 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ur              
22720 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
22730 61 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72 73  ace for new curs
22740 6f 72 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61  or */.){.  BtSha
22750 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
22760 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
22770 20 20 2f 2a 20 53 68 61 72 65 64 20 62 2d 74 72    /* Shared b-tr
22780 65 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42  ee handle */.  B
22790 74 43 75 72 73 6f 72 20 2a 70 58 3b 20 20 20 20  tCursor *pX;    
227a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227b0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 69 6e 67        /* Looping
227c0 20 6f 76 65 72 20 6f 74 68 65 72 20 61 6c 6c 20   over other all 
227d0 63 75 72 73 6f 72 73 20 2a 2f 0a 0a 20 20 61 73  cursors */..  as
227e0 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
227f0 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
22800 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  );.  assert( wrF
22810 6c 61 67 3d 3d 30 20 0a 20 20 20 20 20 20 20 7c  lag==0 .       |
22820 7c 20 77 72 46 6c 61 67 3d 3d 42 54 52 45 45 5f  | wrFlag==BTREE_
22830 57 52 43 53 52 20 0a 20 20 20 20 20 20 20 7c 7c  WRCSR .       ||
22840 20 77 72 46 6c 61 67 3d 3d 28 42 54 52 45 45 5f   wrFlag==(BTREE_
22850 57 52 43 53 52 7c 42 54 52 45 45 5f 46 4f 52 44  WRCSR|BTREE_FORD
22860 45 4c 45 54 45 29 20 0a 20 20 29 3b 0a 0a 20 20  ELETE) .  );..  
22870 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
22880 20 61 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e   assert statemen
22890 74 73 20 76 65 72 69 66 79 20 74 68 61 74 20 69  ts verify that i
228a0 66 20 74 68 69 73 20 69 73 20 61 20 73 68 61 72  f this is a shar
228b0 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74 72 65  able .  ** b-tre
228c0 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  e database, the 
228d0 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f  connection is ho
228e0 6c 64 69 6e 67 20 74 68 65 20 72 65 71 75 69 72  lding the requir
228f0 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2c 20  ed table locks, 
22900 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61 74 20 6e  .  ** and that n
22910 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  o other connecti
22920 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70 65 6e 20  on has any open 
22930 63 75 72 73 6f 72 20 74 68 61 74 20 63 6f 6e 66  cursor that conf
22940 6c 69 63 74 73 20 77 69 74 68 20 0a 20 20 2a 2a  licts with .  **
22950 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a   this lock.  */.
22960 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
22970 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
22980 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 4b 65  k(p, iTable, pKe
22990 79 49 6e 66 6f 21 3d 30 2c 20 28 77 72 46 6c 61  yInfo!=0, (wrFla
229a0 67 3f 32 3a 31 29 29 20 29 3b 0a 20 20 61 73 73  g?2:1)) );.  ass
229b0 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c  ert( wrFlag==0 |
229c0 7c 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69  | !hasReadConfli
229d0 63 74 73 28 70 2c 20 69 54 61 62 6c 65 29 20 29  cts(p, iTable) )
229e0 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74  ;..  /* Assert t
229f0 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68  hat the caller h
22a00 61 73 20 6f 70 65 6e 65 64 20 74 68 65 20 72 65  as opened the re
22a10 71 75 69 72 65 64 20 74 72 61 6e 73 61 63 74 69  quired transacti
22a20 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  on. */.  assert(
22a30 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e   p->inTrans>TRAN
22a40 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65  S_NONE );.  asse
22a50 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c  rt( wrFlag==0 ||
22a60 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
22a70 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73  NS_WRITE );.  as
22a80 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65  sert( pBt->pPage
22a90 31 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31  1 && pBt->pPage1
22aa0 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73  ->aData );.  ass
22ab0 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c  ert( wrFlag==0 |
22ac0 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  | (pBt->btsFlags
22ad0 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59   & BTS_READ_ONLY
22ae0 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 77  )==0 );..  if( w
22af0 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 61 6c 6c  rFlag ){.    all
22b00 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 70  ocateTempSpace(p
22b10 42 74 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  Bt);.    if( pBt
22b20 2d 3e 70 54 6d 70 53 70 61 63 65 3d 3d 30 20 29  ->pTmpSpace==0 )
22b30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
22b40 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  OMEM_BKPT;.  }. 
22b50 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 31 20 26   if( iTable==1 &
22b60 26 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  & btreePagecount
22b70 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20  (pBt)==0 ){.    
22b80 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
22b90 30 20 29 3b 0a 20 20 20 20 69 54 61 62 6c 65 20  0 );.    iTable 
22ba0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  = 0;.  }..  /* N
22bb0 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ow that no other
22bc0 20 65 72 72 6f 72 73 20 63 61 6e 20 6f 63 63 75   errors can occu
22bd0 72 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e  r, finish fillin
22be0 67 20 69 6e 20 74 68 65 20 42 74 43 75 72 73 6f  g in the BtCurso
22bf0 72 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73  r.  ** variables
22c00 20 61 6e 64 20 6c 69 6e 6b 20 74 68 65 20 63 75   and link the cu
22c10 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20 42 74  rsor into the Bt
22c20 53 68 61 72 65 64 20 6c 69 73 74 2e 20 20 2a 2f  Shared list.  */
22c30 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  .  pCur->pgnoRoo
22c40 74 20 3d 20 28 50 67 6e 6f 29 69 54 61 62 6c 65  t = (Pgno)iTable
22c50 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20  ;.  pCur->iPage 
22c60 3d 20 2d 31 3b 0a 20 20 70 43 75 72 2d 3e 70 4b  = -1;.  pCur->pK
22c70 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66  eyInfo = pKeyInf
22c80 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 72 65  o;.  pCur->pBtre
22c90 65 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70  e = p;.  pCur->p
22ca0 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 43 75 72  Bt = pBt;.  pCur
22cb0 2d 3e 63 75 72 46 6c 61 67 73 20 3d 20 77 72 46  ->curFlags = wrF
22cc0 6c 61 67 20 3f 20 42 54 43 46 5f 57 72 69 74 65  lag ? BTCF_Write
22cd0 46 6c 61 67 20 3a 20 30 3b 0a 20 20 70 43 75 72  Flag : 0;.  pCur
22ce0 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73 20  ->curPagerFlags 
22cf0 3d 20 77 72 46 6c 61 67 20 3f 20 30 20 3a 20 50  = wrFlag ? 0 : P
22d00 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c  AGER_GET_READONL
22d10 59 3b 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  Y;.  /* If there
22d20 20 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65   are two or more
22d30 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20   cursors on the 
22d40 73 61 6d 65 20 62 74 72 65 65 2c 20 74 68 65 6e  same btree, then
22d50 20 61 6c 6c 20 73 75 63 68 0a 20 20 2a 2a 20 63   all such.  ** c
22d60 75 72 73 6f 72 73 20 2a 6d 75 73 74 2a 20 68 61  ursors *must* ha
22d70 76 65 20 74 68 65 20 42 54 43 46 5f 4d 75 6c 74  ve the BTCF_Mult
22d80 69 70 6c 65 20 66 6c 61 67 20 73 65 74 2e 20 2a  iple flag set. *
22d90 2f 0a 20 20 66 6f 72 28 70 58 3d 70 42 74 2d 3e  /.  for(pX=pBt->
22da0 70 43 75 72 73 6f 72 3b 20 70 58 3b 20 70 58 3d  pCursor; pX; pX=
22db0 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  pX->pNext){.    
22dc0 69 66 28 20 70 58 2d 3e 70 67 6e 6f 52 6f 6f 74  if( pX->pgnoRoot
22dd0 3d 3d 28 50 67 6e 6f 29 69 54 61 62 6c 65 20 29  ==(Pgno)iTable )
22de0 7b 0a 20 20 20 20 20 20 70 58 2d 3e 63 75 72 46  {.      pX->curF
22df0 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 4d 75 6c  lags |= BTCF_Mul
22e00 74 69 70 6c 65 3b 0a 20 20 20 20 20 20 70 43 75  tiple;.      pCu
22e10 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42  r->curFlags |= B
22e20 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20  TCF_Multiple;.  
22e30 20 20 7d 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e    }.  }.  pCur->
22e40 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 43 75  pNext = pBt->pCu
22e50 72 73 6f 72 3b 0a 20 20 70 42 74 2d 3e 70 43 75  rsor;.  pBt->pCu
22e60 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70  rsor = pCur;.  p
22e70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
22e80 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
22e90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
22ea0 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  ;.}.int sqlite3B
22eb0 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74  treeCursor(.  Bt
22ec0 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ree *p,         
22ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ee0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
22ef0 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20   btree */.  int 
22f00 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
22f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
22f30 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f  page of table to
22f40 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77   open */.  int w
22f50 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20  rFlag,          
22f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f70 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77         /* 1 to w
22f80 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c  rite. 0 read-onl
22f90 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65  y */.  struct Ke
22fa0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
22fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fc0 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20     /* First arg 
22fd0 74 6f 20 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f  to xCompare() */
22fe0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
22ff0 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
23000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23010 2a 20 57 72 69 74 65 20 6e 65 77 20 63 75 72 73  * Write new curs
23020 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  or here */.){.  
23030 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 69 54  int rc;.  if( iT
23040 61 62 6c 65 3c 31 20 29 7b 0a 20 20 20 20 72 63  able<1 ){.    rc
23050 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
23060 54 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b  T_BKPT;.  }else{
23070 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
23080 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 72  eEnter(p);.    r
23090 63 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72 28  c = btreeCursor(
230a0 70 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c 61  p, iTable, wrFla
230b0 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75  g, pKeyInfo, pCu
230c0 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  r);.    sqlite3B
230d0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
230e0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
230f0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
23100 68 65 20 73 69 7a 65 20 6f 66 20 61 20 42 74 43  he size of a BtC
23110 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20  ursor object in 
23120 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  bytes..**.** Thi
23130 73 20 69 6e 74 65 72 66 61 63 65 73 20 69 73 20  s interfaces is 
23140 6e 65 65 64 65 64 20 73 6f 20 74 68 61 74 20 75  needed so that u
23150 73 65 72 73 20 6f 66 20 63 75 72 73 6f 72 73 20  sers of cursors 
23160 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a  can preallocate.
23170 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73 74  ** sufficient st
23180 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64 20 61 20  orage to hold a 
23190 63 75 72 73 6f 72 2e 20 20 54 68 65 20 42 74 43  cursor.  The BtC
231a0 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 73 20  ursor object is 
231b0 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65  opaque.** to use
231c0 72 73 20 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f  rs so they canno
231d0 74 20 64 6f 20 74 68 65 20 73 69 7a 65 6f 66 28  t do the sizeof(
231e0 29 20 74 68 65 6d 73 65 6c 76 65 73 20 2d 20 74  ) themselves - t
231f0 68 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a  hey must call.**
23200 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
23210 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
23220 65 65 43 75 72 73 6f 72 53 69 7a 65 28 76 6f 69  eeCursorSize(voi
23230 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 52 4f 55  d){.  return ROU
23240 4e 44 38 28 73 69 7a 65 6f 66 28 42 74 43 75 72  ND8(sizeof(BtCur
23250 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  sor));.}../*.** 
23260 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72  Initialize memor
23270 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 63  y that will be c
23280 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20  onverted into a 
23290 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 2e  BtCursor object.
232a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 6d 70 6c  .**.** The simpl
232b0 65 20 61 70 70 72 6f 61 63 68 20 68 65 72 65 20  e approach here 
232c0 77 6f 75 6c 64 20 62 65 20 74 6f 20 6d 65 6d 73  would be to mems
232d0 65 74 28 29 20 74 68 65 20 65 6e 74 69 72 65 20  et() the entire 
232e0 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a 65 72  object.** to zer
232f0 6f 2e 20 20 42 75 74 20 69 74 20 74 75 72 6e 73  o.  But it turns
23300 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 61 70   out that the ap
23310 50 61 67 65 5b 5d 20 61 6e 64 20 61 69 49 64 78  Page[] and aiIdx
23320 5b 5d 20 61 72 72 61 79 73 0a 2a 2a 20 64 6f 20  [] arrays.** do 
23330 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 7a  not need to be z
23340 65 72 6f 65 64 20 61 6e 64 20 74 68 65 79 20 61  eroed and they a
23350 72 65 20 6c 61 72 67 65 2c 20 73 6f 20 77 65 20  re large, so we 
23360 63 61 6e 20 73 61 76 65 20 61 20 6c 6f 74 0a 2a  can save a lot.*
23370 2a 20 6f 66 20 72 75 6e 2d 74 69 6d 65 20 62 79  * of run-time by
23380 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e   skipping the in
23390 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20  itialization of 
233a0 74 68 6f 73 65 20 65 6c 65 6d 65 6e 74 73 2e 0a  those elements..
233b0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
233c0 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 42  treeCursorZero(B
233d0 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 6d  tCursor *p){.  m
233e0 65 6d 73 65 74 28 70 2c 20 30 2c 20 6f 66 66 73  emset(p, 0, offs
233f0 65 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 69  etof(BtCursor, i
23400 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Page));.}../*.**
23410 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e   Close a cursor.
23420 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20    The read lock 
23430 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
23440 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64  file is released
23450 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73  .** when the las
23460 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73  t cursor is clos
23470 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
23480 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
23490 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  or(BtCursor *pCu
234a0 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74  r){.  Btree *pBt
234b0 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42 74 72  ree = pCur->pBtr
234c0 65 65 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65  ee;.  if( pBtree
234d0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
234e0 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
234f0 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20   = pCur->pBt;.  
23500 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
23510 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20  ter(pBtree);.   
23520 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
23530 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a  arCursor(pCur);.
23540 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
23550 3e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20  >pCursor!=0 );. 
23560 20 20 20 69 66 28 20 70 42 74 2d 3e 70 43 75 72     if( pBt->pCur
23570 73 6f 72 3d 3d 70 43 75 72 20 29 7b 0a 20 20 20  sor==pCur ){.   
23580 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20     pBt->pCursor 
23590 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
235a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
235b0 42 74 43 75 72 73 6f 72 20 2a 70 50 72 65 76 20  BtCursor *pPrev 
235c0 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a  = pBt->pCursor;.
235d0 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20        do{.      
235e0 20 20 69 66 28 20 70 50 72 65 76 2d 3e 70 4e 65    if( pPrev->pNe
235f0 78 74 3d 3d 70 43 75 72 20 29 7b 0a 20 20 20 20  xt==pCur ){.    
23600 20 20 20 20 20 20 70 50 72 65 76 2d 3e 70 4e 65        pPrev->pNe
23610 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74  xt = pCur->pNext
23620 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
23630 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
23640 20 20 20 20 20 70 50 72 65 76 20 3d 20 70 50 72       pPrev = pPr
23650 65 76 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ev->pNext;.     
23660 20 7d 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28   }while( ALWAYS(
23670 70 50 72 65 76 29 20 29 3b 0a 20 20 20 20 7d 0a  pPrev) );.    }.
23680 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d      for(i=0; i<=
23690 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b  pCur->iPage; i++
236a0 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
236b0 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67  Page(pCur->apPag
236c0 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e[i]);.    }.   
236d0 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
236e0 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 73  used(pBt);.    s
236f0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
23700 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20  ->aOverflow);.  
23710 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72 65    /* sqlite3_fre
23720 65 28 70 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20  e(pCur); */.    
23730 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
23740 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20  e(pBtree);.  }. 
23750 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
23760 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  K;.}../*.** Make
23770 20 73 75 72 65 20 74 68 65 20 42 74 43 75 72 73   sure the BtCurs
23780 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65  or* given in the
23790 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61 20   argument has a 
237a0 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f  valid.** BtCurso
237b0 72 2e 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  r.info structure
237c0 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  .  If it is not 
237d0 61 6c 72 65 61 64 79 20 76 61 6c 69 64 2c 20 63  already valid, c
237e0 61 6c 6c 0a 2a 2a 20 62 74 72 65 65 50 61 72 73  all.** btreePars
237f0 65 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20  eCell() to fill 
23800 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43  it in..**.** BtC
23810 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20  ursor.info is a 
23820 63 61 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66  cache of the inf
23830 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  ormation in the 
23840 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a  current cell..**
23850 20 55 73 69 6e 67 20 74 68 69 73 20 63 61 63 68   Using this cach
23860 65 20 72 65 64 75 63 65 73 20 74 68 65 20 6e 75  e reduces the nu
23870 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f  mber of calls to
23880 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
23890 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  )..*/.#ifndef ND
238a0 45 42 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f  EBUG.  static vo
238b0 69 64 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66  id assertCellInf
238c0 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  o(BtCursor *pCur
238d0 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20  ){.    CellInfo 
238e0 69 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20 69 50  info;.    int iP
238f0 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67  age = pCur->iPag
23900 65 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69  e;.    memset(&i
23910 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69  nfo, 0, sizeof(i
23920 6e 66 6f 29 29 3b 0a 20 20 20 20 62 74 72 65 65  nfo));.    btree
23930 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e  ParseCell(pCur->
23940 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 20 70  apPage[iPage], p
23950 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65  Cur->aiIdx[iPage
23960 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61  ], &info);.    a
23970 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
23980 42 20 7c 7c 20 6d 65 6d 63 6d 70 28 26 69 6e 66  B || memcmp(&inf
23990 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20  o, &pCur->info, 
239a0 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30  sizeof(info))==0
239b0 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20   );.  }.#else.  
239c0 23 64 65 66 69 6e 65 20 61 73 73 65 72 74 43 65  #define assertCe
239d0 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66  llInfo(x).#endif
239e0 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
239f0 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 67 65 74  OINLINE void get
23a00 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f  CellInfo(BtCurso
23a10 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 66 28 20  r *pCur){.  if( 
23a20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
23a30 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==0 ){.    int i
23a40 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61  Page = pCur->iPa
23a50 67 65 3b 0a 20 20 20 20 70 43 75 72 2d 3e 63 75  ge;.    pCur->cu
23a60 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56  rFlags |= BTCF_V
23a70 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20 62 74  alidNKey;.    bt
23a80 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75  reeParseCell(pCu
23a90 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d  r->apPage[iPage]
23aa0 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61  ,pCur->aiIdx[iPa
23ab0 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29  ge],&pCur->info)
23ac0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
23ad0 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43  ssertCellInfo(pC
23ae0 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e  ur);.  }.}..#ifn
23af0 64 65 66 20 4e 44 45 42 55 47 20 20 2f 2a 20 54  def NDEBUG  /* T
23b00 68 65 20 6e 65 78 74 20 72 6f 75 74 69 6e 65 20  he next routine 
23b10 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e  used only within
23b20 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
23b30 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65  ents */./*.** Re
23b40 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
23b50 20 67 69 76 65 6e 20 42 74 43 75 72 73 6f 72 20   given BtCursor 
23b60 69 73 20 76 61 6c 69 64 2e 20 20 41 20 76 61 6c  is valid.  A val
23b70 69 64 20 63 75 72 73 6f 72 20 69 73 20 6f 6e 65  id cursor is one
23b80 0a 2a 2a 20 74 68 61 74 20 69 73 20 63 75 72 72  .** that is curr
23b90 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74  ently pointing t
23ba0 6f 20 61 20 72 6f 77 20 69 6e 20 61 20 28 6e 6f  o a row in a (no
23bb0 6e 2d 65 6d 70 74 79 29 20 74 61 62 6c 65 2e 0a  n-empty) table..
23bc0 2a 2a 20 54 68 69 73 20 69 73 20 61 20 76 65 72  ** This is a ver
23bd0 69 66 69 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e  ification routin
23be0 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 77  e is used only w
23bf0 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 73  ithin assert() s
23c00 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e  tatements..*/.in
23c10 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
23c20 72 73 6f 72 49 73 56 61 6c 69 64 28 42 74 43 75  rsorIsValid(BtCu
23c30 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72  rsor *pCur){.  r
23c40 65 74 75 72 6e 20 70 43 75 72 20 26 26 20 70 43  eturn pCur && pC
23c50 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
23c60 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64  OR_VALID;.}.#end
23c70 69 66 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a  if /* NDEBUG */.
23c80 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
23c90 43 75 72 73 6f 72 49 73 56 61 6c 69 64 4e 4e 28  CursorIsValidNN(
23ca0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
23cb0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21  .  assert( pCur!
23cc0 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  =0 );.  return p
23cd0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
23ce0 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a  SOR_VALID;.}../*
23cf0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76  .** Return the v
23d00 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65  alue of the inte
23d10 67 65 72 20 6b 65 79 20 6f 72 20 22 72 6f 77 69  ger key or "rowi
23d20 64 22 20 66 6f 72 20 61 20 74 61 62 6c 65 20 62  d" for a table b
23d30 74 72 65 65 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  tree..** This ro
23d40 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 76 61  utine is only va
23d50 6c 69 64 20 66 6f 72 20 61 20 63 75 72 73 6f 72  lid for a cursor
23d60 20 74 68 61 74 20 69 73 20 70 6f 69 6e 74 69 6e   that is pointin
23d70 67 20 69 6e 74 6f 20 61 0a 2a 2a 20 6f 72 64 69  g into a.** ordi
23d80 6e 61 72 79 20 74 61 62 6c 65 20 62 74 72 65 65  nary table btree
23d90 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  .  If the cursor
23da0 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 69 6e   points to an in
23db0 64 65 78 20 62 74 72 65 65 20 6f 72 0a 2a 2a 20  dex btree or.** 
23dc0 69 73 20 69 6e 76 61 6c 69 64 2c 20 74 68 65 20  is invalid, the 
23dd0 72 65 73 75 6c 74 20 6f 66 20 74 68 69 73 20 72  result of this r
23de0 6f 75 74 69 6e 65 20 69 73 20 75 6e 64 65 66 69  outine is undefi
23df0 6e 65 64 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69  ned..*/.i64 sqli
23e00 74 65 33 42 74 72 65 65 49 6e 74 65 67 65 72 4b  te3BtreeIntegerK
23e10 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ey(BtCursor *pCu
23e20 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  r){.  assert( cu
23e30 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
23e40 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
23e50 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
23e60 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
23e70 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
23e80 63 75 72 49 6e 74 4b 65 79 20 29 3b 0a 20 20 67  curIntKey );.  g
23e90 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
23ea0 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d  ;.  return pCur-
23eb0 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 7d 0a 0a 2f  >info.nKey;.}../
23ec0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
23ed0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
23ee0 6f 66 20 70 61 79 6c 6f 61 64 20 66 6f 72 20 74  of payload for t
23ef0 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 70 43  he entry that pC
23f00 75 72 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74  ur is.** current
23f10 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  ly pointing to. 
23f20 20 46 6f 72 20 74 61 62 6c 65 20 62 74 72 65 65   For table btree
23f30 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20  s, this will be 
23f40 74 68 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66  the amount.** of
23f50 20 64 61 74 61 2e 20 20 46 6f 72 20 69 6e 64 65   data.  For inde
23f60 78 20 62 74 72 65 65 73 2c 20 74 68 69 73 20 77  x btrees, this w
23f70 69 6c 6c 20 62 65 20 74 68 65 20 73 69 7a 65 20  ill be the size 
23f80 6f 66 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a  of the key..**.*
23f90 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  * The caller mus
23fa0 74 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  t guarantee that
23fb0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70   the cursor is p
23fc0 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 6e 6f 6e  ointing to a non
23fd0 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64 20 65  -NULL.** valid e
23fe0 6e 74 72 79 2e 20 20 49 6e 20 6f 74 68 65 72 20  ntry.  In other 
23ff0 77 6f 72 64 73 2c 20 74 68 65 20 63 61 6c 6c 69  words, the calli
24000 6e 67 20 70 72 6f 63 65 64 75 72 65 20 6d 75 73  ng procedure mus
24010 74 20 67 75 61 72 61 6e 74 65 65 0a 2a 2a 20 74  t guarantee.** t
24020 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 68  hat the cursor h
24030 61 73 20 43 75 72 73 6f 72 2e 65 53 74 61 74 65  as Cursor.eState
24040 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a  ==CURSOR_VALID..
24050 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 42 74  */.u32 sqlite3Bt
24060 72 65 65 50 61 79 6c 6f 61 64 53 69 7a 65 28 42  reePayloadSize(B
24070 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
24080 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
24090 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
240a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
240b0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
240c0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 67 65  OR_VALID );.  ge
240d0 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
240e0 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e  .  return pCur->
240f0 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a 7d  info.nPayload;.}
24100 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68  ../*.** Given th
24110 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
24120 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
24130 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
24140 65 20 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20  e (parameter.** 
24150 6f 76 66 6c 29 2c 20 74 68 69 73 20 66 75 6e 63  ovfl), this func
24160 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 70  tion finds the p
24170 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
24180 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
24190 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69  he .** linked li
241a0 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70  st of overflow p
241b0 61 67 65 73 2e 20 49 66 20 70 6f 73 73 69 62 6c  ages. If possibl
241c0 65 2c 20 69 74 20 75 73 65 73 20 74 68 65 20 61  e, it uses the a
241d0 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f  uto-vacuum.** po
241e0 69 6e 74 65 72 2d 6d 61 70 20 64 61 74 61 20 69  inter-map data i
241f0 6e 73 74 65 61 64 20 6f 66 20 72 65 61 64 69 6e  nstead of readin
24200 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  g the content of
24210 20 70 61 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f   page ovfl to do
24220 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61   so. .**.** If a
24230 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61  n error occurs a
24240 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
24250 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
24260 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a   Otherwise:.**.*
24270 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
24280 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6f 76  r of the next ov
24290 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74  erflow page in t
242a0 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69  he linked list i
242b0 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f  s .** written to
242c0 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20   *pPgnoNext. If 
242d0 70 61 67 65 20 6f 76 66 6c 20 69 73 20 74 68 65  page ovfl is the
242e0 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 69 74   last page in it
242f0 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73  s linked .** lis
24300 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73  t, *pPgnoNext is
24310 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a   set to zero. .*
24320 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67 65 20 69  *.** If ppPage i
24330 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64 20  s not NULL, and 
24340 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
24350 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63  he MemPage objec
24360 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  t corresponding.
24370 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65  ** to page numbe
24380 72 20 70 4f 76 66 6c 20 77 61 73 20 6f 62 74 61  r pOvfl was obta
24390 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70 50 61  ined, then *ppPa
243a0 67 65 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  ge is set to poi
243b0 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 72 65  nt to that.** re
243c0 66 65 72 65 6e 63 65 2e 20 49 74 20 69 73 20 74  ference. It is t
243d0 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
243e0 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
243f0 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65 50  to call releaseP
24400 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50  age().** on *ppP
24410 61 67 65 20 74 6f 20 66 72 65 65 20 74 68 65 20  age to free the 
24420 72 65 66 65 72 65 6e 63 65 2e 20 49 6e 20 6e 6f  reference. In no
24430 20 72 65 66 65 72 65 6e 63 65 20 77 61 73 20 6f   reference was o
24440 62 74 61 69 6e 65 64 20 28 62 65 63 61 75 73 65  btained (because
24450 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  .** the pointer-
24460 6d 61 70 20 77 61 73 20 75 73 65 64 20 74 6f 20  map was used to 
24470 6f 62 74 61 69 6e 20 74 68 65 20 76 61 6c 75 65  obtain the value
24480 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78 74 29   for *pPgnoNext)
24490 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50 61 67  , then.** *ppPag
244a0 65 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  e is set to zero
244b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
244c0 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
244d0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
244e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
244f0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
24500 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f  file */.  Pgno o
24510 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  vfl,            
24520 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
24530 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
24540 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 4d 65 6d 50  number */.  MemP
24550 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
24560 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
24570 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c 65 20   MemPage handle 
24580 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 2a 2f  (may be NULL) */
24590 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65  .  Pgno *pPgnoNe
245a0 78 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  xt              
245b0 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65  /* OUT: Next ove
245c0 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65  rflow page numbe
245d0 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e  r */.){.  Pgno n
245e0 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  ext = 0;.  MemPa
245f0 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20  ge *pPage = 0;. 
24600 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
24610 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
24620 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
24630 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
24640 3b 0a 20 20 61 73 73 65 72 74 28 70 50 67 6e 6f  ;.  assert(pPgno
24650 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20  Next);..#ifndef 
24660 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
24670 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20  VACUUM.  /* Try 
24680 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65 78 74  to find the next
24690 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65   page in the ove
246a0 72 66 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e 67  rflow list using
246b0 20 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61   the.  ** autova
246c0 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70  cuum pointer-map
246d0 20 70 61 67 65 73 2e 20 47 75 65 73 73 20 74 68   pages. Guess th
246e0 61 74 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  at the next page
246f0 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76   in .  ** the ov
24700 65 72 66 6c 6f 77 20 6c 69 73 74 20 69 73 20 70  erflow list is p
24710 61 67 65 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c  age number (ovfl
24720 2b 31 29 2e 20 49 66 20 74 68 61 74 20 67 75 65  +1). If that gue
24730 73 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f  ss turns .  ** o
24740 75 74 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20  ut to be wrong, 
24750 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61  fall back to loa
24760 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 6f 66  ding the data of
24770 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62   page .  ** numb
24780 65 72 20 6f 76 66 6c 20 74 6f 20 64 65 74 65 72  er ovfl to deter
24790 6d 69 6e 65 20 74 68 65 20 6e 65 78 74 20 70 61  mine the next pa
247a0 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a  ge number..  */.
247b0 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
247c0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e  acuum ){.    Pgn
247d0 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f  o pgno;.    Pgno
247e0 20 69 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31   iGuess = ovfl+1
247f0 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a  ;.    u8 eType;.
24800 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d  .    while( PTRM
24810 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
24820 47 75 65 73 73 29 20 7c 7c 20 69 47 75 65 73 73  Guess) || iGuess
24830 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
24840 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
24850 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20    iGuess++;.    
24860 7d 0a 0a 20 20 20 20 69 66 28 20 69 47 75 65 73  }..    if( iGues
24870 73 3c 3d 62 74 72 65 65 50 61 67 65 63 6f 75 6e  s<=btreePagecoun
24880 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  t(pBt) ){.      
24890 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
248a0 42 74 2c 20 69 47 75 65 73 73 2c 20 26 65 54 79  Bt, iGuess, &eTy
248b0 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20  pe, &pgno);.    
248c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
248d0 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d 50 54  _OK && eType==PT
248e0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26  RMAP_OVERFLOW2 &
248f0 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a  & pgno==ovfl ){.
24900 20 20 20 20 20 20 20 20 6e 65 78 74 20 3d 20 69          next = i
24910 47 75 65 73 73 3b 0a 20 20 20 20 20 20 20 20 72  Guess;.        r
24920 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
24930 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
24940 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73   }.#endif..  ass
24950 65 72 74 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20  ert( next==0 || 
24960 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
24970 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
24980 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
24990 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
249a0 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67  pBt, ovfl, &pPag
249b0 65 2c 20 28 70 70 50 61 67 65 3d 3d 30 29 20 3f  e, (ppPage==0) ?
249c0 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f   PAGER_GET_READO
249d0 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 20 20 61 73  NLY : 0);.    as
249e0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
249f0 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30 20  _OK || pPage==0 
24a00 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
24a10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
24a20 20 20 6e 65 78 74 20 3d 20 67 65 74 34 62 79 74    next = get4byt
24a30 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b  e(pPage->aData);
24a40 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70  .    }.  }..  *p
24a50 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b  PgnoNext = next;
24a60 0a 20 20 69 66 28 20 70 70 50 61 67 65 20 29 7b  .  if( ppPage ){
24a70 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70  .    *ppPage = p
24a80 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Page;.  }else{. 
24a90 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
24aa0 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Page);.  }.  ret
24ab0 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  urn (rc==SQLITE_
24ac0 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f 4b  DONE ? SQLITE_OK
24ad0 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   : rc);.}../*.**
24ae0 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   Copy data from 
24af0 61 20 62 75 66 66 65 72 20 74 6f 20 61 20 70 61  a buffer to a pa
24b00 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70 61  ge, or from a pa
24b10 67 65 20 74 6f 20 61 20 62 75 66 66 65 72 2e 0a  ge to a buffer..
24b20 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69  **.** pPayload i
24b30 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64  s a pointer to d
24b40 61 74 61 20 73 74 6f 72 65 64 20 6f 6e 20 64 61  ata stored on da
24b50 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50  tabase page pDbP
24b60 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d  age..** If argum
24b70 65 6e 74 20 65 4f 70 20 69 73 20 66 61 6c 73 65  ent eOp is false
24b80 2c 20 74 68 65 6e 20 6e 42 79 74 65 20 62 79 74  , then nByte byt
24b90 65 73 20 6f 66 20 64 61 74 61 20 61 72 65 20 63  es of data are c
24ba0 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50  opied.** from pP
24bb0 61 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 62 75  ayload to the bu
24bc0 66 66 65 72 20 70 6f 69 6e 74 65 64 20 61 74 20  ffer pointed at 
24bd0 62 79 20 70 42 75 66 2e 20 49 66 20 65 4f 70 20  by pBuf. If eOp 
24be0 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e  is true,.** then
24bf0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
24c00 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f  te() is called o
24c10 6e 20 70 44 62 50 61 67 65 20 61 6e 64 20 6e 42  n pDbPage and nB
24c20 79 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20  yte bytes.** of 
24c30 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 20  data are copied 
24c40 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20  from the buffer 
24c50 70 42 75 66 20 74 6f 20 70 50 61 79 6c 6f 61 64  pBuf to pPayload
24c60 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
24c70 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
24c80 20 73 75 63 63 65 73 73 2c 20 6f 74 68 65 72 77   success, otherw
24c90 69 73 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ise an error cod
24ca0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
24cb0 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20 20   copyPayload(.  
24cc0 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20  void *pPayload, 
24cd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
24ce0 6e 74 65 72 20 74 6f 20 70 61 67 65 20 64 61 74  nter to page dat
24cf0 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75  a */.  void *pBu
24d00 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
24d10 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62   /* Pointer to b
24d20 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  uffer */.  int n
24d30 42 79 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  Byte,           
24d40 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
24d50 66 20 62 79 74 65 73 20 74 6f 20 63 6f 70 79 20  f bytes to copy 
24d60 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20 20  */.  int eOp,   
24d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24d80 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d  * 0 -> copy from
24d90 20 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79   page, 1 -> copy
24da0 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44 62   to page */.  Db
24db0 50 61 67 65 20 2a 70 44 62 50 61 67 65 20 20 20  Page *pDbPage   
24dc0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
24dd0 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61 79 6c  containing pPayl
24de0 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  oad */.){.  if( 
24df0 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f  eOp ){.    /* Co
24e00 70 79 20 64 61 74 61 20 66 72 6f 6d 20 62 75 66  py data from buf
24e10 66 65 72 20 74 6f 20 70 61 67 65 20 28 61 20 77  fer to page (a w
24e20 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 29 20  rite operation) 
24e30 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  */.    int rc = 
24e40 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
24e50 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  e(pDbPage);.    
24e60 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
24e70 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
24e80 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
24e90 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c  memcpy(pPayload,
24ea0 20 70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20   pBuf, nByte);. 
24eb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43   }else{.    /* C
24ec0 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 70 61  opy data from pa
24ed0 67 65 20 74 6f 20 62 75 66 66 65 72 20 28 61 20  ge to buffer (a 
24ee0 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 29 20  read operation) 
24ef0 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 42  */.    memcpy(pB
24f00 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42  uf, pPayload, nB
24f10 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  yte);.  }.  retu
24f20 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
24f30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
24f40 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
24f50 72 65 61 64 20 6f 72 20 6f 76 65 72 77 72 69 74  read or overwrit
24f60 65 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d  e payload inform
24f70 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65  ation.** for the
24f80 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
24f90 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70  pCur cursor is p
24fa0 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 54 68 65 20  ointing to. The 
24fb0 65 4f 70 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20  eOp.** argument 
24fc0 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
24fd0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
24fe0 20 20 20 30 3a 20 54 68 65 20 6f 70 65 72 61 74     0: The operat
24ff0 69 6f 6e 20 69 73 20 61 20 72 65 61 64 2e 20 50  ion is a read. P
25000 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72  opulate the over
25010 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 20 20  flow cache..**  
25020 20 31 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f   1: The operatio
25030 6e 20 69 73 20 61 20 77 72 69 74 65 2e 20 50 6f  n is a write. Po
25040 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66  pulate the overf
25050 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 20 20 20  low cache..**   
25060 32 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e  2: The operation
25070 20 69 73 20 61 20 72 65 61 64 2e 20 44 6f 20 6e   is a read. Do n
25080 6f 74 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  ot populate the 
25090 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a  overflow cache..
250a0 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66  **.** A total of
250b0 20 22 61 6d 74 22 20 62 79 74 65 73 20 61 72 65   "amt" bytes are
250c0 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
250d0 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f   beginning at "o
250e0 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20  ffset"..** Data 
250f0 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66 72  is read to or fr
25100 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42  om the buffer pB
25110 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  uf..**.** The co
25120 6e 74 65 6e 74 20 62 65 69 6e 67 20 72 65 61 64  ntent being read
25130 20 6f 72 20 77 72 69 74 74 65 6e 20 6d 69 67 68   or written migh
25140 74 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20  t appear on the 
25150 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20 6f 72 20  main page.** or 
25160 62 65 20 73 63 61 74 74 65 72 65 64 20 6f 75 74  be scattered out
25170 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65   on multiple ove
25180 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 0a  rflow pages..**.
25190 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  ** If the curren
251a0 74 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20 75  t cursor entry u
251b0 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ses one or more 
251c0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
251d0 6e 64 20 74 68 65 0a 2a 2a 20 65 4f 70 20 61 72  nd the.** eOp ar
251e0 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 32 2c  gument is not 2,
251f0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   this function m
25200 61 79 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63  ay allocate spac
25210 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79  e for and lazily
25220 20 0a 2a 2a 20 70 6f 70 75 6c 61 74 65 73 20 74   .** populates t
25230 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
25240 2d 6c 69 73 74 20 63 61 63 68 65 20 61 72 72 61  -list cache arra
25250 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76 65  y (BtCursor.aOve
25260 72 66 6c 6f 77 29 2e 20 0a 2a 2a 20 53 75 62 73  rflow). .** Subs
25270 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 75 73 65  equent calls use
25280 20 74 68 69 73 20 63 61 63 68 65 20 74 6f 20 6d   this cache to m
25290 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20 74  ake seeking to t
252a0 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66 73  he supplied offs
252b0 65 74 20 0a 2a 2a 20 6d 6f 72 65 20 65 66 66 69  et .** more effi
252c0 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63  cient..**.** Onc
252d0 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
252e0 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61  ge-list cache ha
252f0 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
25300 2c 20 69 74 20 6d 61 79 20 62 65 0a 2a 2a 20 69  , it may be.** i
25310 6e 76 61 6c 69 64 61 74 65 64 20 69 66 20 73 6f  nvalidated if so
25320 6d 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72 20  me other cursor 
25330 77 72 69 74 65 73 20 74 6f 20 74 68 65 20 73 61  writes to the sa
25340 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a  me table, or if.
25350 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  ** the cursor is
25360 20 6d 6f 76 65 64 20 74 6f 20 61 20 64 69 66 66   moved to a diff
25370 65 72 65 6e 74 20 72 6f 77 2e 20 41 64 64 69 74  erent row. Addit
25380 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f  ionally, in auto
25390 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c  -vacuum.** mode,
253a0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65   the following e
253b0 76 65 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c 69  vents may invali
253c0 64 61 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  date an overflow
253d0 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
253e0 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69  ..**.**   * An i
253f0 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
25400 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d  m,.**   * A comm
25410 69 74 20 69 6e 20 61 75 74 6f 5f 76 61 63 75 75  it in auto_vacuu
25420 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a  m="full" mode,.*
25430 2a 20 20 20 2a 20 43 72 65 61 74 69 6e 67 20 61  *   * Creating a
25440 20 74 61 62 6c 65 20 28 6d 61 79 20 72 65 71 75   table (may requ
25450 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76  ire moving an ov
25460 65 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f  erflow page)..*/
25470 0a 73 74 61 74 69 63 20 69 6e 74 20 61 63 63 65  .static int acce
25480 73 73 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43  ssPayload(.  BtC
25490 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
254a0 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e    /* Cursor poin
254b0 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f  ting to entry to
254c0 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
254d0 75 33 32 20 6f 66 66 73 65 74 2c 20 20 20 20 20  u32 offset,     
254e0 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65       /* Begin re
254f0 61 64 69 6e 67 20 74 68 69 73 20 66 61 72 20 69  ading this far i
25500 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20  nto payload */. 
25510 20 75 33 32 20 61 6d 74 2c 20 20 20 20 20 20 20   u32 amt,       
25520 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68        /* Read th
25530 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f  is many bytes */
25540 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
25550 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69 74 65   *pBuf, /* Write
25560 20 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f 20   the bytes into 
25570 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 20 0a  this buffer */ .
25580 20 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20 20    int eOp       
25590 20 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74         /* zero t
255a0 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f  o read. non-zero
255b0 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b   to write. */.){
255c0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
255d0 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e   *aPayload;.  in
255e0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
255f0 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30  ;.  int iIdx = 0
25600 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
25610 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
25620 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 20  e[pCur->iPage]; 
25630 2f 2a 20 42 74 72 65 65 20 70 61 67 65 20 6f 66  /* Btree page of
25640 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20 2a   current entry *
25650 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
25660 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 20 20  t = pCur->pBt;  
25670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25680 2f 2a 20 42 74 72 65 65 20 74 68 69 73 20 63 75  /* Btree this cu
25690 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20  rsor belongs to 
256a0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
256b0 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57  _DIRECT_OVERFLOW
256c0 5f 52 45 41 44 0a 20 20 75 6e 73 69 67 6e 65 64  _READ.  unsigned
256d0 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 70 42   char * const pB
256e0 75 66 53 74 61 72 74 20 3d 20 70 42 75 66 3b 0a  ufStart = pBuf;.
256f0 20 20 69 6e 74 20 62 45 6e 64 3b 20 20 20 20 20    int bEnd;     
25700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25710 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
25720 72 75 65 20 69 66 20 72 65 61 64 69 6e 67 20 74  rue if reading t
25730 6f 20 65 6e 64 20 6f 66 20 64 61 74 61 20 2a 2f  o end of data */
25740 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
25750 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20 61 73  t( pPage );.  as
25760 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
25770 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
25780 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
25790 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
257a0 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43  iPage]<pPage->nC
257b0 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ell );.  assert(
257c0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
257d0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
257e0 65 72 74 28 20 65 4f 70 21 3d 32 20 7c 7c 20 6f  ert( eOp!=2 || o
257f0 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 2f  ffset==0 );    /
25800 2a 20 41 6c 77 61 79 73 20 73 74 61 72 74 20 66  * Always start f
25810 72 6f 6d 20 62 65 67 69 6e 6e 69 6e 67 20 66 6f  rom beginning fo
25820 72 20 65 4f 70 3d 3d 32 20 2a 2f 0a 0a 20 20 67  r eOp==2 */..  g
25830 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
25840 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70  ;.  aPayload = p
25850 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f  Cur->info.pPaylo
25860 61 64 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ad;.#ifdef SQLIT
25870 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f  E_DIRECT_OVERFLO
25880 57 5f 52 45 41 44 0a 20 20 62 45 6e 64 20 3d 20  W_READ.  bEnd = 
25890 6f 66 66 73 65 74 2b 61 6d 74 3d 3d 70 43 75 72  offset+amt==pCur
258a0 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b  ->info.nPayload;
258b0 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
258c0 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20  ( offset+amt <= 
258d0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c  pCur->info.nPayl
258e0 6f 61 64 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  oad );..  assert
258f0 28 20 61 50 61 79 6c 6f 61 64 20 3e 20 70 50 61  ( aPayload > pPa
25900 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 69  ge->aData );.  i
25910 66 28 20 28 75 70 74 72 29 28 61 50 61 79 6c 6f  f( (uptr)(aPaylo
25920 61 64 20 2d 20 70 50 61 67 65 2d 3e 61 44 61 74  ad - pPage->aDat
25930 61 29 20 3e 20 28 70 42 74 2d 3e 75 73 61 62 6c  a) > (pBt->usabl
25940 65 53 69 7a 65 20 2d 20 70 43 75 72 2d 3e 69 6e  eSize - pCur->in
25950 66 6f 2e 6e 4c 6f 63 61 6c 29 20 29 7b 0a 20 20  fo.nLocal) ){.  
25960 20 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20 72    /* Trying to r
25970 65 61 64 20 6f 72 20 77 72 69 74 65 20 70 61 73  ead or write pas
25980 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
25990 20 64 61 74 61 20 69 73 20 61 6e 20 65 72 72 6f   data is an erro
259a0 72 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 63  r.  The.    ** c
259b0 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65  onditional above
259c0 20 69 73 20 72 65 61 6c 6c 79 3a 0a 20 20 20 20   is really:.    
259d0 2a 2a 20 20 20 20 26 61 50 61 79 6c 6f 61 64 5b  **    &aPayload[
259e0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
259f0 6c 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61 44 61  l] > &pPage->aDa
25a00 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ta[pBt->usableSi
25a10 7a 65 5d 0a 20 20 20 20 2a 2a 20 62 75 74 20 69  ze].    ** but i
25a20 73 20 72 65 63 61 73 74 20 69 6e 74 6f 20 69 74  s recast into it
25a30 73 20 63 75 72 72 65 6e 74 20 66 6f 72 6d 20 74  s current form t
25a40 6f 20 61 76 6f 69 64 20 69 6e 74 65 67 65 72 20  o avoid integer 
25a50 6f 76 65 72 66 6c 6f 77 20 70 72 6f 62 6c 65 6d  overflow problem
25a60 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74  s.    */.    ret
25a70 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
25a80 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  PT_BKPT;.  }..  
25a90 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61 74 61  /* Check if data
25aa0 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f 77 72   must be read/wr
25ab0 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68  itten to/from th
25ac0 65 20 62 74 72 65 65 20 70 61 67 65 20 69 74 73  e btree page its
25ad0 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66  elf. */.  if( of
25ae0 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e  fset<pCur->info.
25af0 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e  nLocal ){.    in
25b00 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69  t a = amt;.    i
25b10 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72  f( a+offset>pCur
25b20 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b  ->info.nLocal ){
25b30 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d  .      a = pCur-
25b40 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f  >info.nLocal - o
25b50 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20  ffset;.    }.   
25b60 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61   rc = copyPayloa
25b70 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73  d(&aPayload[offs
25b80 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20 28 65  et], pBuf, a, (e
25b90 4f 70 20 26 20 30 78 30 31 29 2c 20 70 50 61 67  Op & 0x01), pPag
25ba0 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
25bb0 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20   offset = 0;.   
25bc0 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20   pBuf += a;.    
25bd0 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73  amt -= a;.  }els
25be0 65 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d  e{.    offset -=
25bf0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
25c00 61 6c 3b 0a 20 20 7d 0a 0a 0a 20 20 69 66 28 20  al;.  }...  if( 
25c10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
25c20 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f   amt>0 ){.    co
25c30 6e 73 74 20 75 33 32 20 6f 76 66 6c 53 69 7a 65  nst u32 ovflSize
25c40 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
25c50 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65  ze - 4;  /* Byte
25c60 73 20 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76  s content per ov
25c70 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50  fl page */.    P
25c80 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20  gno nextPage;.. 
25c90 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65     nextPage = ge
25ca0 74 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61 64  t4byte(&aPayload
25cb0 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  [pCur->info.nLoc
25cc0 61 6c 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  al]);..    /* If
25cd0 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 61 4f   the BtCursor.aO
25ce0 76 65 72 66 6c 6f 77 5b 5d 20 68 61 73 20 6e 6f  verflow[] has no
25cf0 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  t been allocated
25d00 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f  , allocate it no
25d10 77 2e 0a 20 20 20 20 2a 2a 20 45 78 63 65 70 74  w..    ** Except
25d20 2c 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 63 61 74  , do not allocat
25d30 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 66 6f  e aOverflow[] fo
25d40 72 20 65 4f 70 3d 3d 32 2e 0a 20 20 20 20 2a 2a  r eOp==2..    **
25d50 0a 20 20 20 20 2a 2a 20 54 68 65 20 61 4f 76 65  .    ** The aOve
25d60 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 69 73  rflow[] array is
25d70 20 73 69 7a 65 64 20 61 74 20 6f 6e 65 20 65 6e   sized at one en
25d80 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65  try for each ove
25d90 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 2a  rflow page.    *
25da0 2a 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f  * in the overflo
25db0 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67  w chain. The pag
25dc0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
25dd0 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70  first overflow p
25de0 61 67 65 20 69 73 0a 20 20 20 20 2a 2a 20 73 74  age is.    ** st
25df0 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f  ored in aOverflo
25e00 77 5b 30 5d 2c 20 65 74 63 2e 20 41 20 76 61 6c  w[0], etc. A val
25e10 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61  ue of 0 in the a
25e20 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79  Overflow[] array
25e30 0a 20 20 20 20 2a 2a 20 6d 65 61 6e 73 20 22 6e  .    ** means "n
25e40 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 20 28 74  ot yet known" (t
25e50 68 65 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69  he cache is lazi
25e60 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20  ly populated).. 
25e70 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 4f     */.    if( eO
25e80 70 21 3d 32 20 26 26 20 28 70 43 75 72 2d 3e 63  p!=2 && (pCur->c
25e90 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
25ea0 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 7b 0a  alidOvfl)==0 ){.
25eb0 20 20 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20        int nOvfl 
25ec0 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50  = (pCur->info.nP
25ed0 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66  ayload-pCur->inf
25ee0 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a  o.nLocal+ovflSiz
25ef0 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20  e-1)/ovflSize;. 
25f00 20 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 3e 70       if( nOvfl>p
25f10 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20  Cur->nOvflAlloc 
25f20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  ){.        Pgno 
25f30 2a 61 4e 65 77 20 3d 20 28 50 67 6e 6f 2a 29 73  *aNew = (Pgno*)s
25f40 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63 28 0a 20  qlite3Realloc(. 
25f50 20 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d             pCur-
25f60 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 6e 4f 76 66  >aOverflow, nOvf
25f70 6c 2a 32 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29  l*2*sizeof(Pgno)
25f80 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
25f90 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20      if( aNew==0 
25fa0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
25fb0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
25fc0 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  KPT;.        }el
25fd0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43  se{.          pC
25fe0 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20 3d  ur->nOvflAlloc =
25ff0 20 6e 4f 76 66 6c 2a 32 3b 0a 20 20 20 20 20 20   nOvfl*2;.      
26000 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66      pCur->aOverf
26010 6c 6f 77 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20  low = aNew;.    
26020 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
26030 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
26040 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
26050 20 6d 65 6d 73 65 74 28 70 43 75 72 2d 3e 61 4f   memset(pCur->aO
26060 76 65 72 66 6c 6f 77 2c 20 30 2c 20 6e 4f 76 66  verflow, 0, nOvf
26070 6c 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29 29 3b  l*sizeof(Pgno));
26080 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63  .        pCur->c
26090 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f  urFlags |= BTCF_
260a0 56 61 6c 69 64 4f 76 66 6c 3b 0a 20 20 20 20 20  ValidOvfl;.     
260b0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
260c0 20 49 66 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   If the overflow
260d0 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
260e0 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
260f0 74 65 64 20 61 6e 64 20 74 68 65 0a 20 20 20 20  ted and the.    
26100 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ** entry for the
26110 20 66 69 72 73 74 20 72 65 71 75 69 72 65 64 20   first required 
26120 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73  overflow page is
26130 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20   valid, skip.   
26140 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20   ** directly to 
26150 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  it..    */.    i
26160 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  f( (pCur->curFla
26170 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f  gs & BTCF_ValidO
26180 76 66 6c 29 21 3d 30 0a 20 20 20 20 20 26 26 20  vfl)!=0.     && 
26190 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
261a0 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d  offset/ovflSize]
261b0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 49  .    ){.      iI
261c0 64 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66  dx = (offset/ovf
261d0 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 6e 65  lSize);.      ne
261e0 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  xtPage = pCur->a
261f0 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a  Overflow[iIdx];.
26200 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28        offset = (
26210 6f 66 66 73 65 74 25 6f 76 66 6c 53 69 7a 65 29  offset%ovflSize)
26220 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72  ;.    }..    for
26230 28 20 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ( ; rc==SQLITE_O
26240 4b 20 26 26 20 61 6d 74 3e 30 20 26 26 20 6e 65  K && amt>0 && ne
26250 78 74 50 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b  xtPage; iIdx++){
26260 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72 65  ..      /* If re
26270 71 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74 65  quired, populate
26280 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
26290 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 20 2a  ge-list cache. *
262a0 2f 0a 20 20 20 20 20 20 69 66 28 20 28 70 43 75  /.      if( (pCu
262b0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
262c0 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 21 3d 30  CF_ValidOvfl)!=0
262d0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
262e0 72 74 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  rt( pCur->aOverf
262f0 6c 6f 77 5b 69 49 64 78 5d 3d 3d 30 0a 20 20 20  low[iIdx]==0.   
26300 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
26310 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
26320 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65 0a  iIdx]==nextPage.
26330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26340 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
26350 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61  .        pCur->a
26360 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d  Overflow[iIdx] =
26370 20 6e 65 78 74 50 61 67 65 3b 0a 20 20 20 20 20   nextPage;.     
26380 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 66   }..      if( of
26390 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29  fset>=ovflSize )
263a0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
263b0 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20   only reason to 
263c0 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20 69  read this page i
263d0 73 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  s to obtain the 
263e0 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
263f0 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6e  number for the n
26400 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
26410 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20  overflow chain. 
26420 54 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20  The page.       
26430 20 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74 20   ** data is not 
26440 72 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69 72  required. So fir
26450 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70  st try to lookup
26460 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20   the overflow.  
26470 20 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69        ** page-li
26480 73 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e 79  st cache, if any
26490 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b  , then fall back
264a0 20 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72 66   to the getOverf
264b0 6c 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20 20  lowPage().      
264c0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20    ** function.. 
264d0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
264e0 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
264f0 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61  he aOverflow[] a
26500 72 72 61 79 20 6d 75 73 74 20 62 65 20 61 6c 6c  rray must be all
26510 6f 63 61 74 65 64 20 62 65 63 61 75 73 65 20 65  ocated because e
26520 4f 70 21 3d 32 0a 20 20 20 20 20 20 20 20 2a 2a  Op!=2.        **
26530 20 68 65 72 65 2e 20 20 49 66 20 65 4f 70 3d 3d   here.  If eOp==
26540 32 2c 20 74 68 65 6e 20 6f 66 66 73 65 74 3d 3d  2, then offset==
26550 30 20 61 6e 64 20 74 68 69 73 20 62 72 61 6e 63  0 and this branc
26560 68 20 69 73 20 6e 65 76 65 72 20 74 61 6b 65 6e  h is never taken
26570 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
26580 20 20 20 20 20 61 73 73 65 72 74 28 20 65 4f 70       assert( eOp
26590 21 3d 32 20 29 3b 0a 20 20 20 20 20 20 20 20 61  !=2 );.        a
265a0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72  ssert( pCur->cur
265b0 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c  Flags & BTCF_Val
265c0 69 64 4f 76 66 6c 20 29 3b 0a 20 20 20 20 20 20  idOvfl );.      
265d0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
265e0 70 42 74 72 65 65 2d 3e 64 62 3d 3d 70 42 74 2d  pBtree->db==pBt-
265f0 3e 64 62 20 29 3b 0a 20 20 20 20 20 20 20 20 69  >db );.        i
26600 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  f( pCur->aOverfl
26610 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20  ow[iIdx+1] ){.  
26620 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
26630 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c   = pCur->aOverfl
26640 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20  ow[iIdx+1];.    
26650 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26660 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65       rc = getOve
26670 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6e  rflowPage(pBt, n
26680 65 78 74 50 61 67 65 2c 20 30 2c 20 26 6e 65 78  extPage, 0, &nex
26690 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  tPage);.        
266a0 7d 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74  }.        offset
266b0 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20   -= ovflSize;.  
266c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
266d0 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65     /* Need to re
266e0 61 64 20 74 68 69 73 20 70 61 67 65 20 70 72 6f  ad this page pro
266f0 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69  perly. It contai
26700 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20  ns some of the. 
26710 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20         ** range 
26720 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 73 20  of data that is 
26730 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f 70 3d  being read (eOp=
26740 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e 20 28  =0) or written (
26750 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20 20 20  eOp!=0)..       
26760 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
26770 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f  E_DIRECT_OVERFLO
26780 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20 20 73  W_READ.        s
26790 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b  qlite3_file *fd;
267a0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
267b0 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20  int a = amt;.   
267c0 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66       if( a + off
267d0 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29  set > ovflSize )
267e0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 20 3d 20  {.          a = 
267f0 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65  ovflSize - offse
26800 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 23 69  t;.        }..#i
26810 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45  fdef SQLITE_DIRE
26820 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44  CT_OVERFLOW_READ
26830 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61  .        /* If a
26840 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ll the following
26850 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20 20 20   are true:.     
26860 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
26870 20 20 20 31 29 20 74 68 69 73 20 69 73 20 61 20     1) this is a 
26880 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 2c 20  read operation, 
26890 61 6e 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  and .        ** 
268a0 20 20 32 29 20 64 61 74 61 20 69 73 20 72 65 71    2) data is req
268b0 75 69 72 65 64 20 66 72 6f 6d 20 74 68 65 20 73  uired from the s
268c0 74 61 72 74 20 6f 66 20 74 68 69 73 20 6f 76 65  tart of this ove
268d0 72 66 6c 6f 77 20 70 61 67 65 2c 20 61 6e 64 0a  rflow page, and.
268e0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 33 29 20          **   3) 
268f0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
26900 66 69 6c 65 2d 62 61 63 6b 65 64 2c 20 61 6e 64  file-backed, and
26910 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 34 29  .        **   4)
26920 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6f 70 65   there is no ope
26930 6e 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  n write-transact
26940 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20 20 20  ion, and.       
26950 20 2a 2a 20 20 20 35 29 20 74 68 65 20 64 61 74   **   5) the dat
26960 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61 20 57  abase is not a W
26970 41 4c 20 64 61 74 61 62 61 73 65 2c 0a 20 20 20  AL database,.   
26980 20 20 20 20 20 2a 2a 20 20 20 36 29 20 61 6c 6c       **   6) all
26990 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 70   data from the p
269a0 61 67 65 20 69 73 20 62 65 69 6e 67 20 72 65 61  age is being rea
269b0 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  d..        **   
269c0 37 29 20 61 74 20 6c 65 61 73 74 20 34 20 62 79  7) at least 4 by
269d0 74 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  tes have already
269e0 20 62 65 65 6e 20 72 65 61 64 20 69 6e 74 6f 20   been read into 
269f0 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
26a00 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  r .        **.  
26a10 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 61        ** then da
26a20 74 61 20 63 61 6e 20 62 65 20 72 65 61 64 20 64  ta can be read d
26a30 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 68 65  irectly from the
26a40 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
26a50 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20  nto the.        
26a60 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  ** output buffer
26a70 2c 20 62 79 70 61 73 73 69 6e 67 20 74 68 65 20  , bypassing the 
26a80 70 61 67 65 2d 63 61 63 68 65 20 61 6c 74 6f 67  page-cache altog
26a90 65 74 68 65 72 2e 20 54 68 69 73 20 73 70 65 65  ether. This spee
26aa0 64 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 70  ds.        ** up
26ab0 20 6c 6f 61 64 69 6e 67 20 6c 61 72 67 65 20 72   loading large r
26ac0 65 63 6f 72 64 73 20 74 68 61 74 20 73 70 61 6e  ecords that span
26ad0 20 6d 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70   many overflow p
26ae0 61 67 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ages..        */
26af0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 65 4f  .        if( (eO
26b00 70 26 30 78 30 31 29 3d 3d 30 20 20 20 20 20 20  p&0x01)==0      
26b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b30 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20 20 20  /* (1) */.      
26b40 20 20 20 26 26 20 6f 66 66 73 65 74 3d 3d 30 20     && offset==0 
26b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b70 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 29 20           /* (2) 
26b80 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  */.         && (
26b90 62 45 6e 64 20 7c 7c 20 61 3d 3d 6f 76 66 6c 53  bEnd || a==ovflS
26ba0 69 7a 65 29 20 20 20 20 20 20 20 20 20 20 20 20  ize)            
26bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26bc0 20 20 2f 2a 20 28 36 29 20 2a 2f 0a 20 20 20 20    /* (6) */.    
26bd0 20 20 20 20 20 26 26 20 70 42 74 2d 3e 69 6e 54       && pBt->inT
26be0 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
26bf0 53 5f 52 45 41 44 20 20 20 20 20 20 20 20 20 20  S_READ          
26c00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 34             /* (4
26c10 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
26c20 20 28 66 64 20 3d 20 73 71 6c 69 74 65 33 50 61   (fd = sqlite3Pa
26c30 67 65 72 46 69 6c 65 28 70 42 74 2d 3e 70 50 61  gerFile(pBt->pPa
26c40 67 65 72 29 29 2d 3e 70 4d 65 74 68 6f 64 73 20  ger))->pMethods 
26c50 20 20 20 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20      /* (3) */.  
26c60 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c         && 0==sql
26c70 69 74 65 33 50 61 67 65 72 55 73 65 57 61 6c 28  ite3PagerUseWal(
26c80 70 42 74 2d 3e 70 50 61 67 65 72 29 20 20 20 20  pBt->pPager)    
26c90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26ca0 28 35 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (5) */.         
26cb0 26 26 20 26 70 42 75 66 5b 2d 34 5d 3e 3d 70 42  && &pBuf[-4]>=pB
26cc0 75 66 53 74 61 72 74 20 20 20 20 20 20 20 20 20  ufStart         
26cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ce0 20 20 20 20 20 20 2f 2a 20 28 37 29 20 2a 2f 0a        /* (7) */.
26cf0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
26d00 20 20 20 20 20 75 38 20 61 53 61 76 65 5b 34 5d       u8 aSave[4]
26d10 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 2a  ;.          u8 *
26d20 61 57 72 69 74 65 20 3d 20 26 70 42 75 66 5b 2d  aWrite = &pBuf[-
26d30 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  4];.          as
26d40 73 65 72 74 28 20 61 57 72 69 74 65 3e 3d 70 42  sert( aWrite>=pB
26d50 75 66 53 74 61 72 74 20 29 3b 20 20 20 20 20 20  ufStart );      
26d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d70 20 20 20 2f 2a 20 68 65 6e 63 65 20 28 37 29 20     /* hence (7) 
26d80 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  */.          mem
26d90 63 70 79 28 61 53 61 76 65 2c 20 61 57 72 69 74  cpy(aSave, aWrit
26da0 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  e, 4);.         
26db0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
26dc0 65 61 64 28 66 64 2c 20 61 57 72 69 74 65 2c 20  ead(fd, aWrite, 
26dd0 61 2b 34 2c 20 28 69 36 34 29 70 42 74 2d 3e 70  a+4, (i64)pBt->p
26de0 61 67 65 53 69 7a 65 2a 28 6e 65 78 74 50 61 67  ageSize*(nextPag
26df0 65 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20  e-1));.         
26e00 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34   nextPage = get4
26e10 62 79 74 65 28 61 57 72 69 74 65 29 3b 0a 20 20  byte(aWrite);.  
26e20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61          memcpy(a
26e30 57 72 69 74 65 2c 20 61 53 61 76 65 2c 20 34 29  Write, aSave, 4)
26e40 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a  ;.        }else.
26e50 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 20 20  #endif..        
26e60 7b 0a 20 20 20 20 20 20 20 20 20 20 44 62 50 61  {.          DbPa
26e70 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20  ge *pDbPage;.   
26e80 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
26e90 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d  te3PagerGet(pBt-
26ea0 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67  >pPager, nextPag
26eb0 65 2c 20 26 70 44 62 50 61 67 65 2c 0a 20 20 20  e, &pDbPage,.   
26ec0 20 20 20 20 20 20 20 20 20 20 20 28 28 65 4f 70             ((eOp
26ed0 26 30 78 30 31 29 3d 3d 30 20 3f 20 50 41 47 45  &0x01)==0 ? PAGE
26ee0 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a  R_GET_READONLY :
26ef0 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b   0).          );
26f00 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
26f10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
26f20 20 20 20 20 20 20 20 20 20 20 20 20 61 50 61 79              aPay
26f30 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65 33 50 61  load = sqlite3Pa
26f40 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
26f50 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
26f60 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34   nextPage = get4
26f70 62 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a  byte(aPayload);.
26f80 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
26f90 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50   copyPayload(&aP
26fa0 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d  ayload[offset+4]
26fb0 2c 20 70 42 75 66 2c 20 61 2c 20 28 65 4f 70 26  , pBuf, a, (eOp&
26fc0 30 78 30 31 29 2c 20 70 44 62 50 61 67 65 29 3b  0x01), pDbPage);
26fd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
26fe0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
26ff0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
27000 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b       offset = 0;
27010 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
27020 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
27030 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20  mt -= a;.       
27040 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20   pBuf += a;.    
27050 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
27060 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
27070 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20  OK && amt>0 ){. 
27080 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
27090 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
270a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
270b0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61  }../*.** Read pa
270c0 72 74 20 6f 66 20 74 68 65 20 70 61 79 6c 6f 61  rt of the payloa
270d0 64 20 66 6f 72 20 74 68 65 20 72 6f 77 20 61 74  d for the row at
270e0 20 77 68 69 63 68 20 74 68 61 74 20 63 75 72 73   which that curs
270f0 6f 72 20 70 43 75 72 20 69 73 20 63 75 72 72 65  or pCur is curre
27100 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67  ntly.** pointing
27110 2e 20 20 22 61 6d 74 22 20 62 79 74 65 73 20 77  .  "amt" bytes w
27120 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 72  ill be transferr
27130 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20  ed into pBuf[]. 
27140 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a   The transfer.**
27150 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73   begins at "offs
27160 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20  et"..**.** pCur 
27170 63 61 6e 20 62 65 20 70 6f 69 6e 74 69 6e 67 20  can be pointing 
27180 74 6f 20 65 69 74 68 65 72 20 61 20 74 61 62 6c  to either a tabl
27190 65 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 62 2d  e or an index b-
271a0 74 72 65 65 2e 0a 2a 2a 20 49 66 20 70 6f 69 6e  tree..** If poin
271b0 74 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20  ting to a table 
271c0 62 74 72 65 65 2c 20 74 68 65 6e 20 74 68 65 20  btree, then the 
271d0 63 6f 6e 74 65 6e 74 20 73 65 63 74 69 6f 6e 20  content section 
271e0 69 73 20 72 65 61 64 2e 20 20 49 66 0a 2a 2a 20  is read.  If.** 
271f0 70 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  pCur is pointing
27200 20 74 6f 20 61 6e 20 69 6e 64 65 78 20 62 2d 74   to an index b-t
27210 72 65 65 20 74 68 65 6e 20 74 68 65 20 6b 65 79  ree then the key
27220 20 73 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64   section is read
27230 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 73 71 6c 69  ..**.** For sqli
27240 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 28  te3BtreePayload(
27250 29 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 6d 75  ), the caller mu
27260 73 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 70  st ensure that p
27270 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 0a  Cur is pointing.
27280 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f  ** to a valid ro
27290 77 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  w in the table. 
272a0 20 46 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65   For sqlite3Btre
272b0 65 50 61 79 6c 6f 61 64 43 68 65 63 6b 65 64 28  ePayloadChecked(
272c0 29 2c 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72  ), the.** cursor
272d0 20 6d 69 67 68 74 20 62 65 20 69 6e 76 61 6c 69   might be invali
272e0 64 20 6f 72 20 6d 69 67 68 74 20 6e 65 65 64 20  d or might need 
272f0 74 6f 20 62 65 20 72 65 73 74 6f 72 65 64 20 62  to be restored b
27300 65 66 6f 72 65 20 62 65 69 6e 67 20 72 65 61 64  efore being read
27310 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
27320 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
27330 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  ess or an error 
27340 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67  code if anything
27350 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20   goes.** wrong. 
27360 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   An error is ret
27370 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74  urned if "offset
27380 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20  +amt" is larger 
27390 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69  than.** the avai
273a0 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a  lable payload..*
273b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
273c0 65 65 50 61 79 6c 6f 61 64 28 42 74 43 75 72 73  eePayload(BtCurs
273d0 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66  or *pCur, u32 of
273e0 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76  fset, u32 amt, v
273f0 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 61 73  oid *pBuf){.  as
27400 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
27410 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
27420 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
27430 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
27440 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
27450 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  ( pCur->iPage>=0
27460 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65   && pCur->apPage
27470 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b  [pCur->iPage] );
27480 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
27490 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
274a0 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65  ge]<pCur->apPage
274b0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
274c0 43 65 6c 6c 20 29 3b 0a 20 20 72 65 74 75 72 6e  Cell );.  return
274d0 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
274e0 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74  Cur, offset, amt
274f0 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
27500 2a 29 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 23 69  *)pBuf, 0);.}.#i
27510 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
27520 54 5f 49 4e 43 52 42 4c 4f 42 0a 69 6e 74 20 73  T_INCRBLOB.int s
27530 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f  qlite3BtreePaylo
27540 61 64 43 68 65 63 6b 65 64 28 42 74 43 75 72 73  adChecked(BtCurs
27550 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66  or *pCur, u32 of
27560 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76  fset, u32 amt, v
27570 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e  oid *pBuf){.  in
27580 74 20 72 63 3b 0a 20 20 69 66 20 28 20 70 43 75  t rc;.  if ( pCu
27590 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
275a0 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
275b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
275c0 42 4f 52 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65  BORT;.  }.  asse
275d0 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
275e0 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
275f0 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
27600 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
27610 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
27620 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
27630 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
27640 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
27650 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  D );.    assert(
27660 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
27670 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  && pCur->apPage[
27680 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a  pCur->iPage] );.
27690 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
276a0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
276b0 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67  age]<pCur->apPag
276c0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
276d0 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20  nCell );.    rc 
276e0 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  = accessPayload(
276f0 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d  pCur, offset, am
27700 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a 20 20 7d  t, pBuf, 0);.  }
27710 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
27720 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
27730 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a  _OMIT_INCRBLOB *
27740 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
27750 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79  a pointer to pay
27760 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  load information
27770 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20   from the entry 
27780 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 70 43 75  that the .** pCu
27790 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e  r cursor is poin
277a0 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f  ting to.  The po
277b0 69 6e 74 65 72 20 69 73 20 74 6f 20 74 68 65 20  inter is to the 
277c0 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20  beginning of.** 
277d0 74 68 65 20 6b 65 79 20 69 66 20 69 6e 64 65 78  the key if index
277e0 20 62 74 72 65 65 73 20 28 70 50 61 67 65 2d 3e   btrees (pPage->
277f0 69 6e 74 4b 65 79 3d 3d 30 29 20 61 6e 64 20 69  intKey==0) and i
27800 73 20 74 68 65 20 64 61 74 61 20 66 6f 72 0a 2a  s the data for.*
27810 2a 20 74 61 62 6c 65 20 62 74 72 65 65 73 20 28  * table btrees (
27820 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 31  pPage->intKey==1
27830 29 2e 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  ). The number of
27840 20 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61   bytes of availa
27850 62 6c 65 0a 2a 2a 20 6b 65 79 2f 64 61 74 61 20  ble.** key/data 
27860 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
27870 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74  *pAmt.  If *pAmt
27880 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76 61  ==0, then the va
27890 6c 75 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  lue.** returned 
278a0 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 20 76 61  will not be a va
278b0 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  lid pointer..**.
278c0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
278d0 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
278e0 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f  on.  It is commo
278f0 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65  n for the entire
27900 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61   key.** and data
27910 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 6c   to fit on the l
27920 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66 6f  ocal page and fo
27930 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e 6f  r there to be no
27940 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67   overflow.** pag
27950 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20 69  es.  When that i
27960 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74 69  s so, this routi
27970 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  ne can be used t
27980 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a 20  o access the.** 
27990 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77 69 74  key and data wit
279a0 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f  hout making a co
279b0 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79 20  py.  If the key 
279c0 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69 6c  and/or data spil
279d0 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66  ls.** onto overf
279e0 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e 20  low pages, then 
279f0 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20  accessPayload() 
27a00 6d 75 73 74 20 62 65 20 75 73 65 64 20 74 6f 20  must be used to 
27a10 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a 20 74 68  reassemble.** th
27a20 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20 63  e key/data and c
27a30 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70 72  opy it into a pr
27a40 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65  eallocated buffe
27a50 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69  r..**.** The poi
27a60 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79  nter returned by
27a70 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f   this routine lo
27a80 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74  oks directly int
27a90 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a 20  o the cached.** 
27aa0 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
27ab0 62 61 73 65 2e 20 20 54 68 65 20 64 61 74 61 20  base.  The data 
27ac0 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72 20  might change or 
27ad0 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74 69  move the next ti
27ae0 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65 20  me.** any btree 
27af0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
27b00 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  d..*/.static con
27b10 73 74 20 76 6f 69 64 20 2a 66 65 74 63 68 50 61  st void *fetchPa
27b20 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f  yload(.  BtCurso
27b30 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a  r *pCur,      /*
27b40 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   Cursor pointing
27b50 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61   to entry to rea
27b60 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  d from */.  u32 
27b70 2a 70 41 6d 74 20 20 20 20 20 20 20 20 20 20 20  *pAmt           
27b80 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75   /* Write the nu
27b90 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c  mber of availabl
27ba0 65 20 62 79 74 65 73 20 68 65 72 65 20 2a 2f 0a  e bytes here */.
27bb0 29 7b 0a 20 20 75 33 32 20 61 6d 74 3b 0a 20 20  ){.  u32 amt;.  
27bc0 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20  assert( pCur!=0 
27bd0 26 26 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  && pCur->iPage>=
27be0 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67  0 && pCur->apPag
27bf0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b  e[pCur->iPage]);
27c00 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
27c10 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
27c20 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
27c30 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
27c40 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
27c50 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
27c60 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
27c70 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
27c80 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
27c90 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
27ca0 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d  ur->iPage]<pCur-
27cb0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
27cc0 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  age]->nCell );. 
27cd0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
27ce0 6e 66 6f 2e 6e 53 69 7a 65 3e 30 20 29 3b 0a 20  nfo.nSize>0 );. 
27cf0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
27d00 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3e 70 43 75  nfo.pPayload>pCu
27d10 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
27d20 69 50 61 67 65 5d 2d 3e 61 44 61 74 61 20 7c 7c  iPage]->aData ||
27d30 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
27d40 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
27d50 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3c 70 43 75  nfo.pPayload<pCu
27d60 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
27d70 69 50 61 67 65 5d 2d 3e 61 44 61 74 61 45 6e 64  iPage]->aDataEnd
27d80 20 7c 7c 43 4f 52 52 55 50 54 5f 44 42 29 3b 0a   ||CORRUPT_DB);.
27d90 20 20 61 6d 74 20 3d 20 28 69 6e 74 29 28 70 43    amt = (int)(pC
27da0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
27db0 3e 69 50 61 67 65 5d 2d 3e 61 44 61 74 61 45 6e  >iPage]->aDataEn
27dc0 64 20 2d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  d - pCur->info.p
27dd0 50 61 79 6c 6f 61 64 29 3b 0a 20 20 69 66 28 20  Payload);.  if( 
27de0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
27df0 6c 3c 61 6d 74 20 29 20 61 6d 74 20 3d 20 70 43  l<amt ) amt = pC
27e00 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b  ur->info.nLocal;
27e10 0a 20 20 2a 70 41 6d 74 20 3d 20 61 6d 74 3b 0a  .  *pAmt = amt;.
27e20 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29    return (void*)
27e30 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c  pCur->info.pPayl
27e40 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46  oad;.}.../*.** F
27e50 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  or the entry tha
27e60 74 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73  t cursor pCur is
27e70 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75 72   point to, retur
27e80 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74  n as.** many byt
27e90 65 73 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 72  es of the key or
27ea0 20 64 61 74 61 20 61 73 20 61 72 65 20 61 76 61   data as are ava
27eb0 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f  ilable on the lo
27ec0 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61  cal.** b-tree pa
27ed0 67 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e  ge.  Write the n
27ee0 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62  umber of availab
27ef0 6c 65 20 62 79 74 65 73 20 69 6e 74 6f 20 2a 70  le bytes into *p
27f00 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  Amt..**.** The p
27f10 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
27f20 69 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 54  is ephemeral.  T
27f30 68 65 20 6b 65 79 2f 64 61 74 61 20 6d 61 79 20  he key/data may 
27f40 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65  move.** or be de
27f50 73 74 72 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e  stroyed on the n
27f60 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20  ext call to any 
27f70 42 74 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a  Btree routine,.*
27f80 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c  * including call
27f90 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 74 68 72  s from other thr
27fa0 65 61 64 73 20 61 67 61 69 6e 73 74 20 74 68 65  eads against the
27fb0 20 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20   same cache..** 
27fc0 48 65 6e 63 65 2c 20 61 20 6d 75 74 65 78 20 6f  Hence, a mutex o
27fd0 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73  n the BtShared s
27fe0 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 70 72  hould be held pr
27ff0 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a  ior to calling.*
28000 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  * this routine..
28010 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74  **.** These rout
28020 69 6e 65 73 20 69 73 20 75 73 65 64 20 74 6f 20  ines is used to 
28030 67 65 74 20 71 75 69 63 6b 20 61 63 63 65 73 73  get quick access
28040 20 74 6f 20 6b 65 79 20 61 6e 64 20 64 61 74 61   to key and data
28050 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f  .** in the commo
28060 6e 20 63 61 73 65 20 77 68 65 72 65 20 6e 6f 20  n case where no 
28070 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
28080 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73  re used..*/.cons
28090 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42  t void *sqlite3B
280a0 74 72 65 65 50 61 79 6c 6f 61 64 46 65 74 63 68  treePayloadFetch
280b0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
280c0 20 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20 72   u32 *pAmt){.  r
280d0 65 74 75 72 6e 20 66 65 74 63 68 50 61 79 6c 6f  eturn fetchPaylo
280e0 61 64 28 70 43 75 72 2c 20 70 41 6d 74 29 3b 0a  ad(pCur, pAmt);.
280f0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  }.../*.** Move t
28100 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
28110 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61  o a new child pa
28120 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f  ge.  The newPgno
28130 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
28140 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20  .** page number 
28150 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  of the child pag
28160 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a  e to move to..**
28170 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
28180 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  n returns SQLITE
28190 5f 43 4f 52 52 55 50 54 20 69 66 20 74 68 65 20  _CORRUPT if the 
281a0 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67  page-header flag
281b0 73 20 66 69 65 6c 64 20 6f 66 0a 2a 2a 20 74 68  s field of.** th
281c0 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  e new child page
281d0 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
281e0 74 68 65 20 66 6c 61 67 73 20 66 69 65 6c 64 20  the flags field 
281f0 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 28 69  of the parent (i
28200 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e 20 69 6e 74  .e..** if an int
28210 6b 65 79 20 70 61 67 65 20 61 70 70 65 61 72 73  key page appears
28220 20 74 6f 20 62 65 20 74 68 65 20 70 61 72 65 6e   to be the paren
28230 74 20 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65  t of a non-intke
28240 79 20 70 61 67 65 2c 20 6f 72 0a 2a 2a 20 76 69  y page, or.** vi
28250 63 65 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a 73 74  ce-versa)..*/.st
28260 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43  atic int moveToC
28270 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20 2a 70  hild(BtCursor *p
28280 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f  Cur, u32 newPgno
28290 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
282a0 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a  Bt = pCur->pBt;.
282b0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
282c0 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
282d0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
282e0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
282f0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
28300 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
28310 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41  Page<BTCURSOR_MA
28320 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73  X_DEPTH );.  ass
28330 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
28340 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75  >=0 );.  if( pCu
28350 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43 55 52  r->iPage>=(BTCUR
28360 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29  SOR_MAX_DEPTH-1)
28370 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
28380 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
28390 50 54 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  PT;.  }.  pCur->
283a0 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
283b0 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
283c0 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64   &= ~(BTCF_Valid
283d0 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f  NKey|BTCF_ValidO
283e0 76 66 6c 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50  vfl);.  pCur->iP
283f0 61 67 65 2b 2b 3b 0a 20 20 70 43 75 72 2d 3e 61  age++;.  pCur->a
28400 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
28410 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  ] = 0;.  return 
28420 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
28430 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 43  Bt, newPgno, &pC
28440 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
28450 3e 69 50 61 67 65 5d 2c 0a 20 20 20 20 20 20 20  >iPage],.       
28460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28470 20 70 43 75 72 2c 20 70 43 75 72 2d 3e 63 75 72   pCur, pCur->cur
28480 50 61 67 65 72 46 6c 61 67 73 29 3b 0a 7d 0a 0a  PagerFlags);.}..
28490 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  #if SQLITE_DEBUG
284a0 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61 72  ./*.** Page pPar
284b0 65 6e 74 20 69 73 20 61 6e 20 69 6e 74 65 72 6e  ent is an intern
284c0 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72  al (non-leaf) tr
284d0 65 65 20 70 61 67 65 2e 20 54 68 69 73 20 66 75  ee page. This fu
284e0 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72  nction .** asser
284f0 74 73 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d  ts that page num
28500 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68  ber iChild is th
28510 65 20 6c 65 66 74 2d 63 68 69 6c 64 20 69 66 20  e left-child if 
28520 74 68 65 20 69 49 64 78 27 74 68 0a 2a 2a 20 63  the iIdx'th.** c
28530 65 6c 6c 20 69 6e 20 70 61 67 65 20 70 50 61 72  ell in page pPar
28540 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49 64 78  ent. Or, if iIdx
28550 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65   is equal to the
28560 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
28570 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50 61  .** cells in pPa
28580 72 65 6e 74 2c 20 74 68 61 74 20 70 61 67 65 20  rent, that page 
28590 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73  number iChild is
285a0 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
285b0 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e   of.** the page.
285c0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
285d0 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65  assertParentInde
285e0 78 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65  x(MemPage *pPare
285f0 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c 20 50 67  nt, int iIdx, Pg
28600 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20 69 66  no iChild){.  if
28610 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72  ( CORRUPT_DB ) r
28620 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63  eturn;  /* The c
28630 6f 6e 64 69 74 69 6f 6e 73 20 74 65 73 74 65 64  onditions tested
28640 20 62 65 6c 6f 77 20 6d 69 67 68 74 20 6e 6f 74   below might not
28650 20 62 65 20 74 72 75 65 0a 20 20 20 20 20 20 20   be true.       
28660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28670 20 20 20 20 20 2a 2a 20 69 6e 20 61 20 63 6f 72       ** in a cor
28680 72 75 70 74 20 64 61 74 61 62 61 73 65 20 2a 2f  rupt database */
28690 0a 20 20 61 73 73 65 72 74 28 20 69 49 64 78 3c  .  assert( iIdx<
286a0 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20  =pParent->nCell 
286b0 29 3b 0a 20 20 69 66 28 20 69 49 64 78 3d 3d 70  );.  if( iIdx==p
286c0 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b  Parent->nCell ){
286d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74  .    assert( get
286e0 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e  4byte(&pParent->
286f0 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68  aData[pParent->h
28700 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43  drOffset+8])==iC
28710 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  hild );.  }else{
28720 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74  .    assert( get
28730 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
28740 50 61 72 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d  Parent, iIdx))==
28750 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a  iChild );.  }.}.
28760 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20  #else.#  define 
28770 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65  assertParentInde
28780 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66  x(x,y,z) .#endif
28790 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
287a0 20 63 75 72 73 6f 72 20 75 70 20 74 6f 20 74 68   cursor up to th
287b0 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a  e parent page..*
287c0 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20 69  *.** pCur->idx i
287d0 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c  s set to the cel
287e0 6c 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e  l index that con
287f0 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65  tains the pointe
28800 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65  r.** to the page
28810 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66   we are coming f
28820 72 6f 6d 2e 20 20 49 66 20 77 65 20 61 72 65 20  rom.  If we are 
28830 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a  coming from the.
28840 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68  ** right-most ch
28850 69 6c 64 20 70 61 67 65 20 74 68 65 6e 20 70 43  ild page then pC
28860 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74  ur->idx is set t
28870 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a  o one more than.
28880 2a 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20 63  ** the largest c
28890 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74  ell index..*/.st
288a0 61 74 69 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f  atic void moveTo
288b0 50 61 72 65 6e 74 28 42 74 43 75 72 73 6f 72 20  Parent(BtCursor 
288c0 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74  *pCur){.  assert
288d0 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
288e0 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
288f0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
28900 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
28910 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
28920 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b  pCur->iPage>0 );
28930 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
28940 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
28950 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74  age] );.  assert
28960 50 61 72 65 6e 74 49 6e 64 65 78 28 0a 20 20 20  ParentIndex(.   
28970 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
28980 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20  ur->iPage-1], . 
28990 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
289a0 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a  Cur->iPage-1], .
289b0 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65      pCur->apPage
289c0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70  [pCur->iPage]->p
289d0 67 6e 6f 0a 20 20 29 3b 0a 20 20 74 65 73 74 63  gno.  );.  testc
289e0 61 73 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ase( pCur->aiIdx
289f0 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 20  [pCur->iPage-1] 
28a00 3e 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  > pCur->apPage[p
28a10 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2d 3e 6e  Cur->iPage-1]->n
28a20 43 65 6c 6c 20 29 3b 0a 20 20 70 43 75 72 2d 3e  Cell );.  pCur->
28a30 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
28a40 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
28a50 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64   &= ~(BTCF_Valid
28a60 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f  NKey|BTCF_ValidO
28a70 76 66 6c 29 3b 0a 20 20 72 65 6c 65 61 73 65 50  vfl);.  releaseP
28a80 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d  ageNotNull(pCur-
28a90 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
28aa0 61 67 65 2d 2d 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  age--]);.}../*.*
28ab0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
28ac0 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  r to point to th
28ad0 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 69  e root page of i
28ae0 74 73 20 62 2d 74 72 65 65 20 73 74 72 75 63 74  ts b-tree struct
28af0 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ure..**.** If th
28b00 65 20 74 61 62 6c 65 20 68 61 73 20 61 20 76 69  e table has a vi
28b10 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2c  rtual root page,
28b20 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
28b30 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69   is moved to poi
28b40 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20 76 69 72  nt.** to the vir
28b50 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69  tual root page i
28b60 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 61 63  nstead of the ac
28b70 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20  tual root page. 
28b80 41 20 74 61 62 6c 65 20 68 61 73 20 61 0a 2a 2a  A table has a.**
28b90 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
28ba0 67 65 20 77 68 65 6e 20 74 68 65 20 61 63 74 75  ge when the actu
28bb0 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e  al root page con
28bc0 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61  tains no cells a
28bd0 6e 64 20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20  nd a .** single 
28be0 63 68 69 6c 64 20 70 61 67 65 2e 20 54 68 69 73  child page. This
28bf0 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
28c00 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
28c10 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20 31  rooted at page 1
28c20 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62  ..**.** If the b
28c30 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  -tree structure 
28c40 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 63 75  is empty, the cu
28c50 72 73 6f 72 20 73 74 61 74 65 20 69 73 20 73 65  rsor state is se
28c60 74 20 74 6f 20 0a 2a 2a 20 43 55 52 53 4f 52 5f  t to .** CURSOR_
28c70 49 4e 56 41 4c 49 44 2e 20 4f 74 68 65 72 77 69  INVALID. Otherwi
28c80 73 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20 69  se, the cursor i
28c90 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
28ca0 6f 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 63  o the first.** c
28cb0 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74  ell located on t
28cc0 68 65 20 72 6f 6f 74 20 28 6f 72 20 76 69 72 74  he root (or virt
28cd0 75 61 6c 20 72 6f 6f 74 29 20 70 61 67 65 20 61  ual root) page a
28ce0 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 73 74  nd the cursor st
28cf0 61 74 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  ate.** is set to
28d00 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a   CURSOR_VALID..*
28d10 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e  *.** If this fun
28d20 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 73 75  ction returns su
28d30 63 63 65 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d  ccessfully, it m
28d40 61 79 20 62 65 20 61 73 73 75 6d 65 64 20 74 68  ay be assumed th
28d50 61 74 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68  at the.** page-h
28d60 65 61 64 65 72 20 66 6c 61 67 73 20 69 6e 64 69  eader flags indi
28d70 63 61 74 65 20 74 68 61 74 20 74 68 65 20 5b 76  cate that the [v
28d80 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67  irtual] root-pag
28d90 65 20 69 73 20 74 68 65 20 65 78 70 65 63 74 65  e is the expecte
28da0 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d  d .** kind of b-
28db0 74 72 65 65 20 70 61 67 65 20 28 69 2e 65 2e 20  tree page (i.e. 
28dc0 69 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  if when opening 
28dd0 74 68 65 20 63 75 72 73 6f 72 20 74 68 65 20 63  the cursor the c
28de0 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a  aller did not.**
28df0 20 73 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e   specify a KeyIn
28e00 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 65  fo structure the
28e10 20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20 73   flags byte is s
28e20 65 74 20 74 6f 20 30 78 30 35 20 6f 72 20 30 78  et to 0x05 or 0x
28e30 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e  0D,.** indicatin
28e40 67 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65  g a table b-tree
28e50 2c 20 6f 72 20 69 66 20 74 68 65 20 63 61 6c 6c  , or if the call
28e60 65 72 20 64 69 64 20 73 70 65 63 69 66 79 20 61  er did specify a
28e70 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72   KeyInfo .** str
28e80 75 63 74 75 72 65 20 74 68 65 20 66 6c 61 67 73  ucture the flags
28e90 20 62 79 74 65 20 69 73 20 73 65 74 20 74 6f 20   byte is set to 
28ea0 30 78 30 32 20 6f 72 20 30 78 30 41 2c 20 69 6e  0x02 or 0x0A, in
28eb0 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 64 65  dicating an inde
28ec0 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f  x.** b-tree)..*/
28ed0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
28ee0 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20  ToRoot(BtCursor 
28ef0 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67  *pCur){.  MemPag
28f00 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20  e *pRoot;.  int 
28f10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
28f20 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
28f30 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
28f40 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
28f50 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20   CURSOR_INVALID 
28f60 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  < CURSOR_REQUIRE
28f70 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  SEEK );.  assert
28f80 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 20  ( CURSOR_VALID  
28f90 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   < CURSOR_REQUIR
28fa0 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72  ESEEK );.  asser
28fb0 74 28 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  t( CURSOR_FAULT 
28fc0 20 20 3e 20 43 55 52 53 4f 52 5f 52 45 51 55 49    > CURSOR_REQUI
28fd0 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20  RESEEK );.  if( 
28fe0 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55  pCur->eState>=CU
28ff0 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
29000 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72   ){.    if( pCur
29010 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
29020 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 20 20  _FAULT ){.      
29030 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b  assert( pCur->sk
29040 69 70 4e 65 78 74 21 3d 53 51 4c 49 54 45 5f 4f  ipNext!=SQLITE_O
29050 4b 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  K );.      retur
29060 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  n pCur->skipNext
29070 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
29080 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72  te3BtreeClearCur
29090 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 7d 0a 0a  sor(pCur);.  }..
290a0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
290b0 65 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  e>=0 ){.    if( 
290c0 70 43 75 72 2d 3e 69 50 61 67 65 20 29 7b 0a 20  pCur->iPage ){. 
290d0 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20       do{.       
290e0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
290f0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
29100 65 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  e]!=0 );.       
29110 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e   releasePageNotN
29120 75 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65  ull(pCur->apPage
29130 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 5d 29  [pCur->iPage--])
29140 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20  ;.      }while( 
29150 70 43 75 72 2d 3e 69 50 61 67 65 29 3b 0a 20 20  pCur->iPage);.  
29160 20 20 20 20 67 6f 74 6f 20 73 6b 69 70 5f 69 6e      goto skip_in
29170 69 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  it;.    }.  }els
29180 65 20 69 66 28 20 70 43 75 72 2d 3e 70 67 6e 6f  e if( pCur->pgno
29190 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  Root==0 ){.    p
291a0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
291b0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
291c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
291d0 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
291e0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
291f0 50 61 67 65 3d 3d 28 2d 31 29 20 29 3b 0a 20 20  Page==(-1) );.  
29200 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69    rc = getAndIni
29210 74 50 61 67 65 28 70 43 75 72 2d 3e 70 42 74 72  tPage(pCur->pBtr
29220 65 65 2d 3e 70 42 74 2c 20 70 43 75 72 2d 3e 70  ee->pBt, pCur->p
29230 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e  gnoRoot, &pCur->
29240 61 70 50 61 67 65 5b 30 5d 2c 0a 20 20 20 20 20  apPage[0],.     
29250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29260 20 20 20 30 2c 20 70 43 75 72 2d 3e 63 75 72 50     0, pCur->curP
29270 61 67 65 72 46 6c 61 67 73 29 3b 0a 20 20 20 20  agerFlags);.    
29280 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
29290 4b 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  K ){.      pCur-
292a0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
292b0 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  _INVALID;.      
292c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
292d0 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67  }.    pCur->iPag
292e0 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d  e = 0;.    pCur-
292f0 3e 63 75 72 49 6e 74 4b 65 79 20 3d 20 70 43 75  >curIntKey = pCu
29300 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
29310 74 4b 65 79 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f  tKey;.  }.  pRoo
29320 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  t = pCur->apPage
29330 5b 30 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  [0];.  assert( p
29340 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72  Root->pgno==pCur
29350 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20  ->pgnoRoot );.. 
29360 20 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b 65   /* If pCur->pKe
29370 79 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c  yInfo is not NUL
29380 4c 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c  L, then the call
29390 65 72 20 74 68 61 74 20 6f 70 65 6e 65 64 20 74  er that opened t
293a0 68 69 73 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20  his cursor.  ** 
293b0 65 78 70 65 63 74 65 64 20 74 6f 20 6f 70 65 6e  expected to open
293c0 20 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20   it on an index 
293d0 62 2d 74 72 65 65 2e 20 4f 74 68 65 72 77 69 73  b-tree. Otherwis
293e0 65 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f 20 69  e, if pKeyInfo i
293f0 73 0a 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65  s.  ** NULL, the
29400 20 63 61 6c 6c 65 72 20 65 78 70 65 63 74 73 20   caller expects 
29410 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2e 20  a table b-tree. 
29420 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74  If this is not t
29430 68 65 20 63 61 73 65 2c 0a 20 20 2a 2a 20 72 65  he case,.  ** re
29440 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43  turn an SQLITE_C
29450 4f 52 52 55 50 54 20 65 72 72 6f 72 2e 20 0a 20  ORRUPT error. . 
29460 20 2a 2a 0a 20 20 2a 2a 20 45 61 72 6c 69 65 72   **.  ** Earlier
29470 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
29480 69 74 65 20 61 73 73 75 6d 65 64 20 74 68 61 74  ite assumed that
29490 20 74 68 69 73 20 74 65 73 74 20 63 6f 75 6c 64   this test could
294a0 20 6e 6f 74 20 66 61 69 6c 0a 20 20 2a 2a 20 69   not fail.  ** i
294b0 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  f the root page 
294c0 77 61 73 20 61 6c 72 65 61 64 79 20 6c 6f 61 64  was already load
294d0 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
294e0 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64  ction was called
294f0 20 28 69 2e 65 2e 0a 20 20 2a 2a 20 69 66 20 70   (i.e..  ** if p
29500 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 29 2e 20  Cur->iPage>=0). 
29510 42 75 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20  But this is not 
29520 73 6f 20 69 66 20 74 68 65 20 64 61 74 61 62 61  so if the databa
29530 73 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 20  se is corrupted 
29540 0a 20 20 2a 2a 20 69 6e 20 73 75 63 68 20 61 20  .  ** in such a 
29550 77 61 79 20 74 68 61 74 20 70 61 67 65 20 70 52  way that page pR
29560 6f 6f 74 20 69 73 20 6c 69 6e 6b 65 64 20 69 6e  oot is linked in
29570 74 6f 20 61 20 73 65 63 6f 6e 64 20 62 2d 74 72  to a second b-tr
29580 65 65 20 74 61 62 6c 65 20 0a 20 20 2a 2a 20 28  ee table .  ** (
29590 6f 72 20 74 68 65 20 66 72 65 65 6c 69 73 74 29  or the freelist)
295a0 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
295b0 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31  pRoot->intKey==1
295c0 20 7c 7c 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65   || pRoot->intKe
295d0 79 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 52  y==0 );.  if( pR
295e0 6f 6f 74 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 7c  oot->isInit==0 |
295f0 7c 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  | (pCur->pKeyInf
29600 6f 3d 3d 30 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e  o==0)!=pRoot->in
29610 74 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75  tKey ){.    retu
29620 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
29630 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 73 6b 69  T_BKPT;.  }..ski
29640 70 5f 69 6e 69 74 3a 20 20 0a 20 20 70 43 75 72  p_init:  .  pCur
29650 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a  ->aiIdx[0] = 0;.
29660 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
29670 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
29680 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54  curFlags &= ~(BT
29690 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56  CF_AtLast|BTCF_V
296a0 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61  alidNKey|BTCF_Va
296b0 6c 69 64 4f 76 66 6c 29 3b 0a 0a 20 20 70 52 6f  lidOvfl);..  pRo
296c0 6f 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ot = pCur->apPag
296d0 65 5b 30 5d 3b 0a 20 20 69 66 28 20 70 52 6f 6f  e[0];.  if( pRoo
296e0 74 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20  t->nCell>0 ){.  
296f0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
29700 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
29710 20 7d 65 6c 73 65 20 69 66 28 20 21 70 52 6f 6f   }else if( !pRoo
29720 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50  t->leaf ){.    P
29730 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20  gno subpage;.   
29740 20 69 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f   if( pRoot->pgno
29750 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c  !=1 ) return SQL
29760 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
29770 3b 0a 20 20 20 20 73 75 62 70 61 67 65 20 3d 20  ;.    subpage = 
29780 67 65 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d  get4byte(&pRoot-
29790 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64  >aData[pRoot->hd
297a0 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
297b0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
297c0 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20  CURSOR_VALID;.  
297d0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
297e0 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61 67 65  ld(pCur, subpage
297f0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
29800 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
29810 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
29820 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
29830 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
29840 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f  e cursor down to
29850 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c   the left-most l
29860 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74  eaf entry beneat
29870 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74  h the.** entry t
29880 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75  o which it is cu
29890 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
298a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74  ..**.** The left
298b0 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68  -most leaf is th
298c0 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73  e one with the s
298d0 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68  mallest key - th
298e0 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73  e first.** in as
298f0 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a  cending order..*
29900 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
29910 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75  eToLeftmost(BtCu
29920 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50  rsor *pCur){.  P
29930 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20  gno pgno;.  int 
29940 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
29950 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
29960 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
29970 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
29980 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
29990 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
299a0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
299b0 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
299c0 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61  LITE_OK && !(pPa
299d0 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
299e0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d  e[pCur->iPage])-
299f0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73  >leaf ){.    ass
29a00 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
29a10 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50  [pCur->iPage]<pP
29a20 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
29a30 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
29a40 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  e(findCell(pPage
29a50 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  , pCur->aiIdx[pC
29a60 75 72 2d 3e 69 50 61 67 65 5d 29 29 3b 0a 20 20  ur->iPage]));.  
29a70 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
29a80 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a  ld(pCur, pgno);.
29a90 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
29aa0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
29ab0 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
29ac0 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  o the right-most
29ad0 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65   leaf entry bene
29ae0 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  ath the.** page 
29af0 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63  to which it is c
29b00 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
29b10 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64  g.  Notice the d
29b20 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74  ifference.** bet
29b30 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  ween moveToLeftm
29b40 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f  ost() and moveTo
29b50 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f  Rightmost().  mo
29b60 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a  veToLeftmost().*
29b70 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74  * finds the left
29b80 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65  -most entry bene
29b90 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20  ath the *entry* 
29ba0 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69  whereas moveToRi
29bb0 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e  ghtmost().** fin
29bc0 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  ds the right-mos
29bd0 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  t entry beneath 
29be0 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a  the *page*..**.*
29bf0 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
29c00 20 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e   entry is the on
29c10 65 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65  e with the large
29c20 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73  st key - the las
29c30 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65  t.** key in asce
29c40 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a  nding order..*/.
29c50 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
29c60 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72  oRightmost(BtCur
29c70 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67  sor *pCur){.  Pg
29c80 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  no pgno;.  int r
29c90 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
29ca0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
29cb0 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
29cc0 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
29cd0 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
29ce0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
29cf0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
29d00 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 21 28 70   );.  while( !(p
29d10 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
29d20 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
29d30 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70  )->leaf ){.    p
29d40 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
29d50 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
29d60 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
29d70 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49  );.    pCur->aiI
29d80 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
29d90 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
29da0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
29db0 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29  hild(pCur, pgno)
29dc0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
29dd0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
29de0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
29df0 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65  ->iPage] = pPage
29e00 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 61 73 73  ->nCell-1;.  ass
29e10 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
29e20 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 61 73  nSize==0 );.  as
29e30 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72  sert( (pCur->cur
29e40 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c  Flags & BTCF_Val
29e50 69 64 4e 4b 65 79 29 3d 3d 30 20 29 3b 0a 20 20  idNKey)==0 );.  
29e60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
29e70 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
29e80 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66   cursor to the f
29e90 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  irst entry in th
29ea0 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  e table.  Return
29eb0 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
29ec0 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a   success.  Set *
29ed0 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65  pRes to 0 if the
29ee0 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79   cursor actually
29ef0 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74   points to somet
29f00 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a  hing.** or set *
29f10 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65  pRes to 1 if the
29f20 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
29f30 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
29f40 74 72 65 65 46 69 72 73 74 28 42 74 43 75 72 73  treeFirst(BtCurs
29f50 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
29f60 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
29f70 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
29f80 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
29f90 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
29fa0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
29fb0 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
29fc0 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
29fd0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f    rc = moveToRoo
29fe0 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  t(pCur);.  if( r
29ff0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2a000 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53      if( pCur->eS
2a010 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
2a020 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 61 73  ALID ){.      as
2a030 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
2a040 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
2a050 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2a060 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  age]->nCell==0 )
2a070 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
2a080 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
2a090 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2a0a0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2a0b0 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29  Page]->nCell>0 )
2a0c0 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
2a0d0 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f  0;.      rc = mo
2a0e0 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
2a0f0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
2a100 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2a110 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
2a120 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
2a130 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ry in the table.
2a140 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
2a150 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
2a160 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20  .  Set *pRes to 
2a170 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  0 if the cursor 
2a180 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20  actually points 
2a190 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20  to something.** 
2a1a0 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20  or set *pRes to 
2a1b0 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  1 if the table i
2a1c0 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20  s empty..*/.int 
2a1d0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74  sqlite3BtreeLast
2a1e0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
2a1f0 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
2a200 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72  nt rc;. .  asser
2a210 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
2a220 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
2a230 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2a240 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
2a250 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
2a260 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  tex) );..  /* If
2a270 20 74 68 65 20 63 75 72 73 6f 72 20 61 6c 72 65   the cursor alre
2a280 61 64 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ady points to th
2a290 65 20 6c 61 73 74 20 65 6e 74 72 79 2c 20 74 68  e last entry, th
2a2a0 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a  is is a no-op. *
2a2b0 2f 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 56  /.  if( CURSOR_V
2a2c0 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
2a2d0 74 65 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72  te && (pCur->cur
2a2e0 46 6c 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c  Flags & BTCF_AtL
2a2f0 61 73 74 29 21 3d 30 20 29 7b 0a 23 69 66 64 65  ast)!=0 ){.#ifde
2a300 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
2a310 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b     /* This block
2a320 20 73 65 72 76 65 73 20 74 6f 20 61 73 73 65 72   serves to asser
2a330 74 28 29 20 74 68 61 74 20 74 68 65 20 63 75 72  t() that the cur
2a340 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65 73 20  sor really does 
2a350 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a 20 74 6f  point .    ** to
2a360 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
2a370 69 6e 20 74 68 65 20 62 2d 74 72 65 65 2e 20 2a  in the b-tree. *
2a380 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20  /.    int ii;.  
2a390 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
2a3a0 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 69 2b 2b  Cur->iPage; ii++
2a3b0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2a3c0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 69 5d   pCur->aiIdx[ii]
2a3d0 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  ==pCur->apPage[i
2a3e0 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  i]->nCell );.   
2a3f0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
2a400 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2a410 3e 69 50 61 67 65 5d 3d 3d 70 43 75 72 2d 3e 61  >iPage]==pCur->a
2a420 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2a430 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20  e]->nCell-1 );. 
2a440 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2a450 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2a460 61 67 65 5d 2d 3e 6c 65 61 66 20 29 3b 0a 23 65  age]->leaf );.#e
2a470 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
2a480 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
2a490 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f    rc = moveToRoo
2a4a0 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  t(pCur);.  if( r
2a4b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2a4c0 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49      if( CURSOR_I
2a4d0 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  NVALID==pCur->eS
2a4e0 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 61 73  tate ){.      as
2a4f0 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
2a500 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
2a510 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2a520 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  age]->nCell==0 )
2a530 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
2a540 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
2a550 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2a560 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2a570 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 20 20  _VALID );.      
2a580 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
2a590 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68   rc = moveToRigh
2a5a0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
2a5b0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2a5c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2a5d0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c  pCur->curFlags |
2a5e0 3d 20 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20  = BTCF_AtLast;. 
2a5f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2a600 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
2a610 67 73 20 26 3d 20 7e 42 54 43 46 5f 41 74 4c 61  gs &= ~BTCF_AtLa
2a620 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 0a  st;.      }.   .
2a630 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2a640 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76  rn rc;.}../* Mov
2a650 65 20 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20  e the cursor so 
2a660 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
2a670 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20  o an entry near 
2a680 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63  the key .** spec
2a690 69 66 69 65 64 20 62 79 20 70 49 64 78 4b 65 79  ified by pIdxKey
2a6a0 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20 52 65   or intKey.   Re
2a6b0 74 75 72 6e 20 61 20 73 75 63 63 65 73 73 20 63  turn a success c
2a6c0 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49  ode..**.** For I
2a6d0 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 74 68  NTKEY tables, th
2a6e0 65 20 69 6e 74 4b 65 79 20 70 61 72 61 6d 65 74  e intKey paramet
2a6f0 65 72 20 69 73 20 75 73 65 64 2e 20 20 70 49 64  er is used.  pId
2a700 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65  xKey .** must be
2a710 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65   NULL.  For inde
2a720 78 20 74 61 62 6c 65 73 2c 20 70 49 64 78 4b 65  x tables, pIdxKe
2a730 79 20 69 73 20 75 73 65 64 20 61 6e 64 20 69 6e  y is used and in
2a740 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72  tKey.** is ignor
2a750 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
2a760 65 78 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e  exact match is n
2a770 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74  ot found, then t
2a780 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77  he cursor is alw
2a790 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e  ays.** left poin
2a7a0 74 69 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70  ting at a leaf p
2a7b0 61 67 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20  age which would 
2a7c0 68 6f 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69  hold the entry i
2a7d0 66 20 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65  f it.** were pre
2a7e0 73 65 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f  sent.  The curso
2a7f0 72 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f  r might point to
2a800 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63   an entry that c
2a810 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f  omes.** before o
2a820 72 20 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e  r after the key.
2a830 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65  .**.** An intege
2a840 72 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  r is written int
2a850 6f 20 2a 70 52 65 73 20 77 68 69 63 68 20 69 73  o *pRes which is
2a860 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a   the result of.*
2a870 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20  * comparing the 
2a880 6b 65 79 20 77 69 74 68 20 74 68 65 20 65 6e 74  key with the ent
2a890 72 79 20 74 6f 20 77 68 69 63 68 20 74 68 65 20  ry to which the 
2a8a0 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f  cursor is .** po
2a8b0 69 6e 74 69 6e 67 2e 20 20 54 68 65 20 6d 65 61  inting.  The mea
2a8c0 6e 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 74 65  ning of the inte
2a8d0 67 65 72 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  ger written into
2a8e0 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20 61 73 20  .** *pRes is as 
2a8f0 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
2a900 20 20 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20     *pRes<0      
2a910 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
2a920 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
2a930 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
2a940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a950 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
2a960 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 20   intKey/pIdxKey 
2a970 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  or if the table 
2a980 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20  is empty.**     
2a990 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 64               and
2a9a0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 74   the cursor is t
2a9b0 68 65 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f  herefore left po
2a9c0 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a  int to nothing..
2a9d0 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d  **.**     *pRes=
2a9e0 3d 30 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  =0     The curso
2a9f0 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
2aa00 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
2aa10 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
2aa20 20 20 20 20 20 20 20 20 65 78 61 63 74 6c 79 20          exactly 
2aa30 6d 61 74 63 68 65 73 20 69 6e 74 4b 65 79 2f 70  matches intKey/p
2aa40 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20  IdxKey..**.**   
2aa50 20 20 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54    *pRes>0      T
2aa60 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
2aa70 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
2aa80 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
2aa90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aaa0 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69  is larger than i
2aab0 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a  ntKey/pIdxKey..*
2aac0 2a 0a 2a 2a 20 46 6f 72 20 69 6e 64 65 78 20 74  *.** For index t
2aad0 61 62 6c 65 73 2c 20 74 68 65 20 70 49 64 78 4b  ables, the pIdxK
2aae0 65 79 2d 3e 65 71 53 65 65 6e 20 66 69 65 6c 64  ey->eqSeen field
2aaf0 20 69 73 20 73 65 74 20 74 6f 20 31 20 69 66 20   is set to 1 if 
2ab00 74 68 65 72 65 0a 2a 2a 20 65 78 69 73 74 73 20  there.** exists 
2ab10 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  an entry in the 
2ab20 74 61 62 6c 65 20 74 68 61 74 20 65 78 61 63 74  table that exact
2ab30 6c 79 20 6d 61 74 63 68 65 73 20 70 49 64 78 4b  ly matches pIdxK
2ab40 65 79 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ey.  .*/.int sql
2ab50 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55  ite3BtreeMovetoU
2ab60 6e 70 61 63 6b 65 64 28 0a 20 20 42 74 43 75 72  npacked(.  BtCur
2ab70 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
2ab80 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
2ab90 72 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f  r to be moved */
2aba0 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
2abb0 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55  d *pIdxKey, /* U
2abc0 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65  npacked index ke
2abd0 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65  y */.  i64 intKe
2abe0 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y,              
2abf0 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6b 65 79  /* The table key
2ac00 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69   */.  int biasRi
2ac10 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ght,           /
2ac20 2a 20 49 66 20 74 72 75 65 2c 20 62 69 61 73 20  * If true, bias 
2ac30 74 68 65 20 73 65 61 72 63 68 20 74 6f 20 74 68  the search to th
2ac40 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20  e high end */.  
2ac50 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20  int *pRes       
2ac60 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
2ac70 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73  e search results
2ac80 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
2ac90 74 20 72 63 3b 0a 20 20 52 65 63 6f 72 64 43 6f  t rc;.  RecordCo
2aca0 6d 70 61 72 65 20 78 52 65 63 6f 72 64 43 6f 6d  mpare xRecordCom
2acb0 70 61 72 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  pare;..  assert(
2acc0 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
2acd0 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
2ace0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2acf0 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
2ad00 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
2ad10 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
2ad20 70 52 65 73 20 29 3b 0a 20 20 61 73 73 65 72 74  pRes );.  assert
2ad30 28 20 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d  ( (pIdxKey==0)==
2ad40 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d  (pCur->pKeyInfo=
2ad50 3d 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  =0) );.  assert(
2ad60 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
2ad70 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 28  URSOR_VALID || (
2ad80 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43  pIdxKey==0)==(pC
2ad90 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 21 3d 30  ur->curIntKey!=0
2ada0 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ) );..  /* If th
2adb0 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65  e cursor is alre
2adc0 61 64 79 20 70 6f 73 69 74 69 6f 6e 65 64 20 61  ady positioned a
2add0 74 20 74 68 65 20 70 6f 69 6e 74 20 77 65 20 61  t the point we a
2ade0 72 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74  re trying.  ** t
2adf0 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20  o move to, then 
2ae00 6a 75 73 74 20 72 65 74 75 72 6e 20 77 69 74 68  just return with
2ae10 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f  out doing any wo
2ae20 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70 49 64 78  rk */.  if( pIdx
2ae30 4b 65 79 3d 3d 30 0a 20 20 20 26 26 20 70 43 75  Key==0.   && pCu
2ae40 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2ae50 52 5f 56 41 4c 49 44 20 26 26 20 28 70 43 75 72  R_VALID && (pCur
2ae60 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
2ae70 46 5f 56 61 6c 69 64 4e 4b 65 79 29 21 3d 30 0a  F_ValidNKey)!=0.
2ae80 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75    ){.    if( pCu
2ae90 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e  r->info.nKey==in
2aea0 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70  tKey ){.      *p
2aeb0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
2aec0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2aed0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
2aee0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2aef0 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21 3d 30   BTCF_AtLast)!=0
2af00 20 26 26 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   && pCur->info.n
2af10 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20  Key<intKey ){.  
2af20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a      *pRes = -1;.
2af30 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2af40 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
2af50 7d 0a 0a 20 20 69 66 28 20 70 49 64 78 4b 65 79  }..  if( pIdxKey
2af60 20 29 7b 0a 20 20 20 20 78 52 65 63 6f 72 64 43   ){.    xRecordC
2af70 6f 6d 70 61 72 65 20 3d 20 73 71 6c 69 74 65 33  ompare = sqlite3
2af80 56 64 62 65 46 69 6e 64 43 6f 6d 70 61 72 65 28  VdbeFindCompare(
2af90 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 70 49  pIdxKey);.    pI
2afa0 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20 3d  dxKey->errCode =
2afb0 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
2afc0 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74  pIdxKey->default
2afd0 5f 72 63 3d 3d 31 20 0a 20 20 20 20 20 20 20 20  _rc==1 .        
2afe0 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65 66   || pIdxKey->def
2aff0 61 75 6c 74 5f 72 63 3d 3d 30 20 0a 20 20 20 20  ault_rc==0 .    
2b000 20 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d       || pIdxKey-
2b010 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 2d 31 0a  >default_rc==-1.
2b020 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a      );.  }else{.
2b030 20 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61      xRecordCompa
2b040 72 65 20 3d 20 30 3b 20 2f 2a 20 41 6c 6c 20 6b  re = 0; /* All k
2b050 65 79 73 20 61 72 65 20 69 6e 74 65 67 65 72 73  eys are integers
2b060 20 2a 2f 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20   */.  }..  rc = 
2b070 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
2b080 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
2b090 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
2b0a0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2b0b0 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20  >pgnoRoot==0 || 
2b0c0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2b0d0 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61  r->iPage] );.  a
2b0e0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e  ssert( pCur->pgn
2b0f0 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72  oRoot==0 || pCur
2b100 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2b110 50 61 67 65 5d 2d 3e 69 73 49 6e 69 74 20 29 3b  Page]->isInit );
2b120 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2b130 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2b140 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  INVALID || pCur-
2b150 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2b160 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b  age]->nCell>0 );
2b170 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
2b180 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
2b190 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  LID ){.    *pRes
2b1a0 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72   = -1;.    asser
2b1b0 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t( pCur->pgnoRoo
2b1c0 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70  t==0 || pCur->ap
2b1d0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2b1e0 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  ]->nCell==0 );. 
2b1f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2b200 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  _OK;.  }.  asser
2b210 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
2b220 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 70 43 75 72  0]->intKey==pCur
2b230 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29 3b 0a 20  ->curIntKey );. 
2b240 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63   assert( pCur->c
2b250 75 72 49 6e 74 4b 65 79 20 7c 7c 20 70 49 64 78  urIntKey || pIdx
2b260 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28 3b 3b 29  Key );.  for(;;)
2b270 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c 20 75  {.    int lwr, u
2b280 70 72 2c 20 69 64 78 2c 20 63 3b 0a 20 20 20 20  pr, idx, c;.    
2b290 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20  Pgno chldPg;.   
2b2a0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
2b2b0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
2b2c0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20  Cur->iPage];.   
2b2d0 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20   u8 *pCell;     
2b2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b2f0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
2b300 74 6f 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 20  to current cell 
2b310 69 6e 20 70 50 61 67 65 20 2a 2f 0a 0a 20 20 20  in pPage */..   
2b320 20 2f 2a 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   /* pPage->nCell
2b330 20 6d 75 73 74 20 62 65 20 67 72 65 61 74 65 72   must be greater
2b340 20 74 68 61 6e 20 7a 65 72 6f 2e 20 49 66 20 74   than zero. If t
2b350 68 69 73 20 69 73 20 74 68 65 20 72 6f 6f 74 2d  his is the root-
2b360 70 61 67 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  page.    ** the 
2b370 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 68 61 76  cursor would hav
2b380 65 20 62 65 65 6e 20 49 4e 56 41 4c 49 44 20 61  e been INVALID a
2b390 62 6f 76 65 20 61 6e 64 20 74 68 69 73 20 66 6f  bove and this fo
2b3a0 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20 20 20 2a  r(;;) loop.    *
2b3b0 2a 20 6e 6f 74 20 72 75 6e 2e 20 49 66 20 74 68  * not run. If th
2b3c0 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 72 6f  is is not the ro
2b3d0 6f 74 2d 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ot-page, then th
2b3e0 65 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20  e moveToChild() 
2b3f0 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 77  routine.    ** w
2b400 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64  ould have alread
2b410 79 20 64 65 74 65 63 74 65 64 20 64 62 20 63 6f  y detected db co
2b420 72 72 75 70 74 69 6f 6e 2e 20 53 69 6d 69 6c 61  rruption. Simila
2b430 72 6c 79 2c 20 70 50 61 67 65 20 6d 75 73 74 0a  rly, pPage must.
2b440 20 20 20 20 2a 2a 20 62 65 20 74 68 65 20 72 69      ** be the ri
2b450 67 68 74 20 6b 69 6e 64 20 28 69 6e 64 65 78 20  ght kind (index 
2b460 6f 72 20 74 61 62 6c 65 29 20 6f 66 20 62 2d 74  or table) of b-t
2b470 72 65 65 20 70 61 67 65 2e 20 4f 74 68 65 72 77  ree page. Otherw
2b480 69 73 65 0a 20 20 20 20 2a 2a 20 61 20 6d 6f 76  ise.    ** a mov
2b490 65 54 6f 43 68 69 6c 64 28 29 20 6f 72 20 6d 6f  eToChild() or mo
2b4a0 76 65 54 6f 52 6f 6f 74 28 29 20 63 61 6c 6c 20  veToRoot() call 
2b4b0 77 6f 75 6c 64 20 68 61 76 65 20 64 65 74 65 63  would have detec
2b4c0 74 65 64 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20  ted corruption. 
2b4d0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
2b4e0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29  pPage->nCell>0 )
2b4f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
2b500 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 28 70 49  age->intKey==(pI
2b510 64 78 4b 65 79 3d 3d 30 29 20 29 3b 0a 20 20 20  dxKey==0) );.   
2b520 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20 75 70   lwr = 0;.    up
2b530 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  r = pPage->nCell
2b540 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  -1;.    assert( 
2b550 62 69 61 73 52 69 67 68 74 3d 3d 30 20 7c 7c 20  biasRight==0 || 
2b560 62 69 61 73 52 69 67 68 74 3d 3d 31 20 29 3b 0a  biasRight==1 );.
2b570 20 20 20 20 69 64 78 20 3d 20 75 70 72 3e 3e 28      idx = upr>>(
2b580 31 2d 62 69 61 73 52 69 67 68 74 29 3b 20 2f 2a  1-biasRight); /*
2b590 20 69 64 78 20 3d 20 62 69 61 73 52 69 67 68 74   idx = biasRight
2b5a0 20 3f 20 75 70 72 20 3a 20 28 6c 77 72 2b 75 70   ? upr : (lwr+up
2b5b0 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 70 43 75  r)/2; */.    pCu
2b5c0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2b5d0 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78  Page] = (u16)idx
2b5e0 3b 0a 20 20 20 20 69 66 28 20 78 52 65 63 6f 72  ;.    if( xRecor
2b5f0 64 43 6f 6d 70 61 72 65 3d 3d 30 20 29 7b 0a 20  dCompare==0 ){. 
2b600 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20       for(;;){.  
2b610 20 20 20 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b        i64 nCellK
2b620 65 79 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c  ey;.        pCel
2b630 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 50 61 73 74  l = findCellPast
2b640 50 74 72 28 70 50 61 67 65 2c 20 69 64 78 29 3b  Ptr(pPage, idx);
2b650 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
2b660 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29  ge->intKeyLeaf )
2b670 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  {.          whil
2b680 65 28 20 30 78 38 30 20 3c 3d 20 2a 28 70 43 65  e( 0x80 <= *(pCe
2b690 6c 6c 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20 20  ll++) ){.       
2b6a0 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 3e 3d       if( pCell>=
2b6b0 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
2b6c0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2b6d0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2b6e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b6f0 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56    }.        getV
2b700 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36  arint(pCell, (u6
2b710 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20  4*)&nCellKey);. 
2b720 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c         if( nCell
2b730 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20  Key<intKey ){.  
2b740 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64          lwr = id
2b750 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69  x+1;.          i
2b760 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63 20  f( lwr>upr ){ c 
2b770 3d 20 2d 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20  = -1; break; }. 
2b780 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
2b790 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79   nCellKey>intKey
2b7a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70   ){.          up
2b7b0 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20  r = idx-1;.     
2b7c0 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72       if( lwr>upr
2b7d0 20 29 7b 20 63 20 3d 20 2b 31 3b 20 62 72 65 61   ){ c = +1; brea
2b7e0 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c  k; }.        }el
2b7f0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  se{.          as
2b800 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d  sert( nCellKey==
2b810 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 20 20  intKey );.      
2b820 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
2b830 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
2b840 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20  u16)idx;.       
2b850 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
2b860 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
2b870 20 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20     lwr = idx;.  
2b880 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
2b890 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72  oveto_next_layer
2b8a0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
2b8b0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e{.            p
2b8c0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d  Cur->curFlags |=
2b8d0 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b   BTCF_ValidNKey;
2b8e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 75  .            pCu
2b8f0 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e  r->info.nKey = n
2b900 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20  CellKey;.       
2b910 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e       pCur->info.
2b920 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20  nSize = 0;.     
2b930 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30         *pRes = 0
2b940 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ;.            re
2b950 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2b960 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2b970 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
2b980 73 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30  sert( lwr+upr>=0
2b990 20 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20   );.        idx 
2b9a0 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20  = (lwr+upr)>>1; 
2b9b0 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b 75   /* idx = (lwr+u
2b9c0 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 20 20  pr)/2; */.      
2b9d0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
2b9e0 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20     for(;;){.    
2b9f0 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20      int nCell;  
2ba00 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 70  /* Size of the p
2ba10 43 65 6c 6c 20 63 65 6c 6c 20 69 6e 20 62 79 74  Cell cell in byt
2ba20 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 43  es */.        pC
2ba30 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 50 61  ell = findCellPa
2ba40 73 74 50 74 72 28 70 50 61 67 65 2c 20 69 64 78  stPtr(pPage, idx
2ba50 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  );..        /* T
2ba60 68 65 20 6d 61 78 69 6d 75 6d 20 73 75 70 70 6f  he maximum suppo
2ba70 72 74 65 64 20 70 61 67 65 2d 73 69 7a 65 20 69  rted page-size i
2ba80 73 20 36 35 35 33 36 20 62 79 74 65 73 2e 20 54  s 65536 bytes. T
2ba90 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 0a 20  his means that. 
2baa0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d 61         ** the ma
2bab0 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
2bac0 72 65 63 6f 72 64 20 62 79 74 65 73 20 73 74 6f  record bytes sto
2bad0 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20  red on an index 
2bae0 42 2d 54 72 65 65 0a 20 20 20 20 20 20 20 20 2a  B-Tree.        *
2baf0 2a 20 70 61 67 65 20 69 73 20 6c 65 73 73 20 74  * page is less t
2bb00 68 61 6e 20 31 36 33 38 34 20 62 79 74 65 73 20  han 16384 bytes 
2bb10 61 6e 64 20 6d 61 79 20 62 65 20 73 74 6f 72 65  and may be store
2bb20 64 20 61 73 20 61 20 32 2d 62 79 74 65 0a 20 20  d as a 2-byte.  
2bb30 20 20 20 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e        ** varint.
2bb40 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
2bb50 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 74 74  n is used to att
2bb60 65 6d 70 74 20 74 6f 20 61 76 6f 69 64 20 70 61  empt to avoid pa
2bb70 72 73 69 6e 67 20 0a 20 20 20 20 20 20 20 20 2a  rsing .        *
2bb80 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 65 6c  * the entire cel
2bb90 6c 20 62 79 20 63 68 65 63 6b 69 6e 67 20 66 6f  l by checking fo
2bba0 72 20 74 68 65 20 63 61 73 65 73 20 77 68 65 72  r the cases wher
2bbb0 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20  e the record is 
2bbc0 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72  .        ** stor
2bbd0 65 64 20 65 6e 74 69 72 65 6c 79 20 77 69 74 68  ed entirely with
2bbe0 69 6e 20 74 68 65 20 62 2d 74 72 65 65 20 70 61  in the b-tree pa
2bbf0 67 65 20 62 79 20 69 6e 73 70 65 63 74 69 6e 67  ge by inspecting
2bc00 20 74 68 65 20 66 69 72 73 74 20 0a 20 20 20 20   the first .    
2bc10 20 20 20 20 2a 2a 20 32 20 62 79 74 65 73 20 6f      ** 2 bytes o
2bc20 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20 20 20 20  f the cell..    
2bc30 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e      */.        n
2bc40 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b  Cell = pCell[0];
2bc50 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65  .        if( nCe
2bc60 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 31 62  ll<=pPage->max1b
2bc70 79 74 65 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20  ytePayload ){.  
2bc80 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
2bc90 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20 74  branch runs if t
2bca0 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66  he record-size f
2bcb0 69 65 6c 64 20 6f 66 20 74 68 65 20 63 65 6c 6c  ield of the cell
2bcc0 20 69 73 20 61 0a 20 20 20 20 20 20 20 20 20 20   is a.          
2bcd0 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65 20 76  ** single byte v
2bce0 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65  arint and the re
2bcf0 63 6f 72 64 20 66 69 74 73 20 65 6e 74 69 72 65  cord fits entire
2bd00 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a 20  ly on the main. 
2bd10 20 20 20 20 20 20 20 20 20 2a 2a 20 62 2d 74 72           ** b-tr
2bd20 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20  ee page.  */.   
2bd30 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2bd40 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d   pCell+nCell+1==
2bd50 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
2bd60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  );.          c =
2bd70 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28   xRecordCompare(
2bd80 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70  nCell, (void*)&p
2bd90 43 65 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65 79  Cell[1], pIdxKey
2bda0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
2bdb0 20 69 66 28 20 21 28 70 43 65 6c 6c 5b 31 5d 20   if( !(pCell[1] 
2bdc0 26 20 30 78 38 30 29 20 0a 20 20 20 20 20 20 20  & 0x80) .       
2bdd0 20 20 20 26 26 20 28 6e 43 65 6c 6c 20 3d 20 28     && (nCell = (
2bde0 28 6e 43 65 6c 6c 26 30 78 37 66 29 3c 3c 37 29  (nCell&0x7f)<<7)
2bdf0 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50   + pCell[1])<=pP
2be00 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20  age->maxLocal.  
2be10 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2be20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64     /* The record
2be30 2d 73 69 7a 65 20 66 69 65 6c 64 20 69 73 20 61  -size field is a
2be40 20 32 20 62 79 74 65 20 76 61 72 69 6e 74 20 61   2 byte varint a
2be50 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 0a 20  nd the record . 
2be60 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 74 73           ** fits
2be70 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65   entirely on the
2be80 20 6d 61 69 6e 20 62 2d 74 72 65 65 20 70 61 67   main b-tree pag
2be90 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  e.  */.         
2bea0 20 74 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c   testcase( pCell
2beb0 2b 6e 43 65 6c 6c 2b 32 3d 3d 70 50 61 67 65 2d  +nCell+2==pPage-
2bec0 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 20  >aDataEnd );.   
2bed0 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f         c = xReco
2bee0 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c  rdCompare(nCell,
2bef0 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 32   (void*)&pCell[2
2bf00 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  ], pIdxKey);.   
2bf10 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2bf20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63        /* The rec
2bf30 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65 72 20 6f  ord flows over o
2bf40 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  nto one or more 
2bf50 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
2bf60 49 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  In.          ** 
2bf70 74 68 69 73 20 63 61 73 65 20 74 68 65 20 77 68  this case the wh
2bf80 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64 73 20 74  ole cell needs t
2bf90 6f 20 62 65 20 70 61 72 73 65 64 2c 20 61 20 62  o be parsed, a b
2bfa0 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a  uffer allocated.
2bfb0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64            ** and
2bfc0 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29   accessPayload()
2bfd0 20 75 73 65 64 20 74 6f 20 72 65 74 72 69 65 76   used to retriev
2bfe0 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e 74  e the record int
2bff0 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  o the.          
2c000 2a 2a 20 62 75 66 66 65 72 20 62 65 66 6f 72 65  ** buffer before
2c010 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   VdbeRecordCompa
2c020 72 65 28 29 20 63 61 6e 20 62 65 20 63 61 6c 6c  re() can be call
2c030 65 64 2e 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ed. .          *
2c040 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49  *.          ** I
2c050 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20  f the record is 
2c060 63 6f 72 72 75 70 74 2c 20 74 68 65 20 78 52 65  corrupt, the xRe
2c070 63 6f 72 64 43 6f 6d 70 61 72 65 20 72 6f 75 74  cordCompare rout
2c080 69 6e 65 20 6d 61 79 20 72 65 61 64 0a 20 20 20  ine may read.   
2c090 20 20 20 20 20 20 20 2a 2a 20 75 70 20 74 6f 20         ** up to 
2c0a0 74 77 6f 20 76 61 72 69 6e 74 73 20 70 61 73 74  two varints past
2c0b0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
2c0c0 62 75 66 66 65 72 2e 20 41 6e 20 65 78 74 72 61  buffer. An extra
2c0d0 20 31 38 20 0a 20 20 20 20 20 20 20 20 20 20 2a   18 .          *
2c0e0 2a 20 62 79 74 65 73 20 6f 66 20 70 61 64 64 69  * bytes of paddi
2c0f0 6e 67 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  ng is allocated 
2c100 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
2c110 65 20 62 75 66 66 65 72 20 69 6e 0a 20 20 20 20  e buffer in.    
2c120 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68        ** case th
2c130 69 73 20 68 61 70 70 65 6e 73 2e 20 20 2a 2f 0a  is happens.  */.
2c140 20 20 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a            void *
2c150 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  pCellKey;.      
2c160 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70      u8 * const p
2c170 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c 6c  CellBody = pCell
2c180 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   - pPage->childP
2c190 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  trSize;.        
2c1a0 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
2c1b0 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
2c1c0 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66  Body, &pCur->inf
2c1d0 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43  o);.          nC
2c1e0 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43 75 72 2d  ell = (int)pCur-
2c1f0 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20  >info.nKey;.    
2c200 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2c210 6e 43 65 6c 6c 3c 30 20 29 3b 20 20 20 2f 2a 20  nCell<0 );   /* 
2c220 54 72 75 65 20 69 66 20 6b 65 79 20 73 69 7a 65  True if key size
2c230 20 69 73 20 32 5e 33 32 20 6f 72 20 6d 6f 72 65   is 2^32 or more
2c240 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65   */.          te
2c250 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 30  stcase( nCell==0
2c260 20 29 3b 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20   );  /* Invalid 
2c270 6b 65 79 20 73 69 7a 65 3a 20 20 30 78 38 30 20  key size:  0x80 
2c280 30 78 38 30 20 30 78 30 30 20 2a 2f 0a 20 20 20  0x80 0x00 */.   
2c290 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2c2a0 20 6e 43 65 6c 6c 3d 3d 31 20 29 3b 20 20 2f 2a   nCell==1 );  /*
2c2b0 20 49 6e 76 61 6c 69 64 20 6b 65 79 20 73 69 7a   Invalid key siz
2c2c0 65 3a 20 20 30 78 38 30 20 30 78 38 30 20 30 78  e:  0x80 0x80 0x
2c2d0 30 31 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  01 */.          
2c2e0 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d  testcase( nCell=
2c2f0 3d 32 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75  =2 );  /* Minimu
2c300 6d 20 6c 65 67 61 6c 20 69 6e 64 65 78 20 6b 65  m legal index ke
2c310 79 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20  y size */.      
2c320 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c 32 20      if( nCell<2 
2c330 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
2c340 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
2c350 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
2c360 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
2c370 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
2c380 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
2c390 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65  CellKey = sqlite
2c3a0 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 2b 31  3Malloc( nCell+1
2c3b0 38 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  8 );.          i
2c3c0 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29  f( pCellKey==0 )
2c3d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
2c3e0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
2c3f0 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
2c400 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
2c410 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20  nish;.          
2c420 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  }.          pCur
2c430 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2c440 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b  age] = (u16)idx;
2c450 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2c460 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
2c470 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75  ur, 0, nCell, (u
2c480 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 43  nsigned char*)pC
2c490 65 6c 6c 4b 65 79 2c 20 32 29 3b 0a 20 20 20 20  ellKey, 2);.    
2c4a0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
2c4b0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2c4c0 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65  te3_free(pCellKe
2c4d0 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y);.            
2c4e0 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
2c4f0 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  sh;.          }.
2c500 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52            c = xR
2c510 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65  ecordCompare(nCe
2c520 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49  ll, pCellKey, pI
2c530 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  dxKey);.        
2c540 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
2c550 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
2c560 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
2c570 72 74 28 20 0a 20 20 20 20 20 20 20 20 20 20 20  rt( .           
2c580 20 28 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f   (pIdxKey->errCo
2c590 64 65 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55  de!=SQLITE_CORRU
2c5a0 50 54 20 7c 7c 20 63 3d 3d 30 29 0a 20 20 20 20  PT || c==0).    
2c5b0 20 20 20 20 20 26 26 20 28 70 49 64 78 4b 65 79       && (pIdxKey
2c5c0 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
2c5d0 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 70 43 75 72 2d  E_NOMEM || pCur-
2c5e0 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 61 6c  >pBtree->db->mal
2c5f0 6c 6f 63 46 61 69 6c 65 64 29 0a 20 20 20 20 20  locFailed).     
2c600 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
2c610 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ( c<0 ){.       
2c620 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a     lwr = idx+1;.
2c630 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
2c640 28 20 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ( c>0 ){.       
2c650 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a     upr = idx-1;.
2c660 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2c670 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2c680 20 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20   c==0 );.       
2c690 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
2c6a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2c6b0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
2c6c0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
2c6d0 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
2c6e0 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20  6)idx;.         
2c6f0 20 69 66 28 20 70 49 64 78 4b 65 79 2d 3e 65 72   if( pIdxKey->er
2c700 72 43 6f 64 65 20 29 20 72 63 20 3d 20 53 51 4c  rCode ) rc = SQL
2c710 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  ITE_CORRUPT;.   
2c720 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
2c730 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
2c740 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
2c750 20 6c 77 72 3e 75 70 72 20 29 20 62 72 65 61 6b   lwr>upr ) break
2c760 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2c770 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a  ( lwr+upr>=0 );.
2c780 20 20 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c          idx = (l
2c790 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20  wr+upr)>>1;  /* 
2c7a0 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f  idx = (lwr+upr)/
2c7b0 32 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  2 */.      }.   
2c7c0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c   }.    assert( l
2c7d0 77 72 3d 3d 75 70 72 2b 31 20 7c 7c 20 28 70 50  wr==upr+1 || (pP
2c7e0 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21  age->intKey && !
2c7f0 70 50 61 67 65 2d 3e 6c 65 61 66 29 20 29 3b 0a  pPage->leaf) );.
2c800 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2c810 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20  e->isInit );.   
2c820 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
2c830 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2c840 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
2c850 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d  ur->iPage]<pCur-
2c860 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2c870 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  age]->nCell );. 
2c880 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78       pCur->aiIdx
2c890 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
2c8a0 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20  (u16)idx;.      
2c8b0 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20  *pRes = c;.     
2c8c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2c8d0 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65  .      goto move
2c8e0 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d  to_finish;.    }
2c8f0 0a 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79  .moveto_next_lay
2c900 65 72 3a 0a 20 20 20 20 69 66 28 20 6c 77 72 3e  er:.    if( lwr>
2c910 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b  =pPage->nCell ){
2c920 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20  .      chldPg = 
2c930 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
2c940 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
2c950 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
2c960 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
2c970 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28  ldPg = get4byte(
2c980 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
2c990 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  lwr));.    }.   
2c9a0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2c9b0 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36  r->iPage] = (u16
2c9c0 29 6c 77 72 3b 0a 20 20 20 20 72 63 20 3d 20 6d  )lwr;.    rc = m
2c9d0 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
2c9e0 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66   chldPg);.    if
2c9f0 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20  ( rc ) break;.  
2ca00 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a  }.moveto_finish:
2ca10 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
2ca20 69 7a 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  ize = 0;.  asser
2ca30 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  t( (pCur->curFla
2ca40 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f  gs & BTCF_ValidO
2ca50 76 66 6c 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74  vfl)==0 );.  ret
2ca60 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
2ca70 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
2ca80 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e   the cursor is n
2ca90 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ot pointing at a
2caa0 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74  n entry of the t
2cab0 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45  able..**.** TRUE
2cac0 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
2cad0 64 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74  d after a call t
2cae0 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  o sqlite3BtreeNe
2caf0 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61  xt() moves.** pa
2cb00 73 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  st the last entr
2cb10 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f  y in the table o
2cb20 72 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  r sqlite3BtreePr
2cb30 65 76 28 29 20 6d 6f 76 65 73 20 70 61 73 74 0a  ev() moves past.
2cb40 2a 2a 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  ** the first ent
2cb50 72 79 2e 20 20 54 52 55 45 20 69 73 20 61 6c 73  ry.  TRUE is als
2cb60 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  o returned if th
2cb70 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
2cb80 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2cb90 42 74 72 65 65 45 6f 66 28 42 74 43 75 72 73 6f  BtreeEof(BtCurso
2cba0 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54  r *pCur){.  /* T
2cbb0 4f 44 4f 3a 20 57 68 61 74 20 69 66 20 74 68 65  ODO: What if the
2cbc0 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20 43 55   cursor is in CU
2cbd0 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
2cbe0 20 62 75 74 20 61 6c 6c 20 74 61 62 6c 65 20 65   but all table e
2cbf0 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68 61 76 65  ntries.  ** have
2cc00 20 62 65 65 6e 20 64 65 6c 65 74 65 64 3f 20 54   been deleted? T
2cc10 68 69 73 20 41 50 49 20 77 69 6c 6c 20 6e 65 65  his API will nee
2cc20 64 20 74 6f 20 63 68 61 6e 67 65 20 74 6f 20 72  d to change to r
2cc30 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
2cc40 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c  ode.  ** as well
2cc50 20 61 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20   as the boolean 
2cc60 72 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20  result value..  
2cc70 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 43 55 52  */.  return (CUR
2cc80 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d  SOR_VALID!=pCur-
2cc90 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a  >eState);.}../*.
2cca0 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 63  ** Advance the c
2ccb0 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78  ursor to the nex
2ccc0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
2ccd0 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20  atabase.  If.** 
2cce0 73 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20  successful then 
2ccf0 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66  set *pRes=0.  If
2cd00 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77   the cursor.** w
2cd10 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  as already point
2cd20 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74 20  ing to the last 
2cd30 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
2cd40 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20  abase before.** 
2cd50 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
2cd60 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65   called, then se
2cd70 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a  t *pRes=1..**.**
2cd80 20 54 68 65 20 6d 61 69 6e 20 65 6e 74 72 79 20   The main entry 
2cd90 70 6f 69 6e 74 20 69 73 20 73 71 6c 69 74 65 33  point is sqlite3
2cda0 42 74 72 65 65 4e 65 78 74 28 29 2e 20 20 54 68  BtreeNext().  Th
2cdb0 61 74 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 70  at routine is op
2cdc0 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74  timized.** for t
2cdd0 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f  he common case o
2cde0 66 20 6d 65 72 65 6c 79 20 69 6e 63 72 65 6d 65  f merely increme
2cdf0 6e 74 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 63  nting the cell c
2ce00 6f 75 6e 74 65 72 20 42 74 43 75 72 73 6f 72 2e  ounter BtCursor.
2ce10 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20  aiIdx.** to the 
2ce20 6e 65 78 74 20 63 65 6c 6c 20 6f 6e 20 74 68 65  next cell on the
2ce30 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 20   current page.  
2ce40 54 68 65 20 28 73 6c 6f 77 65 72 29 20 62 74 72  The (slower) btr
2ce50 65 65 4e 65 78 74 28 29 20 68 65 6c 70 65 72 0a  eeNext() helper.
2ce60 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ** routine is ca
2ce70 6c 6c 65 64 20 77 68 65 6e 20 69 74 20 69 73 20  lled when it is 
2ce80 6e 65 63 65 73 73 61 72 79 20 74 6f 20 6d 6f 76  necessary to mov
2ce90 65 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74  e to a different
2cea0 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 6f 20 72   page or.** to r
2ceb0 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f  estore the curso
2cec0 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  r..**.** The cal
2ced0 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 77 69  ling function wi
2cee0 6c 6c 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20  ll set *pRes to 
2cef0 30 20 6f 72 20 31 2e 20 20 54 68 65 20 69 6e 69  0 or 1.  The ini
2cf00 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65  tial *pRes value
2cf10 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 31 20 69 66  .** will be 1 if
2cf20 20 74 68 65 20 63 75 72 73 6f 72 20 62 65 69 6e   the cursor bein
2cf30 67 20 73 74 65 70 70 65 64 20 63 6f 72 72 65 73  g stepped corres
2cf40 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c 20  ponds to an SQL 
2cf50 69 6e 64 65 78 20 61 6e 64 0a 2a 2a 20 69 66 20  index and.** if 
2cf60 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 75  this routine cou
2cf70 6c 64 20 68 61 76 65 20 62 65 65 6e 20 73 6b 69  ld have been ski
2cf80 70 70 65 64 20 69 66 20 74 68 61 74 20 53 51 4c  pped if that SQL
2cf90 20 69 6e 64 65 78 20 68 61 64 20 62 65 65 6e 0a   index had been.
2cfa0 2a 2a 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65  ** a unique inde
2cfb0 78 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68  x.  Otherwise th
2cfc0 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61  e caller will ha
2cfd0 76 65 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20  ve set *pRes to 
2cfe0 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73  zero..** Zero is
2cff0 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
2d000 2e 20 54 68 65 20 62 74 72 65 65 20 69 6d 70 6c  . The btree impl
2d010 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 66 72  ementation is fr
2d020 65 65 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a  ee to use the.**
2d030 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76   initial *pRes v
2d040 61 6c 75 65 20 61 73 20 61 20 68 69 6e 74 20 74  alue as a hint t
2d050 6f 20 69 6d 70 72 6f 76 65 20 70 65 72 66 6f 72  o improve perfor
2d060 6d 61 6e 63 65 2c 20 62 75 74 20 74 68 65 20 63  mance, but the c
2d070 75 72 72 65 6e 74 0a 2a 2a 20 53 51 4c 69 74 65  urrent.** SQLite
2d080 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74   btree implement
2d090 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 2e 20  ation does not. 
2d0a0 28 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63  (Note that the c
2d0b0 6f 6d 64 62 32 20 62 74 72 65 65 0a 2a 2a 20 69  omdb2 btree.** i
2d0c0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f  mplementation do
2d0d0 65 73 20 75 73 65 20 74 68 69 73 20 68 69 6e 74  es use this hint
2d0e0 2c 20 68 6f 77 65 76 65 72 2e 29 0a 2a 2f 0a 73  , however.).*/.s
2d0f0 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
2d100 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72 65 65 4e  NLINE int btreeN
2d110 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ext(BtCursor *pC
2d120 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
2d130 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
2d140 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  idx;.  MemPage *
2d150 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
2d160 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
2d170 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
2d180 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b  assert( pCur->sk
2d190 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75  ipNext==0 || pCu
2d1a0 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2d1b0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
2d1c0 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 29 3b  ert( *pRes==0 );
2d1d0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
2d1e0 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
2d1f0 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  D ){.    assert(
2d200 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
2d210 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66   & BTCF_ValidOvf
2d220 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  l)==0 );.    rc 
2d230 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
2d240 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
2d250 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2d260 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
2d270 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
2d280 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e     if( CURSOR_IN
2d290 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
2d2a0 61 74 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  ate ){.      *pR
2d2b0 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65  es = 1;.      re
2d2c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2d2d0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43      }.    if( pC
2d2e0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a  ur->skipNext ){.
2d2f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
2d300 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2d310 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  OR_VALID || pCur
2d320 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2d330 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20 20  _SKIPNEXT );.   
2d340 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
2d350 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
2d360 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
2d370 73 6b 69 70 4e 65 78 74 3e 30 20 29 7b 0a 20 20  skipNext>0 ){.  
2d380 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70        pCur->skip
2d390 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Next = 0;.      
2d3a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2d3b0 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
2d3c0 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
2d3d0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
2d3e0 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
2d3f0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2d400 61 67 65 5d 3b 0a 20 20 69 64 78 20 3d 20 2b 2b  age];.  idx = ++
2d410 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2d420 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65  ->iPage];.  asse
2d430 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
2d440 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  t );..  /* If th
2d450 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2d460 69 73 20 63 6f 72 72 75 70 74 2c 20 69 74 20 69  is corrupt, it i
2d470 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74  s possible for t
2d480 68 65 20 76 61 6c 75 65 20 6f 66 20 69 64 78 20  he value of idx 
2d490 0a 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76 61  .  ** to be inva
2d4a0 6c 69 64 20 68 65 72 65 2e 20 54 68 69 73 20 63  lid here. This c
2d4b0 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66  an only occur if
2d4c0 20 61 20 73 65 63 6f 6e 64 20 63 75 72 73 6f 72   a second cursor
2d4d0 20 6d 6f 64 69 66 69 65 73 0a 20 20 2a 2a 20 74   modifies.  ** t
2d4e0 68 65 20 70 61 67 65 20 77 68 69 6c 65 20 63 75  he page while cu
2d4f0 72 73 6f 72 20 70 43 75 72 20 69 73 20 68 6f 6c  rsor pCur is hol
2d500 64 69 6e 67 20 61 20 72 65 66 65 72 65 6e 63 65  ding a reference
2d510 20 74 6f 20 69 74 2e 20 57 68 69 63 68 20 63 61   to it. Which ca
2d520 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20 68 61 70 70  n.  ** only happ
2d530 65 6e 20 69 66 20 74 68 65 20 64 61 74 61 62 61  en if the databa
2d540 73 65 20 69 73 20 63 6f 72 72 75 70 74 20 69 6e  se is corrupt in
2d550 20 73 75 63 68 20 61 20 77 61 79 20 61 73 20 74   such a way as t
2d560 6f 20 6c 69 6e 6b 20 74 68 65 0a 20 20 2a 2a 20  o link the.  ** 
2d570 70 61 67 65 20 69 6e 74 6f 20 6d 6f 72 65 20 74  page into more t
2d580 68 61 6e 20 6f 6e 65 20 62 2d 74 72 65 65 20 73  han one b-tree s
2d590 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 74  tructure. */.  t
2d5a0 65 73 74 63 61 73 65 28 20 69 64 78 3e 70 50 61  estcase( idx>pPa
2d5b0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20  ge->nCell );..  
2d5c0 69 66 28 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e  if( idx>=pPage->
2d5d0 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28  nCell ){.    if(
2d5e0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
2d5f0 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
2d600 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65  ToChild(pCur, ge
2d610 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
2d620 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
2d630 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20  ffset+8]));.    
2d640 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2d650 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75  n rc;.      retu
2d660 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  rn moveToLeftmos
2d670 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20  t(pCur);.    }. 
2d680 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66 28     do{.      if(
2d690 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20   pCur->iPage==0 
2d6a0 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73  ){.        *pRes
2d6b0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43   = 1;.        pC
2d6c0 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
2d6d0 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
2d6e0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2d6f0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
2d700 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e       moveToParen
2d710 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70  t(pCur);.      p
2d720 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
2d730 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2d740 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43  ;.    }while( pC
2d750 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2d760 69 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e  iPage]>=pPage->n
2d770 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66 28 20  Cell );.    if( 
2d780 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
2d790 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71  .      return sq
2d7a0 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70  lite3BtreeNext(p
2d7b0 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20  Cur, pRes);.    
2d7c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
2d7d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2d7e0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
2d7f0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2d800 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2d810 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
2d820 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65   return moveToLe
2d830 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
2d840 7d 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  }.}.int sqlite3B
2d850 74 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f  treeNext(BtCurso
2d860 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
2d870 65 73 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  es){.  MemPage *
2d880 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28  pPage;.  assert(
2d890 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
2d8a0 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
2d8b0 73 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29  ssert( pRes!=0 )
2d8c0 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52 65  ;.  assert( *pRe
2d8d0 73 3d 3d 30 20 7c 7c 20 2a 70 52 65 73 3d 3d 31  s==0 || *pRes==1
2d8e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2d8f0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20  ur->skipNext==0 
2d900 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  || pCur->eState!
2d910 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
2d920 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
2d930 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
2d940 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42  >curFlags &= ~(B
2d950 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54  TCF_ValidNKey|BT
2d960 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20  CF_ValidOvfl);. 
2d970 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 69 66   *pRes = 0;.  if
2d980 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  ( pCur->eState!=
2d990 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 20 72  CURSOR_VALID ) r
2d9a0 65 74 75 72 6e 20 62 74 72 65 65 4e 65 78 74 28  eturn btreeNext(
2d9b0 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 70  pCur, pRes);.  p
2d9c0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
2d9d0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2d9e0 3b 0a 20 20 69 66 28 20 28 2b 2b 70 43 75 72 2d  ;.  if( (++pCur-
2d9f0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2da00 67 65 5d 29 3e 3d 70 50 61 67 65 2d 3e 6e 43 65  ge])>=pPage->nCe
2da10 6c 6c 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  ll ){.    pCur->
2da20 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2da30 65 5d 2d 2d 3b 0a 20 20 20 20 72 65 74 75 72 6e  e]--;.    return
2da40 20 62 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c   btreeNext(pCur,
2da50 20 70 52 65 73 29 3b 0a 20 20 7d 0a 20 20 69 66   pRes);.  }.  if
2da60 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
2da70 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2da80 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
2da90 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54      return moveT
2daa0 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
2dab0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74  .  }.}../*.** St
2dac0 65 70 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ep the cursor to
2dad0 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65   the back to the
2dae0 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20   previous entry 
2daf0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
2db00 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66    If.** successf
2db10 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  ul then set *pRe
2db20 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72  s=0.  If the cur
2db30 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61  sor.** was alrea
2db40 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  dy pointing to t
2db50 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
2db60 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  n the database b
2db70 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f  efore.** this ro
2db80 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
2db90 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  , then set *pRes
2dba0 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  =1..**.** The ma
2dbb0 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 69  in entry point i
2dbc0 73 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  s sqlite3BtreePr
2dbd0 65 76 69 6f 75 73 28 29 2e 20 20 54 68 61 74 20  evious().  That 
2dbe0 72 6f 75 74 69 6e 65 20 69 73 20 6f 70 74 69 6d  routine is optim
2dbf0 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20  ized.** for the 
2dc00 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d  common case of m
2dc10 65 72 65 6c 79 20 64 65 63 72 65 6d 65 6e 74 69  erely decrementi
2dc20 6e 67 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e  ng the cell coun
2dc30 74 65 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49  ter BtCursor.aiI
2dc40 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20 70 72 65  dx.** to the pre
2dc50 76 69 6f 75 73 20 63 65 6c 6c 20 6f 6e 20 74 68  vious cell on th
2dc60 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20  e current page. 
2dc70 20 54 68 65 20 28 73 6c 6f 77 65 72 29 20 62 74   The (slower) bt
2dc80 72 65 65 50 72 65 76 69 6f 75 73 28 29 0a 2a 2a  reePrevious().**
2dc90 20 68 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20   helper routine 
2dca0 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69  is called when i
2dcb0 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  t is necessary t
2dcc0 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66  o move to a diff
2dcd0 65 72 65 6e 74 20 70 61 67 65 0a 2a 2a 20 6f 72  erent page.** or
2dce0 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
2dcf0 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  cursor..**.** Th
2dd00 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
2dd10 6f 6e 20 77 69 6c 6c 20 73 65 74 20 2a 70 52 65  on will set *pRe
2dd20 73 20 74 6f 20 30 20 6f 72 20 31 2e 20 20 54 68  s to 0 or 1.  Th
2dd30 65 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20  e initial *pRes 
2dd40 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65  value.** will be
2dd50 20 31 20 69 66 20 74 68 65 20 63 75 72 73 6f 72   1 if the cursor
2dd60 20 62 65 69 6e 67 20 73 74 65 70 70 65 64 20 63   being stepped c
2dd70 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e  orresponds to an
2dd80 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 0a 2a   SQL index and.*
2dd90 2a 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  * if this routin
2dda0 65 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65  e could have bee
2ddb0 6e 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 61  n skipped if tha
2ddc0 74 20 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20  t SQL index had 
2ddd0 62 65 65 6e 0a 2a 2a 20 61 20 75 6e 69 71 75 65  been.** a unique
2dde0 20 69 6e 64 65 78 2e 20 20 4f 74 68 65 72 77 69   index.  Otherwi
2ddf0 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  se the caller wi
2de00 6c 6c 20 68 61 76 65 20 73 65 74 20 2a 70 52 65  ll have set *pRe
2de10 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65  s to zero..** Ze
2de20 72 6f 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e  ro is the common
2de30 20 63 61 73 65 2e 20 54 68 65 20 62 74 72 65 65   case. The btree
2de40 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2de50 69 73 20 66 72 65 65 20 74 6f 20 75 73 65 20 74  is free to use t
2de60 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 2a 70  he.** initial *p
2de70 52 65 73 20 76 61 6c 75 65 20 61 73 20 61 20 68  Res value as a h
2de80 69 6e 74 20 74 6f 20 69 6d 70 72 6f 76 65 20 70  int to improve p
2de90 65 72 66 6f 72 6d 61 6e 63 65 2c 20 62 75 74 20  erformance, but 
2dea0 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 53  the current.** S
2deb0 51 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c  QLite btree impl
2dec0 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20  ementation does 
2ded0 6e 6f 74 2e 20 28 4e 6f 74 65 20 74 68 61 74 20  not. (Note that 
2dee0 74 68 65 20 63 6f 6d 64 62 32 20 62 74 72 65 65  the comdb2 btree
2def0 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  .** implementati
2df00 6f 6e 20 64 6f 65 73 20 75 73 65 20 74 68 69 73  on does use this
2df10 20 68 69 6e 74 2c 20 68 6f 77 65 76 65 72 2e 29   hint, however.)
2df20 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
2df30 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62  E_NOINLINE int b
2df40 74 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43  treePrevious(BtC
2df50 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
2df60 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
2df70 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  c;.  MemPage *pP
2df80 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
2df90 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
2dfa0 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
2dfb0 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b  sert( pRes!=0 );
2dfc0 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52 65 73  .  assert( *pRes
2dfd0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
2dfe0 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d   pCur->skipNext=
2dff0 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  =0 || pCur->eSta
2e000 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2e010 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
2e020 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
2e030 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43  (BTCF_AtLast|BTC
2e040 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46  F_ValidOvfl|BTCF
2e050 5f 56 61 6c 69 64 4e 4b 65 79 29 29 3d 3d 30 20  _ValidNKey))==0 
2e060 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2e070 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30  r->info.nSize==0
2e080 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
2e090 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2e0a0 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 63 20 3d  ALID ){.    rc =
2e0b0 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
2e0c0 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
2e0d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2e0e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
2e0f0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
2e100 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
2e110 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
2e120 74 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  te ){.      *pRe
2e130 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74  s = 1;.      ret
2e140 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2e150 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75     }.    if( pCu
2e160 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20  r->skipNext ){. 
2e170 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
2e180 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2e190 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  R_VALID || pCur-
2e1a0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2e1b0 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20 20 20  SKIPNEXT );.    
2e1c0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2e1d0 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
2e1e0 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73       if( pCur->s
2e1f0 6b 69 70 4e 65 78 74 3c 30 20 29 7b 0a 20 20 20  kipNext<0 ){.   
2e200 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e       pCur->skipN
2e210 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ext = 0;.       
2e220 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2e230 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
2e240 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
2e250 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
2e260 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
2e270 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2e280 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ge];.  assert( p
2e290 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
2e2a0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
2e2b0 61 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64  af ){.    int id
2e2c0 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  x = pCur->aiIdx[
2e2d0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
2e2e0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
2e2f0 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74  ld(pCur, get4byt
2e300 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  e(findCell(pPage
2e310 2c 20 69 64 78 29 29 29 3b 0a 20 20 20 20 69 66  , idx)));.    if
2e320 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2e330 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
2e340 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29  oRightmost(pCur)
2e350 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77  ;.  }else{.    w
2e360 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64  hile( pCur->aiId
2e370 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d  x[pCur->iPage]==
2e380 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
2e390 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b  Cur->iPage==0 ){
2e3a0 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65  .        pCur->e
2e3b0 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
2e3c0 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20  NVALID;.        
2e3d0 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
2e3e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2e3f0 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
2e400 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28     moveToParent(
2e410 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pCur);.    }.   
2e420 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2e430 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a  nfo.nSize==0 );.
2e440 20 20 20 20 61 73 73 65 72 74 28 20 28 70 43 75      assert( (pCu
2e450 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 28 42  r->curFlags & (B
2e460 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 29 3d  TCF_ValidOvfl))=
2e470 3d 30 20 29 3b 0a 0a 20 20 20 20 70 43 75 72 2d  =0 );..    pCur-
2e480 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2e490 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65  ge]--;.    pPage
2e4a0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
2e4b0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
2e4c0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
2e4d0 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c  Key && !pPage->l
2e4e0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20  eaf ){.      rc 
2e4f0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  = sqlite3BtreePr
2e500 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65  evious(pCur, pRe
2e510 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  s);.    }else{. 
2e520 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2e530 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
2e540 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e   return rc;.}.in
2e550 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  t sqlite3BtreePr
2e560 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20  evious(BtCursor 
2e570 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
2e580 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
2e590 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
2e5a0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2e5b0 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20  t( pRes!=0 );.  
2e5c0 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30  assert( *pRes==0
2e5d0 20 7c 7c 20 2a 70 52 65 73 3d 3d 31 20 29 3b 0a   || *pRes==1 );.
2e5e0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2e5f0 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70  skipNext==0 || p
2e600 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
2e610 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 2a  SOR_VALID );.  *
2e620 70 52 65 73 20 3d 20 30 3b 0a 20 20 70 43 75 72  pRes = 0;.  pCur
2e630 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28  ->curFlags &= ~(
2e640 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46  BTCF_AtLast|BTCF
2e650 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f  _ValidOvfl|BTCF_
2e660 56 61 6c 69 64 4e 4b 65 79 29 3b 0a 20 20 70 43  ValidNKey);.  pC
2e670 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
2e680 20 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   0;.  if( pCur->
2e690 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2e6a0 41 4c 49 44 0a 20 20 20 7c 7c 20 70 43 75 72 2d  ALID.   || 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 3d 3d 30 0a 20 20 20 7c 7c 20 70 43 75  ge]==0.   || pCu
2e6d0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2e6e0 69 50 61 67 65 5d 2d 3e 6c 65 61 66 3d 3d 30 0a  iPage]->leaf==0.
2e6f0 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
2e700 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43  btreePrevious(pC
2e710 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 7d 0a 20  ur, pRes);.  }. 
2e720 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2e730 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 72  r->iPage]--;.  r
2e740 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2e750 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
2e760 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 66 72  te a new page fr
2e770 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
2e780 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  file..**.** The 
2e790 6e 65 77 20 70 61 67 65 20 69 73 20 6d 61 72 6b  new page is mark
2e7a0 65 64 20 61 73 20 64 69 72 74 79 2e 20 20 28 49  ed as dirty.  (I
2e7b0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73  n other words, s
2e7c0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2e7d0 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64  ().** has alread
2e7e0 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e  y been called on
2e7f0 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 29 20   the new page.) 
2e800 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 68 61   The new page ha
2e810 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72  s also.** been r
2e820 65 66 65 72 65 6e 63 65 64 20 61 6e 64 20 74 68  eferenced and th
2e830 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e  e calling routin
2e840 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  e is responsible
2e850 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   for calling.** 
2e860 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
2e870 66 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 70  f() on the new p
2e880 61 67 65 20 77 68 65 6e 20 69 74 20 69 73 20 64  age when it is d
2e890 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  one..**.** SQLIT
2e8a0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
2e8b0 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 41 6e   on success.  An
2e8c0 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76  y other return v
2e8d0 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73 0a 2a  alue indicates.*
2e8e0 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70  * an error.  *pp
2e8f0 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e  Page is set to N
2e900 55 4c 4c 20 69 6e 20 74 68 65 20 65 76 65 6e 74  ULL in the event
2e910 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a   of an error..**
2e920 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65 61 72  .** If the "near
2e930 62 79 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  by" parameter is
2e940 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61 6e 20   not 0, then an 
2e950 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74  effort is made t
2e960 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70  o .** locate a p
2e970 61 67 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65  age close to the
2e980 20 70 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65   page number "ne
2e990 61 72 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e  arby".  This can
2e9a0 20 62 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a   be used in an.*
2e9b0 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65  * attempt to kee
2e9c0 70 20 72 65 6c 61 74 65 64 20 70 61 67 65 73 20  p related pages 
2e9d0 63 6c 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74  close to each ot
2e9e0 68 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62  her in the datab
2e9f0 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69  ase file,.** whi
2ea00 63 68 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d  ch in turn can m
2ea10 61 6b 65 20 64 61 74 61 62 61 73 65 20 61 63 63  ake database acc
2ea20 65 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a  ess faster..**.*
2ea30 2a 20 49 66 20 74 68 65 20 65 4d 6f 64 65 20 70  * If the eMode p
2ea40 61 72 61 6d 65 74 65 72 20 69 73 20 42 54 41 4c  arameter is BTAL
2ea50 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64 20 74 68  LOC_EXACT and th
2ea60 65 20 6e 65 61 72 62 79 20 70 61 67 65 20 65 78  e nearby page ex
2ea70 69 73 74 73 0a 2a 2a 20 61 6e 79 77 68 65 72 65  ists.** anywhere
2ea80 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
2ea90 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67 75  t, then it is gu
2eaa0 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 72  aranteed to be r
2eab0 65 74 75 72 6e 65 64 2e 20 20 49 66 0a 2a 2a 20  eturned.  If.** 
2eac0 65 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f 43  eMode is BTALLOC
2ead0 5f 4c 54 20 74 68 65 6e 20 74 68 65 20 70 61 67  _LT then the pag
2eae0 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20  e returned will 
2eaf0 62 65 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  be less than or 
2eb00 65 71 75 61 6c 0a 2a 2a 20 74 6f 20 6e 65 61 72  equal.** to near
2eb10 62 79 20 69 66 20 61 6e 79 20 73 75 63 68 20 70  by if any such p
2eb20 61 67 65 20 65 78 69 73 74 73 2e 20 20 49 66 20  age exists.  If 
2eb30 65 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f 43  eMode is BTALLOC
2eb40 5f 41 4e 59 20 74 68 65 6e 20 74 68 65 72 65 0a  _ANY then there.
2eb50 2a 2a 20 61 72 65 20 6e 6f 20 72 65 73 74 72 69  ** are no restri
2eb60 63 74 69 6f 6e 73 20 6f 6e 20 77 68 69 63 68 20  ctions on which 
2eb70 70 61 67 65 20 69 73 20 72 65 74 75 72 6e 65 64  page is returned
2eb80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2eb90 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
2eba0 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
2ebb0 42 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  Bt,         /* T
2ebc0 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 4d 65  he btree */.  Me
2ebd0 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
2ebe0 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 70 6f       /* Store po
2ebf0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 6c 6c  inter to the all
2ec00 6f 63 61 74 65 64 20 70 61 67 65 20 68 65 72 65  ocated page here
2ec10 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e   */.  Pgno *pPgn
2ec20 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o,           /* 
2ec30 53 74 6f 72 65 20 74 68 65 20 70 61 67 65 20 6e  Store the page n
2ec40 75 6d 62 65 72 20 68 65 72 65 20 2a 2f 0a 20 20  umber here */.  
2ec50 50 67 6e 6f 20 6e 65 61 72 62 79 2c 20 20 20 20  Pgno nearby,    
2ec60 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68         /* Search
2ec70 20 66 6f 72 20 61 20 70 61 67 65 20 6e 65 61 72   for a page near
2ec80 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 75   this one */.  u
2ec90 38 20 65 4d 6f 64 65 20 20 20 20 20 20 20 20 20  8 eMode         
2eca0 20 20 20 20 20 20 2f 2a 20 42 54 41 4c 4c 4f 43        /* BTALLOC
2ecb0 5f 45 58 41 43 54 2c 20 42 54 41 4c 4c 4f 43 5f  _EXACT, BTALLOC_
2ecc0 4c 54 2c 20 6f 72 20 42 54 41 4c 4c 4f 43 5f 41  LT, or BTALLOC_A
2ecd0 4e 59 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61  NY */.){.  MemPa
2ece0 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e  ge *pPage1;.  in
2ecf0 74 20 72 63 3b 0a 20 20 75 33 32 20 6e 3b 20 20  t rc;.  u32 n;  
2ed00 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2ed10 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
2ed20 65 6c 69 73 74 20 2a 2f 0a 20 20 75 33 32 20 6b  elist */.  u32 k
2ed30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
2ed40 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 65  of leaves on the
2ed50 20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20 66 72   trunk of the fr
2ed60 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50  eelist */.  MemP
2ed70 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b  age *pTrunk = 0;
2ed80 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 72 65  .  MemPage *pPre
2ed90 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 50 67  vTrunk = 0;.  Pg
2eda0 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20 20 20 2f  no mxPage;     /
2edb0 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20  * Total size of 
2edc0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2edd0 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
2ede0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2edf0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
2ee00 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64  ;.  assert( eMod
2ee10 65 3d 3d 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 7c  e==BTALLOC_ANY |
2ee20 7c 20 28 6e 65 61 72 62 79 3e 30 20 26 26 20 49  | (nearby>0 && I
2ee30 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e  fNotOmitAV(pBt->
2ee40 61 75 74 6f 56 61 63 75 75 6d 29 29 20 29 3b 0a  autoVacuum)) );.
2ee50 20 20 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e    pPage1 = pBt->
2ee60 70 50 61 67 65 31 3b 0a 20 20 6d 78 50 61 67 65  pPage1;.  mxPage
2ee70 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e   = btreePagecoun
2ee80 74 28 70 42 74 29 3b 0a 20 20 2f 2a 20 45 56 49  t(pBt);.  /* EVI
2ee90 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 35 31 31  DENCE-OF: R-0511
2eea0 39 2d 30 32 36 33 37 20 54 68 65 20 34 2d 62 79  9-02637 The 4-by
2eeb0 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
2eec0 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20  teger at offset 
2eed0 33 36 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 73  36.  ** stores s
2eee0 74 6f 72 65 73 20 74 68 65 20 74 6f 74 61 6c 20  tores the total 
2eef0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
2ef00 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  on the freelist.
2ef10 20 2a 2f 0a 20 20 6e 20 3d 20 67 65 74 34 62 79   */.  n = get4by
2ef20 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
2ef30 61 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74 63 61  a[36]);.  testca
2ef40 73 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20  se( n==mxPage-1 
2ef50 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61  );.  if( n>=mxPa
2ef60 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ge ){.    return
2ef70 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2ef80 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20  BKPT;.  }.  if( 
2ef90 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  n>0 ){.    /* Th
2efa0 65 72 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e  ere are pages on
2efb0 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
2efc0 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f  Reuse one of tho
2efd0 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20  se pages. */.   
2efe0 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20   Pgno iTrunk;.  
2eff0 20 20 75 38 20 73 65 61 72 63 68 4c 69 73 74 20    u8 searchList 
2f000 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66  = 0; /* If the f
2f010 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65  ree-list must be
2f020 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e   searched for 'n
2f030 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 75 33  earby' */.    u3
2f040 32 20 6e 53 65 61 72 63 68 20 3d 20 30 3b 20 20  2 nSearch = 0;  
2f050 20 2f 2a 20 43 6f 75 6e 74 20 6f 66 20 74 68 65   /* Count of the
2f060 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 61 72 63   number of searc
2f070 68 20 61 74 74 65 6d 70 74 73 20 2a 2f 0a 20 20  h attempts */.  
2f080 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 65 4d 6f    .    /* If eMo
2f090 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43  de==BTALLOC_EXAC
2f0a0 54 20 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66  T and a query of
2f0b0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
2f0c0 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68  .    ** shows th
2f0d0 61 74 20 74 68 65 20 70 61 67 65 20 27 6e 65 61  at the page 'nea
2f0e0 72 62 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72  rby' is somewher
2f0f0 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e on the free-li
2f100 73 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  st, then.    ** 
2f110 74 68 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20  the entire-list 
2f120 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64  will be searched
2f130 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a   for that page..
2f140 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53      */.#ifndef S
2f150 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
2f160 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 65 4d  ACUUM.    if( eM
2f170 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41  ode==BTALLOC_EXA
2f180 43 54 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  CT ){.      if( 
2f190 6e 65 61 72 62 79 3c 3d 6d 78 50 61 67 65 20 29  nearby<=mxPage )
2f1a0 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65 54 79  {.        u8 eTy
2f1b0 70 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  pe;.        asse
2f1c0 72 74 28 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a  rt( nearby>0 );.
2f1d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2f1e0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
2f1f0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2f200 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e  ptrmapGet(pBt, n
2f210 65 61 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30  earby, &eType, 0
2f220 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2f230 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
2f240 20 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65         if( eType
2f250 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  ==PTRMAP_FREEPAG
2f260 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  E ){.          s
2f270 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20  earchList = 1;. 
2f280 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2f290 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65  .    }else if( e
2f2a0 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45  Mode==BTALLOC_LE
2f2b0 20 29 7b 0a 20 20 20 20 20 20 73 65 61 72 63 68   ){.      search
2f2c0 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  List = 1;.    }.
2f2d0 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44  #endif..    /* D
2f2e0 65 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65  ecrement the fre
2f2f0 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20  e-list count by 
2f300 31 2e 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f  1. Set iTrunk to
2f310 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
2f320 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66  e.    ** first f
2f330 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
2f340 61 67 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20  age. iPrevTrunk 
2f350 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a  is initially 1..
2f360 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
2f370 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2f380 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
2f390 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
2f3a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2f3b0 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
2f3c0 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31  ->aData[36], n-1
2f3d0 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63  );..    /* The c
2f3e0 6f 64 65 20 77 69 74 68 69 6e 20 74 68 69 73 20  ode within this 
2f3f0 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79  loop is run only
2f400 20 6f 6e 63 65 20 69 66 20 74 68 65 20 27 73 65   once if the 'se
2f410 61 72 63 68 4c 69 73 74 27 20 76 61 72 69 61 62  archList' variab
2f420 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  le.    ** is not
2f430 20 74 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65   true. Otherwise
2f440 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63 65 20 66  , it runs once f
2f450 6f 72 20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61  or each trunk-pa
2f460 67 65 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ge on the.    **
2f470 20 66 72 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c   free-list until
2f480 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62   the page 'nearb
2f490 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65  y' is located (e
2f4a0 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58  Mode==BTALLOC_EX
2f4b0 41 43 54 29 0a 20 20 20 20 2a 2a 20 6f 72 20 75  ACT).    ** or u
2f4c0 6e 74 69 6c 20 61 20 70 61 67 65 20 6c 65 73 73  ntil a page less
2f4d0 20 74 68 61 6e 20 27 6e 65 61 72 62 79 27 20 69   than 'nearby' i
2f4e0 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65  s located (eMode
2f4f0 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 54 29 0a 20 20  ==BTALLOC_LT).  
2f500 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20    */.    do {.  
2f510 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d      pPrevTrunk =
2f520 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69   pTrunk;.      i
2f530 66 28 20 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  f( pPrevTrunk ){
2f540 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44  .        /* EVID
2f550 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 35 30 36  ENCE-OF: R-01506
2f560 2d 31 31 30 35 33 20 54 68 65 20 66 69 72 73 74  -11053 The first
2f570 20 69 6e 74 65 67 65 72 20 6f 6e 20 61 20 66 72   integer on a fr
2f580 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
2f590 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  e.        ** is 
2f5a0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
2f5b0 6f 66 20 74 68 65 20 6e 65 78 74 20 66 72 65 65  of the next free
2f5c0 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  list trunk page 
2f5d0 69 6e 20 74 68 65 20 6c 69 73 74 20 6f 72 0a 20  in the list or. 
2f5e0 20 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 69         ** zero i
2f5f0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 6c 61  f this is the la
2f600 73 74 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e  st freelist trun
2f610 6b 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20  k page. */.     
2f620 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
2f630 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b  byte(&pPrevTrunk
2f640 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20  ->aData[0]);.   
2f650 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2f660 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
2f670 3a 20 52 2d 35 39 38 34 31 2d 31 33 37 39 38 20  : R-59841-13798 
2f680 54 68 65 20 34 2d 62 79 74 65 20 62 69 67 2d 65  The 4-byte big-e
2f690 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 61 74  ndian integer at
2f6a0 20 6f 66 66 73 65 74 20 33 32 0a 20 20 20 20 20   offset 32.     
2f6b0 20 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65     ** stores the
2f6c0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
2f6d0 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
2f6e0 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20  f the freelist, 
2f6f0 6f 72 20 7a 65 72 6f 20 69 66 0a 20 20 20 20 20  or zero if.     
2f700 20 20 20 2a 2a 20 74 68 65 20 66 72 65 65 6c 69     ** the freeli
2f710 73 74 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a  st is empty. */.
2f720 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d          iTrunk =
2f730 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
2f740 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20  1->aData[32]);. 
2f750 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73       }.      tes
2f760 74 63 61 73 65 28 20 69 54 72 75 6e 6b 3d 3d 6d  tcase( iTrunk==m
2f770 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 69  xPage );.      i
2f780 66 28 20 69 54 72 75 6e 6b 3e 6d 78 50 61 67 65  f( iTrunk>mxPage
2f790 20 7c 7c 20 6e 53 65 61 72 63 68 2b 2b 20 3e 20   || nSearch++ > 
2f7a0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  n ){.        rc 
2f7b0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
2f7c0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c  _BKPT;.      }el
2f7d0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
2f7e0 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50   btreeGetUnusedP
2f7f0 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c  age(pBt, iTrunk,
2f800 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20   &pTrunk, 0);.  
2f810 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2f820 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54  rc ){.        pT
2f830 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
2f840 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
2f850 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
2f860 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
2f870 70 54 72 75 6e 6b 21 3d 30 20 29 3b 0a 20 20 20  pTrunk!=0 );.   
2f880 20 20 20 61 73 73 65 72 74 28 20 70 54 72 75 6e     assert( pTrun
2f890 6b 2d 3e 61 44 61 74 61 21 3d 30 20 29 3b 0a 20  k->aData!=0 );. 
2f8a0 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
2f8b0 2d 4f 46 3a 20 52 2d 31 33 35 32 33 2d 30 34 33  -OF: R-13523-043
2f8c0 39 34 20 54 68 65 20 73 65 63 6f 6e 64 20 69 6e  94 The second in
2f8d0 74 65 67 65 72 20 6f 6e 20 61 20 66 72 65 65 6c  teger on a freel
2f8e0 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20  ist trunk page. 
2f8f0 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 6e       ** is the n
2f900 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61  umber of leaf pa
2f910 67 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66  ge pointers to f
2f920 6f 6c 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20  ollow. */.      
2f930 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  k = get4byte(&pT
2f940 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b  runk->aData[4]);
2f950 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20  .      if( k==0 
2f960 26 26 20 21 73 65 61 72 63 68 4c 69 73 74 20 29  && !searchList )
2f970 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
2f980 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65   trunk has no le
2f990 61 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73  aves and the lis
2f9a0 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73  t is not being s
2f9b0 65 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20  earched. .      
2f9c0 20 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20    ** So extract 
2f9d0 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
2f9e0 74 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74  tself and use it
2f9f0 20 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20   as the newly . 
2fa00 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61         ** alloca
2fa10 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ted page */.    
2fa20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 65      assert( pPre
2fa30 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20  vTrunk==0 );.   
2fa40 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2fa50 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
2fa60 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
2fa70 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
2fa80 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
2fa90 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
2faa0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2fab0 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72      *pPgno = iTr
2fac0 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  unk;.        mem
2fad0 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61  cpy(&pPage1->aDa
2fae0 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d  ta[32], &pTrunk-
2faf0 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
2fb00 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
2fb10 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   pTrunk;.       
2fb20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
2fb30 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
2fb40 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20  OCATE: %d trunk 
2fb50 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20  - %d free pages 
2fb60 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c  left\n", *pPgno,
2fb70 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65   n-1));.      }e
2fb80 6c 73 65 20 69 66 28 20 6b 3e 28 75 33 32 29 28  lse if( k>(u32)(
2fb90 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
2fba0 34 20 2d 20 32 29 20 29 7b 0a 20 20 20 20 20 20  4 - 2) ){.      
2fbb0 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20    /* Value of k 
2fbc0 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  is out of range.
2fbd0 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75    Database corru
2fbe0 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ption */.       
2fbf0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
2fc00 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
2fc10 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
2fc20 63 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64  cate_page;.#ifnd
2fc30 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2fc40 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
2fc50 7d 65 6c 73 65 20 69 66 28 20 73 65 61 72 63 68  }else if( search
2fc60 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20 20 20  List .          
2fc70 20 20 26 26 20 28 6e 65 61 72 62 79 3d 3d 69 54    && (nearby==iT
2fc80 72 75 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c  runk || (iTrunk<
2fc90 6e 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d  nearby && eMode=
2fca0 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20  =BTALLOC_LE)) . 
2fcb0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2fcc0 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 62  /* The list is b
2fcd0 65 69 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e  eing searched an
2fce0 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67  d this trunk pag
2fcf0 65 20 69 73 20 74 68 65 20 70 61 67 65 0a 20 20  e is the page.  
2fd00 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f        ** to allo
2fd10 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73  cate, regardless
2fd20 20 6f 66 20 77 68 65 74 68 65 72 20 69 74 20 68   of whether it h
2fd30 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20  as leaves..     
2fd40 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70     */.        *p
2fd50 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20  Pgno = iTrunk;. 
2fd60 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
2fd70 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   pTrunk;.       
2fd80 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
2fd90 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
2fda0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2fdb0 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
2fdc0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2fdd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
2fde0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
2fdf0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
2fe00 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30          if( k==0
2fe10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
2fe20 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  ( !pPrevTrunk ){
2fe30 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
2fe40 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61  cpy(&pPage1->aDa
2fe50 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d  ta[32], &pTrunk-
2fe60 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
2fe70 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2fe80 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2fe90 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2fea0 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70  te(pPrevTrunk->p
2feb0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
2fec0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2fed0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2fee0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2fef0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2ff00 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2ff10 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
2ff20 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
2ff30 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[0], &pTrunk-
2ff40 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
2ff50 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2ff60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2ff70 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b      /* The trunk
2ff80 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65   page is require
2ff90 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
2ffa0 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  but it contains 
2ffb0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  .          ** po
2ffc0 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c  inters to free-l
2ffd0 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20  ist leaves. The 
2ffe0 66 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d  first leaf becom
2fff0 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20  es a trunk.     
30000 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20       ** page in 
30010 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20  this case..     
30020 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
30030 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54    MemPage *pNewT
30040 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  runk;.          
30050 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d  Pgno iNewTrunk =
30060 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
30070 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20  k->aData[8]);.  
30080 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77          if( iNew
30090 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20  Trunk>mxPage ){ 
300a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
300b0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
300c0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
300d0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
300e0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
300f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
30100 20 74 65 73 74 63 61 73 65 28 20 69 4e 65 77 54   testcase( iNewT
30110 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a  runk==mxPage );.
30120 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62            rc = b
30130 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67  treeGetUnusedPag
30140 65 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b  e(pBt, iNewTrunk
30150 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29  , &pNewTrunk, 0)
30160 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
30170 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
30180 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
30190 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
301a0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
301b0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
301c0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
301d0 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62  e(pNewTrunk->pDb
301e0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
301f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
30200 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
30210 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
30220 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
30230 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
30240 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
30250 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30260 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
30270 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
30280 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
30290 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
302a0 20 20 70 75 74 34 62 79 74 65 28 26 70 4e 65 77    put4byte(&pNew
302b0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c  Trunk->aData[4],
302c0 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20   k-1);.         
302d0 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75   memcpy(&pNewTru
302e0 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70  nk->aData[8], &p
302f0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d  Trunk->aData[12]
30300 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20  , (k-1)*4);.    
30310 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
30320 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  e(pNewTrunk);.  
30330 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72          if( !pPr
30340 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
30350 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
30360 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
30370 74 65 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70  teable(pPage1->p
30380 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20  DbPage) );.     
30390 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
303a0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
303b0 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a  2], iNewTrunk);.
303c0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
303d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
303e0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
303f0 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e  ite(pPrevTrunk->
30400 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
30410 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
30420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f                go
30430 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
30440 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
30450 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
30460 70 75 74 34 62 79 74 65 28 26 70 50 72 65 76 54  put4byte(&pPrevT
30470 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
30480 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  iNewTrunk);.    
30490 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
304a0 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  }.        pTrunk
304b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52   = 0;.        TR
304c0 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
304d0 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72  %d trunk - %d fr
304e0 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22  ee pages left\n"
304f0 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b  , *pPgno, n-1));
30500 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65  .#endif.      }e
30510 6c 73 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20  lse if( k>0 ){. 
30520 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63         /* Extrac
30530 74 20 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68  t a leaf from th
30540 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20  e trunk */.     
30550 20 20 20 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a     u32 closest;.
30560 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61          Pgno iPa
30570 67 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69  ge;.        unsi
30580 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74 61  gned char *aData
30590 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61   = pTrunk->aData
305a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65  ;.        if( ne
305b0 61 72 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20  arby>0 ){.      
305c0 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20      u32 i;.     
305d0 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30       closest = 0
305e0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
305f0 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c  eMode==BTALLOC_L
30600 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  E ){.           
30610 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69   for(i=0; i<k; i
30620 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
30630 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62     iPage = get4b
30640 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34  yte(&aData[8+i*4
30650 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]);.            
30660 20 20 69 66 28 20 69 50 61 67 65 3c 3d 6e 65 61    if( iPage<=nea
30670 72 62 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rby ){.         
30680 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
30690 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   i;.            
306a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
306b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
306c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
306d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
306e0 20 20 20 20 20 20 69 6e 74 20 64 69 73 74 3b 0a        int dist;.
306f0 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74              dist
30700 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74   = sqlite3AbsInt
30710 33 32 28 67 65 74 34 62 79 74 65 28 26 61 44 61  32(get4byte(&aDa
30720 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 29  ta[8]) - nearby)
30730 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
30740 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29  r(i=1; i<k; i++)
30750 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
30760 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33  int d2 = sqlite3
30770 41 62 73 49 6e 74 33 32 28 67 65 74 34 62 79 74  AbsInt32(get4byt
30780 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29  e(&aData[8+i*4])
30790 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20   - nearby);.    
307a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32            if( d2
307b0 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  <dist ){.       
307c0 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
307d0 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20   = i;.          
307e0 20 20 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b        dist = d2;
307f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
30800 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
30810 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
30820 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30830 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b      closest = 0;
30840 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
30850 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34      iPage = get4
30860 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c  byte(&aData[8+cl
30870 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20  osest*4]);.     
30880 20 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61     testcase( iPa
30890 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  ge==mxPage );.  
308a0 20 20 20 20 20 20 69 66 28 20 69 50 61 67 65 3e        if( iPage>
308b0 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  mxPage ){.      
308c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
308d0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
308e0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
308f0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
30900 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30910 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61 67    testcase( iPag
30920 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  e==mxPage );.   
30930 20 20 20 20 20 69 66 28 20 21 73 65 61 72 63 68       if( !search
30940 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20 20 7c  List .         |
30950 7c 20 28 69 50 61 67 65 3d 3d 6e 65 61 72 62 79  | (iPage==nearby
30960 20 7c 7c 20 28 69 50 61 67 65 3c 6e 65 61 72 62   || (iPage<nearb
30970 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c  y && eMode==BTAL
30980 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20  LOC_LE)) .      
30990 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69    ){.          i
309a0 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20  nt noContent;.  
309b0 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d          *pPgno =
309c0 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20   iPage;.        
309d0 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
309e0 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20  TE: %d was leaf 
309f0 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e  %d of %d on trun
30a00 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20 20 20  k %d".          
30a10 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72         ": %d mor
30a20 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c  e free pages\n",
30a30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
30a40 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73    *pPgno, closes
30a50 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e  t+1, k, pTrunk->
30a60 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20  pgno, n-1));.   
30a70 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
30a80 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
30a90 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
30aa0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
30ab0 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f   ) goto end_allo
30ac0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
30ad0 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74       if( closest
30ae0 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  <k-1 ){.        
30af0 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74      memcpy(&aDat
30b00 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20  a[8+closest*4], 
30b10 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34  &aData[4+k*4], 4
30b20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
30b30 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
30b40 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31  e(&aData[4], k-1
30b50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43  );.          noC
30b60 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47  ontent = !btreeG
30b70 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  etHasContent(pBt
30b80 2c 20 2a 70 50 67 6e 6f 29 3f 20 50 41 47 45 52  , *pPgno)? PAGER
30b90 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a  _GET_NOCONTENT :
30ba0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   0;.          rc
30bb0 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65   = btreeGetUnuse
30bc0 64 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e  dPage(pBt, *pPgn
30bd0 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e  o, ppPage, noCon
30be0 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20  tent);.         
30bf0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
30c00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
30c10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
30c20 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67  gerWrite((*ppPag
30c30 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e)->pDbPage);.  
30c40 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
30c50 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
30c60 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c               rel
30c70 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
30c80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
30c90 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
30ca0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
30cb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30cc0 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30    searchList = 0
30cd0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
30ce0 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73    }.      releas
30cf0 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b  ePage(pPrevTrunk
30d00 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72  );.      pPrevTr
30d10 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68  unk = 0;.    }wh
30d20 69 6c 65 28 20 73 65 61 72 63 68 4c 69 73 74 20  ile( searchList 
30d30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
30d40 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20  /* There are no 
30d50 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
30d60 65 6c 69 73 74 2c 20 73 6f 20 61 70 70 65 6e 64  elist, so append
30d70 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74   a new page to t
30d80 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
30d90 73 65 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a  se image..    **
30da0 0a 20 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79  .    ** Normally
30db0 2c 20 6e 65 77 20 70 61 67 65 73 20 61 6c 6c 6f  , new pages allo
30dc0 63 61 74 65 64 20 62 79 20 74 68 69 73 20 62 6c  cated by this bl
30dd0 6f 63 6b 20 63 61 6e 20 62 65 20 72 65 71 75 65  ock can be reque
30de0 73 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 20 20  sted from the.  
30df0 20 20 2a 2a 20 70 61 67 65 72 20 6c 61 79 65 72    ** pager layer
30e00 20 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f   with the 'no-co
30e10 6e 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e  ntent' flag set.
30e20 20 54 68 69 73 20 70 72 65 76 65 6e 74 73 20 74   This prevents t
30e30 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20  he pager.    ** 
30e40 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 72  from trying to r
30e50 65 61 64 20 74 68 65 20 70 61 67 65 73 20 63 6f  ead the pages co
30e60 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 2e  ntent from disk.
30e70 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65   However, if the
30e80 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  .    ** current 
30e90 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
30ea0 61 6c 72 65 61 64 79 20 72 75 6e 20 6f 6e 65 20  already run one 
30eb0 6f 72 20 6d 6f 72 65 20 69 6e 63 72 65 6d 65 6e  or more incremen
30ec0 74 61 6c 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a  tal-vacuum.    *
30ed0 2a 20 73 74 65 70 73 2c 20 74 68 65 6e 20 74 68  * steps, then th
30ee0 65 20 70 61 67 65 20 77 65 20 61 72 65 20 61 62  e page we are ab
30ef0 6f 75 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  out to allocate 
30f00 6d 61 79 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74  may contain cont
30f10 65 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  ent.    ** that 
30f20 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 74  is required in t
30f30 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f  he event of a ro
30f40 6c 6c 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20  llback. In this 
30f50 63 61 73 65 2c 20 64 6f 0a 20 20 20 20 2a 2a 20  case, do.    ** 
30f60 6e 6f 74 20 73 65 74 20 74 68 65 20 6e 6f 2d 63  not set the no-c
30f70 6f 6e 74 65 6e 74 20 66 6c 61 67 2e 20 54 68 69  ontent flag. Thi
30f80 73 20 63 61 75 73 65 73 20 74 68 65 20 70 61 67  s causes the pag
30f90 65 72 20 74 6f 20 6c 6f 61 64 20 61 6e 64 20 6a  er to load and j
30fa0 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 74 68  ournal.    ** th
30fb0 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 63  e current page c
30fc0 6f 6e 74 65 6e 74 20 62 65 66 6f 72 65 20 6f 76  ontent before ov
30fd0 65 72 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20  erwriting it..  
30fe0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65    **.    ** Note
30ff0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
31000 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c  will not actuall
31010 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61  y attempt to loa
31020 64 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a 20 20  d or journal .  
31030 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 6f 72    ** content for
31040 20 61 6e 79 20 70 61 67 65 20 74 68 61 74 20 72   any page that r
31050 65 61 6c 6c 79 20 64 6f 65 73 20 6c 69 65 20 70  eally does lie p
31060 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
31070 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
31080 2a 2a 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  ** file on disk.
31090 20 53 6f 20 74 68 65 20 65 66 66 65 63 74 73 20   So the effects 
310a0 6f 66 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65  of disabling the
310b0 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70 74 69   no-content opti
310c0 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  mization.    ** 
310d0 68 65 72 65 20 61 72 65 20 63 6f 6e 66 69 6e 65  here are confine
310e0 64 20 74 6f 20 74 68 6f 73 65 20 70 61 67 65 73  d to those pages
310f0 20 74 68 61 74 20 6c 69 65 20 62 65 74 77 65 65   that lie betwee
31100 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  n the end of the
31110 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
31120 20 69 6d 61 67 65 20 61 6e 64 20 74 68 65 20 65   image and the e
31130 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  nd of the databa
31140 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
31150 20 20 20 20 69 6e 74 20 62 4e 6f 43 6f 6e 74 65      int bNoConte
31160 6e 74 20 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f 6d  nt = (0==IfNotOm
31170 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75  itAV(pBt->bDoTru
31180 6e 63 61 74 65 29 29 3f 20 50 41 47 45 52 5f 47  ncate))? PAGER_G
31190 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 3a 30 3b 0a  ET_NOCONTENT:0;.
311a0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
311b0 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d  3PagerWrite(pBt-
311c0 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  >pPage1->pDbPage
311d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
311e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
311f0 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20  Bt->nPage++;.   
31200 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d   if( pBt->nPage=
31210 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
31220 47 45 28 70 42 74 29 20 29 20 70 42 74 2d 3e 6e  GE(pBt) ) pBt->n
31230 50 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66  Page++;..#ifndef
31240 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
31250 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
31260 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
31270 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  && PTRMAP_ISPAGE
31280 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65  (pBt, pBt->nPage
31290 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  ) ){.      /* If
312a0 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74   *pPgno refers t
312b0 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  o a pointer-map 
312c0 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74  page, allocate t
312d0 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20  wo new pages.   
312e0 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64     ** at the end
312f0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73   of the file ins
31300 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65  tead of one. The
31310 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64   first allocated
31320 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62   page.      ** b
31330 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69  ecomes a new poi
31340 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74  nter-map page, t
31350 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65  he second is use
31360 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  d by the caller.
31370 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
31380 4d 65 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30  MemPage *pPg = 0
31390 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  ;.      TRACE(("
313a0 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f  ALLOCATE: %d fro
313b0 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70  m end of file (p
313c0 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29  ointer-map page)
313d0 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  \n", pBt->nPage)
313e0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
313f0 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45 4e   pBt->nPage!=PEN
31400 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
31410 42 74 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20  Bt) );.      rc 
31420 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64  = btreeGetUnused
31430 50 61 67 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e  Page(pBt, pBt->n
31440 50 61 67 65 2c 20 26 70 50 67 2c 20 62 4e 6f 43  Page, &pPg, bNoC
31450 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 69  ontent);.      i
31460 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
31470 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
31480 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
31490 74 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29  te(pPg->pDbPage)
314a0 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
314b0 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  ePage(pPg);.    
314c0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
314d0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
314e0 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b      pBt->nPage++
314f0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  ;.      if( pBt-
31500 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f  >nPage==PENDING_
31510 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
31520 7b 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20  { pBt->nPage++; 
31530 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
31540 20 20 20 70 75 74 34 62 79 74 65 28 32 38 20 2b     put4byte(28 +
31550 20 28 75 38 2a 29 70 42 74 2d 3e 70 50 61 67 65   (u8*)pBt->pPage
31560 31 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 6e  1->aData, pBt->n
31570 50 61 67 65 29 3b 0a 20 20 20 20 2a 70 50 67 6e  Page);.    *pPgn
31580 6f 20 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a  o = pBt->nPage;.
31590 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50  .    assert( *pP
315a0 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno!=PENDING_BYT
315b0 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20  E_PAGE(pBt) );. 
315c0 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
315d0 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20  UnusedPage(pBt, 
315e0 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  *pPgno, ppPage, 
315f0 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20  bNoContent);.   
31600 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
31610 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71   rc;.    rc = sq
31620 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
31630 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
31640 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
31650 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
31660 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
31670 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  *ppPage);.      
31680 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  *ppPage = 0;.   
31690 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22 41   }.    TRACE(("A
316a0 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d  LLOCATE: %d from
316b0 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c   end of file\n",
316c0 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a   *pPgno));.  }..
316d0 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f    assert( *pPgno
316e0 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
316f0 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64  AGE(pBt) );..end
31700 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a  _allocate_page:.
31710 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
31720 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65  runk);.  release
31730 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29  Page(pPrevTrunk)
31740 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
31750 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c  SQLITE_OK || sql
31760 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
31770 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d  count((*ppPage)-
31780 3e 70 44 62 50 61 67 65 29 3c 3d 31 20 29 3b 0a  >pDbPage)<=1 );.
31790 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
317a0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 2a 70 70 50  LITE_OK || (*ppP
317b0 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20  age)->isInit==0 
317c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
317d0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
317e0 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
317f0 6f 20 61 64 64 20 70 61 67 65 20 69 50 61 67 65  o add page iPage
31800 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
31810 20 66 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e   file free-list.
31820 20 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d   .** It is assum
31830 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ed that the page
31840 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
31850 61 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 72  a part of the fr
31860 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  ee-list..**.** T
31870 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  he value passed 
31880 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
31890 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
318a0 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f  unction is optio
318b0 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63  nal..** If the c
318c0 61 6c 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f  aller happens to
318d0 20 68 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20   have a pointer 
318e0 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f  to the MemPage o
318f0 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73  bject .** corres
31900 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20  ponding to page 
31910 69 50 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20  iPage handy, it 
31920 6d 61 79 20 70 61 73 73 20 69 74 20 61 73 20 74  may pass it as t
31930 68 65 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e  he second value.
31940 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20   .** Otherwise, 
31950 69 74 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c  it may pass NULL
31960 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69  ..**.** If a poi
31970 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67  nter to a MemPag
31980 65 20 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73  e object is pass
31990 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
319a0 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74   argument,.** it
319b0 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  s reference coun
319c0 74 20 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64  t is not altered
319d0 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
319e0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
319f0 20 66 72 65 65 50 61 67 65 32 28 42 74 53 68 61   freePage2(BtSha
31a00 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67  red *pBt, MemPag
31a10 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e  e *pMemPage, Pgn
31a20 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50  o iPage){.  MemP
31a30 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b  age *pTrunk = 0;
31a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a50 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75  /* Free-list tru
31a60 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e  nk page */.  Pgn
31a70 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20  o iTrunk = 0;   
31a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a90 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
31aa0 6f 66 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  of free-list tru
31ab0 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65  nk page */ .  Me
31ac0 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20  mPage *pPage1 = 
31ad0 70 42 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20  pBt->pPage1;    
31ae0 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72    /* Local refer
31af0 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a  ence to page 1 *
31b00 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
31b10 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
31b20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
31b30 62 65 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79  being freed. May
31b40 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69   be NULL. */.  i
31b50 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
31b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b70 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
31b80 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65  e */.  int nFree
31b90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
31ba0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
31bb0 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  itial number of 
31bc0 70 61 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69  pages on free-li
31bd0 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  st */..  assert(
31be0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
31bf0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
31c00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  );.  assert( COR
31c10 52 55 50 54 5f 44 42 20 7c 7c 20 69 50 61 67 65  RUPT_DB || iPage
31c20 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >1 );.  assert( 
31c30 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65  !pMemPage || pMe
31c40 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61  mPage->pgno==iPa
31c50 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 69 50 61  ge );..  if( iPa
31c60 67 65 3c 32 20 29 20 72 65 74 75 72 6e 20 53 51  ge<2 ) return SQ
31c70 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
31c80 54 3b 0a 20 20 69 66 28 20 70 4d 65 6d 50 61 67  T;.  if( pMemPag
31c90 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 20 3d  e ){.    pPage =
31ca0 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20 73   pMemPage;.    s
31cb0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70  qlite3PagerRef(p
31cc0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
31cd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
31ce0 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f  ge = btreePageLo
31cf0 6f 6b 75 70 28 70 42 74 2c 20 69 50 61 67 65 29  okup(pBt, iPage)
31d00 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72  ;.  }..  /* Incr
31d10 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 20 70  ement the free p
31d20 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61  age count on pPa
31d30 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ge1 */.  rc = sq
31d40 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
31d50 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
31d60 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
31d70 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
31d80 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79    nFree = get4by
31d90 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
31da0 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79  a[36]);.  put4by
31db0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
31dc0 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b  a[36], nFree+1);
31dd0 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73  ..  if( pBt->bts
31de0 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55  Flags & BTS_SECU
31df0 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20  RE_DELETE ){.   
31e00 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63 75 72   /* If the secur
31e10 65 5f 64 65 6c 65 74 65 20 6f 70 74 69 6f 6e 20  e_delete option 
31e20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  is enabled, then
31e30 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 66  .    ** always f
31e40 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64  ully overwrite d
31e50 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69  eleted informati
31e60 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20  on with zeros.. 
31e70 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21     */.    if( (!
31e80 70 50 61 67 65 20 26 26 20 28 28 72 63 20 3d 20  pPage && ((rc = 
31e90 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
31ea0 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c  , iPage, &pPage,
31eb0 20 30 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20   0))!=0) ).     
31ec0 7c 7c 20 20 20 20 20 20 20 20 20 20 20 20 28 28  ||            ((
31ed0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
31ee0 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
31ef0 62 50 61 67 65 29 29 21 3d 30 29 0a 20 20 20 20  bPage))!=0).    
31f00 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72  ){.      goto fr
31f10 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  eepage_out;.    
31f20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61  }.    memset(pPa
31f30 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50  ge->aData, 0, pP
31f40 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  age->pBt->pageSi
31f50 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ze);.  }..  /* I
31f60 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
31f70 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63  upports auto-vac
31f80 75 75 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e  uum, write an en
31f90 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74  try in the point
31fa0 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69  er-map.  ** to i
31fb0 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
31fc0 20 70 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20   page is free.. 
31fd0 20 2a 2f 0a 20 20 69 66 28 20 49 53 41 55 54 4f   */.  if( ISAUTO
31fe0 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 70 74  VACUUM ){.    pt
31ff0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 50 61  rmapPut(pBt, iPa
32000 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50  ge, PTRMAP_FREEP
32010 41 47 45 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20  AGE, 0, &rc);.  
32020 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
32030 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
32040 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69  }..  /* Now mani
32050 70 75 6c 61 74 65 20 74 68 65 20 61 63 74 75 61  pulate the actua
32060 6c 20 64 61 74 61 62 61 73 65 20 66 72 65 65 2d  l database free-
32070 6c 69 73 74 20 73 74 72 75 63 74 75 72 65 2e 20  list structure. 
32080 54 68 65 72 65 20 61 72 65 20 74 77 6f 0a 20 20  There are two.  
32090 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73  ** possibilities
320a0 2e 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69  . If the free-li
320b0 73 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  st is currently 
320c0 65 6d 70 74 79 2c 20 6f 72 20 69 66 20 74 68 65  empty, or if the
320d0 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e   first.  ** trun
320e0 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72  k page in the fr
320f0 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c  ee-list is full,
32100 20 74 68 65 6e 20 74 68 69 73 20 70 61 67 65 20   then this page 
32110 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20  will become a.  
32120 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74  ** new free-list
32130 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68   trunk page. Oth
32140 65 72 77 69 73 65 2c 20 69 74 20 77 69 6c 6c 20  erwise, it will 
32150 62 65 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66  become a leaf of
32160 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20   the.  ** first 
32170 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
32180 65 20 63 75 72 72 65 6e 74 20 66 72 65 65 2d 6c  e current free-l
32190 69 73 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20  ist. This block 
321a0 74 65 73 74 73 20 69 66 20 69 74 0a 20 20 2a 2a  tests if it.  **
321b0 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
321c0 61 64 64 20 74 68 65 20 70 61 67 65 20 61 73 20  add the page as 
321d0 61 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20  a new free-list 
321e0 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  leaf..  */.  if(
321f0 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a 20 20 20   nFree!=0 ){.   
32200 20 75 33 32 20 6e 4c 65 61 66 3b 20 20 20 20 20   u32 nLeaf;     
32210 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
32220 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  itial number of 
32230 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72  leaf cells on tr
32240 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20  unk page */..   
32250 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
32260 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
32270 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d  a[32]);.    rc =
32280 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
32290 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75  t, iTrunk, &pTru
322a0 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  nk, 0);.    if( 
322b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
322c0 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
322d0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
322e0 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20 67 65 74  .    nLeaf = get
322f0 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
32300 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 61 73  Data[4]);.    as
32310 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c  sert( pBt->usabl
32320 65 53 69 7a 65 3e 33 32 20 29 3b 0a 20 20 20 20  eSize>32 );.    
32330 69 66 28 20 6e 4c 65 61 66 20 3e 20 28 75 33 32  if( nLeaf > (u32
32340 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
32350 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20 20 20 20  /4 - 2 ){.      
32360 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
32370 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
32380 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
32390 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
323a0 20 6e 4c 65 61 66 20 3c 20 28 75 33 32 29 70 42   nLeaf < (u32)pB
323b0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
323c0 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  - 8 ){.      /* 
323d0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
323e0 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68  re is room on th
323f0 65 20 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20  e trunk page to 
32400 69 6e 73 65 72 74 20 74 68 65 20 70 61 67 65 0a  insert the page.
32410 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 66        ** being f
32420 72 65 65 64 20 61 73 20 61 20 6e 65 77 20 6c 65  reed as a new le
32430 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  af..      **.   
32440 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
32450 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
32460 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c  s not really ful
32470 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61  l until it conta
32480 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61  ins.      ** usa
32490 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e  bleSize/4 - 2 en
324a0 74 72 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c  tries, not usabl
324b0 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72  eSize/4 - 8 entr
324c0 69 65 73 20 61 73 20 77 65 20 68 61 76 65 0a 20  ies as we have. 
324d0 20 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20       ** coded.  
324e0 42 75 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64  But due to a cod
324f0 69 6e 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72  ing error in ver
32500 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
32510 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a  prior to.      *
32520 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73  * 3.6.0, databas
32530 65 73 20 77 69 74 68 20 66 72 65 65 6c 69 73 74  es with freelist
32540 20 74 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c   trunk pages hol
32550 64 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20  ding more than. 
32560 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69       ** usableSi
32570 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73  ze/4 - 8 entries
32580 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65   will be reporte
32590 64 20 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49  d as corrupt.  I
325a0 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a  n order.      **
325b0 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63   to maintain bac
325c0 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
325d0 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20  lity with older 
325e0 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
325f0 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20  te,.      ** we 
32600 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f  will continue to
32610 20 72 65 73 74 72 69 63 74 20 74 68 65 20 6e 75   restrict the nu
32620 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
32630 74 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  to usableSize/4 
32640 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  - 8.      ** for
32650 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70   now.  At some p
32660 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  oint in the futu
32670 72 65 20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e  re (once everyon
32680 65 20 68 61 73 20 75 70 67 72 61 64 65 64 0a 20  e has upgraded. 
32690 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30       ** to 3.6.0
326a0 20 6f 72 20 6c 61 74 65 72 29 20 77 65 20 73 68   or later) we sh
326b0 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72 20 66 69  ould consider fi
326c0 78 69 6e 67 20 74 68 65 20 63 6f 6e 64 69 74 69  xing the conditi
326d0 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20 20 20  onal above.     
326e0 20 2a 2a 20 74 6f 20 72 65 61 64 20 22 75 73 61   ** to read "usa
326f0 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73  bleSize/4-2" ins
32700 74 65 61 64 20 6f 66 20 22 75 73 61 62 6c 65 53  tead of "usableS
32710 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20  ize/4-8"..      
32720 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44  **.      ** EVID
32730 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 39 32 30  ENCE-OF: R-19920
32740 2d 31 31 35 37 36 20 48 6f 77 65 76 65 72 2c 20  -11576 However, 
32750 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  newer versions o
32760 66 20 53 51 4c 69 74 65 20 73 74 69 6c 6c 0a 20  f SQLite still. 
32770 20 20 20 20 20 2a 2a 20 61 76 6f 69 64 20 75 73       ** avoid us
32780 69 6e 67 20 74 68 65 20 6c 61 73 74 20 73 69 78  ing the last six
32790 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
327a0 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
327b0 61 67 65 20 61 72 72 61 79 20 69 6e 0a 20 20 20  age array in.   
327c0 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 68 61 74     ** order that
327d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
327e0 63 72 65 61 74 65 64 20 62 79 20 6e 65 77 65 72  created by newer
327f0 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
32800 69 74 65 20 63 61 6e 20 62 65 0a 20 20 20 20 20  ite can be.     
32810 20 2a 2a 20 72 65 61 64 20 62 79 20 6f 6c 64 65   ** read by olde
32820 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
32830 4c 69 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  Lite..      */. 
32840 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
32850 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
32860 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
32870 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
32880 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
32890 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e   put4byte(&pTrun
328a0 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65  k->aData[4], nLe
328b0 61 66 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70  af+1);.        p
328c0 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  ut4byte(&pTrunk-
328d0 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34  >aData[8+nLeaf*4
328e0 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20  ], iPage);.     
328f0 20 20 20 69 66 28 20 70 50 61 67 65 20 26 26 20     if( pPage && 
32900 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
32910 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
32920 54 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  TE)==0 ){.      
32930 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
32940 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d  DontWrite(pPage-
32950 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
32960 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
32970 3d 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e  = btreeSetHasCon
32980 74 65 6e 74 28 70 42 74 2c 20 69 50 61 67 65 29  tent(pBt, iPage)
32990 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
329a0 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47  TRACE(("FREE-PAG
329b0 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72  E: %d leaf on tr
329c0 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70  unk page %d\n",p
329d0 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e  Page->pgno,pTrun
329e0 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  k->pgno));.     
329f0 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
32a00 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ut;.    }.  }.. 
32a10 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66   /* If control f
32a20 6c 6f 77 73 20 74 6f 20 74 68 69 73 20 70 6f 69  lows to this poi
32a30 6e 74 2c 20 74 68 65 6e 20 69 74 20 77 61 73 20  nt, then it was 
32a40 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
32a50 61 64 64 20 74 68 65 0a 20 20 2a 2a 20 74 68 65  add the.  ** the
32a60 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   page being free
32a70 64 20 61 73 20 61 20 6c 65 61 66 20 70 61 67 65  d as a leaf page
32a80 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 72   of the first tr
32a90 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d  unk in the free-
32aa0 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69  list..  ** Possi
32ab0 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20  bly because the 
32ac0 66 72 65 65 2d 6c 69 73 74 20 69 73 20 65 6d 70  free-list is emp
32ad0 74 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79 20  ty, or possibly 
32ae0 62 65 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a  because the .  *
32af0 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e  * first trunk in
32b00 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
32b10 73 20 66 75 6c 6c 2e 20 45 69 74 68 65 72 20 77  s full. Either w
32b20 61 79 2c 20 74 68 65 20 70 61 67 65 20 62 65 69  ay, the page bei
32b30 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a 20 77 69  ng freed.  ** wi
32b40 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65  ll become the ne
32b50 77 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61  w first trunk pa
32b60 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  ge in the free-l
32b70 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ist..  */.  if( 
32b80 70 50 61 67 65 3d 3d 30 20 26 26 20 53 51 4c 49  pPage==0 && SQLI
32b90 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72  TE_OK!=(rc = btr
32ba0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
32bb0 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29  Page, &pPage, 0)
32bc0 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72  ) ){.    goto fr
32bd0 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  eepage_out;.  }.
32be0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
32bf0 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
32c00 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
32c10 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
32c20 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61  .    goto freepa
32c30 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75  ge_out;.  }.  pu
32c40 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
32c50 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20  ata, iTrunk);.  
32c60 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
32c70 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20  >aData[4], 0);. 
32c80 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
32c90 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 50  1->aData[32], iP
32ca0 61 67 65 29 3b 0a 20 20 54 52 41 43 45 28 28 22  age);.  TRACE(("
32cb0 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65  FREE-PAGE: %d ne
32cc0 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70  w trunk page rep
32cd0 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50  lacing %d\n", pP
32ce0 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e  age->pgno, iTrun
32cf0 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f  k));..freepage_o
32d00 75 74 3a 0a 20 20 69 66 28 20 70 50 61 67 65 20  ut:.  if( pPage 
32d10 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  ){.    pPage->is
32d20 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Init = 0;.  }.  
32d30 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
32d40 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67  e);.  releasePag
32d50 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74  e(pTrunk);.  ret
32d60 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63  urn rc;.}.static
32d70 20 76 6f 69 64 20 66 72 65 65 50 61 67 65 28 4d   void freePage(M
32d80 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
32d90 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20  nt *pRC){.  if( 
32da0 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f  (*pRC)==SQLITE_O
32db0 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  K ){.    *pRC = 
32dc0 66 72 65 65 50 61 67 65 32 28 70 50 61 67 65 2d  freePage2(pPage-
32dd0 3e 70 42 74 2c 20 70 50 61 67 65 2c 20 70 50 61  >pBt, pPage, pPa
32de0 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d  ge->pgno);.  }.}
32df0 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79  ../*.** Free any
32e00 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
32e10 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
32e20 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 20  the given Cell. 
32e30 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 6c 6f   Write the.** lo
32e40 63 61 6c 20 43 65 6c 6c 20 73 69 7a 65 20 28 74  cal Cell size (t
32e50 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
32e60 65 73 20 6f 6e 20 74 68 65 20 6f 72 69 67 69 6e  es on the origin
32e70 61 6c 20 70 61 67 65 2c 20 6f 6d 69 74 74 69 6e  al page, omittin
32e80 67 0a 2a 2a 20 6f 76 65 72 66 6c 6f 77 29 20 69  g.** overflow) i
32e90 6e 74 6f 20 2a 70 6e 53 69 7a 65 2e 0a 2a 2f 0a  nto *pnSize..*/.
32ea0 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72  static int clear
32eb0 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
32ec0 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
32ed0 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61   /* The page tha
32ee0 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 43  t contains the C
32ef0 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ell */.  unsigne
32f00 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20  d char *pCell,  
32f10 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
32f20 6f 66 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20  of the Cell */. 
32f30 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f   CellInfo *pInfo
32f40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
32f50 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  e information ab
32f60 6f 75 74 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  out the cell */.
32f70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
32f80 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
32f90 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f  .  Pgno ovflPgno
32fa0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
32fb0 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 33 32 20 6f  t nOvfl;.  u32 o
32fc0 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20  vflPageSize;..  
32fd0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
32fe0 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
32ff0 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
33000 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65  .  pPage->xParse
33010 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c  Cell(pPage, pCel
33020 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 69 66 28  l, pInfo);.  if(
33030 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 3d 3d   pInfo->nLocal==
33040 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20  pInfo->nPayload 
33050 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
33060 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20  LITE_OK;  /* No 
33070 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
33080 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  Return without d
33090 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f  oing anything */
330a0 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 65 6c 6c  .  }.  if( pCell
330b0 2b 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 2d 31 20  +pInfo->nSize-1 
330c0 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70  > pPage->aData+p
330d0 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 29  Page->maskPage )
330e0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
330f0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
33100 3b 20 20 2f 2a 20 43 65 6c 6c 20 65 78 74 65 6e  ;  /* Cell exten
33110 64 73 20 70 61 73 74 20 65 6e 64 20 6f 66 20 70  ds past end of p
33120 61 67 65 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66  age */.  }.  ovf
33130 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  lPgno = get4byte
33140 28 70 43 65 6c 6c 20 2b 20 70 49 6e 66 6f 2d 3e  (pCell + pInfo->
33150 6e 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 61 73  nSize - 4);.  as
33160 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c  sert( pBt->usabl
33170 65 53 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f  eSize > 4 );.  o
33180 76 66 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42  vflPageSize = pB
33190 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
331a0 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 70 49  4;.  nOvfl = (pI
331b0 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 2d 20  nfo->nPayload - 
331c0 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20  pInfo->nLocal + 
331d0 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 2d 20 31  ovflPageSize - 1
331e0 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a  )/ovflPageSize;.
331f0 20 20 61 73 73 65 72 74 28 20 6e 4f 76 66 6c 3e    assert( nOvfl>
33200 30 20 7c 7c 20 0a 20 20 20 20 28 43 4f 52 52 55  0 || .    (CORRU
33210 50 54 5f 44 42 20 26 26 20 28 70 49 6e 66 6f 2d  PT_DB && (pInfo-
33220 3e 6e 50 61 79 6c 6f 61 64 20 2b 20 6f 76 66 6c  >nPayload + ovfl
33230 50 61 67 65 53 69 7a 65 29 3c 6f 76 66 6c 50 61  PageSize)<ovflPa
33240 67 65 53 69 7a 65 29 0a 20 20 29 3b 0a 20 20 77  geSize).  );.  w
33250 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b  hile( nOvfl-- ){
33260 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65 78 74 20  .    Pgno iNext 
33270 3d 20 30 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65  = 0;.    MemPage
33280 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20   *pOvfl = 0;.   
33290 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20   if( ovflPgno<2 
332a0 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 62 74 72 65  || ovflPgno>btre
332b0 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  ePagecount(pBt) 
332c0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 30 20 69 73  ){.      /* 0 is
332d0 20 6e 6f 74 20 61 20 6c 65 67 61 6c 20 70 61 67   not a legal pag
332e0 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67  e number and pag
332f0 65 20 31 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e  e 1 cannot be an
33300 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66   .      ** overf
33310 6c 6f 77 20 70 61 67 65 2e 20 54 68 65 72 65 66  low page. Theref
33320 6f 72 65 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c  ore if ovflPgno<
33330 32 20 6f 72 20 70 61 73 74 20 74 68 65 20 65 6e  2 or past the en
33340 64 20 6f 66 20 74 68 65 20 0a 20 20 20 20 20 20  d of the .      
33350 2a 2a 20 66 69 6c 65 20 74 68 65 20 64 61 74 61  ** file the data
33360 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72  base must be cor
33370 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72  rupt. */.      r
33380 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
33390 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
333a0 0a 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 29  .    if( nOvfl )
333b0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65 74  {.      rc = get
333c0 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74  OverflowPage(pBt
333d0 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76  , ovflPgno, &pOv
333e0 66 6c 2c 20 26 69 4e 65 78 74 29 3b 0a 20 20 20  fl, &iNext);.   
333f0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
33400 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
33410 20 20 69 66 28 20 28 20 70 4f 76 66 6c 20 7c 7c    if( ( pOvfl ||
33420 20 28 28 70 4f 76 66 6c 20 3d 20 62 74 72 65 65   ((pOvfl = btree
33430 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20  PageLookup(pBt, 
33440 6f 76 66 6c 50 67 6e 6f 29 29 21 3d 30 29 20 29  ovflPgno))!=0) )
33450 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33  .     && sqlite3
33460 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
33470 74 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65  t(pOvfl->pDbPage
33480 29 21 3d 31 0a 20 20 20 20 29 7b 0a 20 20 20 20  )!=1.    ){.    
33490 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f    /* There is no
334a0 20 72 65 61 73 6f 6e 20 61 6e 79 20 63 75 72 73   reason any curs
334b0 6f 72 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61  or should have a
334c0 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  n outstanding re
334d0 66 65 72 65 6e 63 65 20 0a 20 20 20 20 20 20 2a  ference .      *
334e0 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  * to an overflow
334f0 20 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20   page belonging 
33500 74 6f 20 61 20 63 65 6c 6c 20 74 68 61 74 20 69  to a cell that i
33510 73 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2f  s being deleted/
33520 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20 2a  updated..      *
33530 2a 20 53 6f 20 69 66 20 74 68 65 72 65 20 65 78  * So if there ex
33540 69 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f  ists more than o
33550 6e 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ne reference to 
33560 74 68 69 73 20 70 61 67 65 2c 20 74 68 65 6e 20  this page, then 
33570 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 75 73  it .      ** mus
33580 74 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65 20  t not really be 
33590 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
335a0 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
335b0 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
335c0 74 2e 20 0a 20 20 20 20 20 20 2a 2a 20 49 74 20  t. .      ** It 
335d0 69 73 20 68 65 6c 70 66 75 6c 20 74 6f 20 64 65  is helpful to de
335e0 74 65 63 74 20 74 68 69 73 20 62 65 66 6f 72 65  tect this before
335f0 20 63 61 6c 6c 69 6e 67 20 66 72 65 65 50 61 67   calling freePag
33600 65 32 28 29 2c 20 61 73 20 0a 20 20 20 20 20 20  e2(), as .      
33610 2a 2a 20 66 72 65 65 50 61 67 65 32 28 29 20 6d  ** freePage2() m
33620 61 79 20 7a 65 72 6f 20 74 68 65 20 70 61 67 65  ay zero the page
33630 20 63 6f 6e 74 65 6e 74 73 20 69 66 20 73 65 63   contents if sec
33640 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 20  ure-delete mode 
33650 69 73 0a 20 20 20 20 20 20 2a 2a 20 65 6e 61 62  is.      ** enab
33660 6c 65 64 2e 20 49 66 20 74 68 69 73 20 27 6f 76  led. If this 'ov
33670 65 72 66 6c 6f 77 27 20 70 61 67 65 20 68 61 70  erflow' page hap
33680 70 65 6e 73 20 74 6f 20 62 65 20 61 20 70 61 67  pens to be a pag
33690 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20  e that the.     
336a0 20 2a 2a 20 63 61 6c 6c 65 72 20 69 73 20 69 74   ** caller is it
336b0 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20  erating through 
336c0 6f 72 20 75 73 69 6e 67 20 69 6e 20 73 6f 6d 65  or using in some
336d0 20 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69 73   other way, this
336e0 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e 20 62 65  .      ** can be
336f0 20 70 72 6f 62 6c 65 6d 61 74 69 63 2e 0a 20 20   problematic..  
33700 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
33710 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
33720 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _BKPT;.    }else
33730 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 72 65  {.      rc = fre
33740 65 50 61 67 65 32 28 70 42 74 2c 20 70 4f 76 66  ePage2(pBt, pOvf
33750 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20  l, ovflPgno);.  
33760 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f 76    }..    if( pOv
33770 66 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  fl ){.      sqli
33780 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f  te3PagerUnref(pO
33790 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  vfl->pDbPage);. 
337a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20     }.    if( rc 
337b0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
337c0 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e 65 78   ovflPgno = iNex
337d0 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
337e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
337f0 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20 62  .** Create the b
33800 79 74 65 20 73 65 71 75 65 6e 63 65 20 75 73 65  yte sequence use
33810 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61  d to represent a
33820 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50   cell on page pP
33830 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65  age.** and write
33840 20 74 68 61 74 20 62 79 74 65 20 73 65 71 75 65   that byte seque
33850 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d  nce into pCell[]
33860 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65  .  Overflow page
33870 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74  s are.** allocat
33880 65 64 20 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e  ed and filled in
33890 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20   as necessary.  
338a0 54 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63  The calling proc
338b0 65 64 75 72 65 0a 2a 2a 20 69 73 20 72 65 73 70  edure.** is resp
338c0 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69  onsible for maki
338d0 6e 67 20 73 75 72 65 20 73 75 66 66 69 63 69 65  ng sure sufficie
338e0 6e 74 20 73 70 61 63 65 20 68 61 73 20 62 65 65  nt space has bee
338f0 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66  n allocated.** f
33900 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a  or pCell[]..**.*
33910 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 43 65 6c  * Note that pCel
33920 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73  l does not neces
33930 73 61 72 79 20 6e 65 65 64 20 74 6f 20 70 6f 69  sary need to poi
33940 6e 74 20 74 6f 20 74 68 65 20 70 50 61 67 65 2d  nt to the pPage-
33950 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20  >aData.** area. 
33960 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69   pCell might poi
33970 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f  nt to some tempo
33980 72 61 72 79 20 73 74 6f 72 61 67 65 2e 20 20 54  rary storage.  T
33990 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20  he cell will.** 
339a0 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69  be constructed i
339b0 6e 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79  n this temporary
339c0 20 61 72 65 61 20 74 68 65 6e 20 63 6f 70 69 65   area then copie
339d0 64 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44  d into pPage->aD
339e0 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f  ata.** later..*/
339f0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c  .static int fill
33a00 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  InCell(.  MemPag
33a10 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
33a20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
33a30 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
33a40 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ns the cell */. 
33a50 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
33a60 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
33a70 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65 78 74  /* Complete text
33a80 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a   of the cell */.
33a90 20 20 63 6f 6e 73 74 20 42 74 72 65 65 50 61 79    const BtreePay
33aa0 6c 6f 61 64 20 2a 70 58 2c 20 20 20 20 20 20 20  load *pX,       
33ab0 20 2f 2a 20 50 61 79 6c 6f 61 64 20 77 69 74 68   /* Payload with
33ac0 20 77 68 69 63 68 20 74 6f 20 63 6f 6e 73 74 72   which to constr
33ad0 75 63 74 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  uct the cell */.
33ae0 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20    int *pnSize   
33af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33b00 20 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73   /* Write cell s
33b10 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ize here */.){. 
33b20 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20   int nPayload;. 
33b30 20 63 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b   const u8 *pSrc;
33b40 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20  .  int nSrc, n, 
33b50 72 63 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c  rc;.  int spaceL
33b60 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  eft;.  MemPage *
33b70 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d  pOvfl = 0;.  Mem
33b80 50 61 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65  Page *pToRelease
33b90 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64   = 0;.  unsigned
33ba0 20 63 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20   char *pPrior;. 
33bb0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
33bc0 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68  pPayload;.  BtSh
33bd0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
33be0 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70  e->pBt;.  Pgno p
33bf0 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69  gnoOvfl = 0;.  i
33c00 6e 74 20 6e 48 65 61 64 65 72 3b 0a 0a 20 20 61  nt nHeader;..  a
33c10 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
33c20 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
33c30 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
33c40 0a 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20 6e  .  /* pPage is n
33c50 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77  ot necessarily w
33c60 72 69 74 65 61 62 6c 65 20 73 69 6e 63 65 20 70  riteable since p
33c70 43 65 6c 6c 20 6d 69 67 68 74 20 62 65 20 61 75  Cell might be au
33c80 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75 66  xiliary.  ** buf
33c90 66 65 72 20 73 70 61 63 65 20 74 68 61 74 20 69  fer space that i
33ca0 73 20 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20  s separate from 
33cb0 74 68 65 20 70 50 61 67 65 20 62 75 66 66 65 72  the pPage buffer
33cc0 20 61 72 65 61 20 2a 2f 0a 20 20 61 73 73 65 72   area */.  asser
33cd0 74 28 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e  t( pCell<pPage->
33ce0 61 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d  aData || pCell>=
33cf0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
33d00 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20  t->pageSize].   
33d10 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
33d20 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
33d30 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
33d40 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c  ge) );..  /* Fil
33d50 6c 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e  l in the header.
33d60 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20   */.  nHeader = 
33d70 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
33d80 69 7a 65 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ize;.  if( pPage
33d90 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
33da0 6e 50 61 79 6c 6f 61 64 20 3d 20 70 58 2d 3e 6e  nPayload = pX->n
33db0 44 61 74 61 20 2b 20 70 58 2d 3e 6e 5a 65 72 6f  Data + pX->nZero
33dc0 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 58 2d  ;.    pSrc = pX-
33dd0 3e 70 44 61 74 61 3b 0a 20 20 20 20 6e 53 72 63  >pData;.    nSrc
33de0 20 3d 20 70 58 2d 3e 6e 44 61 74 61 3b 0a 20 20   = pX->nData;.  
33df0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
33e00 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 3b 20 2f  >intKeyLeaf ); /
33e10 2a 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f  * fillInCell() o
33e20 6e 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72 20 6c  nly called for l
33e30 65 61 76 65 73 20 2a 2f 0a 20 20 20 20 6e 48 65  eaves */.    nHe
33e40 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e  ader += putVarin
33e50 74 33 32 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64  t32(&pCell[nHead
33e60 65 72 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a  er], nPayload);.
33e70 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70      nHeader += p
33e80 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b  utVarint(&pCell[
33e90 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a  nHeader], *(u64*
33ea0 29 26 70 58 2d 3e 6e 4b 65 79 29 3b 0a 20 20 7d  )&pX->nKey);.  }
33eb0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
33ec0 28 20 70 58 2d 3e 6e 4b 65 79 3c 3d 30 78 37 66  ( pX->nKey<=0x7f
33ed0 66 66 66 66 66 66 20 26 26 20 70 58 2d 3e 70 4b  ffffff && pX->pK
33ee0 65 79 21 3d 30 20 29 3b 0a 20 20 20 20 6e 53 72  ey!=0 );.    nSr
33ef0 63 20 3d 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28  c = nPayload = (
33f00 69 6e 74 29 70 58 2d 3e 6e 4b 65 79 3b 0a 20 20  int)pX->nKey;.  
33f10 20 20 70 53 72 63 20 3d 20 70 58 2d 3e 70 4b 65    pSrc = pX->pKe
33f20 79 3b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b  y;.    nHeader +
33f30 3d 20 70 75 74 56 61 72 69 6e 74 33 32 28 26 70  = putVarint32(&p
33f40 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e  Cell[nHeader], n
33f50 50 61 79 6c 6f 61 64 29 3b 0a 20 20 7d 0a 20 20  Payload);.  }.  
33f60 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68  .  /* Fill in th
33f70 65 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 69  e payload */.  i
33f80 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61  f( nPayload<=pPa
33f90 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a  ge->maxLocal ){.
33fa0 20 20 20 20 6e 20 3d 20 6e 48 65 61 64 65 72 20      n = nHeader 
33fb0 2b 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  + nPayload;.    
33fc0 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 33 20 29  testcase( n==3 )
33fd0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
33fe0 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 69 66 28 20  n==4 );.    if( 
33ff0 6e 3c 34 20 29 20 6e 20 3d 20 34 3b 0a 20 20 20  n<4 ) n = 4;.   
34000 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 3b 0a 20 20   *pnSize = n;.  
34010 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 6e 50    spaceLeft = nP
34020 61 79 6c 6f 61 64 3b 0a 20 20 20 20 70 50 72 69  ayload;.    pPri
34030 6f 72 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 7d 65  or = pCell;.  }e
34040 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6d 6e 20  lse{.    int mn 
34050 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61  = pPage->minLoca
34060 6c 3b 0a 20 20 20 20 6e 20 3d 20 6d 6e 20 2b 20  l;.    n = mn + 
34070 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 6e 29 20  (nPayload - mn) 
34080 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  % (pPage->pBt->u
34090 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a  sableSize - 4);.
340a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d      testcase( n=
340b0 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
340c0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
340d0 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ( n==pPage->maxL
340e0 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66  ocal+1 );.    if
340f0 28 20 6e 20 3e 20 70 50 61 67 65 2d 3e 6d 61 78  ( n > pPage->max
34100 4c 6f 63 61 6c 20 29 20 6e 20 3d 20 6d 6e 3b 0a  Local ) n = mn;.
34110 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20      spaceLeft = 
34120 6e 3b 0a 20 20 20 20 2a 70 6e 53 69 7a 65 20 3d  n;.    *pnSize =
34130 20 6e 20 2b 20 6e 48 65 61 64 65 72 20 2b 20 34   n + nHeader + 4
34140 3b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20 26  ;.    pPrior = &
34150 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 2b 6e 5d  pCell[nHeader+n]
34160 3b 0a 20 20 7d 0a 20 20 70 50 61 79 6c 6f 61 64  ;.  }.  pPayload
34170 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65   = &pCell[nHeade
34180 72 5d 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69  r];..  /* At thi
34190 73 20 70 6f 69 6e 74 20 76 61 72 69 61 62 6c 65  s point variable
341a0 73 20 73 68 6f 75 6c 64 20 62 65 20 73 65 74 20  s should be set 
341b0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a  as follows:.  **
341c0 0a 20 20 2a 2a 20 20 20 6e 50 61 79 6c 6f 61 64  .  **   nPayload
341d0 20 20 20 20 20 20 20 20 20 20 20 54 6f 74 61 6c             Total
341e0 20 70 61 79 6c 6f 61 64 20 73 69 7a 65 20 69 6e   payload size in
341f0 20 62 79 74 65 73 0a 20 20 2a 2a 20 20 20 70 50   bytes.  **   pP
34200 61 79 6c 6f 61 64 20 20 20 20 20 20 20 20 20 20  ayload          
34210 20 42 65 67 69 6e 20 77 72 69 74 69 6e 67 20 70   Begin writing p
34220 61 79 6c 6f 61 64 20 68 65 72 65 0a 20 20 2a 2a  ayload here.  **
34230 20 20 20 73 70 61 63 65 4c 65 66 74 20 20 20 20     spaceLeft    
34240 20 20 20 20 20 20 53 70 61 63 65 20 61 76 61 69        Space avai
34250 6c 61 62 6c 65 20 61 74 20 70 50 61 79 6c 6f 61  lable at pPayloa
34260 64 2e 20 20 49 66 20 6e 50 61 79 6c 6f 61 64 3e  d.  If nPayload>
34270 73 70 61 63 65 4c 65 66 74 2c 0a 20 20 2a 2a 20  spaceLeft,.  ** 
34280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34290 20 20 20 20 20 74 68 61 74 20 6d 65 61 6e 73 20       that means 
342a0 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 73 70 69  content must spi
342b0 6c 6c 20 69 6e 74 6f 20 6f 76 65 72 66 6c 6f 77  ll into overflow
342c0 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 20 20 2a   pages..  **   *
342d0 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  pnSize          
342e0 20 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6c 6f    Size of the lo
342f0 63 61 6c 20 63 65 6c 6c 20 28 6e 6f 74 20 63 6f  cal cell (not co
34300 75 6e 74 69 6e 67 20 6f 76 65 72 66 6c 6f 77 20  unting overflow 
34310 70 61 67 65 73 29 0a 20 20 2a 2a 20 20 20 70 50  pages).  **   pP
34320 72 69 6f 72 20 20 20 20 20 20 20 20 20 20 20 20  rior            
34330 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20   Where to write 
34340 74 68 65 20 70 67 6e 6f 20 6f 66 20 74 68 65 20  the pgno of the 
34350 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70  first overflow p
34360 61 67 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 55 73  age.  **.  ** Us
34370 65 20 61 20 63 61 6c 6c 20 74 6f 20 62 74 72 65  e a call to btre
34380 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20  eParseCellPtr() 
34390 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74  to verify that t
343a0 68 65 20 76 61 6c 75 65 73 20 61 62 6f 76 65 0a  he values above.
343b0 20 20 2a 2a 20 77 65 72 65 20 63 6f 6d 70 75 74    ** were comput
343c0 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20  ed correctly..  
343d0 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45  */.#if SQLITE_DE
343e0 42 55 47 0a 20 20 7b 0a 20 20 20 20 43 65 6c 6c  BUG.  {.    Cell
343f0 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 70  Info info;.    p
34400 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
34410 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
34420 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72  info);.    asser
34430 74 28 20 6e 48 65 61 64 65 72 3d 3d 28 69 6e 74  t( nHeader==(int
34440 29 28 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 20  )(info.pPayload 
34450 2d 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20 20 20  - pCell) );.    
34460 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65  assert( info.nKe
34470 79 3d 3d 70 58 2d 3e 6e 4b 65 79 20 29 3b 0a 20  y==pX->nKey );. 
34480 20 20 20 61 73 73 65 72 74 28 20 2a 70 6e 53 69     assert( *pnSi
34490 7a 65 20 3d 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65  ze == info.nSize
344a0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
344b0 73 70 61 63 65 4c 65 66 74 20 3d 3d 20 69 6e 66  spaceLeft == inf
344c0 6f 2e 6e 4c 6f 63 61 6c 20 29 3b 0a 20 20 7d 0a  o.nLocal );.  }.
344d0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 57 72 69  #endif..  /* Wri
344e0 74 65 20 74 68 65 20 70 61 79 6c 6f 61 64 20 69  te the payload i
344f0 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 43 65  nto the local Ce
34500 6c 6c 20 61 6e 64 20 61 6e 79 20 65 78 74 72 61  ll and any extra
34510 20 69 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70   into overflow p
34520 61 67 65 73 20 2a 2f 0a 20 20 77 68 69 6c 65 28  ages */.  while(
34530 20 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20   nPayload>0 ){. 
34540 20 20 20 69 66 28 20 73 70 61 63 65 4c 65 66 74     if( spaceLeft
34550 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  ==0 ){.#ifndef S
34560 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
34570 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f  ACUUM.      Pgno
34580 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67   pgnoPtrmap = pg
34590 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66  noOvfl; /* Overf
345a0 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72  low page pointer
345b0 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67 65 20  -map entry page 
345c0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  */.      if( pBt
345d0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
345e0 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20          do{.    
345f0 20 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b        pgnoOvfl++
34600 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c  ;.        } whil
34610 65 28 20 0a 20 20 20 20 20 20 20 20 20 20 50 54  e( .          PT
34620 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
34630 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67   pgnoOvfl) || pg
34640 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f  noOvfl==PENDING_
34650 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 0a  BYTE_PAGE(pBt) .
34660 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
34670 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
34680 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
34690 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4f 76  eePage(pBt, &pOv
346a0 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70  fl, &pgnoOvfl, p
346b0 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66  gnoOvfl, 0);.#if
346c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
346d0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
346e0 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
346f0 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75  base supports au
34700 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20 74  to-vacuum, and t
34710 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 73 75 62  he second or sub
34720 73 65 71 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a  sequent.      **
34730 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
34740 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65  s being allocate
34750 64 2c 20 61 64 64 20 61 6e 20 65 6e 74 72 79 20  d, add an entry 
34760 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  to the pointer-m
34770 61 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  ap.      ** for 
34780 74 68 61 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a  that page now. .
34790 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
347a0 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
347b0 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20   first overflow 
347c0 70 61 67 65 2c 20 74 68 65 6e 20 77 72 69 74 65  page, then write
347d0 20 61 20 70 61 72 74 69 61 6c 20 65 6e 74 72 79   a partial entry
347e0 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68   .      ** to th
347f0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49  e pointer-map. I
34800 66 20 77 65 20 77 72 69 74 65 20 6e 6f 74 68 69  f we write nothi
34810 6e 67 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ng to this point
34820 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20  er-map slot,.   
34830 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f     ** then the o
34840 70 74 69 6d 69 73 74 69 63 20 6f 76 65 72 66 6c  ptimistic overfl
34850 6f 77 20 63 68 61 69 6e 20 70 72 6f 63 65 73 73  ow chain process
34860 69 6e 67 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c  ing in clearCell
34870 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20  ().      ** may 
34880 6d 69 73 69 6e 74 65 72 70 72 65 74 20 74 68 65  misinterpret the
34890 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 76   uninitialized v
348a0 61 6c 75 65 73 20 61 6e 64 20 64 65 6c 65 74 65  alues and delete
348b0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 77 72   the.      ** wr
348c0 6f 6e 67 20 70 61 67 65 73 20 66 72 6f 6d 20 74  ong pages from t
348d0 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20  he database..   
348e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
348f0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
34900 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
34910 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65   ){.        u8 e
34920 54 79 70 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d  Type = (pgnoPtrm
34930 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ap?PTRMAP_OVERFL
34940 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46  OW2:PTRMAP_OVERF
34950 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20 20 20 70  LOW1);.        p
34960 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67  trmapPut(pBt, pg
34970 6e 6f 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20 70  noOvfl, eType, p
34980 67 6e 6f 50 74 72 6d 61 70 2c 20 26 72 63 29 3b  gnoPtrmap, &rc);
34990 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
349a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c  ){.          rel
349b0 65 61 73 65 50 61 67 65 28 70 4f 76 66 6c 29 3b  easePage(pOvfl);
349c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
349d0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
349e0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
349f0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
34a00 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20  oRelease);.     
34a10 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
34a20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
34a30 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73  If pToRelease is
34a40 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70   not zero than p
34a50 50 72 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e 74  Prior points int
34a60 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a  o the data area.
34a70 20 20 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52        ** of pToR
34a80 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75  elease.  Make su
34a90 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73  re pToRelease is
34aa0 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65   still writeable
34ab0 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
34ac0 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30  t( pToRelease==0
34ad0 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
34ae0 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52  Iswriteable(pToR
34af0 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29  elease->pDbPage)
34b00 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66   );..      /* If
34b10 20 70 50 72 69 6f 72 20 69 73 20 70 61 72 74 20   pPrior is part 
34b20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72 65 61  of the data area
34b30 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20   of pPage, then 
34b40 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a  make sure pPage.
34b50 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c        ** is stil
34b60 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20  l writeable */. 
34b70 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72       assert( pPr
34b80 69 6f 72 3c 70 50 61 67 65 2d 3e 61 44 61 74 61  ior<pPage->aData
34b90 20 7c 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50 61   || pPrior>=&pPa
34ba0 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70  ge->aData[pBt->p
34bb0 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20  ageSize].       
34bc0 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50       || sqlite3P
34bd0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
34be0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
34bf0 29 3b 0a 0a 20 20 20 20 20 20 70 75 74 34 62 79  );..      put4by
34c00 74 65 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f  te(pPrior, pgnoO
34c10 76 66 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c 65  vfl);.      rele
34c20 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61  asePage(pToRelea
34c30 73 65 29 3b 0a 20 20 20 20 20 20 70 54 6f 52 65  se);.      pToRe
34c40 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20  lease = pOvfl;. 
34c50 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 4f       pPrior = pO
34c60 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  vfl->aData;.    
34c70 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f    put4byte(pPrio
34c80 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61  r, 0);.      pPa
34c90 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e  yload = &pOvfl->
34ca0 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20  aData[4];.      
34cb0 73 70 61 63 65 4c 65 66 74 20 3d 20 70 42 74 2d  spaceLeft = pBt-
34cc0 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
34cd0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e  .    }.    n = n
34ce0 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28  Payload;.    if(
34cf0 20 6e 3e 73 70 61 63 65 4c 65 66 74 20 29 20 6e   n>spaceLeft ) n
34d00 20 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a 20   = spaceLeft;.. 
34d10 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65     /* If pToRele
34d20 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20  ase is not zero 
34d30 74 68 61 6e 20 70 50 61 79 6c 6f 61 64 20 70 6f  than pPayload po
34d40 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61  ints into the da
34d50 74 61 20 61 72 65 61 0a 20 20 20 20 2a 2a 20 6f  ta area.    ** o
34d60 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d  f pToRelease.  M
34d70 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65  ake sure pToRele
34d80 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69  ase is still wri
34d90 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 61  teable. */.    a
34da0 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73  ssert( pToReleas
34db0 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50  e==0 || sqlite3P
34dc0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
34dd0 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50  pToRelease->pDbP
34de0 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  age) );..    /* 
34df0 49 66 20 70 50 61 79 6c 6f 61 64 20 69 73 20 70  If pPayload is p
34e00 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20  art of the data 
34e10 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74  area of pPage, t
34e20 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50  hen make sure pP
34e30 61 67 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 74  age.    ** is st
34e40 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f  ill writeable */
34e50 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
34e60 79 6c 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44 61  yload<pPage->aDa
34e70 74 61 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e 3d  ta || pPayload>=
34e80 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
34e90 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20  t->pageSize].   
34ea0 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
34eb0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
34ec0 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
34ed0 67 65 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  ge) );..    if( 
34ee0 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 20 20  nSrc>0 ){.      
34ef0 69 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d  if( n>nSrc ) n =
34f00 20 6e 53 72 63 3b 0a 20 20 20 20 20 20 61 73 73   nSrc;.      ass
34f10 65 72 74 28 20 70 53 72 63 20 29 3b 0a 20 20 20  ert( pSrc );.   
34f20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f     memcpy(pPaylo
34f30 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20  ad, pSrc, n);.  
34f40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d    }else{.      m
34f50 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2c 20  emset(pPayload, 
34f60 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, n);.    }.   
34f70 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a   nPayload -= n;.
34f80 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20      pPayload += 
34f90 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20 6e  n;.    pSrc += n
34fa0 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b  ;.    nSrc -= n;
34fb0 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 2d  .    spaceLeft -
34fc0 3d 20 6e 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61  = n;.  }.  relea
34fd0 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73  sePage(pToReleas
34fe0 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e);.  return SQL
34ff0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
35000 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68   Remove the i-th
35010 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65   cell from pPage
35020 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
35030 65 66 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e  effects pPage on
35040 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20  ly..** The cell 
35050 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66  content is not f
35060 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61  reed or dealloca
35070 74 65 64 2e 20 20 49 74 20 69 73 20 61 73 73 75  ted.  It is assu
35080 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  med that.** the 
35090 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73  cell content has
350a0 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d   been copied som
350b0 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68  eplace else.  Th
350c0 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a  is routine just.
350d0 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72  ** removes the r
350e0 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
350f0 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e  cell from pPage.
35100 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74  .**.** "sz" must
35110 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   be the number o
35120 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 63  f bytes in the c
35130 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ell..*/.static v
35140 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d  oid dropCell(Mem
35150 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
35160 20 69 64 78 2c 20 69 6e 74 20 73 7a 2c 20 69 6e   idx, int sz, in
35170 74 20 2a 70 52 43 29 7b 0a 20 20 75 33 32 20 70  t *pRC){.  u32 p
35180 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  c;         /* Of
35190 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e  fset to cell con
351a0 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65 69  tent of cell bei
351b0 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20  ng deleted */.  
351c0 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
351d0 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  /* pPage->aData 
351e0 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20  */.  u8 *ptr;   
351f0 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
35200 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f 75 6e  move bytes aroun
35210 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b 5d 20  d within data[] 
35220 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
35230 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75       /* The retu
35240 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
35250 20 68 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20   hdr;        /* 
35260 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  Beginning of the
35270 20 68 65 61 64 65 72 2e 20 20 30 20 6d 6f 73 74   header.  0 most
35280 20 70 61 67 65 73 2e 20 20 31 30 30 20 70 61 67   pages.  100 pag
35290 65 20 31 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70  e 1 */..  if( *p
352a0 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  RC ) return;.  a
352b0 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26  ssert( idx>=0 &&
352c0 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c   idx<pPage->nCel
352d0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  l );.  assert( C
352e0 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 73 7a 3d  ORRUPT_DB || sz=
352f0 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c  =cellSize(pPage,
35300 20 69 64 78 29 20 29 3b 0a 20 20 61 73 73 65 72   idx) );.  asser
35310 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
35320 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
35330 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
35340 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
35350 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
35360 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
35370 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  .  data = pPage-
35380 3e 61 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20  >aData;.  ptr = 
35390 26 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78  &pPage->aCellIdx
353a0 5b 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20  [2*idx];.  pc = 
353b0 67 65 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20  get2byte(ptr);. 
353c0 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
353d0 72 4f 66 66 73 65 74 3b 0a 20 20 74 65 73 74 63  rOffset;.  testc
353e0 61 73 65 28 20 70 63 3d 3d 67 65 74 32 62 79 74  ase( pc==get2byt
353f0 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20  e(&data[hdr+5]) 
35400 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
35410 63 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e 70 42 74  c+sz==pPage->pBt
35420 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
35430 20 20 69 66 28 20 70 63 20 3c 20 28 75 33 32 29    if( pc < (u32)
35440 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
35450 64 72 2b 35 5d 29 20 7c 7c 20 70 63 2b 73 7a 20  dr+5]) || pc+sz 
35460 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  > pPage->pBt->us
35470 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
35480 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f  *pRC = SQLITE_CO
35490 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
354a0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63  return;.  }.  rc
354b0 20 3d 20 66 72 65 65 53 70 61 63 65 28 70 50 61   = freeSpace(pPa
354c0 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69  ge, pc, sz);.  i
354d0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 52  f( rc ){.    *pR
354e0 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75  C = rc;.    retu
354f0 72 6e 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d  rn;.  }.  pPage-
35500 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 69 66 28 20  >nCell--;.  if( 
35510 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  pPage->nCell==0 
35520 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64  ){.    memset(&d
35530 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34  ata[hdr+1], 0, 4
35540 29 3b 0a 20 20 20 20 64 61 74 61 5b 68 64 72 2b  );.    data[hdr+
35550 37 5d 20 3d 20 30 3b 0a 20 20 20 20 70 75 74 32  7] = 0;.    put2
35560 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
35570 5d 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  ], pPage->pBt->u
35580 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20  sableSize);.    
35590 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70  pPage->nFree = p
355a0 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
355b0 65 53 69 7a 65 20 2d 20 70 50 61 67 65 2d 3e 68  eSize - pPage->h
355c0 64 72 4f 66 66 73 65 74 0a 20 20 20 20 20 20 20  drOffset.       
355d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
355e0 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  - pPage->childPt
355f0 72 53 69 7a 65 20 2d 20 38 3b 0a 20 20 7d 65 6c  rSize - 8;.  }el
35600 73 65 7b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28  se{.    memmove(
35610 70 74 72 2c 20 70 74 72 2b 32 2c 20 32 2a 28 70  ptr, ptr+2, 2*(p
35620 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 69 64  Page->nCell - id
35630 78 29 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  x));.    put2byt
35640 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20  e(&data[hdr+3], 
35650 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20  pPage->nCell);. 
35660 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20     pPage->nFree 
35670 2b 3d 20 32 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  += 2;.  }.}../*.
35680 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20  ** Insert a new 
35690 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61 74  cell on pPage at
356a0 20 63 65 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e   cell index "i".
356b0 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74    pCell points t
356c0 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  o the.** content
356d0 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a   of the cell..**
356e0 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20  .** If the cell 
356f0 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69 74  content will fit
35700 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68   on the page, th
35710 65 6e 20 70 75 74 20 69 74 20 74 68 65 72 65 2e  en put it there.
35720 20 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20    If it.** will 
35730 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e 20 6d 61  not fit, then ma
35740 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
35750 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e   cell content in
35760 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70  to pTemp if.** p
35770 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c  Temp is not null
35780 2e 20 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  .  Regardless of
35790 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65   pTemp, allocate
357a0 20 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20   a new entry.** 
357b0 69 6e 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c  in pPage->apOvfl
357c0 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74 20 70  [] and make it p
357d0 6f 69 6e 74 20 74 6f 20 74 68 65 20 63 65 6c 6c  oint to the cell
357e0 20 63 6f 6e 74 65 6e 74 20 28 65 69 74 68 65 72   content (either
357f0 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72 20  .** in pTemp or 
35800 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 43 65  the original pCe
35810 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72 65 63  ll) and also rec
35820 6f 72 64 20 69 74 73 20 69 6e 64 65 78 2e 20 0a  ord its index. .
35830 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20  ** Allocating a 
35840 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70 50 61  new entry in pPa
35850 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c  ge->aCell[] impl
35860 69 65 73 20 74 68 61 74 20 0a 2a 2a 20 70 50 61  ies that .** pPa
35870 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73  ge->nOverflow is
35880 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a   incremented..**
35890 0a 2a 2a 20 2a 70 52 43 20 6d 75 73 74 20 62 65  .** *pRC must be
358a0 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20   SQLITE_OK when 
358b0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
358c0 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
358d0 63 20 76 6f 69 64 20 69 6e 73 65 72 74 43 65 6c  c void insertCel
358e0 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  l(.  MemPage *pP
358f0 61 67 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69  age,   /* Page i
35900 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61 72 65  nto which we are
35910 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e   copying */.  in
35920 74 20 69 2c 20 20 20 20 20 20 20 20 20 20 20 20  t i,            
35930 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f  /* New cell beco
35940 6d 65 73 20 74 68 65 20 69 2d 74 68 20 63 65 6c  mes the i-th cel
35950 6c 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f  l of the page */
35960 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20  .  u8 *pCell,   
35970 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20       /* Content 
35980 6f 66 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20  of the new cell 
35990 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20 20  */.  int sz,    
359a0 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
359b0 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43  of content in pC
359c0 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65  ell */.  u8 *pTe
359d0 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65  mp,        /* Te
359e0 6d 70 20 73 74 6f 72 61 67 65 20 73 70 61 63 65  mp storage space
359f0 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e   for pCell, if n
35a00 65 65 64 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20  eeded */.  Pgno 
35a10 69 43 68 69 6c 64 2c 20 20 20 20 20 20 2f 2a 20  iChild,      /* 
35a20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70  If non-zero, rep
35a30 6c 61 63 65 20 66 69 72 73 74 20 34 20 62 79 74  lace first 4 byt
35a40 65 73 20 77 69 74 68 20 74 68 69 73 20 76 61 6c  es with this val
35a50 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 43  ue */.  int *pRC
35a60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61            /* Rea
35a70 64 20 61 6e 64 20 77 72 69 74 65 20 72 65 74 75  d and write retu
35a80 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 68 65 72  rn code from her
35a90 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64  e */.){.  int id
35aa0 78 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 57  x = 0;      /* W
35ab0 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e 65  here to write ne
35ac0 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  w cell content i
35ad0 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
35ae0 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  t j;            
35af0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
35b00 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20  */.  u8 *data;  
35b10 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
35b20 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 77 68 6f  ntent of the who
35b30 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  le page */.  u8 
35b40 2a 70 49 6e 73 3b 20 20 20 20 20 20 20 20 20 2f  *pIns;         /
35b50 2a 20 54 68 65 20 70 6f 69 6e 74 20 69 6e 20 70  * The point in p
35b60 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 5d  Page->aCellIdx[]
35b70 20 77 68 65 72 65 20 6e 6f 20 63 65 6c 6c 20 69   where no cell i
35b80 6e 73 65 72 74 65 64 20 2a 2f 0a 0a 20 20 61 73  nserted */..  as
35b90 73 65 72 74 28 20 2a 70 52 43 3d 3d 53 51 4c 49  sert( *pRC==SQLI
35ba0 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72  TE_OK );.  asser
35bb0 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50  t( i>=0 && i<=pP
35bc0 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65  age->nCell+pPage
35bd0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20  ->nOverflow );. 
35be0 20 61 73 73 65 72 74 28 20 4d 58 5f 43 45 4c 4c   assert( MX_CELL
35bf0 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 31 30  (pPage->pBt)<=10
35c00 39 32 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  921 );.  assert(
35c10 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d   pPage->nCell<=M
35c20 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42  X_CELL(pPage->pB
35c30 74 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  t) || CORRUPT_DB
35c40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
35c50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d  age->nOverflow<=
35c60 41 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d  ArraySize(pPage-
35c70 3e 61 70 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73  >apOvfl) );.  as
35c80 73 65 72 74 28 20 41 72 72 61 79 53 69 7a 65 28  sert( ArraySize(
35c90 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 3d 3d  pPage->apOvfl)==
35ca0 41 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d  ArraySize(pPage-
35cb0 3e 61 69 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73  >aiOvfl) );.  as
35cc0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
35cd0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
35ce0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
35cf0 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 73 68 6f   /* The cell sho
35d00 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 20  uld normally be 
35d10 73 69 7a 65 64 20 63 6f 72 72 65 63 74 6c 79 2e  sized correctly.
35d20 20 20 48 6f 77 65 76 65 72 2c 20 77 68 65 6e 20    However, when 
35d30 6d 6f 76 69 6e 67 20 61 0a 20 20 2a 2a 20 6d 61  moving a.  ** ma
35d40 6c 66 6f 72 6d 65 64 20 63 65 6c 6c 20 66 72 6f  lformed cell fro
35d50 6d 20 61 20 6c 65 61 66 20 70 61 67 65 20 74 6f  m a leaf page to
35d60 20 61 6e 20 69 6e 74 65 72 69 6f 72 20 70 61 67   an interior pag
35d70 65 2c 20 69 66 20 74 68 65 20 63 65 6c 6c 20 73  e, if the cell s
35d80 69 7a 65 0a 20 20 2a 2a 20 77 61 6e 74 65 64 20  ize.  ** wanted 
35d90 74 6f 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20  to be less than 
35da0 34 20 62 75 74 20 67 6f 74 20 72 6f 75 6e 64 65  4 but got rounde
35db0 64 20 75 70 20 74 6f 20 34 20 6f 6e 20 74 68 65  d up to 4 on the
35dc0 20 6c 65 61 66 2c 20 74 68 65 6e 20 73 69 7a 65   leaf, then size
35dd0 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 6c  .  ** might be l
35de0 65 73 73 20 74 68 61 6e 20 38 20 28 6c 65 61 66  ess than 8 (leaf
35df0 2d 73 69 7a 65 20 2b 20 70 6f 69 6e 74 65 72 29  -size + pointer)
35e00 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 69 6f 72   on the interior
35e10 20 6e 6f 64 65 2e 20 20 48 65 6e 63 65 0a 20 20   node.  Hence.  
35e20 2a 2a 20 74 68 65 20 74 65 72 6d 20 61 66 74 65  ** the term afte
35e30 72 20 74 68 65 20 7c 7c 20 69 6e 20 74 68 65 20  r the || in the 
35e40 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
35e50 28 29 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  (). */.  assert(
35e60 20 73 7a 3d 3d 70 50 61 67 65 2d 3e 78 43 65 6c   sz==pPage->xCel
35e70 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 70 43 65  lSize(pPage, pCe
35e80 6c 6c 29 20 7c 7c 20 28 73 7a 3d 3d 38 20 26 26  ll) || (sz==8 &&
35e90 20 69 43 68 69 6c 64 3e 30 29 20 29 3b 0a 20 20   iChild>0) );.  
35ea0 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  if( pPage->nOver
35eb0 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61  flow || sz+2>pPa
35ec0 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20  ge->nFree ){.   
35ed0 20 69 66 28 20 70 54 65 6d 70 20 29 7b 0a 20 20   if( pTemp ){.  
35ee0 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70      memcpy(pTemp
35ef0 2c 20 70 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20 20  , pCell, sz);.  
35f00 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d      pCell = pTem
35f10 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  p;.    }.    if(
35f20 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20   iChild ){.     
35f30 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c   put4byte(pCell,
35f40 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a   iChild);.    }.
35f50 20 20 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e      j = pPage->n
35f60 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20  Overflow++;.    
35f70 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 61 67  /* Comparison ag
35f80 61 69 6e 73 74 20 41 72 72 61 79 53 69 7a 65 2d  ainst ArraySize-
35f90 31 20 73 69 6e 63 65 20 77 65 20 68 6f 6c 64 20  1 since we hold 
35fa0 62 61 63 6b 20 6f 6e 65 20 65 78 74 72 61 20 73  back one extra s
35fb0 6c 6f 74 0a 20 20 20 20 2a 2a 20 61 73 20 61 20  lot.    ** as a 
35fc0 63 6f 6e 74 69 6e 67 65 6e 63 79 2e 20 20 49 6e  contingency.  In
35fd0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6e 65   other words, ne
35fe0 76 65 72 20 6e 65 65 64 20 6d 6f 72 65 20 74 68  ver need more th
35ff0 61 6e 20 33 20 6f 76 65 72 66 6c 6f 77 0a 20 20  an 3 overflow.  
36000 20 20 2a 2a 20 73 6c 6f 74 73 20 62 75 74 20 34    ** slots but 4
36010 20 61 72 65 20 61 6c 6c 6f 63 61 74 65 64 2c 20   are allocated, 
36020 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e  just to be safe.
36030 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
36040 6a 20 3c 20 41 72 72 61 79 53 69 7a 65 28 70 50  j < ArraySize(pP
36050 61 67 65 2d 3e 61 70 4f 76 66 6c 29 2d 31 20 29  age->apOvfl)-1 )
36060 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 70 4f  ;.    pPage->apO
36070 76 66 6c 5b 6a 5d 20 3d 20 70 43 65 6c 6c 3b 0a  vfl[j] = pCell;.
36080 20 20 20 20 70 50 61 67 65 2d 3e 61 69 4f 76 66      pPage->aiOvf
36090 6c 5b 6a 5d 20 3d 20 28 75 31 36 29 69 3b 0a 0a  l[j] = (u16)i;..
360a0 20 20 20 20 2f 2a 20 57 68 65 6e 20 6d 75 6c 74      /* When mult
360b0 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 73 20 6f  iple overflows o
360c0 63 63 75 72 2c 20 74 68 65 79 20 61 72 65 20 61  ccur, they are a
360d0 6c 77 61 79 73 20 73 65 71 75 65 6e 74 69 61 6c  lways sequential
360e0 20 61 6e 64 20 69 6e 0a 20 20 20 20 2a 2a 20 73   and in.    ** s
360f0 6f 72 74 65 64 20 6f 72 64 65 72 2e 20 20 54 68  orted order.  Th
36100 69 73 20 69 6e 76 61 72 69 61 6e 74 73 20 61 72  is invariants ar
36110 69 73 65 20 62 65 63 61 75 73 65 20 6d 75 6c 74  ise because mult
36120 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 73 20 63  iple overflows c
36130 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 6f  an.    ** only o
36140 63 63 75 72 20 77 68 65 6e 20 69 6e 73 65 72 74  ccur when insert
36150 69 6e 67 20 64 69 76 69 64 65 72 20 63 65 6c 6c  ing divider cell
36160 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e  s into the paren
36170 74 20 70 61 67 65 20 64 75 72 69 6e 67 0a 20 20  t page during.  
36180 20 20 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 2c 20    ** balancing, 
36190 61 6e 64 20 74 68 65 20 64 69 76 69 64 65 72 73  and the dividers
361a0 20 61 72 65 20 61 64 6a 61 63 65 6e 74 20 61 6e   are adjacent an
361b0 64 20 73 6f 72 74 65 64 2e 0a 20 20 20 20 2a 2f  d sorted..    */
361c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d  .    assert( j==
361d0 30 20 7c 7c 20 70 50 61 67 65 2d 3e 61 69 4f 76  0 || pPage->aiOv
361e0 66 6c 5b 6a 2d 31 5d 3c 28 75 31 36 29 69 20 29  fl[j-1]<(u16)i )
361f0 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 73 20 69  ; /* Overflows i
36200 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 20 2a  n sorted order *
36210 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d  /.    assert( j=
36220 3d 30 20 7c 7c 20 69 3d 3d 70 50 61 67 65 2d 3e  =0 || i==pPage->
36230 61 69 4f 76 66 6c 5b 6a 2d 31 5d 2b 31 20 29 3b  aiOvfl[j-1]+1 );
36240 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 73 20     /* Overflows 
36250 61 72 65 20 73 65 71 75 65 6e 74 69 61 6c 20 2a  are sequential *
36260 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  /.  }else{.    i
36270 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  nt rc = sqlite3P
36280 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
36290 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
362a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
362b0 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d   ){.      *pRC =
362c0 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72   rc;.      retur
362d0 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  n;.    }.    ass
362e0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
362f0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
36300 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
36310 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65      data = pPage
36320 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 61 73 73  ->aData;.    ass
36330 65 72 74 28 20 26 64 61 74 61 5b 70 50 61 67 65  ert( &data[pPage
36340 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 5d 3d 3d 70  ->cellOffset]==p
36350 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 29  Page->aCellIdx )
36360 3b 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63  ;.    rc = alloc
36370 61 74 65 53 70 61 63 65 28 70 50 61 67 65 2c 20  ateSpace(pPage, 
36380 73 7a 2c 20 26 69 64 78 29 3b 0a 20 20 20 20 69  sz, &idx);.    i
36390 66 28 20 72 63 20 29 7b 20 2a 70 52 43 20 3d 20  f( rc ){ *pRC = 
363a0 72 63 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20  rc; return; }.  
363b0 20 20 2f 2a 20 54 68 65 20 61 6c 6c 6f 63 61 74    /* The allocat
363c0 65 53 70 61 63 65 28 29 20 72 6f 75 74 69 6e 65  eSpace() routine
363d0 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 65 20   guarantees the 
363e0 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 70 65 72  following proper
363f0 74 69 65 73 0a 20 20 20 20 2a 2a 20 69 66 20 69  ties.    ** if i
36400 74 20 72 65 74 75 72 6e 73 20 73 75 63 63 65 73  t returns succes
36410 73 66 75 6c 6c 79 20 2a 2f 0a 20 20 20 20 61 73  sfully */.    as
36420 73 65 72 74 28 20 69 64 78 20 3e 3d 20 30 20 29  sert( idx >= 0 )
36430 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64  ;.    assert( id
36440 78 20 3e 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c  x >= pPage->cell
36450 4f 66 66 73 65 74 2b 32 2a 70 50 61 67 65 2d 3e  Offset+2*pPage->
36460 6e 43 65 6c 6c 2b 32 20 7c 7c 20 43 4f 52 52 55  nCell+2 || CORRU
36470 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 61 73 73  PT_DB );.    ass
36480 65 72 74 28 20 69 64 78 2b 73 7a 20 3c 3d 20 28  ert( idx+sz <= (
36490 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e  int)pPage->pBt->
364a0 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
364b0 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d    pPage->nFree -
364c0 3d 20 28 75 31 36 29 28 32 20 2b 20 73 7a 29 3b  = (u16)(2 + sz);
364d0 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74  .    memcpy(&dat
364e0 61 5b 69 64 78 5d 2c 20 70 43 65 6c 6c 2c 20 73  a[idx], pCell, s
364f0 7a 29 3b 0a 20 20 20 20 69 66 28 20 69 43 68 69  z);.    if( iChi
36500 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34  ld ){.      put4
36510 62 79 74 65 28 26 64 61 74 61 5b 69 64 78 5d 2c  byte(&data[idx],
36520 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a   iChild);.    }.
36530 20 20 20 20 70 49 6e 73 20 3d 20 70 50 61 67 65      pIns = pPage
36540 2d 3e 61 43 65 6c 6c 49 64 78 20 2b 20 69 2a 32  ->aCellIdx + i*2
36550 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 49  ;.    memmove(pI
36560 6e 73 2b 32 2c 20 70 49 6e 73 2c 20 32 2a 28 70  ns+2, pIns, 2*(p
36570 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 69 29  Page->nCell - i)
36580 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
36590 70 49 6e 73 2c 20 69 64 78 29 3b 0a 20 20 20 20  pIns, idx);.    
365a0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a  pPage->nCell++;.
365b0 20 20 20 20 2f 2a 20 69 6e 63 72 65 6d 65 6e 74      /* increment
365c0 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 20   the cell count 
365d0 2a 2f 0a 20 20 20 20 69 66 28 20 28 2b 2b 64 61  */.    if( (++da
365e0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
365f0 73 65 74 2b 34 5d 29 3d 3d 30 20 29 20 64 61 74  set+4])==0 ) dat
36600 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
36610 65 74 2b 33 5d 2b 2b 3b 0a 20 20 20 20 61 73 73  et+3]++;.    ass
36620 65 72 74 28 20 67 65 74 32 62 79 74 65 28 26 64  ert( get2byte(&d
36630 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
36640 66 73 65 74 2b 33 5d 29 3d 3d 70 50 61 67 65 2d  fset+3])==pPage-
36650 3e 6e 43 65 6c 6c 20 29 3b 0a 23 69 66 6e 64 65  >nCell );.#ifnde
36660 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
36670 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
36680 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61 75 74   pPage->pBt->aut
36690 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
366a0 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d 61 79   /* The cell may
366b0 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69 6e 74   contain a point
366c0 65 72 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  er to an overflo
366d0 77 20 70 61 67 65 2e 20 49 66 20 73 6f 2c 20 77  w page. If so, w
366e0 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  rite.      ** th
366f0 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  e entry for the 
36700 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
36710 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  to the pointer m
36720 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ap..      */.   
36730 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c     ptrmapPutOvfl
36740 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
36750 2c 20 70 52 43 29 3b 0a 20 20 20 20 7d 0a 23 65  , pRC);.    }.#e
36760 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ndif.  }.}../*.*
36770 2a 20 41 20 43 65 6c 6c 41 72 72 61 79 20 6f 62  * A CellArray ob
36780 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73 20 61 20  ject contains a 
36790 63 61 63 68 65 20 6f 66 20 70 6f 69 6e 74 65 72  cache of pointer
367a0 73 20 61 6e 64 20 73 69 7a 65 73 20 66 6f 72 20  s and sizes for 
367b0 61 0a 2a 2a 20 63 6f 6e 73 65 63 75 74 69 76 65  a.** consecutive
367c0 20 73 65 71 75 65 6e 63 65 20 6f 66 20 63 65 6c   sequence of cel
367d0 6c 73 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  ls that might be
367e0 20 68 65 6c 64 20 6f 6e 20 6d 75 6c 74 69 70 6c   held on multipl
367f0 65 20 70 61 67 65 73 2e 0a 2a 2f 0a 74 79 70 65  e pages..*/.type
36800 64 65 66 20 73 74 72 75 63 74 20 43 65 6c 6c 41  def struct CellA
36810 72 72 61 79 20 43 65 6c 6c 41 72 72 61 79 3b 0a  rray CellArray;.
36820 73 74 72 75 63 74 20 43 65 6c 6c 41 72 72 61 79  struct CellArray
36830 20 7b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20   {.  int nCell; 
36840 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36850 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
36860 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20  in apCell[] */. 
36870 20 4d 65 6d 50 61 67 65 20 2a 70 52 65 66 3b 20   MemPage *pRef; 
36880 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 66 65           /* Refe
36890 72 65 6e 63 65 20 70 61 67 65 20 2a 2f 0a 20 20  rence page */.  
368a0 75 38 20 2a 2a 61 70 43 65 6c 6c 3b 20 20 20 20  u8 **apCell;    
368b0 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63          /* All c
368c0 65 6c 6c 73 20 62 65 67 69 6e 20 62 61 6c 61 6e  ells begin balan
368d0 63 65 64 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a  ced */.  u16 *sz
368e0 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
368f0 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f   /* Local size o
36900 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61  f all cells in a
36910 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 7d 3b 0a 0a 2f  pCell[] */.};../
36920 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  *.** Make sure t
36930 68 65 20 63 65 6c 6c 20 73 69 7a 65 73 20 61 74  he cell sizes at
36940 20 69 64 78 2c 20 69 64 78 2b 31 2c 20 2e 2e 2e   idx, idx+1, ...
36950 2c 20 69 64 78 2b 4e 2d 31 20 68 61 76 65 20 62  , idx+N-1 have b
36960 65 65 6e 0a 2a 2a 20 63 6f 6d 70 75 74 65 64 2e  een.** computed.
36970 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
36980 70 6f 70 75 6c 61 74 65 43 65 6c 6c 43 61 63 68  populateCellCach
36990 65 28 43 65 6c 6c 41 72 72 61 79 20 2a 70 2c 20  e(CellArray *p, 
369a0 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 4e 29 7b  int idx, int N){
369b0 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d  .  assert( idx>=
369c0 30 20 26 26 20 69 64 78 2b 4e 3c 3d 70 2d 3e 6e  0 && idx+N<=p->n
369d0 43 65 6c 6c 20 29 3b 0a 20 20 77 68 69 6c 65 28  Cell );.  while(
369e0 20 4e 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65   N>0 ){.    asse
369f0 72 74 28 20 70 2d 3e 61 70 43 65 6c 6c 5b 69 64  rt( p->apCell[id
36a00 78 5d 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  x]!=0 );.    if(
36a10 20 70 2d 3e 73 7a 43 65 6c 6c 5b 69 64 78 5d 3d   p->szCell[idx]=
36a20 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73  =0 ){.      p->s
36a30 7a 43 65 6c 6c 5b 69 64 78 5d 20 3d 20 70 2d 3e  zCell[idx] = p->
36a40 70 52 65 66 2d 3e 78 43 65 6c 6c 53 69 7a 65 28  pRef->xCellSize(
36a50 70 2d 3e 70 52 65 66 2c 20 70 2d 3e 61 70 43 65  p->pRef, p->apCe
36a60 6c 6c 5b 69 64 78 5d 29 3b 0a 20 20 20 20 7d 65  ll[idx]);.    }e
36a70 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
36a80 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
36a90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
36aa0 2d 3e 73 7a 43 65 6c 6c 5b 69 64 78 5d 3d 3d 70  ->szCell[idx]==p
36ab0 2d 3e 70 52 65 66 2d 3e 78 43 65 6c 6c 53 69 7a  ->pRef->xCellSiz
36ac0 65 28 70 2d 3e 70 52 65 66 2c 20 70 2d 3e 61 70  e(p->pRef, p->ap
36ad0 43 65 6c 6c 5b 69 64 78 5d 29 20 29 3b 0a 20 20  Cell[idx]) );.  
36ae0 20 20 7d 0a 20 20 20 20 69 64 78 2b 2b 3b 0a 20    }.    idx++;. 
36af0 20 20 20 4e 2d 2d 3b 0a 20 20 7d 0a 7d 0a 0a 2f     N--;.  }.}../
36b00 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
36b10 73 69 7a 65 20 6f 66 20 74 68 65 20 4e 74 68 20  size of the Nth 
36b20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 63  element of the c
36b30 65 6c 6c 20 61 72 72 61 79 0a 2a 2f 0a 73 74 61  ell array.*/.sta
36b40 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
36b50 49 4e 45 20 75 31 36 20 63 6f 6d 70 75 74 65 43  INE u16 computeC
36b60 65 6c 6c 53 69 7a 65 28 43 65 6c 6c 41 72 72 61  ellSize(CellArra
36b70 79 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20  y *p, int N){.  
36b80 61 73 73 65 72 74 28 20 4e 3e 3d 30 20 26 26 20  assert( N>=0 && 
36b90 4e 3c 70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  N<p->nCell );.  
36ba0 61 73 73 65 72 74 28 20 70 2d 3e 73 7a 43 65 6c  assert( p->szCel
36bb0 6c 5b 4e 5d 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e  l[N]==0 );.  p->
36bc0 73 7a 43 65 6c 6c 5b 4e 5d 20 3d 20 70 2d 3e 70  szCell[N] = p->p
36bd0 52 65 66 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70  Ref->xCellSize(p
36be0 2d 3e 70 52 65 66 2c 20 70 2d 3e 61 70 43 65 6c  ->pRef, p->apCel
36bf0 6c 5b 4e 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20  l[N]);.  return 
36c00 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 3b 0a 7d 0a  p->szCell[N];.}.
36c10 73 74 61 74 69 63 20 75 31 36 20 63 61 63 68 65  static u16 cache
36c20 64 43 65 6c 6c 53 69 7a 65 28 43 65 6c 6c 41 72  dCellSize(CellAr
36c30 72 61 79 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a  ray *p, int N){.
36c40 20 20 61 73 73 65 72 74 28 20 4e 3e 3d 30 20 26    assert( N>=0 &
36c50 26 20 4e 3c 70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  & N<p->nCell );.
36c60 20 20 69 66 28 20 70 2d 3e 73 7a 43 65 6c 6c 5b    if( p->szCell[
36c70 4e 5d 20 29 20 72 65 74 75 72 6e 20 70 2d 3e 73  N] ) return p->s
36c80 7a 43 65 6c 6c 5b 4e 5d 3b 0a 20 20 72 65 74 75  zCell[N];.  retu
36c90 72 6e 20 63 6f 6d 70 75 74 65 43 65 6c 6c 53 69  rn computeCellSi
36ca0 7a 65 28 70 2c 20 4e 29 3b 0a 7d 0a 0a 2f 2a 0a  ze(p, N);.}../*.
36cb0 2a 2a 20 41 72 72 61 79 20 61 70 43 65 6c 6c 5b  ** Array apCell[
36cc0 5d 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74  ] contains point
36cd0 65 72 73 20 74 6f 20 6e 43 65 6c 6c 20 62 2d 74  ers to nCell b-t
36ce0 72 65 65 20 70 61 67 65 20 63 65 6c 6c 73 2e 20  ree page cells. 
36cf0 54 68 65 20 0a 2a 2a 20 73 7a 43 65 6c 6c 5b 5d  The .** szCell[]
36d00 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 20   array contains 
36d10 74 68 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65  the size in byte
36d20 73 20 6f 66 20 65 61 63 68 20 63 65 6c 6c 2e 20  s of each cell. 
36d30 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  This function.**
36d40 20 72 65 70 6c 61 63 65 73 20 74 68 65 20 63 75   replaces the cu
36d50 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f  rrent contents o
36d60 66 20 70 61 67 65 20 70 50 67 20 77 69 74 68 20  f page pPg with 
36d70 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
36d80 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 61 72 72 61  the cell.** arra
36d90 79 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 20 6f 66  y..**.** Some of
36da0 20 74 68 65 20 63 65 6c 6c 73 20 69 6e 20 61 70   the cells in ap
36db0 43 65 6c 6c 5b 5d 20 6d 61 79 20 63 75 72 72 65  Cell[] may curre
36dc0 6e 74 6c 79 20 62 65 20 73 74 6f 72 65 64 20 69  ntly be stored i
36dd0 6e 20 70 50 67 2e 20 54 68 69 73 0a 2a 2a 20 66  n pPg. This.** f
36de0 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 61 72  unction works ar
36df0 6f 75 6e 64 20 70 72 6f 62 6c 65 6d 73 20 63 61  ound problems ca
36e00 75 73 65 64 20 62 79 20 74 68 69 73 20 62 79 20  used by this by 
36e10 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 20 6f 66  making a copy of
36e20 20 61 6e 79 20 0a 2a 2a 20 73 75 63 68 20 63 65   any .** such ce
36e30 6c 6c 73 20 62 65 66 6f 72 65 20 6f 76 65 72 77  lls before overw
36e40 72 69 74 69 6e 67 20 74 68 65 20 70 61 67 65 20  riting the page 
36e50 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  data..**.** The 
36e60 4d 65 6d 50 61 67 65 2e 6e 46 72 65 65 20 66 69  MemPage.nFree fi
36e70 65 6c 64 20 69 73 20 69 6e 76 61 6c 69 64 61 74  eld is invalidat
36e80 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
36e90 69 6f 6e 2e 20 49 74 20 69 73 20 74 68 65 20 0a  ion. It is the .
36ea0 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  ** responsibilit
36eb0 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
36ec0 74 6f 20 73 65 74 20 69 74 20 63 6f 72 72 65 63  to set it correc
36ed0 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tly..*/.static i
36ee0 6e 74 20 72 65 62 75 69 6c 64 50 61 67 65 28 0a  nt rebuildPage(.
36ef0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20    MemPage *pPg, 
36f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36f10 20 20 2f 2a 20 45 64 69 74 20 74 68 69 73 20 70    /* Edit this p
36f20 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  age */.  int nCe
36f30 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
36f40 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 61           /* Fina
36f50 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  l number of cell
36f60 73 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20 75  s on page */.  u
36f70 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20  8 **apCell,     
36f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36f90 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 73  * Array of cells
36fa0 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c   */.  u16 *szCel
36fb0 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l               
36fc0 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
36fd0 66 20 63 65 6c 6c 20 73 69 7a 65 73 20 2a 2f 0a  f cell sizes */.
36fe0 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68  ){.  const int h
36ff0 64 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f 66 66  dr = pPg->hdrOff
37000 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  set;          /*
37010 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65   Offset of heade
37020 72 20 6f 6e 20 70 50 67 20 2a 2f 0a 20 20 75 38  r on pPg */.  u8
37030 20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61 20 3d   * const aData =
37040 20 70 50 67 2d 3e 61 44 61 74 61 3b 20 20 20 20   pPg->aData;    
37050 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
37060 72 20 74 6f 20 64 61 74 61 20 66 6f 72 20 70 50  r to data for pP
37070 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74  g */.  const int
37080 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50   usableSize = pP
37090 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  g->pBt->usableSi
370a0 7a 65 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74  ze;.  u8 * const
370b0 20 70 45 6e 64 20 3d 20 26 61 44 61 74 61 5b 75   pEnd = &aData[u
370c0 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 69 6e  sableSize];.  in
370d0 74 20 69 3b 0a 20 20 75 38 20 2a 70 43 65 6c 6c  t i;.  u8 *pCell
370e0 70 74 72 20 3d 20 70 50 67 2d 3e 61 43 65 6c 6c  ptr = pPg->aCell
370f0 49 64 78 3b 0a 20 20 75 38 20 2a 70 54 6d 70 20  Idx;.  u8 *pTmp 
37100 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 65  = sqlite3PagerTe
37110 6d 70 53 70 61 63 65 28 70 50 67 2d 3e 70 42 74  mpSpace(pPg->pBt
37120 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 75 38 20  ->pPager);.  u8 
37130 2a 70 44 61 74 61 3b 0a 0a 20 20 69 20 3d 20 67  *pData;..  i = g
37140 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 68  et2byte(&aData[h
37150 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79  dr+5]);.  memcpy
37160 28 26 70 54 6d 70 5b 69 5d 2c 20 26 61 44 61 74  (&pTmp[i], &aDat
37170 61 5b 69 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65  a[i], usableSize
37180 20 2d 20 69 29 3b 0a 0a 20 20 70 44 61 74 61 20   - i);..  pData 
37190 3d 20 70 45 6e 64 3b 0a 20 20 66 6f 72 28 69 3d  = pEnd;.  for(i=
371a0 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
371b0 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20  {.    u8 *pCell 
371c0 3d 20 61 70 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20  = apCell[i];.   
371d0 20 69 66 28 20 53 51 4c 49 54 45 5f 57 49 54 48   if( SQLITE_WITH
371e0 49 4e 28 70 43 65 6c 6c 2c 61 44 61 74 61 2c 70  IN(pCell,aData,p
371f0 45 6e 64 29 20 29 7b 0a 20 20 20 20 20 20 70 43  End) ){.      pC
37200 65 6c 6c 20 3d 20 26 70 54 6d 70 5b 70 43 65 6c  ell = &pTmp[pCel
37210 6c 20 2d 20 61 44 61 74 61 5d 3b 0a 20 20 20 20  l - aData];.    
37220 7d 0a 20 20 20 20 70 44 61 74 61 20 2d 3d 20 73  }.    pData -= s
37230 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 70 75  zCell[i];.    pu
37240 74 32 62 79 74 65 28 70 43 65 6c 6c 70 74 72 2c  t2byte(pCellptr,
37250 20 28 70 44 61 74 61 20 2d 20 61 44 61 74 61 29   (pData - aData)
37260 29 3b 0a 20 20 20 20 70 43 65 6c 6c 70 74 72 20  );.    pCellptr 
37270 2b 3d 20 32 3b 0a 20 20 20 20 69 66 28 20 70 44  += 2;.    if( pD
37280 61 74 61 20 3c 20 70 43 65 6c 6c 70 74 72 20 29  ata < pCellptr )
37290 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
372a0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
372b0 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20 70   memcpy(pData, p
372c0 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 5b 69 5d 29  Cell, szCell[i])
372d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 7a  ;.    assert( sz
372e0 43 65 6c 6c 5b 69 5d 3d 3d 70 50 67 2d 3e 78 43  Cell[i]==pPg->xC
372f0 65 6c 6c 53 69 7a 65 28 70 50 67 2c 20 70 43 65  ellSize(pPg, pCe
37300 6c 6c 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  ll) || CORRUPT_D
37310 42 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  B );.    testcas
37320 65 28 20 73 7a 43 65 6c 6c 5b 69 5d 21 3d 70 50  e( szCell[i]!=pP
37330 67 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 67  g->xCellSize(pPg
37340 2c 70 43 65 6c 6c 29 20 29 3b 0a 20 20 7d 0a 0a  ,pCell) );.  }..
37350 20 20 2f 2a 20 54 68 65 20 70 50 67 2d 3e 6e 46    /* The pPg->nF
37360 72 65 65 20 66 69 65 6c 64 20 69 73 20 6e 6f 77  ree field is now
37370 20 73 65 74 20 69 6e 63 6f 72 72 65 63 74 6c 79   set incorrectly
37380 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  . The caller wil
37390 6c 20 66 69 78 20 69 74 2e 20 2a 2f 0a 20 20 70  l fix it. */.  p
373a0 50 67 2d 3e 6e 43 65 6c 6c 20 3d 20 6e 43 65 6c  Pg->nCell = nCel
373b0 6c 3b 0a 20 20 70 50 67 2d 3e 6e 4f 76 65 72 66  l;.  pPg->nOverf
373c0 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 70 75 74 32  low = 0;..  put2
373d0 62 79 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b  byte(&aData[hdr+
373e0 31 5d 2c 20 30 29 3b 0a 20 20 70 75 74 32 62 79  1], 0);.  put2by
373f0 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b 33 5d  te(&aData[hdr+3]
37400 2c 20 70 50 67 2d 3e 6e 43 65 6c 6c 29 3b 0a 20  , pPg->nCell);. 
37410 20 70 75 74 32 62 79 74 65 28 26 61 44 61 74 61   put2byte(&aData
37420 5b 68 64 72 2b 35 5d 2c 20 70 44 61 74 61 20 2d  [hdr+5], pData -
37430 20 61 44 61 74 61 29 3b 0a 20 20 61 44 61 74 61   aData);.  aData
37440 5b 68 64 72 2b 37 5d 20 3d 20 30 78 30 30 3b 0a  [hdr+7] = 0x00;.
37450 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
37460 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72  OK;.}../*.** Arr
37470 61 79 20 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74  ay apCell[] cont
37480 61 69 6e 73 20 6e 43 65 6c 6c 20 70 6f 69 6e 74  ains nCell point
37490 65 72 73 20 74 6f 20 62 2d 74 72 65 65 20 63 65  ers to b-tree ce
374a0 6c 6c 73 2e 20 41 72 72 61 79 20 73 7a 43 65 6c  lls. Array szCel
374b0 6c 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68  l.** contains th
374c0 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20  e size in bytes 
374d0 6f 66 20 65 61 63 68 20 73 75 63 68 20 63 65 6c  of each such cel
374e0 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  l. This function
374f0 20 61 74 74 65 6d 70 74 73 20 74 6f 20 0a 2a 2a   attempts to .**
37500 20 61 64 64 20 74 68 65 20 63 65 6c 6c 73 20 73   add the cells s
37510 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61 72 72  tored in the arr
37520 61 79 20 74 6f 20 70 61 67 65 20 70 50 67 2e 20  ay to page pPg. 
37530 49 66 20 69 74 20 63 61 6e 6e 6f 74 20 28 62 65  If it cannot (be
37540 63 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61  cause .** the pa
37550 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 64  ge needs to be d
37560 65 66 72 61 67 6d 65 6e 74 65 64 20 62 65 66 6f  efragmented befo
37570 72 65 20 74 68 65 20 63 65 6c 6c 73 20 77 69 6c  re the cells wil
37580 6c 20 66 69 74 29 2c 20 6e 6f 6e 2d 7a 65 72 6f  l fit), non-zero
37590 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e  .** is returned.
375a0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
375b0 68 65 20 63 65 6c 6c 73 20 61 72 65 20 61 64 64  he cells are add
375c0 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ed successfully,
375d0 20 7a 65 72 6f 20 69 73 0a 2a 2a 20 72 65 74 75   zero is.** retu
375e0 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75  rned..**.** Argu
375f0 6d 65 6e 74 20 70 43 65 6c 6c 70 74 72 20 70 6f  ment pCellptr po
37600 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73  ints to the firs
37610 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 63  t entry in the c
37620 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72 61  ell-pointer arra
37630 79 0a 2a 2a 20 28 70 61 72 74 20 6f 66 20 70 61  y.** (part of pa
37640 67 65 20 70 50 67 29 20 74 6f 20 70 6f 70 75 6c  ge pPg) to popul
37650 61 74 65 2e 20 41 66 74 65 72 20 63 65 6c 6c 20  ate. After cell 
37660 61 70 43 65 6c 6c 5b 30 5d 20 69 73 20 77 72 69  apCell[0] is wri
37670 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 70  tten to the.** p
37680 61 67 65 20 62 6f 64 79 2c 20 61 20 31 36 2d 62  age body, a 16-b
37690 69 74 20 6f 66 66 73 65 74 20 69 73 20 77 72 69  it offset is wri
376a0 74 74 65 6e 20 74 6f 20 70 43 65 6c 6c 70 74 72  tten to pCellptr
376b0 2e 20 41 6e 64 20 73 6f 20 6f 6e 2c 20 66 6f 72  . And so on, for
376c0 20 65 61 63 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e   each.** cell in
376d0 20 74 68 65 20 61 72 72 61 79 2e 20 49 74 20 69   the array. It i
376e0 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
376f0 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
37700 65 72 20 74 6f 20 65 6e 73 75 72 65 0a 2a 2a 20  er to ensure.** 
37710 74 68 61 74 20 69 74 20 69 73 20 73 61 66 65 20  that it is safe 
37720 74 6f 20 6f 76 65 72 77 72 69 74 65 20 74 68 69  to overwrite thi
37730 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 63 65  s part of the ce
37740 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll-pointer array
37750 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
37760 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
37770 6c 6c 65 64 2c 20 2a 70 70 44 61 74 61 20 70 6f  lled, *ppData po
37780 69 6e 74 73 20 74 6f 20 74 68 65 20 73 74 61 72  ints to the star
37790 74 20 6f 66 20 74 68 65 20 0a 2a 2a 20 63 6f 6e  t of the .** con
377a0 74 65 6e 74 20 61 72 65 61 20 6f 6e 20 70 61 67  tent area on pag
377b0 65 20 70 50 67 2e 20 49 66 20 74 68 65 20 73 69  e pPg. If the si
377c0 7a 65 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e  ze of the conten
377d0 74 20 61 72 65 61 20 69 73 20 65 78 74 65 6e 64  t area is extend
377e0 65 64 2c 0a 2a 2a 20 2a 70 70 44 61 74 61 20 69  ed,.** *ppData i
377f0 73 20 75 70 64 61 74 65 64 20 74 6f 20 70 6f 69  s updated to poi
37800 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 73 74  nt to the new st
37810 61 72 74 20 6f 66 20 74 68 65 20 63 6f 6e 74 65  art of the conte
37820 6e 74 20 61 72 65 61 0a 2a 2a 20 62 65 66 6f 72  nt area.** befor
37830 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
37840 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 61 72 67 75  ** Finally, argu
37850 6d 65 6e 74 20 70 42 65 67 69 6e 20 70 6f 69 6e  ment pBegin poin
37860 74 73 20 74 6f 20 74 68 65 20 62 79 74 65 20 69  ts to the byte i
37870 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
37880 77 69 6e 67 20 74 68 65 0a 2a 2a 20 65 6e 64 20  wing the.** end 
37890 6f 66 20 74 68 65 20 73 70 61 63 65 20 72 65 71  of the space req
378a0 75 69 72 65 64 20 62 79 20 74 68 69 73 20 70 61  uired by this pa
378b0 67 65 20 66 6f 72 20 74 68 65 20 63 65 6c 6c 2d  ge for the cell-
378c0 70 6f 69 6e 74 65 72 20 61 72 65 61 20 28 66 6f  pointer area (fo
378d0 72 0a 2a 2a 20 61 6c 6c 20 63 65 6c 6c 73 20 2d  r.** all cells -
378e0 20 6e 6f 74 20 6a 75 73 74 20 74 68 6f 73 65 20   not just those 
378f0 69 6e 73 65 72 74 65 64 20 62 79 20 74 68 65 20  inserted by the 
37900 63 75 72 72 65 6e 74 20 63 61 6c 6c 29 2e 20 49  current call). I
37910 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a  f the content.**
37920 20 61 72 65 61 20 6d 75 73 74 20 62 65 20 65 78   area must be ex
37930 74 65 6e 64 65 64 20 74 6f 20 62 65 66 6f 72 65  tended to before
37940 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f   this point in o
37950 72 64 65 72 20 74 6f 20 61 63 63 6f 6d 6f 64 61  rder to accomoda
37960 74 65 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c 73 20  te all.** cells 
37970 69 6e 20 61 70 43 65 6c 6c 5b 5d 2c 20 74 68 65  in apCell[], the
37980 6e 20 74 68 65 20 63 65 6c 6c 73 20 64 6f 20 6e  n the cells do n
37990 6f 74 20 66 69 74 20 61 6e 64 20 6e 6f 6e 2d 7a  ot fit and non-z
379a0 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ero is returned.
379b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
379c0 61 67 65 49 6e 73 65 72 74 41 72 72 61 79 28 0a  ageInsertArray(.
379d0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20    MemPage *pPg, 
379e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
379f0 20 20 2f 2a 20 50 61 67 65 20 74 6f 20 61 64 64    /* Page to add
37a00 20 63 65 6c 6c 73 20 74 6f 20 2a 2f 0a 20 20 75   cells to */.  u
37a10 38 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 20  8 *pBegin,      
37a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
37a30 2a 20 45 6e 64 20 6f 66 20 63 65 6c 6c 2d 70 6f  * End of cell-po
37a40 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20  inter array */. 
37a50 20 75 38 20 2a 2a 70 70 44 61 74 61 2c 20 20 20   u8 **ppData,   
37a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37a70 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 61 67 65   /* IN/OUT: Page
37a80 20 63 6f 6e 74 65 6e 74 20 2d 61 72 65 61 20 70   content -area p
37a90 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a  ointer */.  u8 *
37aa0 70 43 65 6c 6c 70 74 72 2c 20 20 20 20 20 20 20  pCellptr,       
37ab0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
37ac0 6f 69 6e 74 65 72 20 74 6f 20 63 65 6c 6c 2d 70  ointer to cell-p
37ad0 6f 69 6e 74 65 72 20 61 72 65 61 20 2a 2f 0a 20  ointer area */. 
37ae0 20 69 6e 74 20 69 46 69 72 73 74 2c 20 20 20 20   int iFirst,    
37af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37b00 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72   /* Index of fir
37b10 73 74 20 63 65 6c 6c 20 74 6f 20 61 64 64 20 2a  st cell to add *
37b20 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20  /.  int nCell,  
37b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37b40 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
37b50 20 63 65 6c 6c 73 20 74 6f 20 61 64 64 20 74 6f   cells to add to
37b60 20 70 50 67 20 2a 2f 0a 20 20 43 65 6c 6c 41 72   pPg */.  CellAr
37b70 72 61 79 20 2a 70 43 41 72 72 61 79 20 20 20 20  ray *pCArray    
37b80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
37b90 61 79 20 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a 29  ay of cells */.)
37ba0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 38 20  {.  int i;.  u8 
37bb0 2a 61 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44  *aData = pPg->aD
37bc0 61 74 61 3b 0a 20 20 75 38 20 2a 70 44 61 74 61  ata;.  u8 *pData
37bd0 20 3d 20 2a 70 70 44 61 74 61 3b 0a 20 20 69 6e   = *ppData;.  in
37be0 74 20 69 45 6e 64 20 3d 20 69 46 69 72 73 74 20  t iEnd = iFirst 
37bf0 2b 20 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  + nCell;.  asser
37c00 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
37c10 20 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3d   pPg->hdrOffset=
37c20 3d 30 20 29 3b 20 20 20 20 2f 2a 20 4e 65 76 65  =0 );    /* Neve
37c30 72 20 63 61 6c 6c 65 64 20 6f 6e 20 70 61 67 65  r called on page
37c40 20 31 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 69 46   1 */.  for(i=iF
37c50 69 72 73 74 3b 20 69 3c 69 45 6e 64 3b 20 69 2b  irst; i<iEnd; i+
37c60 2b 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 2c 20  +){.    int sz, 
37c70 72 63 3b 0a 20 20 20 20 75 38 20 2a 70 53 6c 6f  rc;.    u8 *pSlo
37c80 74 3b 0a 20 20 20 20 73 7a 20 3d 20 63 61 63 68  t;.    sz = cach
37c90 65 64 43 65 6c 6c 53 69 7a 65 28 70 43 41 72 72  edCellSize(pCArr
37ca0 61 79 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20  ay, i);.    if( 
37cb0 28 61 44 61 74 61 5b 31 5d 3d 3d 30 20 26 26 20  (aData[1]==0 && 
37cc0 61 44 61 74 61 5b 32 5d 3d 3d 30 29 20 7c 7c 20  aData[2]==0) || 
37cd0 28 70 53 6c 6f 74 20 3d 20 70 61 67 65 46 69 6e  (pSlot = pageFin
37ce0 64 53 6c 6f 74 28 70 50 67 2c 73 7a 2c 26 72 63  dSlot(pPg,sz,&rc
37cf0 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ))==0 ){.      i
37d00 66 28 20 28 70 44 61 74 61 20 2d 20 70 42 65 67  f( (pData - pBeg
37d10 69 6e 29 3c 73 7a 20 29 20 72 65 74 75 72 6e 20  in)<sz ) return 
37d20 31 3b 0a 20 20 20 20 20 20 70 44 61 74 61 20 2d  1;.      pData -
37d30 3d 20 73 7a 3b 0a 20 20 20 20 20 20 70 53 6c 6f  = sz;.      pSlo
37d40 74 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 7d  t = pData;.    }
37d50 0a 20 20 20 20 2f 2a 20 70 53 6c 6f 74 20 61 6e  .    /* pSlot an
37d60 64 20 70 43 41 72 72 61 79 2d 3e 61 70 43 65 6c  d pCArray->apCel
37d70 6c 5b 69 5d 20 77 69 6c 6c 20 6e 65 76 65 72 20  l[i] will never 
37d80 6f 76 65 72 6c 61 70 20 6f 6e 20 61 20 77 65 6c  overlap on a wel
37d90 6c 2d 66 6f 72 6d 65 64 0a 20 20 20 20 2a 2a 20  l-formed.    ** 
37da0 64 61 74 61 62 61 73 65 2e 20 20 42 75 74 20 74  database.  But t
37db0 68 65 79 20 6d 69 67 68 74 20 66 6f 72 20 61 20  hey might for a 
37dc0 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
37dd0 2e 20 20 48 65 6e 63 65 20 75 73 65 20 6d 65 6d  .  Hence use mem
37de0 6d 6f 76 65 28 29 0a 20 20 20 20 2a 2a 20 73 69  move().    ** si
37df0 6e 63 65 20 6d 65 6d 63 70 79 28 29 20 73 65 6e  nce memcpy() sen
37e00 64 73 20 53 49 47 41 42 4f 52 54 20 77 69 74 68  ds SIGABORT with
37e10 20 6f 76 65 72 6c 61 70 70 69 6e 67 20 62 75 66   overlapping buf
37e20 66 65 72 73 20 6f 6e 20 4f 70 65 6e 42 53 44 20  fers on OpenBSD 
37e30 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
37e40 70 53 6c 6f 74 2b 73 7a 29 3c 3d 70 43 41 72 72  pSlot+sz)<=pCArr
37e50 61 79 2d 3e 61 70 43 65 6c 6c 5b 69 5d 0a 20 20  ay->apCell[i].  
37e60 20 20 20 20 20 20 20 7c 7c 20 70 53 6c 6f 74 3e         || pSlot>
37e70 3d 28 70 43 41 72 72 61 79 2d 3e 61 70 43 65 6c  =(pCArray->apCel
37e80 6c 5b 69 5d 2b 73 7a 29 0a 20 20 20 20 20 20 20  l[i]+sz).       
37e90 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20    || CORRUPT_DB 
37ea0 29 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70  );.    memmove(p
37eb0 53 6c 6f 74 2c 20 70 43 41 72 72 61 79 2d 3e 61  Slot, pCArray->a
37ec0 70 43 65 6c 6c 5b 69 5d 2c 20 73 7a 29 3b 0a 20  pCell[i], sz);. 
37ed0 20 20 20 70 75 74 32 62 79 74 65 28 70 43 65 6c     put2byte(pCel
37ee0 6c 70 74 72 2c 20 28 70 53 6c 6f 74 20 2d 20 61  lptr, (pSlot - a
37ef0 44 61 74 61 29 29 3b 0a 20 20 20 20 70 43 65 6c  Data));.    pCel
37f00 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20  lptr += 2;.  }. 
37f10 20 2a 70 70 44 61 74 61 20 3d 20 70 44 61 74 61   *ppData = pData
37f20 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
37f30 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79 20 61 70 43  ./*.** Array apC
37f40 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 6e  ell[] contains n
37f50 43 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f  Cell pointers to
37f60 20 62 2d 74 72 65 65 20 63 65 6c 6c 73 2e 20 41   b-tree cells. A
37f70 72 72 61 79 20 73 7a 43 65 6c 6c 20 0a 2a 2a 20  rray szCell .** 
37f80 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a  contains the siz
37f90 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 65 61  e in bytes of ea
37fa0 63 68 20 73 75 63 68 20 63 65 6c 6c 2e 20 54 68  ch such cell. Th
37fb0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 64 64 73  is function adds
37fc0 20 74 68 65 0a 2a 2a 20 73 70 61 63 65 20 61 73   the.** space as
37fd0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 61  sociated with ea
37fe0 63 68 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 61  ch cell in the a
37ff0 72 72 61 79 20 74 68 61 74 20 69 73 20 63 75 72  rray that is cur
38000 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 0a 2a  rently stored .*
38010 2a 20 77 69 74 68 69 6e 20 74 68 65 20 62 6f 64  * within the bod
38020 79 20 6f 66 20 70 50 67 20 74 6f 20 74 68 65 20  y of pPg to the 
38030 70 50 67 20 66 72 65 65 2d 6c 69 73 74 2e 20 54  pPg free-list. T
38040 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 73  he cell-pointers
38050 20 61 6e 64 20 6f 74 68 65 72 0a 2a 2a 20 66 69   and other.** fi
38060 65 6c 64 73 20 6f 66 20 74 68 65 20 70 61 67 65  elds of the page
38070 20 61 72 65 20 6e 6f 74 20 75 70 64 61 74 65 64   are not updated
38080 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
38090 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
380a0 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
380b0 66 20 63 65 6c 6c 73 20 61 64 64 65 64 20 74 6f  f cells added to
380c0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a   the free-list..
380d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
380e0 67 65 46 72 65 65 41 72 72 61 79 28 0a 20 20 4d  geFreeArray(.  M
380f0 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 20 20 20  emPage *pPg,    
38100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
38110 2a 20 50 61 67 65 20 74 6f 20 65 64 69 74 20 2a  * Page to edit *
38120 2f 0a 20 20 69 6e 74 20 69 46 69 72 73 74 2c 20  /.  int iFirst, 
38130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38140 20 20 20 20 2f 2a 20 46 69 72 73 74 20 63 65 6c      /* First cel
38150 6c 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20  l to delete */. 
38160 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20   int nCell,     
38170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38180 20 2f 2a 20 43 65 6c 6c 73 20 74 6f 20 64 65 6c   /* Cells to del
38190 65 74 65 20 2a 2f 0a 20 20 43 65 6c 6c 41 72 72  ete */.  CellArr
381a0 61 79 20 2a 70 43 41 72 72 61 79 20 20 20 20 20  ay *pCArray     
381b0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
381c0 79 20 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b  y of cells */.){
381d0 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44  .  u8 * const aD
381e0 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61  ata = pPg->aData
381f0 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70  ;.  u8 * const p
38200 45 6e 64 20 3d 20 26 61 44 61 74 61 5b 70 50 67  End = &aData[pPg
38210 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
38220 65 5d 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74  e];.  u8 * const
38230 20 70 53 74 61 72 74 20 3d 20 26 61 44 61 74 61   pStart = &aData
38240 5b 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 20  [pPg->hdrOffset 
38250 2b 20 38 20 2b 20 70 50 67 2d 3e 63 68 69 6c 64  + 8 + pPg->child
38260 50 74 72 53 69 7a 65 5d 3b 0a 20 20 69 6e 74 20  PtrSize];.  int 
38270 6e 52 65 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nRet = 0;.  int 
38280 69 3b 0a 20 20 69 6e 74 20 69 45 6e 64 20 3d 20  i;.  int iEnd = 
38290 69 46 69 72 73 74 20 2b 20 6e 43 65 6c 6c 3b 0a  iFirst + nCell;.
382a0 20 20 75 38 20 2a 70 46 72 65 65 20 3d 20 30 3b    u8 *pFree = 0;
382b0 0a 20 20 69 6e 74 20 73 7a 46 72 65 65 20 3d 20  .  int szFree = 
382c0 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 69 46 69 72  0;..  for(i=iFir
382d0 73 74 3b 20 69 3c 69 45 6e 64 3b 20 69 2b 2b 29  st; i<iEnd; i++)
382e0 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20  {.    u8 *pCell 
382f0 3d 20 70 43 41 72 72 61 79 2d 3e 61 70 43 65 6c  = pCArray->apCel
38300 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 53 51  l[i];.    if( SQ
38310 4c 49 54 45 5f 57 49 54 48 49 4e 28 70 43 65 6c  LITE_WITHIN(pCel
38320 6c 2c 20 70 53 74 61 72 74 2c 20 70 45 6e 64 29  l, pStart, pEnd)
38330 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a   ){.      int sz
38340 3b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6e 65  ;.      /* No ne
38350 65 64 20 74 6f 20 75 73 65 20 63 61 63 68 65 64  ed to use cached
38360 43 65 6c 6c 53 69 7a 65 28 29 20 68 65 72 65 2e  CellSize() here.
38370 20 20 54 68 65 20 73 69 7a 65 73 20 6f 66 20 61    The sizes of a
38380 6c 6c 20 63 65 6c 6c 73 20 74 68 61 74 0a 20 20  ll cells that.  
38390 20 20 20 20 2a 2a 20 61 72 65 20 74 6f 20 62 65      ** are to be
383a0 20 66 72 65 65 64 20 68 61 76 65 20 61 6c 72 65   freed have alre
383b0 61 64 79 20 62 65 65 6e 20 63 6f 6d 70 75 74 69  ady been computi
383c0 6e 67 20 77 68 69 6c 65 20 64 65 63 69 64 69 6e  ng while decidin
383d0 67 20 77 68 69 63 68 0a 20 20 20 20 20 20 2a 2a  g which.      **
383e0 20 63 65 6c 6c 73 20 6e 65 65 64 20 66 72 65 65   cells need free
383f0 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 73 7a 20  ing */.      sz 
38400 3d 20 70 43 41 72 72 61 79 2d 3e 73 7a 43 65 6c  = pCArray->szCel
38410 6c 5b 69 5d 3b 20 20 61 73 73 65 72 74 28 20 73  l[i];  assert( s
38420 7a 3e 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  z>0 );.      if(
38430 20 70 46 72 65 65 21 3d 28 70 43 65 6c 6c 20 2b   pFree!=(pCell +
38440 20 73 7a 29 20 29 7b 0a 20 20 20 20 20 20 20 20   sz) ){.        
38450 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20  if( pFree ){.   
38460 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
38470 46 72 65