/ Hex Artifact Content
Login

Artifact f55ea8f456d103328d61076be40fa39acbfea05eaa4eccfed275532a63c867c4:


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 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  it)).  ){.    re
1520: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 1;.  }..  /
1530: 2a 20 49 66 20 74 68 65 20 63 6c 69 65 6e 74 20  * If the client 
1540: 69 73 20 72 65 61 64 69 6e 67 20 20 6f 72 20 77  is reading  or w
1550: 72 69 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 20  riting an index 
1560: 61 6e 64 20 74 68 65 20 73 63 68 65 6d 61 20 69  and the schema i
1570: 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f 61 64 65  s.  ** not loade
1580: 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 6f  d, then it is to
1590: 6f 20 64 69 66 66 69 63 75 6c 74 20 74 6f 20 61  o difficult to a
15a0: 63 74 75 61 6c 6c 79 20 63 68 65 63 6b 20 74 6f  ctually check to
15b0: 20 73 65 65 20 69 66 0a 20 20 2a 2a 20 74 68 65   see if.  ** the
15c0: 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 73 20 61   correct locks a
15d0: 72 65 20 68 65 6c 64 2e 20 20 53 6f 20 64 6f 20  re held.  So do 
15e0: 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20 6a 75 73  not bother - jus
15f0: 74 20 72 65 74 75 72 6e 20 74 72 75 65 2e 0a 20  t return true.. 
1600: 20 2a 2a 20 54 68 69 73 20 63 61 73 65 20 64 6f   ** This case do
1610: 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75 70 20 76  es not come up v
1620: 65 72 79 20 6f 66 74 65 6e 20 61 6e 79 68 6f 77  ery often anyhow
1630: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 49  ..  */.  if( isI
1640: 6e 64 65 78 20 26 26 20 28 21 70 53 63 68 65 6d  ndex && (!pSchem
1650: 61 20 7c 7c 20 28 70 53 63 68 65 6d 61 2d 3e 73  a || (pSchema->s
1660: 63 68 65 6d 61 46 6c 61 67 73 26 44 42 5f 53 63  chemaFlags&DB_Sc
1670: 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d 30 29 20  hemaLoaded)==0) 
1680: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
1690: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72  .  }..  /* Figur
16a0: 65 20 6f 75 74 20 74 68 65 20 72 6f 6f 74 2d 70  e out the root-p
16b0: 61 67 65 20 74 68 61 74 20 74 68 65 20 6c 6f 63  age that the loc
16c0: 6b 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64  k should be held
16d0: 20 6f 6e 2e 20 46 6f 72 20 74 61 62 6c 65 0a 20   on. For table. 
16e0: 20 2a 2a 20 62 2d 74 72 65 65 73 2c 20 74 68 69   ** b-trees, thi
16f0: 73 20 69 73 20 6a 75 73 74 20 74 68 65 20 72 6f  s is just the ro
1700: 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 62  ot page of the b
1710: 2d 74 72 65 65 20 62 65 69 6e 67 20 72 65 61 64  -tree being read
1720: 20 6f 72 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e   or.  ** written
1730: 2e 20 46 6f 72 20 69 6e 64 65 78 20 62 2d 74 72  . For index b-tr
1740: 65 65 73 2c 20 69 74 20 69 73 20 74 68 65 20 72  ees, it is the r
1750: 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
1760: 61 73 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20  associated.  ** 
1770: 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28  table.  */.  if(
1780: 20 69 73 49 6e 64 65 78 20 29 7b 0a 20 20 20 20   isIndex ){.    
1790: 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 20  HashElem *p;.   
17a0: 20 66 6f 72 28 70 3d 73 71 6c 69 74 65 48 61 73   for(p=sqliteHas
17b0: 68 46 69 72 73 74 28 26 70 53 63 68 65 6d 61 2d  hFirst(&pSchema-
17c0: 3e 69 64 78 48 61 73 68 29 3b 20 70 3b 20 70 3d  >idxHash); p; p=
17d0: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
17e0: 29 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20  )){.      Index 
17f0: 2a 70 49 64 78 20 3d 20 28 49 6e 64 65 78 20 2a  *pIdx = (Index *
1800: 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
1810: 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  p);.      if( pI
1820: 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69 6e 74 29 69  dx->tnum==(int)i
1830: 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Root ){.        
1840: 69 66 28 20 69 54 61 62 20 29 7b 0a 20 20 20 20  if( iTab ){.    
1850: 20 20 20 20 20 20 2f 2a 20 54 77 6f 20 6f 72 20        /* Two or 
1860: 6d 6f 72 65 20 69 6e 64 65 78 65 73 20 73 68 61  more indexes sha
1870: 72 65 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74  re the same root
1880: 20 70 61 67 65 2e 20 20 54 68 65 72 65 20 6d 75   page.  There mu
1890: 73 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  st.          ** 
18a0: 62 65 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c  be imposter tabl
18b0: 65 73 2e 20 20 53 6f 20 6a 75 73 74 20 72 65 74  es.  So just ret
18c0: 75 72 6e 20 74 72 75 65 2e 20 20 54 68 65 20 61  urn true.  The a
18d0: 73 73 65 72 74 20 69 73 20 6e 6f 74 0a 20 20 20  ssert is not.   
18e0: 20 20 20 20 20 20 20 2a 2a 20 75 73 65 66 75 6c         ** useful
18f0: 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 20 2a   in that case. *
1900: 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  /.          retu
1910: 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rn 1;.        }.
1920: 20 20 20 20 20 20 20 20 69 54 61 62 20 3d 20 70          iTab = p
1930: 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 74 6e 75  Idx->pTable->tnu
1940: 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  m;.      }.    }
1950: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 54  .  }else{.    iT
1960: 61 62 20 3d 20 69 52 6f 6f 74 3b 0a 20 20 7d 0a  ab = iRoot;.  }.
1970: 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72  .  /* Search for
1980: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f   the required lo
1990: 63 6b 2e 20 45 69 74 68 65 72 20 61 20 77 72 69  ck. Either a wri
19a0: 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72 6f 6f 74 2d  te-lock on root-
19b0: 70 61 67 65 20 69 54 61 62 2c 20 61 20 0a 20 20  page iTab, a .  
19c0: 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e  ** write-lock on
19d0: 20 74 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c   the schema tabl
19e0: 65 2c 20 6f 72 20 28 69 66 20 74 68 65 20 63 6c  e, or (if the cl
19f0: 69 65 6e 74 20 69 73 20 72 65 61 64 69 6e 67 29  ient is reading)
1a00: 20 61 0a 20 20 2a 2a 20 72 65 61 64 2d 6c 6f 63   a.  ** read-loc
1a10: 6b 20 6f 6e 20 69 54 61 62 20 77 69 6c 6c 20 73  k on iTab will s
1a20: 75 66 66 69 63 65 2e 20 52 65 74 75 72 6e 20 31  uffice. Return 1
1a30: 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 73 65   if any of these
1a40: 20 61 72 65 20 66 6f 75 6e 64 2e 20 20 2a 2f 0a   are found.  */.
1a50: 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42 74 72    for(pLock=pBtr
1a60: 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ee->pBt->pLock; 
1a70: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f  pLock; pLock=pLo
1a80: 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ck->pNext){.    
1a90: 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65  if( pLock->pBtre
1aa0: 65 3d 3d 70 42 74 72 65 65 20 0a 20 20 20 20 20  e==pBtree .     
1ab0: 26 26 20 28 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c  && (pLock->iTabl
1ac0: 65 3d 3d 69 54 61 62 20 7c 7c 20 28 70 4c 6f 63  e==iTab || (pLoc
1ad0: 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f  k->eLock==WRITE_
1ae0: 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b 2d 3e 69  LOCK && pLock->i
1af0: 54 61 62 6c 65 3d 3d 31 29 29 0a 20 20 20 20 20  Table==1)).     
1b00: 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3e  && pLock->eLock>
1b10: 3d 65 4c 6f 63 6b 54 79 70 65 20 0a 20 20 20 20  =eLockType .    
1b20: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1b30: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
1b40: 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20 66 69 6e  /* Failed to fin
1b50: 64 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6c  d the required l
1b60: 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e  ock. */.  return
1b70: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   0;.}.#endif /* 
1b80: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a  SQLITE_DEBUG */.
1b90: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1ba0: 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69  EBUG./*.**** Thi
1bb0: 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62  s function may b
1bc0: 65 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  e used as part o
1bd0: 66 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  f assert() state
1be0: 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20 2a 2a 2a 2a  ments only. ****
1bf0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  .**.** Return tr
1c00: 75 65 20 69 66 20 69 74 20 77 6f 75 6c 64 20 62  ue if it would b
1c10: 65 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42  e illegal for pB
1c20: 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 6e  tree to write in
1c30: 74 6f 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20  to the.** table 
1c40: 6f 72 20 69 6e 64 65 78 20 72 6f 6f 74 65 64 20  or index rooted 
1c50: 61 74 20 69 52 6f 6f 74 20 62 65 63 61 75 73 65  at iRoot because
1c60: 20 6f 74 68 65 72 20 73 68 61 72 65 64 20 63 6f   other shared co
1c70: 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 0a 2a 2a  nnections are.**
1c80: 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 20   simultaneously 
1c90: 72 65 61 64 69 6e 67 20 74 68 61 74 20 73 61 6d  reading that sam
1ca0: 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  e table or index
1cb0: 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6c  ..**.** It is il
1cc0: 6c 65 67 61 6c 20 66 6f 72 20 70 42 74 72 65 65  legal for pBtree
1cd0: 20 74 6f 20 77 72 69 74 65 20 69 66 20 73 6f 6d   to write if som
1ce0: 65 20 6f 74 68 65 72 20 42 74 72 65 65 20 6f 62  e other Btree ob
1cf0: 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20 73 68 61  ject that.** sha
1d00: 72 65 73 20 74 68 65 20 73 61 6d 65 20 42 74 53  res the same BtS
1d10: 68 61 72 65 64 20 6f 62 6a 65 63 74 20 69 73 20  hared object is 
1d20: 63 75 72 72 65 6e 74 6c 79 20 72 65 61 64 69 6e  currently readin
1d30: 67 20 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a 20  g or writing.** 
1d40: 74 68 65 20 69 52 6f 6f 74 20 74 61 62 6c 65 2e  the iRoot table.
1d50: 20 20 45 78 63 65 70 74 2c 20 69 66 20 74 68 65    Except, if the
1d60: 20 6f 74 68 65 72 20 42 74 72 65 65 20 6f 62 6a   other Btree obj
1d70: 65 63 74 20 68 61 73 20 74 68 65 0a 2a 2a 20 72  ect has the.** r
1d80: 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20  ead-uncommitted 
1d90: 66 6c 61 67 20 73 65 74 2c 20 74 68 65 6e 20 69  flag set, then i
1da0: 74 20 69 73 20 4f 4b 20 66 6f 72 20 74 68 65 20  t is OK for the 
1db0: 6f 74 68 65 72 20 6f 62 6a 65 63 74 20 74 6f 0a  other object to.
1dc0: 2a 2a 20 68 61 76 65 20 61 20 72 65 61 64 20 63  ** have a read c
1dd0: 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  ursor..**.** For
1de0: 20 65 78 61 6d 70 6c 65 2c 20 62 65 66 6f 72 65   example, before
1df0: 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 79 20   writing to any 
1e00: 70 61 72 74 20 6f 66 20 74 68 65 20 74 61 62 6c  part of the tabl
1e10: 65 20 6f 72 20 69 6e 64 65 78 0a 2a 2a 20 72 6f  e or index.** ro
1e20: 6f 74 65 64 20 61 74 20 70 61 67 65 20 69 52 6f  oted at page iRo
1e30: 6f 74 2c 20 6f 6e 65 20 73 68 6f 75 6c 64 20 63  ot, one should c
1e40: 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61 73  all:.**.**    as
1e50: 73 65 72 74 28 20 21 68 61 73 52 65 61 64 43 6f  sert( !hasReadCo
1e60: 6e 66 6c 69 63 74 73 28 70 42 74 72 65 65 2c 20  nflicts(pBtree, 
1e70: 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f 0a 73 74 61  iRoot) );.*/.sta
1e80: 74 69 63 20 69 6e 74 20 68 61 73 52 65 61 64 43  tic int hasReadC
1e90: 6f 6e 66 6c 69 63 74 73 28 42 74 72 65 65 20 2a  onflicts(Btree *
1ea0: 70 42 74 72 65 65 2c 20 50 67 6e 6f 20 69 52 6f  pBtree, Pgno iRo
1eb0: 6f 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  ot){.  BtCursor 
1ec0: 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72  *p;.  for(p=pBtr
1ed0: 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72  ee->pBt->pCursor
1ee0: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
1ef0: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e  {.    if( p->pgn
1f00: 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 20 0a 20 20  oRoot==iRoot .  
1f10: 20 20 20 26 26 20 70 2d 3e 70 42 74 72 65 65 21     && p->pBtree!
1f20: 3d 70 42 74 72 65 65 0a 20 20 20 20 20 26 26 20  =pBtree.     && 
1f30: 30 3d 3d 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64  0==(p->pBtree->d
1f40: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
1f50: 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 29 0a  E_ReadUncommit).
1f60: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
1f70: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
1f80: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
1f90: 65 6e 64 69 66 20 20 20 20 2f 2a 20 23 69 66 64  endif    /* #ifd
1fa0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  ef SQLITE_DEBUG 
1fb0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20  */../*.** Query 
1fc0: 74 6f 20 73 65 65 20 69 66 20 42 74 72 65 65 20  to see if Btree 
1fd0: 68 61 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 74  handle p may obt
1fe0: 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79  ain a lock of ty
1ff0: 70 65 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45  pe eLock .** (RE
2000: 41 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45  AD_LOCK or WRITE
2010: 5f 4c 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74 61  _LOCK) on the ta
2020: 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  ble with root-pa
2030: 67 65 20 69 54 61 62 2e 20 52 65 74 75 72 6e 0a  ge iTab. Return.
2040: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  ** SQLITE_OK if 
2050: 74 68 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20  the lock may be 
2060: 6f 62 74 61 69 6e 65 64 20 28 62 79 20 63 61 6c  obtained (by cal
2070: 6c 69 6e 67 0a 2a 2a 20 73 65 74 53 68 61 72 65  ling.** setShare
2080: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
2090: 29 29 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4c 4f  )), or SQLITE_LO
20a0: 43 4b 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a  CKED if not..*/.
20b0: 73 74 61 74 69 63 20 69 6e 74 20 71 75 65 72 79  static int query
20c0: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
20d0: 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50  Lock(Btree *p, P
20e0: 67 6e 6f 20 69 54 61 62 2c 20 75 38 20 65 4c 6f  gno iTab, u8 eLo
20f0: 63 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ck){.  BtShared 
2100: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
2110: 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
2120: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2130: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
2140: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
2150: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2160: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49  CK || eLock==WRI
2170: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  TE_LOCK );.  ass
2180: 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b  ert( p->db!=0 );
2190: 0a 20 20 61 73 73 65 72 74 28 20 21 28 70 2d 3e  .  assert( !(p->
21a0: 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  db->flags&SQLITE
21b0: 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 29 7c 7c  _ReadUncommit)||
21c0: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
21d0: 4b 7c 7c 69 54 61 62 3d 3d 31 20 29 3b 0a 20 20  K||iTab==1 );.  
21e0: 0a 20 20 2f 2a 20 49 66 20 72 65 71 75 65 73 74  .  /* If request
21f0: 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ing a write-lock
2200: 2c 20 74 68 65 6e 20 74 68 65 20 42 74 72 65 65  , then the Btree
2210: 20 6d 75 73 74 20 68 61 76 65 20 61 6e 20 6f 70   must have an op
2220: 65 6e 20 77 72 69 74 65 0a 20 20 2a 2a 20 74 72  en write.  ** tr
2230: 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 69  ansaction on thi
2240: 73 20 66 69 6c 65 2e 20 41 6e 64 2c 20 6f 62 76  s file. And, obv
2250: 69 6f 75 73 6c 79 2c 20 66 6f 72 20 74 68 69 73  iously, for this
2260: 20 74 6f 20 62 65 20 73 6f 20 74 68 65 72 65 20   to be so there 
2270: 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 61 6e  .  ** must be an
2280: 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
2290: 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 66  saction on the f
22a0: 69 6c 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f  ile itself..  */
22b0: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
22c0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 28  ==READ_LOCK || (
22d0: 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72 20  p==pBt->pWriter 
22e0: 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  && p->inTrans==T
22f0: 52 41 4e 53 5f 57 52 49 54 45 29 20 29 3b 0a 20  RANS_WRITE) );. 
2300: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
2310: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 42 74  READ_LOCK || pBt
2320: 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
2330: 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
2340: 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75    .  /* This rou
2350: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tine is a no-op 
2360: 69 66 20 74 68 65 20 73 68 61 72 65 64 2d 63 61  if the shared-ca
2370: 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c  che is not enabl
2380: 65 64 20 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e  ed */.  if( !p->
2390: 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
23a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
23b0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73  ;.  }..  /* If s
23c0: 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63  ome other connec
23d0: 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20  tion is holding 
23e0: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
23f0: 6b 2c 20 74 68 65 0a 20 20 2a 2a 20 72 65 71 75  k, the.  ** requ
2400: 65 73 74 65 64 20 6c 6f 63 6b 20 6d 61 79 20 6e  ested lock may n
2410: 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a  ot be obtained..
2420: 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e    */.  if( pBt->
2430: 70 57 72 69 74 65 72 21 3d 70 20 26 26 20 28 70  pWriter!=p && (p
2440: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
2450: 54 53 5f 45 58 43 4c 55 53 49 56 45 29 21 3d 30  TS_EXCLUSIVE)!=0
2460: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   ){.    sqlite3C
2470: 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64  onnectionBlocked
2480: 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e 70 57 72  (p->db, pBt->pWr
2490: 69 74 65 72 2d 3e 64 62 29 3b 0a 20 20 20 20 72  iter->db);.    r
24a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
24b0: 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b  KED_SHAREDCACHE;
24c0: 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 70 49 74 65  .  }..  for(pIte
24d0: 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
24e0: 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
24f0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a  ->pNext){.    /*
2500: 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 28   The condition (
2510: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c  pIter->eLock!=eL
2520: 6f 63 6b 29 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ock) in the foll
2530: 6f 77 69 6e 67 20 69 66 28 2e 2e 2e 29 20 0a 20  owing if(...) . 
2540: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
2550: 69 73 20 61 20 73 69 6d 70 6c 69 66 69 63 61 74  is a simplificat
2560: 69 6f 6e 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20  ion of:.    **. 
2570: 20 20 20 2a 2a 20 20 20 28 65 4c 6f 63 6b 3d 3d     **   (eLock==
2580: 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 20 70 49  WRITE_LOCK || pI
2590: 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54  ter->eLock==WRIT
25a0: 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 2a 2a 0a 20  E_LOCK).    **. 
25b0: 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b     ** since we k
25c0: 6e 6f 77 20 74 68 61 74 20 69 66 20 65 4c 6f 63  now that if eLoc
25d0: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 2c 20 74  k==WRITE_LOCK, t
25e0: 68 65 6e 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e  hen no other con
25f0: 6e 65 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6d  nection.    ** m
2600: 61 79 20 68 6f 6c 64 20 61 20 57 52 49 54 45 5f  ay hold a WRITE_
2610: 4c 4f 43 4b 20 6f 6e 20 61 6e 79 20 74 61 62 6c  LOCK on any tabl
2620: 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 28  e in this file (
2630: 73 69 6e 63 65 20 74 68 65 72 65 20 63 61 6e 0a  since there can.
2640: 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 62 65 20 61      ** only be a
2650: 20 73 69 6e 67 6c 65 20 77 72 69 74 65 72 29 2e   single writer).
2660: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
2670: 72 74 28 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b  rt( pIter->eLock
2680: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70  ==READ_LOCK || p
2690: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Iter->eLock==WRI
26a0: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61  TE_LOCK );.    a
26b0: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
26c0: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72  AD_LOCK || pIter
26d0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 7c 7c 20 70  ->pBtree==p || p
26e0: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41  Iter->eLock==REA
26f0: 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  D_LOCK);.    if(
2700: 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d   pIter->pBtree!=
2710: 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54 61 62  p && pIter->iTab
2720: 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 49 74 65  le==iTab && pIte
2730: 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 20  r->eLock!=eLock 
2740: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2750: 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
2760: 64 28 70 2d 3e 64 62 2c 20 70 49 74 65 72 2d 3e  d(p->db, pIter->
2770: 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a 20 20 20  pBtree->db);.   
2780: 20 20 20 69 66 28 20 65 4c 6f 63 6b 3d 3d 57 52     if( eLock==WR
2790: 49 54 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  ITE_LOCK ){.    
27a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
27b0: 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20  Bt->pWriter );. 
27c0: 20 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46         pBt->btsF
27d0: 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 45 4e 44  lags |= BTS_PEND
27e0: 49 4e 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ING;.      }.   
27f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2800: 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41  _LOCKED_SHAREDCA
2810: 43 48 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  CHE;.    }.  }. 
2820: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2830: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  K;.}.#endif /* !
2840: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
2850: 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66  ED_CACHE */..#if
2860: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2870: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
2880: 0a 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20 6f  .** Add a lock o
2890: 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  n the table with
28a0: 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c   root-page iTabl
28b0: 65 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d  e to the shared-
28c0: 62 74 72 65 65 20 75 73 65 64 0a 2a 2a 20 62 79  btree used.** by
28d0: 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 2e   Btree handle p.
28e0: 20 50 61 72 61 6d 65 74 65 72 20 65 4c 6f 63 6b   Parameter eLock
28f0: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
2900: 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a 2a  READ_LOCK or .**
2910: 20 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a 0a   WRITE_LOCK..**.
2920: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2930: 20 61 73 73 75 6d 65 73 20 74 68 65 20 66 6f 6c   assumes the fol
2940: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
2950: 28 61 29 20 54 68 65 20 73 70 65 63 69 66 69 65  (a) The specifie
2960: 64 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 70  d Btree object p
2970: 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f   is connected to
2980: 20 61 20 73 68 61 72 61 62 6c 65 0a 2a 2a 20 20   a sharable.**  
2990: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28 6f       database (o
29a0: 6e 65 20 77 69 74 68 20 74 68 65 20 42 74 53 68  ne with the BtSh
29b0: 61 72 65 64 2e 73 68 61 72 61 62 6c 65 20 66 6c  ared.sharable fl
29c0: 61 67 20 73 65 74 29 2c 20 61 6e 64 0a 2a 2a 0a  ag set), and.**.
29d0: 2a 2a 20 20 20 28 62 29 20 4e 6f 20 6f 74 68 65  **   (b) No othe
29e0: 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 73 20  r Btree objects 
29f0: 68 6f 6c 64 20 61 20 6c 6f 63 6b 20 74 68 61 74  hold a lock that
2a00: 20 63 6f 6e 66 6c 69 63 74 73 0a 2a 2a 20 20 20   conflicts.**   
2a10: 20 20 20 20 77 69 74 68 20 74 68 65 20 72 65 71      with the req
2a20: 75 65 73 74 65 64 20 6c 6f 63 6b 20 28 69 2e 65  uested lock (i.e
2a30: 2e 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63  . querySharedCac
2a40: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20 68 61  heTableLock() ha
2a50: 73 0a 2a 2a 20 20 20 20 20 20 20 61 6c 72 65 61  s.**       alrea
2a60: 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 61  dy been called a
2a70: 6e 64 20 72 65 74 75 72 6e 65 64 20 53 51 4c 49  nd returned SQLI
2a80: 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 53 51  TE_OK)..**.** SQ
2a90: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
2aa0: 6e 65 64 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  ned if the lock 
2ab0: 69 73 20 61 64 64 65 64 20 73 75 63 63 65 73 73  is added success
2ac0: 66 75 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 4e 4f  fully. SQLITE_NO
2ad0: 4d 45 4d 20 0a 2a 2a 20 69 73 20 72 65 74 75 72  MEM .** is retur
2ae0: 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20  ned if a malloc 
2af0: 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2e 0a 2a  attempt fails..*
2b00: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74  /.static int set
2b10: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2b20: 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50  Lock(Btree *p, P
2b30: 67 6e 6f 20 69 54 61 62 6c 65 2c 20 75 38 20 65  gno iTable, u8 e
2b40: 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61 72 65  Lock){.  BtShare
2b50: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
2b60: 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b  .  BtLock *pLock
2b70: 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a   = 0;.  BtLock *
2b80: 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74  pIter;..  assert
2b90: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
2ba0: 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
2bb0: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
2bc0: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f  READ_LOCK || eLo
2bd0: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29  ck==WRITE_LOCK )
2be0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64  ;.  assert( p->d
2bf0: 62 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20  b!=0 );..  /* A 
2c00: 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20  connection with 
2c10: 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69  the read-uncommi
2c20: 74 74 65 64 20 66 6c 61 67 20 73 65 74 20 77 69  tted flag set wi
2c30: 6c 6c 20 6e 65 76 65 72 20 74 72 79 20 74 6f 0a  ll never try to.
2c40: 20 20 2a 2a 20 6f 62 74 61 69 6e 20 61 20 72 65    ** obtain a re
2c50: 61 64 2d 6c 6f 63 6b 20 75 73 69 6e 67 20 74 68  ad-lock using th
2c60: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65  is function. The
2c70: 20 6f 6e 6c 79 20 72 65 61 64 2d 6c 6f 63 6b 20   only read-lock 
2c80: 6f 62 74 61 69 6e 65 64 0a 20 20 2a 2a 20 62 79  obtained.  ** by
2c90: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e   a connection in
2ca0: 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65   read-uncommitte
2cb0: 64 20 6d 6f 64 65 20 69 73 20 6f 6e 20 74 68 65  d mode is on the
2cc0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 0a   sqlite_master .
2cd0: 20 20 2a 2a 20 74 61 62 6c 65 2c 20 61 6e 64 20    ** table, and 
2ce0: 74 68 61 74 20 6c 6f 63 6b 20 69 73 20 6f 62 74  that lock is obt
2cf0: 61 69 6e 65 64 20 69 6e 20 42 74 72 65 65 42 65  ained in BtreeBe
2d00: 67 69 6e 54 72 61 6e 73 28 29 2e 20 20 2a 2f 0a  ginTrans().  */.
2d10: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 28 70 2d    assert( 0==(p-
2d20: 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54  >db->flags&SQLIT
2d30: 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 29 20  E_ReadUncommit) 
2d40: 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f  || eLock==WRITE_
2d50: 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  LOCK );..  /* Th
2d60: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  is function shou
2d70: 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ld only be calle
2d80: 64 20 6f 6e 20 61 20 73 68 61 72 61 62 6c 65 20  d on a sharable 
2d90: 62 2d 74 72 65 65 20 61 66 74 65 72 20 69 74 20  b-tree after it 
2da0: 0a 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 64  .  ** has been d
2db0: 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 6e  etermined that n
2dc0: 6f 20 6f 74 68 65 72 20 62 2d 74 72 65 65 20 68  o other b-tree h
2dd0: 6f 6c 64 73 20 61 20 63 6f 6e 66 6c 69 63 74 69  olds a conflicti
2de0: 6e 67 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61  ng lock.  */.  a
2df0: 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62  ssert( p->sharab
2e00: 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  le );.  assert( 
2e10: 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71 75 65 72 79  SQLITE_OK==query
2e20: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2e30: 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20  Lock(p, iTable, 
2e40: 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20  eLock) );..  /* 
2e50: 46 69 72 73 74 20 73 65 61 72 63 68 20 74 68 65  First search the
2e60: 20 6c 69 73 74 20 66 6f 72 20 61 6e 20 65 78 69   list for an exi
2e70: 73 74 69 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74 68  sting lock on th
2e80: 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66  is table. */.  f
2e90: 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c  or(pIter=pBt->pL
2ea0: 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65  ock; pIter; pIte
2eb0: 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b  r=pIter->pNext){
2ec0: 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e  .    if( pIter->
2ed0: 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26  iTable==iTable &
2ee0: 26 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 3d  & pIter->pBtree=
2ef0: 3d 70 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63  =p ){.      pLoc
2f00: 6b 20 3d 20 70 49 74 65 72 3b 0a 20 20 20 20 20  k = pIter;.     
2f10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2f20: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61  }..  /* If the a
2f30: 62 6f 76 65 20 73 65 61 72 63 68 20 64 69 64 20  bove search did 
2f40: 6e 6f 74 20 66 69 6e 64 20 61 20 42 74 4c 6f 63  not find a BtLoc
2f50: 6b 20 73 74 72 75 63 74 20 61 73 73 6f 63 69 61  k struct associa
2f60: 74 69 6e 67 20 42 74 72 65 65 20 70 0a 20 20 2a  ting Btree p.  *
2f70: 2a 20 77 69 74 68 20 74 61 62 6c 65 20 69 54 61  * with table iTa
2f80: 62 6c 65 2c 20 61 6c 6c 6f 63 61 74 65 20 6f 6e  ble, allocate on
2f90: 65 20 61 6e 64 20 6c 69 6e 6b 20 69 74 20 69 6e  e and link it in
2fa0: 74 6f 20 74 68 65 20 6c 69 73 74 2e 0a 20 20 2a  to the list..  *
2fb0: 2f 0a 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29  /.  if( !pLock )
2fc0: 7b 0a 20 20 20 20 70 4c 6f 63 6b 20 3d 20 28 42  {.    pLock = (B
2fd0: 74 4c 6f 63 6b 20 2a 29 73 71 6c 69 74 65 33 4d  tLock *)sqlite3M
2fe0: 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66  allocZero(sizeof
2ff0: 28 42 74 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 69  (BtLock));.    i
3000: 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20  f( !pLock ){.   
3010: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
3020: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
3030: 20 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54   }.    pLock->iT
3040: 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20  able = iTable;. 
3050: 20 20 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65     pLock->pBtree
3060: 20 3d 20 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d   = p;.    pLock-
3070: 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c  >pNext = pBt->pL
3080: 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c  ock;.    pBt->pL
3090: 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d  ock = pLock;.  }
30a0: 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 42  ..  /* Set the B
30b0: 74 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69  tLock.eLock vari
30c0: 61 62 6c 65 20 74 6f 20 74 68 65 20 6d 61 78 69  able to the maxi
30d0: 6d 75 6d 20 6f 66 20 74 68 65 20 63 75 72 72 65  mum of the curre
30e0: 6e 74 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64  nt lock.  ** and
30f0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
3100: 6f 63 6b 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ock. This means 
3110: 69 66 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  if a write-lock 
3120: 77 61 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64  was already held
3130: 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 61 64  .  ** and a read
3140: 2d 6c 6f 63 6b 20 72 65 71 75 65 73 74 65 64 2c  -lock requested,
3150: 20 77 65 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72   we don't incorr
3160: 65 63 74 6c 79 20 64 6f 77 6e 67 72 61 64 65 20  ectly downgrade 
3170: 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20  the lock..  */. 
3180: 20 61 73 73 65 72 74 28 20 57 52 49 54 45 5f 4c   assert( WRITE_L
3190: 4f 43 4b 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b  OCK>READ_LOCK );
31a0: 0a 20 20 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f  .  if( eLock>pLo
31b0: 63 6b 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  ck->eLock ){.   
31c0: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20   pLock->eLock = 
31d0: 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65  eLock;.  }..  re
31e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
31f0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c  }.#endif /* !SQL
3200: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
3210: 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65  CACHE */..#ifnde
3220: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
3230: 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a  ARED_CACHE./*.**
3240: 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65   Release all the
3250: 20 74 61 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f   table locks (lo
3260: 63 6b 73 20 6f 62 74 61 69 6e 65 64 20 76 69 61  cks obtained via
3270: 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 74 68 65   calls to.** the
3280: 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54   setSharedCacheT
3290: 61 62 6c 65 4c 6f 63 6b 28 29 20 70 72 6f 63 65  ableLock() proce
32a0: 64 75 72 65 29 20 68 65 6c 64 20 62 79 20 42 74  dure) held by Bt
32b0: 72 65 65 20 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a  ree object p..**
32c0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
32d0: 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 42  n assumes that B
32e0: 74 72 65 65 20 70 20 68 61 73 20 61 6e 20 6f 70  tree p has an op
32f0: 65 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  en read or write
3300: 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e   .** transaction
3310: 2e 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  . If it does not
3320: 2c 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50  , then the BTS_P
3330: 45 4e 44 49 4e 47 20 66 6c 61 67 0a 2a 2a 20 6d  ENDING flag.** m
3340: 61 79 20 62 65 20 69 6e 63 6f 72 72 65 63 74 6c  ay be incorrectl
3350: 79 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74  y cleared..*/.st
3360: 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 41  atic void clearA
3370: 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62  llSharedCacheTab
3380: 6c 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70  leLocks(Btree *p
3390: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
33a0: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
33b0: 74 4c 6f 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d  tLock **ppIter =
33c0: 20 26 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20   &pBt->pLock;.. 
33d0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
33e0: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
33f0: 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
3400: 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 30  p->sharable || 0
3410: 3d 3d 2a 70 70 49 74 65 72 20 29 3b 0a 20 20 61  ==*ppIter );.  a
3420: 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e  ssert( p->inTran
3430: 73 3e 30 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28  s>0 );..  while(
3440: 20 2a 70 70 49 74 65 72 20 29 7b 0a 20 20 20 20   *ppIter ){.    
3450: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20  BtLock *pLock = 
3460: 2a 70 70 49 74 65 72 3b 0a 20 20 20 20 61 73 73  *ppIter;.    ass
3470: 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c  ert( (pBt->btsFl
3480: 61 67 73 20 26 20 42 54 53 5f 45 58 43 4c 55 53  ags & BTS_EXCLUS
3490: 49 56 45 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e  IVE)==0 || pBt->
34a0: 70 57 72 69 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e  pWriter==pLock->
34b0: 70 42 74 72 65 65 20 29 3b 0a 20 20 20 20 61 73  pBtree );.    as
34c0: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 70 42 74  sert( pLock->pBt
34d0: 72 65 65 2d 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c  ree->inTrans>=pL
34e0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20  ock->eLock );.  
34f0: 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74    if( pLock->pBt
3500: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
3510: 2a 70 70 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d  *ppIter = pLock-
3520: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 61 73  >pNext;.      as
3530: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 69 54 61  sert( pLock->iTa
3540: 62 6c 65 21 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d  ble!=1 || pLock=
3550: 3d 26 70 2d 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20  =&p->lock );.   
3560: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 69 54     if( pLock->iT
3570: 61 62 6c 65 21 3d 31 20 29 7b 0a 20 20 20 20 20  able!=1 ){.     
3580: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
3590: 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a  pLock);.      }.
35a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
35b0: 20 70 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b   ppIter = &pLock
35c0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
35d0: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70   }..  assert( (p
35e0: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
35f0: 54 53 5f 50 45 4e 44 49 4e 47 29 3d 3d 30 20 7c  TS_PENDING)==0 |
3600: 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29  | pBt->pWriter )
3610: 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72  ;.  if( pBt->pWr
3620: 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 70  iter==p ){.    p
3630: 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30 3b  Bt->pWriter = 0;
3640: 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  .    pBt->btsFla
3650: 67 73 20 26 3d 20 7e 28 42 54 53 5f 45 58 43 4c  gs &= ~(BTS_EXCL
3660: 55 53 49 56 45 7c 42 54 53 5f 50 45 4e 44 49 4e  USIVE|BTS_PENDIN
3670: 47 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  G);.  }else if( 
3680: 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
3690: 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54  n==2 ){.    /* T
36a0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
36b0: 63 61 6c 6c 65 64 20 77 68 65 6e 20 42 74 72 65  called when Btre
36c0: 65 20 70 20 69 73 20 63 6f 6e 63 6c 75 64 69 6e  e p is concludin
36d0: 67 20 69 74 73 20 0a 20 20 20 20 2a 2a 20 74 72  g its .    ** tr
36e0: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 74 68  ansaction. If th
36f0: 65 72 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78  ere currently ex
3700: 69 73 74 73 20 61 20 77 72 69 74 65 72 2c 20 61  ists a writer, a
3710: 6e 64 20 70 20 69 73 20 6e 6f 74 0a 20 20 20 20  nd p is not.    
3720: 2a 2a 20 74 68 61 74 20 77 72 69 74 65 72 2c 20  ** that writer, 
3730: 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
3740: 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
3750: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68   connections oth
3760: 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 74  er.    ** than t
3770: 68 65 20 77 72 69 74 65 72 20 6d 75 73 74 20 62  he writer must b
3780: 65 20 61 62 6f 75 74 20 74 6f 20 64 72 6f 70 20  e about to drop 
3790: 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73  to zero. In this
37a0: 20 63 61 73 65 0a 20 20 20 20 2a 2a 20 73 65 74   case.    ** set
37b0: 20 74 68 65 20 42 54 53 5f 50 45 4e 44 49 4e 47   the BTS_PENDING
37c0: 20 66 6c 61 67 20 74 6f 20 30 2e 0a 20 20 20 20   flag to 0..    
37d0: 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
37e0: 72 65 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e  re is not curren
37f0: 74 6c 79 20 61 20 77 72 69 74 65 72 2c 20 74 68  tly a writer, th
3800: 65 6e 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 6d  en BTS_PENDING m
3810: 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 7a 65  ust.    ** be ze
3820: 72 6f 20 61 6c 72 65 61 64 79 2e 20 53 6f 20 74  ro already. So t
3830: 68 69 73 20 6e 65 78 74 20 6c 69 6e 65 20 69 73  his next line is
3840: 20 68 61 72 6d 6c 65 73 73 20 69 6e 20 74 68 61   harmless in tha
3850: 74 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  t case..    */. 
3860: 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
3870: 20 26 3d 20 7e 42 54 53 5f 50 45 4e 44 49 4e 47   &= ~BTS_PENDING
3880: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
3890: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 61  his function cha
38a0: 6e 67 65 73 20 61 6c 6c 20 77 72 69 74 65 2d 6c  nges all write-l
38b0: 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 42 74 72  ocks held by Btr
38c0: 65 65 20 70 20 69 6e 74 6f 20 72 65 61 64 2d 6c  ee p into read-l
38d0: 6f 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ocks..*/.static 
38e0: 76 6f 69 64 20 64 6f 77 6e 67 72 61 64 65 41 6c  void downgradeAl
38f0: 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
3900: 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29  eLocks(Btree *p)
3910: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
3920: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66  t = p->pBt;.  if
3930: 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d  ( pBt->pWriter==
3940: 70 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20  p ){.    BtLock 
3950: 2a 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d  *pLock;.    pBt-
3960: 3e 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20  >pWriter = 0;.  
3970: 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
3980: 26 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49  &= ~(BTS_EXCLUSI
3990: 56 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b  VE|BTS_PENDING);
39a0: 0a 20 20 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70  .    for(pLock=p
39b0: 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  Bt->pLock; pLock
39c0: 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70  ; pLock=pLock->p
39d0: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73  Next){.      ass
39e0: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  ert( pLock->eLoc
39f0: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
3a00: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70  pLock->pBtree==p
3a10: 20 29 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d   );.      pLock-
3a20: 3e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f  >eLock = READ_LO
3a30: 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  CK;.    }.  }.}.
3a40: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
3a50: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
3a60: 43 48 45 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76  CHE */..static v
3a70: 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28  oid releasePage(
3a80: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b  MemPage *pPage);
3a90: 20 20 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66    /* Forward ref
3aa0: 65 72 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  erence */../*.**
3ab0: 2a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  *** This routine
3ac0: 20 69 73 20 75 73 65 64 20 69 6e 73 69 64 65 20   is used inside 
3ad0: 6f 66 20 61 73 73 65 72 74 28 29 20 6f 6e 6c 79  of assert() only
3ae0: 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69   ****.**.** Veri
3af0: 66 79 20 74 68 61 74 20 74 68 65 20 63 75 72 73  fy that the curs
3b00: 6f 72 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74  or holds the mut
3b10: 65 78 20 6f 6e 20 69 74 73 20 42 74 53 68 61 72  ex on its BtShar
3b20: 65 64 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ed.*/.#ifdef SQL
3b30: 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63  ITE_DEBUG.static
3b40: 20 69 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73   int cursorHolds
3b50: 4d 75 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a  Mutex(BtCursor *
3b60: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  p){.  return sql
3b70: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
3b80: 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a  p->pBt->mutex);.
3b90: 7d 0a 0a 2f 2a 20 56 65 72 69 66 79 20 74 68 61  }../* Verify tha
3ba0: 74 20 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64  t the cursor and
3bb0: 20 74 68 65 20 42 74 53 68 61 72 65 64 20 61 67   the BtShared ag
3bc0: 72 65 65 20 61 62 6f 75 74 20 77 68 61 74 20 69  ree about what i
3bd0: 73 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  s the current.**
3be0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 74   database connet
3bf0: 69 6f 6e 2e 20 54 68 69 73 20 69 73 20 69 6d 70  ion. This is imp
3c00: 6f 72 74 61 6e 74 20 69 6e 20 73 68 61 72 65 64  ortant in shared
3c10: 2d 63 61 63 68 65 20 6d 6f 64 65 2e 20 49 66 20  -cache mode. If 
3c20: 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
3c30: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e   connection poin
3c40: 74 65 72 73 20 67 65 74 20 6f 75 74 2d 6f 66 2d  ters get out-of-
3c50: 73 79 6e 63 2c 20 69 74 20 69 73 20 70 6f 73 73  sync, it is poss
3c60: 69 62 6c 65 20 66 6f 72 20 72 6f 75 74 69 6e 65  ible for routine
3c70: 73 20 6c 69 6b 65 0a 2a 2a 20 62 74 72 65 65 49  s like.** btreeI
3c80: 6e 69 74 50 61 67 65 28 29 20 74 6f 20 72 65 66  nitPage() to ref
3c90: 65 72 65 6e 63 65 20 61 6e 20 73 74 61 6c 65 20  erence an stale 
3ca0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74  connection point
3cb0: 65 72 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  er that referenc
3cc0: 65 73 20 61 0a 2a 2a 20 61 20 63 6f 6e 6e 65 63  es a.** a connec
3cd0: 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20 61 6c  tion that has al
3ce0: 72 65 61 64 79 20 63 6c 6f 73 65 64 2e 20 20 54  ready closed.  T
3cf0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
3d00: 73 65 64 20 69 6e 73 69 64 65 20 61 73 73 65 72  sed inside asser
3d10: 74 28 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  t().** statement
3d20: 73 20 6f 6e 6c 79 20 61 6e 64 20 66 6f 72 20 74  s only and for t
3d30: 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 64 6f  he purpose of do
3d40: 75 62 6c 65 2d 63 68 65 63 6b 69 6e 67 20 74 68  uble-checking th
3d50: 61 74 20 74 68 65 20 62 74 72 65 65 20 63 6f 64  at the btree cod
3d60: 65 0a 2a 2a 20 64 6f 65 73 20 6b 65 65 70 20 74  e.** does keep t
3d70: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
3d80: 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73 20  ection pointers 
3d90: 75 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 73  up-to-date..*/.s
3da0: 74 61 74 69 63 20 69 6e 74 20 63 75 72 73 6f 72  tatic int cursor
3db0: 4f 77 6e 73 42 74 53 68 61 72 65 64 28 42 74 43  OwnsBtShared(BtC
3dc0: 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 61 73 73  ursor *p){.  ass
3dd0: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
3de0: 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 72 65  Mutex(p) );.  re
3df0: 74 75 72 6e 20 28 70 2d 3e 70 42 74 72 65 65 2d  turn (p->pBtree-
3e00: 3e 64 62 3d 3d 70 2d 3e 70 42 74 2d 3e 64 62 29  >db==p->pBt->db)
3e10: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
3e20: 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65  * Invalidate the
3e30: 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 20   overflow cache 
3e40: 6f 66 20 74 68 65 20 63 75 72 73 6f 72 20 70 61  of the cursor pa
3e50: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
3e60: 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f  t argument..** o
3e70: 6e 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72  n the shared btr
3e80: 65 65 20 73 74 72 75 63 74 75 72 65 20 70 42 74  ee structure pBt
3e90: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e 76  ..*/.#define inv
3ea0: 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43  alidateOverflowC
3eb0: 61 63 68 65 28 70 43 75 72 29 20 28 70 43 75 72  ache(pCur) (pCur
3ec0: 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42  ->curFlags &= ~B
3ed0: 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 0a 0a  TCF_ValidOvfl)..
3ee0: 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65  /*.** Invalidate
3ef0: 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
3f00: 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f  ge-list cache fo
3f10: 72 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70  r all cursors op
3f20: 65 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73  ened.** on the s
3f30: 68 61 72 65 64 20 62 74 72 65 65 20 73 74 72 75  hared btree stru
3f40: 63 74 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74  cture pBt..*/.st
3f50: 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69  atic void invali
3f60: 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
3f70: 61 63 68 65 28 42 74 53 68 61 72 65 64 20 2a 70  ache(BtShared *p
3f80: 42 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  Bt){.  BtCursor 
3f90: 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  *p;.  assert( sq
3fa0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
3fb0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
3fc0: 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
3fd0: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
3fe0: 65 78 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69  ext){.    invali
3ff0: 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
4000: 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  e(p);.  }.}..#if
4010: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
4020: 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20  _INCRBLOB./*.** 
4030: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
4040: 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d   called before m
4050: 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e  odifying the con
4060: 74 65 6e 74 73 20 6f 66 20 61 20 74 61 62 6c 65  tents of a table
4070: 0a 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74  .** to invalidat
4080: 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63  e any incrblob c
4090: 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20  ursors that are 
40a0: 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 72  open on the.** r
40b0: 6f 77 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  ow or one of the
40c0: 20 72 6f 77 73 20 62 65 69 6e 67 20 6d 6f 64 69   rows being modi
40d0: 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  fied..**.** If a
40e0: 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54  rgument isClearT
40f0: 61 62 6c 65 20 69 73 20 74 72 75 65 2c 20 74 68  able is true, th
4100: 65 6e 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f  en the entire co
4110: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a  ntents of the.**
4120: 20 74 61 62 6c 65 20 69 73 20 61 62 6f 75 74 20   table is about 
4130: 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 20 49  to be deleted. I
4140: 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e 76 61  n this case inva
4150: 6c 69 64 61 74 65 20 61 6c 6c 20 69 6e 63 72 62  lidate all incrb
4160: 6c 6f 62 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f  lob.** cursors o
4170: 70 65 6e 20 6f 6e 20 61 6e 79 20 72 6f 77 20 77  pen on any row w
4180: 69 74 68 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ithin the table 
4190: 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 70  with root-page p
41a0: 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f  gnoRoot..**.** O
41b0: 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 72 67  therwise, if arg
41c0: 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62  ument isClearTab
41d0: 6c 65 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65  le is false, the
41e0: 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68 0a 2a  n the row with.*
41f0: 2a 20 72 6f 77 69 64 20 69 52 6f 77 20 69 73 20  * rowid iRow is 
4200: 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64 20 6f  being replaced o
4210: 72 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68  r deleted. In th
4220: 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61  is case invalida
4230: 74 65 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73 65  te.** only those
4240: 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72   incrblob cursor
4250: 73 20 6f 70 65 6e 20 6f 6e 20 74 68 61 74 20 73  s open on that s
4260: 70 65 63 69 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a  pecific row..*/.
4270: 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61  static void inva
4280: 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75  lidateIncrblobCu
4290: 72 73 6f 72 73 28 0a 20 20 42 74 72 65 65 20 2a  rsors(.  Btree *
42a0: 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 20  pBtree,         
42b0: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
42c0: 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a   file to check *
42d0: 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f  /.  Pgno pgnoRoo
42e0: 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  t,          /* T
42f0: 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 6d 69  he table that mi
4300: 67 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20  ght be changing 
4310: 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 2c 20 20  */.  i64 iRow,  
4320: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4330: 54 68 65 20 72 6f 77 69 64 20 74 68 61 74 20 6d  The rowid that m
4340: 69 67 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67  ight be changing
4350: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65 61   */.  int isClea
4360: 72 54 61 62 6c 65 20 20 20 20 20 20 20 20 2f 2a  rTable        /*
4370: 20 54 72 75 65 20 69 66 20 61 6c 6c 20 72 6f 77   True if all row
4380: 73 20 61 72 65 20 62 65 69 6e 67 20 64 65 6c 65  s are being dele
4390: 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75  ted */.){.  BtCu
43a0: 72 73 6f 72 20 2a 70 3b 0a 20 20 69 66 28 20 70  rsor *p;.  if( p
43b0: 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c  Btree->hasIncrbl
43c0: 6f 62 43 75 72 3d 3d 30 20 29 20 72 65 74 75 72  obCur==0 ) retur
43d0: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  n;.  assert( sql
43e0: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
43f0: 74 65 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20  tex(pBtree) );. 
4400: 20 70 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72   pBtree->hasIncr
4410: 62 6c 6f 62 43 75 72 20 3d 20 30 3b 0a 20 20 66  blobCur = 0;.  f
4420: 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74  or(p=pBtree->pBt
4430: 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
4440: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
4450: 66 28 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20  f( (p->curFlags 
4460: 26 20 42 54 43 46 5f 49 6e 63 72 62 6c 6f 62 29  & BTCF_Incrblob)
4470: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74  !=0 ){.      pBt
4480: 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62  ree->hasIncrblob
4490: 43 75 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  Cur = 1;.      i
44a0: 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  f( p->pgnoRoot==
44b0: 70 67 6e 6f 52 6f 6f 74 20 26 26 20 28 69 73 43  pgnoRoot && (isC
44c0: 6c 65 61 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e  learTable || p->
44d0: 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29  info.nKey==iRow)
44e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65   ){.        p->e
44f0: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
4500: 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 7d 0a  NVALID;.      }.
4510: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c      }.  }.}..#el
4520: 73 65 0a 20 20 2f 2a 20 53 74 75 62 20 66 75 6e  se.  /* Stub fun
4530: 63 74 69 6f 6e 20 77 68 65 6e 20 49 4e 43 52 42  ction when INCRB
4540: 4c 4f 42 20 69 73 20 6f 6d 69 74 74 65 64 20 2a  LOB is omitted *
4550: 2f 0a 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61  /.  #define inva
4560: 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75  lidateIncrblobCu
4570: 72 73 6f 72 73 28 77 2c 78 2c 79 2c 7a 29 0a 23  rsors(w,x,y,z).#
4580: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
4590: 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f  OMIT_INCRBLOB */
45a0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20  ../*.** Set bit 
45b0: 70 67 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68  pgno of the BtSh
45c0: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
45d0: 20 62 69 74 76 65 63 2e 20 54 68 69 73 20 69 73   bitvec. This is
45e0: 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e   called .** when
45f0: 20 61 20 70 61 67 65 20 74 68 61 74 20 70 72 65   a page that pre
4600: 76 69 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65  viously containe
4610: 64 20 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61  d data becomes a
4620: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
4630: 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  .** page..**.** 
4640: 54 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  The BtShared.pHa
4650: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20  sContent bitvec 
4660: 65 78 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61  exists to work a
4670: 72 6f 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65  round an obscure
4680: 0a 2a 2a 20 62 75 67 20 63 61 75 73 65 64 20 62  .** bug caused b
4690: 79 20 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f  y the interactio
46a0: 6e 20 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20  n of two useful 
46b0: 49 4f 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  IO optimizations
46c0: 20 73 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20   surrounding.** 
46d0: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
46e0: 61 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29  ages:.**.**   1)
46f0: 20 57 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69   When all data i
4700: 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61  s deleted from a
4710: 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 70 61   page and the pa
4720: 67 65 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20  ge becomes.**   
4730: 20 20 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c     a free-list l
4740: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 70 61  eaf page, the pa
4750: 67 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65  ge is not writte
4760: 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
4770: 65 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72  e.**      (as fr
4780: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4790: 65 73 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65  es contain no me
47a0: 61 6e 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20  aningful data). 
47b0: 53 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20  Sometimes.**    
47c0: 20 20 73 75 63 68 20 61 20 70 61 67 65 20 69 73    such a page is
47d0: 20 6e 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61   not even journa
47e0: 6c 6c 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c  lled (as it will
47f0: 20 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64   not be modified
4800: 2c 0a 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f  ,.**      why bo
4810: 74 68 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67  ther journalling
4820: 20 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32   it?)..**.**   2
4830: 29 20 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69  ) When a free-li
4840: 73 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20  st leaf page is 
4850: 72 65 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74  reused, its cont
4860: 65 6e 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a  ent is not read.
4870: 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65  **      from the
4880: 20 64 61 74 61 62 61 73 65 20 6f 72 20 77 72 69   database or wri
4890: 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
48a0: 6e 61 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68  nal file (why sh
48b0: 6f 75 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20  ould it.**      
48c0: 62 65 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74  be, if it is not
48d0: 20 61 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66   at all meaningf
48e0: 75 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74  ul?)..**.** By t
48f0: 68 65 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65  hemselves, these
4900: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77   optimizations w
4910: 6f 72 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f  ork fine and pro
4920: 76 69 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20  vide a handy.** 
4930: 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73  performance boos
4940: 74 20 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65  t to bulk delete
4950: 20 6f 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61   or insert opera
4960: 74 69 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20  tions. However, 
4970: 69 66 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20  if.** a page is 
4980: 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65  moved to the fre
4990: 65 2d 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20  e-list and then 
49a0: 72 65 75 73 65 64 20 77 69 74 68 69 6e 20 74 68  reused within th
49b0: 65 20 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61  e same.** transa
49c0: 63 74 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d  ction, a problem
49d0: 20 63 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68   comes up. If th
49e0: 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f  e page is not jo
49f0: 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a  urnalled when.**
4a00: 20 69 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20   it is moved to 
4a10: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  the free-list an
4a20: 64 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74  d it is also not
4a30: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e   journalled when
4a40: 20 69 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63   it.** is extrac
4a50: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65  ted from the fre
4a60: 65 2d 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65  e-list and reuse
4a70: 64 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67  d, then the orig
4a80: 69 6e 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79  inal data.** may
4a90: 20 62 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65   be lost. In the
4aa0: 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c   event of a roll
4ab0: 62 61 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74  back, it may not
4ac0: 20 62 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20   be possible.** 
4ad0: 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  to restore the d
4ae0: 61 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f  atabase to its o
4af0: 72 69 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72  riginal configur
4b00: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ation..**.** The
4b10: 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65   solution is the
4b20: 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f   BtShared.pHasCo
4b30: 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68  ntent bitvec. Wh
4b40: 65 6e 65 76 65 72 20 61 20 70 61 67 65 20 69 73  enever a page is
4b50: 20 0a 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65   .** moved to be
4b60: 63 6f 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74  come a free-list
4b70: 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 20   leaf page, the 
4b80: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
4b90: 74 20 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74  t is.** set in t
4ba0: 68 65 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65  he bitvec. Whene
4bb0: 76 65 72 20 61 20 6c 65 61 66 20 70 61 67 65 20  ver a leaf page 
4bc0: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
4bd0: 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  m the free-list,
4be0: 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  .** optimization
4bf0: 20 32 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74   2 above is omit
4c00: 74 65 64 20 69 66 20 74 68 65 20 63 6f 72 72 65  ted if the corre
4c10: 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20  sponding bit is 
4c20: 61 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69  already.** set i
4c30: 6e 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  n BtShared.pHasC
4c40: 6f 6e 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74  ontent. The cont
4c50: 65 6e 74 73 20 6f 66 20 74 68 65 20 62 69 74 76  ents of the bitv
4c60: 65 63 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a  ec are cleared.*
4c70: 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * at the end of 
4c80: 65 76 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f  every transactio
4c90: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
4ca0: 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74   btreeSetHasCont
4cb0: 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ent(BtShared *pB
4cc0: 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  t, Pgno pgno){. 
4cd0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
4ce0: 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  _OK;.  if( !pBt-
4cf0: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a  >pHasContent ){.
4d00: 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f      assert( pgno
4d10: 3c 3d 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a  <=pBt->nPage );.
4d20: 20 20 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e      pBt->pHasCon
4d30: 74 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69  tent = sqlite3Bi
4d40: 74 76 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e  tvecCreate(pBt->
4d50: 6e 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  nPage);.    if( 
4d60: 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  !pBt->pHasConten
4d70: 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  t ){.      rc = 
4d80: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
4d90: 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  T;.    }.  }.  i
4da0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
4db0: 20 26 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65   && pgno<=sqlite
4dc0: 33 42 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d  3BitvecSize(pBt-
4dd0: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b  >pHasContent) ){
4de0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
4df0: 33 42 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e  3BitvecSet(pBt->
4e00: 70 48 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e  pHasContent, pgn
4e10: 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  o);.  }.  return
4e20: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75   rc;.}../*.** Qu
4e30: 65 72 79 20 74 68 65 20 42 74 53 68 61 72 65 64  ery the BtShared
4e40: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63  .pHasContent vec
4e50: 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  tor..**.** This 
4e60: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
4e70: 65 64 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c  ed when a free-l
4e80: 69 73 74 20 6c 65 61 66 20 70 61 67 65 20 69 73  ist leaf page is
4e90: 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
4ea0: 65 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66  e.** free-list f
4eb0: 6f 72 20 72 65 75 73 65 2e 20 49 74 20 72 65 74  or reuse. It ret
4ec0: 75 72 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74  urns false if it
4ed0: 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 74 72   is safe to retr
4ee0: 69 65 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65  ieve the.** page
4ef0: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
4f00: 6c 61 79 65 72 20 77 69 74 68 20 74 68 65 20 27  layer with the '
4f10: 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67  no-content' flag
4f20: 20 73 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72   set. True other
4f30: 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
4f40: 69 6e 74 20 62 74 72 65 65 47 65 74 48 61 73 43  int btreeGetHasC
4f50: 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64 20  ontent(BtShared 
4f60: 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  *pBt, Pgno pgno)
4f70: 7b 0a 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20  {.  Bitvec *p = 
4f80: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
4f90: 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 20 26 26  ;.  return (p &&
4fa0: 20 28 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69   (pgno>sqlite3Bi
4fb0: 74 76 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73  tvecSize(p) || s
4fc0: 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
4fd0: 28 70 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a  (p, pgno)));.}..
4fe0: 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73  /*.** Clear (des
4ff0: 74 72 6f 79 29 20 74 68 65 20 42 74 53 68 61 72  troy) the BtShar
5000: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
5010: 69 74 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75  itvec. This shou
5020: 6c 64 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64  ld be.** invoked
5030: 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69   at the conclusi
5040: 6f 6e 20 6f 66 20 65 61 63 68 20 77 72 69 74 65  on of each write
5050: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f  -transaction..*/
5060: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
5070: 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e  eeClearHasConten
5080: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  t(BtShared *pBt)
5090: 7b 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65  {.  sqlite3Bitve
50a0: 63 44 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48  cDestroy(pBt->pH
50b0: 61 73 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42  asContent);.  pB
50c0: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d  t->pHasContent =
50d0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c   0;.}../*.** Rel
50e0: 65 61 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20  ease all of the 
50f0: 61 70 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66  apPage[] pages f
5100: 6f 72 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a  or a cursor..*/.
5110: 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
5120: 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f  eReleaseAllCurso
5130: 72 50 61 67 65 73 28 42 74 43 75 72 73 6f 72 20  rPages(BtCursor 
5140: 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b  *pCur){.  int i;
5150: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70  .  for(i=0; i<=p
5160: 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29  Cur->iPage; i++)
5170: 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
5180: 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  e(pCur->apPage[i
5190: 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 70  ]);.    pCur->ap
51a0: 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d  Page[i] = 0;.  }
51b0: 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d  .  pCur->iPage =
51c0: 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   -1;.}../*.** Th
51d0: 65 20 63 75 72 73 6f 72 20 70 61 73 73 65 64 20  e cursor passed 
51e0: 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
51f0: 6d 65 6e 74 20 6d 75 73 74 20 70 6f 69 6e 74 20  ment must point 
5200: 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79  to a valid entry
5210: 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75  .** when this fu
5220: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
5230: 20 28 69 2e 65 2e 20 68 61 76 65 20 65 53 74 61   (i.e. have eSta
5240: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
5250: 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  ). This.** funct
5260: 69 6f 6e 20 73 61 76 65 73 20 74 68 65 20 63 75  ion saves the cu
5270: 72 72 65 6e 74 20 63 75 72 73 6f 72 20 6b 65 79  rrent cursor key
5280: 20 69 6e 20 76 61 72 69 61 62 6c 65 73 20 70 43   in variables pC
5290: 75 72 2d 3e 6e 4b 65 79 20 61 6e 64 0a 2a 2a 20  ur->nKey and.** 
52a0: 70 43 75 72 2d 3e 70 4b 65 79 2e 20 53 51 4c 49  pCur->pKey. SQLI
52b0: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
52c0: 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20  d if successful 
52d0: 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  or an SQLite err
52e0: 6f 72 20 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65  or .** code othe
52f0: 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rwise..**.** If 
5300: 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f 70  the cursor is op
5310: 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 6b 65 79 20  en on an intkey 
5320: 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 65 20  table, then the 
5330: 69 6e 74 65 67 65 72 20 6b 65 79 0a 2a 2a 20 28  integer key.** (
5340: 74 68 65 20 72 6f 77 69 64 29 20 69 73 20 73 74  the rowid) is st
5350: 6f 72 65 64 20 69 6e 20 70 43 75 72 2d 3e 6e 4b  ored in pCur->nK
5360: 65 79 20 61 6e 64 20 70 43 75 72 2d 3e 70 4b 65  ey and pCur->pKe
5370: 79 20 69 73 20 6c 65 66 74 20 73 65 74 20 74 6f  y is left set to
5380: 0a 2a 2a 20 4e 55 4c 4c 2e 20 49 66 20 74 68 65  .** NULL. If the
5390: 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 20   cursor is open 
53a0: 6f 6e 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20  on a non-intkey 
53b0: 74 61 62 6c 65 2c 20 74 68 65 6e 20 70 43 75 72  table, then pCur
53c0: 2d 3e 70 4b 65 79 20 69 73 20 0a 2a 2a 20 73 65  ->pKey is .** se
53d0: 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  t to point to a 
53e0: 6d 61 6c 6c 6f 63 65 64 20 62 75 66 66 65 72 20  malloced buffer 
53f0: 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73  pCur->nKey bytes
5400: 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e   in size contain
5410: 69 6e 67 20 0a 2a 2a 20 74 68 65 20 6b 65 79 2e  ing .** the key.
5420: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
5430: 61 76 65 43 75 72 73 6f 72 4b 65 79 28 42 74 43  aveCursorKey(BtC
5440: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
5450: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
5460: 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55  OK;.  assert( CU
5470: 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72  RSOR_VALID==pCur
5480: 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73  ->eState );.  as
5490: 73 65 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70  sert( 0==pCur->p
54a0: 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Key );.  assert(
54b0: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
54c0: 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 69 66  x(pCur) );..  if
54d0: 28 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65  ( pCur->curIntKe
54e0: 79 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79  y ){.    /* Only
54f0: 20 74 68 65 20 72 6f 77 69 64 20 69 73 20 72 65   the rowid is re
5500: 71 75 69 72 65 64 20 66 6f 72 20 61 20 74 61 62  quired for a tab
5510: 6c 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 20 20  le btree */.    
5520: 70 43 75 72 2d 3e 6e 4b 65 79 20 3d 20 73 71 6c  pCur->nKey = sql
5530: 69 74 65 33 42 74 72 65 65 49 6e 74 65 67 65 72  ite3BtreeInteger
5540: 4b 65 79 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c  Key(pCur);.  }el
5550: 73 65 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61  se{.    /* For a
5560: 6e 20 69 6e 64 65 78 20 62 74 72 65 65 2c 20 73  n index btree, s
5570: 61 76 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  ave the complete
5580: 20 6b 65 79 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a   key content */.
5590: 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 3b 0a      void *pKey;.
55a0: 20 20 20 20 70 43 75 72 2d 3e 6e 4b 65 79 20 3d      pCur->nKey =
55b0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
55c0: 6c 6f 61 64 53 69 7a 65 28 70 43 75 72 29 3b 0a  loadSize(pCur);.
55d0: 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74      pKey = sqlit
55e0: 65 33 4d 61 6c 6c 6f 63 28 20 70 43 75 72 2d 3e  e3Malloc( pCur->
55f0: 6e 4b 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20  nKey );.    if( 
5600: 70 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63  pKey ){.      rc
5610: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
5620: 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c 20  ayload(pCur, 0, 
5630: 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79 2c  (int)pCur->nKey,
5640: 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66   pKey);.      if
5650: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
5660: 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
5670: 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20 20  >pKey = pKey;.  
5680: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5690: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
56a0: 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pKey);.      }. 
56b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
56c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
56d0: 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  M_BKPT;.    }.  
56e0: 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 43 75  }.  assert( !pCu
56f0: 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 7c 7c 20  r->curIntKey || 
5700: 21 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20  !pCur->pKey );. 
5710: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
5720: 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75  *.** Save the cu
5730: 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
5740: 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72  ition in the var
5750: 69 61 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e  iables BtCursor.
5760: 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43  nKey .** and BtC
5770: 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20  ursor.pKey. The 
5780: 63 75 72 73 6f 72 27 73 20 73 74 61 74 65 20 69  cursor's state i
5790: 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f  s set to CURSOR_
57a0: 52 45 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a  REQUIRESEEK..**.
57b0: 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
57c0: 73 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  st ensure that t
57d0: 68 65 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c  he cursor is val
57e0: 69 64 20 28 68 61 73 20 65 53 74 61 74 65 3d 3d  id (has eState==
57f0: 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a  CURSOR_VALID).**
5800: 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
5810: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
5820: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
5830: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
5840: 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  on(BtCursor *pCu
5850: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  r){.  int rc;.. 
5860: 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
5870: 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
5880: 61 74 65 20 7c 7c 20 43 55 52 53 4f 52 5f 53 4b  ate || CURSOR_SK
5890: 49 50 4e 45 58 54 3d 3d 70 43 75 72 2d 3e 65 53  IPNEXT==pCur->eS
58a0: 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74  tate );.  assert
58b0: 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20  ( 0==pCur->pKey 
58c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
58d0: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
58e0: 75 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 43  ur) );..  if( pC
58f0: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
5900: 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20  OR_SKIPNEXT ){. 
5910: 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
5920: 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
5930: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75    }else{.    pCu
5940: 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b  r->skipNext = 0;
5950: 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 61 76  .  }..  rc = sav
5960: 65 43 75 72 73 6f 72 4b 65 79 28 70 43 75 72 29  eCursorKey(pCur)
5970: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
5980: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 74 72  TE_OK ){.    btr
5990: 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73  eeReleaseAllCurs
59a0: 6f 72 50 61 67 65 73 28 70 43 75 72 29 3b 0a 20  orPages(pCur);. 
59b0: 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
59c0: 3d 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  = CURSOR_REQUIRE
59d0: 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20 70 43 75  SEEK;.  }..  pCu
59e0: 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
59f0: 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c  (BTCF_ValidNKey|
5a00: 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42  BTCF_ValidOvfl|B
5a10: 54 43 46 5f 41 74 4c 61 73 74 29 3b 0a 20 20 72  TCF_AtLast);.  r
5a20: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
5a30: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
5a40: 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e */.static int 
5a50: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
5a60: 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73  saveCursorsOnLis
5a70: 74 28 42 74 43 75 72 73 6f 72 2a 2c 50 67 6e 6f  t(BtCursor*,Pgno
5a80: 2c 42 74 43 75 72 73 6f 72 2a 29 3b 0a 0a 2f 2a  ,BtCursor*);../*
5a90: 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73  .** Save the pos
5aa0: 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63 75  itions of all cu
5ab0: 72 73 6f 72 73 20 28 65 78 63 65 70 74 20 70 45  rsors (except pE
5ac0: 78 63 65 70 74 29 20 74 68 61 74 20 61 72 65 20  xcept) that are 
5ad0: 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 74  open on.** the t
5ae0: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
5af0: 61 67 65 20 69 52 6f 6f 74 2e 20 20 22 53 61 76  age iRoot.  "Sav
5b00: 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 70  ing the cursor p
5b10: 6f 73 69 74 69 6f 6e 22 20 6d 65 61 6e 73 20 74  osition" means t
5b20: 68 61 74 0a 2a 2a 20 74 68 65 20 6c 6f 63 61 74  hat.** the locat
5b30: 69 6f 6e 20 69 6e 20 74 68 65 20 62 74 72 65 65  ion in the btree
5b40: 20 69 73 20 72 65 6d 65 6d 62 65 72 65 64 20 69   is remembered i
5b50: 6e 20 73 75 63 68 20 61 20 77 61 79 20 74 68 61  n such a way tha
5b60: 74 20 69 74 20 63 61 6e 20 62 65 0a 2a 2a 20 6d  t it can be.** m
5b70: 6f 76 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65  oved back to the
5b80: 20 73 61 6d 65 20 73 70 6f 74 20 61 66 74 65 72   same spot after
5b90: 20 74 68 65 20 62 74 72 65 65 20 68 61 73 20 62   the btree has b
5ba0: 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 54  een modified.  T
5bb0: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69  his.** routine i
5bc0: 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65  s called just be
5bd0: 66 6f 72 65 20 63 75 72 73 6f 72 20 70 45 78 63  fore cursor pExc
5be0: 65 70 74 20 69 73 20 75 73 65 64 20 74 6f 20 6d  ept is used to m
5bf0: 6f 64 69 66 79 20 74 68 65 0a 2a 2a 20 74 61 62  odify the.** tab
5c00: 6c 65 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 20  le, for example 
5c10: 69 6e 20 42 74 72 65 65 44 65 6c 65 74 65 28 29  in BtreeDelete()
5c20: 20 6f 72 20 42 74 72 65 65 49 6e 73 65 72 74 28   or BtreeInsert(
5c30: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  )..**.** If ther
5c40: 65 20 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72  e are two or mor
5c50: 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65  e cursors on the
5c60: 20 73 61 6d 65 20 62 74 72 65 65 2c 20 74 68 65   same btree, the
5c70: 6e 20 61 6c 6c 20 73 75 63 68 20 0a 2a 2a 20 63  n all such .** c
5c80: 75 72 73 6f 72 73 20 73 68 6f 75 6c 64 20 68 61  ursors should ha
5c90: 76 65 20 74 68 65 69 72 20 42 54 43 46 5f 4d 75  ve their BTCF_Mu
5ca0: 6c 74 69 70 6c 65 20 66 6c 61 67 20 73 65 74 2e  ltiple flag set.
5cb0: 20 20 54 68 65 20 62 74 72 65 65 43 75 72 73 6f    The btreeCurso
5cc0: 72 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 65  r().** routine e
5cd0: 6e 66 6f 72 63 65 73 20 74 68 61 74 20 72 75 6c  nforces that rul
5ce0: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
5cf0: 20 6f 6e 6c 79 20 6e 65 65 64 73 20 74 6f 20 62   only needs to b
5d00: 65 20 63 61 6c 6c 65 64 20 69 6e 0a 2a 2a 20 74  e called in.** t
5d10: 68 65 20 75 6e 63 6f 6d 6d 6f 6e 20 63 61 73 65  he uncommon case
5d20: 20 77 68 65 6e 20 70 45 78 70 65 63 74 20 68 61   when pExpect ha
5d30: 73 20 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69  s the BTCF_Multi
5d40: 70 6c 65 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a  ple flag set..**
5d50: 0a 2a 2a 20 49 66 20 70 45 78 70 65 63 74 21 3d  .** If pExpect!=
5d60: 4e 55 4c 4c 20 61 6e 64 20 69 66 20 6e 6f 20 6f  NULL and if no o
5d70: 74 68 65 72 20 63 75 72 73 6f 72 73 20 61 72 65  ther cursors are
5d80: 20 66 6f 75 6e 64 20 6f 6e 20 74 68 65 20 73 61   found on the sa
5d90: 6d 65 20 72 6f 6f 74 2d 70 61 67 65 2c 0a 2a 2a  me root-page,.**
5da0: 20 74 68 65 6e 20 74 68 65 20 42 54 43 46 5f 4d   then the BTCF_M
5db0: 75 6c 74 69 70 6c 65 20 66 6c 61 67 20 6f 6e 20  ultiple flag on 
5dc0: 70 45 78 70 65 63 74 20 69 73 20 63 6c 65 61 72  pExpect is clear
5dd0: 65 64 2c 20 74 6f 20 61 76 6f 69 64 20 61 6e 6f  ed, to avoid ano
5de0: 74 68 65 72 0a 2a 2a 20 70 6f 69 6e 74 6c 65 73  ther.** pointles
5df0: 73 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72  s call to this r
5e00: 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 6d  outine..**.** Im
5e10: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6e 6f 74  plementation not
5e20: 65 3a 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e:  This routine
5e30: 20 6d 65 72 65 6c 79 20 63 68 65 63 6b 73 20 74   merely checks t
5e40: 6f 20 73 65 65 20 69 66 20 61 6e 79 20 63 75 72  o see if any cur
5e50: 73 6f 72 73 0a 2a 2a 20 6e 65 65 64 20 74 6f 20  sors.** need to 
5e60: 62 65 20 73 61 76 65 64 2e 20 20 49 74 20 63 61  be saved.  It ca
5e70: 6c 6c 73 20 6f 75 74 20 74 6f 20 73 61 76 65 43  lls out to saveC
5e80: 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 29 20 69  ursorsOnList() i
5e90: 6e 20 74 68 65 20 28 75 6e 75 73 75 61 6c 29 0a  n the (unusual).
5ea0: 2a 2a 20 65 76 65 6e 74 20 74 68 61 74 20 63 75  ** event that cu
5eb0: 72 73 6f 72 73 20 61 72 65 20 69 6e 20 6e 65 65  rsors are in nee
5ec0: 64 20 74 6f 20 62 65 69 6e 67 20 73 61 76 65 64  d to being saved
5ed0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5ee0: 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 42  saveAllCursors(B
5ef0: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
5f00: 6e 6f 20 69 52 6f 6f 74 2c 20 42 74 43 75 72 73  no iRoot, BtCurs
5f10: 6f 72 20 2a 70 45 78 63 65 70 74 29 7b 0a 20 20  or *pExcept){.  
5f20: 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61  BtCursor *p;.  a
5f30: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
5f40: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
5f50: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
5f60: 74 28 20 70 45 78 63 65 70 74 3d 3d 30 20 7c 7c  t( pExcept==0 ||
5f70: 20 70 45 78 63 65 70 74 2d 3e 70 42 74 3d 3d 70   pExcept->pBt==p
5f80: 42 74 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42  Bt );.  for(p=pB
5f90: 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
5fa0: 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
5fb0: 69 66 28 20 70 21 3d 70 45 78 63 65 70 74 20 26  if( p!=pExcept &
5fc0: 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70  & (0==iRoot || p
5fd0: 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f  ->pgnoRoot==iRoo
5fe0: 74 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  t) ) break;.  }.
5ff0: 20 20 69 66 28 20 70 20 29 20 72 65 74 75 72 6e    if( p ) return
6000: 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69   saveCursorsOnLi
6010: 73 74 28 70 2c 20 69 52 6f 6f 74 2c 20 70 45 78  st(p, iRoot, pEx
6020: 63 65 70 74 29 3b 0a 20 20 69 66 28 20 70 45 78  cept);.  if( pEx
6030: 63 65 70 74 20 29 20 70 45 78 63 65 70 74 2d 3e  cept ) pExcept->
6040: 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43  curFlags &= ~BTC
6050: 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 72 65  F_Multiple;.  re
6060: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6070: 7d 0a 0a 2f 2a 20 54 68 69 73 20 68 65 6c 70 65  }../* This helpe
6080: 72 20 72 6f 75 74 69 6e 65 20 74 6f 20 73 61 76  r routine to sav
6090: 65 41 6c 6c 43 75 72 73 6f 72 73 20 64 6f 65 73  eAllCursors does
60a0: 20 74 68 65 20 61 63 74 75 61 6c 20 77 6f 72 6b   the actual work
60b0: 20 6f 66 20 73 61 76 69 6e 67 0a 2a 2a 20 74 68   of saving.** th
60c0: 65 20 63 75 72 73 6f 72 73 20 69 66 20 61 6e 64  e cursors if and
60d0: 20 77 68 65 6e 20 61 20 63 75 72 73 6f 72 20 69   when a cursor i
60e0: 73 20 66 6f 75 6e 64 20 74 68 61 74 20 61 63 74  s found that act
60f0: 75 61 6c 6c 79 20 72 65 71 75 69 72 65 73 20 73  ually requires s
6100: 61 76 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 63 6f  aving..** The co
6110: 6d 6d 6f 6e 20 63 61 73 65 20 69 73 20 74 68 61  mmon case is tha
6120: 74 20 6e 6f 20 63 75 72 73 6f 72 73 20 6e 65 65  t no cursors nee
6130: 64 20 74 6f 20 62 65 20 73 61 76 65 64 2c 20 73  d to be saved, s
6140: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
6150: 73 0a 2a 2a 20 62 72 6f 6b 65 6e 20 6f 75 74 20  s.** broken out 
6160: 66 72 6f 6d 20 69 74 73 20 63 61 6c 6c 65 72 20  from its caller 
6170: 74 6f 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73  to avoid unneces
6180: 73 61 72 79 20 73 74 61 63 6b 20 70 6f 69 6e 74  sary stack point
6190: 65 72 20 6d 6f 76 65 6d 65 6e 74 2e 0a 2a 2f 0a  er movement..*/.
61a0: 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
61b0: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43  E_NOINLINE saveC
61c0: 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 0a 20 20  ursorsOnList(.  
61d0: 42 74 43 75 72 73 6f 72 20 2a 70 2c 20 20 20 20  BtCursor *p,    
61e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73       /* The firs
61f0: 74 20 63 75 72 73 6f 72 20 74 68 61 74 20 6e 65  t cursor that ne
6200: 65 64 73 20 73 61 76 69 6e 67 20 2a 2f 0a 20 20  eds saving */.  
6210: 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20  Pgno iRoot,     
6220: 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 73 61 76       /* Only sav
6230: 65 20 63 75 72 73 6f 72 20 77 69 74 68 20 74 68  e cursor with th
6240: 69 73 20 69 52 6f 6f 74 2e 20 53 61 76 65 20 61  is iRoot. Save a
6250: 6c 6c 20 69 66 20 7a 65 72 6f 20 2a 2f 0a 20 20  ll if zero */.  
6260: 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70  BtCursor *pExcep
6270: 74 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73  t    /* Do not s
6280: 61 76 65 20 74 68 69 73 20 63 75 72 73 6f 72 20  ave this cursor 
6290: 2a 2f 0a 29 7b 0a 20 20 64 6f 7b 0a 20 20 20 20  */.){.  do{.    
62a0: 69 66 28 20 70 21 3d 70 45 78 63 65 70 74 20 26  if( p!=pExcept &
62b0: 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70  & (0==iRoot || p
62c0: 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f  ->pgnoRoot==iRoo
62d0: 74 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  t) ){.      if( 
62e0: 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  p->eState==CURSO
62f0: 52 5f 56 41 4c 49 44 20 7c 7c 20 70 2d 3e 65 53  R_VALID || p->eS
6300: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49  tate==CURSOR_SKI
6310: 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20  PNEXT ){.       
6320: 20 69 6e 74 20 72 63 20 3d 20 73 61 76 65 43 75   int rc = saveCu
6330: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b  rsorPosition(p);
6340: 0a 20 20 20 20 20 20 20 20 69 66 28 20 53 51 4c  .        if( SQL
6350: 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20  ITE_OK!=rc ){.  
6360: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
6370: 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
6380: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6390: 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 69    testcase( p->i
63a0: 50 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 20 20  Page>0 );.      
63b0: 20 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c    btreeReleaseAl
63c0: 6c 43 75 72 73 6f 72 50 61 67 65 73 28 70 29 3b  lCursorPages(p);
63d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
63e0: 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b     p = p->pNext;
63f0: 0a 20 20 7d 77 68 69 6c 65 28 20 70 20 29 3b 0a  .  }while( p );.
6400: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6410: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  OK;.}../*.** Cle
6420: 61 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  ar the current c
6430: 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a  ursor position..
6440: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
6450: 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28  treeClearCursor(
6460: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
6470: 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
6480: 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
6490: 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ) );.  sqlite3_f
64a0: 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b  ree(pCur->pKey);
64b0: 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20  .  pCur->pKey = 
64c0: 30 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74  0;.  pCur->eStat
64d0: 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
64e0: 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20  ID;.}../*.** In 
64f0: 74 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20  this version of 
6500: 42 74 72 65 65 4d 6f 76 65 74 6f 2c 20 70 4b 65  BtreeMoveto, pKe
6510: 79 20 69 73 20 61 20 70 61 63 6b 65 64 20 69 6e  y is a packed in
6520: 64 65 78 20 72 65 63 6f 72 64 0a 2a 2a 20 73 75  dex record.** su
6530: 63 68 20 61 73 20 69 73 20 67 65 6e 65 72 61 74  ch as is generat
6540: 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b  ed by the OP_Mak
6550: 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 20  eRecord opcode. 
6560: 20 55 6e 70 61 63 6b 20 74 68 65 0a 2a 2a 20 72   Unpack the.** r
6570: 65 63 6f 72 64 20 61 6e 64 20 74 68 65 6e 20 63  ecord and then c
6580: 61 6c 6c 20 42 74 72 65 65 4d 6f 76 65 74 6f 55  all BtreeMovetoU
6590: 6e 70 61 63 6b 65 64 28 29 20 74 6f 20 64 6f 20  npacked() to do 
65a0: 74 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74 61  the work..*/.sta
65b0: 74 69 63 20 69 6e 74 20 62 74 72 65 65 4d 6f 76  tic int btreeMov
65c0: 65 74 6f 28 0a 20 20 42 74 43 75 72 73 6f 72 20  eto(.  BtCursor 
65d0: 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a 20 43 75  *pCur,     /* Cu
65e0: 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65  rsor open on the
65f0: 20 62 74 72 65 65 20 74 6f 20 62 65 20 73 65 61   btree to be sea
6600: 72 63 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  rched */.  const
6610: 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f   void *pKey,   /
6620: 2a 20 50 61 63 6b 65 64 20 6b 65 79 20 69 66 20  * Packed key if 
6630: 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6e 20  the btree is an 
6640: 69 6e 64 65 78 20 2a 2f 0a 20 20 69 36 34 20 6e  index */.  i64 n
6650: 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Key,           /
6660: 2a 20 49 6e 74 65 67 65 72 20 6b 65 79 20 66 6f  * Integer key fo
6670: 72 20 74 61 62 6c 65 73 2e 20 20 53 69 7a 65 20  r tables.  Size 
6680: 6f 66 20 70 4b 65 79 20 66 6f 72 20 69 6e 64 69  of pKey for indi
6690: 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61  ces */.  int bia
66a0: 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
66b0: 42 69 61 73 20 73 65 61 72 63 68 20 74 6f 20 74  Bias search to t
66c0: 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20  he high end */. 
66d0: 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20   int *pRes      
66e0: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65       /* Write se
66f0: 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65 72  arch results her
6700: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
6710: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6720: 20 20 20 20 20 2f 2a 20 53 74 61 74 75 73 20 63       /* Status c
6730: 6f 64 65 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  ode */.  Unpacke
6740: 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79  dRecord *pIdxKey
6750: 3b 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20  ;   /* Unpacked 
6760: 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 0a 20 20  index key */..  
6770: 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20  if( pKey ){.    
6780: 61 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69  assert( nKey==(i
6790: 36 34 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a  64)(int)nKey );.
67a0: 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 73 71      pIdxKey = sq
67b0: 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e  lite3VdbeAllocUn
67c0: 70 61 63 6b 65 64 52 65 63 6f 72 64 28 70 43 75  packedRecord(pCu
67d0: 72 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20  r->pKeyInfo);.  
67e0: 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d 3d 30    if( pIdxKey==0
67f0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
6800: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
6810: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
6820: 72 64 55 6e 70 61 63 6b 28 70 43 75 72 2d 3e 70  rdUnpack(pCur->p
6830: 4b 65 79 49 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b  KeyInfo, (int)nK
6840: 65 79 2c 20 70 4b 65 79 2c 20 70 49 64 78 4b 65  ey, pKey, pIdxKe
6850: 79 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78  y);.    if( pIdx
6860: 4b 65 79 2d 3e 6e 46 69 65 6c 64 3d 3d 30 20 29  Key->nField==0 )
6870: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
6880: 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f  ITE_CORRUPT_PGNO
6890: 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  (pCur->apPage[pC
68a0: 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e 6f  ur->iPage]->pgno
68b0: 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f  );.      goto mo
68c0: 76 65 74 6f 5f 64 6f 6e 65 3b 0a 20 20 20 20 7d  veto_done;.    }
68d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
68e0: 64 78 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20  dxKey = 0;.  }. 
68f0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
6900: 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
6910: 28 70 43 75 72 2c 20 70 49 64 78 4b 65 79 2c 20  (pCur, pIdxKey, 
6920: 6e 4b 65 79 2c 20 62 69 61 73 2c 20 70 52 65 73  nKey, bias, pRes
6930: 29 3b 0a 6d 6f 76 65 74 6f 5f 64 6f 6e 65 3a 0a  );.moveto_done:.
6940: 20 20 69 66 28 20 70 49 64 78 4b 65 79 20 29 7b    if( pIdxKey ){
6950: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
6960: 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  ee(pCur->pKeyInf
6970: 6f 2d 3e 64 62 2c 20 70 49 64 78 4b 65 79 29 3b  o->db, pIdxKey);
6980: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
6990: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f  ;.}../*.** Resto
69a0: 72 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  re the cursor to
69b0: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74   the position it
69c0: 20 77 61 73 20 69 6e 20 28 6f 72 20 61 73 20 63   was in (or as c
69d0: 6c 6f 73 65 20 74 6f 20 61 73 20 70 6f 73 73 69  lose to as possi
69e0: 62 6c 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76  ble).** when sav
69f0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
6a00: 29 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f  ) was called. No
6a10: 74 65 20 74 68 61 74 20 74 68 69 73 20 63 61 6c  te that this cal
6a20: 6c 20 64 65 6c 65 74 65 73 20 74 68 65 20 0a 2a  l deletes the .*
6a30: 2a 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e  * saved position
6a40: 20 69 6e 66 6f 20 73 74 6f 72 65 64 20 62 79 20   info stored by 
6a50: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
6a60: 6f 6e 28 29 2c 20 73 6f 20 74 68 65 72 65 20 63  on(), so there c
6a70: 61 6e 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74  an be.** at most
6a80: 20 6f 6e 65 20 65 66 66 65 63 74 69 76 65 20 72   one effective r
6a90: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
6aa0: 74 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74 65  tion() call afte
6ab0: 72 20 65 61 63 68 20 0a 2a 2a 20 73 61 76 65 43  r each .** saveC
6ac0: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e  ursorPosition().
6ad0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
6ae0: 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f  treeRestoreCurso
6af0: 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73  rPosition(BtCurs
6b00: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74  or *pCur){.  int
6b10: 20 72 63 3b 0a 20 20 69 6e 74 20 73 6b 69 70 4e   rc;.  int skipN
6b20: 65 78 74 3b 0a 20 20 61 73 73 65 72 74 28 20 63  ext;.  assert( c
6b30: 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
6b40: 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
6b50: 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
6b60: 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e>=CURSOR_REQUIR
6b70: 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70  ESEEK );.  if( p
6b80: 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
6b90: 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20  SOR_FAULT ){.   
6ba0: 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b   return pCur->sk
6bb0: 69 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 70 43  ipNext;.  }.  pC
6bc0: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
6bd0: 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72  SOR_INVALID;.  r
6be0: 63 20 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f 28  c = btreeMoveto(
6bf0: 70 43 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79  pCur, pCur->pKey
6c00: 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c  , pCur->nKey, 0,
6c10: 20 26 73 6b 69 70 4e 65 78 74 29 3b 0a 20 20 69   &skipNext);.  i
6c20: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
6c30: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
6c40: 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29  free(pCur->pKey)
6c50: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79  ;.    pCur->pKey
6c60: 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74   = 0;.    assert
6c70: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
6c80: 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
6c90: 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
6ca0: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a  RSOR_INVALID );.
6cb0: 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65      pCur->skipNe
6cc0: 78 74 20 7c 3d 20 73 6b 69 70 4e 65 78 74 3b 0a  xt |= skipNext;.
6cd0: 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b      if( pCur->sk
6ce0: 69 70 4e 65 78 74 20 26 26 20 70 43 75 72 2d 3e  ipNext && pCur->
6cf0: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
6d00: 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 70 43  ALID ){.      pC
6d10: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
6d20: 53 4f 52 5f 53 4b 49 50 4e 45 58 54 3b 0a 20 20  SOR_SKIPNEXT;.  
6d30: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
6d40: 20 72 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20   rc;.}..#define 
6d50: 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
6d60: 69 74 69 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d  ition(p) \.  (p-
6d70: 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f  >eState>=CURSOR_
6d80: 52 45 51 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a  REQUIRESEEK ? \.
6d90: 20 20 20 20 20 20 20 20 20 62 74 72 65 65 52 65           btreeRe
6da0: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
6db0: 69 6f 6e 28 70 29 20 3a 20 5c 0a 20 20 20 20 20  ion(p) : \.     
6dc0: 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a      SQLITE_OK)..
6dd0: 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20  /*.** Determine 
6de0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  whether or not a
6df0: 20 63 75 72 73 6f 72 20 68 61 73 20 6d 6f 76 65   cursor has move
6e00: 64 20 66 72 6f 6d 20 74 68 65 20 70 6f 73 69 74  d from the posit
6e10: 69 6f 6e 20 77 68 65 72 65 0a 2a 2a 20 69 74 20  ion where.** it 
6e20: 77 61 73 20 6c 61 73 74 20 70 6c 61 63 65 64 2c  was last placed,
6e30: 20 6f 72 20 68 61 73 20 62 65 65 6e 20 69 6e 76   or has been inv
6e40: 61 6c 69 64 61 74 65 64 20 66 6f 72 20 61 6e 79  alidated for any
6e50: 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2e 0a 2a   other reason..*
6e60: 2a 20 43 75 72 73 6f 72 73 20 63 61 6e 20 6d 6f  * Cursors can mo
6e70: 76 65 20 77 68 65 6e 20 74 68 65 20 72 6f 77 20  ve when the row 
6e80: 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74 69 6e  they are pointin
6e90: 67 20 61 74 20 69 73 20 64 65 6c 65 74 65 64 20  g at is deleted 
6ea0: 6f 75 74 0a 2a 2a 20 66 72 6f 6d 20 75 6e 64 65  out.** from unde
6eb0: 72 20 74 68 65 6d 2c 20 66 6f 72 20 65 78 61 6d  r them, for exam
6ec0: 70 6c 65 2e 20 20 43 75 72 73 6f 72 20 6d 69 67  ple.  Cursor mig
6ed0: 68 74 20 61 6c 73 6f 20 6d 6f 76 65 20 69 66 20  ht also move if 
6ee0: 61 20 62 74 72 65 65 0a 2a 2a 20 69 73 20 72 65  a btree.** is re
6ef0: 62 61 6c 61 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20  balanced..**.** 
6f00: 43 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  Calling this rou
6f10: 74 69 6e 65 20 77 69 74 68 20 61 20 4e 55 4c 4c  tine with a NULL
6f20: 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 65 72 20   cursor pointer 
6f30: 72 65 74 75 72 6e 73 20 66 61 6c 73 65 2e 0a 2a  returns false..*
6f40: 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 65 70  *.** Use the sep
6f50: 61 72 61 74 65 20 73 71 6c 69 74 65 33 42 74 72  arate sqlite3Btr
6f60: 65 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28  eeCursorRestore(
6f70: 29 20 72 6f 75 74 69 6e 65 20 74 6f 20 72 65 73  ) routine to res
6f80: 74 6f 72 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a  tore a cursor.**
6f90: 20 62 61 63 6b 20 74 6f 20 77 68 65 72 65 20 69   back to where i
6fa0: 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20 69 66  t ought to be if
6fb0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
6fc0: 74 75 72 6e 73 20 74 72 75 65 2e 0a 2a 2f 0a 69  turns true..*/.i
6fd0: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
6fe0: 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 42 74  ursorHasMoved(Bt
6ff0: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
7000: 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 65 53   return pCur->eS
7010: 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
7020: 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ID;.}../*.** Thi
7030: 73 20 72 6f 75 74 69 6e 65 20 72 65 73 74 6f 72  s routine restor
7040: 65 73 20 61 20 63 75 72 73 6f 72 20 62 61 63 6b  es a cursor back
7050: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
7060: 20 70 6f 73 69 74 69 6f 6e 20 61 66 74 65 72 20   position after 
7070: 69 74 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d  it.** has been m
7080: 6f 76 65 64 20 62 79 20 73 6f 6d 65 20 6f 75 74  oved by some out
7090: 73 69 64 65 20 61 63 74 69 76 69 74 79 20 28 73  side activity (s
70a0: 75 63 68 20 61 73 20 61 20 62 74 72 65 65 20 72  uch as a btree r
70b0: 65 62 61 6c 61 6e 63 65 20 6f 72 0a 2a 2a 20 61  ebalance or.** a
70c0: 20 72 6f 77 20 68 61 76 69 6e 67 20 62 65 65 6e   row having been
70d0: 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f   deleted out fro
70e0: 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73  m under the curs
70f0: 6f 72 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 4f 6e 20  or).  .**.** On 
7100: 73 75 63 63 65 73 73 2c 20 74 68 65 20 2a 70 44  success, the *pD
7110: 69 66 66 65 72 65 6e 74 52 6f 77 20 70 61 72 61  ifferentRow para
7120: 6d 65 74 65 72 20 69 73 20 66 61 6c 73 65 20 69  meter is false i
7130: 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
7140: 6c 65 66 74 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67  left.** pointing
7150: 20 61 74 20 65 78 61 63 74 6c 79 20 74 68 65 20   at exactly the 
7160: 73 61 6d 65 20 72 6f 77 2e 20 20 2a 70 44 69 66  same row.  *pDif
7170: 66 65 72 6e 74 52 6f 77 20 69 73 20 74 68 65 20  ferntRow is the 
7180: 72 6f 77 20 74 68 65 20 63 75 72 73 6f 72 0a 2a  row the cursor.*
7190: 2a 20 77 61 73 20 70 6f 69 6e 74 69 6e 67 20 74  * was pointing t
71a0: 6f 20 68 61 73 20 62 65 65 6e 20 64 65 6c 65 74  o has been delet
71b0: 65 64 2c 20 66 6f 72 63 69 6e 67 20 74 68 65 20  ed, forcing the 
71c0: 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20  cursor to point 
71d0: 74 6f 20 73 6f 6d 65 0a 2a 2a 20 6e 65 61 72 62  to some.** nearb
71e0: 79 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  y row..**.** Thi
71f0: 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
7200: 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20   only be called 
7210: 66 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68 61  for a cursor tha
7220: 74 20 6a 75 73 74 20 72 65 74 75 72 6e 65 64 0a  t just returned.
7230: 2a 2a 20 54 52 55 45 20 66 72 6f 6d 20 73 71 6c  ** TRUE from sql
7240: 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48  ite3BtreeCursorH
7250: 61 73 4d 6f 76 65 64 28 29 2e 0a 2a 2f 0a 69 6e  asMoved()..*/.in
7260: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
7270: 72 73 6f 72 52 65 73 74 6f 72 65 28 42 74 43 75  rsorRestore(BtCu
7280: 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
7290: 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77 29 7b  *pDifferentRow){
72a0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
72b0: 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 29 3b  sert( pCur!=0 );
72c0: 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
72d0: 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
72e0: 56 41 4c 49 44 20 29 3b 0a 20 20 72 63 20 3d 20  VALID );.  rc = 
72f0: 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
7300: 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
7310: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 44  f( rc ){.    *pD
7320: 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b  ifferentRow = 1;
7330: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
7340: 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e    }.  if( pCur->
7350: 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
7360: 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 44 69  ALID ){.    *pDi
7370: 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a  fferentRow = 1;.
7380: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
7390: 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e  ert( pCur->skipN
73a0: 65 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70  ext==0 );.    *p
73b0: 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 30  DifferentRow = 0
73c0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
73d0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
73e0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
73f0: 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 2f  E_CURSOR_HINTS./
7400: 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20 68 69 6e  *.** Provide hin
7410: 74 73 20 74 6f 20 74 68 65 20 63 75 72 73 6f 72  ts to the cursor
7420: 2e 20 20 54 68 65 20 70 61 72 74 69 63 75 6c 61  .  The particula
7430: 72 20 68 69 6e 74 20 67 69 76 65 6e 20 28 61 6e  r hint given (an
7440: 64 20 74 68 65 20 74 79 70 65 0a 2a 2a 20 61 6e  d the type.** an
7450: 64 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  d number of the 
7460: 76 61 72 61 72 67 73 20 70 61 72 61 6d 65 74 65  varargs paramete
7470: 72 73 29 20 69 73 20 64 65 74 65 72 6d 69 6e 65  rs) is determine
7480: 64 20 62 79 20 74 68 65 20 65 48 69 6e 74 54 79  d by the eHintTy
7490: 70 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 2e  pe.** parameter.
74a0: 20 20 53 65 65 20 74 68 65 20 64 65 66 69 6e 69    See the defini
74b0: 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 42 54 52  tions of the BTR
74c0: 45 45 5f 48 49 4e 54 5f 2a 20 6d 61 63 72 6f 73  EE_HINT_* macros
74d0: 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f   for details..*/
74e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
74f0: 65 65 43 75 72 73 6f 72 48 69 6e 74 28 42 74 43  eeCursorHint(BtC
7500: 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
7510: 20 65 48 69 6e 74 54 79 70 65 2c 20 2e 2e 2e 29   eHintType, ...)
7520: 7b 0a 20 20 2f 2a 20 55 73 65 64 20 6f 6e 6c 79  {.  /* Used only
7530: 20 62 79 20 73 79 73 74 65 6d 20 74 68 61 74 20   by system that 
7540: 73 75 62 73 74 69 74 75 74 65 20 74 68 65 69 72  substitute their
7550: 20 6f 77 6e 20 73 74 6f 72 61 67 65 20 65 6e 67   own storage eng
7560: 69 6e 65 20 2a 2f 0a 7d 0a 23 65 6e 64 69 66 0a  ine */.}.#endif.
7570: 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20 66  ./*.** Provide f
7580: 6c 61 67 20 68 69 6e 74 73 20 74 6f 20 74 68 65  lag hints to the
7590: 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 76 6f 69 64   cursor..*/.void
75a0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
75b0: 73 6f 72 48 69 6e 74 46 6c 61 67 73 28 42 74 43  sorHintFlags(BtC
75c0: 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 6e 73  ursor *pCur, uns
75d0: 69 67 6e 65 64 20 78 29 7b 0a 20 20 61 73 73 65  igned x){.  asse
75e0: 72 74 28 20 78 3d 3d 42 54 52 45 45 5f 53 45 45  rt( x==BTREE_SEE
75f0: 4b 5f 45 51 20 7c 7c 20 78 3d 3d 42 54 52 45 45  K_EQ || x==BTREE
7600: 5f 42 55 4c 4b 4c 4f 41 44 20 7c 7c 20 78 3d 3d  _BULKLOAD || x==
7610: 30 20 29 3b 0a 20 20 70 43 75 72 2d 3e 68 69 6e  0 );.  pCur->hin
7620: 74 73 20 3d 20 78 3b 0a 7d 0a 0a 0a 23 69 66 6e  ts = x;.}...#ifn
7630: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7640: 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  AUTOVACUUM./*.**
7650: 20 47 69 76 65 6e 20 61 20 70 61 67 65 20 6e 75   Given a page nu
7660: 6d 62 65 72 20 6f 66 20 61 20 72 65 67 75 6c 61  mber of a regula
7670: 72 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c  r database page,
7680: 20 72 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   return the page
7690: 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  .** number for t
76a0: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  he pointer-map p
76b0: 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
76c0: 73 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20  s the entry for 
76d0: 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67  the.** input pag
76e0: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20  e number..**.** 
76f0: 52 65 74 75 72 6e 20 30 20 28 6e 6f 74 20 61 20  Return 0 (not a 
7700: 76 61 6c 69 64 20 70 61 67 65 29 20 66 6f 72 20  valid page) for 
7710: 70 67 6e 6f 3d 3d 31 20 73 69 6e 63 65 20 74 68  pgno==1 since th
7720: 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f 69  ere is.** no poi
7730: 6e 74 65 72 20 6d 61 70 20 61 73 73 6f 63 69 61  nter map associa
7740: 74 65 64 20 77 69 74 68 20 70 61 67 65 20 31 2e  ted with page 1.
7750: 20 20 54 68 65 20 69 6e 74 65 67 72 69 74 79 5f    The integrity_
7760: 63 68 65 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20 72  check logic.** r
7770: 65 71 75 69 72 65 73 20 74 68 61 74 20 70 74 72  equires that ptr
7780: 6d 61 70 50 61 67 65 6e 6f 28 2a 2c 31 29 21 3d  mapPageno(*,1)!=
7790: 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e  1..*/.static Pgn
77a0: 6f 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 42  o ptrmapPageno(B
77b0: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
77c0: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  no pgno){.  int 
77d0: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
77e0: 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 4d 61 70  ;.  Pgno iPtrMap
77f0: 2c 20 72 65 74 3b 0a 20 20 61 73 73 65 72 74 28  , ret;.  assert(
7800: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
7810: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
7820: 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3c 32 20  );.  if( pgno<2 
7830: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 50  ) return 0;.  nP
7840: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 20 3d  agesPerMapPage =
7850: 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a   (pBt->usableSiz
7860: 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61  e/5)+1;.  iPtrMa
7870: 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61  p = (pgno-2)/nPa
7880: 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20  gesPerMapPage;. 
7890: 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70 2a   ret = (iPtrMap*
78a0: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
78b0: 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72 65  ) + 2; .  if( re
78c0: 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  t==PENDING_BYTE_
78d0: 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
78e0: 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65   ret++;.  }.  re
78f0: 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a  turn ret;.}../*.
7900: 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74 72  ** Write an entr
7910: 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  y into the point
7920: 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  er map..**.** Th
7930: 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61 74  is routine updat
7940: 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  es the pointer m
7950: 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67  ap entry for pag
7960: 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a  e number 'key'.*
7970: 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61 70  * so that it map
7980: 73 20 74 6f 20 74 79 70 65 20 27 65 54 79 70 65  s to type 'eType
7990: 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67  ' and parent pag
79a0: 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e  e number 'pgno'.
79b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 43 20 69  .**.** If *pRC i
79c0: 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d  s initially non-
79d0: 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54 45  zero (non-SQLITE
79e0: 5f 4f 4b 29 20 74 68 65 6e 20 74 68 69 73 20 72  _OK) then this r
79f0: 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 61 20 6e  outine is.** a n
7a00: 6f 2d 6f 70 2e 20 20 49 66 20 61 6e 20 65 72 72  o-op.  If an err
7a10: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 61  or occurs, the a
7a20: 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
7a30: 20 63 6f 64 65 20 69 73 20 77 72 69 74 74 65 6e   code is written
7a40: 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52 43 2e 0a 2a  .** into *pRC..*
7a50: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 74  /.static void pt
7a60: 72 6d 61 70 50 75 74 28 42 74 53 68 61 72 65 64  rmapPut(BtShared
7a70: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c   *pBt, Pgno key,
7a80: 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e 6f 20   u8 eType, Pgno 
7a90: 70 61 72 65 6e 74 2c 20 69 6e 74 20 2a 70 52 43  parent, int *pRC
7aa0: 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  ){.  DbPage *pDb
7ab0: 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f  Page;  /* The po
7ac0: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
7ad0: 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b  /.  u8 *pPtrmap;
7ae0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69        /* The poi
7af0: 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a 2f  nter map data */
7b00: 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b  .  Pgno iPtrmap;
7b10: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e       /* The poin
7b20: 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75 6d  ter map page num
7b30: 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66  ber */.  int off
7b40: 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66  set;       /* Of
7b50: 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72 20  fset in pointer 
7b60: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  map page */.  in
7b70: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
7b80: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66  /* Return code f
7b90: 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73  rom subfunctions
7ba0: 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20   */..  if( *pRC 
7bb0: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73  ) return;..  ass
7bc0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
7bd0: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
7be0: 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20  ex) );.  /* The 
7bf0: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70  master-journal p
7c00: 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20  age number must 
7c10: 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 61 73  never be used as
7c20: 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70   a pointer map p
7c30: 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  age */.  assert(
7c40: 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41 47   0==PTRMAP_ISPAG
7c50: 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42  E(pBt, PENDING_B
7c60: 59 54 45 5f 50 41 47 45 28 70 42 74 29 29 20 29  YTE_PAGE(pBt)) )
7c70: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  ;..  assert( pBt
7c80: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a  ->autoVacuum );.
7c90: 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a    if( key==0 ){.
7ca0: 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54      *pRC = SQLIT
7cb0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
7cc0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
7cd0: 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d    iPtrmap = PTRM
7ce0: 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b  AP_PAGENO(pBt, k
7cf0: 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ey);.  rc = sqli
7d00: 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d  te3PagerGet(pBt-
7d10: 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70  >pPager, iPtrmap
7d20: 2c 20 26 70 44 62 50 61 67 65 2c 20 30 29 3b 0a  , &pDbPage, 0);.
7d30: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
7d40: 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20  _OK ){.    *pRC 
7d50: 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e  = rc;.    return
7d60: 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d  ;.  }.  offset =
7d70: 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45   PTRMAP_PTROFFSE
7d80: 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b  T(iPtrmap, key);
7d90: 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 30 20  .  if( offset<0 
7da0: 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51  ){.    *pRC = SQ
7db0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
7dc0: 54 3b 0a 20 20 20 20 67 6f 74 6f 20 70 74 72 6d  T;.    goto ptrm
7dd0: 61 70 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 61  ap_exit;.  }.  a
7de0: 73 73 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d  ssert( offset <=
7df0: 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c   (int)pBt->usabl
7e00: 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20 70 50 74  eSize-5 );.  pPt
7e10: 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c  rmap = (u8 *)sql
7e20: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
7e30: 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 69 66  (pDbPage);..  if
7e40: 28 20 65 54 79 70 65 21 3d 70 50 74 72 6d 61 70  ( eType!=pPtrmap
7e50: 5b 6f 66 66 73 65 74 5d 20 7c 7c 20 67 65 74 34  [offset] || get4
7e60: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
7e70: 66 73 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74  fset+1])!=parent
7e80: 20 29 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22   ){.    TRACE(("
7e90: 50 54 52 4d 41 50 5f 55 50 44 41 54 45 3a 20 25  PTRMAP_UPDATE: %
7ea0: 64 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b  d->(%d,%d)\n", k
7eb0: 65 79 2c 20 65 54 79 70 65 2c 20 70 61 72 65 6e  ey, eType, paren
7ec0: 74 29 29 3b 0a 20 20 20 20 2a 70 52 43 3d 20 72  t));.    *pRC= r
7ed0: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
7ee0: 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a  Write(pDbPage);.
7ef0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
7f00: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
7f10: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d  Ptrmap[offset] =
7f20: 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 70 75   eType;.      pu
7f30: 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b  t4byte(&pPtrmap[
7f40: 6f 66 66 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e  offset+1], paren
7f50: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 70  t);.    }.  }..p
7f60: 74 72 6d 61 70 5f 65 78 69 74 3a 0a 20 20 73 71  trmap_exit:.  sq
7f70: 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
7f80: 70 44 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a  pDbPage);.}../*.
7f90: 2a 2a 20 52 65 61 64 20 61 6e 20 65 6e 74 72 79  ** Read an entry
7fa0: 20 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65   from the pointe
7fb0: 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  r map..**.** Thi
7fc0: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 72 69 65  s routine retrie
7fd0: 76 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ves the pointer 
7fe0: 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61  map entry for pa
7ff0: 67 65 20 27 6b 65 79 27 2c 20 77 72 69 74 69 6e  ge 'key', writin
8000: 67 0a 2a 2a 20 74 68 65 20 74 79 70 65 20 61 6e  g.** the type an
8010: 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75  d parent page nu
8020: 6d 62 65 72 20 74 6f 20 2a 70 45 54 79 70 65 20  mber to *pEType 
8030: 61 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73 70 65  and *pPgno respe
8040: 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65  ctively..** An e
8050: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
8060: 75 72 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69  urned if somethi
8070: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f  ng goes wrong, o
8080: 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f  therwise SQLITE_
8090: 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
80a0: 74 20 70 74 72 6d 61 70 47 65 74 28 42 74 53 68  t ptrmapGet(BtSh
80b0: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
80c0: 6b 65 79 2c 20 75 38 20 2a 70 45 54 79 70 65 2c  key, u8 *pEType,
80d0: 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20   Pgno *pPgno){. 
80e0: 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
80f0: 3b 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74  ;   /* The point
8100: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
8110: 20 69 6e 74 20 69 50 74 72 6d 61 70 3b 20 20 20   int iPtrmap;   
8120: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
8130: 61 70 20 70 61 67 65 20 69 6e 64 65 78 20 2a 2f  ap page index */
8140: 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20  .  u8 *pPtrmap; 
8150: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
8160: 20 6d 61 70 20 70 61 67 65 20 64 61 74 61 20 2a   map page data *
8170: 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20  /.  int offset; 
8180: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
8190: 20 6f 66 20 65 6e 74 72 79 20 69 6e 20 70 6f 69   of entry in poi
81a0: 6e 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e  nter map */.  in
81b0: 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
81c0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
81d0: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
81e0: 29 3b 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d 20  );..  iPtrmap = 
81f0: 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
8200: 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20  t, key);.  rc = 
8210: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
8220: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74  pBt->pPager, iPt
8230: 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 2c 20  rmap, &pDbPage, 
8240: 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20  0);.  if( rc!=0 
8250: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
8260: 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61 70 20  ;.  }.  pPtrmap 
8270: 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50  = (u8 *)sqlite3P
8280: 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
8290: 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65 74 20  age);..  offset 
82a0: 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53  = PTRMAP_PTROFFS
82b0: 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29  ET(iPtrmap, key)
82c0: 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 30  ;.  if( offset<0
82d0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   ){.    sqlite3P
82e0: 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
82f0: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e);.    return S
8300: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
8310: 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  PT;.  }.  assert
8320: 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e 74  ( offset <= (int
8330: 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
8340: 2d 35 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  -5 );.  assert( 
8350: 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20 20 2a  pEType!=0 );.  *
8360: 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d 61 70  pEType = pPtrmap
8370: 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66 28 20  [offset];.  if( 
8380: 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20 3d  pPgno ) *pPgno =
8390: 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d   get4byte(&pPtrm
83a0: 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a 0a  ap[offset+1]);..
83b0: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
83c0: 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
83d0: 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20 7c 7c  if( *pEType<1 ||
83e0: 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72 65 74   *pEType>5 ) ret
83f0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
8400: 50 54 5f 50 47 4e 4f 28 69 50 74 72 6d 61 70 29  PT_PGNO(iPtrmap)
8410: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
8420: 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f  E_OK;.}..#else /
8430: 2a 20 69 66 20 64 65 66 69 6e 65 64 20 53 51 4c  * if defined SQL
8440: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
8450: 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65  UUM */.  #define
8460: 20 70 74 72 6d 61 70 50 75 74 28 77 2c 78 2c 79   ptrmapPut(w,x,y
8470: 2c 7a 2c 72 63 29 0a 20 20 23 64 65 66 69 6e 65  ,z,rc).  #define
8480: 20 70 74 72 6d 61 70 47 65 74 28 77 2c 78 2c 79   ptrmapGet(w,x,y
8490: 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  ,z) SQLITE_OK.  
84a0: 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75  #define ptrmapPu
84b0: 74 4f 76 66 6c 50 74 72 28 78 2c 20 79 2c 20 72  tOvflPtr(x, y, r
84c0: 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  c).#endif../*.**
84d0: 20 47 69 76 65 6e 20 61 20 62 74 72 65 65 20 70   Given a btree p
84e0: 61 67 65 20 61 6e 64 20 61 20 63 65 6c 6c 20 69  age and a cell i
84f0: 6e 64 65 78 20 28 30 20 6d 65 61 6e 73 20 74 68  ndex (0 means th
8500: 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a  e first cell on.
8510: 2a 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20 6d  ** the page, 1 m
8520: 65 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64 20  eans the second 
8530: 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72  cell, and so for
8540: 74 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f 69  th) return a poi
8550: 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63  nter.** to the c
8560: 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a  ell content..**.
8570: 2a 2a 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50  ** findCellPastP
8580: 74 72 28 29 20 64 6f 65 73 20 74 68 65 20 73 61  tr() does the sa
8590: 6d 65 20 65 78 63 65 70 74 20 69 74 20 73 6b 69  me except it ski
85a0: 70 73 20 70 61 73 74 20 74 68 65 20 69 6e 69 74  ps past the init
85b0: 69 61 6c 0a 2a 2a 20 34 2d 62 79 74 65 20 63 68  ial.** 4-byte ch
85c0: 69 6c 64 20 70 6f 69 6e 74 65 72 20 66 6f 75 6e  ild pointer foun
85d0: 64 20 6f 6e 20 69 6e 74 65 72 69 6f 72 20 70 61  d on interior pa
85e0: 67 65 73 2c 20 69 66 20 74 68 65 72 65 20 69 73  ges, if there is
85f0: 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   one..**.** This
8600: 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f   routine works o
8610: 6e 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74 68  nly for pages th
8620: 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69  at do not contai
8630: 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  n overflow cells
8640: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69 6e  ..*/.#define fin
8650: 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20 28  dCell(P,I) \.  (
8660: 28 50 29 2d 3e 61 44 61 74 61 20 2b 20 28 28 50  (P)->aData + ((P
8670: 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65  )->maskPage & ge
8680: 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28 26 28  t2byteAligned(&(
8690: 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28  P)->aCellIdx[2*(
86a0: 49 29 5d 29 29 29 0a 23 64 65 66 69 6e 65 20 66  I)]))).#define f
86b0: 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28 50  indCellPastPtr(P
86c0: 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44  ,I) \.  ((P)->aD
86d0: 61 74 61 4f 66 73 74 20 2b 20 28 28 50 29 2d 3e  ataOfst + ((P)->
86e0: 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74 32 62  maskPage & get2b
86f0: 79 74 65 41 6c 69 67 6e 65 64 28 26 28 50 29 2d  yteAligned(&(P)-
8700: 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d  >aCellIdx[2*(I)]
8710: 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ))).../*.** This
8720: 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 61 69 6c 20   is common tail 
8730: 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 62  processing for b
8740: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
8750: 28 29 20 61 6e 64 0a 2a 2a 20 62 74 72 65 65 50  () and.** btreeP
8760: 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78  arseCellPtrIndex
8770: 28 29 20 66 6f 72 20 74 68 65 20 63 61 73 65 20  () for the case 
8780: 77 68 65 6e 20 74 68 65 20 63 65 6c 6c 20 64 6f  when the cell do
8790: 65 73 20 6e 6f 74 20 66 69 74 20 65 6e 74 69 72  es not fit entir
87a0: 65 6c 79 0a 2a 2a 20 6f 6e 20 61 20 73 69 6e 67  ely.** on a sing
87b0: 6c 65 20 42 2d 74 72 65 65 20 70 61 67 65 2e 20  le B-tree page. 
87c0: 20 4d 61 6b 65 20 6e 65 63 65 73 73 61 72 79 20   Make necessary 
87d0: 61 64 6a 75 73 74 6d 65 6e 74 73 20 74 6f 20 74  adjustments to t
87e0: 68 65 20 43 65 6c 6c 49 6e 66 6f 0a 2a 2a 20 73  he CellInfo.** s
87f0: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
8800: 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
8810: 49 4e 45 20 76 6f 69 64 20 62 74 72 65 65 50 61  INE void btreePa
8820: 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a  rseCellAdjustSiz
8830: 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 0a 20 20  eForOverflow(.  
8840: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
8850: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
8860: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
8870: 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  ell */.  u8 *pCe
8880: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
8890: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
88a0: 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f  he cell text. */
88b0: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e  .  CellInfo *pIn
88c0: 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  fo         /* Fi
88d0: 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ll in this struc
88e0: 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20  ture */.){.  /* 
88f0: 49 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20 77  If the payload w
8900: 69 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70  ill not fit comp
8910: 6c 65 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f  letely on the lo
8920: 63 61 6c 20 70 61 67 65 2c 20 77 65 20 68 61 76  cal page, we hav
8930: 65 0a 20 20 2a 2a 20 74 6f 20 64 65 63 69 64 65  e.  ** to decide
8940: 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74 6f   how much to sto
8950: 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68  re locally and h
8960: 6f 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c  ow much to spill
8970: 20 6f 6e 74 6f 0a 20 20 2a 2a 20 6f 76 65 72 66   onto.  ** overf
8980: 6c 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65 20  low pages.  The 
8990: 73 74 72 61 74 65 67 79 20 69 73 20 74 6f 20 6d  strategy is to m
89a0: 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75  inimize the amou
89b0: 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20 2a  nt of unused.  *
89c0: 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76 65 72 66  * space on overf
89d0: 6c 6f 77 20 70 61 67 65 73 20 77 68 69 6c 65 20  low pages while 
89e0: 6b 65 65 70 69 6e 67 20 74 68 65 20 61 6d 6f 75  keeping the amou
89f0: 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72  nt of local stor
8a00: 61 67 65 0a 20 20 2a 2a 20 69 6e 20 62 65 74 77  age.  ** in betw
8a10: 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64  een minLocal and
8a20: 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 2a 2a 0a   maxLocal..  **.
8a30: 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63    ** Warning:  c
8a40: 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61 79 20  hanging the way 
8a50: 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64  overflow payload
8a60: 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64 20   is distributed 
8a70: 69 6e 20 61 6e 79 0a 20 20 2a 2a 20 77 61 79 20  in any.  ** way 
8a80: 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61  will result in a
8a90: 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66  n incompatible f
8aa0: 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 20 20 2a 2f  ile format..  */
8ab0: 0a 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b  .  int minLocal;
8ac0: 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f    /* Minimum amo
8ad0: 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68  unt of payload h
8ae0: 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20  eld locally */. 
8af0: 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20   int maxLocal;  
8b00: 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e  /* Maximum amoun
8b10: 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c  t of payload hel
8b20: 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 69  d locally */.  i
8b30: 6e 74 20 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a  nt surplus;   /*
8b40: 20 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61   Overflow payloa
8b50: 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  d available for 
8b60: 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f  local storage */
8b70: 0a 0a 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70  ..  minLocal = p
8b80: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a  Page->minLocal;.
8b90: 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61    maxLocal = pPa
8ba0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20  ge->maxLocal;.  
8bb0: 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63  surplus = minLoc
8bc0: 61 6c 20 2b 20 28 70 49 6e 66 6f 2d 3e 6e 50 61  al + (pInfo->nPa
8bd0: 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c  yload - minLocal
8be0: 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  )%(pPage->pBt->u
8bf0: 73 61 62 6c 65 53 69 7a 65 2d 34 29 3b 0a 20 20  sableSize-4);.  
8c00: 74 65 73 74 63 61 73 65 28 20 73 75 72 70 6c 75  testcase( surplu
8c10: 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  s==maxLocal );. 
8c20: 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70 6c   testcase( surpl
8c30: 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20 29  us==maxLocal+1 )
8c40: 3b 0a 20 20 69 66 28 20 73 75 72 70 6c 75 73 20  ;.  if( surplus 
8c50: 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  <= maxLocal ){. 
8c60: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c     pInfo->nLocal
8c70: 20 3d 20 28 75 31 36 29 73 75 72 70 6c 75 73 3b   = (u16)surplus;
8c80: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
8c90: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75  nfo->nLocal = (u
8ca0: 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d  16)minLocal;.  }
8cb0: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20  .  pInfo->nSize 
8cc0: 3d 20 28 75 31 36 29 28 26 70 49 6e 66 6f 2d 3e  = (u16)(&pInfo->
8cd0: 70 50 61 79 6c 6f 61 64 5b 70 49 6e 66 6f 2d 3e  pPayload[pInfo->
8ce0: 6e 4c 6f 63 61 6c 5d 20 2d 20 70 43 65 6c 6c 29  nLocal] - pCell)
8cf0: 20 2b 20 34 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   + 4;.}../*.** T
8d00: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
8d10: 74 69 6e 65 73 20 61 72 65 20 69 6d 70 6c 65 6d  tines are implem
8d20: 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68 65  entations of the
8d30: 20 4d 65 6d 50 61 67 65 2e 78 50 61 72 73 65 43   MemPage.xParseC
8d40: 65 6c 6c 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 2e  ell().** method.
8d50: 0a 2a 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20 63  .**.** Parse a c
8d60: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63  ell content bloc
8d70: 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68  k and fill in th
8d80: 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63  e CellInfo struc
8d90: 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 62 74 72 65  ture..**.** btre
8da0: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20  eParseCellPtr() 
8db0: 20 20 20 20 20 20 20 3d 3e 20 20 20 74 61 62 6c         =>   tabl
8dc0: 65 20 62 74 72 65 65 20 6c 65 61 66 20 6e 6f 64  e btree leaf nod
8dd0: 65 73 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65  es.** btreeParse
8de0: 43 65 6c 6c 4e 6f 50 61 79 6c 6f 61 64 28 29 20  CellNoPayload() 
8df0: 20 3d 3e 20 20 20 74 61 62 6c 65 20 62 74 72 65   =>   table btre
8e00: 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73  e internal nodes
8e10: 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65  .** btreeParseCe
8e20: 6c 6c 50 74 72 49 6e 64 65 78 28 29 20 20 20 3d  llPtrIndex()   =
8e30: 3e 20 20 20 69 6e 64 65 78 20 62 74 72 65 65 20  >   index btree 
8e40: 6e 6f 64 65 73 0a 2a 2a 0a 2a 2a 20 54 68 65 72  nodes.**.** Ther
8e50: 65 20 69 73 20 61 6c 73 6f 20 61 20 77 72 61 70  e is also a wrap
8e60: 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 62 74 72  per function btr
8e70: 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 68  eeParseCell() th
8e80: 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20  at works for.** 
8e90: 61 6c 6c 20 4d 65 6d 50 61 67 65 20 74 79 70 65  all MemPage type
8ea0: 73 20 61 6e 64 20 74 68 61 74 20 72 65 66 65 72  s and that refer
8eb0: 65 6e 63 65 73 20 74 68 65 20 63 65 6c 6c 20 62  ences the cell b
8ec0: 79 20 69 6e 64 65 78 20 72 61 74 68 65 72 20 74  y index rather t
8ed0: 68 61 6e 0a 2a 2a 20 62 79 20 70 6f 69 6e 74 65  han.** by pointe
8ee0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
8ef0: 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  d btreeParseCell
8f00: 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 0a 20 20  PtrNoPayload(.  
8f10: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
8f20: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
8f30: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
8f40: 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  ell */.  u8 *pCe
8f50: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
8f60: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
8f70: 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f  he cell text. */
8f80: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e  .  CellInfo *pIn
8f90: 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  fo         /* Fi
8fa0: 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ll in this struc
8fb0: 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73  ture */.){.  ass
8fc0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
8fd0: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
8fe0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
8ff0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c  assert( pPage->l
9000: 65 61 66 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  eaf==0 );.  asse
9010: 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  rt( pPage->child
9020: 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 23 69  PtrSize==4 );.#i
9030: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  fndef SQLITE_DEB
9040: 55 47 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  UG.  UNUSED_PARA
9050: 4d 45 54 45 52 28 70 50 61 67 65 29 3b 0a 23 65  METER(pPage);.#e
9060: 6e 64 69 66 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53  ndif.  pInfo->nS
9070: 69 7a 65 20 3d 20 34 20 2b 20 67 65 74 56 61 72  ize = 4 + getVar
9080: 69 6e 74 28 26 70 43 65 6c 6c 5b 34 5d 2c 20 28  int(&pCell[4], (
9090: 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65  u64*)&pInfo->nKe
90a0: 79 29 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61  y);.  pInfo->nPa
90b0: 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 70 49 6e  yload = 0;.  pIn
90c0: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 30 3b 0a  fo->nLocal = 0;.
90d0: 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61    pInfo->pPayloa
90e0: 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b  d = 0;.  return;
90f0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  .}.static void b
9100: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
9110: 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
9120: 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ge,         /* P
9130: 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
9140: 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  he cell */.  u8 
9150: 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
9160: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
9170: 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74  to the cell text
9180: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
9190: 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f  *pInfo         /
91a0: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73  * Fill in this s
91b0: 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20  tructure */.){. 
91c0: 20 75 38 20 2a 70 49 74 65 72 3b 20 20 20 20 20   u8 *pIter;     
91d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
91e0: 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68  scanning through
91f0: 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 33 32 20   pCell */.  u32 
9200: 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20  nPayload;       
9210: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
9220: 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70   bytes of cell p
9230: 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 36 34 20  ayload */.  u64 
9240: 69 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20  iKey;           
9250: 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 65 64      /* Extracted
9260: 20 4b 65 79 20 76 61 6c 75 65 20 2a 2f 0a 0a 20   Key value */.. 
9270: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
9280: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
9290: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
92a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
92b0: 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50  e->leaf==0 || pP
92c0: 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a  age->leaf==1 );.
92d0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
92e0: 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 3b 0a 20  >intKeyLeaf );. 
92f0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
9300: 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 30 20  childPtrSize==0 
9310: 29 3b 0a 20 20 70 49 74 65 72 20 3d 20 70 43 65  );.  pIter = pCe
9320: 6c 6c 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65  ll;..  /* The ne
9330: 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65  xt block of code
9340: 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
9350: 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  o:.  **.  **    
9360: 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72   pIter += getVar
9370: 69 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 50 61  int32(pIter, nPa
9380: 79 6c 6f 61 64 29 3b 0a 20 20 2a 2a 0a 20 20 2a  yload);.  **.  *
9390: 2a 20 54 68 65 20 63 6f 64 65 20 69 73 20 69 6e  * The code is in
93a0: 6c 69 6e 65 64 20 74 6f 20 61 76 6f 69 64 20 61  lined to avoid a
93b0: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a   function call..
93c0: 20 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20    */.  nPayload 
93d0: 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20  = *pIter;.  if( 
93e0: 6e 50 61 79 6c 6f 61 64 3e 3d 30 78 38 30 20 29  nPayload>=0x80 )
93f0: 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d  {.    u8 *pEnd =
9400: 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20   &pIter[8];.    
9410: 6e 50 61 79 6c 6f 61 64 20 26 3d 20 30 78 37 66  nPayload &= 0x7f
9420: 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  ;.    do{.      
9430: 6e 50 61 79 6c 6f 61 64 20 3d 20 28 6e 50 61 79  nPayload = (nPay
9440: 6c 6f 61 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70  load<<7) | (*++p
9450: 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20  Iter & 0x7f);.  
9460: 20 20 7d 77 68 69 6c 65 28 20 28 2a 70 49 74 65    }while( (*pIte
9470: 72 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74 65  r)>=0x80 && pIte
9480: 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20  r<pEnd );.  }.  
9490: 70 49 74 65 72 2b 2b 3b 0a 0a 20 20 2f 2a 20 54  pIter++;..  /* T
94a0: 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66  he next block of
94b0: 20 63 6f 64 65 20 69 73 20 65 71 75 69 76 61 6c   code is equival
94c0: 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a  ent to:.  **.  *
94d0: 2a 20 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67  *     pIter += g
94e0: 65 74 56 61 72 69 6e 74 28 70 49 74 65 72 2c 20  etVarint(pIter, 
94f0: 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b  (u64*)&pInfo->nK
9500: 65 79 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ey);.  **.  ** T
9510: 68 65 20 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e  he code is inlin
9520: 65 64 20 74 6f 20 61 76 6f 69 64 20 61 20 66 75  ed to avoid a fu
9530: 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a  nction call..  *
9540: 2f 0a 20 20 69 4b 65 79 20 3d 20 2a 70 49 74 65  /.  iKey = *pIte
9550: 72 3b 0a 20 20 69 66 28 20 69 4b 65 79 3e 3d 30  r;.  if( iKey>=0
9560: 78 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70  x80 ){.    u8 *p
9570: 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 37 5d 3b  End = &pIter[7];
9580: 0a 20 20 20 20 69 4b 65 79 20 26 3d 20 30 78 37  .    iKey &= 0x7
9590: 66 3b 0a 20 20 20 20 77 68 69 6c 65 28 31 29 7b  f;.    while(1){
95a0: 0a 20 20 20 20 20 20 69 4b 65 79 20 3d 20 28 69  .      iKey = (i
95b0: 4b 65 79 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49  Key<<7) | (*++pI
95c0: 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20  ter & 0x7f);.   
95d0: 20 20 20 69 66 28 20 28 2a 70 49 74 65 72 29 3c     if( (*pIter)<
95e0: 30 78 38 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  0x80 ) break;.  
95f0: 20 20 20 20 69 66 28 20 70 49 74 65 72 3e 3d 70      if( pIter>=p
9600: 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 69  End ){.        i
9610: 4b 65 79 20 3d 20 28 69 4b 65 79 3c 3c 38 29 20  Key = (iKey<<8) 
9620: 7c 20 2a 2b 2b 70 49 74 65 72 3b 0a 20 20 20 20  | *++pIter;.    
9630: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
9640: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70   }.    }.  }.  p
9650: 49 74 65 72 2b 2b 3b 0a 0a 20 20 70 49 6e 66 6f  Iter++;..  pInfo
9660: 2d 3e 6e 4b 65 79 20 3d 20 2a 28 69 36 34 2a 29  ->nKey = *(i64*)
9670: 26 69 4b 65 79 3b 0a 20 20 70 49 6e 66 6f 2d 3e  &iKey;.  pInfo->
9680: 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c  nPayload = nPayl
9690: 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50  oad;.  pInfo->pP
96a0: 61 79 6c 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a  ayload = pIter;.
96b0: 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79    testcase( nPay
96c0: 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  load==pPage->max
96d0: 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63  Local );.  testc
96e0: 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70  ase( nPayload==p
96f0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31  Page->maxLocal+1
9700: 20 29 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f   );.  if( nPaylo
9710: 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad<=pPage->maxLo
9720: 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  cal ){.    /* Th
9730: 69 73 20 69 73 20 74 68 65 20 28 65 61 73 79 29  is is the (easy)
9740: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
9750: 72 65 20 74 68 65 20 65 6e 74 69 72 65 20 70 61  re the entire pa
9760: 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a  yload fits.    *
9770: 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  * on the local p
9780: 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f  age.  No overflo
9790: 77 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20  w is required.. 
97a0: 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d     */.    pInfo-
97b0: 3e 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61  >nSize = nPayloa
97c0: 64 20 2b 20 28 75 31 36 29 28 70 49 74 65 72 20  d + (u16)(pIter 
97d0: 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  - pCell);.    if
97e0: 28 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34  ( pInfo->nSize<4
97f0: 20 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20   ) pInfo->nSize 
9800: 3d 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  = 4;.    pInfo->
9810: 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e 50  nLocal = (u16)nP
9820: 61 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b  ayload;.  }else{
9830: 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43  .    btreeParseC
9840: 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f 72  ellAdjustSizeFor
9850: 4f 76 65 72 66 6c 6f 77 28 70 50 61 67 65 2c 20  Overflow(pPage, 
9860: 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20  pCell, pInfo);. 
9870: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
9880: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
9890: 74 72 49 6e 64 65 78 28 0a 20 20 4d 65 6d 50 61  trIndex(.  MemPa
98a0: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
98b0: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
98c0: 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a  ining the cell *
98d0: 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20  /.  u8 *pCell,  
98e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
98f0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65  ointer to the ce
9900: 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65  ll text. */.  Ce
9910: 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20  llInfo *pInfo   
9920: 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e        /* Fill in
9930: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
9940: 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 49 74 65  */.){.  u8 *pIte
9950: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
9960: 2f 2a 20 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20  /* For scanning 
9970: 74 68 72 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f  through pCell */
9980: 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b  .  u32 nPayload;
9990: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
99a0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
99b0: 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f   cell payload */
99c0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
99d0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
99e0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
99f0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
9a00: 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c  Page->leaf==0 ||
9a10: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20   pPage->leaf==1 
9a20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
9a30: 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 3d 3d  ge->intKeyLeaf==
9a40: 30 20 29 3b 0a 20 20 70 49 74 65 72 20 3d 20 70  0 );.  pIter = p
9a50: 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e 63 68  Cell + pPage->ch
9a60: 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 6e 50  ildPtrSize;.  nP
9a70: 61 79 6c 6f 61 64 20 3d 20 2a 70 49 74 65 72 3b  ayload = *pIter;
9a80: 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3e  .  if( nPayload>
9a90: 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 75 38 20  =0x80 ){.    u8 
9aa0: 2a 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 38  *pEnd = &pIter[8
9ab0: 5d 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20  ];.    nPayload 
9ac0: 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b  &= 0x7f;.    do{
9ad0: 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61 64 20  .      nPayload 
9ae0: 3d 20 28 6e 50 61 79 6c 6f 61 64 3c 3c 37 29 20  = (nPayload<<7) 
9af0: 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30 78  | (*++pIter & 0x
9b00: 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  7f);.    }while(
9b10: 20 2a 28 70 49 74 65 72 29 3e 3d 30 78 38 30 20   *(pIter)>=0x80 
9b20: 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b  && pIter<pEnd );
9b30: 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a  .  }.  pIter++;.
9b40: 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20    pInfo->nKey = 
9b50: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66  nPayload;.  pInf
9b60: 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50  o->nPayload = nP
9b70: 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d  ayload;.  pInfo-
9b80: 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70 49 74 65  >pPayload = pIte
9b90: 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  r;.  testcase( n
9ba0: 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e  Payload==pPage->
9bb0: 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65  maxLocal );.  te
9bc0: 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64  stcase( nPayload
9bd0: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
9be0: 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 50 61  l+1 );.  if( nPa
9bf0: 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61  yload<=pPage->ma
9c00: 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a  xLocal ){.    /*
9c10: 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65 61   This is the (ea
9c20: 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  sy) common case 
9c30: 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72 65  where the entire
9c40: 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20 20   payload fits.  
9c50: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61    ** on the loca
9c60: 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72  l page.  No over
9c70: 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65 64  flow is required
9c80: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e  ..    */.    pIn
9c90: 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50 61 79  fo->nSize = nPay
9ca0: 6c 6f 61 64 20 2b 20 28 75 31 36 29 28 70 49 74  load + (u16)(pIt
9cb0: 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20  er - pCell);.   
9cc0: 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a   if( pInfo->nSiz
9cd0: 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53 69  e<4 ) pInfo->nSi
9ce0: 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e 66  ze = 4;.    pInf
9cf0: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  o->nLocal = (u16
9d00: 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c  )nPayload;.  }el
9d10: 73 65 7b 0a 20 20 20 20 62 74 72 65 65 50 61 72  se{.    btreePar
9d20: 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65  seCellAdjustSize
9d30: 46 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50 61 67  ForOverflow(pPag
9d40: 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29  e, pCell, pInfo)
9d50: 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  ;.  }.}.static v
9d60: 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65  oid btreeParseCe
9d70: 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ll(.  MemPage *p
9d80: 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  Page,         /*
9d90: 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
9da0: 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69   the cell */.  i
9db0: 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20 20 20 20  nt iCell,       
9dc0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65         /* The ce
9dd0: 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69 72 73 74  ll index.  First
9de0: 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20   cell is 0 */.  
9df0: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
9e00: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
9e10: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
9e20: 65 20 2a 2f 0a 29 7b 0a 20 20 70 50 61 67 65 2d  e */.){.  pPage-
9e30: 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67  >xParseCell(pPag
9e40: 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  e, findCell(pPag
9e50: 65 2c 20 69 43 65 6c 6c 29 2c 20 70 49 6e 66 6f  e, iCell), pInfo
9e60: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
9e70: 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
9e80: 65 73 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74  es are implement
9e90: 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65  ations of the Me
9ea0: 6d 50 61 67 65 2e 78 43 65 6c 6c 53 69 7a 65 0a  mPage.xCellSize.
9eb0: 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a  ** method..**.**
9ec0: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74   Compute the tot
9ed0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  al number of byt
9ee0: 65 73 20 74 68 61 74 20 61 20 43 65 6c 6c 20 6e  es that a Cell n
9ef0: 65 65 64 73 20 69 6e 20 74 68 65 20 63 65 6c 6c  eeds in the cell
9f00: 0a 2a 2a 20 64 61 74 61 20 61 72 65 61 20 6f 66  .** data area of
9f10: 20 74 68 65 20 62 74 72 65 65 2d 70 61 67 65 2e   the btree-page.
9f20: 20 20 54 68 65 20 72 65 74 75 72 6e 20 6e 75 6d    The return num
9f30: 62 65 72 20 69 6e 63 6c 75 64 65 73 20 74 68 65  ber includes the
9f40: 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65   cell.** data he
9f50: 61 64 65 72 20 61 6e 64 20 74 68 65 20 6c 6f 63  ader and the loc
9f60: 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75 74 20  al payload, but 
9f70: 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77  not any overflow
9f80: 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20   page or.** the 
9f90: 73 70 61 63 65 20 75 73 65 64 20 62 79 20 74 68  space used by th
9fa0: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a  e cell pointer..
9fb0: 2a 2a 0a 2a 2a 20 63 65 6c 6c 53 69 7a 65 50 74  **.** cellSizePt
9fc0: 72 4e 6f 50 61 79 6c 6f 61 64 28 29 20 20 20 20  rNoPayload()    
9fd0: 3d 3e 20 20 20 74 61 62 6c 65 20 69 6e 74 65 72  =>   table inter
9fe0: 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20 63 65 6c  nal nodes.** cel
9ff0: 6c 53 69 7a 65 50 74 72 28 29 20 20 20 20 20 20  lSizePtr()      
a000: 20 20 20 20 20 20 20 3d 3e 20 20 20 61 6c 6c 20         =>   all 
a010: 69 6e 64 65 78 20 6e 6f 64 65 73 20 26 20 74 61  index nodes & ta
a020: 62 6c 65 20 6c 65 61 66 20 6e 6f 64 65 73 0a 2a  ble leaf nodes.*
a030: 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c  /.static u16 cel
a040: 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50 61 67 65  lSizePtr(MemPage
a050: 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65   *pPage, u8 *pCe
a060: 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72  ll){.  u8 *pIter
a070: 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67 65   = pCell + pPage
a080: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 20  ->childPtrSize; 
a090: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
a0a0: 76 65 72 20 62 79 74 65 73 20 6f 66 20 70 43 65  ver bytes of pCe
a0b0: 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64  ll */.  u8 *pEnd
a0c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0e0: 20 2f 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72   /* End mark for
a0f0: 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 20 20 75   a varint */.  u
a100: 33 32 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20  32 nSize;       
a110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a120: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
a130: 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  value to return 
a140: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
a150: 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65  E_DEBUG.  /* The
a160: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
a170: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
a180: 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62   should always b
a190: 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20  e the same as.  
a1a0: 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f  ** the (CellInfo
a1b0: 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f  .nSize) value fo
a1c0: 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66  und by doing a f
a1d0: 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65  ull parse of the
a1e0: 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53  .  ** cell. If S
a1f0: 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64  QLITE_DEBUG is d
a200: 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72  efined, an asser
a210: 74 28 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f  t() at the botto
a220: 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66  m of.  ** this f
a230: 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73  unction verifies
a240: 20 74 68 61 74 20 74 68 69 73 20 69 6e 76 61 72   that this invar
a250: 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c  iant is not viol
a260: 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  ated. */.  CellI
a270: 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20  nfo debuginfo;. 
a280: 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
a290: 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  ll(pPage, pCell,
a2a0: 20 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65   &debuginfo);.#e
a2b0: 6e 64 69 66 0a 0a 20 20 6e 53 69 7a 65 20 3d 20  ndif..  nSize = 
a2c0: 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 53  *pIter;.  if( nS
a2d0: 69 7a 65 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20  ize>=0x80 ){.   
a2e0: 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 38   pEnd = &pIter[8
a2f0: 5d 3b 0a 20 20 20 20 6e 53 69 7a 65 20 26 3d 20  ];.    nSize &= 
a300: 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20  0x7f;.    do{.  
a310: 20 20 20 20 6e 53 69 7a 65 20 3d 20 28 6e 53 69      nSize = (nSi
a320: 7a 65 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74  ze<<7) | (*++pIt
a330: 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20  er & 0x7f);.    
a340: 7d 77 68 69 6c 65 28 20 2a 28 70 49 74 65 72 29  }while( *(pIter)
a350: 3e 3d 30 78 38 30 20 26 26 20 70 49 74 65 72 3c  >=0x80 && pIter<
a360: 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49  pEnd );.  }.  pI
a370: 74 65 72 2b 2b 3b 0a 20 20 69 66 28 20 70 50 61  ter++;.  if( pPa
a380: 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
a390: 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77 20 70    /* pIter now p
a3a0: 6f 69 6e 74 73 20 61 74 20 74 68 65 20 36 34 2d  oints at the 64-
a3b0: 62 69 74 20 69 6e 74 65 67 65 72 20 6b 65 79 20  bit integer key 
a3c0: 76 61 6c 75 65 2c 20 61 20 76 61 72 69 61 62 6c  value, a variabl
a3d0: 65 20 6c 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a  e length .    **
a3e0: 20 69 6e 74 65 67 65 72 2e 20 54 68 65 20 66 6f   integer. The fo
a3f0: 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f  llowing block mo
a400: 76 65 73 20 70 49 74 65 72 20 74 6f 20 70 6f 69  ves pIter to poi
a410: 6e 74 20 61 74 20 74 68 65 20 66 69 72 73 74 20  nt at the first 
a420: 62 79 74 65 0a 20 20 20 20 2a 2a 20 70 61 73 74  byte.    ** past
a430: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
a440: 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20  key value. */.  
a450: 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b    pEnd = &pIter[
a460: 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  9];.    while( (
a470: 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20 26  *pIter++)&0x80 &
a480: 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a  & pIter<pEnd );.
a490: 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20    }.  testcase( 
a4a0: 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61  nSize==pPage->ma
a4b0: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74  xLocal );.  test
a4c0: 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61  case( nSize==pPa
a4d0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29  ge->maxLocal+1 )
a4e0: 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65 3c 3d 70  ;.  if( nSize<=p
a4f0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
a500: 7b 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20 28  {.    nSize += (
a510: 75 33 32 29 28 70 49 74 65 72 20 2d 20 70 43 65  u32)(pIter - pCe
a520: 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69  ll);.    if( nSi
a530: 7a 65 3c 34 20 29 20 6e 53 69 7a 65 20 3d 20 34  ze<4 ) nSize = 4
a540: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
a550: 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50  nt minLocal = pP
a560: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  age->minLocal;. 
a570: 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f     nSize = minLo
a580: 63 61 6c 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d  cal + (nSize - m
a590: 69 6e 4c 6f 63 61 6c 29 20 25 20 28 70 50 61 67  inLocal) % (pPag
a5a0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
a5b0: 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65 73  ze - 4);.    tes
a5c0: 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50  tcase( nSize==pP
a5d0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b  age->maxLocal );
a5e0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
a5f0: 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  Size==pPage->max
a600: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69  Local+1 );.    i
a610: 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e  f( nSize>pPage->
a620: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
a630: 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63    nSize = minLoc
a640: 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53  al;.    }.    nS
a650: 69 7a 65 20 2b 3d 20 34 20 2b 20 28 75 31 36 29  ize += 4 + (u16)
a660: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b  (pIter - pCell);
a670: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
a680: 53 69 7a 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e  Size==debuginfo.
a690: 6e 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54  nSize || CORRUPT
a6a0: 5f 44 42 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  _DB );.  return 
a6b0: 28 75 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a 73 74  (u16)nSize;.}.st
a6c0: 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a  atic u16 cellSiz
a6d0: 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 4d 65  ePtrNoPayload(Me
a6e0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
a6f0: 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a   *pCell){.  u8 *
a700: 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20  pIter = pCell + 
a710: 34 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e  4; /* For loopin
a720: 67 20 6f 76 65 72 20 62 79 74 65 73 20 6f 66 20  g over bytes of 
a730: 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70  pCell */.  u8 *p
a740: 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  End;            
a750: 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f    /* End mark fo
a760: 72 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 0a 23  r a varint */..#
a770: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
a780: 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75  UG.  /* The valu
a790: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
a7a0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  is function shou
a7b0: 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74 68 65  ld always be the
a7c0: 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68   same as.  ** th
a7d0: 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a  e (CellInfo.nSiz
a7e0: 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64 20 62  e) value found b
a7f0: 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70  y doing a full p
a800: 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a  arse of the.  **
a810: 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45   cell. If SQLITE
a820: 5f 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65  _DEBUG is define
a830: 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 61  d, an assert() a
a840: 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a  t the bottom of.
a850: 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69    ** this functi
a860: 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68 61 74  on verifies that
a870: 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e 74 20   this invariant 
a880: 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e  is not violated.
a890: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64   */.  CellInfo d
a8a0: 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70 50 61 67  ebuginfo;.  pPag
a8b0: 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50  e->xParseCell(pP
a8c0: 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62  age, pCell, &deb
a8d0: 75 67 69 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a 20  uginfo);.#else. 
a8e0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
a8f0: 52 28 70 50 61 67 65 29 3b 0a 23 65 6e 64 69 66  R(pPage);.#endif
a900: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
a910: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3d  e->childPtrSize=
a920: 3d 34 20 29 3b 0a 20 20 70 45 6e 64 20 3d 20 70  =4 );.  pEnd = p
a930: 49 74 65 72 20 2b 20 39 3b 0a 20 20 77 68 69 6c  Iter + 9;.  whil
a940: 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30 78  e( (*pIter++)&0x
a950: 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64  80 && pIter<pEnd
a960: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 65   );.  assert( de
a970: 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 28  buginfo.nSize==(
a980: 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65  u16)(pIter - pCe
a990: 6c 6c 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  ll) || CORRUPT_D
a9a0: 42 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75  B );.  return (u
a9b0: 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c  16)(pIter - pCel
a9c0: 6c 29 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53  l);.}...#ifdef S
a9d0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54  QLITE_DEBUG./* T
a9e0: 68 69 73 20 76 61 72 69 61 74 69 6f 6e 20 6f 6e  his variation on
a9f0: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 29 20 69   cellSizePtr() i
aa00: 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66  s used inside of
aa10: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
aa20: 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f  ents.** only. */
aa30: 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c  .static u16 cell
aa40: 53 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Size(MemPage *pP
aa50: 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b  age, int iCell){
aa60: 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 2d  .  return pPage-
aa70: 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65  >xCellSize(pPage
aa80: 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  , findCell(pPage
aa90: 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e  , iCell));.}.#en
aaa0: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
aab0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
aac0: 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  UUM./*.** If the
aad0: 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72   cell pCell, par
aae0: 74 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 20  t of page pPage 
aaf0: 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
ab00: 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72  er.** to an over
ab10: 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72  flow page, inser
ab20: 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  t an entry into 
ab30: 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
ab40: 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  ** for the overf
ab50: 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  low page..*/.sta
ab60: 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50  tic void ptrmapP
ab70: 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67  utOvflPtr(MemPag
ab80: 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43  e *pPage, u8 *pC
ab90: 65 6c 6c 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  ell, int *pRC){.
aba0: 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
abb0: 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65  .  if( *pRC ) re
abc0: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
abd0: 70 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 70 50  pCell!=0 );.  pP
abe0: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
abf0: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
ac00: 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f  nfo);.  if( info
ac10: 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f 2e 6e 50 61  .nLocal<info.nPa
ac20: 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 50 67 6e  yload ){.    Pgn
ac30: 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  o ovfl = get4byt
ac40: 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 6e 53  e(&pCell[info.nS
ac50: 69 7a 65 2d 34 5d 29 3b 0a 20 20 20 20 70 74 72  ize-4]);.    ptr
ac60: 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42  mapPut(pPage->pB
ac70: 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f  t, ovfl, PTRMAP_
ac80: 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65  OVERFLOW1, pPage
ac90: 2d 3e 70 67 6e 6f 2c 20 70 52 43 29 3b 0a 20 20  ->pgno, pRC);.  
aca0: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  }.}.#endif.../*.
acb0: 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68  ** Defragment th
acc0: 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20 54 68  e page given. Th
acd0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 6f 72 67  is routine reorg
ace0: 61 6e 69 7a 65 73 20 63 65 6c 6c 73 20 77 69 74  anizes cells wit
acf0: 68 69 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  hin the.** page 
ad00: 73 6f 20 74 68 61 74 20 74 68 65 72 65 20 61 72  so that there ar
ad10: 65 20 6e 6f 20 66 72 65 65 2d 62 6c 6f 63 6b 73  e no free-blocks
ad20: 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 62 6c 6f   on the free-blo
ad30: 63 6b 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 50  ck list..**.** P
ad40: 61 72 61 6d 65 74 65 72 20 6e 4d 61 78 46 72 61  arameter nMaxFra
ad50: 67 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d  g is the maximum
ad60: 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72 61 67 6d   amount of fragm
ad70: 65 6e 74 65 64 20 73 70 61 63 65 20 74 68 61 74  ented space that
ad80: 20 6d 61 79 20 62 65 0a 2a 2a 20 70 72 65 73 65   may be.** prese
ad90: 6e 74 20 69 6e 20 74 68 65 20 70 61 67 65 20 61  nt in the page a
ada0: 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  fter this routin
adb0: 65 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a  e returns..**.**
adc0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
add0: 34 34 35 38 32 2d 36 30 31 33 38 20 53 51 4c 69  44582-60138 SQLi
ade0: 74 65 20 6d 61 79 20 66 72 6f 6d 20 74 69 6d 65  te may from time
adf0: 20 74 6f 20 74 69 6d 65 20 72 65 6f 72 67 61 6e   to time reorgan
ae00: 69 7a 65 20 61 0a 2a 2a 20 62 2d 74 72 65 65 20  ize a.** b-tree 
ae10: 70 61 67 65 20 73 6f 20 74 68 61 74 20 74 68 65  page so that the
ae20: 72 65 20 61 72 65 20 6e 6f 20 66 72 65 65 62 6c  re are no freebl
ae30: 6f 63 6b 73 20 6f 72 20 66 72 61 67 6d 65 6e 74  ocks or fragment
ae40: 20 62 79 74 65 73 2c 20 61 6c 6c 0a 2a 2a 20 75   bytes, all.** u
ae50: 6e 75 73 65 64 20 62 79 74 65 73 20 61 72 65 20  nused bytes are 
ae60: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
ae70: 20 75 6e 61 6c 6c 6f 63 61 74 65 64 20 73 70 61   unallocated spa
ae80: 63 65 20 72 65 67 69 6f 6e 2c 20 61 6e 64 20 61  ce region, and a
ae90: 6c 6c 0a 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20  ll.** cells are 
aea0: 70 61 63 6b 65 64 20 74 69 67 68 74 6c 79 20 61  packed tightly a
aeb0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
aec0: 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
aed0: 20 69 6e 74 20 64 65 66 72 61 67 6d 65 6e 74 50   int defragmentP
aee0: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
aef0: 67 65 2c 20 69 6e 74 20 6e 4d 61 78 46 72 61 67  ge, int nMaxFrag
af00: 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
af10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af20: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
af30: 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20  */.  int pc;    
af40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af50: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
af60: 65 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20  e i-th cell */. 
af70: 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20   int hdr;       
af80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
af90: 66 66 73 65 74 20 74 6f 20 74 68 65 20 70 61 67  ffset to the pag
afa0: 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  e header */.  in
afb0: 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  t size;         
afc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
afd0: 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20   of a cell */.  
afe0: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20  int usableSize; 
aff0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
b000: 6d 62 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62  mber of usable b
b010: 79 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a  ytes on a page *
b020: 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73  /.  int cellOffs
b030: 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  et;            /
b040: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
b050: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
b060: 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b  ay */.  int cbrk
b070: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b080: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
b090: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
b0a0: 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e   area */.  int n
b0b0: 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
b0c0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
b0d0: 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20  of cells on the 
b0e0: 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  page */.  unsign
b0f0: 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20  ed char *data;  
b100: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
b110: 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67   data */.  unsig
b120: 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20  ned char *temp; 
b130: 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72        /* Temp ar
b140: 65 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74  ea for cell cont
b150: 65 6e 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ent */.  unsigne
b160: 64 20 63 68 61 72 20 2a 73 72 63 3b 20 20 20 20  d char *src;    
b170: 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6f 66      /* Source of
b180: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e   content */.  in
b190: 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20  t iCellFirst;   
b1a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
b1b0: 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c  t allowable cell
b1c0: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
b1d0: 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 20  iCellLast;      
b1e0: 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70         /* Last p
b1f0: 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64  ossible cell ind
b200: 65 78 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ex */..  assert(
b210: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
b220: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
b230: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
b240: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
b250: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
b260: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
b270: 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54  bleSize <= SQLIT
b280: 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20  E_MAX_PAGE_SIZE 
b290: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
b2a0: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
b2b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
b2c0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
b2d0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
b2e0: 65 78 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20  ex) );.  temp = 
b2f0: 30 3b 0a 20 20 73 72 63 20 3d 20 64 61 74 61 20  0;.  src = data 
b300: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
b310: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
b320: 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c  drOffset;.  cell
b330: 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e  Offset = pPage->
b340: 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43  cellOffset;.  nC
b350: 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
b360: 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43  ll;.  assert( nC
b370: 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28 26 64  ell==get2byte(&d
b380: 61 74 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20  ata[hdr+3]) );. 
b390: 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65   iCellFirst = ce
b3a0: 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43 65  llOffset + 2*nCe
b3b0: 6c 6c 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65  ll;.  usableSize
b3c0: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   = pPage->pBt->u
b3d0: 73 61 62 6c 65 53 69 7a 65 3b 0a 0a 20 20 2f 2a  sableSize;..  /*
b3e0: 20 54 68 69 73 20 62 6c 6f 63 6b 20 68 61 6e 64   This block hand
b3f0: 6c 65 73 20 70 61 67 65 73 20 77 69 74 68 20 74  les pages with t
b400: 77 6f 20 6f 72 20 66 65 77 65 72 20 66 72 65 65  wo or fewer free
b410: 20 62 6c 6f 63 6b 73 20 61 6e 64 20 6e 4d 61 78   blocks and nMax
b420: 46 72 61 67 0a 20 20 2a 2a 20 6f 72 20 66 65 77  Frag.  ** or few
b430: 65 72 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79  er fragmented by
b440: 74 65 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  tes. In this cas
b450: 65 20 69 74 20 69 73 20 66 61 73 74 65 72 20 74  e it is faster t
b460: 6f 20 6d 6f 76 65 20 74 68 65 0a 20 20 2a 2a 20  o move the.  ** 
b470: 74 77 6f 20 28 6f 72 20 6f 6e 65 29 20 62 6c 6f  two (or one) blo
b480: 63 6b 73 20 6f 66 20 63 65 6c 6c 73 20 75 73 69  cks of cells usi
b490: 6e 67 20 6d 65 6d 6d 6f 76 65 28 29 20 61 6e 64  ng memmove() and
b4a0: 20 61 64 64 20 74 68 65 20 72 65 71 75 69 72 65   add the require
b4b0: 64 0a 20 20 2a 2a 20 6f 66 66 73 65 74 73 20 74  d.  ** offsets t
b4c0: 6f 20 65 61 63 68 20 70 6f 69 6e 74 65 72 20 69  o each pointer i
b4d0: 6e 20 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74  n the cell-point
b4e0: 65 72 20 61 72 72 61 79 20 74 68 61 6e 20 69 74  er array than it
b4f0: 20 69 73 20 74 6f 20 0a 20 20 2a 2a 20 72 65 63   is to .  ** rec
b500: 6f 6e 73 74 72 75 63 74 20 74 68 65 20 65 6e 74  onstruct the ent
b510: 69 72 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  ire page.  */.  
b520: 69 66 28 20 28 69 6e 74 29 64 61 74 61 5b 68 64  if( (int)data[hd
b530: 72 2b 37 5d 3c 3d 6e 4d 61 78 46 72 61 67 20 29  r+7]<=nMaxFrag )
b540: 7b 0a 20 20 20 20 69 6e 74 20 69 46 72 65 65 20  {.    int iFree 
b550: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
b560: 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 69 66  [hdr+1]);.    if
b570: 28 20 69 46 72 65 65 20 29 7b 0a 20 20 20 20 20  ( iFree ){.     
b580: 20 69 6e 74 20 69 46 72 65 65 32 20 3d 20 67 65   int iFree2 = ge
b590: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72  t2byte(&data[iFr
b5a0: 65 65 5d 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ee]);..      /* 
b5b0: 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 29 20 68  pageFindSlot() h
b5c0: 61 73 20 61 6c 72 65 61 64 79 20 76 65 72 69 66  as already verif
b5d0: 69 65 64 20 74 68 61 74 20 66 72 65 65 20 62 6c  ied that free bl
b5e0: 6f 63 6b 73 20 61 72 65 20 73 6f 72 74 65 64 0a  ocks are sorted.
b5f0: 20 20 20 20 20 20 2a 2a 20 69 6e 20 6f 72 64 65        ** in orde
b600: 72 20 6f 66 20 6f 66 66 73 65 74 20 77 69 74 68  r of offset with
b610: 69 6e 20 74 68 65 20 70 61 67 65 2c 20 61 6e 64  in the page, and
b620: 20 74 68 61 74 20 6e 6f 20 62 6c 6f 63 6b 20 65   that no block e
b630: 78 74 65 6e 64 73 0a 20 20 20 20 20 20 2a 2a 20  xtends.      ** 
b640: 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
b650: 74 68 65 20 70 61 67 65 2e 20 50 72 6f 76 69 64  the page. Provid
b660: 65 64 20 74 68 65 20 74 77 6f 20 66 72 65 65 20  ed the two free 
b670: 73 6c 6f 74 73 20 64 6f 20 6e 6f 74 20 0a 20 20  slots do not .  
b680: 20 20 20 20 2a 2a 20 6f 76 65 72 6c 61 70 2c 20      ** overlap, 
b690: 74 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 20  this guarantees 
b6a0: 74 68 61 74 20 74 68 65 20 6d 65 6d 6d 6f 76 65  that the memmove
b6b0: 28 29 20 63 61 6c 6c 73 20 62 65 6c 6f 77 20 77  () calls below w
b6c0: 69 6c 6c 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a  ill not.      **
b6d0: 20 6f 76 65 72 77 72 69 74 65 20 74 68 65 20 75   overwrite the u
b6e0: 73 61 62 6c 65 53 69 7a 65 20 62 79 74 65 20 62  sableSize byte b
b6f0: 75 66 66 65 72 2c 20 65 76 65 6e 20 69 66 20 74  uffer, even if t
b700: 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
b710: 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 63 6f 72  .      ** is cor
b720: 72 75 70 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20  rupt.  */.      
b730: 61 73 73 65 72 74 28 20 69 46 72 65 65 32 3d 3d  assert( iFree2==
b740: 30 20 7c 7c 20 69 46 72 65 65 32 3e 69 46 72 65  0 || iFree2>iFre
b750: 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
b760: 74 28 20 69 46 72 65 65 2b 67 65 74 32 62 79 74  t( iFree+get2byt
b770: 65 28 26 64 61 74 61 5b 69 46 72 65 65 2b 32 5d  e(&data[iFree+2]
b780: 29 20 3c 3d 20 75 73 61 62 6c 65 53 69 7a 65 20  ) <= usableSize 
b790: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
b7a0: 20 69 46 72 65 65 32 3d 3d 30 20 7c 7c 20 69 46   iFree2==0 || iF
b7b0: 72 65 65 32 2b 67 65 74 32 62 79 74 65 28 26 64  ree2+get2byte(&d
b7c0: 61 74 61 5b 69 46 72 65 65 32 2b 32 5d 29 20 3c  ata[iFree2+2]) <
b7d0: 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  = usableSize );.
b7e0: 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 69 46  .      if( 0==iF
b7f0: 72 65 65 32 20 7c 7c 20 28 64 61 74 61 5b 69 46  ree2 || (data[iF
b800: 72 65 65 32 5d 3d 3d 30 20 26 26 20 64 61 74 61  ree2]==0 && data
b810: 5b 69 46 72 65 65 32 2b 31 5d 3d 3d 30 29 20 29  [iFree2+1]==0) )
b820: 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 70 45  {.        u8 *pE
b830: 6e 64 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f  nd = &data[cellO
b840: 66 66 73 65 74 20 2b 20 6e 43 65 6c 6c 2a 32 5d  ffset + nCell*2]
b850: 3b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 70 41  ;.        u8 *pA
b860: 64 64 72 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ddr;.        int
b870: 20 73 7a 32 20 3d 20 30 3b 0a 20 20 20 20 20 20   sz2 = 0;.      
b880: 20 20 69 6e 74 20 73 7a 20 3d 20 67 65 74 32 62    int sz = get2b
b890: 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 2b  yte(&data[iFree+
b8a0: 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  2]);.        int
b8b0: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28   top = get2byte(
b8c0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
b8d0: 20 20 20 20 20 20 20 69 66 28 20 69 46 72 65 65         if( iFree
b8e0: 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  2 ){.          i
b8f0: 66 28 20 69 46 72 65 65 2b 73 7a 3e 69 46 72 65  f( iFree+sz>iFre
b900: 65 32 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  e2 ) return SQLI
b910: 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28  TE_CORRUPT_PGNO(
b920: 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
b930: 20 20 20 20 20 20 20 20 73 7a 32 20 3d 20 67 65          sz2 = ge
b940: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72  t2byte(&data[iFr
b950: 65 65 32 2b 32 5d 29 3b 0a 20 20 20 20 20 20 20  ee2+2]);.       
b960: 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65     assert( iFree
b970: 2b 73 7a 2b 73 7a 32 2b 69 46 72 65 65 32 2d 28  +sz+sz2+iFree2-(
b980: 69 46 72 65 65 2b 73 7a 29 20 3c 3d 20 75 73 61  iFree+sz) <= usa
b990: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  bleSize );.     
b9a0: 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 64 61       memmove(&da
b9b0: 74 61 5b 69 46 72 65 65 2b 73 7a 2b 73 7a 32 5d  ta[iFree+sz+sz2]
b9c0: 2c 20 26 64 61 74 61 5b 69 46 72 65 65 2b 73 7a  , &data[iFree+sz
b9d0: 5d 2c 20 69 46 72 65 65 32 2d 28 69 46 72 65 65  ], iFree2-(iFree
b9e0: 2b 73 7a 29 29 3b 0a 20 20 20 20 20 20 20 20 20  +sz));.         
b9f0: 20 73 7a 20 2b 3d 20 73 7a 32 3b 0a 20 20 20 20   sz += sz2;.    
ba00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 62      }.        cb
ba10: 72 6b 20 3d 20 74 6f 70 2b 73 7a 3b 0a 20 20 20  rk = top+sz;.   
ba20: 20 20 20 20 20 61 73 73 65 72 74 28 20 63 62 72       assert( cbr
ba30: 6b 2b 28 69 46 72 65 65 2d 74 6f 70 29 20 3c 3d  k+(iFree-top) <=
ba40: 20 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20   usableSize );. 
ba50: 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26         memmove(&
ba60: 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 64 61 74  data[cbrk], &dat
ba70: 61 5b 74 6f 70 5d 2c 20 69 46 72 65 65 2d 74 6f  a[top], iFree-to
ba80: 70 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  p);.        for(
ba90: 70 41 64 64 72 3d 26 64 61 74 61 5b 63 65 6c 6c  pAddr=&data[cell
baa0: 4f 66 66 73 65 74 5d 3b 20 70 41 64 64 72 3c 70  Offset]; pAddr<p
bab0: 45 6e 64 3b 20 70 41 64 64 72 2b 3d 32 29 7b 0a  End; pAddr+=2){.
bac0: 20 20 20 20 20 20 20 20 20 20 70 63 20 3d 20 67            pc = g
bad0: 65 74 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a  et2byte(pAddr);.
bae0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 63            if( pc
baf0: 3c 69 46 72 65 65 20 29 7b 20 70 75 74 32 62 79  <iFree ){ put2by
bb00: 74 65 28 70 41 64 64 72 2c 20 70 63 2b 73 7a 29  te(pAddr, pc+sz)
bb10: 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20 65 6c  ; }.          el
bb20: 73 65 20 69 66 28 20 70 63 3c 69 46 72 65 65 32  se if( pc<iFree2
bb30: 20 29 7b 20 70 75 74 32 62 79 74 65 28 70 41 64   ){ put2byte(pAd
bb40: 64 72 2c 20 70 63 2b 73 7a 32 29 3b 20 7d 0a 20  dr, pc+sz2); }. 
bb50: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
bb60: 20 67 6f 74 6f 20 64 65 66 72 61 67 6d 65 6e 74   goto defragment
bb70: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
bb80: 20 20 7d 0a 20 20 7d 0a 0a 20 20 63 62 72 6b 20    }.  }..  cbrk 
bb90: 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  = usableSize;.  
bba0: 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62  iCellLast = usab
bbb0: 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f  leSize - 4;.  fo
bbc0: 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
bbd0: 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 41  i++){.    u8 *pA
bbe0: 64 64 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  ddr;     /* The 
bbf0: 69 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65  i-th cell pointe
bc00: 72 20 2a 2f 0a 20 20 20 20 70 41 64 64 72 20 3d  r */.    pAddr =
bc10: 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65   &data[cellOffse
bc20: 74 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63  t + i*2];.    pc
bc30: 20 3d 20 67 65 74 32 62 79 74 65 28 70 41 64 64   = get2byte(pAdd
bc40: 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  r);.    testcase
bc50: 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74  ( pc==iCellFirst
bc60: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
bc70: 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20  ( pc==iCellLast 
bc80: 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 73 65 20  );.    /* These 
bc90: 63 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76 65 20  conditions have 
bca0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 76 65 72  already been ver
bcb0: 69 66 69 65 64 20 69 6e 20 62 74 72 65 65 49 6e  ified in btreeIn
bcc0: 69 74 50 61 67 65 28 29 0a 20 20 20 20 2a 2a 20  itPage().    ** 
bcd0: 69 66 20 50 52 41 47 4d 41 20 63 65 6c 6c 5f 73  if PRAGMA cell_s
bce0: 69 7a 65 5f 63 68 65 63 6b 3d 4f 4e 2e 0a 20 20  ize_check=ON..  
bcf0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3c    */.    if( pc<
bd00: 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63  iCellFirst || pc
bd10: 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20  >iCellLast ){.  
bd20: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
bd30: 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70  E_CORRUPT_PGNO(p
bd40: 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  Page->pgno);.   
bd50: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
bd60: 63 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 26 26  c>=iCellFirst &&
bd70: 20 70 63 3c 3d 69 43 65 6c 6c 4c 61 73 74 20 29   pc<=iCellLast )
bd80: 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 70 50 61  ;.    size = pPa
bd90: 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50  ge->xCellSize(pP
bda0: 61 67 65 2c 20 26 73 72 63 5b 70 63 5d 29 3b 0a  age, &src[pc]);.
bdb0: 20 20 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65      cbrk -= size
bdc0: 3b 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69  ;.    if( cbrk<i
bdd0: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b  CellFirst || pc+
bde0: 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20  size>usableSize 
bdf0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
be00: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
be10: 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29  GNO(pPage->pgno)
be20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
be30: 72 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d 75  rt( cbrk+size<=u
be40: 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63 62 72  sableSize && cbr
be50: 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  k>=iCellFirst );
be60: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 63  .    testcase( c
be70: 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65  brk+size==usable
be80: 53 69 7a 65 20 29 3b 0a 20 20 20 20 74 65 73 74  Size );.    test
be90: 63 61 73 65 28 20 70 63 2b 73 69 7a 65 3d 3d 75  case( pc+size==u
bea0: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
beb0: 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72 2c   put2byte(pAddr,
bec0: 20 63 62 72 6b 29 3b 0a 20 20 20 20 69 66 28 20   cbrk);.    if( 
bed0: 74 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  temp==0 ){.     
bee0: 20 69 6e 74 20 78 3b 0a 20 20 20 20 20 20 69 66   int x;.      if
bef0: 28 20 63 62 72 6b 3d 3d 70 63 20 29 20 63 6f 6e  ( cbrk==pc ) con
bf00: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 74 65 6d  tinue;.      tem
bf10: 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  p = sqlite3Pager
bf20: 54 65 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d  TempSpace(pPage-
bf30: 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  >pBt->pPager);. 
bf40: 20 20 20 20 20 78 20 3d 20 67 65 74 32 62 79 74       x = get2byt
bf50: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
bf60: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 74  .      memcpy(&t
bf70: 65 6d 70 5b 78 5d 2c 20 26 64 61 74 61 5b 78 5d  emp[x], &data[x]
bf80: 2c 20 28 63 62 72 6b 2b 73 69 7a 65 29 20 2d 20  , (cbrk+size) - 
bf90: 78 29 3b 0a 20 20 20 20 20 20 73 72 63 20 3d 20  x);.      src = 
bfa0: 74 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  temp;.    }.    
bfb0: 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63 62 72  memcpy(&data[cbr
bfc0: 6b 5d 2c 20 26 73 72 63 5b 70 63 5d 2c 20 73 69  k], &src[pc], si
bfd0: 7a 65 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b  ze);.  }.  data[
bfe0: 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 0a 20 64 65  hdr+7] = 0;.. de
bff0: 66 72 61 67 6d 65 6e 74 5f 6f 75 74 3a 0a 20 20  fragment_out:.  
c000: 69 66 28 20 64 61 74 61 5b 68 64 72 2b 37 5d 2b  if( data[hdr+7]+
c010: 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 21  cbrk-iCellFirst!
c020: 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b  =pPage->nFree ){
c030: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
c040: 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28  TE_CORRUPT_PGNO(
c050: 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
c060: 7d 0a 20 20 61 73 73 65 72 74 28 20 63 62 72 6b  }.  assert( cbrk
c070: 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a  >=iCellFirst );.
c080: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
c090: 5b 68 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a  [hdr+5], cbrk);.
c0a0: 20 20 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20    data[hdr+1] = 
c0b0: 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d  0;.  data[hdr+2]
c0c0: 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26   = 0;.  memset(&
c0d0: 64 61 74 61 5b 69 43 65 6c 6c 46 69 72 73 74 5d  data[iCellFirst]
c0e0: 2c 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c 6c 46  , 0, cbrk-iCellF
c0f0: 69 72 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28  irst);.  assert(
c100: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
c110: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
c120: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65  pDbPage) );.  re
c130: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
c140: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20  }../*.** Search 
c150: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6f 6e  the free-list on
c160: 20 70 61 67 65 20 70 50 67 20 66 6f 72 20 73 70   page pPg for sp
c170: 61 63 65 20 74 6f 20 73 74 6f 72 65 20 61 20 63  ace to store a c
c180: 65 6c 6c 20 6e 42 79 74 65 20 62 79 74 65 73 20  ell nByte bytes 
c190: 69 6e 0a 2a 2a 20 73 69 7a 65 2e 20 49 66 20 6f  in.** size. If o
c1a0: 6e 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c  ne can be found,
c1b0: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
c1c0: 72 20 74 6f 20 74 68 65 20 73 70 61 63 65 20 61  r to the space a
c1d0: 6e 64 20 72 65 6d 6f 76 65 20 69 74 0a 2a 2a 20  nd remove it.** 
c1e0: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69  from the free-li
c1f0: 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20  st..**.** If no 
c200: 73 75 69 74 61 62 6c 65 20 73 70 61 63 65 20 63  suitable space c
c210: 61 6e 20 62 65 20 66 6f 75 6e 64 20 6f 6e 20 74  an be found on t
c220: 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 72 65  he free-list, re
c230: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  turn NULL..**.**
c240: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
c250: 61 79 20 64 65 74 65 63 74 20 63 6f 72 72 75 70  ay detect corrup
c260: 74 69 6f 6e 20 77 69 74 68 69 6e 20 70 50 67 2e  tion within pPg.
c270: 20 20 49 66 20 63 6f 72 72 75 70 74 69 6f 6e 20    If corruption 
c280: 69 73 0a 2a 2a 20 64 65 74 65 63 74 65 64 20 74  is.** detected t
c290: 68 65 6e 20 2a 70 52 63 20 69 73 20 73 65 74 20  hen *pRc is set 
c2a0: 74 6f 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  to SQLITE_CORRUP
c2b0: 54 20 61 6e 64 20 4e 55 4c 4c 20 69 73 20 72 65  T and NULL is re
c2c0: 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 6c  turned..**.** Sl
c2d0: 6f 74 73 20 6f 6e 20 74 68 65 20 66 72 65 65 20  ots on the free 
c2e0: 6c 69 73 74 20 74 68 61 74 20 61 72 65 20 62 65  list that are be
c2f0: 74 77 65 65 6e 20 31 20 61 6e 64 20 33 20 62 79  tween 1 and 3 by
c300: 74 65 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20  tes larger than 
c310: 6e 42 79 74 65 0a 2a 2a 20 77 69 6c 6c 20 62 65  nByte.** will be
c320: 20 69 67 6e 6f 72 65 64 20 69 66 20 61 64 64 69   ignored if addi
c330: 6e 67 20 74 68 65 20 65 78 74 72 61 20 73 70 61  ng the extra spa
c340: 63 65 20 74 6f 20 74 68 65 20 66 72 61 67 6d 65  ce to the fragme
c350: 6e 74 61 74 69 6f 6e 20 63 6f 75 6e 74 0a 2a 2a  ntation count.**
c360: 20 63 61 75 73 65 73 20 74 68 65 20 66 72 61 67   causes the frag
c370: 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 75 6e 74 20  mentation count 
c380: 74 6f 20 65 78 63 65 65 64 20 36 30 2e 0a 2a 2f  to exceed 60..*/
c390: 0a 73 74 61 74 69 63 20 75 38 20 2a 70 61 67 65  .static u8 *page
c3a0: 46 69 6e 64 53 6c 6f 74 28 4d 65 6d 50 61 67 65  FindSlot(MemPage
c3b0: 20 2a 70 50 67 2c 20 69 6e 74 20 6e 42 79 74 65   *pPg, int nByte
c3c0: 2c 20 69 6e 74 20 2a 70 52 63 29 7b 0a 20 20 63  , int *pRc){.  c
c3d0: 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70  onst int hdr = p
c3e0: 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  Pg->hdrOffset;. 
c3f0: 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61 74   u8 * const aDat
c400: 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a  a = pPg->aData;.
c410: 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20 68 64    int iAddr = hd
c420: 72 20 2b 20 31 3b 0a 20 20 69 6e 74 20 70 63 20  r + 1;.  int pc 
c430: 3d 20 67 65 74 32 62 79 74 65 28 26 61 44 61 74  = get2byte(&aDat
c440: 61 5b 69 41 64 64 72 5d 29 3b 0a 20 20 69 6e 74  a[iAddr]);.  int
c450: 20 78 3b 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   x;.  int usable
c460: 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 42 74 2d  Size = pPg->pBt-
c470: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 0a 20 20  >usableSize;..  
c480: 61 73 73 65 72 74 28 20 70 63 3e 30 20 29 3b 0a  assert( pc>0 );.
c490: 20 20 64 6f 7b 0a 20 20 20 20 69 6e 74 20 73 69    do{.    int si
c4a0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ze;            /
c4b0: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66 72  * Size of the fr
c4c0: 65 65 20 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 2f  ee slot */.    /
c4d0: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
c4e0: 2d 30 36 38 36 36 2d 33 39 31 32 35 20 46 72 65  -06866-39125 Fre
c4f0: 65 62 6c 6f 63 6b 73 20 61 72 65 20 61 6c 77 61  eblocks are alwa
c500: 79 73 20 63 6f 6e 6e 65 63 74 65 64 20 69 6e 20  ys connected in 
c510: 6f 72 64 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20  order of.    ** 
c520: 69 6e 63 72 65 61 73 69 6e 67 20 6f 66 66 73 65  increasing offse
c530: 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63  t. */.    if( pc
c540: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 7c 7c  >usableSize-4 ||
c550: 20 70 63 3c 69 41 64 64 72 2b 34 20 29 7b 0a 20   pc<iAddr+4 ){. 
c560: 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49       *pRc = SQLI
c570: 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28  TE_CORRUPT_PGNO(
c580: 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
c590: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
c5a0: 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  }.    /* EVIDENC
c5b0: 45 2d 4f 46 3a 20 52 2d 32 32 37 31 30 2d 35 33  E-OF: R-22710-53
c5c0: 33 32 38 20 54 68 65 20 74 68 69 72 64 20 61 6e  328 The third an
c5d0: 64 20 66 6f 75 72 74 68 20 62 79 74 65 73 20 6f  d fourth bytes o
c5e0: 66 20 65 61 63 68 0a 20 20 20 20 2a 2a 20 66 72  f each.    ** fr
c5f0: 65 65 62 6c 6f 63 6b 20 66 6f 72 6d 20 61 20 62  eeblock form a b
c600: 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
c610: 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73  r which is the s
c620: 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65 62  ize of the freeb
c630: 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 69 6e 20 62  lock.    ** in b
c640: 79 74 65 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20  ytes, including 
c650: 74 68 65 20 34 2d 62 79 74 65 20 68 65 61 64 65  the 4-byte heade
c660: 72 2e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 20 3d  r. */.    size =
c670: 20 67 65 74 32 62 79 74 65 28 26 61 44 61 74 61   get2byte(&aData
c680: 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28  [pc+2]);.    if(
c690: 20 28 78 20 3d 20 73 69 7a 65 20 2d 20 6e 42 79   (x = size - nBy
c6a0: 74 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  te)>=0 ){.      
c6b0: 74 65 73 74 63 61 73 65 28 20 78 3d 3d 34 20 29  testcase( x==4 )
c6c0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
c6d0: 28 20 78 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20  ( x==3 );.      
c6e0: 69 66 28 20 70 63 20 3c 20 70 50 67 2d 3e 63 65  if( pc < pPg->ce
c6f0: 6c 6c 4f 66 66 73 65 74 2b 32 2a 70 50 67 2d 3e  llOffset+2*pPg->
c700: 6e 43 65 6c 6c 20 7c 7c 20 73 69 7a 65 2b 70 63  nCell || size+pc
c710: 20 3e 20 75 73 61 62 6c 65 53 69 7a 65 20 29 7b   > usableSize ){
c720: 0a 20 20 20 20 20 20 20 20 2a 70 52 63 20 3d 20  .        *pRc = 
c730: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
c740: 47 4e 4f 28 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  GNO(pPg->pgno);.
c750: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
c760: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
c770: 28 20 78 3c 34 20 29 7b 0a 20 20 20 20 20 20 20  ( x<4 ){.       
c780: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
c790: 20 52 2d 31 31 34 39 38 2d 35 38 30 32 32 20 49   R-11498-58022 I
c7a0: 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20  n a well-formed 
c7b0: 62 2d 74 72 65 65 20 70 61 67 65 2c 20 74 68 65  b-tree page, the
c7c0: 20 74 6f 74 61 6c 0a 20 20 20 20 20 20 20 20 2a   total.        *
c7d0: 2a 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * number of byte
c7e0: 73 20 69 6e 20 66 72 61 67 6d 65 6e 74 73 20 6d  s in fragments m
c7f0: 61 79 20 6e 6f 74 20 65 78 63 65 65 64 20 36 30  ay not exceed 60
c800: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  . */.        if(
c810: 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 3e 35 37   aData[hdr+7]>57
c820: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
c830: 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20        /* Remove 
c840: 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74 68  the slot from th
c850: 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 55 70 64  e free-list. Upd
c860: 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
c870: 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 72 61  f.        ** fra
c880: 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20 77 69  gmented bytes wi
c890: 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e 20 2a  thin the page. *
c8a0: 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  /.        memcpy
c8b0: 28 26 61 44 61 74 61 5b 69 41 64 64 72 5d 2c 20  (&aData[iAddr], 
c8c0: 26 61 44 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a  &aData[pc], 2);.
c8d0: 20 20 20 20 20 20 20 20 61 44 61 74 61 5b 68 64          aData[hd
c8e0: 72 2b 37 5d 20 2b 3d 20 28 75 38 29 78 3b 0a 20  r+7] += (u8)x;. 
c8f0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
c900: 20 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20      /* The slot 
c910: 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20 66  remains on the f
c920: 72 65 65 2d 6c 69 73 74 2e 20 52 65 64 75 63 65  ree-list. Reduce
c930: 20 69 74 73 20 73 69 7a 65 20 74 6f 20 61 63 63   its size to acc
c940: 6f 75 6e 74 0a 20 20 20 20 20 20 20 20 20 2a 2a  ount.         **
c950: 20 66 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e   for the portion
c960: 20 75 73 65 64 20 62 79 20 74 68 65 20 6e 65 77   used by the new
c970: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a   allocation. */.
c980: 20 20 20 20 20 20 20 20 70 75 74 32 62 79 74 65          put2byte
c990: 28 26 61 44 61 74 61 5b 70 63 2b 32 5d 2c 20 78  (&aData[pc+2], x
c9a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
c9b0: 20 72 65 74 75 72 6e 20 26 61 44 61 74 61 5b 70   return &aData[p
c9c0: 63 20 2b 20 78 5d 3b 0a 20 20 20 20 7d 0a 20 20  c + x];.    }.  
c9d0: 20 20 69 41 64 64 72 20 3d 20 70 63 3b 0a 20 20    iAddr = pc;.  
c9e0: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
c9f0: 26 61 44 61 74 61 5b 70 63 5d 29 3b 0a 20 20 7d  &aData[pc]);.  }
ca00: 77 68 69 6c 65 28 20 70 63 20 29 3b 0a 0a 20 20  while( pc );..  
ca10: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
ca20: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74  ** Allocate nByt
ca30: 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  e bytes of space
ca40: 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65   from within the
ca50: 20 42 2d 54 72 65 65 20 70 61 67 65 20 70 61 73   B-Tree page pas
ca60: 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69  sed.** as the fi
ca70: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 57 72  rst argument. Wr
ca80: 69 74 65 20 69 6e 74 6f 20 2a 70 49 64 78 20 74  ite into *pIdx t
ca90: 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50  he index into pP
caa0: 61 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20  age->aData[].** 
cab0: 6f 66 20 74 68 65 20 66 69 72 73 74 20 62 79 74  of the first byt
cac0: 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 73  e of allocated s
cad0: 70 61 63 65 2e 20 52 65 74 75 72 6e 20 65 69 74  pace. Return eit
cae0: 68 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72  her SQLITE_OK or
caf0: 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  .** an error cod
cb00: 65 20 28 75 73 75 61 6c 6c 79 20 53 51 4c 49 54  e (usually SQLIT
cb10: 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a  E_CORRUPT)..**.*
cb20: 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 67 75 61  * The caller gua
cb30: 72 61 6e 74 65 65 73 20 74 68 61 74 20 74 68 65  rantees that the
cb40: 72 65 20 69 73 20 73 75 66 66 69 63 69 65 6e 74  re is sufficient
cb50: 20 73 70 61 63 65 20 74 6f 20 6d 61 6b 65 20 74   space to make t
cb60: 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e  he.** allocation
cb70: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
cb80: 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 64 65  might need to de
cb90: 66 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72 64 65  fragment in orde
cba0: 72 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20 61 6c  r to bring.** al
cbb0: 6c 20 74 68 65 20 73 70 61 63 65 20 74 6f 67 65  l the space toge
cbc0: 74 68 65 72 2c 20 68 6f 77 65 76 65 72 2e 20 20  ther, however.  
cbd0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
cbe0: 6c 20 61 76 6f 69 64 20 75 73 69 6e 67 0a 2a 2a  l avoid using.**
cbf0: 20 74 68 65 20 66 69 72 73 74 20 74 77 6f 20 62   the first two b
cc00: 79 74 65 73 20 70 61 73 74 20 74 68 65 20 63 65  ytes past the ce
cc10: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 65 61 20  ll pointer area 
cc20: 73 69 6e 63 65 20 70 72 65 73 75 6d 61 62 6c 79  since presumably
cc30: 20 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74   this.** allocat
cc40: 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d 61 64  ion is being mad
cc50: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e  e in order to in
cc60: 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 2c  sert a new cell,
cc70: 20 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a 20 61   so we will.** a
cc80: 6c 73 6f 20 65 6e 64 20 75 70 20 6e 65 65 64 69  lso end up needi
cc90: 6e 67 20 61 20 6e 65 77 20 63 65 6c 6c 20 70 6f  ng a new cell po
cca0: 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  inter..*/.static
ccb0: 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70 61   int allocateSpa
ccc0: 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ce(MemPage *pPag
ccd0: 65 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e  e, int nByte, in
cce0: 74 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f 6e 73  t *pIdx){.  cons
ccf0: 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67  t int hdr = pPag
cd00: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20  e->hdrOffset;   
cd10: 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20   /* Local cache 
cd20: 6f 66 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  of pPage->hdrOff
cd30: 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f  set */.  u8 * co
cd40: 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61 67 65  nst data = pPage
cd50: 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 2f 2a  ->aData;      /*
cd60: 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20   Local cache of 
cd70: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
cd80: 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20    int top;      
cd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cda0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
cdb0: 62 79 74 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e  byte of cell con
cdc0: 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69  tent area */.  i
cdd0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
cde0: 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
cdf0: 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 72      /* Integer r
ce00: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
ce10: 69 6e 74 20 67 61 70 3b 20 20 20 20 20 20 20 20  int gap;        
ce20: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
ce30: 20 67 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c   gap between cel
ce40: 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 63  l pointers and c
ce50: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  ell content */. 
ce60: 20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69   .  assert( sqli
ce70: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
ce80: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
ce90: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
cea0: 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20   pPage->pBt );. 
ceb0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
cec0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
ced0: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
cee0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74  ;.  assert( nByt
cef0: 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d 69 6e 69  e>=0 );  /* Mini
cf00: 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73  mum cell size is
cf10: 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20   4 */.  assert( 
cf20: 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42  pPage->nFree>=nB
cf30: 79 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  yte );.  assert(
cf40: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
cf50: 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  w==0 );.  assert
cf60: 28 20 6e 42 79 74 65 20 3c 20 28 69 6e 74 29 28  ( nByte < (int)(
cf70: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
cf80: 6c 65 53 69 7a 65 2d 38 29 20 29 3b 0a 0a 20 20  leSize-8) );..  
cf90: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63  assert( pPage->c
cfa0: 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68 64 72  ellOffset == hdr
cfb0: 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d   + 12 - 4*pPage-
cfc0: 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61 70 20 3d  >leaf );.  gap =
cfd0: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
cfe0: 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43  et + 2*pPage->nC
cff0: 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 67  ell;.  assert( g
d000: 61 70 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 2f  ap<=65536 );.  /
d010: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
d020: 2d 32 39 33 35 36 2d 30 32 33 39 31 20 49 66 20  -29356-02391 If 
d030: 74 68 65 20 64 61 74 61 62 61 73 65 20 75 73 65  the database use
d040: 73 20 61 20 36 35 35 33 36 2d 62 79 74 65 20 70  s a 65536-byte p
d050: 61 67 65 20 73 69 7a 65 0a 20 20 2a 2a 20 61 6e  age size.  ** an
d060: 64 20 74 68 65 20 72 65 73 65 72 76 65 64 20 73  d the reserved s
d070: 70 61 63 65 20 69 73 20 7a 65 72 6f 20 28 74 68  pace is zero (th
d080: 65 20 75 73 75 61 6c 20 76 61 6c 75 65 20 66 6f  e usual value fo
d090: 72 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65  r reserved space
d0a0: 29 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20  ).  ** then the 
d0b0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 66  cell content off
d0c0: 73 65 74 20 6f 66 20 61 6e 20 65 6d 70 74 79 20  set of an empty 
d0d0: 70 61 67 65 20 77 61 6e 74 73 20 74 6f 20 62 65  page wants to be
d0e0: 20 36 35 35 33 36 2e 0a 20 20 2a 2a 20 48 6f 77   65536..  ** How
d0f0: 65 76 65 72 2c 20 74 68 61 74 20 69 6e 74 65 67  ever, that integ
d100: 65 72 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20  er is too large 
d110: 74 6f 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  to be stored in 
d120: 61 20 32 2d 62 79 74 65 20 75 6e 73 69 67 6e 65  a 2-byte unsigne
d130: 64 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20  d.  ** integer, 
d140: 73 6f 20 61 20 76 61 6c 75 65 20 6f 66 20 30 20  so a value of 0 
d150: 69 73 20 75 73 65 64 20 69 6e 20 69 74 73 20 70  is used in its p
d160: 6c 61 63 65 2e 20 2a 2f 0a 20 20 74 6f 70 20 3d  lace. */.  top =
d170: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
d180: 68 64 72 2b 35 5d 29 3b 0a 20 20 61 73 73 65 72  hdr+5]);.  asser
d190: 74 28 20 74 6f 70 3c 3d 28 69 6e 74 29 70 50 61  t( top<=(int)pPa
d1a0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
d1b0: 69 7a 65 20 29 3b 20 2f 2a 20 50 72 65 76 65 6e  ize ); /* Preven
d1c0: 74 20 62 79 20 67 65 74 41 6e 64 49 6e 69 74 50  t by getAndInitP
d1d0: 61 67 65 28 29 20 2a 2f 0a 20 20 69 66 28 20 67  age() */.  if( g
d1e0: 61 70 3e 74 6f 70 20 29 7b 0a 20 20 20 20 69 66  ap>top ){.    if
d1f0: 28 20 74 6f 70 3d 3d 30 20 26 26 20 70 50 61 67  ( top==0 && pPag
d200: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
d210: 7a 65 3d 3d 36 35 35 33 36 20 29 7b 0a 20 20 20  ze==65536 ){.   
d220: 20 20 20 74 6f 70 20 3d 20 36 35 35 33 36 3b 0a     top = 65536;.
d230: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d240: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
d250: 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67  ORRUPT_PGNO(pPag
d260: 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a  e->pgno);.    }.
d270: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
d280: 72 65 20 69 73 20 65 6e 6f 75 67 68 20 73 70 61  re is enough spa
d290: 63 65 20 62 65 74 77 65 65 6e 20 67 61 70 20 61  ce between gap a
d2a0: 6e 64 20 74 6f 70 20 66 6f 72 20 6f 6e 65 20 6d  nd top for one m
d2b0: 6f 72 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  ore cell pointer
d2c0: 0a 20 20 2a 2a 20 61 72 72 61 79 20 65 6e 74 72  .  ** array entr
d2d0: 79 20 6f 66 66 73 65 74 2c 20 61 6e 64 20 69 66  y offset, and if
d2e0: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73   the freelist is
d2f0: 20 6e 6f 74 20 65 6d 70 74 79 2c 20 74 68 65 6e   not empty, then
d300: 20 73 65 61 72 63 68 20 74 68 65 0a 20 20 2a 2a   search the.  **
d310: 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e   freelist lookin
d320: 67 20 66 6f 72 20 61 20 66 72 65 65 20 73 6c 6f  g for a free slo
d330: 74 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  t big enough to 
d340: 73 61 74 69 73 66 79 20 74 68 65 20 72 65 71 75  satisfy the requ
d350: 65 73 74 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74  est..  */.  test
d360: 63 61 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70  case( gap+2==top
d370: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
d380: 67 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20  gap+1==top );.  
d390: 74 65 73 74 63 61 73 65 28 20 67 61 70 3d 3d 74  testcase( gap==t
d3a0: 6f 70 20 29 3b 0a 20 20 69 66 28 20 28 64 61 74  op );.  if( (dat
d3b0: 61 5b 68 64 72 2b 32 5d 20 7c 7c 20 64 61 74 61  a[hdr+2] || data
d3c0: 5b 68 64 72 2b 31 5d 29 20 26 26 20 67 61 70 2b  [hdr+1]) && gap+
d3d0: 32 3c 3d 74 6f 70 20 29 7b 0a 20 20 20 20 75 38  2<=top ){.    u8
d3e0: 20 2a 70 53 70 61 63 65 20 3d 20 70 61 67 65 46   *pSpace = pageF
d3f0: 69 6e 64 53 6c 6f 74 28 70 50 61 67 65 2c 20 6e  indSlot(pPage, n
d400: 42 79 74 65 2c 20 26 72 63 29 3b 0a 20 20 20 20  Byte, &rc);.    
d410: 69 66 28 20 70 53 70 61 63 65 20 29 7b 0a 20 20  if( pSpace ){.  
d420: 20 20 20 20 61 73 73 65 72 74 28 20 70 53 70 61      assert( pSpa
d430: 63 65 3e 3d 64 61 74 61 20 26 26 20 28 70 53 70  ce>=data && (pSp
d440: 61 63 65 20 2d 20 64 61 74 61 29 3c 36 35 35 33  ace - data)<6553
d450: 36 20 29 3b 0a 20 20 20 20 20 20 2a 70 49 64 78  6 );.      *pIdx
d460: 20 3d 20 28 69 6e 74 29 28 70 53 70 61 63 65 20   = (int)(pSpace 
d470: 2d 20 64 61 74 61 29 3b 0a 20 20 20 20 20 20 72  - data);.      r
d480: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
d490: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72  .    }else if( r
d4a0: 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
d4b0: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
d4c0: 0a 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73  .  /* The reques
d4d0: 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 66  t could not be f
d4e0: 75 6c 66 69 6c 6c 65 64 20 75 73 69 6e 67 20 61  ulfilled using a
d4f0: 20 66 72 65 65 6c 69 73 74 20 73 6c 6f 74 2e 20   freelist slot. 
d500: 20 43 68 65 63 6b 0a 20 20 2a 2a 20 74 6f 20 73   Check.  ** to s
d510: 65 65 20 69 66 20 64 65 66 72 61 67 6d 65 6e 74  ee if defragment
d520: 61 74 69 6f 6e 20 69 73 20 6e 65 63 65 73 73 61  ation is necessa
d530: 72 79 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63  ry..  */.  testc
d540: 61 73 65 28 20 67 61 70 2b 32 2b 6e 42 79 74 65  ase( gap+2+nByte
d550: 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20 67  ==top );.  if( g
d560: 61 70 2b 32 2b 6e 42 79 74 65 3e 74 6f 70 20 29  ap+2+nByte>top )
d570: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
d580: 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20  age->nCell>0 || 
d590: 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
d5a0: 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e    rc = defragmen
d5b0: 74 50 61 67 65 28 70 50 61 67 65 2c 20 4d 49 4e  tPage(pPage, MIN
d5c0: 28 34 2c 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  (4, pPage->nFree
d5d0: 20 2d 20 28 32 2b 6e 42 79 74 65 29 29 29 3b 0a   - (2+nByte)));.
d5e0: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
d5f0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20  urn rc;.    top 
d600: 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  = get2byteNotZer
d610: 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  o(&data[hdr+5]);
d620: 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 61 70  .    assert( gap
d630: 2b 32 2b 6e 42 79 74 65 3c 3d 74 6f 70 20 29 3b  +2+nByte<=top );
d640: 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  .  }...  /* Allo
d650: 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d  cate memory from
d660: 20 74 68 65 20 67 61 70 20 69 6e 20 62 65 74 77   the gap in betw
d670: 65 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69  een the cell poi
d680: 6e 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a 20  nter array.  ** 
d690: 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  and the cell con
d6a0: 74 65 6e 74 20 61 72 65 61 2e 20 20 54 68 65 20  tent area.  The 
d6b0: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
d6c0: 63 61 6c 6c 20 68 61 73 20 61 6c 72 65 61 64 79  call has already
d6d0: 0a 20 20 2a 2a 20 76 61 6c 69 64 61 74 65 64 20  .  ** validated 
d6e0: 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 47  the freelist.  G
d6f0: 69 76 65 6e 20 74 68 61 74 20 74 68 65 20 66 72  iven that the fr
d700: 65 65 6c 69 73 74 20 69 73 20 76 61 6c 69 64 2c  eelist is valid,
d710: 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e   there.  ** is n
d720: 6f 20 77 61 79 20 74 68 61 74 20 74 68 65 20 61  o way that the a
d730: 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 20 65 78  llocation can ex
d740: 74 65 6e 64 20 6f 66 66 20 74 68 65 20 65 6e 64  tend off the end
d750: 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 20 20   of the page..  
d760: 2a 2a 20 54 68 65 20 61 73 73 65 72 74 28 29 20  ** The assert() 
d770: 62 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74  below verifies t
d780: 68 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74  he previous sent
d790: 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70  ence..  */.  top
d7a0: 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 70 75 74   -= nByte;.  put
d7b0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
d7c0: 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 61 73 73 65  5], top);.  asse
d7d0: 72 74 28 20 74 6f 70 2b 6e 42 79 74 65 20 3c 3d  rt( top+nByte <=
d7e0: 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74   (int)pPage->pBt
d7f0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
d800: 20 20 2a 70 49 64 78 20 3d 20 74 6f 70 3b 0a 20    *pIdx = top;. 
d810: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d820: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K;.}../*.** Retu
d830: 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f 66 20  rn a section of 
d840: 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61  the pPage->aData
d850: 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
d860: 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62  ..** The first b
d870: 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77 20 66  yte of the new f
d880: 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70 50 61  ree block is pPa
d890: 67 65 2d 3e 61 44 61 74 61 5b 69 53 74 61 72 74  ge->aData[iStart
d8a0: 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69 7a  ].** and the siz
d8b0: 65 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 69  e of the block i
d8c0: 73 20 69 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a  s iSize bytes..*
d8d0: 2a 0a 2a 2a 20 41 64 6a 61 63 65 6e 74 20 66 72  *.** Adjacent fr
d8e0: 65 65 62 6c 6f 63 6b 73 20 61 72 65 20 63 6f 61  eeblocks are coa
d8f0: 6c 65 73 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  lesced..**.** No
d900: 74 65 20 74 68 61 74 20 65 76 65 6e 20 74 68 6f  te that even tho
d910: 75 67 68 20 74 68 65 20 66 72 65 65 62 6c 6f 63  ugh the freebloc
d920: 6b 20 6c 69 73 74 20 77 61 73 20 63 68 65 63 6b  k list was check
d930: 65 64 20 62 79 20 62 74 72 65 65 49 6e 69 74 50  ed by btreeInitP
d940: 61 67 65 28 29 2c 0a 2a 2a 20 74 68 61 74 20 72  age(),.** that r
d950: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6e 6f 74 20  outine will not 
d960: 64 65 74 65 63 74 20 6f 76 65 72 6c 61 70 20 62  detect overlap b
d970: 65 74 77 65 65 6e 20 63 65 6c 6c 73 20 6f 72 20  etween cells or 
d980: 66 72 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 72  freeblocks.  Nor
d990: 0a 2a 2a 20 64 6f 65 73 20 69 74 20 64 65 74 65  .** does it dete
d9a0: 63 74 20 63 65 6c 6c 73 20 6f 72 20 66 72 65 65  ct cells or free
d9b0: 62 6c 6f 63 6b 73 20 74 68 61 74 20 65 6e 63 72  blocks that encr
d9c0: 6f 75 63 68 20 69 6e 74 6f 20 74 68 65 20 72 65  ouch into the re
d9d0: 73 65 72 76 65 64 20 62 79 74 65 73 0a 2a 2a 20  served bytes.** 
d9e0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
d9f0: 65 20 70 61 67 65 2e 20 20 53 6f 20 64 6f 20 61  e page.  So do a
da00: 64 64 69 74 69 6f 6e 61 6c 20 63 6f 72 72 75 70  dditional corrup
da10: 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 6e 73 69  tion checks insi
da20: 64 65 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  de this.** routi
da30: 6e 65 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ne and return SQ
da40: 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20  LITE_CORRUPT if 
da50: 61 6e 79 20 70 72 6f 62 6c 65 6d 73 20 61 72 65  any problems are
da60: 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69   found..*/.stati
da70: 63 20 69 6e 74 20 66 72 65 65 53 70 61 63 65 28  c int freeSpace(
da80: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
da90: 75 31 36 20 69 53 74 61 72 74 2c 20 75 31 36 20  u16 iStart, u16 
daa0: 69 53 69 7a 65 29 7b 0a 20 20 75 31 36 20 69 50  iSize){.  u16 iP
dab0: 74 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  tr;             
dac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dad0: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 70 74  /* Address of pt
dae0: 72 20 74 6f 20 6e 65 78 74 20 66 72 65 65 62 6c  r to next freebl
daf0: 6f 63 6b 20 2a 2f 0a 20 20 75 31 36 20 69 46 72  ock */.  u16 iFr
db00: 65 65 42 6c 6b 3b 20 20 20 20 20 20 20 20 20 20  eeBlk;          
db10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
db20: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
db30: 20 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20   next freeblock 
db40: 2a 2f 0a 20 20 75 38 20 68 64 72 3b 20 20 20 20  */.  u8 hdr;    
db50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
db70: 67 65 20 68 65 61 64 65 72 20 73 69 7a 65 2e 20  ge header size. 
db80: 20 30 20 6f 72 20 31 30 30 20 2a 2f 0a 20 20 75   0 or 100 */.  u
db90: 38 20 6e 46 72 61 67 20 3d 20 30 3b 20 20 20 20  8 nFrag = 0;    
dba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbb0: 20 20 20 20 20 2f 2a 20 52 65 64 75 63 74 69 6f       /* Reductio
dbc0: 6e 20 69 6e 20 66 72 61 67 6d 65 6e 74 61 74 69  n in fragmentati
dbd0: 6f 6e 20 2a 2f 0a 20 20 75 31 36 20 69 4f 72 69  on */.  u16 iOri
dbe0: 67 53 69 7a 65 20 3d 20 69 53 69 7a 65 3b 20 20  gSize = iSize;  
dbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dc00: 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20   Original value 
dc10: 6f 66 20 69 53 69 7a 65 20 2a 2f 0a 20 20 75 33  of iSize */.  u3
dc20: 32 20 69 4c 61 73 74 20 3d 20 70 50 61 67 65 2d  2 iLast = pPage-
dc30: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
dc40: 2d 34 3b 20 2f 2a 20 4c 61 72 67 65 73 74 20 70  -4; /* Largest p
dc50: 6f 73 73 69 62 6c 65 20 66 72 65 65 62 6c 6f 63  ossible freebloc
dc60: 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 75 33  k offset */.  u3
dc70: 32 20 69 45 6e 64 20 3d 20 69 53 74 61 72 74 20  2 iEnd = iStart 
dc80: 2b 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20 20  + iSize;        
dc90: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
dca0: 65 20 70 61 73 74 20 74 68 65 20 69 53 74 61 72  e past the iStar
dcb0: 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 75 6e  t buffer */.  un
dcc0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
dcd0: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
dce0: 3b 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74  ;   /* Page cont
dcf0: 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ent */..  assert
dd00: 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20  ( pPage->pBt!=0 
dd10: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
dd20: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
dd30: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
dd40: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
dd50: 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
dd60: 69 53 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68  iStart>=pPage->h
dd70: 64 72 4f 66 66 73 65 74 2b 36 2b 70 50 61 67 65  drOffset+6+pPage
dd80: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 29  ->childPtrSize )
dd90: 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52  ;.  assert( CORR
dda0: 55 50 54 5f 44 42 20 7c 7c 20 69 45 6e 64 20 3c  UPT_DB || iEnd <
ddb0: 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  = pPage->pBt->us
ddc0: 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73  ableSize );.  as
ddd0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
dde0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
ddf0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
de00: 20 61 73 73 65 72 74 28 20 69 53 69 7a 65 3e 3d   assert( iSize>=
de10: 34 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75  4 );   /* Minimu
de20: 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34  m cell size is 4
de30: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 53   */.  assert( iS
de40: 74 61 72 74 3c 3d 69 4c 61 73 74 20 29 3b 0a 0a  tart<=iLast );..
de50: 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64    /* Overwrite d
de60: 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69  eleted informati
de70: 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68  on with zeros wh
de80: 65 6e 20 74 68 65 20 73 65 63 75 72 65 5f 64 65  en the secure_de
de90: 6c 65 74 65 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e  lete.  ** option
dea0: 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20   is enabled */. 
deb0: 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d   if( pPage->pBt-
dec0: 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
ded0: 46 41 53 54 5f 53 45 43 55 52 45 20 29 7b 0a 20  FAST_SECURE ){. 
dee0: 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b     memset(&data[
def0: 69 53 74 61 72 74 5d 2c 20 30 2c 20 69 53 69 7a  iStart], 0, iSiz
df00: 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  e);.  }..  /* Th
df10: 65 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62 6c  e list of freebl
df20: 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20  ocks must be in 
df30: 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  ascending order.
df40: 20 20 46 69 6e 64 20 74 68 65 20 0a 20 20 2a 2a    Find the .  **
df50: 20 73 70 6f 74 20 6f 6e 20 74 68 65 20 6c 69 73   spot on the lis
df60: 74 20 77 68 65 72 65 20 69 53 74 61 72 74 20 73  t where iStart s
df70: 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74 65  hould be inserte
df80: 64 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20  d..  */.  hdr = 
df90: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
dfa0: 3b 0a 20 20 69 50 74 72 20 3d 20 68 64 72 20 2b  ;.  iPtr = hdr +
dfb0: 20 31 3b 0a 20 20 69 66 28 20 64 61 74 61 5b 69   1;.  if( data[i
dfc0: 50 74 72 2b 31 5d 3d 3d 30 20 26 26 20 64 61 74  Ptr+1]==0 && dat
dfd0: 61 5b 69 50 74 72 5d 3d 3d 30 20 29 7b 0a 20 20  a[iPtr]==0 ){.  
dfe0: 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 30 3b 20    iFreeBlk = 0; 
dff0: 20 2f 2a 20 53 68 6f 72 74 63 75 74 20 66 6f 72   /* Shortcut for
e000: 20 74 68 65 20 63 61 73 65 20 77 68 65 6e 20 74   the case when t
e010: 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 65  he freelist is e
e020: 6d 70 74 79 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  mpty */.  }else{
e030: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 69 46 72  .    while( (iFr
e040: 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74 65  eeBlk = get2byte
e050: 28 26 64 61 74 61 5b 69 50 74 72 5d 29 29 3c 69  (&data[iPtr]))<i
e060: 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 69  Start ){.      i
e070: 66 28 20 69 46 72 65 65 42 6c 6b 3c 69 50 74 72  f( iFreeBlk<iPtr
e080: 2b 34 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  +4 ){.        if
e090: 28 20 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29 20  ( iFreeBlk==0 ) 
e0a0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 72  break;.        r
e0b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
e0c0: 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d  RUPT_PGNO(pPage-
e0d0: 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a  >pgno);.      }.
e0e0: 20 20 20 20 20 20 69 50 74 72 20 3d 20 69 46 72        iPtr = iFr
e0f0: 65 65 42 6c 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  eeBlk;.    }.   
e100: 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3e 69 4c   if( iFreeBlk>iL
e110: 61 73 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ast ) return SQL
e120: 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f  ITE_CORRUPT_PGNO
e130: 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20  (pPage->pgno);. 
e140: 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65     assert( iFree
e150: 42 6c 6b 3e 69 50 74 72 20 7c 7c 20 69 46 72 65  Blk>iPtr || iFre
e160: 65 42 6c 6b 3d 3d 30 20 29 3b 0a 20 20 0a 20 20  eBlk==0 );.  .  
e170: 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
e180: 6e 74 3a 0a 20 20 20 20 2a 2a 20 20 20 20 69 46  nt:.    **    iF
e190: 72 65 65 42 6c 6b 3a 20 20 20 46 69 72 73 74 20  reeBlk:   First 
e1a0: 66 72 65 65 62 6c 6f 63 6b 20 61 66 74 65 72 20  freeblock after 
e1b0: 69 53 74 61 72 74 2c 20 6f 72 20 7a 65 72 6f 20  iStart, or zero 
e1c0: 69 66 20 6e 6f 6e 65 0a 20 20 20 20 2a 2a 20 20  if none.    **  
e1d0: 20 20 69 50 74 72 3a 20 20 20 20 20 20 20 54 68    iPtr:       Th
e1e0: 65 20 61 64 64 72 65 73 73 20 6f 66 20 61 20 70  e address of a p
e1f0: 6f 69 6e 74 65 72 20 74 6f 20 69 46 72 65 65 42  ointer to iFreeB
e200: 6c 6b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  lk.    **.    **
e210: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
e220: 20 69 46 72 65 65 42 6c 6b 20 73 68 6f 75 6c 64   iFreeBlk should
e230: 20 62 65 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e   be coalesced on
e240: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 69 53  to the end of iS
e250: 74 61 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tart..    */.   
e260: 20 69 66 28 20 69 46 72 65 65 42 6c 6b 20 26 26   if( iFreeBlk &&
e270: 20 69 45 6e 64 2b 33 3e 3d 69 46 72 65 65 42 6c   iEnd+3>=iFreeBl
e280: 6b 20 29 7b 0a 20 20 20 20 20 20 6e 46 72 61 67  k ){.      nFrag
e290: 20 3d 20 69 46 72 65 65 42 6c 6b 20 2d 20 69 45   = iFreeBlk - iE
e2a0: 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45  nd;.      if( iE
e2b0: 6e 64 3e 69 46 72 65 65 42 6c 6b 20 29 20 72 65  nd>iFreeBlk ) re
e2c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
e2d0: 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e  UPT_PGNO(pPage->
e2e0: 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 45 6e  pgno);.      iEn
e2f0: 64 20 3d 20 69 46 72 65 65 42 6c 6b 20 2b 20 67  d = iFreeBlk + g
e300: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46  et2byte(&data[iF
e310: 72 65 65 42 6c 6b 2b 32 5d 29 3b 0a 20 20 20 20  reeBlk+2]);.    
e320: 20 20 69 66 28 20 69 45 6e 64 20 3e 20 70 50 61    if( iEnd > pPa
e330: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
e340: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ize ){.        r
e350: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
e360: 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d  RUPT_PGNO(pPage-
e370: 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a  >pgno);.      }.
e380: 20 20 20 20 20 20 69 53 69 7a 65 20 3d 20 69 45        iSize = iE
e390: 6e 64 20 2d 20 69 53 74 61 72 74 3b 0a 20 20 20  nd - iStart;.   
e3a0: 20 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 67 65     iFreeBlk = ge
e3b0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72  t2byte(&data[iFr
e3c0: 65 65 42 6c 6b 5d 29 3b 0a 20 20 20 20 7d 0a 20  eeBlk]);.    }. 
e3d0: 20 0a 20 20 20 20 2f 2a 20 49 66 20 69 50 74 72   .    /* If iPtr
e3e0: 20 69 73 20 61 6e 6f 74 68 65 72 20 66 72 65 65   is another free
e3f0: 62 6c 6f 63 6b 20 28 74 68 61 74 20 69 73 2c 20  block (that is, 
e400: 69 66 20 69 50 74 72 20 69 73 20 6e 6f 74 20 74  if iPtr is not t
e410: 68 65 20 66 72 65 65 6c 69 73 74 0a 20 20 20 20  he freelist.    
e420: 2a 2a 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68  ** pointer in th
e430: 65 20 70 61 67 65 20 68 65 61 64 65 72 29 20 74  e page header) t
e440: 68 65 6e 20 63 68 65 63 6b 20 74 6f 20 73 65 65  hen check to see
e450: 20 69 66 20 69 53 74 61 72 74 20 73 68 6f 75 6c   if iStart shoul
e460: 64 20 62 65 0a 20 20 20 20 2a 2a 20 63 6f 61 6c  d be.    ** coal
e470: 65 73 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65  esced onto the e
e480: 6e 64 20 6f 66 20 69 50 74 72 2e 0a 20 20 20 20  nd of iPtr..    
e490: 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 74 72 3e  */.    if( iPtr>
e4a0: 68 64 72 2b 31 20 29 7b 0a 20 20 20 20 20 20 69  hdr+1 ){.      i
e4b0: 6e 74 20 69 50 74 72 45 6e 64 20 3d 20 69 50 74  nt iPtrEnd = iPt
e4c0: 72 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61  r + get2byte(&da
e4d0: 74 61 5b 69 50 74 72 2b 32 5d 29 3b 0a 20 20 20  ta[iPtr+2]);.   
e4e0: 20 20 20 69 66 28 20 69 50 74 72 45 6e 64 2b 33     if( iPtrEnd+3
e4f0: 3e 3d 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20  >=iStart ){.    
e500: 20 20 20 20 69 66 28 20 69 50 74 72 45 6e 64 3e      if( iPtrEnd>
e510: 69 53 74 61 72 74 20 29 20 72 65 74 75 72 6e 20  iStart ) return 
e520: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
e530: 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29  GNO(pPage->pgno)
e540: 3b 0a 20 20 20 20 20 20 20 20 6e 46 72 61 67 20  ;.        nFrag 
e550: 2b 3d 20 69 53 74 61 72 74 20 2d 20 69 50 74 72  += iStart - iPtr
e560: 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 69 53 69  End;.        iSi
e570: 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 50 74 72  ze = iEnd - iPtr
e580: 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74  ;.        iStart
e590: 20 3d 20 69 50 74 72 3b 0a 20 20 20 20 20 20 7d   = iPtr;.      }
e5a0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
e5b0: 46 72 61 67 3e 64 61 74 61 5b 68 64 72 2b 37 5d  Frag>data[hdr+7]
e5c0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
e5d0: 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50  _CORRUPT_PGNO(pP
e5e0: 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  age->pgno);.    
e5f0: 64 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 6e  data[hdr+7] -= n
e600: 46 72 61 67 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Frag;.  }.  if( 
e610: 69 53 74 61 72 74 3d 3d 67 65 74 32 62 79 74 65  iStart==get2byte
e620: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29  (&data[hdr+5]) )
e630: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77  {.    /* The new
e640: 20 66 72 65 65 62 6c 6f 63 6b 20 69 73 20 61 74   freeblock is at
e650: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
e660: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
e670: 6e 74 20 61 72 65 61 2c 0a 20 20 20 20 2a 2a 20  nt area,.    ** 
e680: 73 6f 20 6a 75 73 74 20 65 78 74 65 6e 64 20 74  so just extend t
e690: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
e6a0: 61 72 65 61 20 72 61 74 68 65 72 20 74 68 61 6e  area rather than
e6b0: 20 63 72 65 61 74 65 20 61 6e 6f 74 68 65 72 0a   create another.
e6c0: 20 20 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20      ** freelist 
e6d0: 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20 69 66 28  entry */.    if(
e6e0: 20 69 50 74 72 21 3d 68 64 72 2b 31 20 29 20 72   iPtr!=hdr+1 ) r
e6f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
e700: 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d  RUPT_PGNO(pPage-
e710: 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 70 75 74 32  >pgno);.    put2
e720: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31  byte(&data[hdr+1
e730: 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20  ], iFreeBlk);.  
e740: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
e750: 5b 68 64 72 2b 35 5d 2c 20 69 45 6e 64 29 3b 0a  [hdr+5], iEnd);.
e760: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
e770: 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 66  Insert the new f
e780: 72 65 65 62 6c 6f 63 6b 20 69 6e 74 6f 20 74 68  reeblock into th
e790: 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20  e freelist */.  
e7a0: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
e7b0: 5b 69 50 74 72 5d 2c 20 69 53 74 61 72 74 29 3b  [iPtr], iStart);
e7c0: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
e7d0: 61 74 61 5b 69 53 74 61 72 74 5d 2c 20 69 46 72  ata[iStart], iFr
e7e0: 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74 32  eeBlk);.    put2
e7f0: 62 79 74 65 28 26 64 61 74 61 5b 69 53 74 61 72  byte(&data[iStar
e800: 74 2b 32 5d 2c 20 69 53 69 7a 65 29 3b 0a 20 20  t+2], iSize);.  
e810: 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  }.  pPage->nFree
e820: 20 2b 3d 20 69 4f 72 69 67 53 69 7a 65 3b 0a 20   += iOrigSize;. 
e830: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
e840: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f  K;.}../*.** Deco
e850: 64 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74  de the flags byt
e860: 65 20 28 74 68 65 20 66 69 72 73 74 20 62 79 74  e (the first byt
e870: 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 29  e of the header)
e880: 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 61   for a page.** a
e890: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66 69  nd initialize fi
e8a0: 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d 50  elds of the MemP
e8b0: 61 67 65 20 73 74 72 75 63 74 75 72 65 20 61 63  age structure ac
e8c0: 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a  cordingly..**.**
e8d0: 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77   Only the follow
e8e0: 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  ing combinations
e8f0: 20 61 72 65 20 73 75 70 70 6f 72 74 65 64 2e 20   are supported. 
e900: 20 41 6e 79 74 68 69 6e 67 20 64 69 66 66 65 72   Anything differ
e910: 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73  ent.** indicates
e920: 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
e930: 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a  ase files:.**.**
e940: 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52           PTF_ZER
e950: 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20 20 20 20  ODATA.**        
e960: 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20   PTF_ZERODATA | 
e970: 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20  PTF_LEAF.**     
e980: 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41      PTF_LEAFDATA
e990: 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a   | PTF_INTKEY.**
e9a0: 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41           PTF_LEA
e9b0: 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b  FDATA | PTF_INTK
e9c0: 45 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f  EY | PTF_LEAF.*/
e9d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 63 6f  .static int deco
e9e0: 64 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65 20  deFlags(MemPage 
e9f0: 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67  *pPage, int flag
ea00: 42 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72 65  Byte){.  BtShare
ea10: 64 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41  d *pBt;     /* A
ea20: 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e   copy of pPage->
ea30: 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  pBt */..  assert
ea40: 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  ( pPage->hdrOffs
ea50: 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f  et==(pPage->pgno
ea60: 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29  ==1 ? 100 : 0) )
ea70: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
ea80: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
ea90: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
eaa0: 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65  ) );.  pPage->le
eab0: 61 66 20 3d 20 28 75 38 29 28 66 6c 61 67 42 79  af = (u8)(flagBy
eac0: 74 65 3e 3e 33 29 3b 20 20 61 73 73 65 72 74 28  te>>3);  assert(
ead0: 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c   PTF_LEAF == 1<<
eae0: 33 20 29 3b 0a 20 20 66 6c 61 67 42 79 74 65 20  3 );.  flagByte 
eaf0: 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20 20  &= ~PTF_LEAF;.  
eb00: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
eb10: 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67 65 2d  ize = 4-4*pPage-
eb20: 3e 6c 65 61 66 3b 0a 20 20 70 50 61 67 65 2d 3e  >leaf;.  pPage->
eb30: 78 43 65 6c 6c 53 69 7a 65 20 3d 20 63 65 6c 6c  xCellSize = cell
eb40: 53 69 7a 65 50 74 72 3b 0a 20 20 70 42 74 20 3d  SizePtr;.  pBt =
eb50: 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69   pPage->pBt;.  i
eb60: 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 28 50 54  f( flagByte==(PT
eb70: 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46  F_LEAFDATA | PTF
eb80: 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20 20  _INTKEY) ){.    
eb90: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
eba0: 52 2d 30 37 32 39 31 2d 33 35 33 32 38 20 41 20  R-07291-35328 A 
ebb0: 76 61 6c 75 65 20 6f 66 20 35 20 28 30 78 30 35  value of 5 (0x05
ebc0: 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65  ) means the page
ebd0: 20 69 73 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e   is an.    ** in
ebe0: 74 65 72 69 6f 72 20 74 61 62 6c 65 20 62 2d 74  terior table b-t
ebf0: 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  ree page. */.   
ec00: 20 61 73 73 65 72 74 28 20 28 50 54 46 5f 4c 45   assert( (PTF_LE
ec10: 41 46 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45  AFDATA|PTF_INTKE
ec20: 59 29 3d 3d 35 20 29 3b 0a 20 20 20 20 2f 2a 20  Y)==5 );.    /* 
ec30: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
ec40: 36 39 30 30 2d 30 39 31 37 36 20 41 20 76 61 6c  6900-09176 A val
ec50: 75 65 20 6f 66 20 31 33 20 28 30 78 30 64 29 20  ue of 13 (0x0d) 
ec60: 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69  means the page i
ec70: 73 20 61 0a 20 20 20 20 2a 2a 20 6c 65 61 66 20  s a.    ** leaf 
ec80: 74 61 62 6c 65 20 62 2d 74 72 65 65 20 70 61 67  table b-tree pag
ec90: 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
eca0: 28 20 28 50 54 46 5f 4c 45 41 46 44 41 54 41 7c  ( (PTF_LEAFDATA|
ecb0: 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c  PTF_INTKEY|PTF_L
ecc0: 45 41 46 29 3d 3d 31 33 20 29 3b 0a 20 20 20 20  EAF)==13 );.    
ecd0: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20  pPage->intKey = 
ece0: 31 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  1;.    if( pPage
ecf0: 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
ed00: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61  pPage->intKeyLea
ed10: 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 50 61  f = 1;.      pPa
ed20: 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d  ge->xParseCell =
ed30: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
ed40: 74 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  tr;.    }else{. 
ed50: 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b       pPage->intK
ed60: 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20  eyLeaf = 0;.    
ed70: 20 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69    pPage->xCellSi
ed80: 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ze = cellSizePtr
ed90: 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 20  NoPayload;.     
eda0: 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
edb0: 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65 43  ll = btreeParseC
edc0: 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61 64 3b  ellPtrNoPayload;
edd0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
ede0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74  ->maxLocal = pBt
edf0: 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20 70  ->maxLeaf;.    p
ee00: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d  Page->minLocal =
ee10: 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20   pBt->minLeaf;. 
ee20: 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 42   }else if( flagB
ee30: 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54  yte==PTF_ZERODAT
ee40: 41 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44  A ){.    /* EVID
ee50: 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 33 31 36  ENCE-OF: R-43316
ee60: 2d 33 37 33 30 38 20 41 20 76 61 6c 75 65 20 6f  -37308 A value o
ee70: 66 20 32 20 28 30 78 30 32 29 20 6d 65 61 6e 73  f 2 (0x02) means
ee80: 20 74 68 65 20 70 61 67 65 20 69 73 20 61 6e 0a   the page is an.
ee90: 20 20 20 20 2a 2a 20 69 6e 74 65 72 69 6f 72 20      ** interior 
eea0: 69 6e 64 65 78 20 62 2d 74 72 65 65 20 70 61 67  index b-tree pag
eeb0: 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
eec0: 28 20 28 50 54 46 5f 5a 45 52 4f 44 41 54 41 29  ( (PTF_ZERODATA)
eed0: 3d 3d 32 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56  ==2 );.    /* EV
eee0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 36  IDENCE-OF: R-596
eef0: 31 35 2d 34 32 38 32 38 20 41 20 76 61 6c 75 65  15-42828 A value
ef00: 20 6f 66 20 31 30 20 28 30 78 30 61 29 20 6d 65   of 10 (0x0a) me
ef10: 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20  ans the page is 
ef20: 61 0a 20 20 20 20 2a 2a 20 6c 65 61 66 20 69 6e  a.    ** leaf in
ef30: 64 65 78 20 62 2d 74 72 65 65 20 70 61 67 65 2e  dex b-tree page.
ef40: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
ef50: 28 50 54 46 5f 5a 45 52 4f 44 41 54 41 7c 50 54  (PTF_ZERODATA|PT
ef60: 46 5f 4c 45 41 46 29 3d 3d 31 30 20 29 3b 0a 20  F_LEAF)==10 );. 
ef70: 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79     pPage->intKey
ef80: 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d   = 0;.    pPage-
ef90: 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30 3b  >intKeyLeaf = 0;
efa0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72  .    pPage->xPar
efb0: 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61  seCell = btreePa
efc0: 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 3b  rseCellPtrIndex;
efd0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c  .    pPage->maxL
efe0: 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c  ocal = pBt->maxL
eff0: 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d  ocal;.    pPage-
f000: 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d  >minLocal = pBt-
f010: 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c  >minLocal;.  }el
f020: 73 65 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45  se{.    /* EVIDE
f030: 4e 43 45 2d 4f 46 3a 20 52 2d 34 37 36 30 38 2d  NCE-OF: R-47608-
f040: 35 36 34 36 39 20 41 6e 79 20 6f 74 68 65 72 20  56469 Any other 
f050: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 62 2d  value for the b-
f060: 74 72 65 65 20 70 61 67 65 20 74 79 70 65 20 69  tree page type i
f070: 73 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f  s.    ** an erro
f080: 72 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  r. */.    return
f090: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
f0a0: 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f  PGNO(pPage->pgno
f0b0: 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e  );.  }.  pPage->
f0c0: 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20  max1bytePayload 
f0d0: 3d 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50  = pBt->max1byteP
f0e0: 61 79 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e  ayload;.  return
f0f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
f100: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
f110: 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e  the auxiliary in
f120: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20  formation for a 
f130: 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  disk block..**.*
f140: 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
f150: 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  OK on success.  
f160: 49 66 20 77 65 20 73 65 65 20 74 68 61 74 20 74  If we see that t
f170: 68 65 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20  he page does.** 
f180: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 77 65  not contain a we
f190: 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61  ll-formed databa
f1a0: 73 65 20 70 61 67 65 2c 20 74 68 65 6e 20 72 65  se page, then re
f1b0: 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  turn .** SQLITE_
f1c0: 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65 20 74  CORRUPT.  Note t
f1d0: 68 61 74 20 61 20 72 65 74 75 72 6e 20 6f 66 20  hat a return of 
f1e0: 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e  SQLITE_OK does n
f1f0: 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 20  ot.** guarantee 
f200: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
f210: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49   well-formed.  I
f220: 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68 61  t only shows tha
f230: 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64 20 74  t.** we failed t
f240: 6f 20 64 65 74 65 63 74 20 61 6e 79 20 63 6f 72  o detect any cor
f250: 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ruption..*/.stat
f260: 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e 69 74  ic int btreeInit
f270: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
f280: 61 67 65 29 7b 0a 20 20 69 6e 74 20 70 63 3b 20  age){.  int pc; 
f290: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
f2a0: 64 72 65 73 73 20 6f 66 20 61 20 66 72 65 65 62  dress of a freeb
f2b0: 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67  lock within pPag
f2c0: 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20  e->aData[] */.  
f2d0: 75 38 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  u8 hdr;         
f2e0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
f2f0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67  beginning of pag
f300: 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 38  e header */.  u8
f310: 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
f320: 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61   /* Equal to pPa
f330: 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 42  ge->aData */.  B
f340: 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
f350: 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e       /* The main
f360: 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
f370: 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   */.  int usable
f380: 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75  Size;    /* Amou
f390: 6e 74 20 6f 66 20 75 73 61 62 6c 65 20 73 70 61  nt of usable spa
f3a0: 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  ce on each page 
f3b0: 2a 2f 0a 20 20 75 31 36 20 63 65 6c 6c 4f 66 66  */.  u16 cellOff
f3c0: 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65  set;    /* Offse
f3d0: 74 20 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20  t from start of 
f3e0: 70 61 67 65 20 74 6f 20 66 69 72 73 74 20 63 65  page to first ce
f3f0: 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  ll pointer */.  
f400: 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20  int nFree;      
f410: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
f420: 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20  unused bytes on 
f430: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  the page */.  in
f440: 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
f450: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
f460: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
f470: 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74  nt area */.  int
f480: 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20   iCellFirst;    
f490: 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62  /* First allowab
f4a0: 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62  le cell or freeb
f4b0: 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20  lock offset */. 
f4c0: 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20   int iCellLast; 
f4d0: 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73      /* Last poss
f4e0: 69 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65  ible cell or fre
f4f0: 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f  eblock offset */
f500: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
f510: 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61  e->pBt!=0 );.  a
f520: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
f530: 74 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 61 73  t->db!=0 );.  as
f540: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
f550: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
f560: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
f570: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
f580: 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67  pgno==sqlite3Pag
f590: 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61  erPagenumber(pPa
f5a0: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
f5b0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20    assert( pPage 
f5c0: 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  == sqlite3PagerG
f5d0: 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
f5e0: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
f5f0: 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
f600: 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65  a == sqlite3Page
f610: 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
f620: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
f630: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
f640: 6e 69 74 3d 3d 30 20 29 3b 0a 0a 20 20 70 42 74  nit==0 );..  pBt
f650: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
f660: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
f670: 72 4f 66 66 73 65 74 3b 0a 20 20 64 61 74 61 20  rOffset;.  data 
f680: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
f690: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
f6a0: 3a 20 52 2d 32 38 35 39 34 2d 30 32 38 39 30 20  : R-28594-02890 
f6b0: 54 68 65 20 6f 6e 65 2d 62 79 74 65 20 66 6c 61  The one-byte fla
f6c0: 67 20 61 74 20 6f 66 66 73 65 74 20 30 20 69 6e  g at offset 0 in
f6d0: 64 69 63 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68  dicating.  ** th
f6e0: 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 74 79  e b-tree page ty
f6f0: 70 65 2e 20 2a 2f 0a 20 20 69 66 28 20 64 65 63  pe. */.  if( dec
f700: 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20  odeFlags(pPage, 
f710: 64 61 74 61 5b 68 64 72 5d 29 20 29 7b 0a 20 20  data[hdr]) ){.  
f720: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f730: 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61  CORRUPT_PGNO(pPa
f740: 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  ge->pgno);.  }. 
f750: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61   assert( pBt->pa
f760: 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
f770: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35  Bt->pageSize<=65
f780: 35 33 36 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e  536 );.  pPage->
f790: 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29  maskPage = (u16)
f7a0: 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  (pBt->pageSize -
f7b0: 20 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f   1);.  pPage->nO
f7c0: 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 75  verflow = 0;.  u
f7d0: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
f7e0: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 70  >usableSize;.  p
f7f0: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
f800: 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20   = cellOffset = 
f810: 68 64 72 20 2b 20 38 20 2b 20 70 50 61 67 65 2d  hdr + 8 + pPage-
f820: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20  >childPtrSize;. 
f830: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64   pPage->aDataEnd
f840: 20 3d 20 26 64 61 74 61 5b 75 73 61 62 6c 65 53   = &data[usableS
f850: 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61  ize];.  pPage->a
f860: 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b  CellIdx = &data[
f870: 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a 20 20 70  cellOffset];.  p
f880: 50 61 67 65 2d 3e 61 44 61 74 61 4f 66 73 74 20  Page->aDataOfst 
f890: 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63  = &data[pPage->c
f8a0: 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20  hildPtrSize];.  
f8b0: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
f8c0: 52 2d 35 38 30 31 35 2d 34 38 31 37 35 20 54 68  R-58015-48175 Th
f8d0: 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67  e two-byte integ
f8e0: 65 72 20 61 74 20 6f 66 66 73 65 74 20 35 20 64  er at offset 5 d
f8f0: 65 73 69 67 6e 61 74 65 73 0a 20 20 2a 2a 20 74  esignates.  ** t
f900: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
f910: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
f920: 61 2e 20 41 20 7a 65 72 6f 20 76 61 6c 75 65 20  a. A zero value 
f930: 66 6f 72 20 74 68 69 73 20 69 6e 74 65 67 65 72  for this integer
f940: 20 69 73 0a 20 20 2a 2a 20 69 6e 74 65 72 70 72   is.  ** interpr
f950: 65 74 65 64 20 61 73 20 36 35 35 33 36 2e 20 2a  eted as 65536. *
f960: 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79  /.  top = get2by
f970: 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b  teNotZero(&data[
f980: 68 64 72 2b 35 5d 29 3b 0a 20 20 2f 2a 20 45 56  hdr+5]);.  /* EV
f990: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 30  IDENCE-OF: R-370
f9a0: 30 32 2d 33 32 37 37 34 20 54 68 65 20 74 77 6f  02-32774 The two
f9b0: 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 61 74  -byte integer at
f9c0: 20 6f 66 66 73 65 74 20 33 20 67 69 76 65 73 20   offset 3 gives 
f9d0: 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20  the.  ** number 
f9e0: 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20  of cells on the 
f9f0: 70 61 67 65 2e 20 2a 2f 0a 20 20 70 50 61 67 65  page. */.  pPage
fa00: 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79  ->nCell = get2by
fa10: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29  te(&data[hdr+3])
fa20: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e  ;.  if( pPage->n
fa30: 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74  Cell>MX_CELL(pBt
fa40: 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 6f 20 6d  ) ){.    /* To m
fa50: 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20  any cells for a 
fa60: 73 69 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68  single page.  Th
fa70: 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20 63  e page must be c
fa80: 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 72 65  orrupt */.    re
fa90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
faa0: 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e  UPT_PGNO(pPage->
fab0: 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 74 65 73  pgno);.  }.  tes
fac0: 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 43  tcase( pPage->nC
fad0: 65 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42 74  ell==MX_CELL(pBt
fae0: 29 20 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e  ) );.  /* EVIDEN
faf0: 43 45 2d 4f 46 3a 20 52 2d 32 34 30 38 39 2d 35  CE-OF: R-24089-5
fb00: 37 39 37 39 20 49 66 20 61 20 70 61 67 65 20 63  7979 If a page c
fb10: 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73  ontains no cells
fb20: 20 28 77 68 69 63 68 20 69 73 20 6f 6e 6c 79 0a   (which is only.
fb30: 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 20 66 6f    ** possible fo
fb40: 72 20 61 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  r a root page of
fb50: 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 63 6f   a table that co
fb60: 6e 74 61 69 6e 73 20 6e 6f 20 72 6f 77 73 29 20  ntains no rows) 
fb70: 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 66  then the.  ** of
fb80: 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c  fset to the cell
fb90: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 77 69   content area wi
fba0: 6c 6c 20 65 71 75 61 6c 20 74 68 65 20 70 61 67  ll equal the pag
fbb0: 65 20 73 69 7a 65 20 6d 69 6e 75 73 20 74 68 65  e size minus the
fbc0: 0a 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 72  .  ** bytes of r
fbd0: 65 73 65 72 76 65 64 20 73 70 61 63 65 2e 20 2a  eserved space. *
fbe0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
fbf0: 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 74 6f  e->nCell>0 || to
fc00: 70 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c  p==usableSize ||
fc10: 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 0a   CORRUPT_DB );..
fc20: 20 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64    /* A malformed
fc30: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d   database page m
fc40: 69 67 68 74 20 63 61 75 73 65 20 75 73 20 74 6f  ight cause us to
fc50: 20 72 65 61 64 20 70 61 73 74 20 74 68 65 20 65   read past the e
fc60: 6e 64 0a 20 20 2a 2a 20 6f 66 20 70 61 67 65 20  nd.  ** of page 
fc70: 77 68 65 6e 20 70 61 72 73 69 6e 67 20 61 20 63  when parsing a c
fc80: 65 6c 6c 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a  ell.  .  **.  **
fc90: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
fca0: 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 63 68 65  lock of code che
fcb0: 63 6b 73 20 65 61 72 6c 79 20 74 6f 20 73 65 65  cks early to see
fcc0: 20 69 66 20 61 20 63 65 6c 6c 20 65 78 74 65 6e   if a cell exten
fcd0: 64 73 0a 20 20 2a 2a 20 70 61 73 74 20 74 68 65  ds.  ** past the
fce0: 20 65 6e 64 20 6f 66 20 61 20 70 61 67 65 20 62   end of a page b
fcf0: 6f 75 6e 64 61 72 79 20 61 6e 64 20 63 61 75 73  oundary and caus
fd00: 65 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  es SQLITE_CORRUP
fd10: 54 20 74 6f 20 62 65 20 0a 20 20 2a 2a 20 72 65  T to be .  ** re
fd20: 74 75 72 6e 65 64 20 69 66 20 69 74 20 64 6f 65  turned if it doe
fd30: 73 2e 0a 20 20 2a 2f 0a 20 20 69 43 65 6c 6c 46  s..  */.  iCellF
fd40: 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65  irst = cellOffse
fd50: 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65  t + 2*pPage->nCe
fd60: 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74 20  ll;.  iCellLast 
fd70: 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  = usableSize - 4
fd80: 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 64 62 2d  ;.  if( pBt->db-
fd90: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
fda0: 43 65 6c 6c 53 69 7a 65 43 6b 20 29 7b 0a 20 20  CellSizeCk ){.  
fdb0: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
fdc0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74      /* Index int
fdd0: 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  o the cell point
fde0: 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20  er array */.    
fdf0: 69 6e 74 20 73 7a 3b 20 20 20 20 20 20 20 20 20  int sz;         
fe00: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63    /* Size of a c
fe10: 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20  ell */..    if( 
fe20: 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69  !pPage->leaf ) i
fe30: 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20 20  CellLast--;.    
fe40: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65  for(i=0; i<pPage
fe50: 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  ->nCell; i++){. 
fe60: 20 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79       pc = get2by
fe70: 74 65 41 6c 69 67 6e 65 64 28 26 64 61 74 61 5b  teAligned(&data[
fe80: 63 65 6c 6c 4f 66 66 73 65 74 2b 69 2a 32 5d 29  cellOffset+i*2])
fe90: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
fea0: 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74  ( pc==iCellFirst
feb0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
fec0: 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73  se( pc==iCellLas
fed0: 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t );.      if( p
fee0: 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20  c<iCellFirst || 
fef0: 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
ff00: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
ff10: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47  QLITE_CORRUPT_PG
ff20: 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  NO(pPage->pgno);
ff30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
ff40: 7a 20 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c  z = pPage->xCell
ff50: 53 69 7a 65 28 70 50 61 67 65 2c 20 26 64 61 74  Size(pPage, &dat
ff60: 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 74 65  a[pc]);.      te
ff70: 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 75  stcase( pc+sz==u
ff80: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
ff90: 20 20 20 69 66 28 20 70 63 2b 73 7a 3e 75 73 61     if( pc+sz>usa
ffa0: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
ffb0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ffc0: 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50  _CORRUPT_PGNO(pP
ffd0: 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  age->pgno);.    
ffe0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
fff0: 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
10000 20 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a 20 20   iCellLast++;.  
10010 7d 20 20 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74  }  ..  /* Comput
10020 65 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65  e the total free
10030 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61   space on the pa
10040 67 65 0a 20 20 2a 2a 20 45 56 49 44 45 4e 43 45  ge.  ** EVIDENCE
10050 2d 4f 46 3a 20 52 2d 32 33 35 38 38 2d 33 34 34  -OF: R-23588-344
10060 35 30 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20  50 The two-byte 
10070 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
10080 74 20 31 20 67 69 76 65 73 20 74 68 65 0a 20 20  t 1 gives the.  
10090 2a 2a 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  ** start of the 
100a0 66 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20  first freeblock 
100b0 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 6f 72 20  on the page, or 
100c0 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65 72 65  is zero if there
100d0 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 66 72 65   are no.  ** fre
100e0 65 62 6c 6f 63 6b 73 2e 20 2a 2f 0a 20 20 70 63  eblocks. */.  pc
100f0 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
10100 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 6e 46 72  a[hdr+1]);.  nFr
10110 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d  ee = data[hdr+7]
10120 20 2b 20 74 6f 70 3b 20 20 2f 2a 20 49 6e 69 74   + top;  /* Init
10130 20 6e 46 72 65 65 20 74 6f 20 6e 6f 6e 2d 66 72   nFree to non-fr
10140 65 65 62 6c 6f 63 6b 20 66 72 65 65 20 73 70 61  eeblock free spa
10150 63 65 20 2a 2f 0a 20 20 69 66 28 20 70 63 3e 30  ce */.  if( pc>0
10160 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 65 78 74   ){.    u32 next
10170 2c 20 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20  , size;.    if( 
10180 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 29 7b  pc<iCellFirst ){
10190 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
101a0 43 45 2d 4f 46 3a 20 52 2d 35 35 35 33 30 2d 35  CE-OF: R-55530-5
101b0 32 39 33 30 20 49 6e 20 61 20 77 65 6c 6c 2d 66  2930 In a well-f
101c0 6f 72 6d 65 64 20 62 2d 74 72 65 65 20 70 61 67  ormed b-tree pag
101d0 65 2c 20 74 68 65 72 65 20 77 69 6c 6c 0a 20 20  e, there will.  
101e0 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 62 65      ** always be
101f0 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 63 65   at least one ce
10200 6c 6c 20 62 65 66 6f 72 65 20 74 68 65 20 66 69  ll before the fi
10210 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 2e 0a 20  rst freeblock.. 
10220 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
10230 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
10240 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e  UPT_PGNO(pPage->
10250 70 67 6e 6f 29 3b 20 0a 20 20 20 20 7d 0a 20 20  pgno); .    }.  
10260 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
10270 20 20 20 20 69 66 28 20 70 63 3e 69 43 65 6c 6c      if( pc>iCell
10280 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Last ){.        
10290 2f 2a 20 46 72 65 65 62 6c 6f 63 6b 20 6f 66 66  /* Freeblock off
102a0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
102b0 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  page */.        
102c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
102d0 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65  RRUPT_PGNO(pPage
102e0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d  ->pgno);.      }
102f0 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65  .      next = ge
10300 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 5d  t2byte(&data[pc]
10310 29 3b 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20  );.      size = 
10320 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
10330 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 6e 46 72  c+2]);.      nFr
10340 65 65 20 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a  ee = nFree + siz
10350 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 78  e;.      if( nex
10360 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 20 29 20 62  t<=pc+size+3 ) b
10370 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 63 20 3d  reak;.      pc =
10380 20 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20   next;.    }.   
10390 20 69 66 28 20 6e 65 78 74 3e 30 20 29 7b 0a 20   if( next>0 ){. 
103a0 20 20 20 20 20 2f 2a 20 46 72 65 65 62 6c 6f 63       /* Freebloc
103b0 6b 20 6e 6f 74 20 69 6e 20 61 73 63 65 6e 64 69  k not in ascendi
103c0 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20  ng order */.    
103d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
103e0 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61  CORRUPT_PGNO(pPa
103f0 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d  ge->pgno);.    }
10400 0a 20 20 20 20 69 66 28 20 70 63 2b 73 69 7a 65  .    if( pc+size
10410 3e 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 75  >(unsigned int)u
10420 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
10430 20 20 20 2f 2a 20 4c 61 73 74 20 66 72 65 65 62     /* Last freeb
10440 6c 6f 63 6b 20 65 78 74 65 6e 64 73 20 70 61 73  lock extends pas
10450 74 20 70 61 67 65 20 65 6e 64 20 2a 2f 0a 20 20  t page end */.  
10460 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10470 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70  E_CORRUPT_PGNO(p
10480 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  Page->pgno);.   
10490 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20   }.  }..  /* At 
104a0 74 68 69 73 20 70 6f 69 6e 74 2c 20 6e 46 72 65  this point, nFre
104b0 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73  e contains the s
104c0 75 6d 20 6f 66 20 74 68 65 20 6f 66 66 73 65 74  um of the offset
104d0 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20   to the start.  
104e0 2a 2a 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63  ** of the cell-c
104f0 6f 6e 74 65 6e 74 20 61 72 65 61 20 70 6c 75 73  ontent area plus
10500 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
10510 72 65 65 20 62 79 74 65 73 20 77 69 74 68 69 6e  ree bytes within
10520 0a 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63  .  ** the cell-c
10530 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 49 66 20  ontent area. If 
10540 74 68 69 73 20 69 73 20 67 72 65 61 74 65 72 20  this is greater 
10550 74 68 61 6e 20 74 68 65 20 75 73 61 62 6c 65 2d  than the usable-
10560 73 69 7a 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65  size.  ** of the
10570 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20   page, then the 
10580 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72  page must be cor
10590 72 75 70 74 65 64 2e 20 54 68 69 73 20 63 68 65  rupted. This che
105a0 63 6b 20 61 6c 73 6f 0a 20 20 2a 2a 20 73 65 72  ck also.  ** ser
105b0 76 65 73 20 74 6f 20 76 65 72 69 66 79 20 74 68  ves to verify th
105c0 61 74 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f  at the offset to
105d0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
105e0 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20  e cell-content. 
105f0 20 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64   ** area, accord
10600 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65 20  ing to the page 
10610 68 65 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74  header, lies wit
10620 68 69 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20  hin the page..  
10630 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65 65 3e 75  */.  if( nFree>u
10640 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
10650 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
10660 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67  ORRUPT_PGNO(pPag
10670 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  e->pgno);.  }.  
10680 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28  pPage->nFree = (
10690 75 31 36 29 28 6e 46 72 65 65 20 2d 20 69 43 65  u16)(nFree - iCe
106a0 6c 6c 46 69 72 73 74 29 3b 0a 20 20 70 50 61 67  llFirst);.  pPag
106b0 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20  e->isInit = 1;. 
106c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
106d0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  K;.}../*.** Set 
106e0 75 70 20 61 20 72 61 77 20 70 61 67 65 20 73 6f  up a raw page so
106f0 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c   that it looks l
10700 69 6b 65 20 61 20 64 61 74 61 62 61 73 65 20 70  ike a database p
10710 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e  age holding.** n
10720 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74  o entries..*/.st
10730 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61  atic void zeroPa
10740 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
10750 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  e, int flags){. 
10760 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
10770 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
10780 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20  ata;.  BtShared 
10790 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
107a0 74 3b 0a 20 20 75 38 20 68 64 72 20 3d 20 70 50  t;.  u8 hdr = pP
107b0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
107c0 20 20 75 31 36 20 66 69 72 73 74 3b 0a 0a 20 20    u16 first;..  
107d0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
107e0 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70  agerPagenumber(p
107f0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d  Page->pDbPage)==
10800 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20  pPage->pgno );. 
10810 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10820 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
10830 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d  age->pDbPage) ==
10840 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b   (void*)pPage );
10850 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
10860 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
10870 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d  Page->pDbPage) =
10880 3d 20 64 61 74 61 20 29 3b 0a 20 20 61 73 73 65  = data );.  asse
10890 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
108a0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
108b0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
108c0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
108d0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
108e0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
108f0 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
10900 20 42 54 53 5f 46 41 53 54 5f 53 45 43 55 52 45   BTS_FAST_SECURE
10910 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   ){.    memset(&
10920 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42  data[hdr], 0, pB
10930 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
10940 68 64 72 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61  hdr);.  }.  data
10950 5b 68 64 72 5d 20 3d 20 28 63 68 61 72 29 66 6c  [hdr] = (char)fl
10960 61 67 73 3b 0a 20 20 66 69 72 73 74 20 3d 20 68  ags;.  first = h
10970 64 72 20 2b 20 28 28 66 6c 61 67 73 26 50 54 46  dr + ((flags&PTF
10980 5f 4c 45 41 46 29 3d 3d 30 20 3f 20 31 32 20 3a  _LEAF)==0 ? 12 :
10990 20 38 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64   8);.  memset(&d
109a0 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34  ata[hdr+1], 0, 4
109b0 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d  );.  data[hdr+7]
109c0 20 3d 20 30 3b 0a 20 20 70 75 74 32 62 79 74 65   = 0;.  put2byte
109d0 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70  (&data[hdr+5], p
109e0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b  Bt->usableSize);
109f0 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
10a00 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61  = (u16)(pBt->usa
10a10 62 6c 65 53 69 7a 65 20 2d 20 66 69 72 73 74 29  bleSize - first)
10a20 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28  ;.  decodeFlags(
10a30 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20  pPage, flags);. 
10a40 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
10a50 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50  et = first;.  pP
10a60 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20  age->aDataEnd = 
10a70 26 64 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c  &data[pBt->usabl
10a80 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d  eSize];.  pPage-
10a90 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74  >aCellIdx = &dat
10aa0 61 5b 66 69 72 73 74 5d 3b 0a 20 20 70 50 61 67  a[first];.  pPag
10ab0 65 2d 3e 61 44 61 74 61 4f 66 73 74 20 3d 20 26  e->aDataOfst = &
10ac0 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c  data[pPage->chil
10ad0 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 70 50 61  dPtrSize];.  pPa
10ae0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  ge->nOverflow = 
10af0 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  0;.  assert( pBt
10b00 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ->pageSize>=512 
10b10 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  && pBt->pageSize
10b20 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 70 50 61  <=65536 );.  pPa
10b30 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28  ge->maskPage = (
10b40 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53 69  u16)(pBt->pageSi
10b50 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50 61 67 65  ze - 1);.  pPage
10b60 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70  ->nCell = 0;.  p
10b70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31  Page->isInit = 1
10b80 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  ;.}.../*.** Conv
10b90 65 72 74 20 61 20 44 62 50 61 67 65 20 6f 62 74  ert a DbPage obt
10ba0 61 69 6e 65 64 20 66 72 6f 6d 20 74 68 65 20 70  ained from the p
10bb0 61 67 65 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50  ager into a MemP
10bc0 61 67 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 74  age used by.** t
10bd0 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 2e 0a  he btree layer..
10be0 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67  */.static MemPag
10bf0 65 20 2a 62 74 72 65 65 50 61 67 65 46 72 6f 6d  e *btreePageFrom
10c00 44 62 50 61 67 65 28 44 62 50 61 67 65 20 2a 70  DbPage(DbPage *p
10c10 44 62 50 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e  DbPage, Pgno pgn
10c20 6f 2c 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  o, BtShared *pBt
10c30 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
10c40 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29  age = (MemPage*)
10c50 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
10c60 78 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20  xtra(pDbPage);. 
10c70 20 69 66 28 20 70 67 6e 6f 21 3d 70 50 61 67 65   if( pgno!=pPage
10c80 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50  ->pgno ){.    pP
10c90 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c  age->aData = sql
10ca0 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
10cb0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 70  (pDbPage);.    p
10cc0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20  Page->pDbPage = 
10cd0 70 44 62 50 61 67 65 3b 0a 20 20 20 20 70 50 61  pDbPage;.    pPa
10ce0 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20  ge->pBt = pBt;. 
10cf0 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d     pPage->pgno =
10d00 20 70 67 6e 6f 3b 0a 20 20 20 20 70 50 61 67 65   pgno;.    pPage
10d10 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 70 67  ->hdrOffset = pg
10d20 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b  no==1 ? 100 : 0;
10d30 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
10d40 50 61 67 65 2d 3e 61 44 61 74 61 3d 3d 73 71 6c  Page->aData==sql
10d50 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
10d60 28 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72  (pDbPage) );.  r
10d70 65 74 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a  eturn pPage; .}.
10d80 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67  ./*.** Get a pag
10d90 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  e from the pager
10da0 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  .  Initialize th
10db0 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e  e MemPage.pBt an
10dc0 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61  d.** MemPage.aDa
10dd0 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e  ta elements if n
10de0 65 65 64 65 64 2e 20 20 53 65 65 20 61 6c 73 6f  eeded.  See also
10df0 3a 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64  : btreeGetUnused
10e00 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  Page()..**.** If
10e10 20 74 68 65 20 50 41 47 45 52 5f 47 45 54 5f 4e   the PAGER_GET_N
10e20 4f 43 4f 4e 54 45 4e 54 20 66 6c 61 67 20 69 73  OCONTENT flag is
10e30 20 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74   set, it means t
10e40 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  hat we do not ca
10e50 72 65 0a 2a 2a 20 61 62 6f 75 74 20 74 68 65 20  re.** about the 
10e60 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
10e70 61 67 65 20 61 74 20 74 68 69 73 20 74 69 6d 65  age at this time
10e80 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20  .  So do not go 
10e90 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74  to the disk.** t
10ea0 6f 20 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74  o fetch the cont
10eb0 65 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20  ent.  Just fill 
10ec0 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77  in the content w
10ed0 69 74 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f  ith zeros for no
10ee0 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20  w..** If in the 
10ef0 66 75 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73  future we call s
10f00 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
10f10 28 29 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c  () on this page,
10f20 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77   that.** means w
10f30 65 20 68 61 76 65 20 73 74 61 72 74 65 64 20 74  e have started t
10f40 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61  o be concerned a
10f50 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64  bout content and
10f60 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61   the disk.** rea
10f70 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61  d should occur a
10f80 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f  t that point..*/
10f90 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
10fa0 65 47 65 74 50 61 67 65 28 0a 20 20 42 74 53 68  eGetPage(.  BtSh
10fb0 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
10fc0 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
10fd0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
10fe0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
10ff0 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f  r of the page to
11000 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50   fetch */.  MemP
11010 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
11020 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70   /* Return the p
11030 61 67 65 20 69 6e 20 74 68 69 73 20 70 61 72 61  age in this para
11040 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66  meter */.  int f
11050 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
11060 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43  /* PAGER_GET_NOC
11070 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47 45 52 5f  ONTENT or PAGER_
11080 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a  GET_READONLY */.
11090 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44  ){.  int rc;.  D
110a0 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
110b0 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73  .  assert( flags
110c0 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41  ==0 || flags==PA
110d0 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
110e0 54 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45  T || flags==PAGE
110f0 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 29  R_GET_READONLY )
11100 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
11110 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
11120 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
11130 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
11140 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
11150 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a  , pgno, (DbPage*
11160 2a 29 26 70 44 62 50 61 67 65 2c 20 66 6c 61 67  *)&pDbPage, flag
11170 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  s);.  if( rc ) r
11180 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50  eturn rc;.  *ppP
11190 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 46  age = btreePageF
111a0 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67  romDbPage(pDbPag
111b0 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20  e, pgno, pBt);. 
111c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
111d0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72  K;.}../*.** Retr
111e0 69 65 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d  ieve a page from
111f0 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
11200 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  . If the request
11210 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a  ed page is not.*
11220 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  * already in the
11230 20 70 61 67 65 72 20 63 61 63 68 65 20 72 65 74   pager cache ret
11240 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61  urn NULL. Initia
11250 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65  lize the MemPage
11260 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50  .pBt and.** MemP
11270 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e  age.aData elemen
11280 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f  ts if needed..*/
11290 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20  .static MemPage 
112a0 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70  *btreePageLookup
112b0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
112c0 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62  Pgno pgno){.  Db
112d0 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20  Page *pDbPage;. 
112e0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
112f0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
11300 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 44 62  >mutex) );.  pDb
11310 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61  Page = sqlite3Pa
11320 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70  gerLookup(pBt->p
11330 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
11340 69 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20  if( pDbPage ){. 
11350 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50     return btreeP
11360 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44  ageFromDbPage(pD
11370 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74  bPage, pgno, pBt
11380 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
11390 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
113a0 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
113b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
113c0 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20 74 68   in pages. If th
113d0 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20  ere is any kind 
113e0 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74  of.** error, ret
113f0 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64 20 69  urn ((unsigned i
11400 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69  nt)-1)..*/.stati
11410 63 20 50 67 6e 6f 20 62 74 72 65 65 50 61 67 65  c Pgno btreePage
11420 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64 20 2a  count(BtShared *
11430 70 42 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  pBt){.  return p
11440 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33 32  Bt->nPage;.}.u32
11450 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73   sqlite3BtreeLas
11460 74 50 61 67 65 28 42 74 72 65 65 20 2a 70 29 7b  tPage(Btree *p){
11470 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
11480 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
11490 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
114a0 28 20 28 28 70 2d 3e 70 42 74 2d 3e 6e 50 61 67  ( ((p->pBt->nPag
114b0 65 29 26 30 78 38 30 30 30 30 30 30 29 3d 3d 30  e)&0x8000000)==0
114c0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 74 72   );.  return btr
114d0 65 65 50 61 67 65 63 6f 75 6e 74 28 70 2d 3e 70  eePagecount(p->p
114e0 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  Bt);.}../*.** Ge
114f0 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  t a page from th
11500 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69 74  e pager and init
11510 69 61 6c 69 7a 65 20 69 74 2e 0a 2a 2a 0a 2a 2a  ialize it..**.**
11520 20 49 66 20 70 43 75 72 21 3d 30 20 74 68 65 6e   If pCur!=0 then
11530 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65 69   the page is bei
11540 6e 67 20 66 65 74 63 68 65 64 20 61 73 20 70 61  ng fetched as pa
11550 72 74 20 6f 66 20 61 20 6d 6f 76 65 54 6f 43 68  rt of a moveToCh
11560 69 6c 64 28 29 0a 2a 2a 20 63 61 6c 6c 2e 20 20  ild().** call.  
11570 44 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61  Do additional sa
11580 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e  nity checking on
11590 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
115a0 73 20 63 61 73 65 2e 0a 2a 2a 20 41 6e 64 20 69  s case..** And i
115b0 66 20 74 68 65 20 66 65 74 63 68 20 66 61 69 6c  f the fetch fail
115c0 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
115d0 6d 75 73 74 20 64 65 63 72 65 6d 65 6e 74 20 70  must decrement p
115e0 43 75 72 2d 3e 69 50 61 67 65 2e 0a 2a 2a 0a 2a  Cur->iPage..**.*
115f0 2a 20 54 68 65 20 70 61 67 65 20 69 73 20 66 65  * The page is fe
11600 74 63 68 65 64 20 61 73 20 72 65 61 64 2d 77 72  tched as read-wr
11610 69 74 65 20 75 6e 6c 65 73 73 20 70 43 75 72 20  ite unless pCur 
11620 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20  is not NULL and 
11630 69 73 0a 2a 2a 20 61 20 72 65 61 64 2d 6f 6e 6c  is.** a read-onl
11640 79 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  y cursor..**.** 
11650 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
11660 72 73 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65  rs, then *ppPage
11670 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 49   is undefined. I
11680 74 0a 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e 20  t.** may remain 
11690 75 6e 63 68 61 6e 67 65 64 2c 20 6f 72 20 69 74  unchanged, or it
116a0 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 61   may be set to a
116b0 6e 20 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e  n invalid value.
116c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
116d0 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20  etAndInitPage(. 
116e0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
116f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11700 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
11710 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
11720 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
11730 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
11740 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  mber of the page
11750 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d   to get */.  Mem
11760 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
11770 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11780 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20 70  Write the page p
11790 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 20  ointer here */. 
117a0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
117b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117c0 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 72 65   /* Cursor to re
117d0 63 65 69 76 65 20 74 68 65 20 70 61 67 65 2c 20  ceive the page, 
117e0 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  or NULL */.  int
117f0 20 62 52 65 61 64 4f 6e 6c 79 20 20 20 20 20 20   bReadOnly      
11800 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11810 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d  True for a read-
11820 6f 6e 6c 79 20 70 61 67 65 20 2a 2f 0a 29 7b 0a  only page */.){.
11830 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61    int rc;.  DbPa
11840 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61  ge *pDbPage;.  a
11850 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
11860 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
11870 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
11880 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70 70  t( pCur==0 || pp
11890 50 61 67 65 3d 3d 26 70 43 75 72 2d 3e 61 70 50  Page==&pCur->apP
118a0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
118b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
118c0 75 72 3d 3d 30 20 7c 7c 20 62 52 65 61 64 4f 6e  ur==0 || bReadOn
118d0 6c 79 3d 3d 70 43 75 72 2d 3e 63 75 72 50 61 67  ly==pCur->curPag
118e0 65 72 46 6c 61 67 73 20 29 3b 0a 20 20 61 73 73  erFlags );.  ass
118f0 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20  ert( pCur==0 || 
11900 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b  pCur->iPage>0 );
11910 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62 74 72  ..  if( pgno>btr
11920 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
11930 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
11940 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
11950 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e  ;.    goto getAn
11960 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b  dInitPage_error;
11970 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
11980 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d  te3PagerGet(pBt-
11990 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28  >pPager, pgno, (
119a0 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67  DbPage**)&pDbPag
119b0 65 2c 20 62 52 65 61 64 4f 6e 6c 79 29 3b 0a 20  e, bReadOnly);. 
119c0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 67   if( rc ){.    g
119d0 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61  oto getAndInitPa
119e0 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  ge_error;.  }.  
119f0 2a 70 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61  *ppPage = (MemPa
11a00 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  ge*)sqlite3Pager
11a10 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65  GetExtra(pDbPage
11a20 29 3b 0a 20 20 69 66 28 20 28 2a 70 70 50 61 67  );.  if( (*ppPag
11a30 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 7b  e)->isInit==0 ){
11a40 0a 20 20 20 20 62 74 72 65 65 50 61 67 65 46 72  .    btreePageFr
11a50 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65  omDbPage(pDbPage
11a60 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20  , pgno, pBt);.  
11a70 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74    rc = btreeInit
11a80 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
11a90 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
11aa0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
11ab0 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
11ac0 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 67  e);.      goto g
11ad0 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72  etAndInitPage_er
11ae0 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ror;.    }.  }. 
11af0 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61 67   assert( (*ppPag
11b00 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29  e)->pgno==pgno )
11b10 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70 70  ;.  assert( (*pp
11b20 50 61 67 65 29 2d 3e 61 44 61 74 61 3d 3d 73 71  Page)->aData==sq
11b30 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
11b40 61 28 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  a(pDbPage) );.. 
11b50 20 2f 2a 20 49 66 20 6f 62 74 61 69 6e 69 6e 67   /* If obtaining
11b60 20 61 20 63 68 69 6c 64 20 70 61 67 65 20 66 6f   a child page fo
11b70 72 20 61 20 63 75 72 73 6f 72 2c 20 77 65 20 6d  r a cursor, we m
11b80 75 73 74 20 76 65 72 69 66 79 20 74 68 61 74 20  ust verify that 
11b90 74 68 65 20 70 61 67 65 20 69 73 0a 20 20 2a 2a  the page is.  **
11ba0 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
11bb0 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2e 20   the root page. 
11bc0 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 20 26 26  */.  if( pCur &&
11bd0 20 28 28 2a 70 70 50 61 67 65 29 2d 3e 6e 43 65   ((*ppPage)->nCe
11be0 6c 6c 3c 31 20 7c 7c 20 28 2a 70 70 50 61 67 65  ll<1 || (*ppPage
11bf0 29 2d 3e 69 6e 74 4b 65 79 21 3d 70 43 75 72 2d  )->intKey!=pCur-
11c00 3e 63 75 72 49 6e 74 4b 65 79 29 20 29 7b 0a 20  >curIntKey) ){. 
11c10 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
11c20 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 67 6e 6f  ORRUPT_PGNO(pgno
11c30 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  );.    releasePa
11c40 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
11c50 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74   goto getAndInit
11c60 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  Page_error;.  }.
11c70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11c80 4f 4b 3b 0a 0a 67 65 74 41 6e 64 49 6e 69 74 50  OK;..getAndInitP
11c90 61 67 65 5f 65 72 72 6f 72 3a 0a 20 20 69 66 28  age_error:.  if(
11ca0 20 70 43 75 72 20 29 20 70 43 75 72 2d 3e 69 50   pCur ) pCur->iP
11cb0 61 67 65 2d 2d 3b 0a 20 20 74 65 73 74 63 61 73  age--;.  testcas
11cc0 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b 0a 20 20  e( pgno==0 );.  
11cd0 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20  assert( pgno!=0 
11ce0 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f  || rc==SQLITE_CO
11cf0 52 52 55 50 54 20 29 3b 0a 20 20 72 65 74 75 72  RRUPT );.  retur
11d00 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
11d10 65 6c 65 61 73 65 20 61 20 4d 65 6d 50 61 67 65  elease a MemPage
11d20 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62  .  This should b
11d30 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f  e called once fo
11d40 72 20 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20  r each prior.** 
11d50 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 47 65 74  call to btreeGet
11d60 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Page..*/.static 
11d70 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65  void releasePage
11d80 4e 6f 74 4e 75 6c 6c 28 4d 65 6d 50 61 67 65 20  NotNull(MemPage 
11d90 2a 70 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72  *pPage){.  asser
11da0 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  t( pPage->aData 
11db0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
11dc0 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73  ge->pBt );.  ass
11dd0 65 72 74 28 20 70 50 61 67 65 2d 3e 70 44 62 50  ert( pPage->pDbP
11de0 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  age!=0 );.  asse
11df0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
11e00 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e  GetExtra(pPage->
11e10 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69  pDbPage) == (voi
11e20 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73  d*)pPage );.  as
11e30 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
11e40 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d  erGetData(pPage-
11e50 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65  >pDbPage)==pPage
11e60 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73  ->aData );.  ass
11e70 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
11e80 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
11e90 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
11ea0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
11eb0 66 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 2d 3e  fNotNull(pPage->
11ec0 70 44 62 50 61 67 65 29 3b 0a 7d 0a 73 74 61 74  pDbPage);.}.stat
11ed0 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50  ic void releaseP
11ee0 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
11ef0 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  ge){.  if( pPage
11f00 20 29 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f   ) releasePageNo
11f10 74 4e 75 6c 6c 28 70 50 61 67 65 29 3b 0a 7d 0a  tNull(pPage);.}.
11f20 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 6e 20 75 6e  ./*.** Get an un
11f30 75 73 65 64 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  used page..**.**
11f40 20 54 68 69 73 20 77 6f 72 6b 73 20 6a 75 73 74   This works just
11f50 20 6c 69 6b 65 20 62 74 72 65 65 47 65 74 50 61   like btreeGetPa
11f60 67 65 28 29 20 77 69 74 68 20 74 68 65 20 61 64  ge() with the ad
11f70 64 69 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20  dition:.**.**   
11f80 2a 20 20 49 66 20 74 68 65 20 70 61 67 65 20 69  *  If the page i
11f90 73 20 61 6c 72 65 61 64 79 20 69 6e 20 75 73 65  s already in use
11fa0 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20   for some other 
11fb0 70 75 72 70 6f 73 65 2c 20 69 6d 6d 65 64 69 61  purpose, immedia
11fc0 74 65 6c 79 0a 2a 2a 20 20 20 20 20 20 72 65 6c  tely.**      rel
11fd0 65 61 73 65 20 69 74 20 61 6e 64 20 72 65 74 75  ease it and retu
11fe0 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 55 52  rn an SQLITE_CUR
11ff0 52 55 50 54 20 65 72 72 6f 72 2e 0a 2a 2a 20 20  RUPT error..**  
12000 20 2a 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68   *  Make sure th
12010 65 20 69 73 49 6e 69 74 20 66 6c 61 67 20 69 73  e isInit flag is
12020 20 63 6c 65 61 72 0a 2a 2f 0a 73 74 61 74 69 63   clear.*/.static
12030 20 69 6e 74 20 62 74 72 65 65 47 65 74 55 6e 75   int btreeGetUnu
12040 73 65 64 50 61 67 65 28 0a 20 20 42 74 53 68 61  sedPage(.  BtSha
12050 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
12060 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
12070 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
12080 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
12090 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20   of the page to 
120a0 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61  fetch */.  MemPa
120b0 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
120c0 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  /* Return the pa
120d0 67 65 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d  ge in this param
120e0 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  eter */.  int fl
120f0 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
12100 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f  * PAGER_GET_NOCO
12110 4e 54 45 4e 54 20 6f 72 20 50 41 47 45 52 5f 47  NTENT or PAGER_G
12120 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29  ET_READONLY */.)
12130 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 62 74 72  {.  int rc = btr
12140 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70  eeGetPage(pBt, p
12150 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 66 6c 61  gno, ppPage, fla
12160 67 73 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  gs);.  if( rc==S
12170 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12180 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  if( sqlite3Pager
12190 50 61 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70  PageRefcount((*p
121a0 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
121b0 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  >1 ){.      rele
121c0 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29  asePage(*ppPage)
121d0 3b 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65 20  ;.      *ppPage 
121e0 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 0;.      retur
121f0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
12200 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
12210 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e   (*ppPage)->isIn
12220 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  it = 0;.  }else{
12230 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30  .    *ppPage = 0
12240 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
12250 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 75 72  c;.}.../*.** Dur
12260 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  ing a rollback, 
12270 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 72  when the pager r
12280 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69  eloads informati
12290 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  on into the cach
122a0 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65  e.** so that the
122b0 20 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72   cache is restor
122c0 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ed to its origin
122d0 61 6c 20 73 74 61 74 65 20 61 74 20 74 68 65 20  al state at the 
122e0 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20  start of.** the 
122f0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72  transaction, for
12300 20 65 61 63 68 20 70 61 67 65 20 72 65 73 74 6f   each page resto
12310 72 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  red this routine
12320 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
12330 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e  * This routine n
12340 65 65 64 73 20 74 6f 20 72 65 73 65 74 20 74 68  eeds to reset th
12350 65 20 65 78 74 72 61 20 64 61 74 61 20 73 65 63  e extra data sec
12360 74 69 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20  tion at the end 
12370 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74  of the.** page t
12380 6f 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65  o agree with the
12390 20 72 65 73 74 6f 72 65 64 20 64 61 74 61 2e 0a   restored data..
123a0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
123b0 61 67 65 52 65 69 6e 69 74 28 44 62 50 61 67 65  ageReinit(DbPage
123c0 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50   *pData){.  MemP
123d0 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 70 50  age *pPage;.  pP
123e0 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a  age = (MemPage *
123f0 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
12400 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20  Extra(pData);.  
12410 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
12420 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
12430 28 70 44 61 74 61 29 3e 30 20 29 3b 0a 20 20 69  (pData)>0 );.  i
12440 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  f( pPage->isInit
12450 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
12460 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
12470 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
12480 75 74 65 78 29 20 29 3b 0a 20 20 20 20 70 50 61  utex) );.    pPa
12490 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
124a0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
124b0 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
124c0 28 70 44 61 74 61 29 3e 31 20 29 7b 0a 20 20 20  (pData)>1 ){.   
124d0 20 20 20 2f 2a 20 70 50 61 67 65 20 6d 69 67 68     /* pPage migh
124e0 74 20 6e 6f 74 20 62 65 20 61 20 62 74 72 65 65  t not be a btree
124f0 20 70 61 67 65 3b 20 20 69 74 20 6d 69 67 68 74   page;  it might
12500 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   be an overflow 
12510 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 6f 72  page.      ** or
12520 20 70 74 72 6d 61 70 20 70 61 67 65 20 6f 72 20   ptrmap page or 
12530 61 20 66 72 65 65 20 70 61 67 65 2e 20 20 49 6e  a free page.  In
12540 20 74 68 6f 73 65 20 63 61 73 65 73 2c 20 74 68   those cases, th
12550 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20  e following.    
12560 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72    ** call to btr
12570 65 65 49 6e 69 74 50 61 67 65 28 29 20 77 69 6c  eeInitPage() wil
12580 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75 72 6e 20  l likely return 
12590 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 0a  SQLITE_CORRUPT..
125a0 20 20 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f 20        ** But no 
125b0 68 61 72 6d 20 69 73 20 64 6f 6e 65 20 62 79 20  harm is done by 
125c0 74 68 69 73 2e 20 20 41 6e 64 20 69 74 20 69 73  this.  And it is
125d0 20 76 65 72 79 20 69 6d 70 6f 72 74 61 6e 74 20   very important 
125e0 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 62 74  that.      ** bt
125f0 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 62 65  reeInitPage() be
12600 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72 79   called on every
12610 20 62 74 72 65 65 20 70 61 67 65 20 73 6f 20 77   btree page so w
12620 65 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a 20  e make.      ** 
12630 74 68 65 20 63 61 6c 6c 20 66 6f 72 20 65 76 65  the call for eve
12640 72 79 20 70 61 67 65 20 74 68 61 74 20 63 6f 6d  ry page that com
12650 65 73 20 69 6e 20 66 6f 72 20 72 65 2d 69 6e 69  es in for re-ini
12660 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 62  ting. */.      b
12670 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
12680 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ge);.    }.  }.}
12690 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
126a0 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
126b0 66 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f 0a  for a btree..*/.
126c0 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
126d0 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
126e0 72 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  r(void *pArg){. 
126f0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
12700 20 28 42 74 53 68 61 72 65 64 2a 29 70 41 72 67   (BtShared*)pArg
12710 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
12720 3e 64 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >db );.  assert(
12730 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
12740 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75 74  eld(pBt->db->mut
12750 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ex) );.  return 
12760 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73  sqlite3InvokeBus
12770 79 48 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e 64  yHandler(&pBt->d
12780 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 29 3b  b->busyHandler);
12790 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
127a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
127b0 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65  ** .** zFilename
127c0 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
127d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
127e0 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  e.  If zFilename
127f0 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e   is NULL.** then
12800 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 64 61   an ephemeral da
12810 74 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65  tabase is create
12820 64 2e 20 20 54 68 65 20 65 70 68 65 6d 65 72 61  d.  The ephemera
12830 6c 20 64 61 74 61 62 61 73 65 20 6d 69 67 68 74  l database might
12840 0a 2a 2a 20 62 65 20 65 78 63 6c 75 73 69 76 65  .** be exclusive
12850 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 6f 72  ly in memory, or
12860 20 69 74 20 6d 69 67 68 74 20 75 73 65 20 61 20   it might use a 
12870 64 69 73 6b 2d 62 61 73 65 64 20 6d 65 6d 6f 72  disk-based memor
12880 79 20 63 61 63 68 65 2e 0a 2a 2a 20 45 69 74 68  y cache..** Eith
12890 65 72 20 77 61 79 2c 20 74 68 65 20 65 70 68 65  er way, the ephe
128a0 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 77  meral database w
128b0 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63  ill be automatic
128c0 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 0a 2a 2a  ally deleted .**
128d0 20 77 68 65 6e 20 73 71 6c 69 74 65 33 42 74 72   when sqlite3Btr
128e0 65 65 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c  eeClose() is cal
128f0 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46  led..**.** If zF
12900 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d  ilename is ":mem
12910 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e 20 69 6e  ory:" then an in
12920 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
12930 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 74   is created.** t
12940 68 61 74 20 69 73 20 61 75 74 6f 6d 61 74 69 63  hat is automatic
12950 61 6c 6c 79 20 64 65 73 74 72 6f 79 65 64 20 77  ally destroyed w
12960 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64  hen it is closed
12970 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 66 6c 61  ..**.** The "fla
12980 67 73 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  gs" parameter is
12990 20 61 20 62 69 74 6d 61 73 6b 20 74 68 61 74 20   a bitmask that 
129a0 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 62 69  might contain bi
129b0 74 73 20 6c 69 6b 65 0a 2a 2a 20 42 54 52 45 45  ts like.** BTREE
129c0 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e  _OMIT_JOURNAL an
129d0 64 2f 6f 72 20 42 54 52 45 45 5f 4d 45 4d 4f 52  d/or BTREE_MEMOR
129e0 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  Y..**.** If the 
129f0 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65  database is alre
12a00 61 64 79 20 6f 70 65 6e 65 64 20 69 6e 20 74 68  ady opened in th
12a10 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
12a20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 6e  connection.** an
12a30 64 20 77 65 20 61 72 65 20 69 6e 20 73 68 61 72  d we are in shar
12a40 65 64 20 63 61 63 68 65 20 6d 6f 64 65 2c 20 74  ed cache mode, t
12a50 68 65 6e 20 74 68 65 20 6f 70 65 6e 20 77 69 6c  hen the open wil
12a60 6c 20 66 61 69 6c 20 77 69 74 68 20 61 6e 0a 2a  l fail with an.*
12a70 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  * SQLITE_CONSTRA
12a80 49 4e 54 20 65 72 72 6f 72 2e 20 20 57 65 20 63  INT error.  We c
12a90 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74 77 6f 20  annot allow two 
12aa0 6f 72 20 6d 6f 72 65 20 42 74 53 68 61 72 65 64  or more BtShared
12ab0 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e 20 74  .** objects in t
12ac0 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
12ad0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69 6e 63   connection sinc
12ae0 65 20 64 6f 69 6e 67 20 73 6f 20 77 69 6c 6c 20  e doing so will 
12af0 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72 6f 62 6c  lead.** to probl
12b00 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67  ems with locking
12b10 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
12b20 42 74 72 65 65 4f 70 65 6e 28 0a 20 20 73 71 6c  BtreeOpen(.  sql
12b30 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
12b40 20 20 20 20 20 2f 2a 20 56 46 53 20 74 6f 20 75       /* VFS to u
12b50 73 65 20 66 6f 72 20 74 68 69 73 20 62 2d 74 72  se for this b-tr
12b60 65 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ee */.  const ch
12b70 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  ar *zFilename,  
12b80 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
12b90 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ile containing t
12ba0 68 65 20 42 54 72 65 65 20 64 61 74 61 62 61 73  he BTree databas
12bb0 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  e */.  sqlite3 *
12bc0 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  db,            /
12bd0 2a 20 41 73 73 6f 63 69 61 74 65 64 20 64 61 74  * Associated dat
12be0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
12bf0 20 20 42 74 72 65 65 20 2a 2a 70 70 42 74 72 65    Btree **ppBtre
12c00 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  e,        /* Poi
12c10 6e 74 65 72 20 74 6f 20 6e 65 77 20 42 74 72 65  nter to new Btre
12c20 65 20 6f 62 6a 65 63 74 20 77 72 69 74 74 65 6e  e object written
12c30 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66   here */.  int f
12c40 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
12c50 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f     /* Options */
12c60 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20  .  int vfsFlags 
12c70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
12c80 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75  ags passed throu
12c90 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66  gh to sqlite3_vf
12ca0 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a  s.xOpen() */.){.
12cb0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
12cc0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
12cd0 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72 74 20   /* Shared part 
12ce0 6f 66 20 62 74 72 65 65 20 73 74 72 75 63 74 75  of btree structu
12cf0 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70  re */.  Btree *p
12d00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12d10 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65         /* Handle
12d20 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
12d30 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
12d40 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20 2f  utexOpen = 0;  /
12d50 2a 20 50 72 65 76 65 6e 74 73 20 61 20 72 61 63  * Prevents a rac
12d60 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69 63  e condition. Tic
12d70 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a 20 20 69  ket #3537 */.  i
12d80 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
12d90 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  K;            /*
12da0 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f   Result code fro
12db0 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  m this function 
12dc0 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65 72 76 65  */.  u8 nReserve
12dd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12de0 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 75      /* Byte of u
12df0 6e 75 73 65 64 20 73 70 61 63 65 20 6f 6e 20 65  nused space on e
12e00 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e  ach page */.  un
12e10 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48  signed char zDbH
12e20 65 61 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a 20  eader[100];  /* 
12e30 44 61 74 61 62 61 73 65 20 68 65 61 64 65 72 20  Database header 
12e40 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a  content */..  /*
12e50 20 54 72 75 65 20 69 66 20 6f 70 65 6e 69 6e 67   True if opening
12e60 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 2c 20 74   an ephemeral, t
12e70 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
12e80 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74  e */.  const int
12e90 20 69 73 54 65 6d 70 44 62 20 3d 20 7a 46 69 6c   isTempDb = zFil
12ea0 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c  ename==0 || zFil
12eb0 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a 20 20  ename[0]==0;..  
12ec0 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72 69 61  /* Set the varia
12ed0 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74  ble isMemdb to t
12ee0 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65  rue for an in-me
12ef0 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f  mory database, o
12f00 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f  r .  ** false fo
12f10 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64  r a file-based d
12f20 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 23 69  atabase..  */.#i
12f30 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
12f40 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 63 6f 6e 73  _MEMORYDB.  cons
12f50 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20  t int isMemdb = 
12f60 30 3b 0a 23 65 6c 73 65 0a 20 20 63 6f 6e 73 74  0;.#else.  const
12f70 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 28   int isMemdb = (
12f80 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 73 74 72  zFilename && str
12f90 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22  cmp(zFilename, "
12fa0 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 29 0a 20  :memory:")==0). 
12fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fc0 20 20 20 20 20 20 7c 7c 20 28 69 73 54 65 6d 70        || (isTemp
12fd0 44 62 20 26 26 20 73 71 6c 69 74 65 33 54 65 6d  Db && sqlite3Tem
12fe0 70 49 6e 4d 65 6d 6f 72 79 28 64 62 29 29 0a 20  pInMemory(db)). 
12ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13000 20 20 20 20 20 20 7c 7c 20 28 76 66 73 46 6c 61        || (vfsFla
13010 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
13020 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a 23 65 6e  _MEMORY)!=0;.#en
13030 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 64  dif..  assert( d
13040 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
13050 28 20 70 56 66 73 21 3d 30 20 29 3b 0a 20 20 61  ( pVfs!=0 );.  a
13060 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
13070 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
13080 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
13090 28 20 28 66 6c 61 67 73 26 30 78 66 66 29 3d 3d  ( (flags&0xff)==
130a0 66 6c 61 67 73 20 29 3b 20 20 20 2f 2a 20 66 6c  flags );   /* fl
130b0 61 67 73 20 66 69 74 20 69 6e 20 38 20 62 69 74  ags fit in 8 bit
130c0 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20  s */..  /* Only 
130d0 61 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 64  a BTREE_SINGLE d
130e0 61 74 61 62 61 73 65 20 63 61 6e 20 62 65 20 42  atabase can be B
130f0 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 20 2a  TREE_UNORDERED *
13100 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61  /.  assert( (fla
13110 67 73 20 26 20 42 54 52 45 45 5f 55 4e 4f 52 44  gs & BTREE_UNORD
13120 45 52 45 44 29 3d 3d 30 20 7c 7c 20 28 66 6c 61  ERED)==0 || (fla
13130 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e 47 4c  gs & BTREE_SINGL
13140 45 29 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41  E)!=0 );..  /* A
13150 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61   BTREE_SINGLE da
13160 74 61 62 61 73 65 20 69 73 20 61 6c 77 61 79 73  tabase is always
13170 20 61 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64   a temporary and
13180 2f 6f 72 20 65 70 68 65 6d 65 72 61 6c 20 2a 2f  /or ephemeral */
13190 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67  .  assert( (flag
131a0 73 20 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  s & BTREE_SINGLE
131b0 29 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70 44 62  )==0 || isTempDb
131c0 20 29 3b 0a 0a 20 20 69 66 28 20 69 73 4d 65 6d   );..  if( isMem
131d0 64 62 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20  db ){.    flags 
131e0 7c 3d 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59 3b  |= BTREE_MEMORY;
131f0 0a 20 20 7d 0a 20 20 69 66 28 20 28 76 66 73 46  .  }.  if( (vfsF
13200 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
13210 45 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d 30 20 26  EN_MAIN_DB)!=0 &
13220 26 20 28 69 73 4d 65 6d 64 62 20 7c 7c 20 69 73  & (isMemdb || is
13230 54 65 6d 70 44 62 29 20 29 7b 0a 20 20 20 20 76  TempDb) ){.    v
13240 66 73 46 6c 61 67 73 20 3d 20 28 76 66 73 46 6c  fsFlags = (vfsFl
13250 61 67 73 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50  ags & ~SQLITE_OP
13260 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 20 53 51  EN_MAIN_DB) | SQ
13270 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44  LITE_OPEN_TEMP_D
13280 42 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c  B;.  }.  p = sql
13290 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
132a0 69 7a 65 6f 66 28 42 74 72 65 65 29 29 3b 0a 20  izeof(Btree));. 
132b0 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72   if( !p ){.    r
132c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
132d0 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70  EM_BKPT;.  }.  p
132e0 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e  ->inTrans = TRAN
132f0 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20  S_NONE;.  p->db 
13300 3d 20 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51  = db;.#ifndef SQ
13310 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
13320 5f 43 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b  _CACHE.  p->lock
13330 2e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70  .pBtree = p;.  p
13340 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20  ->lock.iTable = 
13350 31 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  1;.#endif..#if !
13360 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
13370 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
13380 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
13390 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
133a0 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74  ).  /*.  ** If t
133b0 68 69 73 20 42 74 72 65 65 20 69 73 20 61 20 63  his Btree is a c
133c0 61 6e 64 69 64 61 74 65 20 66 6f 72 20 73 68 61  andidate for sha
133d0 72 65 64 20 63 61 63 68 65 2c 20 74 72 79 20 74  red cache, try t
133e0 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65  o find an.  ** e
133f0 78 69 73 74 69 6e 67 20 42 74 53 68 61 72 65 64  xisting BtShared
13400 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77 65 20   object that we 
13410 63 61 6e 20 73 68 61 72 65 20 77 69 74 68 0a 20  can share with. 
13420 20 2a 2f 0a 20 20 69 66 28 20 69 73 54 65 6d 70   */.  if( isTemp
13430 44 62 3d 3d 30 20 26 26 20 28 69 73 4d 65 6d 64  Db==0 && (isMemd
13440 62 3d 3d 30 20 7c 7c 20 28 76 66 73 46 6c 61 67  b==0 || (vfsFlag
13450 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52  s&SQLITE_OPEN_UR
13460 49 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 69 66  I)!=0) ){.    if
13470 28 20 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c  ( vfsFlags & SQL
13480 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43  ITE_OPEN_SHAREDC
13490 41 43 48 45 20 29 7b 0a 20 20 20 20 20 20 69 6e  ACHE ){.      in
134a0 74 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71  t nFilename = sq
134b0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
134c0 69 6c 65 6e 61 6d 65 29 2b 31 3b 0a 20 20 20 20  ilename)+1;.    
134d0 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68 6e    int nFullPathn
134e0 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61  ame = pVfs->mxPa
134f0 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20 20  thname+1;.      
13500 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e  char *zFullPathn
13510 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ame = sqlite3Mal
13520 6c 6f 63 28 4d 41 58 28 6e 46 75 6c 6c 50 61 74  loc(MAX(nFullPat
13530 68 6e 61 6d 65 2c 6e 46 69 6c 65 6e 61 6d 65 29  hname,nFilename)
13540 29 3b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c  );.      MUTEX_L
13550 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75  OGIC( sqlite3_mu
13560 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64  tex *mutexShared
13570 3b 20 29 0a 0a 20 20 20 20 20 20 70 2d 3e 73 68  ; )..      p->sh
13580 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  arable = 1;.    
13590 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74 68    if( !zFullPath
135a0 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  name ){.        
135b0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
135c0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
135d0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
135e0 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  T;.      }.     
135f0 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a   if( isMemdb ){.
13600 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a          memcpy(z
13610 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46  FullPathname, zF
13620 69 6c 65 6e 61 6d 65 2c 20 6e 46 69 6c 65 6e 61  ilename, nFilena
13630 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  me);.      }else
13640 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
13650 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68  qlite3OsFullPath
13660 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65  name(pVfs, zFile
13670 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  name,.          
13680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13690 20 20 20 20 20 20 20 20 20 6e 46 75 6c 6c 50 61           nFullPa
136a0 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74  thname, zFullPat
136b0 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  hname);.        
136c0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
136d0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
136e0 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
136f0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
13700 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
13710 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
13720 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
13730 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48   }.#if SQLITE_TH
13740 52 45 41 44 53 41 46 45 0a 20 20 20 20 20 20 6d  READSAFE.      m
13750 75 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74  utexOpen = sqlit
13760 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
13770 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
13780 5f 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20 73 71  _OPEN);.      sq
13790 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
137a0 72 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20  r(mutexOpen);.  
137b0 20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20      mutexShared 
137c0 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
137d0 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
137e0 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
137f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
13800 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
13810 53 68 61 72 65 64 29 3b 0a 23 65 6e 64 69 66 0a  Shared);.#endif.
13820 20 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47 4c        for(pBt=GL
13830 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
13840 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
13850 65 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42 74  eList); pBt; pBt
13860 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  =pBt->pNext){.  
13870 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
13880 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20  t->nRef>0 );.   
13890 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63       if( 0==strc
138a0 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  mp(zFullPathname
138b0 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69  , sqlite3PagerFi
138c0 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67  lename(pBt->pPag
138d0 65 72 2c 20 30 29 29 0a 20 20 20 20 20 20 20 20  er, 0)).        
138e0 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69           && sqli
138f0 74 65 33 50 61 67 65 72 56 66 73 28 70 42 74 2d  te3PagerVfs(pBt-
13900 3e 70 50 61 67 65 72 29 3d 3d 70 56 66 73 20 29  >pPager)==pVfs )
13910 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
13920 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 66  iDb;.          f
13930 6f 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d 31  or(iDb=db->nDb-1
13940 3b 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d 29  ; iDb>=0; iDb--)
13950 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 42 74  {.            Bt
13960 72 65 65 20 2a 70 45 78 69 73 74 69 6e 67 20 3d  ree *pExisting =
13970 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42   db->aDb[iDb].pB
13980 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  t;.            i
13990 66 28 20 70 45 78 69 73 74 69 6e 67 20 26 26 20  f( pExisting && 
139a0 70 45 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d 3d  pExisting->pBt==
139b0 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBt ){.         
139c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
139d0 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68  ex_leave(mutexSh
139e0 61 72 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20  ared);.         
139f0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
13a00 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70  ex_leave(mutexOp
13a10 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  en);.           
13a20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
13a30 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
13a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
13a50 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
13a60 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
13a70 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  urn SQLITE_CONST
13a80 52 41 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 20  RAINT;.         
13a90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
13aa0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 42  .          p->pB
13ab0 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20  t = pBt;.       
13ac0 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a     pBt->nRef++;.
13ad0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
13ae0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
13af0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
13b00 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
13b10 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  exShared);.     
13b20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
13b30 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
13b40 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
13b50 45 5f 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65  E_DEBUG.    else
13b60 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 64 65  {.      /* In de
13b70 62 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72  bug mode, we mar
13b80 6b 20 61 6c 6c 20 70 65 72 73 69 73 74 65 6e 74  k all persistent
13b90 20 64 61 74 61 62 61 73 65 73 20 61 73 20 73 68   databases as sh
13ba0 61 72 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20  arable.      ** 
13bb0 65 76 65 6e 20 77 68 65 6e 20 74 68 65 79 20 61  even when they a
13bc0 72 65 20 6e 6f 74 2e 20 20 54 68 69 73 20 65 78  re not.  This ex
13bd0 65 72 63 69 73 65 73 20 74 68 65 20 6c 6f 63 6b  ercises the lock
13be0 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20 20 20  ing code and.   
13bf0 20 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65     ** gives more
13c00 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 66 6f 72   opportunity for
13c10 20 61 73 73 65 72 74 73 28 73 71 6c 69 74 65 33   asserts(sqlite3
13c20 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29 29 0a 20  _mutex_held()). 
13c30 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
13c40 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69  ts to find locki
13c50 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20  ng problems..   
13c60 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73     */.      p->s
13c70 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  harable = 1;.   
13c80 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65   }.#endif.  }.#e
13c90 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74 3d 3d  ndif.  if( pBt==
13ca0 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  0 ){.    /*.    
13cb0 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
13cc0 20 61 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75   asserts make su
13cd0 72 65 20 74 68 61 74 20 73 74 72 75 63 74 75 72  re that structur
13ce0 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20 62  es used by the b
13cf0 74 72 65 65 20 61 72 65 0a 20 20 20 20 2a 2a 20  tree are.    ** 
13d00 74 68 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20  the right size. 
13d10 20 54 68 69 73 20 69 73 20 74 6f 20 67 75 61 72   This is to guar
13d20 64 20 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63  d against size c
13d30 68 61 6e 67 65 73 20 74 68 61 74 20 72 65 73 75  hanges that resu
13d40 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 63  lt.    ** when c
13d50 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69  ompiling on a di
13d60 66 66 65 72 65 6e 74 20 61 72 63 68 69 74 65 63  fferent architec
13d70 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ture..    */.   
13d80 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
13d90 69 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20 20 61  i64)==8 );.    a
13da0 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36  ssert( sizeof(u6
13db0 34 29 3d 3d 38 20 29 3b 0a 20 20 20 20 61 73 73  4)==8 );.    ass
13dc0 65 72 74 28 20 73 69 7a 65 6f 66 28 75 33 32 29  ert( sizeof(u32)
13dd0 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==4 );.    asser
13de0 74 28 20 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d  t( sizeof(u16)==
13df0 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  2 );.    assert(
13e00 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34   sizeof(Pgno)==4
13e10 20 29 3b 0a 20 20 0a 20 20 20 20 70 42 74 20 3d   );.  .    pBt =
13e20 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
13e30 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42 74 29  ro( sizeof(*pBt)
13e40 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 3d   );.    if( pBt=
13e50 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
13e60 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
13e70 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62  PT;.      goto b
13e80 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20  tree_open_out;. 
13e90 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
13ea0 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 70  lite3PagerOpen(p
13eb0 56 66 73 2c 20 26 70 42 74 2d 3e 70 50 61 67 65  Vfs, &pBt->pPage
13ec0 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20  r, zFilename,.  
13ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ee0 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 4d          sizeof(M
13ef0 65 6d 50 61 67 65 29 2c 20 66 6c 61 67 73 2c 20  emPage), flags, 
13f00 76 66 73 46 6c 61 67 73 2c 20 70 61 67 65 52 65  vfsFlags, pageRe
13f10 69 6e 69 74 29 3b 0a 20 20 20 20 69 66 28 20 72  init);.    if( r
13f20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
13f30 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
13f40 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70  erSetMmapLimit(p
13f50 42 74 2d 3e 70 50 61 67 65 72 2c 20 64 62 2d 3e  Bt->pPager, db->
13f60 73 7a 4d 6d 61 70 29 3b 0a 20 20 20 20 20 20 72  szMmap);.      r
13f70 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
13f80 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 70  ReadFileheader(p
13f90 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f  Bt->pPager,sizeo
13fa0 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44 62  f(zDbHeader),zDb
13fb0 48 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20  Header);.    }. 
13fc0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
13fd0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
13fe0 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
13ff0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74  t;.    }.    pBt
14000 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 28 75  ->openFlags = (u
14010 38 29 66 6c 61 67 73 3b 0a 20 20 20 20 70 42 74  8)flags;.    pBt
14020 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 73  ->db = db;.    s
14030 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75  qlite3PagerSetBu
14040 73 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70  syhandler(pBt->p
14050 50 61 67 65 72 2c 20 62 74 72 65 65 49 6e 76 6f  Pager, btreeInvo
14060 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70  keBusyHandler, p
14070 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20  Bt);.    p->pBt 
14080 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 70 42  = pBt;.  .    pB
14090 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a  t->pCursor = 0;.
140a0 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20      pBt->pPage1 
140b0 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  = 0;.    if( sql
140c0 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f  ite3PagerIsreado
140d0 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72 29  nly(pBt->pPager)
140e0 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73   ) pBt->btsFlags
140f0 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c   |= BTS_READ_ONL
14100 59 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  Y;.#if defined(S
14110 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c  QLITE_SECURE_DEL
14120 45 54 45 29 0a 20 20 20 20 70 42 74 2d 3e 62 74  ETE).    pBt->bt
14130 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53 45  sFlags |= BTS_SE
14140 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 23 65 6c  CURE_DELETE;.#el
14150 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
14160 45 5f 46 41 53 54 5f 53 45 43 55 52 45 5f 44 45  E_FAST_SECURE_DE
14170 4c 45 54 45 29 0a 20 20 20 20 70 42 74 2d 3e 62  LETE).    pBt->b
14180 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 4f  tsFlags |= BTS_O
14190 56 45 52 57 52 49 54 45 3b 0a 23 65 6e 64 69 66  VERWRITE;.#endif
141a0 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
141b0 2d 4f 46 3a 20 52 2d 35 31 38 37 33 2d 33 39 36  -OF: R-51873-396
141c0 31 38 20 54 68 65 20 70 61 67 65 20 73 69 7a 65  18 The page size
141d0 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20   for a database 
141e0 66 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 64  file is.    ** d
141f0 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
14200 20 32 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20   2-byte integer 
14210 6c 6f 63 61 74 65 64 20 61 74 20 61 6e 20 6f 66  located at an of
14220 66 73 65 74 20 6f 66 20 31 36 20 62 79 74 65 73  fset of 16 bytes
14230 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65   from.    ** the
14240 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
14250 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
14260 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 70 61 67   */.    pBt->pag
14270 65 53 69 7a 65 20 3d 20 28 7a 44 62 48 65 61 64  eSize = (zDbHead
14280 65 72 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 7a 44  er[16]<<8) | (zD
14290 62 48 65 61 64 65 72 5b 31 37 5d 3c 3c 31 36 29  bHeader[17]<<16)
142a0 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70  ;.    if( pBt->p
142b0 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70  ageSize<512 || p
142c0 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c  Bt->pageSize>SQL
142d0 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
142e0 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28  E.         || ((
142f0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29  pBt->pageSize-1)
14300 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21  &pBt->pageSize)!
14310 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  =0 ){.      pBt-
14320 3e 70 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a 23  >pageSize = 0;.#
14330 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14340 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
14350 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61      /* If the ma
14360 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72  gic name ":memor
14370 79 3a 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20  y:" will create 
14380 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
14390 61 62 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20  abase, then.    
143a0 20 20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61    ** leave the a
143b0 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61  utoVacuum mode a
143c0 74 20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f  t 0 (do not auto
143d0 2d 76 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69  -vacuum), even i
143e0 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54  f.      ** SQLIT
143f0 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
14400 43 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e  CUUM is true. On
14410 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
14420 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c   if.      ** SQL
14430 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
14440 42 20 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e  B has been defin
14450 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72  ed, then ":memor
14460 79 3a 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20  y:" is just a.  
14470 20 20 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66      ** regular f
14480 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69  ile-name. In thi
14490 73 20 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d  s case the auto-
144a0 76 61 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61  vacuum applies a
144b0 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20  s per normal..  
144c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
144d0 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69   zFilename && !i
144e0 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20  sMemdb ){.      
144f0 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
14500 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41  m = (SQLITE_DEFA
14510 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f  ULT_AUTOVACUUM ?
14520 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20   1 : 0);.       
14530 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
14540 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55   = (SQLITE_DEFAU
14550 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32  LT_AUTOVACUUM==2
14560 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20   ? 1 : 0);.     
14570 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
14580 6e 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20  nReserve = 0;.  
14590 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
145a0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
145b0 2d 33 37 34 39 37 2d 34 32 34 31 32 20 54 68 65  -37497-42412 The
145c0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65 73   size of the res
145d0 65 72 76 65 64 20 72 65 67 69 6f 6e 20 69 73 0a  erved region is.
145e0 20 20 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69        ** determi
145f0 6e 65 64 20 62 79 20 74 68 65 20 6f 6e 65 2d 62  ned by the one-b
14600 79 74 65 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  yte unsigned int
14610 65 67 65 72 20 66 6f 75 6e 64 20 61 74 20 61 6e  eger found at an
14620 20 6f 66 66 73 65 74 20 6f 66 20 32 30 0a 20 20   offset of 20.  
14630 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20      ** into the 
14640 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65  database file he
14650 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 6e  ader. */.      n
14660 52 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61  Reserve = zDbHea
14670 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70  der[20];.      p
14680 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
14690 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
146a0 45 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ED;.#ifndef SQLI
146b0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
146c0 55 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75  UM.      pBt->au
146d0 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  toVacuum = (get4
146e0 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b  byte(&zDbHeader[
146f0 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 4*4])?1:0);
14700 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72  .      pBt->incr
14710 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
14720 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36  te(&zDbHeader[36
14730 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23   + 7*4])?1:0);.#
14740 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
14750 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
14760 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74  rSetPagesize(pBt
14770 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e  ->pPager, &pBt->
14780 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72  pageSize, nReser
14790 76 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ve);.    if( rc 
147a0 29 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65  ) goto btree_ope
147b0 6e 5f 6f 75 74 3b 0a 20 20 20 20 70 42 74 2d 3e  n_out;.    pBt->
147c0 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
147d0 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65  ->pageSize - nRe
147e0 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72  serve;.    asser
147f0 74 28 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  t( (pBt->pageSiz
14800 65 20 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a  e & 7)==0 );  /*
14810 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e   8-byte alignmen
14820 74 20 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f  t of pageSize */
14830 0a 20 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65  .   .#if !define
14840 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
14850 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21  ARED_CACHE) && !
14860 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
14870 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20  MIT_DISKIO).    
14880 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20 42  /* Add the new B
14890 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74  tShared object t
148a0 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  o the linked lis
148b0 74 20 73 68 61 72 61 62 6c 65 20 42 74 53 68 61  t sharable BtSha
148c0 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  reds..    */.   
148d0 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a   pBt->nRef = 1;.
148e0 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61      if( p->shara
148f0 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 4d 55 54  ble ){.      MUT
14900 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65  EX_LOGIC( sqlite
14910 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68  3_mutex *mutexSh
14920 61 72 65 64 3b 20 29 0a 20 20 20 20 20 20 4d 55  ared; ).      MU
14930 54 45 58 5f 4c 4f 47 49 43 28 20 6d 75 74 65 78  TEX_LOGIC( mutex
14940 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33  Shared = sqlite3
14950 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
14960 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
14970 41 53 54 45 52 29 3b 29 0a 20 20 20 20 20 20 69  ASTER);).      i
14980 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  f( SQLITE_THREAD
14990 53 41 46 45 20 26 26 20 73 71 6c 69 74 65 33 47  SAFE && sqlite3G
149a0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72  lobalConfig.bCor
149b0 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20  eMutex ){.      
149c0 20 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73    pBt->mutex = s
149d0 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
149e0 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41  (SQLITE_MUTEX_FA
149f0 53 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ST);.        if(
14a00 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29   pBt->mutex==0 )
14a10 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
14a20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
14a30 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  PT;.          go
14a40 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
14a50 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
14a60 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
14a70 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d  e3_mutex_enter(m
14a80 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
14a90 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20     pBt->pNext = 
14aa0 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
14ab0 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
14ac0 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  cheList);.      
14ad0 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
14ae0 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
14af0 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a  cheList) = pBt;.
14b00 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
14b10 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53  tex_leave(mutexS
14b20 68 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65  hared);.    }.#e
14b30 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64  ndif.  }..#if !d
14b40 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
14b50 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
14b60 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
14b70 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29  ITE_OMIT_DISKIO)
14b80 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77  .  /* If the new
14b90 20 42 74 72 65 65 20 75 73 65 73 20 61 20 73 68   Btree uses a sh
14ba0 61 72 61 62 6c 65 20 70 42 74 53 68 61 72 65 64  arable pBtShared
14bb0 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20  , then link the 
14bc0 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69  new.  ** Btree i
14bd0 6e 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20  nto the list of 
14be0 61 6c 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72  all sharable Btr
14bf0 65 65 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65  ees for the same
14c00 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a   connection..  *
14c10 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65  * The list is ke
14c20 70 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  pt in ascending 
14c30 6f 72 64 65 72 20 62 79 20 70 42 74 20 61 64 64  order by pBt add
14c40 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ress..  */.  if(
14c50 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a   p->sharable ){.
14c60 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42      int i;.    B
14c70 74 72 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20  tree *pSib;.    
14c80 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
14c90 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
14ca0 69 66 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e  if( (pSib = db->
14cb0 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26  aDb[i].pBt)!=0 &
14cc0 26 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65  & pSib->sharable
14cd0 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   ){.        whil
14ce0 65 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29  e( pSib->pPrev )
14cf0 7b 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70  { pSib = pSib->p
14d00 50 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20  Prev; }.        
14d10 69 66 28 20 28 75 70 74 72 29 70 2d 3e 70 42 74  if( (uptr)p->pBt
14d20 3c 28 75 70 74 72 29 70 53 69 62 2d 3e 70 42 74  <(uptr)pSib->pBt
14d30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
14d40 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a 20  >pNext = pSib;. 
14d50 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65           p->pPre
14d60 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  v = 0;.         
14d70 20 70 53 69 62 2d 3e 70 50 72 65 76 20 3d 20 70   pSib->pPrev = p
14d80 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
14d90 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
14da0 28 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 26 26  ( pSib->pNext &&
14db0 20 28 75 70 74 72 29 70 53 69 62 2d 3e 70 4e 65   (uptr)pSib->pNe
14dc0 78 74 2d 3e 70 42 74 3c 28 75 70 74 72 29 70 2d  xt->pBt<(uptr)p-
14dd0 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  >pBt ){.        
14de0 20 20 20 20 70 53 69 62 20 3d 20 70 53 69 62 2d      pSib = pSib-
14df0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
14e00 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d    }.          p-
14e10 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e 70  >pNext = pSib->p
14e20 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
14e30 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62 3b  p->pPrev = pSib;
14e40 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
14e50 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ->pNext ){.     
14e60 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d         p->pNext-
14e70 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20  >pPrev = p;.    
14e80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
14e90 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20    pSib->pNext = 
14ea0 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
14eb0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14ec0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
14ed0 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65 20  ndif.  *ppBtree 
14ee0 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e  = p;..btree_open
14ef0 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d  _out:.  if( rc!=
14f00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14f10 20 69 66 28 20 70 42 74 20 26 26 20 70 42 74 2d   if( pBt && pBt-
14f20 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20  >pPager ){.     
14f30 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
14f40 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  se(pBt->pPager, 
14f50 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  0);.    }.    sq
14f60 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b  lite3_free(pBt);
14f70 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
14f80 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72  e(p);.    *ppBtr
14f90 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ee = 0;.  }else{
14fa0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  .    sqlite3_fil
14fb0 65 20 2a 70 46 69 6c 65 3b 0a 0a 20 20 20 20 2f  e *pFile;..    /
14fc0 2a 20 49 66 20 74 68 65 20 42 2d 54 72 65 65 20  * If the B-Tree 
14fd0 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
14fe0 20 6f 70 65 6e 65 64 2c 20 73 65 74 20 74 68 65   opened, set the
14ff0 20 70 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a   pager-cache siz
15000 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  e to the.    ** 
15010 64 65 66 61 75 6c 74 20 76 61 6c 75 65 2e 20 45  default value. E
15020 78 63 65 70 74 2c 20 77 68 65 6e 20 6f 70 65 6e  xcept, when open
15030 69 6e 67 20 6f 6e 20 61 6e 20 65 78 69 73 74 69  ing on an existi
15040 6e 67 20 73 68 61 72 65 64 20 70 61 67 65 72 2d  ng shared pager-
15050 63 61 63 68 65 2c 0a 20 20 20 20 2a 2a 20 64 6f  cache,.    ** do
15060 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20   not change the 
15070 70 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65  pager-cache size
15080 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
15090 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68   sqlite3BtreeSch
150a0 65 6d 61 28 70 2c 20 30 2c 20 30 29 3d 3d 30 20  ema(p, 0, 0)==0 
150b0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
150c0 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a  PagerSetCachesiz
150d0 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  e(p->pBt->pPager
150e0 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
150f0 5f 43 41 43 48 45 5f 53 49 5a 45 29 3b 0a 20 20  _CACHE_SIZE);.  
15100 20 20 7d 0a 0a 20 20 20 20 70 46 69 6c 65 20 3d    }..    pFile =
15110 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
15120 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  e(pBt->pPager);.
15130 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70      if( pFile->p
15140 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20  Methods ){.     
15150 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
15160 6e 74 72 6f 6c 48 69 6e 74 28 70 46 69 6c 65 2c  ntrolHint(pFile,
15170 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 44   SQLITE_FCNTL_PD
15180 42 2c 20 28 76 6f 69 64 2a 29 26 70 42 74 2d 3e  B, (void*)&pBt->
15190 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  db);.    }.  }. 
151a0 20 69 66 28 20 6d 75 74 65 78 4f 70 65 6e 20 29   if( mutexOpen )
151b0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
151c0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
151d0 28 6d 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20  (mutexOpen) );. 
151e0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
151f0 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e  _leave(mutexOpen
15200 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
15210 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
15220 7c 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  | sqlite3BtreeCo
15230 6e 6e 65 63 74 69 6f 6e 43 6f 75 6e 74 28 2a 70  nnectionCount(*p
15240 70 42 74 72 65 65 29 3e 30 20 29 3b 0a 20 20 72  pBtree)>0 );.  r
15250 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
15260 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  ** Decrement the
15270 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63   BtShared.nRef c
15280 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e 20 69 74  ounter.  When it
15290 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a   reaches zero,.*
152a0 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 42 74 53  * remove the BtS
152b0 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65 20  hared structure 
152c0 66 72 6f 6d 20 74 68 65 20 73 68 61 72 69 6e 67  from the sharing
152d0 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a   list.  Return.*
152e0 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 42 74  * true if the Bt
152f0 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e  Shared.nRef coun
15300 74 65 72 20 72 65 61 63 68 65 73 20 7a 65 72 6f  ter reaches zero
15310 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66   and return.** f
15320 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 74  alse if it is st
15330 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f  ill positive..*/
15340 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f  .static int remo
15350 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73  veFromSharingLis
15360 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  t(BtShared *pBt)
15370 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
15380 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
15390 48 45 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43  HE.  MUTEX_LOGIC
153a0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20  ( sqlite3_mutex 
153b0 2a 70 4d 61 73 74 65 72 3b 20 29 0a 20 20 42 74  *pMaster; ).  Bt
153c0 53 68 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20  Shared *pList;. 
153d0 20 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20 30   int removed = 0
153e0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
153f0 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65  ite3_mutex_nothe
15400 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
15410 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28  ;.  MUTEX_LOGIC(
15420 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74   pMaster = sqlit
15430 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
15440 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
15450 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 73 71  _MASTER); ).  sq
15460 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
15470 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 70 42  r(pMaster);.  pB
15480 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28  t->nRef--;.  if(
15490 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b   pBt->nRef<=0 ){
154a0 0a 20 20 20 20 69 66 28 20 47 4c 4f 42 41 4c 28  .    if( GLOBAL(
154b0 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
154c0 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
154d0 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20  )==pBt ){.      
154e0 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
154f0 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
15500 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e  cheList) = pBt->
15510 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65  pNext;.    }else
15520 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20  {.      pList = 
15530 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
15540 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
15550 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  cheList);.      
15560 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4c  while( ALWAYS(pL
15570 69 73 74 29 20 26 26 20 70 4c 69 73 74 2d 3e 70  ist) && pList->p
15580 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a 20 20 20  Next!=pBt ){.   
15590 20 20 20 20 20 70 4c 69 73 74 3d 70 4c 69 73 74       pList=pList
155a0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
155b0 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59  .      if( ALWAY
155c0 53 28 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20  S(pList) ){.    
155d0 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74      pList->pNext
155e0 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20   = pBt->pNext;. 
155f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
15600 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45   if( SQLITE_THRE
15610 41 44 53 41 46 45 20 29 7b 0a 20 20 20 20 20 20  ADSAFE ){.      
15620 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72  sqlite3_mutex_fr
15630 65 65 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a  ee(pBt->mutex);.
15640 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65      }.    remove
15650 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c  d = 1;.  }.  sql
15660 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
15670 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74  (pMaster);.  ret
15680 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c  urn removed;.#el
15690 73 65 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23  se.  return 1;.#
156a0 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  endif.}../*.** M
156b0 61 6b 65 20 73 75 72 65 20 70 42 74 2d 3e 70 54  ake sure pBt->pT
156c0 6d 70 53 70 61 63 65 20 70 6f 69 6e 74 73 20 74  mpSpace points t
156d0 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  o an allocation 
156e0 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53  of .** MX_CELL_S
156f0 49 5a 45 28 70 42 74 29 20 62 79 74 65 73 20 77  IZE(pBt) bytes w
15700 69 74 68 20 61 20 34 2d 62 79 74 65 20 70 72 65  ith a 4-byte pre
15710 66 69 78 20 66 6f 72 20 61 20 6c 65 66 74 2d 63  fix for a left-c
15720 68 69 6c 64 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e  hild.** pointer.
15730 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
15740 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63  allocateTempSpac
15750 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
15760 7b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70 54  {.  if( !pBt->pT
15770 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70  mpSpace ){.    p
15780 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  Bt->pTmpSpace = 
15790 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f  sqlite3PageMallo
157a0 63 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  c( pBt->pageSize
157b0 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e 65 20   );..    /* One 
157c0 6f 66 20 74 68 65 20 75 73 65 73 20 6f 66 20 70  of the uses of p
157d0 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 69 73  Bt->pTmpSpace is
157e0 20 74 6f 20 66 6f 72 6d 61 74 20 63 65 6c 6c 73   to format cells
157f0 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69   before.    ** i
15800 6e 73 65 72 74 69 6e 67 20 74 68 65 6d 20 69 6e  nserting them in
15810 74 6f 20 61 20 6c 65 61 66 20 70 61 67 65 20 28  to a leaf page (
15820 66 75 6e 63 74 69 6f 6e 20 66 69 6c 6c 49 6e 43  function fillInC
15830 65 6c 6c 28 29 29 2e 20 49 66 0a 20 20 20 20 2a  ell()). If.    *
15840 2a 20 61 20 63 65 6c 6c 20 69 73 20 6c 65 73 73  * a cell is less
15850 20 74 68 61 6e 20 34 20 62 79 74 65 73 20 69 6e   than 4 bytes in
15860 20 73 69 7a 65 2c 20 69 74 20 69 73 20 72 6f 75   size, it is rou
15870 6e 64 65 64 20 75 70 20 74 6f 20 34 20 62 79 74  nded up to 4 byt
15880 65 73 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65  es.    ** by the
15890 20 76 61 72 69 6f 75 73 20 72 6f 75 74 69 6e 65   various routine
158a0 73 20 74 68 61 74 20 6d 61 6e 69 70 75 6c 61 74  s that manipulat
158b0 65 20 62 69 6e 61 72 79 20 63 65 6c 6c 73 2e 20  e binary cells. 
158c0 57 68 69 63 68 0a 20 20 20 20 2a 2a 20 63 61 6e  Which.    ** can
158d0 20 6d 65 61 6e 20 74 68 61 74 20 66 69 6c 6c 49   mean that fillI
158e0 6e 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 69 6e 69  nCell() only ini
158f0 74 69 61 6c 69 7a 65 73 20 74 68 65 20 66 69 72  tializes the fir
15900 73 74 20 32 20 6f 72 20 33 0a 20 20 20 20 2a 2a  st 2 or 3.    **
15910 20 62 79 74 65 73 20 6f 66 20 70 54 6d 70 53 70   bytes of pTmpSp
15920 61 63 65 2c 20 62 75 74 20 74 68 61 74 20 74 68  ace, but that th
15930 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
15940 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a  are copied from.
15950 20 20 20 20 2a 2a 20 69 74 20 69 6e 74 6f 20 61      ** it into a
15960 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20   database page. 
15970 54 68 69 73 20 69 73 20 6e 6f 74 20 61 63 74 75  This is not actu
15980 61 6c 6c 79 20 61 20 70 72 6f 62 6c 65 6d 2c 20  ally a problem, 
15990 62 75 74 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f  but it.    ** do
159a0 65 73 20 63 61 75 73 65 20 61 20 76 61 6c 67 72  es cause a valgr
159b0 69 6e 64 20 65 72 72 6f 72 20 77 68 65 6e 20 74  ind error when t
159c0 68 65 20 31 20 6f 72 20 32 20 62 79 74 65 73 20  he 1 or 2 bytes 
159d0 6f 66 20 75 6e 69 74 69 61 6c 69 7a 65 64 20 0a  of unitialized .
159e0 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 70      ** data is p
159f0 61 73 73 65 64 20 74 6f 20 73 79 73 74 65 6d 20  assed to system 
15a00 63 61 6c 6c 20 77 72 69 74 65 28 29 2e 20 53 6f  call write(). So
15a10 20 74 6f 20 61 76 6f 69 64 20 74 68 69 73 20 65   to avoid this e
15a20 72 72 6f 72 2c 0a 20 20 20 20 2a 2a 20 7a 65 72  rror,.    ** zer
15a30 6f 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79  o the first 4 by
15a40 74 65 73 20 6f 66 20 74 65 6d 70 20 73 70 61 63  tes of temp spac
15a50 65 20 68 65 72 65 2e 0a 20 20 20 20 2a 2a 0a 20  e here..    **. 
15a60 20 20 20 2a 2a 20 41 6c 73 6f 3a 20 20 50 72 6f     ** Also:  Pro
15a70 76 69 64 65 20 66 6f 75 72 20 62 79 74 65 73 20  vide four bytes 
15a80 6f 66 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 73  of initialized s
15a90 70 61 63 65 20 62 65 66 6f 72 65 20 74 68 65 0a  pace before the.
15aa0 20 20 20 20 2a 2a 20 62 65 67 69 6e 6e 69 6e 67      ** beginning
15ab0 20 6f 66 20 70 54 6d 70 53 70 61 63 65 20 61 73   of pTmpSpace as
15ac0 20 61 6e 20 61 72 65 61 20 61 76 61 69 6c 61 62   an area availab
15ad0 6c 65 20 74 6f 20 70 72 65 70 65 6e 64 20 74 68  le to prepend th
15ae0 65 0a 20 20 20 20 2a 2a 20 6c 65 66 74 2d 63 68  e.    ** left-ch
15af0 69 6c 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  ild pointer to t
15b00 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
15b10 61 20 63 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20  a cell..    */. 
15b20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70     if( pBt->pTmp
15b30 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 6d  Space ){.      m
15b40 65 6d 73 65 74 28 70 42 74 2d 3e 70 54 6d 70 53  emset(pBt->pTmpS
15b50 70 61 63 65 2c 20 30 2c 20 38 29 3b 0a 20 20 20  pace, 0, 8);.   
15b60 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63     pBt->pTmpSpac
15b70 65 20 2b 3d 20 34 3b 0a 20 20 20 20 7d 0a 20 20  e += 4;.    }.  
15b80 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  }.}../*.** Free 
15b90 74 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  the pBt->pTmpSpa
15ba0 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f  ce allocation.*/
15bb0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65  .static void fre
15bc0 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61  eTempSpace(BtSha
15bd0 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28  red *pBt){.  if(
15be0 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
15bf0 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70  ){.    pBt->pTmp
15c00 53 70 61 63 65 20 2d 3d 20 34 3b 0a 20 20 20 20  Space -= 4;.    
15c10 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
15c20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b  pBt->pTmpSpace);
15c30 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70  .    pBt->pTmpSp
15c40 61 63 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  ace = 0;.  }.}..
15c50 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f  /*.** Close an o
15c60 70 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64  pen database and
15c70 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
15c80 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20  cursors..*/.int 
15c90 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
15ca0 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  e(Btree *p){.  B
15cb0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
15cc0 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f  ->pBt;.  BtCurso
15cd0 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43  r *pCur;..  /* C
15ce0 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  lose all cursors
15cf0 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69 73   opened via this
15d00 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61   handle.  */.  a
15d10 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
15d20 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
15d30 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
15d40 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
15d50 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d  );.  pCur = pBt-
15d60 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c  >pCursor;.  whil
15d70 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42  e( pCur ){.    B
15d80 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20  tCursor *pTmp = 
15d90 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d  pCur;.    pCur =
15da0 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20   pCur->pNext;.  
15db0 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72    if( pTmp->pBtr
15dc0 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73  ee==p ){.      s
15dd0 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
15de0 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20  Cursor(pTmp);.  
15df0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f    }.  }..  /* Ro
15e00 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76  llback any activ
15e10 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  e transaction an
15e20 64 20 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c  d free the handl
15e30 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a  e structure..  *
15e40 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  * The call to sq
15e50 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
15e60 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74  ck() drops any t
15e70 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20  able-locks held 
15e80 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e  by.  ** this han
15e90 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  dle..  */.  sqli
15ea0 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
15eb0 28 70 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30  (p, SQLITE_OK, 0
15ec0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
15ed0 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a  eLeave(p);..  /*
15ee0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 73 74   If there are st
15ef0 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61  ill other outsta
15f00 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
15f10 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62   to the shared-b
15f20 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74  tree.  ** struct
15f30 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e  ure, return now.
15f40 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f   The remainder o
15f50 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  f this procedure
15f60 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70   cleans .  ** up
15f70 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
15f80 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
15f90 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d  ( p->wantToLock=
15fa0 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d  =0 && p->locked=
15fb0 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e  =0 );.  if( !p->
15fc0 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f  sharable || remo
15fd0 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73  veFromSharingLis
15fe0 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a  t(pBt) ){.    /*
15ff0 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c   The pBt is no l
16000 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61  onger on the sha
16010 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65  ring list, so we
16020 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20   can access.    
16030 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68 61  ** it without ha
16040 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65  ving to hold the
16050 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20   mutex..    **. 
16060 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20     ** Clean out 
16070 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 42  and delete the B
16080 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a  tShared object..
16090 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
160a0 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72  t( !pBt->pCursor
160b0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   );.    sqlite3P
160c0 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70  agerClose(pBt->p
160d0 50 61 67 65 72 2c 20 70 2d 3e 64 62 29 3b 0a 20  Pager, p->db);. 
160e0 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65     if( pBt->xFre
160f0 65 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e  eSchema && pBt->
16100 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
16110 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d   pBt->xFreeSchem
16120 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b  a(pBt->pSchema);
16130 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
16140 65 33 44 62 46 72 65 65 28 30 2c 20 70 42 74 2d  e3DbFree(0, pBt-
16150 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 66  >pSchema);.    f
16160 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
16170 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
16180 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23  ree(pBt);.  }..#
16190 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
161a0 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
161b0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e    assert( p->wan
161c0 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  tToLock==0 );.  
161d0 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65  assert( p->locke
161e0 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  d==0 );.  if( p-
161f0 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65  >pPrev ) p->pPre
16200 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e  v->pNext = p->pN
16210 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e  ext;.  if( p->pN
16220 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e  ext ) p->pNext->
16230 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76  pPrev = p->pPrev
16240 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69  ;.#endif..  sqli
16250 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72  te3_free(p);.  r
16260 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16270 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
16280 20 74 68 65 20 22 73 6f 66 74 22 20 6c 69 6d 69   the "soft" limi
16290 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  t on the number 
162a0 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
162b0 63 61 63 68 65 2e 0a 2a 2a 20 55 6e 75 73 65 64  cache..** Unused
162c0 20 61 6e 64 20 75 6e 6d 6f 64 69 66 69 65 64 20   and unmodified 
162d0 70 61 67 65 73 20 77 69 6c 6c 20 62 65 20 72 65  pages will be re
162e0 63 79 63 6c 65 64 20 77 68 65 6e 20 74 68 65 20  cycled when the 
162f0 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67  number of.** pag
16300 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  es in the cache 
16310 65 78 63 65 65 64 73 20 74 68 69 73 20 73 6f 66  exceeds this sof
16320 74 20 6c 69 6d 69 74 2e 20 20 42 75 74 20 74 68  t limit.  But th
16330 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  e size of the.**
16340 20 63 61 63 68 65 20 69 73 20 61 6c 6c 6f 77 65   cache is allowe
16350 64 20 74 6f 20 67 72 6f 77 20 6c 61 72 67 65 72  d to grow larger
16360 20 74 68 61 6e 20 74 68 69 73 20 6c 69 6d 69 74   than this limit
16370 20 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a   if it contains.
16380 2a 2a 20 64 69 72 74 79 20 70 61 67 65 73 20 6f  ** dirty pages o
16390 72 20 70 61 67 65 73 20 73 74 69 6c 6c 20 69 6e  r pages still in
163a0 20 61 63 74 69 76 65 20 75 73 65 2e 0a 2a 2f 0a   active use..*/.
163b0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
163c0 53 65 74 43 61 63 68 65 53 69 7a 65 28 42 74 72  SetCacheSize(Btr
163d0 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67  ee *p, int mxPag
163e0 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
163f0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
16400 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
16410 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
16420 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
16430 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
16440 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  p);.  sqlite3Pag
16450 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70  erSetCachesize(p
16460 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61  Bt->pPager, mxPa
16470 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ge);.  sqlite3Bt
16480 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
16490 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
164a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
164b0 20 74 68 65 20 22 73 70 69 6c 6c 22 20 6c 69 6d   the "spill" lim
164c0 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72  it on the number
164d0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
164e0 20 63 61 63 68 65 2e 0a 2a 2a 20 49 66 20 74 68   cache..** If th
164f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
16500 73 20 65 78 63 65 65 64 73 20 74 68 69 73 20 6c  s exceeds this l
16510 69 6d 69 74 20 64 75 72 69 6e 67 20 61 20 77 72  imit during a wr
16520 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite transaction,
16530 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 6d 69  .** the pager mi
16540 67 68 74 20 61 74 74 65 6d 70 74 20 74 6f 20 22  ght attempt to "
16550 73 70 69 6c 6c 22 20 70 61 67 65 73 20 74 6f 20  spill" pages to 
16560 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65 61 72 6c  the journal earl
16570 79 20 69 6e 0a 2a 2a 20 6f 72 64 65 72 20 74 6f  y in.** order to
16580 20 66 72 65 65 20 75 70 20 6d 65 6d 6f 72 79 2e   free up memory.
16590 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  .**.** The value
165a0 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
165b0 20 63 75 72 72 65 6e 74 20 73 70 69 6c 6c 20 73   current spill s
165c0 69 7a 65 2e 20 20 49 66 20 7a 65 72 6f 20 69 73  ize.  If zero is
165d0 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 61 6e   passed.** as an
165e0 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 20 63 68   argument, no ch
165f0 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74  anges are made t
16600 6f 20 74 68 65 20 73 70 69 6c 6c 20 73 69 7a 65  o the spill size
16610 20 73 65 74 74 69 6e 67 2c 20 73 6f 0a 2a 2a 20   setting, so.** 
16620 75 73 69 6e 67 20 6d 78 50 61 67 65 20 6f 66 20  using mxPage of 
16630 30 20 69 73 20 61 20 77 61 79 20 74 6f 20 71 75  0 is a way to qu
16640 65 72 79 20 74 68 65 20 63 75 72 72 65 6e 74 20  ery the current 
16650 73 70 69 6c 6c 20 73 69 7a 65 2e 0a 2a 2f 0a 69  spill size..*/.i
16660 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
16670 65 74 53 70 69 6c 6c 53 69 7a 65 28 42 74 72 65  etSpillSize(Btre
16680 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65  e *p, int mxPage
16690 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
166a0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
166b0 6e 74 20 72 65 73 3b 0a 20 20 61 73 73 65 72 74  nt res;.  assert
166c0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
166d0 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
166e0 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
166f0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
16700 72 65 73 20 3d 20 73 71 6c 69 74 65 33 50 61 67  res = sqlite3Pag
16710 65 72 53 65 74 53 70 69 6c 6c 73 69 7a 65 28 70  erSetSpillsize(p
16720 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61  Bt->pPager, mxPa
16730 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ge);.  sqlite3Bt
16740 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
16750 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 23 69  eturn res;.}..#i
16760 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
16770 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 43  P_SIZE>0./*.** C
16780 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20  hange the limit 
16790 6f 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  on the amount of
167a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
167b0 6c 65 20 74 68 61 74 20 6d 61 79 20 62 65 0a 2a  le that may be.*
167c0 2a 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 2e  * memory mapped.
167d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
167e0 74 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74  treeSetMmapLimit
167f0 28 42 74 72 65 65 20 2a 70 2c 20 73 71 6c 69 74  (Btree *p, sqlit
16800 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29  e3_int64 szMmap)
16810 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
16820 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
16830 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
16840 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
16850 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
16860 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
16870 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
16880 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74  SetMmapLimit(pBt
16890 2d 3e 70 50 61 67 65 72 2c 20 73 7a 4d 6d 61 70  ->pPager, szMmap
168a0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
168b0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
168c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
168d0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
168e0 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
168f0 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  0 */../*.** Chan
16900 67 65 20 74 68 65 20 77 61 79 20 64 61 74 61 20  ge the way data 
16910 69 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  is synced to dis
16920 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e  k in order to in
16930 63 72 65 61 73 65 20 6f 72 20 64 65 63 72 65 61  crease or decrea
16940 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74  se.** how well t
16950 68 65 20 64 61 74 61 62 61 73 65 20 72 65 73 69  he database resi
16960 73 74 73 20 64 61 6d 61 67 65 20 64 75 65 20 74  sts damage due t
16970 6f 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64  o OS crashes and
16980 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72   power.** failur
16990 65 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20  es.  Level 1 is 
169a0 74 68 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e  the same as asyn
169b0 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e  chronous (no syn
169c0 63 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a  cs() occur and.*
169d0 2a 20 74 68 65 72 65 20 69 73 20 61 20 68 69 67  * there is a hig
169e0 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  h probability of
169f0 20 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20   damage)  Level 
16a00 32 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  2 is the default
16a10 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61  .  There.** is a
16a20 20 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f   very low but no
16a30 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69  n-zero probabili
16a40 74 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c  ty of damage.  L
16a50 65 76 65 6c 20 33 20 72 65 64 75 63 65 73 20 74  evel 3 reduces t
16a60 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74  he.** probabilit
16a70 79 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e  y of damage to n
16a80 65 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74  ear zero but wit
16a90 68 20 61 20 77 72 69 74 65 20 70 65 72 66 6f 72  h a write perfor
16aa0 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e  mance reduction.
16ab0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
16ac0 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
16ad0 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65  AGMAS.int sqlite
16ae0 33 42 74 72 65 65 53 65 74 50 61 67 65 72 46 6c  3BtreeSetPagerFl
16af0 61 67 73 28 0a 20 20 42 74 72 65 65 20 2a 70 2c  ags(.  Btree *p,
16b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16b10 20 54 68 65 20 62 74 72 65 65 20 74 6f 20 73 65   The btree to se
16b20 74 20 74 68 65 20 73 61 66 65 74 79 20 6c 65 76  t the safety lev
16b30 65 6c 20 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69 67  el on */.  unsig
16b40 6e 65 64 20 70 67 46 6c 61 67 73 20 20 20 20 20  ned pgFlags     
16b50 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 50 41 47    /* Various PAG
16b60 45 52 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b  ER_* flags */.){
16b70 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
16b80 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
16b90 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
16ba0 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
16bb0 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
16bc0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
16bd0 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  .  sqlite3PagerS
16be0 65 74 46 6c 61 67 73 28 70 42 74 2d 3e 70 50 61  etFlags(pBt->pPa
16bf0 67 65 72 2c 20 70 67 46 6c 61 67 73 29 3b 0a 20  ger, pgFlags);. 
16c00 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
16c10 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
16c20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
16c30 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  dif../*.** Chang
16c40 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61  e the default pa
16c50 67 65 73 20 73 69 7a 65 20 61 6e 64 20 74 68 65  ges size and the
16c60 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
16c70 76 65 64 20 62 79 74 65 73 20 70 65 72 20 70 61  ved bytes per pa
16c80 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68  ge..** Or, if th
16c90 65 20 70 61 67 65 20 73 69 7a 65 20 68 61 73 20  e page size has 
16ca0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 66 69 78  already been fix
16cb0 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ed, return SQLIT
16cc0 45 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77  E_READONLY .** w
16cd0 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20  ithout changing 
16ce0 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  anything..**.** 
16cf0 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 75  The page size mu
16d00 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66  st be a power of
16d10 20 32 20 62 65 74 77 65 65 6e 20 35 31 32 20 61   2 between 512 a
16d20 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20 74 68  nd 65536.  If th
16d30 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73  e page.** size s
16d40 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74  upplied does not
16d50 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73 74   meet this const
16d60 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20 70  raint then the p
16d70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a  age size is not.
16d80 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a  ** changed..**.*
16d90 2a 20 50 61 67 65 20 73 69 7a 65 73 20 61 72 65  * Page sizes are
16da0 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f 20   constrained to 
16db0 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77  be a power of tw
16dc0 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20 72 65  o so that the re
16dd0 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64  gion.** of the d
16de0 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 65  atabase file use
16df0 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62  d for locking (b
16e00 65 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44  eginning at PEND
16e10 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65  ING_BYTE,.** the
16e20 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74   first byte past
16e30 20 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61 72   the 1GB boundar
16e40 79 2c 20 30 78 34 30 30 30 30 30 30 30 29 20 6e  y, 0x40000000) n
16e50 65 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a  eeds to occur.**
16e60 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
16e70 67 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  g of a page..**.
16e80 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
16e90 6e 52 65 73 65 72 76 65 20 69 73 20 6c 65 73 73  nReserve is less
16ea0 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
16eb0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
16ec0 65 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65 73  eserved.** bytes
16ed0 20 70 65 72 20 70 61 67 65 20 69 73 20 6c 65 66   per page is lef
16ee0 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  t unchanged..**.
16ef0 2a 2a 20 49 66 20 74 68 65 20 69 46 69 78 21 3d  ** If the iFix!=
16f00 30 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50  0 then the BTS_P
16f10 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20 66 6c  AGESIZE_FIXED fl
16f20 61 67 20 69 73 20 73 65 74 20 73 6f 20 74 68 61  ag is set so tha
16f30 74 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a  t the page size.
16f40 2a 2a 20 61 6e 64 20 61 75 74 6f 76 61 63 75 75  ** and autovacuu
16f50 6d 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c 6f  m mode can no lo
16f60 6e 67 65 72 20 62 65 20 63 68 61 6e 67 65 64 2e  nger be changed.
16f70 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
16f80 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28  treeSetPageSize(
16f90 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61  Btree *p, int pa
16fa0 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73  geSize, int nRes
16fb0 65 72 76 65 2c 20 69 6e 74 20 69 46 69 78 29 7b  erve, int iFix){
16fc0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
16fd0 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65  TE_OK;.  BtShare
16fe0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
16ff0 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65  .  assert( nRese
17000 72 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65  rve>=-1 && nRese
17010 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71  rve<=255 );.  sq
17020 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
17030 70 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 48  p);.#if SQLITE_H
17040 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 6e  AS_CODEC.  if( n
17050 52 65 73 65 72 76 65 3e 70 42 74 2d 3e 6f 70 74  Reserve>pBt->opt
17060 69 6d 61 6c 52 65 73 65 72 76 65 20 29 20 70 42  imalReserve ) pB
17070 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76  t->optimalReserv
17080 65 20 3d 20 28 75 38 29 6e 52 65 73 65 72 76 65  e = (u8)nReserve
17090 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  ;.#endif.  if( p
170a0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
170b0 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
170c0 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  D ){.    sqlite3
170d0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
170e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
170f0 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20  _READONLY;.  }. 
17100 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20   if( nReserve<0 
17110 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20  ){.    nReserve 
17120 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
17130 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  - pBt->usableSiz
17140 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  e;.  }.  assert(
17150 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20   nReserve>=0 && 
17160 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b  nReserve<=255 );
17170 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e  .  if( pageSize>
17180 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65  =512 && pageSize
17190 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  <=SQLITE_MAX_PAG
171a0 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20  E_SIZE &&.      
171b0 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26    ((pageSize-1)&
171c0 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a  pageSize)==0 ){.
171d0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67      assert( (pag
171e0 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
171f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42  .    assert( !pB
17200 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20  t->pCursor );.  
17210 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
17220 3d 20 28 75 33 32 29 70 61 67 65 53 69 7a 65 3b  = (u32)pageSize;
17230 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61  .    freeTempSpa
17240 63 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72  ce(pBt);.  }.  r
17250 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
17260 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
17270 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
17280 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76  ageSize, nReserv
17290 65 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c  e);.  pBt->usabl
172a0 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67  eSize = pBt->pag
172b0 65 53 69 7a 65 20 2d 20 28 75 31 36 29 6e 52 65  eSize - (u16)nRe
172c0 73 65 72 76 65 3b 0a 20 20 69 66 28 20 69 46 69  serve;.  if( iFi
172d0 78 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  x ) pBt->btsFlag
172e0 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a  s |= BTS_PAGESIZ
172f0 45 5f 46 49 58 45 44 3b 0a 20 20 73 71 6c 69 74  E_FIXED;.  sqlit
17300 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
17310 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
17320 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
17330 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69  e currently defi
17340 6e 65 64 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f  ned page size.*/
17350 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
17360 65 47 65 74 50 61 67 65 53 69 7a 65 28 42 74 72  eGetPageSize(Btr
17370 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  ee *p){.  return
17380 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a   p->pBt->pageSiz
17390 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  e;.}../*.** This
173a0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d   function is sim
173b0 69 6c 61 72 20 74 6f 20 73 71 6c 69 74 65 33 42  ilar to sqlite3B
173c0 74 72 65 65 47 65 74 52 65 73 65 72 76 65 28 29  treeGetReserve()
173d0 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 69 74  , except that it
173e0 0a 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  .** may only be 
173f0 63 61 6c 6c 65 64 20 69 66 20 69 74 20 69 73 20  called if it is 
17400 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20  guaranteed that 
17410 74 68 65 20 62 2d 74 72 65 65 20 6d 75 74 65 78  the b-tree mutex
17420 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 68   is already.** h
17430 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  eld..**.** This 
17440 69 73 20 75 73 65 66 75 6c 20 69 6e 20 6f 6e 65  is useful in one
17450 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 69 6e   special case in
17460 20 74 68 65 20 62 61 63 6b 75 70 20 41 50 49 20   the backup API 
17470 63 6f 64 65 20 77 68 65 72 65 20 69 74 20 69 73  code where it is
17480 0a 2a 2a 20 6b 6e 6f 77 6e 20 74 68 61 74 20 74  .** known that t
17490 68 65 20 73 68 61 72 65 64 20 62 2d 74 72 65 65  he shared b-tree
174a0 20 6d 75 74 65 78 20 69 73 20 68 65 6c 64 2c 20   mutex is held, 
174b0 62 75 74 20 74 68 65 20 6d 75 74 65 78 20 6f 6e  but the mutex on
174c0 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
174d0 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77  e handle that ow
174e0 6e 73 20 2a 70 20 69 73 20 6e 6f 74 2e 20 49 6e  ns *p is not. In
174f0 20 74 68 69 73 20 63 61 73 65 20 69 66 20 73 71   this case if sq
17500 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
17510 29 0a 2a 2a 20 77 65 72 65 20 74 6f 20 62 65 20  ).** were to be 
17520 63 61 6c 6c 65 64 2c 20 69 74 20 6d 69 67 68 74  called, it might
17530 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 73 6f   collide with so
17540 6d 65 20 6f 74 68 65 72 20 6f 70 65 72 61 74 69  me other operati
17550 6f 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74  on on the.** dat
17560 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61  abase handle tha
17570 74 20 6f 77 6e 73 20 2a 70 2c 20 63 61 75 73 69  t owns *p, causi
17580 6e 67 20 75 6e 64 65 66 69 6e 65 64 20 62 65 68  ng undefined beh
17590 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  avior..*/.int sq
175a0 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73  lite3BtreeGetRes
175b0 65 72 76 65 4e 6f 4d 75 74 65 78 28 42 74 72 65  erveNoMutex(Btre
175c0 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  e *p){.  int n;.
175d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
175e0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
175f0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
17600 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67   n = p->pBt->pag
17610 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e  eSize - p->pBt->
17620 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 72 65  usableSize;.  re
17630 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
17640 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
17650 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
17660 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20  pace at the end 
17670 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 74 68  of every page th
17680 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74  at.** are intent
17690 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73 65  ually left unuse
176a0 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20  d.  This is the 
176b0 22 72 65 73 65 72 76 65 64 22 20 73 70 61 63 65  "reserved" space
176c0 20 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65   that is.** some
176d0 74 69 6d 65 73 20 75 73 65 64 20 62 79 20 65 78  times used by ex
176e0 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  tensions..**.** 
176f0 49 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 4d 55  If SQLITE_HAS_MU
17700 54 45 58 20 69 73 20 64 65 66 69 6e 65 64 20 74  TEX is defined t
17710 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 72  hen the number r
17720 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 0a 2a  eturned is the.*
17730 2a 20 67 72 65 61 74 65 72 20 6f 66 20 74 68 65  * greater of the
17740 20 63 75 72 72 65 6e 74 20 72 65 73 65 72 76 65   current reserve
17750 64 20 73 70 61 63 65 20 61 6e 64 20 74 68 65 20  d space and the 
17760 6d 61 78 69 6d 75 6d 20 72 65 71 75 65 73 74 65  maximum requeste
17770 64 0a 2a 2a 20 72 65 73 65 72 76 65 20 73 70 61  d.** reserve spa
17780 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ce..*/.int sqlit
17790 65 33 42 74 72 65 65 47 65 74 4f 70 74 69 6d 61  e3BtreeGetOptima
177a0 6c 52 65 73 65 72 76 65 28 42 74 72 65 65 20 2a  lReserve(Btree *
177b0 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73  p){.  int n;.  s
177c0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
177d0 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74  (p);.  n = sqlit
177e0 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76  e3BtreeGetReserv
177f0 65 4e 6f 4d 75 74 65 78 28 70 29 3b 0a 23 69 66  eNoMutex(p);.#if
17800 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
17810 4f 44 45 43 0a 20 20 69 66 28 20 6e 3c 70 2d 3e  ODEC.  if( n<p->
17820 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65  pBt->optimalRese
17830 72 76 65 20 29 20 6e 20 3d 20 70 2d 3e 70 42 74  rve ) n = p->pBt
17840 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65  ->optimalReserve
17850 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
17860 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
17870 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
17880 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d  ./*.** Set the m
17890 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
178a0 74 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65  t for a database
178b0 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f   if mxPage is po
178c0 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68  sitive..** No ch
178d0 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69  anges are made i
178e0 66 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72  f mxPage is 0 or
178f0 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65   negative..** Re
17900 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20  gardless of the 
17910 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c  value of mxPage,
17920 20 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69   return the maxi
17930 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a  mum page count..
17940 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
17950 72 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28  reeMaxPageCount(
17960 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78  Btree *p, int mx
17970 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  Page){.  int n;.
17980 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
17990 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71  ter(p);.  n = sq
179a0 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67  lite3PagerMaxPag
179b0 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70  eCount(p->pBt->p
179c0 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a  Pager, mxPage);.
179d0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
179e0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
179f0 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61   n;.}../*.** Cha
17a00 6e 67 65 20 74 68 65 20 76 61 6c 75 65 73 20 66  nge the values f
17a10 6f 72 20 74 68 65 20 42 54 53 5f 53 45 43 55 52  or the BTS_SECUR
17a20 45 5f 44 45 4c 45 54 45 20 61 6e 64 20 42 54 53  E_DELETE and BTS
17a30 5f 4f 56 45 52 57 52 49 54 45 20 66 6c 61 67 73  _OVERWRITE flags
17a40 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6e 65 77 46 6c  :.**.**    newFl
17a50 61 67 3d 3d 30 20 20 20 20 20 20 20 42 6f 74 68  ag==0       Both
17a60 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
17a70 54 45 20 61 6e 64 20 42 54 53 5f 4f 56 45 52 57  TE and BTS_OVERW
17a80 52 49 54 45 20 61 72 65 20 63 6c 65 61 72 65 64  RITE are cleared
17a90 0a 2a 2a 20 20 20 20 6e 65 77 46 6c 61 67 3d 3d  .**    newFlag==
17aa0 31 20 20 20 20 20 20 20 42 54 53 5f 53 45 43 55  1       BTS_SECU
17ab0 52 45 5f 44 45 4c 45 54 45 20 73 65 74 20 61 6e  RE_DELETE set an
17ac0 64 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45 20  d BTS_OVERWRITE 
17ad0 69 73 20 63 6c 65 61 72 65 64 0a 2a 2a 20 20 20  is cleared.**   
17ae0 20 6e 65 77 46 6c 61 67 3d 3d 32 20 20 20 20 20   newFlag==2     
17af0 20 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c    BTS_SECURE_DEL
17b00 45 54 45 20 63 6c 65 61 72 65 64 20 61 6e 64 20  ETE cleared and 
17b10 42 54 53 5f 4f 56 45 52 57 52 49 54 45 20 69 73  BTS_OVERWRITE is
17b20 20 73 65 74 0a 2a 2a 20 20 20 20 6e 65 77 46 6c   set.**    newFl
17b30 61 67 3d 3d 28 2d 31 29 20 20 20 20 4e 6f 20 63  ag==(-1)    No c
17b40 68 61 6e 67 65 73 0a 2a 2a 0a 2a 2a 20 54 68 69  hanges.**.** Thi
17b50 73 20 72 6f 75 74 69 6e 65 20 61 63 74 73 20 61  s routine acts a
17b60 73 20 61 20 71 75 65 72 79 20 69 66 20 6e 65 77  s a query if new
17b70 46 6c 61 67 20 69 73 20 6c 65 73 73 20 74 68 61  Flag is less tha
17b80 6e 20 7a 65 72 6f 0a 2a 2a 0a 2a 2a 20 57 69 74  n zero.**.** Wit
17b90 68 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45 20  h BTS_OVERWRITE 
17ba0 73 65 74 2c 20 64 65 6c 65 74 65 64 20 63 6f 6e  set, deleted con
17bb0 74 65 6e 74 20 69 73 20 6f 76 65 72 77 72 69 74  tent is overwrit
17bc0 74 65 6e 20 62 79 20 7a 65 72 6f 73 2c 20 62 75  ten by zeros, bu
17bd0 74 0a 2a 2a 20 66 72 65 65 6c 69 73 74 20 6c 65  t.** freelist le
17be0 61 66 20 70 61 67 65 73 20 61 72 65 20 6e 6f 74  af pages are not
17bf0 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 74 6f   written back to
17c00 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
17c10 54 68 75 73 20 69 6e 2d 70 61 67 65 0a 2a 2a 20  Thus in-page.** 
17c20 64 65 6c 65 74 65 64 20 63 6f 6e 74 65 6e 74 20  deleted content 
17c30 69 73 20 63 6c 65 61 72 65 64 2c 20 62 75 74 20  is cleared, but 
17c40 66 72 65 65 6c 69 73 74 20 64 65 6c 65 74 65 64  freelist deleted
17c50 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 2e   content is not.
17c60 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 42 54 53 5f  .**.** With BTS_
17c70 53 45 43 55 52 45 5f 44 45 4c 45 54 45 2c 20 6f  SECURE_DELETE, o
17c80 70 65 72 61 74 69 6f 6e 20 69 73 20 6c 69 6b 65  peration is like
17c90 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45 20 77   BTS_OVERWRITE w
17ca0 69 74 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e  ith the addition
17cb0 0a 2a 2a 20 74 68 61 74 20 66 72 65 65 6c 69 73  .** that freelis
17cc0 74 20 6c 65 61 66 20 70 61 67 65 73 20 61 72 65  t leaf pages are
17cd0 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e   written back in
17ce0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  to the database,
17cf0 20 69 6e 63 72 65 61 73 69 6e 67 0a 2a 2a 20 74   increasing.** t
17d00 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 64 69 73  he amount of dis
17d10 6b 20 49 2f 4f 2e 0a 2a 2f 0a 69 6e 74 20 73 71  k I/O..*/.int sq
17d20 6c 69 74 65 33 42 74 72 65 65 53 65 63 75 72 65  lite3BtreeSecure
17d30 44 65 6c 65 74 65 28 42 74 72 65 65 20 2a 70 2c  Delete(Btree *p,
17d40 20 69 6e 74 20 6e 65 77 46 6c 61 67 29 7b 0a 20   int newFlag){. 
17d50 20 69 6e 74 20 62 3b 0a 20 20 69 66 28 20 70 3d   int b;.  if( p=
17d60 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
17d70 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
17d80 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28  er(p);.  assert(
17d90 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45 3d 3d   BTS_OVERWRITE==
17da0 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
17db0 45 2a 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28  E*2 );.  assert(
17dc0 20 42 54 53 5f 46 41 53 54 5f 53 45 43 55 52 45   BTS_FAST_SECURE
17dd0 3d 3d 28 42 54 53 5f 4f 56 45 52 57 52 49 54 45  ==(BTS_OVERWRITE
17de0 7c 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45  |BTS_SECURE_DELE
17df0 54 45 29 20 29 3b 0a 20 20 69 66 28 20 6e 65 77  TE) );.  if( new
17e00 46 6c 61 67 3e 3d 30 20 29 7b 0a 20 20 20 20 70  Flag>=0 ){.    p
17e10 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ->pBt->btsFlags 
17e20 26 3d 20 7e 42 54 53 5f 46 41 53 54 5f 53 45 43  &= ~BTS_FAST_SEC
17e30 55 52 45 3b 0a 20 20 20 20 70 2d 3e 70 42 74 2d  URE;.    p->pBt-
17e40 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
17e50 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 2a 6e  _SECURE_DELETE*n
17e60 65 77 46 6c 61 67 3b 0a 20 20 7d 0a 20 20 62 20  ewFlag;.  }.  b 
17e70 3d 20 28 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c  = (p->pBt->btsFl
17e80 61 67 73 20 26 20 42 54 53 5f 46 41 53 54 5f 53  ags & BTS_FAST_S
17e90 45 43 55 52 45 29 2f 42 54 53 5f 53 45 43 55 52  ECURE)/BTS_SECUR
17ea0 45 5f 44 45 4c 45 54 45 3b 0a 20 20 73 71 6c 69  E_DELETE;.  sqli
17eb0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
17ec0 3b 0a 20 20 72 65 74 75 72 6e 20 62 3b 0a 7d 0a  ;.  return b;.}.
17ed0 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
17ee0 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20  e 'auto-vacuum' 
17ef0 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20  property of the 
17f00 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65  database. If the
17f10 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a   'autoVacuum'.**
17f20 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
17f30 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75 74  n-zero, then aut
17f40 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69 73  o-vacuum mode is
17f50 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65 72   enabled. If zer
17f60 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73 61  o, it.** is disa
17f70 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75 6c  bled. The defaul
17f80 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  t value for the 
17f90 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70  auto-vacuum prop
17fa0 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74 65  erty is .** dete
17fb0 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53 51  rmined by the SQ
17fc0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
17fd0 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a  OVACUUM macro..*
17fe0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
17ff0 65 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28  eeSetAutoVacuum(
18000 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61 75  Btree *p, int au
18010 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66 64 65  toVacuum){.#ifde
18020 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
18030 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72  TOVACUUM.  retur
18040 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
18050 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53 68 61  Y;.#else.  BtSha
18060 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
18070 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
18080 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76  LITE_OK;.  u8 av
18090 20 3d 20 28 75 38 29 61 75 74 6f 56 61 63 75 75   = (u8)autoVacuu
180a0 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  m;..  sqlite3Btr
180b0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66  eeEnter(p);.  if
180c0 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  ( (pBt->btsFlags
180d0 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f   & BTS_PAGESIZE_
180e0 46 49 58 45 44 29 21 3d 30 20 26 26 20 28 61 76  FIXED)!=0 && (av
180f0 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61 75 74   ?1:0)!=pBt->aut
18100 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72  oVacuum ){.    r
18110 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
18120 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  NLY;.  }else{.  
18130 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
18140 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20 20 20  m = av ?1:0;.   
18150 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
18160 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20   = av==2 ?1:0;. 
18170 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
18180 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
18190 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d  urn rc;.#endif.}
181a0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
181b0 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
181c0 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72  'auto-vacuum' pr
181d0 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f 2d  operty. If auto-
181e0 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e  vacuum is .** en
181f0 61 62 6c 65 64 20 31 20 69 73 20 72 65 74 75 72  abled 1 is retur
18200 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 30  ned. Otherwise 0
18210 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
18220 42 74 72 65 65 47 65 74 41 75 74 6f 56 61 63 75  BtreeGetAutoVacu
18230 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23 69  um(Btree *p){.#i
18240 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
18250 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65  _AUTOVACUUM.  re
18260 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f 56  turn BTREE_AUTOV
18270 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73  ACUUM_NONE;.#els
18280 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  e.  int rc;.  sq
18290 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
182a0 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20 20  p);.  rc = (.   
182b0 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56   (!p->pBt->autoV
182c0 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54  acuum)?BTREE_AUT
182d0 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20  OVACUUM_NONE:.  
182e0 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72    (!p->pBt->incr
182f0 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55  Vacuum)?BTREE_AU
18300 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20  TOVACUUM_FULL:. 
18310 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43     BTREE_AUTOVAC
18320 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20  UUM_INCR.  );.  
18330 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
18340 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
18350 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  c;.#endif.}../*.
18360 2a 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 68  ** If the user h
18370 61 73 20 6e 6f 74 20 73 65 74 20 74 68 65 20 73  as not set the s
18380 61 66 65 74 79 2d 6c 65 76 65 6c 20 66 6f 72 20  afety-level for 
18390 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f  this database co
183a0 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 75 73 69 6e  nnection.** usin
183b0 67 20 22 50 52 41 47 4d 41 20 73 79 6e 63 68 72  g "PRAGMA synchr
183c0 6f 6e 6f 75 73 22 2c 20 61 6e 64 20 69 66 20 74  onous", and if t
183d0 68 65 20 73 61 66 65 74 79 2d 6c 65 76 65 6c 20  he safety-level 
183e0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a  is not already.*
183f0 2a 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  * set to the val
18400 75 65 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  ue passed to thi
18410 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 20 74 68  s function as th
18420 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
18430 65 72 2c 0a 2a 2a 20 73 65 74 20 69 74 20 73 6f  er,.** set it so
18440 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
18450 44 45 46 41 55 4c 54 5f 53 59 4e 43 48 52 4f 4e  DEFAULT_SYNCHRON
18460 4f 55 53 21 3d 53 51 4c 49 54 45 5f 44 45 46 41  OUS!=SQLITE_DEFA
18470 55 4c 54 5f 57 41 4c 5f 53 59 4e 43 48 52 4f 4e  ULT_WAL_SYNCHRON
18480 4f 55 53 0a 73 74 61 74 69 63 20 76 6f 69 64 20  OUS.static void 
18490 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63 46 6c  setDefaultSyncFl
184a0 61 67 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ag(BtShared *pBt
184b0 2c 20 75 38 20 73 61 66 65 74 79 5f 6c 65 76 65  , u8 safety_leve
184c0 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  l){.  sqlite3 *d
184d0 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 20 20  b;.  Db *pDb;.  
184e0 69 66 28 20 28 64 62 3d 70 42 74 2d 3e 64 62 29  if( (db=pBt->db)
184f0 21 3d 30 20 26 26 20 28 70 44 62 3d 64 62 2d 3e  !=0 && (pDb=db->
18500 61 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 77  aDb)!=0 ){.    w
18510 68 69 6c 65 28 20 70 44 62 2d 3e 70 42 74 3d 3d  hile( pDb->pBt==
18520 30 20 7c 7c 20 70 44 62 2d 3e 70 42 74 2d 3e 70  0 || pDb->pBt->p
18530 42 74 21 3d 70 42 74 20 29 7b 20 70 44 62 2b 2b  Bt!=pBt ){ pDb++
18540 3b 20 7d 0a 20 20 20 20 69 66 28 20 70 44 62 2d  ; }.    if( pDb-
18550 3e 62 53 79 6e 63 53 65 74 3d 3d 30 20 0a 20 20  >bSyncSet==0 .  
18560 20 20 20 26 26 20 70 44 62 2d 3e 73 61 66 65 74     && pDb->safet
18570 79 5f 6c 65 76 65 6c 21 3d 73 61 66 65 74 79 5f  y_level!=safety_
18580 6c 65 76 65 6c 20 0a 20 20 20 20 20 26 26 20 70  level .     && p
18590 44 62 21 3d 26 64 62 2d 3e 61 44 62 5b 31 5d 20  Db!=&db->aDb[1] 
185a0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 44  .    ){.      pD
185b0 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20  b->safety_level 
185c0 3d 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 3b 0a  = safety_level;.
185d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
185e0 65 72 53 65 74 46 6c 61 67 73 28 70 42 74 2d 3e  erSetFlags(pBt->
185f0 70 50 61 67 65 72 2c 0a 20 20 20 20 20 20 20 20  pPager,.        
18600 20 20 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65    pDb->safety_le
18610 76 65 6c 20 7c 20 28 64 62 2d 3e 66 6c 61 67 73  vel | (db->flags
18620 20 26 20 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d   & PAGER_FLAGS_M
18630 41 53 4b 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ASK));.    }.  }
18640 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
18650 65 20 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63  e setDefaultSync
18660 46 6c 61 67 28 70 42 74 2c 73 61 66 65 74 79 5f  Flag(pBt,safety_
18670 6c 65 76 65 6c 29 0a 23 65 6e 64 69 66 0a 0a 2f  level).#endif../
18680 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72  *.** Get a refer
18690 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f  ence to pPage1 o
186a0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
186b0 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a  ile.  This will.
186c0 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20  ** also acquire 
186d0 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68  a readlock on th
186e0 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53  at file..**.** S
186f0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
18700 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e  rned on success.
18710 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73    If the file is
18720 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66   not a.** well-f
18730 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 66  ormed database f
18740 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  ile, then SQLITE
18750 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65 74 75  _CORRUPT is retu
18760 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f  rned..** SQLITE_
18770 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
18780 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
18790 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c   is locked.  SQL
187a0 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20  ITE_NOMEM.** is 
187b0 72 65 74 75 72 6e 65 64 20 69 66 20 77 65 20 72  returned if we r
187c0 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  un out of memory
187d0 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  . .*/.static int
187e0 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68 61   lockBtree(BtSha
187f0 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74  red *pBt){.  int
18800 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
18810 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
18820 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f   from subfunctio
18830 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ns */.  MemPage 
18840 2a 70 50 61 67 65 31 3b 20 20 20 20 20 2f 2a 20  *pPage1;     /* 
18850 50 61 67 65 20 31 20 6f 66 20 74 68 65 20 64 61  Page 1 of the da
18860 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
18870 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20   int nPage;     
18880 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
18890 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
188a0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e  database */.  in
188b0 74 20 6e 50 61 67 65 46 69 6c 65 20 3d 20 30 3b  t nPageFile = 0;
188c0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
188d0 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
188e0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
188f0 69 6e 74 20 6e 50 61 67 65 48 65 61 64 65 72 3b  int nPageHeader;
18900 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
18910 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
18920 61 74 61 62 61 73 65 20 61 63 63 6f 72 64 69 6e  atabase accordin
18930 67 20 74 6f 20 68 64 72 20 2a 2f 0a 0a 20 20 61  g to hdr */..  a
18940 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
18950 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
18960 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
18970 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d  t( pBt->pPage1==
18980 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  0 );.  rc = sqli
18990 74 65 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f  te3PagerSharedLo
189a0 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  ck(pBt->pPager);
189b0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
189c0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
189d0 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 47 65  ;.  rc = btreeGe
189e0 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70  tPage(pBt, 1, &p
189f0 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69 66 28  Page1, 0);.  if(
18a00 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18a10 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f   return rc;..  /
18a20 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69  * Do some checki
18a30 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75 72  ng to help insur
18a40 65 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f 70  e the file we op
18a50 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a 20  ened really is. 
18a60 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74 61   ** a valid data
18a70 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f  base file. .  */
18a80 0a 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65  .  nPage = nPage
18a90 48 65 61 64 65 72 20 3d 20 67 65 74 34 62 79 74  Header = get4byt
18aa0 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31  e(28+(u8*)pPage1
18ab0 2d 3e 61 44 61 74 61 29 3b 0a 20 20 73 71 6c 69  ->aData);.  sqli
18ac0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
18ad0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  t(pBt->pPager, &
18ae0 6e 50 61 67 65 46 69 6c 65 29 3b 0a 20 20 69 66  nPageFile);.  if
18af0 28 20 6e 50 61 67 65 3d 3d 30 20 7c 7c 20 6d 65  ( nPage==0 || me
18b00 6d 63 6d 70 28 32 34 2b 28 75 38 2a 29 70 50 61  mcmp(24+(u8*)pPa
18b10 67 65 31 2d 3e 61 44 61 74 61 2c 20 39 32 2b 28  ge1->aData, 92+(
18b20 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74  u8*)pPage1->aDat
18b30 61 2c 34 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e  a,4)!=0 ){.    n
18b40 50 61 67 65 20 3d 20 6e 50 61 67 65 46 69 6c 65  Page = nPageFile
18b50 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67  ;.  }.  if( nPag
18b60 65 3e 30 20 29 7b 0a 20 20 20 20 75 33 32 20 70  e>0 ){.    u32 p
18b70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 75 33 32  ageSize;.    u32
18b80 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20   usableSize;.   
18b90 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70 50 61   u8 *page1 = pPa
18ba0 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  ge1->aData;.    
18bb0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41  rc = SQLITE_NOTA
18bc0 44 42 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45  DB;.    /* EVIDE
18bd0 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 37 33 37 2d  NCE-OF: R-43737-
18be0 33 39 39 39 39 20 45 76 65 72 79 20 76 61 6c 69  39999 Every vali
18bf0 64 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  d SQLite databas
18c00 65 20 66 69 6c 65 20 62 65 67 69 6e 73 0a 20 20  e file begins.  
18c10 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 66 6f    ** with the fo
18c20 6c 6c 6f 77 69 6e 67 20 31 36 20 62 79 74 65 73  llowing 16 bytes
18c30 20 28 69 6e 20 68 65 78 29 3a 20 35 33 20 35 31   (in hex): 53 51
18c40 20 34 63 20 36 39 20 37 34 20 36 35 20 32 30 20   4c 69 74 65 20 
18c50 36 36 20 36 66 20 37 32 20 36 64 0a 20 20 20 20  66 6f 72 6d.    
18c60 2a 2a 20 36 31 20 37 34 20 32 30 20 33 33 20 30  ** 61 74 20 33 0
18c70 30 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65  0. */.    if( me
18c80 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61 67  mcmp(page1, zMag
18c90 69 63 48 65 61 64 65 72 2c 20 31 36 29 21 3d 30  icHeader, 16)!=0
18ca0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
18cb0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
18cc0 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  ;.    }..#ifdef 
18cd0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
18ce0 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38      if( page1[18
18cf0 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ]>1 ){.      pBt
18d00 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
18d10 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20  S_READ_ONLY;.   
18d20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31   }.    if( page1
18d30 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20  [19]>1 ){.      
18d40 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
18d50 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 23 65  failed;.    }.#e
18d60 6c 73 65 0a 20 20 20 20 69 66 28 20 70 61 67 65  lse.    if( page
18d70 31 5b 31 38 5d 3e 32 20 29 7b 0a 20 20 20 20 20  1[18]>2 ){.     
18d80 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
18d90 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b  = BTS_READ_ONLY;
18da0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
18db0 61 67 65 31 5b 31 39 5d 3e 32 20 29 7b 0a 20 20  age1[19]>2 ){.  
18dc0 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
18dd0 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
18de0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
18df0 20 77 72 69 74 65 20 76 65 72 73 69 6f 6e 20 69   write version i
18e00 73 20 73 65 74 20 74 6f 20 32 2c 20 74 68 69 73  s set to 2, this
18e10 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64   database should
18e20 20 62 65 20 61 63 63 65 73 73 65 64 0a 20 20 20   be accessed.   
18e30 20 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e   ** in WAL mode.
18e40 20 49 66 20 74 68 65 20 6c 6f 67 20 69 73 20 6e   If the log is n
18e50 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c  ot already open,
18e60 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 54 68   open it now. Th
18e70 65 6e 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72  en .    ** retur
18e80 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20  n SQLITE_OK and 
18e90 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 70  return without p
18ea0 6f 70 75 6c 61 74 69 6e 67 20 42 74 53 68 61 72  opulating BtShar
18eb0 65 64 2e 70 50 61 67 65 31 2e 0a 20 20 20 20 2a  ed.pPage1..    *
18ec0 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 64 65 74  * The caller det
18ed0 65 63 74 73 20 74 68 69 73 20 61 6e 64 20 63 61  ects this and ca
18ee0 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f  lls this functio
18ef0 6e 20 61 67 61 69 6e 2e 20 54 68 69 73 20 69 73  n again. This is
18f00 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65 64  .    ** required
18f10 20 61 73 20 74 68 65 20 76 65 72 73 69 6f 6e 20   as the version 
18f20 6f 66 20 70 61 67 65 20 31 20 63 75 72 72 65 6e  of page 1 curren
18f30 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65 31  tly in the page1
18f40 20 62 75 66 66 65 72 0a 20 20 20 20 2a 2a 20 6d   buffer.    ** m
18f50 61 79 20 6e 6f 74 20 62 65 20 74 68 65 20 6c 61  ay not be the la
18f60 74 65 73 74 20 76 65 72 73 69 6f 6e 20 2d 20 74  test version - t
18f70 68 65 72 65 20 6d 61 79 20 62 65 20 61 20 6e 65  here may be a ne
18f80 77 65 72 20 6f 6e 65 20 69 6e 20 74 68 65 20 6c  wer one in the l
18f90 6f 67 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a  og.    ** file..
18fa0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
18fb0 61 67 65 31 5b 31 39 5d 3d 3d 32 20 26 26 20 28  age1[19]==2 && (
18fc0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
18fd0 42 54 53 5f 4e 4f 5f 57 41 4c 29 3d 3d 30 20 29  BTS_NO_WAL)==0 )
18fe0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4f 70  {.      int isOp
18ff0 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  en = 0;.      rc
19000 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
19010 70 65 6e 57 61 6c 28 70 42 74 2d 3e 70 50 61 67  penWal(pBt->pPag
19020 65 72 2c 20 26 69 73 4f 70 65 6e 29 3b 0a 20 20  er, &isOpen);.  
19030 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
19040 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
19050 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
19060 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d  _failed;.      }
19070 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 65  else{.        se
19080 74 44 65 66 61 75 6c 74 53 79 6e 63 46 6c 61 67  tDefaultSyncFlag
19090 28 70 42 74 2c 20 53 51 4c 49 54 45 5f 44 45 46  (pBt, SQLITE_DEF
190a0 41 55 4c 54 5f 57 41 4c 5f 53 59 4e 43 48 52 4f  AULT_WAL_SYNCHRO
190b0 4e 4f 55 53 2b 31 29 3b 0a 20 20 20 20 20 20 20  NOUS+1);.       
190c0 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d 30 20 29   if( isOpen==0 )
190d0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65  {.          rele
190e0 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
190f0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
19100 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
19110 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
19120 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
19130 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d 65 6c  _NOTADB;.    }el
19140 73 65 7b 0a 20 20 20 20 20 20 73 65 74 44 65 66  se{.      setDef
19150 61 75 6c 74 53 79 6e 63 46 6c 61 67 28 70 42 74  aultSyncFlag(pBt
19160 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
19170 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 2b 31 29 3b  _SYNCHRONOUS+1);
19180 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
19190 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
191a0 46 3a 20 52 2d 31 35 34 36 35 2d 32 30 38 31 33  F: R-15465-20813
191b0 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6e 64   The maximum and
191c0 20 6d 69 6e 69 6d 75 6d 20 65 6d 62 65 64 64 65   minimum embedde
191d0 64 20 70 61 79 6c 6f 61 64 0a 20 20 20 20 2a 2a  d payload.    **
191e0 20 66 72 61 63 74 69 6f 6e 73 20 61 6e 64 20 74   fractions and t
191f0 68 65 20 6c 65 61 66 20 70 61 79 6c 6f 61 64 20  he leaf payload 
19200 66 72 61 63 74 69 6f 6e 20 76 61 6c 75 65 73 20  fraction values 
19210 6d 75 73 74 20 62 65 20 36 34 2c 20 33 32 2c 20  must be 64, 32, 
19220 61 6e 64 20 33 32 2e 0a 20 20 20 20 2a 2a 0a 20  and 32..    **. 
19230 20 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e     ** The origin
19240 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65  al design allowe
19250 64 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20  d these amounts 
19260 74 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73 20  to vary, but as 
19270 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f  of.    ** versio
19280 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75  n 3.6.0, we requ
19290 69 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66  ire them to be f
192a0 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ixed..    */.   
192b0 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67   if( memcmp(&pag
192c0 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34  e1[21], "\100\04
192d0 30 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a  0\040",3)!=0 ){.
192e0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
192f0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
19300 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45    }.    /* EVIDE
19310 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33 2d  NCE-OF: R-51873-
19320 33 39 36 31 38 20 54 68 65 20 70 61 67 65 20 73  39618 The page s
19330 69 7a 65 20 66 6f 72 20 61 20 64 61 74 61 62 61  ize for a databa
19340 73 65 20 66 69 6c 65 20 69 73 0a 20 20 20 20 2a  se file is.    *
19350 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  * determined by 
19360 74 68 65 20 32 2d 62 79 74 65 20 69 6e 74 65 67  the 2-byte integ
19370 65 72 20 6c 6f 63 61 74 65 64 20 61 74 20 61 6e  er located at an
19380 20 6f 66 66 73 65 74 20 6f 66 20 31 36 20 62 79   offset of 16 by
19390 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  tes from.    ** 
193a0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
193b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
193c0 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65 53  le. */.    pageS
193d0 69 7a 65 20 3d 20 28 70 61 67 65 31 5b 31 36 5d  ize = (page1[16]
193e0 3c 3c 38 29 20 7c 20 28 70 61 67 65 31 5b 31 37  <<8) | (page1[17
193f0 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 2f 2a 20 45  ]<<16);.    /* E
19400 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 35  VIDENCE-OF: R-25
19410 30 30 38 2d 32 31 36 38 38 20 54 68 65 20 73 69  008-21688 The si
19420 7a 65 20 6f 66 20 61 20 70 61 67 65 20 69 73 20  ze of a page is 
19430 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 0a 20  a power of two. 
19440 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 35 31     ** between 51
19450 32 20 61 6e 64 20 36 35 35 33 36 20 69 6e 63 6c  2 and 65536 incl
19460 75 73 69 76 65 2e 20 2a 2f 0a 20 20 20 20 69 66  usive. */.    if
19470 28 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26  ( ((pageSize-1)&
19480 70 61 67 65 53 69 7a 65 29 21 3d 30 0a 20 20 20  pageSize)!=0.   
19490 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3e 53 51    || pageSize>SQ
194a0 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
194b0 5a 45 20 0a 20 20 20 20 20 7c 7c 20 70 61 67 65  ZE .     || page
194c0 53 69 7a 65 3c 3d 32 35 36 20 0a 20 20 20 20 29  Size<=256 .    )
194d0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
194e0 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
194f0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
19500 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29  ( (pageSize & 7)
19510 3d 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56  ==0 );.    /* EV
19520 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 33  IDENCE-OF: R-593
19530 31 30 2d 35 31 32 30 35 20 54 68 65 20 22 72 65  10-51205 The "re
19540 73 65 72 76 65 64 20 73 70 61 63 65 22 20 73 69  served space" si
19550 7a 65 20 69 6e 20 74 68 65 20 31 2d 62 79 74 65  ze in the 1-byte
19560 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 20  .    ** integer 
19570 61 74 20 6f 66 66 73 65 74 20 32 30 20 69 73 20  at offset 20 is 
19580 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
19590 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74 20  tes of space at 
195a0 74 68 65 20 65 6e 64 20 6f 66 0a 20 20 20 20 2a  the end of.    *
195b0 2a 20 65 61 63 68 20 70 61 67 65 20 74 6f 20 72  * each page to r
195c0 65 73 65 72 76 65 20 66 6f 72 20 65 78 74 65 6e  eserve for exten
195d0 73 69 6f 6e 73 2e 20 0a 20 20 20 20 2a 2a 0a 20  sions. .    **. 
195e0 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f     ** EVIDENCE-O
195f0 46 3a 20 52 2d 33 37 34 39 37 2d 34 32 34 31 32  F: R-37497-42412
19600 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   The size of the
19610 20 72 65 73 65 72 76 65 64 20 72 65 67 69 6f 6e   reserved region
19620 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72   is.    ** deter
19630 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6f 6e 65  mined by the one
19640 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20 69  -byte unsigned i
19650 6e 74 65 67 65 72 20 66 6f 75 6e 64 20 61 74 20  nteger found at 
19660 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 32 30 0a  an offset of 20.
19670 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20      ** into the 
19680 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65  database file he
19690 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 75 73 61  ader. */.    usa
196a0 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  bleSize = pageSi
196b0 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a  ze - page1[20];.
196c0 20 20 20 20 69 66 28 20 28 75 33 32 29 70 61 67      if( (u32)pag
196d0 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65  eSize!=pBt->page
196e0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Size ){.      /*
196f0 20 41 66 74 65 72 20 72 65 61 64 69 6e 67 20 74   After reading t
19700 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
19710 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73   the database as
19720 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69  suming a page si
19730 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42  ze.      ** of B
19740 74 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65  tShared.pageSize
19750 2c 20 77 65 20 68 61 76 65 20 64 69 73 63 6f 76  , we have discov
19760 65 72 65 64 20 74 68 61 74 20 74 68 65 20 70 61  ered that the pa
19770 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20  ge-size is.     
19780 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67   ** actually pag
19790 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68  eSize. Unlock th
197a0 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76  e database, leav
197b0 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74  e pBt->pPage1 at
197c0 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61  .      ** zero a
197d0 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
197e0 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  _OK. The caller 
197f0 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66  will call this f
19800 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  unction.      **
19810 20 61 67 61 69 6e 20 77 69 74 68 20 74 68 65 20   again with the 
19820 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a  correct page-siz
19830 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
19840 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
19850 61 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74  age1);.      pBt
19860 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75  ->usableSize = u
19870 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20  sableSize;.     
19880 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
19890 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20   pageSize;.     
198a0 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70   freeTempSpace(p
198b0 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Bt);.      rc = 
198c0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
198d0 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
198e0 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
198f0 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ize,.           
19900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19910 20 20 20 20 20 20 20 20 70 61 67 65 53 69 7a 65          pageSize
19920 2d 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  -usableSize);.  
19930 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
19940 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 42     }.    if( (pB
19950 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  t->db->flags & S
19960 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d  QLITE_WriteSchem
19970 61 29 3d 3d 30 20 26 26 20 6e 50 61 67 65 3e 6e  a)==0 && nPage>n
19980 50 61 67 65 46 69 6c 65 20 29 7b 0a 20 20 20 20  PageFile ){.    
19990 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
199a0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
199b0 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
199c0 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
199d0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
199e0 4f 46 3a 20 52 2d 32 38 33 31 32 2d 36 34 37 30  OF: R-28312-6470
199f0 34 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20 75  4 However, the u
19a00 73 61 62 6c 65 20 73 69 7a 65 20 69 73 20 6e 6f  sable size is no
19a10 74 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 20 20 20  t allowed to.   
19a20 20 2a 2a 20 62 65 20 6c 65 73 73 20 74 68 61 6e   ** be less than
19a30 20 34 38 30 2e 20 49 6e 20 6f 74 68 65 72 20 77   480. In other w
19a40 6f 72 64 73 2c 20 69 66 20 74 68 65 20 70 61 67  ords, if the pag
19a50 65 20 73 69 7a 65 20 69 73 20 35 31 32 2c 20 74  e size is 512, t
19a60 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 72  hen the.    ** r
19a70 65 73 65 72 76 65 64 20 73 70 61 63 65 20 73 69  eserved space si
19a80 7a 65 20 63 61 6e 6e 6f 74 20 65 78 63 65 65 64  ze cannot exceed
19a90 20 33 32 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20   32. */.    if( 
19aa0 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30 20 29  usableSize<480 )
19ab0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
19ac0 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
19ad0 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70      }.    pBt->p
19ae0 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
19af0 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61  ze;.    pBt->usa
19b00 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65  bleSize = usable
19b10 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53 51  Size;.#ifndef SQ
19b20 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
19b30 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75  CUUM.    pBt->au
19b40 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  toVacuum = (get4
19b50 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b  byte(&page1[36 +
19b60 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20   4*4])?1:0);.   
19b70 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
19b80 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61   = (get4byte(&pa
19b90 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31  ge1[36 + 7*4])?1
19ba0 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  :0);.#endif.  }.
19bb0 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69  .  /* maxLocal i
19bc0 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d  s the maximum am
19bd0 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
19be0 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79  to store locally
19bf0 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c   for.  ** a cell
19c00 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20  .  Make sure it 
19c10 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20  is small enough 
19c20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73 74  so that at least
19c30 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20   minFanout.  ** 
19c40 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66  cells can will f
19c50 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20  it on one page. 
19c60 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 30 2d   We assume a 10-
19c70 62 79 74 65 20 70 61 67 65 20 68 65 61 64 65 72  byte page header
19c80 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20 74  ..  ** Besides t
19c90 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 20  he payload, the 
19ca0 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a  cell must store:
19cb0 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74 65  .  **     2-byte
19cc0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
19cd0 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d  cell.  **     4-
19ce0 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74  byte child point
19cf0 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62 79  er.  **     9-by
19d00 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20  te nKey value.  
19d10 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e 44  **     4-byte nD
19d20 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20  ata value.  **  
19d30 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c     4-byte overfl
19d40 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 0a  ow page pointer.
19d50 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63    ** So a cell c
19d60 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d 62  onsists of a 2-b
19d70 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61 20 68  yte pointer, a h
19d80 65 61 64 65 72 20 77 68 69 63 68 20 69 73 20 61  eader which is a
19d90 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20 31  s much as.  ** 1
19da0 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20  7 bytes long, 0 
19db0 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70 61  to N bytes of pa
19dc0 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70  yload, and an op
19dd0 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f 76  tional 4 byte ov
19de0 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65  erflow.  ** page
19df0 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20   pointer..  */. 
19e00 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d   pBt->maxLocal =
19e10 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61   (u16)((pBt->usa
19e20 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32  bleSize-12)*64/2
19e30 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d  55 - 23);.  pBt-
19e40 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  >minLocal = (u16
19e50 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  )((pBt->usableSi
19e60 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20  ze-12)*32/255 - 
19e70 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c  23);.  pBt->maxL
19e80 65 61 66 20 3d 20 28 75 31 36 29 28 70 42 74 2d  eaf = (u16)(pBt-
19e90 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33 35  >usableSize - 35
19ea0 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61  );.  pBt->minLea
19eb0 66 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e  f = (u16)((pBt->
19ec0 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33  usableSize-12)*3
19ed0 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 69  2/255 - 23);.  i
19ee0 66 28 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c  f( pBt->maxLocal
19ef0 3e 31 32 37 20 29 7b 0a 20 20 20 20 70 42 74 2d  >127 ){.    pBt-
19f00 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64  >max1bytePayload
19f10 20 3d 20 31 32 37 3b 0a 20 20 7d 65 6c 73 65 7b   = 127;.  }else{
19f20 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62 79  .    pBt->max1by
19f30 74 65 50 61 79 6c 6f 61 64 20 3d 20 28 75 38 29  tePayload = (u8)
19f40 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  pBt->maxLocal;. 
19f50 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74   }.  assert( pBt
19f60 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20 3c  ->maxLeaf + 23 <
19f70 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  = MX_CELL_SIZE(p
19f80 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50  Bt) );.  pBt->pP
19f90 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a 20  age1 = pPage1;. 
19fa0 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50   pBt->nPage = nP
19fb0 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  age;.  return SQ
19fc0 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f  LITE_OK;..page1_
19fd0 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72  init_failed:.  r
19fe0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
19ff0 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65  1);.  pBt->pPage
1a000 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  1 = 0;.  return 
1a010 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e  rc;.}..#ifndef N
1a020 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75  DEBUG./*.** Retu
1a030 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
1a040 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e   cursors open on
1a050 20 70 42 74 2e 20 54 68 69 73 20 69 73 20 66 6f   pBt. This is fo
1a060 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65  r use.** in asse
1a070 72 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e 73  rt() expressions
1a080 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20  , so it is only 
1a090 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45 42  compiled if NDEB
1a0a0 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66  UG is not.** def
1a0b0 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  ined..**.** Only
1a0c0 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61   write cursors a
1a0d0 72 65 20 63 6f 75 6e 74 65 64 20 69 66 20 77 72  re counted if wr
1a0e0 4f 6e 6c 79 20 69 73 20 74 72 75 65 2e 20 20 49  Only is true.  I
1a0f0 66 20 77 72 4f 6e 6c 79 20 69 73 0a 2a 2a 20 66  f wrOnly is.** f
1a100 61 6c 73 65 20 74 68 65 6e 20 61 6c 6c 20 63 75  alse then all cu
1a110 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74 65  rsors are counte
1a120 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  d..**.** For the
1a130 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69   purposes of thi
1a140 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 63 75 72  s routine, a cur
1a150 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73 6f  sor is any curso
1a160 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61 70  r that.** is cap
1a170 61 62 6c 65 20 6f 66 20 72 65 61 64 69 6e 67 20  able of reading 
1a180 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  or writing to th
1a190 65 20 64 61 74 61 62 61 73 65 2e 20 20 43 75 72  e database.  Cur
1a1a0 73 6f 72 73 20 74 68 61 74 0a 2a 2a 20 68 61 76  sors that.** hav
1a1b0 65 20 62 65 65 6e 20 74 72 69 70 70 65 64 20 69  e been tripped i
1a1c0 6e 74 6f 20 74 68 65 20 43 55 52 53 4f 52 5f 46  nto the CURSOR_F
1a1d0 41 55 4c 54 20 73 74 61 74 65 20 61 72 65 20 6e  AULT state are n
1a1e0 6f 74 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a 73  ot counted..*/.s
1a1f0 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 56  tatic int countV
1a200 61 6c 69 64 43 75 72 73 6f 72 73 28 42 74 53 68  alidCursors(BtSh
1a210 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20 77  ared *pBt, int w
1a220 72 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73  rOnly){.  BtCurs
1a230 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20  or *pCur;.  int 
1a240 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 75  r = 0;.  for(pCu
1a250 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  r=pBt->pCursor; 
1a260 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d  pCur; pCur=pCur-
1a270 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
1a280 20 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 28   (wrOnly==0 || (
1a290 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
1a2a0 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29   BTCF_WriteFlag)
1a2b0 21 3d 30 29 0a 20 20 20 20 20 26 26 20 70 43 75  !=0).     && pCu
1a2c0 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
1a2d0 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a  R_FAULT ) r++; .
1a2e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a    }.  return r;.
1a2f0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1a300 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
1a310 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73  outstanding curs
1a320 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65 20 6e  ors and we are n
1a330 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  ot in the middle
1a340 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63  .** of a transac
1a350 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20 69  tion but there i
1a360 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  s a read lock on
1a370 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 74   the database, t
1a380 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  hen.** this rout
1a390 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20 66  ine unrefs the f
1a3a0 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
1a3b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
1a3c0 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68 65  hich .** has the
1a3d0 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65 61   effect of relea
1a3e0 73 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f  sing the read lo
1a3f0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
1a400 72 65 20 69 73 20 61 20 74 72 61 6e 73 61 63 74  re is a transact
1a410 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c  ion in progress,
1a420 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1a430 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
1a440 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42  tic void unlockB
1a450 74 72 65 65 49 66 55 6e 75 73 65 64 28 42 74 53  treeIfUnused(BtS
1a460 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 61  hared *pBt){.  a
1a470 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1a480 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
1a490 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
1a4a0 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72  t( countValidCur
1a4b0 73 6f 72 73 28 70 42 74 2c 30 29 3d 3d 30 20 7c  sors(pBt,0)==0 |
1a4c0 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  | pBt->inTransac
1a4d0 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20  tion>TRANS_NONE 
1a4e0 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e  );.  if( pBt->in
1a4f0 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
1a500 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e  NS_NONE && pBt->
1a510 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20  pPage1!=0 ){.   
1a520 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
1a530 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
1a540 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1a550 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20  e1->aData );.   
1a560 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1a570 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42  PagerRefcount(pB
1a580 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20 29 3b  t->pPager)==1 );
1a590 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31  .    pBt->pPage1
1a5a0 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61 73   = 0;.    releas
1a5b0 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 50 61  ePageNotNull(pPa
1a5c0 67 65 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ge1);.  }.}../*.
1a5d0 2a 2a 20 49 66 20 70 42 74 20 70 6f 69 6e 74 73  ** If pBt points
1a5e0 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 66 69 6c   to an empty fil
1a5f0 65 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20 74  e then convert t
1a600 68 61 74 20 65 6d 70 74 79 20 66 69 6c 65 0a 2a  hat empty file.*
1a610 2a 20 69 6e 74 6f 20 61 20 6e 65 77 20 65 6d 70  * into a new emp
1a620 74 79 20 64 61 74 61 62 61 73 65 20 62 79 20 69  ty database by i
1a630 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20  nitializing the 
1a640 66 69 72 73 74 20 70 61 67 65 20 6f 66 0a 2a 2a  first page of.**
1a650 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
1a660 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77  /.static int new
1a670 44 61 74 61 62 61 73 65 28 42 74 53 68 61 72 65  Database(BtShare
1a680 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61  d *pBt){.  MemPa
1a690 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67  ge *pP1;.  unsig
1a6a0 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a  ned char *data;.
1a6b0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
1a6c0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1a6d0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
1a6e0 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ex) );.  if( pBt
1a6f0 2d 3e 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20  ->nPage>0 ){.   
1a700 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1a710 4b 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 70  K;.  }.  pP1 = p
1a720 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73  Bt->pPage1;.  as
1a730 73 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a  sert( pP1!=0 );.
1a740 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44    data = pP1->aD
1a750 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ata;.  rc = sqli
1a760 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
1a770 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  1->pDbPage);.  i
1a780 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1a790 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61  c;.  memcpy(data
1a7a0 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20  , zMagicHeader, 
1a7b0 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61  sizeof(zMagicHea
1a7c0 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28  der));.  assert(
1a7d0 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65   sizeof(zMagicHe
1a7e0 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 64  ader)==16 );.  d
1a7f0 61 74 61 5b 31 36 5d 20 3d 20 28 75 38 29 28 28  ata[16] = (u8)((
1a800 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 38  pBt->pageSize>>8
1a810 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b  )&0xff);.  data[
1a820 31 37 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d  17] = (u8)((pBt-
1a830 3e 70 61 67 65 53 69 7a 65 3e 3e 31 36 29 26 30  >pageSize>>16)&0
1a840 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d  xff);.  data[18]
1a850 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d   = 1;.  data[19]
1a860 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20   = 1;.  assert( 
1a870 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c  pBt->usableSize<
1a880 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26  =pBt->pageSize &
1a890 26 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  & pBt->usableSiz
1a8a0 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61 67 65  e+255>=pBt->page
1a8b0 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 30  Size);.  data[20
1a8c0 5d 20 3d 20 28 75 38 29 28 70 42 74 2d 3e 70 61  ] = (u8)(pBt->pa
1a8d0 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73  geSize - pBt->us
1a8e0 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64 61 74  ableSize);.  dat
1a8f0 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61  a[21] = 64;.  da
1a900 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64  ta[22] = 32;.  d
1a910 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20  ata[23] = 32;.  
1a920 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34 5d  memset(&data[24]
1a930 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20  , 0, 100-24);.  
1a940 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50 54  zeroPage(pP1, PT
1a950 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41  F_INTKEY|PTF_LEA
1a960 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20 29  F|PTF_LEAFDATA )
1a970 3b 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  ;.  pBt->btsFlag
1a980 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a  s |= BTS_PAGESIZ
1a990 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65 66  E_FIXED;.#ifndef
1a9a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1a9b0 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72 74  OVACUUM.  assert
1a9c0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
1a9d0 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74  m==1 || pBt->aut
1a9e0 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20  oVacuum==0 );.  
1a9f0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 63  assert( pBt->inc
1aa00 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42  rVacuum==1 || pB
1aa10 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30  t->incrVacuum==0
1aa20 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26   );.  put4byte(&
1aa30 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20  data[36 + 4*4], 
1aa40 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
1aa50 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61  ;.  put4byte(&da
1aa60 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42  ta[36 + 7*4], pB
1aa70 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a  t->incrVacuum);.
1aa80 23 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e 6e 50  #endif.  pBt->nP
1aa90 61 67 65 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b  age = 1;.  data[
1aaa0 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  31] = 1;.  retur
1aab0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1aac0 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
1aad0 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
1aae0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1aaf0 66 69 6c 65 20 28 63 72 65 61 74 69 6e 67 20 61  file (creating a
1ab00 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e   database.** con
1ab10 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73 69 6e  sisting of a sin
1ab20 67 6c 65 20 70 61 67 65 20 61 6e 64 20 6e 6f 20  gle page and no 
1ab30 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 73 29 2e  schema objects).
1ab40 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
1ab50 4b 0a 2a 2a 20 69 66 20 73 75 63 63 65 73 73 66  K.** if successf
1ab60 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ul, or an SQLite
1ab70 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65   error code othe
1ab80 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rwise..*/.int sq
1ab90 6c 69 74 65 33 42 74 72 65 65 4e 65 77 44 62 28  lite3BtreeNewDb(
1aba0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
1abb0 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   rc;.  sqlite3Bt
1abc0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
1abd0 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30  ->pBt->nPage = 0
1abe0 3b 0a 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61  ;.  rc = newData
1abf0 62 61 73 65 28 70 2d 3e 70 42 74 29 3b 0a 20 20  base(p->pBt);.  
1ac00 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1ac10 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
1ac20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65  c;.}../*.** Atte
1ac30 6d 70 74 20 74 6f 20 73 74 61 72 74 20 61 20 6e  mpt to start a n
1ac40 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ew transaction. 
1ac50 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
1ac60 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74 65  ion.** is starte
1ac70 64 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20  d if the second 
1ac80 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a  argument is nonz
1ac90 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 61  ero, otherwise a
1aca0 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61   read-.** transa
1acb0 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73  ction.  If the s
1acc0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
1acd0 73 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20  s 2 or more and 
1ace0 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61  exclusive.** tra
1acf0 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72  nsaction is star
1ad00 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61  ted, meaning tha
1ad10 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65  t no other proce
1ad20 73 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a  ss is allowed.**
1ad30 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
1ad40 61 74 61 62 61 73 65 2e 20 20 41 20 70 72 65 65  atabase.  A pree
1ad50 78 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63 74  xisting transact
1ad60 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a  ion may not be.*
1ad70 2a 20 75 70 67 72 61 64 65 64 20 74 6f 20 65 78  * upgraded to ex
1ad80 63 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c 69  clusive by calli
1ad90 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
1ada0 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20  a second time - 
1adb0 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69  the.** exclusivi
1adc0 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72  ty flag only wor
1add0 6b 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72 61  ks for a new tra
1ade0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
1adf0 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
1ae00 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61 72  ion must be star
1ae10 74 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d  ted before attem
1ae20 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68  pting any .** ch
1ae30 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  anges to the dat
1ae40 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20  abase.  None of 
1ae50 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  the following ro
1ae60 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20  utines .** will 
1ae70 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74 72  work unless a tr
1ae80 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61  ansaction is sta
1ae90 72 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a  rted first:.**.*
1aea0 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
1aeb0 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 29  reeCreateTable()
1aec0 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
1aed0 42 74 72 65 65 43 72 65 61 74 65 49 6e 64 65 78  BtreeCreateIndex
1aee0 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
1aef0 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c  e3BtreeClearTabl
1af00 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
1af10 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c  te3BtreeDropTabl
1af20 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
1af30 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 29  te3BtreeInsert()
1af40 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
1af50 42 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a  BtreeDelete().**
1af60 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1af70 65 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a 2a  eeUpdateMeta().*
1af80 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74 69  *.** If an initi
1af90 61 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63  al attempt to ac
1afa0 71 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20 66  quire the lock f
1afb0 61 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66 20  ails because of 
1afc0 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a  lock contention.
1afd0 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ** and the datab
1afe0 61 73 65 20 77 61 73 20 70 72 65 76 69 6f 75 73  ase was previous
1aff0 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65  ly unlocked, the
1b000 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  n invoke the bus
1b010 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20  y handler.** if 
1b020 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 42  there is one.  B
1b030 75 74 20 69 66 20 74 68 65 72 65 20 77 61 73 20  ut if there was 
1b040 70 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65 61  previously a rea
1b050 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a  d-lock, do not.*
1b060 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  * invoke the bus
1b070 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74  y handler - just
1b080 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
1b090 55 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55 53  USY.  SQLITE_BUS
1b0a0 59 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65  Y is .** returne
1b0b0 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
1b0c0 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c  already a read-l
1b0d0 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ock in order to 
1b0e0 61 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63 6b  avoid a deadlock
1b0f0 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20  ..**.** Suppose 
1b100 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 72  there are two pr
1b110 6f 63 65 73 73 65 73 20 41 20 61 6e 64 20 42 2e  ocesses A and B.
1b120 20 20 41 20 68 61 73 20 61 20 72 65 61 64 20 6c    A has a read l
1b130 6f 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a  ock and B has.**
1b140 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b   a reserved lock
1b150 2e 20 20 42 20 74 72 69 65 73 20 74 6f 20 70 72  .  B tries to pr
1b160 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73 69  omote to exclusi
1b170 76 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65  ve but is blocke
1b180 64 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20  d because.** of 
1b190 41 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20  A's read lock.  
1b1a0 41 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f  A tries to promo
1b1b0 74 65 20 74 6f 20 72 65 73 65 72 76 65 64 20 62  te to reserved b
1b1c0 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 79  ut is blocked by
1b1d0 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68   B..** One or th
1b1e0 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 74  e other of the t
1b1f0 77 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75 73  wo processes mus
1b200 74 20 67 69 76 65 20 77 61 79 20 6f 72 20 74 68  t give way or th
1b210 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f  ere can be.** no
1b220 20 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20 72   progress.  By r
1b230 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f  eturning SQLITE_
1b240 42 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76  BUSY and not inv
1b250 6f 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20 63  oking the busy c
1b260 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20  allback.** when 
1b270 41 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20  A already has a 
1b280 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e  read lock, we en
1b290 63 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69 76  courage A to giv
1b2a0 65 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a  e up and let B.*
1b2b0 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e  * proceed..*/.in
1b2c0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  t sqlite3BtreeBe
1b2d0 67 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a  ginTrans(Btree *
1b2e0 70 2c 20 69 6e 74 20 77 72 66 6c 61 67 29 7b 0a  p, int wrflag){.
1b2f0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1b300 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  = p->pBt;.  int 
1b310 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1b320 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1b330 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65  nter(p);.  btree
1b340 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20  Integrity(p);.. 
1b350 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65 65   /* If the btree
1b360 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61   is already in a
1b370 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
1b380 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69  on, or it.  ** i
1b390 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 72  s already in a r
1b3a0 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
1b3b0 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e 73  and a read-trans
1b3c0 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72  action.  ** is r
1b3d0 65 71 75 65 73 74 65 64 2c 20 74 68 69 73 20 69  equested, this i
1b3e0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a  s a no-op..  */.
1b3f0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
1b400 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c  ==TRANS_WRITE ||
1b410 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52   (p->inTrans==TR
1b420 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72 66  ANS_READ && !wrf
1b430 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  lag) ){.    goto
1b440 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20   trans_begun;.  
1b450 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  }.  assert( pBt-
1b460 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
1b470 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 49  TRANS_WRITE || I
1b480 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e  fNotOmitAV(pBt->
1b490 62 44 6f 54 72 75 6e 63 61 74 65 29 3d 3d 30 20  bDoTruncate)==0 
1b4a0 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74  );..  /* Write t
1b4b0 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20  ransactions are 
1b4c0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20  not possible on 
1b4d0 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61  a read-only data
1b4e0 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 28 70  base */.  if( (p
1b4f0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
1b500 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30  TS_READ_ONLY)!=0
1b510 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20   && wrflag ){.  
1b520 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
1b530 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f  ADONLY;.    goto
1b540 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20   trans_begun;.  
1b550 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1b560 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
1b570 43 48 45 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69  CHE.  {.    sqli
1b580 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b  te3 *pBlock = 0;
1b590 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68  .    /* If anoth
1b5a0 65 72 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  er database hand
1b5b0 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f  le has already o
1b5c0 70 65 6e 65 64 20 61 20 77 72 69 74 65 20 74 72  pened a write tr
1b5d0 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20 20 2a  ansaction .    *
1b5e0 2a 20 6f 6e 20 74 68 69 73 20 73 68 61 72 65 64  * on this shared
1b5f0 2d 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65  -btree structure
1b600 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 77 72   and a second wr
1b610 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
1b620 69 73 0a 20 20 20 20 2a 2a 20 72 65 71 75 65 73  is.    ** reques
1b630 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ted, return SQLI
1b640 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20 20 20 2a  TE_LOCKED..    *
1b650 2f 0a 20 20 20 20 69 66 28 20 28 77 72 66 6c 61  /.    if( (wrfla
1b660 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e  g && pBt->inTran
1b670 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
1b680 52 49 54 45 29 0a 20 20 20 20 20 7c 7c 20 28 70  RITE).     || (p
1b690 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
1b6a0 54 53 5f 50 45 4e 44 49 4e 47 29 21 3d 30 0a 20  TS_PENDING)!=0. 
1b6b0 20 20 20 29 7b 0a 20 20 20 20 20 20 70 42 6c 6f     ){.      pBlo
1b6c0 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72 69 74 65  ck = pBt->pWrite
1b6d0 72 2d 3e 64 62 3b 0a 20 20 20 20 7d 65 6c 73 65  r->db;.    }else
1b6e0 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29 7b   if( wrflag>1 ){
1b6f0 0a 20 20 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70  .      BtLock *p
1b700 49 74 65 72 3b 0a 20 20 20 20 20 20 66 6f 72 28  Iter;.      for(
1b710 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pIter=pBt->pLock
1b720 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70  ; pIter; pIter=p
1b730 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Iter->pNext){.  
1b740 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
1b750 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a 20 20  >pBtree!=p ){.  
1b760 20 20 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d          pBlock =
1b770 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e   pIter->pBtree->
1b780 64 62 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  db;.          br
1b790 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
1b7a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1b7b0 20 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a 20   if( pBlock ){. 
1b7c0 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e       sqlite3Conn
1b7d0 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d  ectionBlocked(p-
1b7e0 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20  >db, pBlock);.  
1b7f0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1b800 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43  LOCKED_SHAREDCAC
1b810 48 45 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 74  HE;.      goto t
1b820 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 20 20  rans_begun;.    
1b830 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
1b840 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f 6e 6c 79  /* Any read-only
1b850 20 6f 72 20 72 65 61 64 2d 77 72 69 74 65 20 74   or read-write t
1b860 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d 70 6c 69  ransaction impli
1b870 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  es a read-lock o
1b880 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20 31 2e 20  n .  ** page 1. 
1b890 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  So if some other
1b8a0 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 63 6c   shared-cache cl
1b8b0 69 65 6e 74 20 61 6c 72 65 61 64 79 20 68 61 73  ient already has
1b8c0 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 0a 20   a write-lock . 
1b8d0 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31 2c 20 74   ** on page 1, t
1b8e0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
1b8f0 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2e  annot be opened.
1b900 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65 72 79   */.  rc = query
1b910 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
1b920 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52  Lock(p, MASTER_R
1b930 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b  OOT, READ_LOCK);
1b940 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
1b950 21 3d 72 63 20 29 20 67 6f 74 6f 20 74 72 61 6e  !=rc ) goto tran
1b960 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 70 42 74 2d  s_begun;..  pBt-
1b970 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54  >btsFlags &= ~BT
1b980 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54  S_INITIALLY_EMPT
1b990 59 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50  Y;.  if( pBt->nP
1b9a0 61 67 65 3d 3d 30 20 29 20 70 42 74 2d 3e 62 74  age==0 ) pBt->bt
1b9b0 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 49 4e  sFlags |= BTS_IN
1b9c0 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20  ITIALLY_EMPTY;. 
1b9d0 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61 6c   do {.    /* Cal
1b9e0 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 75 6e  l lockBtree() un
1b9f0 74 69 6c 20 65 69 74 68 65 72 20 70 42 74 2d 3e  til either pBt->
1ba00 70 50 61 67 65 31 20 69 73 20 70 6f 70 75 6c 61  pPage1 is popula
1ba10 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f  ted or.    ** lo
1ba20 63 6b 42 74 72 65 65 28 29 20 72 65 74 75 72 6e  ckBtree() return
1ba30 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65  s something othe
1ba40 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b  r than SQLITE_OK
1ba50 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20 20  . lockBtree().  
1ba60 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e 20    ** may return 
1ba70 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65  SQLITE_OK but le
1ba80 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ave pBt->pPage1 
1ba90 73 65 74 20 74 6f 20 30 20 69 66 20 61 66 74 65  set to 0 if afte
1baa0 72 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67  r.    ** reading
1bab0 20 70 61 67 65 20 31 20 69 74 20 64 69 73 63 6f   page 1 it disco
1bac0 76 65 72 73 20 74 68 61 74 20 74 68 65 20 70 61  vers that the pa
1bad0 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 64  ge-size of the d
1bae0 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20  atabase .    ** 
1baf0 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 42 74 2d  file is not pBt-
1bb00 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e 20 74 68  >pageSize. In th
1bb10 69 73 20 63 61 73 65 20 6c 6f 63 6b 42 74 72 65  is case lockBtre
1bb20 65 28 29 20 77 69 6c 6c 20 75 70 64 61 74 65 0a  e() will update.
1bb30 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67 65      ** pBt->page
1bb40 53 69 7a 65 20 74 6f 20 74 68 65 20 70 61 67 65  Size to the page
1bb50 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c  -size of the fil
1bb60 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20 2a  e on disk..    *
1bb70 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 42 74  /.    while( pBt
1bb80 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26 26 20 53  ->pPage1==0 && S
1bb90 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20  QLITE_OK==(rc = 
1bba0 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29 29 20  lockBtree(pBt)) 
1bbb0 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  );..    if( rc==
1bbc0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66  SQLITE_OK && wrf
1bbd0 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28  lag ){.      if(
1bbe0 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
1bbf0 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29  & BTS_READ_ONLY)
1bc00 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !=0 ){.        r
1bc10 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
1bc20 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  NLY;.      }else
1bc30 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
1bc40 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e  qlite3PagerBegin
1bc50 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 77 72 66  (pBt->pPager,wrf
1bc60 6c 61 67 3e 31 2c 73 71 6c 69 74 65 33 54 65 6d  lag>1,sqlite3Tem
1bc70 70 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29  pInMemory(p->db)
1bc80 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1bc90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1bca0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e            rc = n
1bcb0 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b  ewDatabase(pBt);
1bcc0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1bcd0 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
1bce0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1bcf0 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63  K ){.      unloc
1bd00 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
1bd10 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68  Bt);.    }.  }wh
1bd20 69 6c 65 28 20 28 72 63 26 30 78 46 46 29 3d 3d  ile( (rc&0xFF)==
1bd30 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70  SQLITE_BUSY && p
1bd40 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1bd50 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26  n==TRANS_NONE &&
1bd60 0a 20 20 20 20 20 20 20 20 20 20 62 74 72 65 65  .          btree
1bd70 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
1bd80 72 28 70 42 74 29 20 29 3b 0a 0a 20 20 69 66 28  r(pBt) );..  if(
1bd90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1bda0 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54  {.    if( p->inT
1bdb0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans==TRANS_NONE
1bdc0 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e   ){.      pBt->n
1bdd0 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23  Transaction++;.#
1bde0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1bdf0 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
1be00 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61        if( p->sha
1be10 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  rable ){.       
1be20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b   assert( p->lock
1be30 2e 70 42 74 72 65 65 3d 3d 70 20 26 26 20 70 2d  .pBtree==p && p-
1be40 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d 31 20  >lock.iTable==1 
1be50 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f  );.        p->lo
1be60 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f  ck.eLock = READ_
1be70 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 2d  LOCK;.        p-
1be80 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20 70 42  >lock.pNext = pB
1be90 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20  t->pLock;.      
1bea0 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26    pBt->pLock = &
1beb0 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d  p->lock;.      }
1bec0 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
1bed0 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28    p->inTrans = (
1bee0 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49  wrflag?TRANS_WRI
1bef0 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a  TE:TRANS_READ);.
1bf00 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61      if( p->inTra
1bf10 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  ns>pBt->inTransa
1bf20 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70  ction ){.      p
1bf30 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1bf40 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a  n = p->inTrans;.
1bf50 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 77 72      }.    if( wr
1bf60 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 4d 65  flag ){.      Me
1bf70 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20  mPage *pPage1 = 
1bf80 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 23 69 66  pBt->pPage1;.#if
1bf90 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1bfa0 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
1bfb0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
1bfc0 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20 20  ->pWriter );.   
1bfd0 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20     pBt->pWriter 
1bfe0 3d 20 70 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  = p;.      pBt->
1bff0 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53  btsFlags &= ~BTS
1c000 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
1c010 20 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29    if( wrflag>1 )
1c020 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
1c030 3d 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b  = BTS_EXCLUSIVE;
1c040 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f  .#endif..      /
1c050 2a 20 49 66 20 74 68 65 20 64 62 2d 73 69 7a 65  * If the db-size
1c060 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 69 73   header field is
1c070 20 69 6e 63 6f 72 72 65 63 74 20 28 61 73 20 69   incorrect (as i
1c080 74 20 6d 61 79 20 62 65 20 69 66 20 61 6e 20 6f  t may be if an o
1c090 6c 64 0a 20 20 20 20 20 20 2a 2a 20 63 6c 69 65  ld.      ** clie
1c0a0 6e 74 20 68 61 73 20 62 65 65 6e 20 77 72 69 74  nt has been writ
1c0b0 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1c0c0 20 66 69 6c 65 29 2c 20 75 70 64 61 74 65 20 69   file), update i
1c0d0 74 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20 20 20  t now. Doing.   
1c0e0 20 20 20 2a 2a 20 74 68 69 73 20 73 6f 6f 6e 65     ** this soone
1c0f0 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61  r rather than la
1c100 74 65 72 20 6d 65 61 6e 73 20 74 68 65 20 64 61  ter means the da
1c110 74 61 62 61 73 65 20 73 69 7a 65 20 63 61 6e 20  tabase size can 
1c120 73 61 66 65 6c 79 20 0a 20 20 20 20 20 20 2a 2a  safely .      **
1c130 20 72 65 2d 72 65 61 64 20 74 68 65 20 64 61 74   re-read the dat
1c140 61 62 61 73 65 20 73 69 7a 65 20 66 72 6f 6d 20  abase size from 
1c150 70 61 67 65 20 31 20 69 66 20 61 20 73 61 76 65  page 1 if a save
1c160 70 6f 69 6e 74 20 6f 72 20 74 72 61 6e 73 61 63  point or transac
1c170 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72 6f  tion.      ** ro
1c180 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 77 69  llback occurs wi
1c190 74 68 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63  thin the transac
1c1a0 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
1c1b0 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50       if( pBt->nP
1c1c0 61 67 65 21 3d 67 65 74 34 62 79 74 65 28 26 70  age!=get4byte(&p
1c1d0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d  Page1->aData[28]
1c1e0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
1c1f0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1c200 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ite(pPage1->pDbP
1c210 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
1c220 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1c230 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  ){.          put
1c240 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
1c250 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e  Data[28], pBt->n
1c260 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Page);.        }
1c270 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1c280 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e   }...trans_begun
1c290 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  :.  if( rc==SQLI
1c2a0 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20  TE_OK && wrflag 
1c2b0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63  ){.    /* This c
1c2c0 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65 20 74  all makes sure t
1c2d0 68 61 74 20 74 68 65 20 70 61 67 65 72 20 68 61  hat the pager ha
1c2e0 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75  s the correct nu
1c2f0 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 6f  mber of.    ** o
1c300 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20  pen savepoints. 
1c310 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  If the second pa
1c320 72 61 6d 65 74 65 72 20 69 73 20 67 72 65 61 74  rameter is great
1c330 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a 20 20  er than 0 and.  
1c340 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75    ** the sub-jou
1c350 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65  rnal is not alre
1c360 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69  ady open, then i
1c370 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64  t will be opened
1c380 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   here..    */.  
1c390 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1c3a0 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74  gerOpenSavepoint
1c3b0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d  (pBt->pPager, p-
1c3c0 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29  >db->nSavepoint)
1c3d0 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e  ;.  }..  btreeIn
1c3e0 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71  tegrity(p);.  sq
1c3f0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1c400 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
1c410 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
1c420 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1c430 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  UM../*.** Set th
1c440 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
1c450 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68  tries for all ch
1c460 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70  ildren of page p
1c470 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a  Page. Also, if.*
1c480 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  * pPage contains
1c490 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e   cells that poin
1c4a0 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  t to overflow pa
1c4b0 67 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69  ges, set the poi
1c4c0 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72  nter.** map entr
1c4d0 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72  ies for the over
1c4e0 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77 65  flow pages as we
1c4f0 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ll..*/.static in
1c500 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  t setChildPtrmap
1c510 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  s(MemPage *pPage
1c520 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
1c530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c540 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74          /* Count
1c550 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  er variable */. 
1c560 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20   int nCell;     
1c570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c580 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1c590 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70   cells in page p
1c5a0 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  Page */.  int rc
1c5b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c5d0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
1c5e0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1c5f0 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50   pPage->pBt;.  P
1c600 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65  gno pgno = pPage
1c610 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72  ->pgno;..  asser
1c620 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1c630 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
1c640 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
1c650 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74   = pPage->isInit
1c660 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 62   ? SQLITE_OK : b
1c670 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
1c680 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ge);.  if( rc!=S
1c690 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
1c6a0 6e 20 72 63 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20  n rc;.  nCell = 
1c6b0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20  pPage->nCell;.. 
1c6c0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
1c6d0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20  l; i++){.    u8 
1c6e0 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c  *pCell = findCel
1c6f0 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20  l(pPage, i);..  
1c700 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50    ptrmapPutOvflP
1c710 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
1c720 20 26 72 63 29 3b 0a 0a 20 20 20 20 69 66 28 20   &rc);..    if( 
1c730 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
1c740 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64        Pgno child
1c750 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
1c760 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70 74  pCell);.      pt
1c770 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69  rmapPut(pBt, chi
1c780 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  ldPgno, PTRMAP_B
1c790 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29  TREE, pgno, &rc)
1c7a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
1c7b0 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
1c7c0 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c  ){.    Pgno chil
1c7d0 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  dPgno = get4byte
1c7e0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
1c7f0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
1c800 38 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50  8]);.    ptrmapP
1c810 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e  ut(pBt, childPgn
1c820 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
1c830 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 7d   pgno, &rc);.  }
1c840 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1c850 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72  ../*.** Somewher
1c860 65 20 6f 6e 20 70 50 61 67 65 20 69 73 20 61 20  e on pPage is a 
1c870 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20  pointer to page 
1c880 69 46 72 6f 6d 2e 20 20 4d 6f 64 69 66 79 20 74  iFrom.  Modify t
1c890 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 0a 2a  his pointer so.*
1c8a0 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  * that it points
1c8b0 20 74 6f 20 69 54 6f 2e 20 50 61 72 61 6d 65 74   to iTo. Paramet
1c8c0 65 72 20 65 54 79 70 65 20 64 65 73 63 72 69 62  er eType describ
1c8d0 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 70  es the type of p
1c8e0 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 62 65 20  ointer to.** be 
1c8f0 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 20 66 6f  modified, as  fo
1c900 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52  llows:.**.** PTR
1c910 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20 70  MAP_BTREE:     p
1c920 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d  Page is a btree-
1c930 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
1c940 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63 68  r points at a ch
1c950 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ild .**         
1c960 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20 6f            page o
1c970 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50  f pPage..**.** P
1c980 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a  TRMAP_OVERFLOW1:
1c990 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65   pPage is a btre
1c9a0 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  e-page. The poin
1c9b0 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e  ter points at an
1c9c0 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20   overflow.**    
1c9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1c9e0 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  age pointed to b
1c9f0 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65 6c  y one of the cel
1ca00 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a  ls on pPage..**.
1ca10 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ** PTRMAP_OVERFL
1ca20 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20 61 6e  OW2: pPage is an
1ca30 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20   overflow-page. 
1ca40 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  The pointer poin
1ca50 74 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a 2a  ts at the next.*
1ca60 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1ca70 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67      overflow pag
1ca80 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a  e in the list..*
1ca90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 64  /.static int mod
1caa0 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 4d  ifyPagePointer(M
1cab0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 50  emPage *pPage, P
1cac0 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20  gno iFrom, Pgno 
1cad0 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b 0a  iTo, u8 eType){.
1cae0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1caf0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
1cb00 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
1cb10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
1cb20 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
1cb30 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
1cb40 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 65 54  age) );.  if( eT
1cb50 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
1cb60 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20  FLOW2 ){.    /* 
1cb70 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61  The pointer is a
1cb80 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20  lways the first 
1cb90 34 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 70  4 bytes of the p
1cba0 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  age in this case
1cbb0 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65  .  */.    if( ge
1cbc0 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
1cbd0 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20  ata)!=iFrom ){. 
1cbe0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1cbf0 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28  TE_CORRUPT_PGNO(
1cc00 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
1cc10 20 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74 65    }.    put4byte
1cc20 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69  (pPage->aData, i
1cc30 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  To);.  }else{.  
1cc40 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74    int i;.    int
1cc50 20 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 74 20   nCell;.    int 
1cc60 72 63 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 50  rc;..    rc = pP
1cc70 61 67 65 2d 3e 69 73 49 6e 69 74 20 3f 20 53 51  age->isInit ? SQ
1cc80 4c 49 54 45 5f 4f 4b 20 3a 20 62 74 72 65 65 49  LITE_OK : btreeI
1cc90 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  nitPage(pPage);.
1cca0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
1ccb0 75 72 6e 20 72 63 3b 0a 20 20 20 20 6e 43 65 6c  urn rc;.    nCel
1ccc0 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
1ccd0 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ;..    for(i=0; 
1cce0 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
1ccf0 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d       u8 *pCell =
1cd00 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
1cd10 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65   i);.      if( e
1cd20 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
1cd30 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20 20  RFLOW1 ){.      
1cd40 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
1cd50 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e  .        pPage->
1cd60 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
1cd70 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
1cd80 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 66  .        if( inf
1cd90 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f 2e 6e 50  o.nLocal<info.nP
1cda0 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 20 20  ayload ){.      
1cdb0 20 20 20 20 69 66 28 20 70 43 65 6c 6c 2b 69 6e      if( pCell+in
1cdc0 66 6f 2e 6e 53 69 7a 65 20 3e 20 70 50 61 67 65  fo.nSize > pPage
1cdd0 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e 70  ->aData+pPage->p
1cde0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
1cdf0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
1ce00 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1ce10 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e  UPT_PGNO(pPage->
1ce20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  pgno);.         
1ce30 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
1ce40 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65   iFrom==get4byte
1ce50 28 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a  (pCell+info.nSiz
1ce60 65 2d 34 29 20 29 7b 0a 20 20 20 20 20 20 20 20  e-4) ){.        
1ce70 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65      put4byte(pCe
1ce80 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34 2c  ll+info.nSize-4,
1ce90 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20   iTo);.         
1cea0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1ceb0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1cec0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1ced0 20 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74       if( get4byt
1cee0 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20  e(pCell)==iFrom 
1cef0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  ){.          put
1cf00 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f  4byte(pCell, iTo
1cf10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
1cf20 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
1cf30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
1cf40 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20     if( i==nCell 
1cf50 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  ){.      if( eTy
1cf60 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45 45  pe!=PTRMAP_BTREE
1cf70 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 67   || .          g
1cf80 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
1cf90 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
1cfa0 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f  Offset+8])!=iFro
1cfb0 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  m ){.        ret
1cfc0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1cfd0 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70  PT_PGNO(pPage->p
1cfe0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  gno);.      }.  
1cff0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
1d000 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
1d010 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20  ->hdrOffset+8], 
1d020 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  iTo);.    }.  }.
1d030 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d040 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  OK;.}.../*.** Mo
1d050 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  ve the open data
1d060 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67  base page pDbPag
1d070 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46  e to location iF
1d080 72 65 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a  reePage in the .
1d090 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 65  ** database. The
1d0a0 20 70 44 62 50 61 67 65 20 72 65 66 65 72 65 6e   pDbPage referen
1d0b0 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64  ce remains valid
1d0c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 43 6f  ..**.** The isCo
1d0d0 6d 6d 69 74 20 66 6c 61 67 20 69 6e 64 69 63 61  mmit flag indica
1d0e0 74 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69  tes that there i
1d0f0 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d  s no need to rem
1d100 65 6d 62 65 72 20 74 68 61 74 0a 2a 2a 20 74 68  ember that.** th
1d110 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20  e journal needs 
1d120 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20 62  to be sync()ed b
1d130 65 66 6f 72 65 20 64 61 74 61 62 61 73 65 20 70  efore database p
1d140 61 67 65 20 70 44 62 50 61 67 65 2d 3e 70 67 6e  age pDbPage->pgn
1d150 6f 20 0a 2a 2a 20 63 61 6e 20 62 65 20 77 72 69  o .** can be wri
1d160 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c  tten to. The cal
1d170 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ler has already 
1d180 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20  promised not to 
1d190 77 72 69 74 65 20 74 6f 20 74 68 61 74 0a 2a 2a  write to that.**
1d1a0 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
1d1b0 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67   int relocatePag
1d1c0 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
1d1d0 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Bt,           /*
1d1e0 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50   Btree */.  MemP
1d1f0 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20  age *pDbPage,   
1d200 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67       /* Open pag
1d210 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75  e to move */.  u
1d220 38 20 65 54 79 70 65 2c 20 20 20 20 20 20 20 20  8 eType,        
1d230 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
1d240 65 72 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e  er map 'type' en
1d250 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20  try for pDbPage 
1d260 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61  */.  Pgno iPtrPa
1d270 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ge,           /*
1d280 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61   Pointer map 'pa
1d290 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72  ge-no' entry for
1d2a0 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67   pDbPage */.  Pg
1d2b0 6e 6f 20 69 46 72 65 65 50 61 67 65 2c 20 20 20  no iFreePage,   
1d2c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f         /* The lo
1d2d0 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70  cation to move p
1d2e0 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69  DbPage to */.  i
1d2f0 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20 20  nt isCommit     
1d300 20 20 20 20 20 20 20 20 2f 2a 20 69 73 43 6f 6d          /* isCom
1d310 6d 69 74 20 66 6c 61 67 20 70 61 73 73 65 64 20  mit flag passed 
1d320 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  to sqlite3PagerM
1d330 6f 76 65 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20  ovepage */.){.  
1d340 4d 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67  MemPage *pPtrPag
1d350 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  e;   /* The page
1d360 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61   that contains a
1d370 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50   pointer to pDbP
1d380 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44  age */.  Pgno iD
1d390 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d  bPage = pDbPage-
1d3a0 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a  >pgno;.  Pager *
1d3b0 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50  pPager = pBt->pP
1d3c0 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  ager;.  int rc;.
1d3d0 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65  .  assert( eType
1d3e0 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
1d3f0 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  W2 || eType==PTR
1d400 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c  MAP_OVERFLOW1 ||
1d410 20 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50   .      eType==P
1d420 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65  TRMAP_BTREE || e
1d430 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
1d440 54 50 41 47 45 20 29 3b 0a 20 20 61 73 73 65 72  TPAGE );.  asser
1d450 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1d460 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
1d470 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
1d480 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74  DbPage->pBt==pBt
1d490 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70   );..  /* Move p
1d4a0 61 67 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d  age iDbPage from
1d4b0 20 69 74 73 20 63 75 72 72 65 6e 74 20 6c 6f 63   its current loc
1d4c0 61 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75  ation to page nu
1d4d0 6d 62 65 72 20 69 46 72 65 65 50 61 67 65 20 2a  mber iFreePage *
1d4e0 2f 0a 20 20 54 52 41 43 45 28 28 22 41 55 54 4f  /.  TRACE(("AUTO
1d4f0 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25  VACUUM: Moving %
1d500 64 20 74 6f 20 66 72 65 65 20 70 61 67 65 20 25  d to free page %
1d510 64 20 28 70 74 72 20 70 61 67 65 20 25 64 20 74  d (ptr page %d t
1d520 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20  ype %d)\n", .   
1d530 20 20 20 69 44 62 50 61 67 65 2c 20 69 46 72 65     iDbPage, iFre
1d540 65 50 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c  ePage, iPtrPage,
1d550 20 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d   eType));.  rc =
1d560 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76   sqlite3PagerMov
1d570 65 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 44  epage(pPager, pD
1d580 62 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c 20  bPage->pDbPage, 
1d590 69 46 72 65 65 50 61 67 65 2c 20 69 73 43 6f 6d  iFreePage, isCom
1d5a0 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  mit);.  if( rc!=
1d5b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d5c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1d5d0 20 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20    pDbPage->pgno 
1d5e0 3d 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20 20  = iFreePage;..  
1d5f0 2f 2a 20 49 66 20 70 44 62 50 61 67 65 20 77 61  /* If pDbPage wa
1d600 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c 20  s a btree-page, 
1d610 74 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76 65  then it may have
1d620 20 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e 64   child pages and
1d630 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74  /or cells.  ** t
1d640 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65  hat point to ove
1d650 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65  rflow pages. The
1d660 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
1d670 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65  ries for all the
1d680 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e 65  se.  ** pages ne
1d690 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64  ed to be changed
1d6a0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70  ..  **.  ** If p
1d6b0 44 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65  DbPage is an ove
1d6c0 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e  rflow page, then
1d6d0 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74   the first 4 byt
1d6e0 65 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a 20  es may store a. 
1d6f0 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61   ** pointer to a
1d700 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72   subsequent over
1d710 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74 68  flow page. If th
1d720 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  is is the case, 
1d730 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f  then.  ** the po
1d740 69 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73 20  inter map needs 
1d750 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 66 6f  to be updated fo
1d760 72 20 74 68 65 20 73 75 62 73 65 71 75 65 6e 74  r the subsequent
1d770 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a   overflow page..
1d780 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65    */.  if( eType
1d790 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c  ==PTRMAP_BTREE |
1d7a0 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
1d7b0 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
1d7c0 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72  rc = setChildPtr
1d7d0 6d 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a 20  maps(pDbPage);. 
1d7e0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1d7f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1d800 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1d810 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f   }else{.    Pgno
1d820 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74 34   nextOvfl = get4
1d830 62 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61 44  byte(pDbPage->aD
1d840 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 65  ata);.    if( ne
1d850 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20  xtOvfl!=0 ){.   
1d860 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
1d870 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d  , nextOvfl, PTRM
1d880 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46  AP_OVERFLOW2, iF
1d890 72 65 65 50 61 67 65 2c 20 26 72 63 29 3b 0a 20  reePage, &rc);. 
1d8a0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1d8b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1d8c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1d8d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1d8e0 20 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61 74    /* Fix the dat
1d8f0 61 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e  abase pointer on
1d900 20 70 61 67 65 20 69 50 74 72 50 61 67 65 20 74   page iPtrPage t
1d910 68 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20 69  hat pointed at i
1d920 44 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74  DbPage so.  ** t
1d930 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61 74  hat it points at
1d940 20 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73 6f   iFreePage. Also
1d950 20 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72   fix the pointer
1d960 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20   map entry for. 
1d970 20 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20 20   ** iPtrPage..  
1d980 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d  */.  if( eType!=
1d990 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
1d9a0 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  ){.    rc = btre
1d9b0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50  eGetPage(pBt, iP
1d9c0 74 72 50 61 67 65 2c 20 26 70 50 74 72 50 61 67  trPage, &pPtrPag
1d9d0 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  e, 0);.    if( r
1d9e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1d9f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1da00 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
1da10 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1da20 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62 50  e(pPtrPage->pDbP
1da30 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
1da40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1da50 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1da60 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20  (pPtrPage);.    
1da70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1da80 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64 69   }.    rc = modi
1da90 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70 50  fyPagePointer(pP
1daa0 74 72 50 61 67 65 2c 20 69 44 62 50 61 67 65 2c  trPage, iDbPage,
1dab0 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70   iFreePage, eTyp
1dac0 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  e);.    releaseP
1dad0 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20  age(pPtrPage);. 
1dae0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1daf0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 74  E_OK ){.      pt
1db00 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46 72  rmapPut(pBt, iFr
1db10 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69  eePage, eType, i
1db20 50 74 72 50 61 67 65 2c 20 26 72 63 29 3b 0a 20  PtrPage, &rc);. 
1db30 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1db40 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  n rc;.}../* Forw
1db50 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  ard declaration 
1db60 72 65 71 75 69 72 65 64 20 62 79 20 69 6e 63 72  required by incr
1db70 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f  VacuumStep(). */
1db80 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
1db90 63 61 74 65 42 74 72 65 65 50 61 67 65 28 42 74  cateBtreePage(Bt
1dba0 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67  Shared *, MemPag
1dbb0 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67  e **, Pgno *, Pg
1dbc0 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20  no, u8);../*.** 
1dbd0 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65  Perform a single
1dbe0 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63 72   step of an incr
1dbf0 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20  emental-vacuum. 
1dc00 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72  If successful, r
1dc10 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  eturn.** SQLITE_
1dc20 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  OK. If there is 
1dc30 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61  no work to do (a
1dc40 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 20  nd therefore no 
1dc50 70 6f 69 6e 74 20 69 6e 20 0a 2a 2a 20 63 61 6c  point in .** cal
1dc60 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  ling this functi
1dc70 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75 72  on again), retur
1dc80 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 4f  n SQLITE_DONE. O
1dc90 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 0a  r, if an error .
1dca0 2a 2a 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  ** occurs, retur
1dcb0 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72  n some other err
1dcc0 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4d  or code..**.** M
1dcd0 6f 72 65 20 73 70 65 63 69 66 69 63 61 6c 6c 79  ore specifically
1dce0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
1dcf0 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f  attempts to re-o
1dd00 72 67 61 6e 69 7a 65 20 74 68 65 20 64 61 74 61  rganize the data
1dd10 62 61 73 65 20 73 6f 20 0a 2a 2a 20 74 68 61 74  base so .** that
1dd20 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 6f   the last page o
1dd30 66 20 74 68 65 20 66 69 6c 65 20 63 75 72 72 65  f the file curre
1dd40 6e 74 6c 79 20 69 6e 20 75 73 65 20 69 73 20 6e  ntly in use is n
1dd50 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e  o longer in use.
1dd60 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  .**.** Parameter
1dd70 20 6e 46 69 6e 20 69 73 20 74 68 65 20 6e 75 6d   nFin is the num
1dd80 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61  ber of pages tha
1dd90 74 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  t this database 
1dda0 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a  would contain.**
1ddb0 20 77 65 72 65 20 74 68 69 73 20 66 75 6e 63 74   were this funct
1ddc0 69 6f 6e 20 63 61 6c 6c 65 64 20 75 6e 74 69 6c  ion called until
1ddd0 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49   it returns SQLI
1dde0 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 49  TE_DONE..**.** I
1ddf0 66 20 74 68 65 20 62 43 6f 6d 6d 69 74 20 70 61  f the bCommit pa
1de00 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a  rameter is non-z
1de10 65 72 6f 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ero, this functi
1de20 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  on assumes that 
1de30 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 77  the .** caller w
1de40 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67  ill keep calling
1de50 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
1de60 29 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75 72  ) until it retur
1de70 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 0a  ns SQLITE_DONE .
1de80 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 2e 20  ** or an error. 
1de90 62 43 6f 6d 6d 69 74 20 69 73 20 70 61 73 73 65  bCommit is passe
1dea0 64 20 74 72 75 65 20 66 6f 72 20 61 6e 20 61 75  d true for an au
1deb0 74 6f 2d 76 61 63 75 75 6d 2d 6f 6e 2d 63 6f 6d  to-vacuum-on-com
1dec0 6d 69 74 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  mit .** operatio
1ded0 6e 2c 20 6f 72 20 66 61 6c 73 65 20 66 6f 72 20  n, or false for 
1dee0 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  an incremental v
1def0 61 63 75 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63  acuum..*/.static
1df00 20 69 6e 74 20 69 6e 63 72 56 61 63 75 75 6d 53   int incrVacuumS
1df10 74 65 70 28 42 74 53 68 61 72 65 64 20 2a 70 42  tep(BtShared *pB
1df20 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67  t, Pgno nFin, Pg
1df30 6e 6f 20 69 4c 61 73 74 50 67 2c 20 69 6e 74 20  no iLastPg, int 
1df40 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 6e 6f  bCommit){.  Pgno
1df50 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20 20   nFreeList;     
1df60 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1df70 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c 20 6f  of pages still o
1df80 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  n the free-list 
1df90 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  */.  int rc;..  
1dfa0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1dfb0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
1dfc0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
1dfd0 72 74 28 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e  rt( iLastPg>nFin
1dfe0 20 29 3b 0a 0a 20 20 69 66 28 20 21 50 54 52 4d   );..  if( !PTRM
1dff0 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
1e000 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61 73 74  LastPg) && iLast
1e010 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  Pg!=PENDING_BYTE
1e020 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
1e030 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20    u8 eType;.    
1e040 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a  Pgno iPtrPage;..
1e050 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d 20      nFreeList = 
1e060 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  get4byte(&pBt->p
1e070 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
1e080 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65  );.    if( nFree
1e090 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  List==0 ){.     
1e0a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
1e0b0 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ONE;.    }..    
1e0c0 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
1e0d0 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65 54  Bt, iLastPg, &eT
1e0e0 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b  ype, &iPtrPage);
1e0f0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1e100 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1e110 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1e120 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d  .    if( eType==
1e130 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
1e140 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1e150 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1e160 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  KPT;.    }..    
1e170 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
1e180 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20  P_FREEPAGE ){.  
1e190 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d      if( bCommit=
1e1a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
1e1b0 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65   Remove the page
1e1c0 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20   from the files 
1e1d0 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20  free-list. This 
1e1e0 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a  is not required.
1e1f0 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 62 43          ** if bC
1e200 6f 6d 6d 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72  ommit is non-zer
1e210 6f 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  o. In that case,
1e220 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 77   the free-list w
1e230 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a  ill be.        *
1e240 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a  * truncated to z
1e250 65 72 6f 20 61 66 74 65 72 20 74 68 69 73 20 66  ero after this f
1e260 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c  unction returns,
1e270 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 0a   so it doesn't .
1e280 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 74 74 65          ** matte
1e290 72 20 69 66 20 69 74 20 73 74 69 6c 6c 20 63 6f  r if it still co
1e2a0 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67 61 72 62  ntains some garb
1e2b0 61 67 65 20 65 6e 74 72 69 65 73 2e 0a 20 20 20  age entries..   
1e2c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1e2d0 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20 20  Pgno iFreePg;.  
1e2e0 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
1e2f0 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20  FreePg;.        
1e300 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
1e310 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72  eePage(pBt, &pFr
1e320 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20  eePg, &iFreePg, 
1e330 69 4c 61 73 74 50 67 2c 20 42 54 41 4c 4c 4f 43  iLastPg, BTALLOC
1e340 5f 45 58 41 43 54 29 3b 0a 20 20 20 20 20 20 20  _EXACT);.       
1e350 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1e360 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1e370 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1e380 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
1e390 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69 4c  ert( iFreePg==iL
1e3a0 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 20  astPg );.       
1e3b0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72   releasePage(pFr
1e3c0 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  eePg);.      }. 
1e3d0 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
1e3e0 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 20    Pgno iFreePg; 
1e3f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1e400 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70 61 67  ndex of free pag
1e410 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50  e to move pLastP
1e420 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65  g to */.      Me
1e430 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a  mPage *pLastPg;.
1e440 20 20 20 20 20 20 75 38 20 65 4d 6f 64 65 20 3d        u8 eMode =
1e450 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 3b 20 20 20   BTALLOC_ANY;   
1e460 2f 2a 20 4d 6f 64 65 20 70 61 72 61 6d 65 74 65  /* Mode paramete
1e470 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74  r for allocateBt
1e480 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 20 20 20  reePage() */.   
1e490 20 20 20 50 67 6e 6f 20 69 4e 65 61 72 20 3d 20     Pgno iNear = 
1e4a0 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
1e4b0 6e 65 61 72 62 79 20 70 61 72 61 6d 65 74 65 72  nearby parameter
1e4c0 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72   for allocateBtr
1e4d0 65 65 50 61 67 65 28 29 20 2a 2f 0a 0a 20 20 20  eePage() */..   
1e4e0 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
1e4f0 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50  Page(pBt, iLastP
1e500 67 2c 20 26 70 4c 61 73 74 50 67 2c 20 30 29 3b  g, &pLastPg, 0);
1e510 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1e520 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1e530 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1e540 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
1e550 20 49 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 7a   If bCommit is z
1e560 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72  ero, this loop r
1e570 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63 65  uns exactly once
1e580 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74 50   and page pLastP
1e590 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 77  g.      ** is sw
1e5a0 61 70 70 65 64 20 77 69 74 68 20 74 68 65 20 66  apped with the f
1e5b0 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20 70  irst free page p
1e5c0 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66 72  ulled off the fr
1e5d0 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a  ee list..      *
1e5e0 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68  *.      ** On th
1e5f0 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66  e other hand, if
1e600 20 62 43 6f 6d 6d 69 74 20 69 73 20 67 72 65 61   bCommit is grea
1e610 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ter than zero, t
1e620 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20 20 2a  hen keep.      *
1e630 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20  * looping until 
1e640 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f 63 61  a free-page loca
1e650 74 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 66  ted within the f
1e660 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65 73 0a  irst nFin pages.
1e670 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
1e680 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20  file is found.. 
1e690 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
1e6a0 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a  ( bCommit==0 ){.
1e6b0 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20          eMode = 
1e6c0 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a 20 20 20 20  BTALLOC_LE;.    
1e6d0 20 20 20 20 69 4e 65 61 72 20 3d 20 6e 46 69 6e      iNear = nFin
1e6e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1e6f0 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d  do {.        Mem
1e700 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20  Page *pFreePg;. 
1e710 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f         rc = allo
1e720 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
1e730 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46  t, &pFreePg, &iF
1e740 72 65 65 50 67 2c 20 69 4e 65 61 72 2c 20 65 4d  reePg, iNear, eM
1e750 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ode);.        if
1e760 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1e770 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c  ){.          rel
1e780 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50 67  easePage(pLastPg
1e790 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
1e7a0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
1e7b0 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  }.        releas
1e7c0 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a  ePage(pFreePg);.
1e7d0 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 62 43        }while( bC
1e7e0 6f 6d 6d 69 74 20 26 26 20 69 46 72 65 65 50 67  ommit && iFreePg
1e7f0 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20 20 61  >nFin );.      a
1e800 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3c 69  ssert( iFreePg<i
1e810 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20  LastPg );.      
1e820 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f  .      rc = relo
1e830 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c  catePage(pBt, pL
1e840 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50  astPg, eType, iP
1e850 74 72 50 61 67 65 2c 20 69 46 72 65 65 50 67 2c  trPage, iFreePg,
1e860 20 62 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20   bCommit);.     
1e870 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61   releasePage(pLa
1e880 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  stPg);.      if(
1e890 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1e8a0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1e8b0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
1e8c0 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 43   }.  }..  if( bC
1e8d0 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ommit==0 ){.    
1e8e0 64 6f 20 7b 0a 20 20 20 20 20 20 69 4c 61 73 74  do {.      iLast
1e8f0 50 67 2d 2d 3b 0a 20 20 20 20 7d 77 68 69 6c 65  Pg--;.    }while
1e900 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44 49  ( iLastPg==PENDI
1e910 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
1e920 29 20 7c 7c 20 50 54 52 4d 41 50 5f 49 53 50 41  ) || PTRMAP_ISPA
1e930 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29  GE(pBt, iLastPg)
1e940 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 62 44 6f   );.    pBt->bDo
1e950 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20  Truncate = 1;.  
1e960 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 69    pBt->nPage = i
1e970 4c 61 73 74 50 67 3b 0a 20 20 7d 0a 20 20 72 65  LastPg;.  }.  re
1e980 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1e990 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 61 74  }../*.** The dat
1e9a0 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20  abase opened by 
1e9b0 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
1e9c0 6e 74 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61  nt is an auto-va
1e9d0 63 75 75 6d 20 64 61 74 61 62 61 73 65 0a 2a 2a  cuum database.**
1e9e0 20 6e 4f 72 69 67 20 70 61 67 65 73 20 69 6e 20   nOrig pages in 
1e9f0 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  size containing 
1ea00 6e 46 72 65 65 20 66 72 65 65 20 70 61 67 65 73  nFree free pages
1ea10 2e 20 52 65 74 75 72 6e 20 74 68 65 20 65 78 70  . Return the exp
1ea20 65 63 74 65 64 20 0a 2a 2a 20 73 69 7a 65 20 6f  ected .** size o
1ea30 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
1ea40 6e 20 70 61 67 65 73 20 66 6f 6c 6c 6f 77 69 6e  n pages followin
1ea50 67 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  g an auto-vacuum
1ea60 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73   operation..*/.s
1ea70 74 61 74 69 63 20 50 67 6e 6f 20 66 69 6e 61 6c  tatic Pgno final
1ea80 44 62 53 69 7a 65 28 42 74 53 68 61 72 65 64 20  DbSize(BtShared 
1ea90 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 4f 72 69 67  *pBt, Pgno nOrig
1eaa0 2c 20 50 67 6e 6f 20 6e 46 72 65 65 29 7b 0a 20  , Pgno nFree){. 
1eab0 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20 20 20   int nEntry;    
1eac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ead0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
1eae0 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20 70 74 72  tries on one ptr
1eaf0 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 50 67  map page */.  Pg
1eb00 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20 20 20 20  no nPtrmap;     
1eb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1eb20 20 4e 75 6d 62 65 72 20 6f 66 20 50 74 72 4d 61   Number of PtrMa
1eb30 70 20 70 61 67 65 73 20 74 6f 20 62 65 20 66 72  p pages to be fr
1eb40 65 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46  eed */.  Pgno nF
1eb50 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  in;             
1eb60 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1eb70 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 6e  rn value */..  n
1eb80 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e 75 73 61  Entry = pBt->usa
1eb90 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20 6e 50 74  bleSize/5;.  nPt
1eba0 72 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f  rmap = (nFree-nO
1ebb0 72 69 67 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e  rig+PTRMAP_PAGEN
1ebc0 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b 6e 45  O(pBt, nOrig)+nE
1ebd0 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b 0a 20 20  ntry)/nEntry;.  
1ebe0 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e  nFin = nOrig - n
1ebf0 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a  Free - nPtrmap;.
1ec00 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44    if( nOrig>PEND
1ec10 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1ec20 74 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e 44 49  t) && nFin<PENDI
1ec30 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
1ec40 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b  ) ){.    nFin--;
1ec50 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 50 54  .  }.  while( PT
1ec60 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
1ec70 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d   nFin) || nFin==
1ec80 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1ec90 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e 46  E(pBt) ){.    nF
1eca0 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  in--;.  }..  ret
1ecb0 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a 0a  urn nFin;.}../*.
1ecc0 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73  ** A write-trans
1ecd0 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f  action must be o
1ece0 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61 6c  pened before cal
1ecf0 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  ling this functi
1ed00 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72  on..** It perfor
1ed10 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 74  ms a single unit
1ed20 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64 73   of work towards
1ed30 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
1ed40 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66  vacuum..**.** If
1ed50 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c   the incremental
1ed60 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69 73   vacuum is finis
1ed70 68 65 64 20 61 66 74 65 72 20 74 68 69 73 20 66  hed after this f
1ed80 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c  unction has run,
1ed90 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  .** SQLITE_DONE 
1eda0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
1edb0 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73 68  it is not finish
1edc0 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  ed, but no error
1edd0 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51   occurred,.** SQ
1ede0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1edf0 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 61  ned. Otherwise a
1ee00 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
1ee10 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ode. .*/.int sql
1ee20 69 74 65 33 42 74 72 65 65 49 6e 63 72 56 61 63  ite3BtreeIncrVac
1ee30 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  uum(Btree *p){. 
1ee40 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
1ee50 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
1ee60 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  t;..  sqlite3Btr
1ee70 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73  eeEnter(p);.  as
1ee80 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
1ee90 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
1eea0 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54 72  WRITE && p->inTr
1eeb0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1eec0 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e   );.  if( !pBt->
1eed0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
1eee0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
1eef0 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  NE;.  }else{.   
1ef00 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 62 74   Pgno nOrig = bt
1ef10 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
1ef20 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65  );.    Pgno nFre
1ef30 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42  e = get4byte(&pB
1ef40 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1ef50 5b 33 36 5d 29 3b 0a 20 20 20 20 50 67 6e 6f 20  [36]);.    Pgno 
1ef60 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69  nFin = finalDbSi
1ef70 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e  ze(pBt, nOrig, n
1ef80 46 72 65 65 29 3b 0a 0a 20 20 20 20 69 66 28 20  Free);..    if( 
1ef90 6e 4f 72 69 67 3c 6e 46 69 6e 20 29 7b 0a 20 20  nOrig<nFin ){.  
1efa0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1efb0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1efc0 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 72 65    }else if( nFre
1efd0 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  e>0 ){.      rc 
1efe0 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  = saveAllCursors
1eff0 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  (pBt, 0, 0);.   
1f000 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1f010 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1f020 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
1f030 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b  rflowCache(pBt);
1f040 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 69 6e  .        rc = in
1f050 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74  crVacuumStep(pBt
1f060 2c 20 6e 46 69 6e 2c 20 6e 4f 72 69 67 2c 20 30  , nFin, nOrig, 0
1f070 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1f080 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1f090 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
1f0a0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1f0b0 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31  rite(pBt->pPage1
1f0c0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1f0d0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42      put4byte(&pB
1f0e0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1f0f0 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65  [28], pBt->nPage
1f100 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1f110 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
1f120 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
1f130 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
1f140 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1f150 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1f160 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1f170 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72 69  ne is called pri
1f180 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  or to sqlite3Pag
1f190 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20  erCommit when a 
1f1a0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
1f1b0 73 20 63 6f 6d 6d 69 74 74 65 64 20 66 6f 72 20  s committed for 
1f1c0 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
1f1d0 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  atabase..**.** I
1f1e0 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  f SQLITE_OK is r
1f1f0 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70  eturned, then *p
1f200 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f  nTrunc is set to
1f210 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
1f220 61 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61  ages.** the data
1f230 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64  base file should
1f240 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f   be truncated to
1f250 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d   during the comm
1f260 69 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20  it process. .** 
1f270 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61 73  i.e. the databas
1f280 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67  e has been reorg
1f290 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f  anized so that o
1f2a0 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a 70  nly the first *p
1f2b0 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20  nTrunc.** pages 
1f2c0 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73  are in use..*/.s
1f2d0 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61  tatic int autoVa
1f2e0 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61  cuumCommit(BtSha
1f2f0 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74  red *pBt){.  int
1f300 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1f310 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1f320 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a   = pBt->pPager;.
1f330 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20    VVA_ONLY( int 
1f340 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61  nRef = sqlite3Pa
1f350 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67  gerRefcount(pPag
1f360 65 72 29 3b 20 29 0a 0a 20 20 61 73 73 65 72 74  er); )..  assert
1f370 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1f380 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
1f390 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65   );.  invalidate
1f3a0 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
1f3b0 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74 28  (pBt);.  assert(
1f3c0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
1f3d0 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69 6e  ;.  if( !pBt->in
1f3e0 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  crVacuum ){.    
1f3f0 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20  Pgno nFin;      
1f400 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1f410 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73  pages in databas
1f420 65 20 61 66 74 65 72 20 61 75 74 6f 76 61 63 75  e after autovacu
1f430 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20 50 67 6e  uming */.    Pgn
1f440 6f 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  o nFree;        
1f450 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
1f460 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
1f470 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a  st initially */.
1f480 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 3b 20      Pgno iFree; 
1f490 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65         /* The ne
1f4a0 78 74 20 70 61 67 65 20 74 6f 20 62 65 20 66 72  xt page to be fr
1f4b0 65 65 64 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  eed */.    Pgno 
1f4c0 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 2f 2a  nOrig;        /*
1f4d0 20 44 61 74 61 62 61 73 65 20 73 69 7a 65 20 62   Database size b
1f4e0 65 66 6f 72 65 20 66 72 65 65 69 6e 67 20 2a 2f  efore freeing */
1f4f0 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d 20 62 74  ..    nOrig = bt
1f500 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
1f510 29 3b 0a 20 20 20 20 69 66 28 20 50 54 52 4d 41  );.    if( PTRMA
1f520 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 4f  P_ISPAGE(pBt, nO
1f530 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50  rig) || nOrig==P
1f540 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
1f550 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  (pBt) ){.      /
1f560 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  * It is not poss
1f570 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 61  ible to create a
1f580 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 77 68   database for wh
1f590 69 63 68 20 74 68 65 20 66 69 6e 61 6c 20 70 61  ich the final pa
1f5a0 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65  ge.      ** is e
1f5b0 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72 2d  ither a pointer-
1f5c0 6d 61 70 20 70 61 67 65 20 6f 72 20 74 68 65 20  map page or the 
1f5d0 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61 67  pending-byte pag
1f5e0 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20 20 20  e. If one.      
1f5f0 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  ** is encountere
1f600 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65  d, this indicate
1f610 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  s corruption..  
1f620 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74      */.      ret
1f630 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1f640 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a  PT_BKPT;.    }..
1f650 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34      nFree = get4
1f660 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
1f670 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
1f680 20 20 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44     nFin = finalD
1f690 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67  bSize(pBt, nOrig
1f6a0 2c 20 6e 46 72 65 65 29 3b 0a 20 20 20 20 69 66  , nFree);.    if
1f6b0 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20 72  ( nFin>nOrig ) r
1f6c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1f6d0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 69  RUPT_BKPT;.    i
1f6e0 66 28 20 6e 46 69 6e 3c 6e 4f 72 69 67 20 29 7b  f( nFin<nOrig ){
1f6f0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65  .      rc = save
1f700 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
1f710 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, 0);.    }.   
1f720 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69 67   for(iFree=nOrig
1f730 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20 26 26 20  ; iFree>nFin && 
1f740 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
1f750 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20 72  Free--){.      r
1f760 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74  c = incrVacuumSt
1f770 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69 46  ep(pBt, nFin, iF
1f780 72 65 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  ree, 1);.    }. 
1f790 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49     if( (rc==SQLI
1f7a0 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53  TE_DONE || rc==S
1f7b0 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46 72  QLITE_OK) && nFr
1f7c0 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63  ee>0 ){.      rc
1f7d0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1f7e0 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31  rite(pBt->pPage1
1f7f0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1f800 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d    put4byte(&pBt-
1f810 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
1f820 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75  2], 0);.      pu
1f830 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
1f840 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20  ge1->aData[36], 
1f850 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  0);.      put4by
1f860 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
1f870 3e 61 44 61 74 61 5b 32 38 5d 2c 20 6e 46 69 6e  >aData[28], nFin
1f880 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 44  );.      pBt->bD
1f890 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20  oTruncate = 1;. 
1f8a0 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20       pBt->nPage 
1f8b0 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a 20 20  = nFin;.    }.  
1f8c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1f8d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
1f8e0 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
1f8f0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  k(pPager);.    }
1f900 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
1f910 6e 52 65 66 3e 3d 73 71 6c 69 74 65 33 50 61 67  nRef>=sqlite3Pag
1f920 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65  erRefcount(pPage
1f930 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  r) );.  return r
1f940 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69  c;.}..#else /* i
1f950 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1f960 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a  T_AUTOVACUUM */.
1f970 23 20 64 65 66 69 6e 65 20 73 65 74 43 68 69 6c  # define setChil
1f980 64 50 74 72 6d 61 70 73 28 78 29 20 53 51 4c 49  dPtrmaps(x) SQLI
1f990 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  TE_OK.#endif../*
1f9a0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1f9b0 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20   does the first 
1f9c0 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70  phase of a two-p
1f9d0 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68  hase commit.  Th
1f9e0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61  is routine.** ca
1f9f0 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20  uses a rollback 
1fa00 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72  journal to be cr
1fa10 65 61 74 65 64 20 28 69 66 20 69 74 20 64 6f 65  eated (if it doe
1fa20 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78  s not already ex
1fa30 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75  ist).** and popu
1fa40 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67  lated with enoug
1fa50 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f  h information so
1fa60 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72   that if a power
1fa70 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20   loss occurs.** 
1fa80 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e  the database can
1fa90 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20   be restored to 
1faa0 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61  its original sta
1fab0 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61  te by playing ba
1fac0 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  ck.** the journa
1fad0 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e  l.  Then the con
1fae0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75  tents of the jou
1faf0 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64  rnal are flushed
1fb00 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64   out to.** the d
1fb10 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20  isk.  After the 
1fb20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c  journal is safel
1fb30 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20  y on oxide, the 
1fb40 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a  changes to the.*
1fb50 2a 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77  * database are w
1fb60 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
1fb70 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
1fb80 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69  d flushed to oxi
1fb90 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e  de..** At the en
1fba0 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20  d of this call, 
1fbb0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
1fbc0 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74  rnal still exist
1fbd0 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b  s on the.** disk
1fbe0 20 61 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c   and we are stil
1fbf0 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f  l holding all lo
1fc00 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e  cks, so the tran
1fc10 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a  saction has not.
1fc20 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53  ** committed.  S
1fc30 65 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ee sqlite3BtreeC
1fc40 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
1fc50 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20 70  for the second p
1fc60 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63  hase of the.** c
1fc70 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a  ommit process..*
1fc80 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 69  *.** This call i
1fc90 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20  s a no-op if no 
1fca0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
1fcb0 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61  n is currently a
1fcc0 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a  ctive on pBt..**
1fcd0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73  .** Otherwise, s
1fce0 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
1fcf0 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62 74   file for the bt
1fd00 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65 72  ree pBt. zMaster
1fd10 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68   points to.** th
1fd20 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74  e name of a mast
1fd30 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
1fd40 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77  that should be w
1fd50 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a  ritten into the.
1fd60 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f  ** individual jo
1fd70 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69  urnal file, or i
1fd80 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69  s NULL, indicati
1fd90 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  ng no master jou
1fda0 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73  rnal file .** (s
1fdb0 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74  ingle database t
1fdc0 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a  ransaction)..**.
1fdd0 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20  ** When this is 
1fde0 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73 74  called, the mast
1fdf0 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c  er journal shoul
1fe00 64 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 62  d already have b
1fe10 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20  een.** created, 
1fe20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74  populated with t
1fe30 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  his journal poin
1fe40 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20 74  ter and synced t
1fe50 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  o disk..**.** On
1fe60 63 65 20 74 68 69 73 20 69 73 20 72 6f 75 74 69  ce this is routi
1fe70 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65 64 2c  ne has returned,
1fe80 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20   the only thing 
1fe90 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d  required to comm
1fea0 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65 2d  it.** the write-
1feb0 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20  transaction for 
1fec0 74 68 69 73 20 64 61 74 61 62 61 73 65 20 66 69  this database fi
1fed0 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20  le is to delete 
1fee0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a  the journal..*/.
1fef0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1ff00 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 42  CommitPhaseOne(B
1ff10 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  tree *p, const c
1ff20 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20  har *zMaster){. 
1ff30 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1ff40 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e  _OK;.  if( p->in
1ff50 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
1ff60 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72  TE ){.    BtShar
1ff70 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
1ff80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
1ff90 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 6e  eeEnter(p);.#ifn
1ffa0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1ffb0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
1ffc0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
1ffd0 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  um ){.      rc =
1ffe0 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69   autoVacuumCommi
1fff0 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66  t(pBt);.      if
20000 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
20010 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
20020 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
20030 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
20040 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
20050 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 62  }.    if( pBt->b
20060 44 6f 54 72 75 6e 63 61 74 65 20 29 7b 0a 20 20  DoTruncate ){.  
20070 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
20080 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42  TruncateImage(pB
20090 74 2d 3e 70 50 61 67 65 72 2c 20 70 42 74 2d 3e  t->pPager, pBt->
200a0 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65  nPage);.    }.#e
200b0 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71  ndif.    rc = sq
200c0 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
200d0 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50  PhaseOne(pBt->pP
200e0 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30  ager, zMaster, 0
200f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
20100 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d  reeLeave(p);.  }
20110 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
20120 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
20130 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66  tion is called f
20140 72 6f 6d 20 62 6f 74 68 20 42 74 72 65 65 43 6f  rom both BtreeCo
20150 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 61  mmitPhaseTwo() a
20160 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  nd BtreeRollback
20170 28 29 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e  ().** at the con
20180 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74 72 61  clusion of a tra
20190 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nsaction..*/.sta
201a0 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 45 6e  tic void btreeEn
201b0 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 42 74 72  dTransaction(Btr
201c0 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
201d0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
201e0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
201f0 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  = p->db;.  asser
20200 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
20210 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
20220 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
20230 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
20240 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61    pBt->bDoTrunca
20250 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  te = 0;.#endif. 
20260 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e   if( p->inTrans>
20270 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 64 62  TRANS_NONE && db
20280 2d 3e 6e 56 64 62 65 52 65 61 64 3e 31 20 29 7b  ->nVdbeRead>1 ){
20290 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
202a0 20 61 72 65 20 6f 74 68 65 72 20 61 63 74 69 76   are other activ
202b0 65 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61  e statements tha
202c0 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68 69 73  t belong to this
202d0 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
202e0 20 68 61 6e 64 6c 65 2c 20 64 6f 77 6e 67 72 61   handle, downgra
202f0 64 65 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c  de to a read-onl
20300 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  y transaction. T
20310 68 65 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65  he other stateme
20320 6e 74 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 73  nts.    ** may s
20330 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20  till be reading 
20340 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
20350 65 2e 20 20 2a 2f 0a 20 20 20 20 64 6f 77 6e 67  e.  */.    downg
20360 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63  radeAllSharedCac
20370 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b  heTableLocks(p);
20380 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  .    p->inTrans 
20390 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
203a0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
203b0 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 64 20   the handle had 
203c0 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e  any kind of tran
203d0 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65  saction open, de
203e0 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 20  crement the .   
203f0 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
20400 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73 68 61  count of the sha
20410 72 65 64 20 62 74 72 65 65 2e 20 49 66 20 74 68  red btree. If th
20420 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
20430 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65 61 63  unt .    ** reac
20440 68 65 73 20 30 2c 20 73 65 74 20 74 68 65 20 73  hes 0, set the s
20450 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54  hared state to T
20460 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75  RANS_NONE. The u
20470 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
20480 65 64 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  ed().    ** call
20490 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f   below will unlo
204a0 63 6b 20 74 68 65 20 70 61 67 65 72 2e 20 20 2a  ck the pager.  *
204b0 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54  /.    if( p->inT
204c0 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans!=TRANS_NONE
204d0 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72 41   ){.      clearA
204e0 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62  llSharedCacheTab
204f0 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20  leLocks(p);.    
20500 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74    pBt->nTransact
20510 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28  ion--;.      if(
20520 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61   0==pBt->nTransa
20530 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20  ction ){.       
20540 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
20550 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ion = TRANS_NONE
20560 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
20570 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20  .    /* Set the 
20580 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
20590 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52 41  ion state to TRA
205a0 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f  NS_NONE and unlo
205b0 63 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 70  ck the .    ** p
205c0 61 67 65 72 20 69 66 20 74 68 69 73 20 63 61 6c  ager if this cal
205d0 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c  l closed the onl
205e0 79 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  y read or write 
205f0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f  transaction.  */
20600 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  .    p->inTrans 
20610 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
20620 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
20630 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a  nused(pBt);.  }.
20640 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
20650 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  y(p);.}../*.** C
20660 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61  ommit the transa
20670 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20  ction currently 
20680 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a  in progress..**.
20690 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
206a0 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 73  implements the s
206b0 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 61  econd phase of a
206c0 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e   2-phase commit.
206d0 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33    The.** sqlite3
206e0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
206f0 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65 20 64 6f  One() routine do
20700 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61  es the first pha
20710 73 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a  se and should.**
20720 20 62 65 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f   be invoked prio
20730 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69  r to calling thi
20740 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20  s routine.  The 
20750 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
20760 69 74 50 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20  itPhaseOne().** 
20770 72 6f 75 74 69 6e 65 20 64 69 64 20 61 6c 6c 20  routine did all 
20780 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72 69 74  the work of writ
20790 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
207a0 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20  out to disk and 
207b0 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20  flushing the.** 
207c0 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68 61 74  contents so that
207d0 20 74 68 65 79 20 61 72 65 20 77 72 69 74 74 65   they are writte
207e0 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20  n onto the disk 
207f0 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20 74 68  platter.  All th
20800 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61  is.** routine ha
20810 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c 65 74  s to do is delet
20820 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 6f 72  e or truncate or
20830 20 7a 65 72 6f 20 74 68 65 20 68 65 61 64 65 72   zero the header
20840 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65 20 72   in the.** the r
20850 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
20860 28 77 68 69 63 68 20 63 61 75 73 65 73 20 74 68  (which causes th
20870 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f  e transaction to
20880 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20   commit) and.** 
20890 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a  drop locks..**.*
208a0 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61  * Normally, if a
208b0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
208c0 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 6c  hile the pager l
208d0 61 79 65 72 20 69 73 20 61 74 74 65 6d 70 74 69  ayer is attempti
208e0 6e 67 20 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c 69  ng to .** finali
208f0 7a 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  ze the underlyin
20900 67 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  g journal file, 
20910 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
20920 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 61  turns an error a
20930 6e 64 0a 2a 2a 20 74 68 65 20 75 70 70 65 72 20  nd.** the upper 
20940 6c 61 79 65 72 20 77 69 6c 6c 20 61 74 74 65 6d  layer will attem
20950 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 48  pt a rollback. H
20960 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 73  owever, if the s
20970 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a  econd argument.*
20980 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68  * is non-zero th
20990 65 6e 20 74 68 69 73 20 62 2d 74 72 65 65 20 74  en this b-tree t
209a0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 70 61  ransaction is pa
209b0 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69  rt of a multi-fi
209c0 6c 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  le .** transacti
209d0 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  on. In this case
209e0 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  , the transactio
209f0 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
20a00 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20 0a 2a 2a  en committed .**
20a10 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20 61 20   (by deleting a 
20a20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
20a30 69 6c 65 29 20 61 6e 64 20 74 68 65 20 63 61 6c  ile) and the cal
20a40 6c 65 72 20 77 69 6c 6c 20 69 67 6e 6f 72 65 20  ler will ignore 
20a50 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  this .** functio
20a60 6e 73 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 20  ns return code. 
20a70 53 6f 2c 20 65 76 65 6e 20 69 66 20 61 6e 20 65  So, even if an e
20a80 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 74  rror occurs in t
20a90 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 2c 0a  he pager layer,.
20aa0 2a 2a 20 72 65 73 65 74 20 74 68 65 20 62 2d 74  ** reset the b-t
20ab0 72 65 65 20 6f 62 6a 65 63 74 73 20 69 6e 74 65  ree objects inte
20ac0 72 6e 61 6c 20 73 74 61 74 65 20 74 6f 20 69 6e  rnal state to in
20ad0 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
20ae0 77 72 69 74 65 0a 2a 2a 20 74 72 61 6e 73 61 63  write.** transac
20af0 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63 6c  tion has been cl
20b00 6f 73 65 64 2e 20 54 68 69 73 20 69 73 20 71 75  osed. This is qu
20b10 69 74 65 20 73 61 66 65 2c 20 61 73 20 74 68 65  ite safe, as the
20b20 20 70 61 67 65 72 20 77 69 6c 6c 20 68 61 76 65   pager will have
20b30 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 65 64  .** transitioned
20b40 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20 73 74   to the error st
20b50 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ate..**.** This 
20b60 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65  will release the
20b70 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74   write lock on t
20b80 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
20b90 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61  .  If there.** a
20ba0 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72  re no active cur
20bb0 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65  sors, it also re
20bc0 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20  leases the read 
20bd0 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lock..*/.int sql
20be0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
20bf0 68 61 73 65 54 77 6f 28 42 74 72 65 65 20 2a 70  haseTwo(Btree *p
20c00 2c 20 69 6e 74 20 62 43 6c 65 61 6e 75 70 29 7b  , int bCleanup){
20c10 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ..  if( p->inTra
20c20 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ns==TRANS_NONE )
20c30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
20c40 4b 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  K;.  sqlite3Btre
20c50 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72  eEnter(p);.  btr
20c60 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
20c70 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e  .  /* If the han
20c80 64 6c 65 20 68 61 73 20 61 20 77 72 69 74 65 2d  dle has a write-
20c90 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
20ca0 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20 73 68 61  , commit the sha
20cb0 72 65 64 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a  red-btrees .  **
20cc0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
20cd0 20 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20   set the shared 
20ce0 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 52  state to TRANS_R
20cf0 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  EAD..  */.  if( 
20d00 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
20d10 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69  S_WRITE ){.    i
20d20 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 53 68 61  nt rc;.    BtSha
20d30 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
20d40 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  t;.    assert( p
20d50 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
20d60 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n==TRANS_WRITE )
20d70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
20d80 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e  t->nTransaction>
20d90 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 );.    rc = sq
20da0 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
20db0 50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e 70 50  PhaseTwo(pBt->pP
20dc0 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
20dd0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
20de0 62 43 6c 65 61 6e 75 70 3d 3d 30 20 29 7b 0a 20  bCleanup==0 ){. 
20df0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
20e00 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20  eLeave(p);.     
20e10 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
20e20 7d 0a 20 20 20 20 70 2d 3e 69 44 61 74 61 56 65  }.    p->iDataVe
20e30 72 73 69 6f 6e 2d 2d 3b 20 20 2f 2a 20 43 6f 6d  rsion--;  /* Com
20e40 70 65 6e 73 61 74 65 20 66 6f 72 20 70 50 61 67  pensate for pPag
20e50 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e  er->iDataVersion
20e60 2b 2b 3b 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e  ++; */.    pBt->
20e70 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
20e80 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20  TRANS_READ;.    
20e90 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e  btreeClearHasCon
20ea0 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a  tent(pBt);.  }..
20eb0 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61    btreeEndTransa
20ec0 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69  ction(p);.  sqli
20ed0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
20ee0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
20ef0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
20f00 6f 20 62 6f 74 68 20 70 68 61 73 65 73 20 6f 66  o both phases of
20f10 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e   a commit..*/.in
20f20 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
20f30 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b 0a  mmit(Btree *p){.
20f40 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
20f50 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
20f60 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
20f70 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
20f80 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69 66 28  One(p, 0);.  if(
20f90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
20fa0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
20fb0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
20fc0 73 65 54 77 6f 28 70 2c 20 30 29 3b 0a 20 20 7d  seTwo(p, 0);.  }
20fd0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
20fe0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
20ff0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
21000 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
21010 20 74 68 65 20 73 74 61 74 65 20 74 6f 20 43 55   the state to CU
21020 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20 74  RSOR_FAULT and t
21030 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  he error.** code
21040 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f 72 20   to errCode for 
21050 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f 6e 20  every cursor on 
21060 61 6e 79 20 42 74 53 68 61 72 65 64 20 74 68 61  any BtShared tha
21070 74 20 70 42 74 72 65 65 0a 2a 2a 20 72 65 66 65  t pBtree.** refe
21080 72 65 6e 63 65 73 2e 20 20 4f 72 20 69 66 20 74  rences.  Or if t
21090 68 65 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c 61  he writeOnly fla
210a0 67 20 69 73 20 73 65 74 20 74 6f 20 31 2c 20 74  g is set to 1, t
210b0 68 65 6e 20 6f 6e 6c 79 0a 2a 2a 20 74 72 69 70  hen only.** trip
210c0 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61   write cursors a
210d0 6e 64 20 6c 65 61 76 65 20 72 65 61 64 20 63 75  nd leave read cu
210e0 72 73 6f 72 73 20 75 6e 63 68 61 6e 67 65 64 2e  rsors unchanged.
210f0 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75 72  .**.** Every cur
21100 73 6f 72 20 69 73 20 61 20 63 61 6e 64 69 64 61  sor is a candida
21110 74 65 20 74 6f 20 62 65 20 74 72 69 70 70 65 64  te to be tripped
21120 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75 72 73  , including curs
21130 6f 72 73 0a 2a 2a 20 74 68 61 74 20 62 65 6c 6f  ors.** that belo
21140 6e 67 20 74 6f 20 6f 74 68 65 72 20 64 61 74 61  ng to other data
21150 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
21160 20 74 68 61 74 20 68 61 70 70 65 6e 20 74 6f 20   that happen to 
21170 62 65 0a 2a 2a 20 73 68 61 72 69 6e 67 20 74 68  be.** sharing th
21180 65 20 63 61 63 68 65 20 77 69 74 68 20 70 42 74  e cache with pBt
21190 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ree..**.** This 
211a0 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61 6c  routine gets cal
211b0 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62  led when a rollb
211c0 61 63 6b 20 6f 63 63 75 72 73 2e 20 49 66 20 74  ack occurs. If t
211d0 68 65 20 77 72 69 74 65 4f 6e 6c 79 0a 2a 2a 20  he writeOnly.** 
211e0 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68  flag is true, th
211f0 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65 2d 63 75  en only write-cu
21200 72 73 6f 72 73 20 6e 65 65 64 20 62 65 20 74 72  rsors need be tr
21210 69 70 70 65 64 20 2d 20 72 65 61 64 2d 6f 6e 6c  ipped - read-onl
21220 79 0a 2a 2a 20 63 75 72 73 6f 72 73 20 73 61 76  y.** cursors sav
21230 65 20 74 68 65 69 72 20 63 75 72 72 65 6e 74 20  e their current 
21240 70 6f 73 69 74 69 6f 6e 73 20 73 6f 20 74 68 61  positions so tha
21250 74 20 74 68 65 79 20 6d 61 79 20 63 6f 6e 74 69  t they may conti
21260 6e 75 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  nue .** followin
21270 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20  g the rollback. 
21280 4f 72 2c 20 69 66 20 77 72 69 74 65 4f 6e 6c 79  Or, if writeOnly
21290 20 69 73 20 66 61 6c 73 65 2c 20 61 6c 6c 20 63   is false, all c
212a0 75 72 73 6f 72 73 20 61 72 65 20 0a 2a 2a 20 74  ursors are .** t
212b0 72 69 70 70 65 64 2e 20 49 6e 20 67 65 6e 65 72  ripped. In gener
212c0 61 6c 2c 20 77 72 69 74 65 4f 6e 6c 79 20 69 73  al, writeOnly is
212d0 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 74 72   false if the tr
212e0 61 6e 73 61 63 74 69 6f 6e 20 62 65 69 6e 67 0a  ansaction being.
212f0 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6d  ** rolled back m
21300 6f 64 69 66 69 65 64 20 74 68 65 20 64 61 74 61  odified the data
21310 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 6e 20  base schema. In 
21320 74 68 69 73 20 63 61 73 65 20 62 2d 74 72 65 65  this case b-tree
21330 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 73 20 6d   root.** pages m
21340 61 79 20 62 65 20 6d 6f 76 65 64 20 6f 72 20 64  ay be moved or d
21350 65 6c 65 74 65 64 20 66 72 6f 6d 20 74 68 65 20  eleted from the 
21360 64 61 74 61 62 61 73 65 20 61 6c 74 6f 67 65 74  database altoget
21370 68 65 72 2c 20 6d 61 6b 69 6e 67 0a 2a 2a 20 69  her, making.** i
21380 74 20 75 6e 73 61 66 65 20 66 6f 72 20 72 65 61  t unsafe for rea
21390 64 20 63 75 72 73 6f 72 73 20 74 6f 20 63 6f 6e  d cursors to con
213a0 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tinue..**.** If 
213b0 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c  the writeOnly fl
213c0 61 67 20 69 73 20 74 72 75 65 20 61 6e 64 20 61  ag is true and a
213d0 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  n error is encou
213e0 6e 74 65 72 65 64 20 77 68 69 6c 65 20 0a 2a 2a  ntered while .**
213f0 20 73 61 76 69 6e 67 20 74 68 65 20 63 75 72 72   saving the curr
21400 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20  ent position of 
21410 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73  a read-only curs
21420 6f 72 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73 2c  or, all cursors,
21430 20 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 61   .** including a
21440 6c 6c 20 72 65 61 64 2d 63 75 72 73 6f 72 73 20  ll read-cursors 
21450 61 72 65 20 74 72 69 70 70 65 64 2e 0a 2a 2a 0a  are tripped..**.
21460 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
21470 72 65 74 75 72 6e 65 64 20 69 66 20 73 75 63 63  returned if succ
21480 65 73 73 66 75 6c 2c 20 6f 72 20 69 66 20 61 6e  essful, or if an
21490 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
214a0 69 6c 65 0a 2a 2a 20 73 61 76 69 6e 67 20 61 20  ile.** saving a 
214b0 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2c  cursor position,
214c0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
214d0 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   code..*/.int sq
214e0 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c  lite3BtreeTripAl
214f0 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65 20 2a  lCursors(Btree *
21500 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72 72 43  pBtree, int errC
21510 6f 64 65 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e  ode, int writeOn
21520 6c 79 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  ly){.  BtCursor 
21530 2a 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  *p;.  int rc = S
21540 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
21550 65 72 74 28 20 28 77 72 69 74 65 4f 6e 6c 79 3d  ert( (writeOnly=
21560 3d 30 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79 3d  =0 || writeOnly=
21570 3d 31 29 20 26 26 20 42 54 43 46 5f 57 72 69 74  =1) && BTCF_Writ
21580 65 46 6c 61 67 3d 3d 31 20 29 3b 0a 20 20 69 66  eFlag==1 );.  if
21590 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20  ( pBtree ){.    
215a0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
215b0 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 66  r(pBtree);.    f
215c0 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74  or(p=pBtree->pBt
215d0 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
215e0 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  p->pNext){.     
215f0 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 66   int i;.      if
21600 28 20 77 72 69 74 65 4f 6e 6c 79 20 26 26 20 28  ( writeOnly && (
21610 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  p->curFlags & BT
21620 43 46 5f 57 72 69 74 65 46 6c 61 67 29 3d 3d 30  CF_WriteFlag)==0
21630 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
21640 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  p->eState==CURSO
21650 52 5f 56 41 4c 49 44 20 7c 7c 20 70 2d 3e 65 53  R_VALID || p->eS
21660 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49  tate==CURSOR_SKI
21670 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20  PNEXT ){.       
21680 20 20 20 72 63 20 3d 20 73 61 76 65 43 75 72 73     rc = saveCurs
21690 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20  orPosition(p);. 
216a0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
216b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
216c0 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 29            (void)
216d0 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70  sqlite3BtreeTrip
216e0 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 72 65  AllCursors(pBtre
216f0 65 2c 20 72 63 2c 20 30 29 3b 0a 20 20 20 20 20  e, rc, 0);.     
21700 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
21710 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21720 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
21730 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21740 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
21750 28 70 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  (p);.        p->
21760 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
21770 46 41 55 4c 54 3b 0a 20 20 20 20 20 20 20 20 70  FAULT;.        p
21780 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 65 72 72  ->skipNext = err
21790 43 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Code;.      }.  
217a0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d      for(i=0; i<=
217b0 70 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  p->iPage; i++){.
217c0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
217d0 61 67 65 28 70 2d 3e 61 70 50 61 67 65 5b 69 5d  age(p->apPage[i]
217e0 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70  );.        p->ap
217f0 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  Page[i] = 0;.   
21800 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
21810 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
21820 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20  (pBtree);.  }.  
21830 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
21840 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65  .** Rollback the
21850 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
21860 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20  progress..**.** 
21870 49 66 20 74 72 69 70 43 6f 64 65 20 69 73 20 6e  If tripCode is n
21880 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20 74 68 65  ot SQLITE_OK the
21890 6e 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62  n cursors will b
218a0 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 28 74  e invalidated (t
218b0 72 69 70 70 65 64 29 2e 0a 2a 2a 20 4f 6e 6c 79  ripped)..** Only
218c0 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61   write cursors a
218d0 72 65 20 74 72 69 70 70 65 64 20 69 66 20 77 72  re tripped if wr
218e0 69 74 65 4f 6e 6c 79 20 69 73 20 74 72 75 65 20  iteOnly is true 
218f0 62 75 74 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  but all cursors 
21900 61 72 65 0a 2a 2a 20 74 72 69 70 70 65 64 20 69  are.** tripped i
21910 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66  f writeOnly is f
21920 61 6c 73 65 2e 20 20 41 6e 79 20 61 74 74 65 6d  alse.  Any attem
21930 70 74 20 74 6f 20 75 73 65 0a 2a 2a 20 61 20 74  pt to use.** a t
21940 72 69 70 70 65 64 20 63 75 72 73 6f 72 20 77 69  ripped cursor wi
21950 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20  ll result in an 
21960 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  error..**.** Thi
21970 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74  s will release t
21980 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e  he write lock on
21990 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
219a0 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a  le.  If there.**
219b0 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63   are no active c
219c0 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20  ursors, it also 
219d0 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61  releases the rea
219e0 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73  d lock..*/.int s
219f0 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
21a00 61 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ack(Btree *p, in
21a10 74 20 74 72 69 70 43 6f 64 65 2c 20 69 6e 74 20  t tripCode, int 
21a20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20 69 6e  writeOnly){.  in
21a30 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
21a40 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
21a50 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
21a60 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 77 72  1;..  assert( wr
21a70 69 74 65 4f 6e 6c 79 3d 3d 31 20 7c 7c 20 77 72  iteOnly==1 || wr
21a80 69 74 65 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20  iteOnly==0 );.  
21a90 61 73 73 65 72 74 28 20 74 72 69 70 43 6f 64 65  assert( tripCode
21aa0 3d 3d 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52  ==SQLITE_ABORT_R
21ab0 4f 4c 4c 42 41 43 4b 20 7c 7c 20 74 72 69 70 43  OLLBACK || tripC
21ac0 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
21ad0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
21ae0 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20  Enter(p);.  if( 
21af0 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45  tripCode==SQLITE
21b00 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
21b10 74 72 69 70 43 6f 64 65 20 3d 20 73 61 76 65 41  tripCode = saveA
21b20 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30  llCursors(pBt, 0
21b30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
21b40 20 29 20 77 72 69 74 65 4f 6e 6c 79 20 3d 20 30   ) writeOnly = 0
21b50 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
21b60 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
21b70 20 7d 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64   }.  if( tripCod
21b80 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32  e ){.    int rc2
21b90 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 54   = sqlite3BtreeT
21ba0 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c  ripAllCursors(p,
21bb0 20 74 72 69 70 43 6f 64 65 2c 20 77 72 69 74 65   tripCode, write
21bc0 4f 6e 6c 79 29 3b 0a 20 20 20 20 61 73 73 65 72  Only);.    asser
21bd0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
21be0 20 7c 7c 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d   || (writeOnly==
21bf0 30 20 26 26 20 72 63 32 3d 3d 53 51 4c 49 54 45  0 && rc2==SQLITE
21c00 5f 4f 4b 29 20 29 3b 0a 20 20 20 20 69 66 28 20  _OK) );.    if( 
21c10 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  rc2!=SQLITE_OK )
21c20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 20   rc = rc2;.  }. 
21c30 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
21c40 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e  p);..  if( p->in
21c50 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
21c60 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  TE ){.    int rc
21c70 32 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  2;..    assert( 
21c80 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74  TRANS_WRITE==pBt
21c90 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
21ca0 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c  );.    rc2 = sql
21cb0 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
21cc0 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  k(pBt->pPager);.
21cd0 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c      if( rc2!=SQL
21ce0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
21cf0 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a  rc = rc2;.    }.
21d00 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c  .    /* The roll
21d10 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65  back may have de
21d20 73 74 72 6f 79 65 64 20 74 68 65 20 70 50 61 67  stroyed the pPag
21d30 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e  e1->aData value.
21d40 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c    So.    ** call
21d50 20 62 74 72 65 65 47 65 74 50 61 67 65 28 29 20   btreeGetPage() 
21d60 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69 6e 20  on page 1 again 
21d70 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73  to make.    ** s
21d80 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74  ure pPage1->aDat
21d90 61 20 69 73 20 73 65 74 20 63 6f 72 72 65 63 74  a is set correct
21da0 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62  ly. */.    if( b
21db0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
21dc0 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d   1, &pPage1, 0)=
21dd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
21de0 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20      int nPage = 
21df0 67 65 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a  get4byte(28+(u8*
21e00 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b  )pPage1->aData);
21e10 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
21e20 20 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20   nPage==0 );.   
21e30 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20     if( nPage==0 
21e40 29 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ) sqlite3PagerPa
21e50 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
21e60 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
21e70 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 42      testcase( pB
21e80 74 2d 3e 6e 50 61 67 65 21 3d 6e 50 61 67 65 20  t->nPage!=nPage 
21e90 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  );.      pBt->nP
21ea0 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20  age = nPage;.   
21eb0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
21ec0 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20  Page1);.    }.  
21ed0 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 56    assert( countV
21ee0 61 6c 69 64 43 75 72 73 6f 72 73 28 70 42 74 2c  alidCursors(pBt,
21ef0 20 31 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42   1)==0 );.    pB
21f00 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
21f10 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20   = TRANS_READ;. 
21f20 20 20 20 62 74 72 65 65 43 6c 65 61 72 48 61 73     btreeClearHas
21f30 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20  Content(pBt);.  
21f40 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61  }..  btreeEndTra
21f50 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73  nsaction(p);.  s
21f60 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
21f70 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
21f80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74  ;.}../*.** Start
21f90 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62   a statement sub
21fa0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
21fb0 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
21fc0 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a  can be rolled.**
21fd0 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e   back independen
21fe0 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  tly of the main 
21ff0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59 6f 75  transaction. You
22000 20 6d 75 73 74 20 73 74 61 72 74 20 61 20 74 72   must start a tr
22010 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 62 65  ansaction .** be
22020 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20 61 20  fore starting a 
22030 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  subtransaction. 
22040 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69  The subtransacti
22050 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75 74 6f  on is ended auto
22060 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 69 66  matically .** if
22070 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61   the main transa
22080 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f 72  ction commits or
22090 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a   rolls back..**.
220a0 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73 75 62  ** Statement sub
220b0 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
220c0 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69 6e 64   used around ind
220d0 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74 61 74  ividual SQL stat
220e0 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61  ements.** that a
220f0 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  re contained wit
22100 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f  hin a BEGIN...CO
22110 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20  MMIT block.  If 
22120 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20  a constraint.** 
22130 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74  error occurs wit
22140 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hin the statemen
22150 74 2c 20 74 68 65 20 65 66 66 65 63 74 20 6f 66  t, the effect of
22160 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74 65 6d   that one statem
22170 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f  ent.** can be ro
22180 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68 6f 75  lled back withou
22190 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c  t having to roll
221a0 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72 65 20  back the entire 
221b0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
221c0 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20 73  ** A statement s
221d0 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ub-transaction i
221e0 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73  s implemented as
221f0 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61   an anonymous sa
22200 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a 20  vepoint. The.** 
22210 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20  value passed as 
22220 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  the second param
22230 65 74 65 72 20 69 73 20 74 68 65 20 74 6f 74 61  eter is the tota
22240 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65  l number of save
22250 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75  points,.** inclu
22260 64 69 6e 67 20 74 68 65 20 6e 65 77 20 61 6e 6f  ding the new ano
22270 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74  nymous savepoint
22280 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 42 2d  , open on the B-
22290 54 72 65 65 2e 20 69 2e 65 2e 20 69 66 20 74 68  Tree. i.e. if th
222a0 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
222b0 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20  tive savepoints 
222c0 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73 74 61  and no other sta
222d0 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69  tement-transacti
222e0 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74  ons open,.** iSt
222f0 61 74 65 6d 65 6e 74 20 69 73 20 31 2e 20 54 68  atement is 1. Th
22300 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76  is anonymous sav
22310 65 70 6f 69 6e 74 20 63 61 6e 20 62 65 20 72 65  epoint can be re
22320 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c 65 64  leased or rolled
22330 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 74   back.** using t
22340 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  he sqlite3BtreeS
22350 61 76 65 70 6f 69 6e 74 28 29 20 66 75 6e 63 74  avepoint() funct
22360 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
22370 74 65 33 42 74 72 65 65 42 65 67 69 6e 53 74 6d  te3BtreeBeginStm
22380 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  t(Btree *p, int 
22390 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20 20 69  iStatement){.  i
223a0 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65  nt rc;.  BtShare
223b0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
223c0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
223d0 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72  nter(p);.  asser
223e0 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  t( p->inTrans==T
223f0 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
22400 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 62 74  assert( (pBt->bt
22410 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41  sFlags & BTS_REA
22420 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 20 20  D_ONLY)==0 );.  
22430 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65  assert( iStateme
22440 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  nt>0 );.  assert
22450 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 70 2d 3e  ( iStatement>p->
22460 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29  db->nSavepoint )
22470 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
22480 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
22490 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
224a0 20 2f 2a 20 41 74 20 74 68 65 20 70 61 67 65 72   /* At the pager
224b0 20 6c 65 76 65 6c 2c 20 61 20 73 74 61 74 65 6d   level, a statem
224c0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
224d0 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20 77  is a savepoint w
224e0 69 74 68 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65  ith.  ** an inde
224f0 78 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 61  x greater than a
22500 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 63 72  ll savepoints cr
22510 65 61 74 65 64 20 65 78 70 6c 69 63 69 74 6c 79  eated explicitly
22520 20 75 73 69 6e 67 0a 20 20 2a 2a 20 53 51 4c 20   using.  ** SQL 
22530 73 74 61 74 65 6d 65 6e 74 73 2e 20 49 74 20 69  statements. It i
22540 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f 70 65  s illegal to ope
22550 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f  n, release or ro
22560 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20 2a 2a 20  llback any.  ** 
22570 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74 73 20  such savepoints 
22580 77 68 69 6c 65 20 74 68 65 20 73 74 61 74 65 6d  while the statem
22590 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
225a0 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74  savepoint is act
225b0 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ive..  */.  rc =
225c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
225d0 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e  nSavepoint(pBt->
225e0 70 50 61 67 65 72 2c 20 69 53 74 61 74 65 6d 65  pPager, iStateme
225f0 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  nt);.  sqlite3Bt
22600 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
22610 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
22620 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  ** The second ar
22630 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
22640 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20  unction, op, is 
22650 61 6c 77 61 79 73 20 53 41 56 45 50 4f 49 4e 54  always SAVEPOINT
22660 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20  _ROLLBACK.** or 
22670 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
22680 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  E. This function
22690 20 65 69 74 68 65 72 20 72 65 6c 65 61 73 65 73   either releases
226a0 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74   or rolls back t
226b0 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20  he.** savepoint 
226c0 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61  identified by pa
226d0 72 61 6d 65 74 65 72 20 69 53 61 76 65 70 6f 69  rameter iSavepoi
226e0 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  nt, depending on
226f0 20 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f   the value .** o
22700 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d  f op..**.** Norm
22710 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e 74  ally, iSavepoint
22720 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
22730 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72   or equal to zer
22740 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 6f  o. However, if o
22750 70 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e  p is.** SAVEPOIN
22760 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e  T_ROLLBACK, then
22770 20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61 79 20   iSavepoint may 
22780 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74  also be -1. In t
22790 68 69 73 20 63 61 73 65 20 74 68 65 20 0a 2a 2a  his case the .**
227a0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
227b0 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74   entire transact
227c0 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20 62  ion are rolled b
227d0 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69 66  ack. This is dif
227e0 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61  ferent.** from a
227f0 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63 74   normal transact
22800 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73  ion rollback, as
22810 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72 65   no locks are re
22820 6c 65 61 73 65 64 20 61 6e 64 20 74 68 65 0a 2a  leased and the.*
22830 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 65  * transaction re
22840 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69  mains open..*/.i
22850 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
22860 61 76 65 70 6f 69 6e 74 28 42 74 72 65 65 20 2a  avepoint(Btree *
22870 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69  p, int op, int i
22880 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e  Savepoint){.  in
22890 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
228a0 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e  ;.  if( p && p->
228b0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
228c0 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68  RITE ){.    BtSh
228d0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
228e0 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Bt;.    assert( 
228f0 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45  op==SAVEPOINT_RE
22900 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56  LEASE || op==SAV
22910 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
22920 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
22930 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20  Savepoint>=0 || 
22940 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20  (iSavepoint==-1 
22950 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  && op==SAVEPOINT
22960 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20  _ROLLBACK) );.  
22970 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
22980 74 65 72 28 70 29 3b 0a 20 20 20 20 69 66 28 20  ter(p);.    if( 
22990 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  op==SAVEPOINT_RO
229a0 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20  LLBACK ){.      
229b0 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
229c0 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a  ors(pBt, 0, 0);.
229d0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
229e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
229f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
22a00 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28  3PagerSavepoint(
22a10 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c  pBt->pPager, op,
22a20 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
22a30 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
22a40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22a50 20 20 20 69 66 28 20 69 53 61 76 65 70 6f 69 6e     if( iSavepoin
22a60 74 3c 30 20 26 26 20 28 70 42 74 2d 3e 62 74 73  t<0 && (pBt->bts
22a70 46 6c 61 67 73 20 26 20 42 54 53 5f 49 4e 49 54  Flags & BTS_INIT
22a80 49 41 4c 4c 59 5f 45 4d 50 54 59 29 21 3d 30 20  IALLY_EMPTY)!=0 
22a90 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  ){.        pBt->
22aa0 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  nPage = 0;.     
22ab0 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 65   }.      rc = ne
22ac0 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a  wDatabase(pBt);.
22ad0 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
22ae0 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 20 2b   = get4byte(28 +
22af0 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
22b00 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ata);..      /* 
22b10 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  The database siz
22b20 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e  e was written in
22b30 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 32 38  to the offset 28
22b40 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 0a 20   of the header. 
22b50 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65       ** when the
22b60 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61   transaction sta
22b70 72 74 65 64 2c 20 73 6f 20 77 65 20 6b 6e 6f 77  rted, so we know
22b80 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 20   that the value 
22b90 61 74 20 6f 66 66 73 65 74 0a 20 20 20 20 20 20  at offset.      
22ba0 2a 2a 20 32 38 20 69 73 20 6e 6f 6e 7a 65 72 6f  ** 28 is nonzero
22bb0 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
22bc0 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20  t( pBt->nPage>0 
22bd0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
22be0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
22bf0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
22c00 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  rc;.}../*.** Cre
22c10 61 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72  ate a new cursor
22c20 20 66 6f 72 20 74 68 65 20 42 54 72 65 65 20 77   for the BTree w
22c30 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20  hose root is on 
22c40 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54 61 62  the page.** iTab
22c50 6c 65 2e 20 49 66 20 61 20 72 65 61 64 2d 6f 6e  le. If a read-on
22c60 6c 79 20 63 75 72 73 6f 72 20 69 73 20 72 65 71  ly cursor is req
22c70 75 65 73 74 65 64 2c 20 69 74 20 69 73 20 61 73  uested, it is as
22c80 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68  sumed that.** th
22c90 65 20 63 61 6c 6c 65 72 20 61 6c 72 65 61 64 79  e caller already
22ca0 20 68 61 73 20 61 74 20 6c 65 61 73 74 20 61 20   has at least a 
22cb0 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61  read-only transa
22cc0 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e  ction open.** on
22cd0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6c   the database al
22ce0 72 65 61 64 79 2e 20 49 66 20 61 20 77 72 69 74  ready. If a writ
22cf0 65 2d 63 75 72 73 6f 72 20 69 73 20 72 65 71 75  e-cursor is requ
22d00 65 73 74 65 64 2c 20 74 68 65 6e 0a 2a 2a 20 74  ested, then.** t
22d10 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61 73 73  he caller is ass
22d20 75 6d 65 64 20 74 6f 20 68 61 76 65 20 61 6e 20  umed to have an 
22d30 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73  open write trans
22d40 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  action..**.** If
22d50 20 74 68 65 20 42 54 52 45 45 5f 57 52 43 53 52   the BTREE_WRCSR
22d60 20 62 69 74 20 6f 66 20 77 72 46 6c 61 67 20 69   bit of wrFlag i
22d70 73 20 63 6c 65 61 72 2c 20 74 68 65 6e 20 74 68  s clear, then th
22d80 65 20 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c  e cursor can onl
22d90 79 0a 2a 2a 20 62 65 20 75 73 65 64 20 66 6f 72  y.** be used for
22da0 20 72 65 61 64 69 6e 67 2e 20 20 49 66 20 74 68   reading.  If th
22db0 65 20 42 54 52 45 45 5f 57 52 43 53 52 20 62 69  e BTREE_WRCSR bi
22dc0 74 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74  t is set, then t
22dd0 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 63 61 6e  he cursor.** can
22de0 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61   be used for rea
22df0 64 69 6e 67 20 6f 72 20 66 6f 72 20 77 72 69 74  ding or for writ
22e00 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63 6f 6e  ing if other con
22e10 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72 69 74  ditions for writ
22e20 69 6e 67 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20  ing.** are also 
22e30 6d 65 74 2e 20 20 54 68 65 73 65 20 61 72 65 20  met.  These are 
22e40 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74  the conditions t
22e50 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65 74 20  hat must be met 
22e60 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 66 6f 72 20  in order.** for 
22e70 77 72 69 74 69 6e 67 20 74 6f 20 62 65 20 61 6c  writing to be al
22e80 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20  lowed:.**.** 1: 
22e90 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74   The cursor must
22ea0 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65   have been opene
22eb0 64 20 77 69 74 68 20 77 72 46 6c 61 67 20 63 6f  d with wrFlag co
22ec0 6e 74 61 69 6e 69 6e 67 20 42 54 52 45 45 5f 57  ntaining BTREE_W
22ed0 52 43 53 52 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f  RCSR.**.** 2:  O
22ee0 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
22ef0 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 73  nnections that s
22f00 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 70 61  hare the same pa
22f10 67 65 72 20 63 61 63 68 65 0a 2a 2a 20 20 20 20  ger cache.**    
22f20 20 62 75 74 20 77 68 69 63 68 20 61 72 65 20 6e   but which are n
22f30 6f 74 20 69 6e 20 74 68 65 20 52 45 41 44 5f 55  ot in the READ_U
22f40 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74 61 74 65  NCOMMITTED state
22f50 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a   may not have.**
22f60 20 20 20 20 20 63 75 72 73 6f 72 73 20 6f 70 65       cursors ope
22f70 6e 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30  n with wrFlag==0
22f80 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62   on the same tab
22f90 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a  le.  Otherwise.*
22fa0 2a 20 20 20 20 20 74 68 65 20 63 68 61 6e 67 65  *     the change
22fb0 73 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 77  s made by this w
22fc0 72 69 74 65 20 63 75 72 73 6f 72 20 77 6f 75 6c  rite cursor woul
22fd0 64 20 62 65 20 76 69 73 69 62 6c 65 20 74 6f 0a  d be visible to.
22fe0 2a 2a 20 20 20 20 20 74 68 65 20 72 65 61 64 20  **     the read 
22ff0 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20 6f  cursors in the o
23000 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
23010 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nnection..**.** 
23020 33 3a 20 20 54 68 65 20 64 61 74 61 62 61 73 65  3:  The database
23030 20 6d 75 73 74 20 62 65 20 77 72 69 74 61 62 6c   must be writabl
23040 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f  e (not on read-o
23050 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a  nly media).**.**
23060 20 34 3a 20 20 54 68 65 72 65 20 6d 75 73 74 20   4:  There must 
23070 62 65 20 61 6e 20 61 63 74 69 76 65 20 74 72 61  be an active tra
23080 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
23090 54 68 65 20 42 54 52 45 45 5f 46 4f 52 44 45 4c  The BTREE_FORDEL
230a0 45 54 45 20 62 69 74 20 6f 66 20 77 72 46 6c 61  ETE bit of wrFla
230b0 67 20 6d 61 79 20 6f 70 74 69 6f 6e 61 6c 6c 79  g may optionally
230c0 20 62 65 20 73 65 74 20 69 66 20 42 54 52 45 45   be set if BTREE
230d0 5f 57 52 43 53 52 0a 2a 2a 20 69 73 20 73 65 74  _WRCSR.** is set
230e0 2e 20 20 49 66 20 46 4f 52 44 45 4c 45 54 45 20  .  If FORDELETE 
230f0 69 73 20 73 65 74 2c 20 74 68 61 74 20 69 73 20  is set, that is 
23100 61 20 68 69 6e 74 20 74 6f 20 74 68 65 20 69 6d  a hint to the im
23110 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61  plementation tha
23120 74 0a 2a 2a 20 74 68 69 73 20 63 75 72 73 6f 72  t.** this cursor
23130 20 77 69 6c 6c 20 6f 6e 6c 79 20 62 65 20 75 73   will only be us
23140 65 64 20 74 6f 20 73 65 65 6b 20 74 6f 20 61 6e  ed to seek to an
23150 64 20 64 65 6c 65 74 65 20 65 6e 74 72 69 65 73  d delete entries
23160 20 6f 66 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20   of an index.** 
23170 61 73 20 70 61 72 74 20 6f 66 20 61 20 6c 61 72  as part of a lar
23180 67 65 72 20 44 45 4c 45 54 45 20 73 74 61 74 65  ger DELETE state
23190 6d 65 6e 74 2e 20 20 54 68 65 20 46 4f 52 44 45  ment.  The FORDE
231a0 4c 45 54 45 20 68 69 6e 74 20 69 73 20 6e 6f 74  LETE hint is not
231b0 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 69 73   used by.** this
231c0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e   implementation.
231d0 20 20 42 75 74 20 69 6e 20 61 20 68 79 70 6f 74    But in a hypot
231e0 68 65 74 69 63 61 6c 20 61 6c 74 65 72 6e 61 74  hetical alternat
231f0 69 76 65 20 73 74 6f 72 61 67 65 20 65 6e 67 69  ive storage engi
23200 6e 65 20 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20  ne .** in which 
23210 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 61 72  index entries ar
23220 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
23230 64 65 6c 65 74 65 64 20 77 68 65 6e 20 63 6f 72  deleted when cor
23240 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65  responding table
23250 0a 2a 2a 20 72 6f 77 73 20 61 72 65 20 64 65 6c  .** rows are del
23260 65 74 65 64 2c 20 74 68 65 20 46 4f 52 44 45 4c  eted, the FORDEL
23270 45 54 45 20 66 6c 61 67 20 69 73 20 61 20 68 69  ETE flag is a hi
23280 6e 74 20 74 68 61 74 20 61 6c 6c 20 53 45 45 4b  nt that all SEEK
23290 20 61 6e 64 20 44 45 4c 45 54 45 0a 2a 2a 20 6f   and DELETE.** o
232a0 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20 74 68 69  perations on thi
232b0 73 20 63 75 72 73 6f 72 20 63 61 6e 20 62 65 20  s cursor can be 
232c0 6e 6f 2d 6f 70 73 20 61 6e 64 20 61 6c 6c 20 52  no-ops and all R
232d0 45 41 44 20 6f 70 65 72 61 74 69 6f 6e 73 20 63  EAD operations c
232e0 61 6e 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20  an .** return a 
232f0 6e 75 6c 6c 20 72 6f 77 20 28 32 2d 62 79 74 65  null row (2-byte
23300 73 3a 20 30 78 30 31 20 30 78 30 30 29 2e 0a 2a  s: 0x01 0x00)..*
23310 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67  *.** No checking
23320 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65   is done to make
23330 20 73 75 72 65 20 74 68 61 74 20 70 61 67 65 20   sure that page 
23340 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73  iTable really is
23350 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67   the.** root pag
23360 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20  e of a b-tree.  
23370 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68  If it is not, th
23380 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  en the cursor ac
23390 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e  quired.** will n
233a0 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c  ot work correctl
233b0 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61  y..**.** It is a
233c0 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
233d0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
233e0 6f 72 5a 65 72 6f 28 29 20 68 61 73 20 62 65 65  orZero() has bee
233f0 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20 70  n called.** on p
23400 43 75 72 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  Cur to initializ
23410 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 70 61  e the memory spa
23420 63 65 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f  ce prior to invo
23430 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  king this routin
23440 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
23450 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20   btreeCursor(.  
23460 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20  Btree *p,       
23470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23480 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
23490 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ree */.  int iTa
234a0 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ble,            
234b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
234c0 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
234d0 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  table to open */
234e0 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20  .  int wrFlag,  
234f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23500 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74            /* 1 t
23510 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d  o write. 0 read-
23520 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  only */.  struct
23530 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
23540 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fo,             
23550 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f   /* First arg to
23560 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
23570 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73  tion */.  BtCurs
23580 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20  or *pCur        
23590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
235a0 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e 65   /* Space for ne
235b0 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20  w cursor */.){. 
235c0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
235d0 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20   p->pBt;        
235e0 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65          /* Share
235f0 64 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65 20  d b-tree handle 
23600 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  */.  BtCursor *p
23610 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X;              
23620 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
23630 6f 6f 70 69 6e 67 20 6f 76 65 72 20 6f 74 68 65  ooping over othe
23640 72 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 2a 2f  r all cursors */
23650 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
23660 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
23670 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72  ex(p) );.  asser
23680 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 0a 20 20  t( wrFlag==0 .  
23690 20 20 20 20 20 7c 7c 20 77 72 46 6c 61 67 3d 3d       || wrFlag==
236a0 42 54 52 45 45 5f 57 52 43 53 52 20 0a 20 20 20  BTREE_WRCSR .   
236b0 20 20 20 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 28      || wrFlag==(
236c0 42 54 52 45 45 5f 57 52 43 53 52 7c 42 54 52 45  BTREE_WRCSR|BTRE
236d0 45 5f 46 4f 52 44 45 4c 45 54 45 29 20 0a 20 20  E_FORDELETE) .  
236e0 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  );..  /* The fol
236f0 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73 74  lowing assert st
23700 61 74 65 6d 65 6e 74 73 20 76 65 72 69 66 79 20  atements verify 
23710 74 68 61 74 20 69 66 20 74 68 69 73 20 69 73 20  that if this is 
23720 61 20 73 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a  a sharable .  **
23730 20 62 2d 74 72 65 65 20 64 61 74 61 62 61 73 65   b-tree database
23740 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  , the connection
23750 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20   is holding the 
23760 72 65 71 75 69 72 65 64 20 74 61 62 6c 65 20 6c  required table l
23770 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20  ocks, .  ** and 
23780 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f  that no other co
23790 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 6e 79  nnection has any
237a0 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 68 61   open cursor tha
237b0 74 20 63 6f 6e 66 6c 69 63 74 73 20 77 69 74 68  t conflicts with
237c0 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b   .  ** this lock
237d0 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
237e0 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61  hasSharedCacheTa
237f0 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c  bleLock(p, iTabl
23800 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20  e, pKeyInfo!=0, 
23810 28 77 72 46 6c 61 67 3f 32 3a 31 29 29 20 29 3b  (wrFlag?2:1)) );
23820 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61  .  assert( wrFla
23830 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52 65 61 64  g==0 || !hasRead
23840 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69 54 61  Conflicts(p, iTa
23850 62 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 73  ble) );..  /* As
23860 73 65 72 74 20 74 68 61 74 20 74 68 65 20 63 61  sert that the ca
23870 6c 6c 65 72 20 68 61 73 20 6f 70 65 6e 65 64 20  ller has opened 
23880 74 68 65 20 72 65 71 75 69 72 65 64 20 74 72 61  the required tra
23890 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61  nsaction. */.  a
238a0 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e  ssert( p->inTran
238b0 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a  s>TRANS_NONE );.
238c0 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
238d0 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e  ==0 || p->inTran
238e0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
238f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
23900 3e 70 50 61 67 65 31 20 26 26 20 70 42 74 2d 3e  >pPage1 && pBt->
23910 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b  pPage1->aData );
23920 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61  .  assert( wrFla
23930 67 3d 3d 30 20 7c 7c 20 28 70 42 74 2d 3e 62 74  g==0 || (pBt->bt
23940 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41  sFlags & BTS_REA
23950 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 0a 20  D_ONLY)==0 );.. 
23960 20 69 66 28 20 77 72 46 6c 61 67 20 29 7b 0a 20   if( wrFlag ){. 
23970 20 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53     allocateTempS
23980 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 69  pace(pBt);.    i
23990 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  f( pBt->pTmpSpac
239a0 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  e==0 ) return SQ
239b0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
239c0 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61 62 6c  .  }.  if( iTabl
239d0 65 3d 3d 31 20 26 26 20 62 74 72 65 65 50 61 67  e==1 && btreePag
239e0 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30 20 29  ecount(pBt)==0 )
239f0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 77 72  {.    assert( wr
23a00 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20 69  Flag==0 );.    i
23a10 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Table = 0;.  }..
23a20 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f    /* Now that no
23a30 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20 63 61   other errors ca
23a40 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20  n occur, finish 
23a50 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42  filling in the B
23a60 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72  tCursor.  ** var
23a70 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e 6b 20  iables and link 
23a80 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20  the cursor into 
23a90 74 68 65 20 42 74 53 68 61 72 65 64 20 6c 69 73  the BtShared lis
23aa0 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70  t.  */.  pCur->p
23ab0 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29  gnoRoot = (Pgno)
23ac0 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72 2d 3e  iTable;.  pCur->
23ad0 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 70 43  iPage = -1;.  pC
23ae0 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70  ur->pKeyInfo = p
23af0 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d  KeyInfo;.  pCur-
23b00 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70  >pBtree = p;.  p
23b10 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a  Cur->pBt = pBt;.
23b20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
23b30 20 3d 20 77 72 46 6c 61 67 20 3f 20 42 54 43 46   = wrFlag ? BTCF
23b40 5f 57 72 69 74 65 46 6c 61 67 20 3a 20 30 3b 0a  _WriteFlag : 0;.
23b50 20 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72    pCur->curPager
23b60 46 6c 61 67 73 20 3d 20 77 72 46 6c 61 67 20 3f  Flags = wrFlag ?
23b70 20 30 20 3a 20 50 41 47 45 52 5f 47 45 54 5f 52   0 : PAGER_GET_R
23b80 45 41 44 4f 4e 4c 59 3b 0a 20 20 2f 2a 20 49 66  EADONLY;.  /* If
23b90 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f   there are two o
23ba0 72 20 6d 6f 72 65 20 63 75 72 73 6f 72 73 20 6f  r more cursors o
23bb0 6e 20 74 68 65 20 73 61 6d 65 20 62 74 72 65 65  n the same btree
23bc0 2c 20 74 68 65 6e 20 61 6c 6c 20 73 75 63 68 0a  , then all such.
23bd0 20 20 2a 2a 20 63 75 72 73 6f 72 73 20 2a 6d 75    ** cursors *mu
23be0 73 74 2a 20 68 61 76 65 20 74 68 65 20 42 54 43  st* have the BTC
23bf0 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67 20  F_Multiple flag 
23c00 73 65 74 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 58  set. */.  for(pX
23c10 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
23c20 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
23c30 7b 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 70 67  {.    if( pX->pg
23c40 6e 6f 52 6f 6f 74 3d 3d 28 50 67 6e 6f 29 69 54  noRoot==(Pgno)iT
23c50 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 70 58  able ){.      pX
23c60 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54  ->curFlags |= BT
23c70 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 20  CF_Multiple;.   
23c80 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
23c90 73 20 7c 3d 20 42 54 43 46 5f 4d 75 6c 74 69 70  s |= BTCF_Multip
23ca0 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  le;.    }.  }.  
23cb0 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42  pCur->pNext = pB
23cc0 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 70 42  t->pCursor;.  pB
23cd0 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75  t->pCursor = pCu
23ce0 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74  r;.  pCur->eStat
23cf0 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
23d00 49 44 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ID;.  return SQL
23d10 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71  ITE_OK;.}.int sq
23d20 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
23d30 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
23d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d60 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
23d70 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
23d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23da0 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61   Root page of ta
23db0 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ble to open */. 
23dc0 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20   int wrFlag,    
23dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23de0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23df0 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65  1 to write. 0 re
23e00 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72  ad-only */.  str
23e10 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  uct KeyInfo *pKe
23e20 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20  yInfo,          
23e30 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
23e40 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72  t arg to xCompar
23e50 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  e() */.  BtCurso
23e60 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20  r *pCur         
23e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e80 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65       /* Write ne
23e90 77 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f  w cursor here */
23ea0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
23eb0 69 66 28 20 69 54 61 62 6c 65 3c 31 20 29 7b 0a  if( iTable<1 ){.
23ec0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
23ed0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
23ee0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
23ef0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
23f00 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 43  .    rc = btreeC
23f10 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c  ursor(p, iTable,
23f20 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66   wrFlag, pKeyInf
23f30 6f 2c 20 70 43 75 72 29 3b 0a 20 20 20 20 73 71  o, pCur);.    sq
23f40 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
23f50 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
23f60 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
23f70 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  turn the size of
23f80 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65   a BtCursor obje
23f90 63 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a  ct in bytes..**.
23fa0 2a 2a 20 54 68 69 73 20 69 6e 74 65 72 66 61 63  ** This interfac
23fb0 65 73 20 69 73 20 6e 65 65 64 65 64 20 73 6f 20  es is needed so 
23fc0 74 68 61 74 20 75 73 65 72 73 20 6f 66 20 63 75  that users of cu
23fd0 72 73 6f 72 73 20 63 61 6e 20 70 72 65 61 6c 6c  rsors can preall
23fe0 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66 69 63 69  ocate.** suffici
23ff0 65 6e 74 20 73 74 6f 72 61 67 65 20 74 6f 20 68  ent storage to h
24000 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e 20 20 54  old a cursor.  T
24010 68 65 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65  he BtCursor obje
24020 63 74 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20  ct is opaque.** 
24030 74 6f 20 75 73 65 72 73 20 73 6f 20 74 68 65 79  to users so they
24040 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73   cannot do the s
24050 69 7a 65 6f 66 28 29 20 74 68 65 6d 73 65 6c 76  izeof() themselv
24060 65 73 20 2d 20 74 68 65 79 20 6d 75 73 74 20 63  es - they must c
24070 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  all.** this rout
24080 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ine..*/.int sqli
24090 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 53 69  te3BtreeCursorSi
240a0 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75  ze(void){.  retu
240b0 72 6e 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  rn ROUND8(sizeof
240c0 28 42 74 43 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a  (BtCursor));.}..
240d0 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
240e0 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 69 6c   memory that wil
240f0 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69  l be converted i
24100 6e 74 6f 20 61 20 42 74 43 75 72 73 6f 72 20 6f  nto a BtCursor o
24110 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  bject..**.** The
24120 20 73 69 6d 70 6c 65 20 61 70 70 72 6f 61 63 68   simple approach
24130 20 68 65 72 65 20 77 6f 75 6c 64 20 62 65 20 74   here would be t
24140 6f 20 6d 65 6d 73 65 74 28 29 20 74 68 65 20 65  o memset() the e
24150 6e 74 69 72 65 20 6f 62 6a 65 63 74 0a 2a 2a 20  ntire object.** 
24160 74 6f 20 7a 65 72 6f 2e 20 20 42 75 74 20 69 74  to zero.  But it
24170 20 74 75 72 6e 73 20 6f 75 74 20 74 68 61 74 20   turns out that 
24180 74 68 65 20 61 70 50 61 67 65 5b 5d 20 61 6e 64  the apPage[] and
24190 20 61 69 49 64 78 5b 5d 20 61 72 72 61 79 73 0a   aiIdx[] arrays.
241a0 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74  ** do not need t
241b0 6f 20 62 65 20 7a 65 72 6f 65 64 20 61 6e 64 20  o be zeroed and 
241c0 74 68 65 79 20 61 72 65 20 6c 61 72 67 65 2c 20  they are large, 
241d0 73 6f 20 77 65 20 63 61 6e 20 73 61 76 65 20 61  so we can save a
241e0 20 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74   lot.** of run-t
241f0 69 6d 65 20 62 79 20 73 6b 69 70 70 69 6e 67 20  ime by skipping 
24200 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
24210 6f 6e 20 6f 66 20 74 68 6f 73 65 20 65 6c 65 6d  on of those elem
24220 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ents..*/.void sq
24230 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
24240 5a 65 72 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Zero(BtCursor *p
24250 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30  ){.  memset(p, 0
24260 2c 20 6f 66 66 73 65 74 6f 66 28 42 74 43 75 72  , offsetof(BtCur
24270 73 6f 72 2c 20 69 50 61 67 65 29 29 3b 0a 7d 0a  sor, iPage));.}.
24280 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63  ./*.** Close a c
24290 75 72 73 6f 72 2e 20 20 54 68 65 20 72 65 61 64  ursor.  The read
242a0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
242b0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 72 65  abase file is re
242c0 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74  leased.** when t
242d0 68 65 20 6c 61 73 74 20 63 75 72 73 6f 72 20 69  he last cursor i
242e0 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74  s closed..*/.int
242f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
24300 73 65 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f  seCursor(BtCurso
24310 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74 72 65  r *pCur){.  Btre
24320 65 20 2a 70 42 74 72 65 65 20 3d 20 70 43 75 72  e *pBtree = pCur
24330 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69 66 28 20  ->pBtree;.  if( 
24340 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 69 6e  pBtree ){.    in
24350 74 20 69 3b 0a 20 20 20 20 42 74 53 68 61 72 65  t i;.    BtShare
24360 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
24370 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  Bt;.    sqlite3B
24380 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65  treeEnter(pBtree
24390 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
243a0 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
243b0 43 75 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Cur);.    assert
243c0 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 21 3d  ( pBt->pCursor!=
243d0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  0 );.    if( pBt
243e0 2d 3e 70 43 75 72 73 6f 72 3d 3d 70 43 75 72 20  ->pCursor==pCur 
243f0 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 43  ){.      pBt->pC
24400 75 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e  ursor = pCur->pN
24410 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ext;.    }else{.
24420 20 20 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a        BtCursor *
24430 70 50 72 65 76 20 3d 20 70 42 74 2d 3e 70 43 75  pPrev = pBt->pCu
24440 72 73 6f 72 3b 0a 20 20 20 20 20 20 64 6f 7b 0a  rsor;.      do{.
24450 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72 65          if( pPre
24460 76 2d 3e 70 4e 65 78 74 3d 3d 70 43 75 72 20 29  v->pNext==pCur )
24470 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 72 65  {.          pPre
24480 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d  v->pNext = pCur-
24490 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
244a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
244b0 20 7d 0a 20 20 20 20 20 20 20 20 70 50 72 65 76   }.        pPrev
244c0 20 3d 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 3b   = pPrev->pNext;
244d0 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 41  .      }while( A
244e0 4c 57 41 59 53 28 70 50 72 65 76 29 20 29 3b 0a  LWAYS(pPrev) );.
244f0 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
24500 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67  0; i<=pCur->iPag
24510 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
24520 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
24530 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20  >apPage[i]);.   
24540 20 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72   }.    unlockBtr
24550 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
24560 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
24570 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  e(pCur->aOverflo
24580 77 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74  w);.    /* sqlit
24590 65 33 5f 66 72 65 65 28 70 43 75 72 29 3b 20 2a  e3_free(pCur); *
245a0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  /.    sqlite3Btr
245b0 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b  eeLeave(pBtree);
245c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
245d0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
245e0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
245f0 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20  BtCursor* given 
24600 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  in the argument 
24610 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42  has a valid.** B
24620 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72  tCursor.info str
24630 75 63 74 75 72 65 2e 20 20 49 66 20 69 74 20 69  ucture.  If it i
24640 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61  s not already va
24650 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72  lid, call.** btr
24660 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f  eeParseCell() to
24670 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a   fill it in..**.
24680 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f  ** BtCursor.info
24690 20 69 73 20 61 20 63 61 63 68 65 20 6f 66 20 74   is a cache of t
246a0 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  he information i
246b0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 65  n the current ce
246c0 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69  ll..** Using thi
246d0 73 20 63 61 63 68 65 20 72 65 64 75 63 65 73 20  s cache reduces 
246e0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61  the number of ca
246f0 6c 6c 73 20 74 6f 20 62 74 72 65 65 50 61 72 73  lls to btreePars
24700 65 43 65 6c 6c 28 29 2e 0a 2a 2f 0a 23 69 66 6e  eCell()..*/.#ifn
24710 64 65 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61  def NDEBUG.  sta
24720 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 43  tic void assertC
24730 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72  ellInfo(BtCursor
24740 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c   *pCur){.    Cel
24750 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
24760 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72  int iPage = pCur
24770 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d  ->iPage;.    mem
24780 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69  set(&info, 0, si
24790 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20  zeof(info));.   
247a0 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
247b0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61  pCur->apPage[iPa
247c0 67 65 5d 2c 20 70 43 75 72 2d 3e 69 78 2c 20 26  ge], pCur->ix, &
247d0 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72  info);.    asser
247e0 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
247f0 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26   memcmp(&info, &
24800 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65  pCur->info, size
24810 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a  of(info))==0 );.
24820 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66    }.#else.  #def
24830 69 6e 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e  ine assertCellIn
24840 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a 73 74 61  fo(x).#endif.sta
24850 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
24860 49 4e 45 20 76 6f 69 64 20 67 65 74 43 65 6c 6c  INE void getCell
24870 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Info(BtCursor *p
24880 43 75 72 29 7b 0a 20 20 69 66 28 20 70 43 75 72  Cur){.  if( pCur
24890 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
248a0 29 7b 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65  ){.    int iPage
248b0 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a   = pCur->iPage;.
248c0 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
248d0 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64  gs |= BTCF_Valid
248e0 4e 4b 65 79 3b 0a 20 20 20 20 62 74 72 65 65 50  NKey;.    btreeP
248f0 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61  arseCell(pCur->a
24900 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75  pPage[iPage],pCu
24910 72 2d 3e 69 78 2c 26 70 43 75 72 2d 3e 69 6e 66  r->ix,&pCur->inf
24920 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  o);.  }else{.   
24930 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
24940 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  pCur);.  }.}..#i
24950 66 6e 64 65 66 20 4e 44 45 42 55 47 20 20 2f 2a  fndef NDEBUG  /*
24960 20 54 68 65 20 6e 65 78 74 20 72 6f 75 74 69 6e   The next routin
24970 65 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68  e used only with
24980 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  in assert() stat
24990 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20  ements */./*.** 
249a0 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
249b0 68 65 20 67 69 76 65 6e 20 42 74 43 75 72 73 6f  he given BtCurso
249c0 72 20 69 73 20 76 61 6c 69 64 2e 20 20 41 20 76  r is valid.  A v
249d0 61 6c 69 64 20 63 75 72 73 6f 72 20 69 73 20 6f  alid cursor is o
249e0 6e 65 0a 2a 2a 20 74 68 61 74 20 69 73 20 63 75  ne.** that is cu
249f0 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
24a00 20 74 6f 20 61 20 72 6f 77 20 69 6e 20 61 20 28   to a row in a (
24a10 6e 6f 6e 2d 65 6d 70 74 79 29 20 74 61 62 6c 65  non-empty) table
24a20 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 76  ..** This is a v
24a30 65 72 69 66 69 63 61 74 69 6f 6e 20 72 6f 75 74  erification rout
24a40 69 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79  ine is used only
24a50 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29   within assert()
24a60 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a   statements..*/.
24a70 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
24a80 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 42 74  CursorIsValid(Bt
24a90 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
24aa0 20 72 65 74 75 72 6e 20 70 43 75 72 20 26 26 20   return pCur && 
24ab0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
24ac0 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 23 65  RSOR_VALID;.}.#e
24ad0 6e 64 69 66 20 2f 2a 20 4e 44 45 42 55 47 20 2a  ndif /* NDEBUG *
24ae0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
24af0 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 4e  eeCursorIsValidN
24b00 4e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  N(BtCursor *pCur
24b10 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  ){.  assert( pCu
24b20 72 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  r!=0 );.  return
24b30 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
24b40 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 0a  URSOR_VALID;.}..
24b50 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
24b60 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e   value of the in
24b70 74 65 67 65 72 20 6b 65 79 20 6f 72 20 22 72 6f  teger key or "ro
24b80 77 69 64 22 20 66 6f 72 20 61 20 74 61 62 6c 65  wid" for a table
24b90 20 62 74 72 65 65 2e 0a 2a 2a 20 54 68 69 73 20   btree..** This 
24ba0 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20  routine is only 
24bb0 76 61 6c 69 64 20 66 6f 72 20 61 20 63 75 72 73  valid for a curs
24bc0 6f 72 20 74 68 61 74 20 69 73 20 70 6f 69 6e 74  or that is point
24bd0 69 6e 67 20 69 6e 74 6f 20 61 0a 2a 2a 20 6f 72  ing into a.** or
24be0 64 69 6e 61 72 79 20 74 61 62 6c 65 20 62 74 72  dinary table btr
24bf0 65 65 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  ee.  If the curs
24c00 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  or points to an 
24c10 69 6e 64 65 78 20 62 74 72 65 65 20 6f 72 0a 2a  index btree or.*
24c20 2a 20 69 73 20 69 6e 76 61 6c 69 64 2c 20 74 68  * is invalid, th
24c30 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 69 73  e result of this
24c40 20 72 6f 75 74 69 6e 65 20 69 73 20 75 6e 64 65   routine is unde
24c50 66 69 6e 65 64 2e 0a 2a 2f 0a 69 36 34 20 73 71  fined..*/.i64 sq
24c60 6c 69 74 65 33 42 74 72 65 65 49 6e 74 65 67 65  lite3BtreeIntege
24c70 72 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70  rKey(BtCursor *p
24c80 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Cur){.  assert( 
24c90 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
24ca0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
24cb0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
24cc0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
24cd0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
24ce0 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29 3b 0a 20  ->curIntKey );. 
24cf0 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
24d00 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 75  r);.  return pCu
24d10 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 7d 0a  r->info.nKey;.}.
24d20 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
24d30 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
24d40 73 20 6f 66 20 70 61 79 6c 6f 61 64 20 66 6f 72  s of payload for
24d50 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
24d60 70 43 75 72 20 69 73 0a 2a 2a 20 63 75 72 72 65  pCur is.** curre
24d70 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  ntly pointing to
24d80 2e 20 20 46 6f 72 20 74 61 62 6c 65 20 62 74 72  .  For table btr
24d90 65 65 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62  ees, this will b
24da0 65 20 74 68 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20  e the amount.** 
24db0 6f 66 20 64 61 74 61 2e 20 20 46 6f 72 20 69 6e  of data.  For in
24dc0 64 65 78 20 62 74 72 65 65 73 2c 20 74 68 69 73  dex btrees, this
24dd0 20 77 69 6c 6c 20 62 65 20 74 68 65 20 73 69 7a   will be the siz
24de0 65 20 6f 66 20 74 68 65 20 6b 65 79 2e 0a 2a 2a  e of the key..**
24df0 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  .** The caller m
24e00 75 73 74 20 67 75 61 72 61 6e 74 65 65 20 74 68  ust guarantee th
24e10 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  at the cursor is
24e20 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 6e   pointing to a n
24e30 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64  on-NULL.** valid
24e40 20 65 6e 74 72 79 2e 20 20 49 6e 20 6f 74 68 65   entry.  In othe
24e50 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63 61 6c  r words, the cal
24e60 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 6d  ling procedure m
24e70 75 73 74 20 67 75 61 72 61 6e 74 65 65 0a 2a 2a  ust guarantee.**
24e80 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
24e90 20 68 61 73 20 43 75 72 73 6f 72 2e 65 53 74 61   has Cursor.eSta
24ea0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
24eb0 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33  ..*/.u32 sqlite3
24ec0 42 74 72 65 65 50 61 79 6c 6f 61 64 53 69 7a 65  BtreePayloadSize
24ed0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
24ee0 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
24ef0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
24f00 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
24f10 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
24f20 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
24f30 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
24f40 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72  );.  return pCur
24f50 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b  ->info.nPayload;
24f60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
24f70 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
24f80 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  of an overflow p
24f90 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  age in the datab
24fa0 61 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a 2a  ase (parameter.*
24fb0 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66 75  * ovfl), this fu
24fc0 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65  nction finds the
24fd0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
24fe0 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
24ff0 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20   the .** linked 
25000 6c 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77  list of overflow
25010 20 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73 69   pages. If possi
25020 62 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68 65  ble, it uses the
25030 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20   auto-vacuum.** 
25040 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74 61  pointer-map data
25050 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61 64   instead of read
25060 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ing the content 
25070 6f 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f 20  of page ovfl to 
25080 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  do so. .**.** If
25090 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
250a0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
250b0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
250c0 64 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a  d. Otherwise:.**
250d0 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d  .** The page num
250e0 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ber of the next 
250f0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
25100 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
25110 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20   is .** written 
25120 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49  to *pPgnoNext. I
25130 66 20 70 61 67 65 20 6f 76 66 6c 20 69 73 20 74  f page ovfl is t
25140 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20  he last page in 
25150 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c  its linked .** l
25160 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20  ist, *pPgnoNext 
25170 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
25180 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67 65  .**.** If ppPage
25190 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e   is not NULL, an
251a0 64 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  d a reference to
251b0 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a   the MemPage obj
251c0 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ect correspondin
251d0 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d  g.** to page num
251e0 62 65 72 20 70 4f 76 66 6c 20 77 61 73 20 6f 62  ber pOvfl was ob
251f0 74 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70  tained, then *pp
25200 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 70  Page is set to p
25210 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20  oint to that.** 
25220 72 65 66 65 72 65 6e 63 65 2e 20 49 74 20 69 73  reference. It is
25230 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
25240 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
25250 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73  r to call releas
25260 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70  ePage().** on *p
25270 70 50 61 67 65 20 74 6f 20 66 72 65 65 20 74 68  pPage to free th
25280 65 20 72 65 66 65 72 65 6e 63 65 2e 20 49 6e 20  e reference. In 
25290 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61 73  no reference was
252a0 20 6f 62 74 61 69 6e 65 64 20 28 62 65 63 61 75   obtained (becau
252b0 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65  se.** the pointe
252c0 72 2d 6d 61 70 20 77 61 73 20 75 73 65 64 20 74  r-map was used t
252d0 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 76 61 6c  o obtain the val
252e0 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78  ue for *pPgnoNex
252f0 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50  t), then.** *ppP
25300 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 7a 65  age is set to ze
25310 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ro..*/.static in
25320 74 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  t getOverflowPag
25330 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
25340 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt,             
25350 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
25360 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
25370 20 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20   ovfl,          
25380 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
25390 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ent overflow pag
253a0 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 4d 65  e number */.  Me
253b0 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
253c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
253d0 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c  T: MemPage handl
253e0 65 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20  e (may be NULL) 
253f0 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f  */.  Pgno *pPgno
25400 4e 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20  Next            
25410 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f    /* OUT: Next o
25420 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d  verflow page num
25430 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f  ber */.){.  Pgno
25440 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d   next = 0;.  Mem
25450 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b  Page *pPage = 0;
25460 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
25470 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
25480 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
25490 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
254a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50 67   );.  assert(pPg
254b0 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65  noNext);..#ifnde
254c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
254d0 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72  TOVACUUM.  /* Tr
254e0 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65  y to find the ne
254f0 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f  xt page in the o
25500 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73 69  verflow list usi
25510 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f  ng the.  ** auto
25520 76 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d  vacuum pointer-m
25530 61 70 20 70 61 67 65 73 2e 20 47 75 65 73 73 20  ap pages. Guess 
25540 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 70 61  that the next pa
25550 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20  ge in .  ** the 
25560 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69 73  overflow list is
25570 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f 76   page number (ov
25580 66 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20 67  fl+1). If that g
25590 75 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a  uess turns .  **
255a0 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e 67   out to be wrong
255b0 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c  , fall back to l
255c0 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 20  oading the data 
255d0 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75  of page .  ** nu
255e0 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65 74  mber ovfl to det
255f0 65 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74 20  ermine the next 
25600 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a  page number..  *
25610 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74  /.  if( pBt->aut
25620 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50  oVacuum ){.    P
25630 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67  gno pgno;.    Pg
25640 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66 6c  no iGuess = ovfl
25650 2b 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65  +1;.    u8 eType
25660 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54  ;..    while( PT
25670 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
25680 20 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75 65   iGuess) || iGue
25690 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ss==PENDING_BYTE
256a0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
256b0 20 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20      iGuess++;.  
256c0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47 75    }..    if( iGu
256d0 65 73 73 3c 3d 62 74 72 65 65 50 61 67 65 63 6f  ess<=btreePageco
256e0 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  unt(pBt) ){.    
256f0 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
25700 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26 65  (pBt, iGuess, &e
25710 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20  Type, &pgno);.  
25720 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
25730 54 45 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d  TE_OK && eType==
25740 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
25750 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29   && pgno==ovfl )
25760 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20 3d  {.        next =
25770 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20 20   iGuess;.       
25780 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
25790 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
257a0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61  .  }.#endif..  a
257b0 73 73 65 72 74 28 20 6e 65 78 74 3d 3d 30 20 7c  ssert( next==0 |
257c0 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  | rc==SQLITE_DON
257d0 45 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  E );.  if( rc==S
257e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
257f0 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
25800 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50  e(pBt, ovfl, &pP
25810 61 67 65 2c 20 28 70 70 50 61 67 65 3d 3d 30 29  age, (ppPage==0)
25820 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41   ? PAGER_GET_REA
25830 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 20 20  DONLY : 0);.    
25840 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
25850 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d  TE_OK || pPage==
25860 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  0 );.    if( rc=
25870 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
25880 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34 62      next = get4b
25890 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
258a0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
258b0 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78  *pPgnoNext = nex
258c0 74 3b 0a 20 20 69 66 28 20 70 70 50 61 67 65 20  t;.  if( ppPage 
258d0 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d  ){.    *ppPage =
258e0 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b   pPage;.  }else{
258f0 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
25900 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72  (pPage);.  }.  r
25910 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54  eturn (rc==SQLIT
25920 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f  E_DONE ? SQLITE_
25930 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  OK : rc);.}../*.
25940 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f  ** Copy data fro
25950 6d 20 61 20 62 75 66 66 65 72 20 74 6f 20 61 20  m a buffer to a 
25960 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20  page, or from a 
25970 70 61 67 65 20 74 6f 20 61 20 62 75 66 66 65 72  page to a buffer
25980 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64  ..**.** pPayload
25990 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
259a0 20 64 61 74 61 20 73 74 6f 72 65 64 20 6f 6e 20   data stored on 
259b0 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44  database page pD
259c0 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67  bPage..** If arg
259d0 75 6d 65 6e 74 20 65 4f 70 20 69 73 20 66 61 6c  ument eOp is fal
259e0 73 65 2c 20 74 68 65 6e 20 6e 42 79 74 65 20 62  se, then nByte b
259f0 79 74 65 73 20 6f 66 20 64 61 74 61 20 61 72 65  ytes of data are
25a00 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20   copied.** from 
25a10 70 50 61 79 6c 6f 61 64 20 74 6f 20 74 68 65 20  pPayload to the 
25a20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 61  buffer pointed a
25a30 74 20 62 79 20 70 42 75 66 2e 20 49 66 20 65 4f  t by pBuf. If eO
25a40 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68  p is true,.** th
25a50 65 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  en sqlite3PagerW
25a60 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64  rite() is called
25a70 20 6f 6e 20 70 44 62 50 61 67 65 20 61 6e 64 20   on pDbPage and 
25a80 6e 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f  nByte bytes.** o
25a90 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65  f data are copie
25aa0 64 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65  d from the buffe
25ab0 72 20 70 42 75 66 20 74 6f 20 70 50 61 79 6c 6f  r pBuf to pPaylo
25ac0 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  ad..**.** SQLITE
25ad0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
25ae0 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 74 68 65  on success, othe
25af0 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20 63  rwise an error c
25b00 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
25b10 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a  nt copyPayload(.
25b20 20 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64    void *pPayload
25b30 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
25b40 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 64  ointer to page d
25b50 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ata */.  void *p
25b60 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Buf,            
25b70 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
25b80 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74   buffer */.  int
25b90 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20 20   nByte,         
25ba0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
25bb0 20 6f 66 20 62 79 74 65 73 20 74 6f 20 63 6f 70   of bytes to cop
25bc0 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20  y */.  int eOp, 
25bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25be0 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66 72   /* 0 -> copy fr
25bf0 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f  om page, 1 -> co
25c00 70 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20  py to page */.  
25c10 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 20  DbPage *pDbPage 
25c20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
25c30 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61  e containing pPa
25c40 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66  yload */.){.  if
25c50 28 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20  ( eOp ){.    /* 
25c60 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 62  Copy data from b
25c70 75 66 66 65 72 20 74 6f 20 70 61 67 65 20 28 61  uffer to page (a
25c80 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e   write operation
25c90 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20  ) */.    int rc 
25ca0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
25cb0 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ite(pDbPage);.  
25cc0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
25cd0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
25ce0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
25cf0 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61    memcpy(pPayloa
25d00 64 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29 3b  d, pBuf, nByte);
25d10 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
25d20 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   Copy data from 
25d30 70 61 67 65 20 74 6f 20 62 75 66 66 65 72 20 28  page to buffer (
25d40 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e  a read operation
25d50 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28  ) */.    memcpy(
25d60 70 42 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20  pBuf, pPayload, 
25d70 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65  nByte);.  }.  re
25d80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
25d90 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
25da0 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
25db0 6f 20 72 65 61 64 20 6f 72 20 6f 76 65 72 77 72  o read or overwr
25dc0 69 74 65 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f  ite payload info
25dd0 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74  rmation.** for t
25de0 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68  he entry that th
25df0 65 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73  e pCur cursor is
25e00 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 54 68   pointing to. Th
25e10 65 20 65 4f 70 0a 2a 2a 20 61 72 67 75 6d 65 6e  e eOp.** argumen
25e20 74 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  t is interpreted
25e30 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
25e40 2a 2a 20 20 20 30 3a 20 54 68 65 20 6f 70 65 72  **   0: The oper
25e50 61 74 69 6f 6e 20 69 73 20 61 20 72 65 61 64 2e  ation is a read.
25e60 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76   Populate the ov
25e70 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a  erflow cache..**
25e80 20 20 20 31 3a 20 54 68 65 20 6f 70 65 72 61 74     1: The operat
25e90 69 6f 6e 20 69 73 20 61 20 77 72 69 74 65 2e 20  ion is a write. 
25ea0 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65  Populate the ove
25eb0 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 0a  rflow cache..**.
25ec0 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61  ** A total of "a
25ed0 6d 74 22 20 62 79 74 65 73 20 61 72 65 20 72 65  mt" bytes are re
25ee0 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65  ad or written be
25ef0 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73  ginning at "offs
25f00 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20  et"..** Data is 
25f10 72 65 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20  read to or from 
25f20 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66 2e  the buffer pBuf.
25f30 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65  .**.** The conte
25f40 6e 74 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72  nt being read or
25f50 20 77 72 69 74 74 65 6e 20 6d 69 67 68 74 20 61   written might a
25f60 70 70 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69  ppear on the mai
25f70 6e 20 70 61 67 65 0a 2a 2a 20 6f 72 20 62 65 20  n page.** or be 
25f80 73 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e  scattered out on
25f90 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c   multiple overfl
25fa0 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20  ow pages..**.** 
25fb0 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  If the current c
25fc0 75 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65 73  ursor entry uses
25fd0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65   one or more ove
25fe0 72 66 6c 6f 77 20 70 61 67 65 73 0a 2a 2a 20 74  rflow pages.** t
25ff0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
26000 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   allocate space 
26010 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20 70  for and lazily p
26020 6f 70 75 6c 61 74 65 0a 2a 2a 20 74 68 65 20 6f  opulate.** the o
26030 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
26040 74 20 63 61 63 68 65 20 61 72 72 61 79 20 28 42  t cache array (B
26050 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f  tCursor.aOverflo
26060 77 29 2e 20 0a 2a 2a 20 53 75 62 73 65 71 75 65  w). .** Subseque
26070 6e 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69  nt calls use thi
26080 73 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20  s cache to make 
26090 73 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73  seeking to the s
260a0 75 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20 0a  upplied offset .
260b0 2a 2a 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e  ** more efficien
260c0 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e  t..**.** Once an
260d0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
260e0 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65  ist cache has be
260f0 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74  en allocated, it
26100 20 6d 75 73 74 20 62 65 0a 2a 2a 20 69 6e 76 61   must be.** inva
26110 6c 69 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20  lidated if some 
26120 6f 74 68 65 72 20 63 75 72 73 6f 72 20 77 72 69  other cursor wri
26130 74 65 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20  tes to the same 
26140 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20  table, or if.** 
26150 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f  the cursor is mo
26160 76 65 64 20 74 6f 20 61 20 64 69 66 66 65 72 65  ved to a differe
26170 6e 74 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e  nt row. Addition
26180 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61  ally, in auto-va
26190 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68  cuum.** mode, th
261a0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e  e following even
261b0 74 73 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74  ts may invalidat
261c0 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
261d0 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a  ge-list cache..*
261e0 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72  *.**   * An incr
261f0 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a  emental vacuum,.
26200 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20  **   * A commit 
26210 69 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22  in auto_vacuum="
26220 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20  full" mode,.**  
26230 20 2a 20 43 72 65 61 74 69 6e 67 20 61 20 74 61   * Creating a ta
26240 62 6c 65 20 28 6d 61 79 20 72 65 71 75 69 72 65  ble (may require
26250 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66   moving an overf
26260 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74  low page)..*/.st
26270 61 74 69 63 20 69 6e 74 20 61 63 63 65 73 73 50  atic int accessP
26280 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73  ayload(.  BtCurs
26290 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f  or *pCur,      /
262a0 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e  * Cursor pointin
262b0 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65  g to entry to re
262c0 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32  ad from */.  u32
262d0 20 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20   offset,        
262e0 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69    /* Begin readi
262f0 6e 67 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f  ng this far into
26300 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33   payload */.  u3
26310 32 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20  2 amt,          
26320 20 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20     /* Read this 
26330 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20  many bytes */.  
26340 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
26350 42 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68  Buf, /* Write th
26360 65 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69  e bytes into thi
26370 73 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69  s buffer */ .  i
26380 6e 74 20 65 4f 70 20 20 20 20 20 20 20 20 20 20  nt eOp          
26390 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72      /* zero to r
263a0 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f  ead. non-zero to
263b0 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20   write. */.){.  
263c0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
263d0 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72  Payload;.  int r
263e0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
263f0 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20   int iIdx = 0;. 
26400 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
26410 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
26420 43 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20  Cur->iPage]; /* 
26430 42 74 72 65 65 20 70 61 67 65 20 6f 66 20 63 75  Btree page of cu
26440 72 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20  rrent entry */. 
26450 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
26460 20 70 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20   pCur->pBt;     
26470 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26480 42 74 72 65 65 20 74 68 69 73 20 63 75 72 73 6f  Btree this curso
26490 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a  r belongs to */.
264a0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
264b0 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45  RECT_OVERFLOW_RE
264c0 41 44 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  AD.  unsigned ch
264d0 61 72 20 2a 20 63 6f 6e 73 74 20 70 42 75 66 53  ar * const pBufS
264e0 74 61 72 74 20 3d 20 70 42 75 66 3b 20 20 20 20  tart = pBuf;    
264f0 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6f 72 69   /* Start of ori
26500 67 69 6e 61 6c 20 6f 75 74 20 62 75 66 66 65 72  ginal out buffer
26510 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73   */.#endif..  as
26520 73 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20  sert( pPage );. 
26530 20 61 73 73 65 72 74 28 20 65 4f 70 3d 3d 30 20   assert( eOp==0 
26540 7c 7c 20 65 4f 70 3d 3d 31 20 29 3b 0a 20 20 61  || eOp==1 );.  a
26550 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
26560 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
26570 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
26580 43 75 72 2d 3e 69 78 3c 70 50 61 67 65 2d 3e 6e  Cur->ix<pPage->n
26590 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Cell );.  assert
265a0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
265b0 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 67  ex(pCur) );..  g
265c0 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
265d0 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70  ;.  aPayload = p
265e0 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f  Cur->info.pPaylo
265f0 61 64 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66  ad;.  assert( of
26600 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 43 75 72  fset+amt <= pCur
26610 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20  ->info.nPayload 
26620 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61 50  );..  assert( aP
26630 61 79 6c 6f 61 64 20 3e 20 70 50 61 67 65 2d 3e  ayload > pPage->
26640 61 44 61 74 61 20 29 3b 0a 20 20 69 66 28 20 28  aData );.  if( (
26650 75 70 74 72 29 28 61 50 61 79 6c 6f 61 64 20 2d  uptr)(aPayload -
26660 20 70 50 61 67 65 2d 3e 61 44 61 74 61 29 20 3e   pPage->aData) >
26670 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a   (pBt->usableSiz
26680 65 20 2d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  e - pCur->info.n
26690 4c 6f 63 61 6c 29 20 29 7b 0a 20 20 20 20 2f 2a  Local) ){.    /*
266a0 20 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20   Trying to read 
266b0 6f 72 20 77 72 69 74 65 20 70 61 73 74 20 74 68  or write past th
266c0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74  e end of the dat
266d0 61 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 20  a is an error.  
266e0 54 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 64 69  The.    ** condi
266f0 74 69 6f 6e 61 6c 20 61 62 6f 76 65 20 69 73 20  tional above is 
26700 72 65 61 6c 6c 79 3a 0a 20 20 20 20 2a 2a 20 20  really:.    **  
26710 20 20 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72    &aPayload[pCur
26720 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e  ->info.nLocal] >
26730 20 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70   &pPage->aData[p
26740 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 0a  Bt->usableSize].
26750 20 20 20 20 2a 2a 20 62 75 74 20 69 73 20 72 65      ** but is re
26760 63 61 73 74 20 69 6e 74 6f 20 69 74 73 20 63 75  cast into its cu
26770 72 72 65 6e 74 20 66 6f 72 6d 20 74 6f 20 61 76  rrent form to av
26780 6f 69 64 20 69 6e 74 65 67 65 72 20 6f 76 65 72  oid integer over
26790 66 6c 6f 77 20 70 72 6f 62 6c 65 6d 73 0a 20 20  flow problems.  
267a0 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20    */.    return 
267b0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
267c0 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29  GNO(pPage->pgno)
267d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
267e0 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74 20 62  k if data must b
267f0 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74  e read/written t
26800 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65  o/from the btree
26810 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f   page itself. */
26820 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43  .  if( offset<pC
26830 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
26840 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61  ){.    int a = a
26850 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66  mt;.    if( a+of
26860 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e  fset>pCur->info.
26870 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  nLocal ){.      
26880 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  a = pCur->info.n
26890 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a  Local - offset;.
268a0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63      }.    rc = c
268b0 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79  opyPayload(&aPay
268c0 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42  load[offset], pB
268d0 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 50 61 67  uf, a, eOp, pPag
268e0 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
268f0 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20   offset = 0;.   
26900 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20   pBuf += a;.    
26910 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73  amt -= a;.  }els
26920 65 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d  e{.    offset -=
26930 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
26940 61 6c 3b 0a 20 20 7d 0a 0a 0a 20 20 69 66 28 20  al;.  }...  if( 
26950 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
26960 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f   amt>0 ){.    co
26970 6e 73 74 20 75 33 32 20 6f 76 66 6c 53 69 7a 65  nst u32 ovflSize
26980 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
26990 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65  ze - 4;  /* Byte
269a0 73 20 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76  s content per ov
269b0 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50  fl page */.    P
269c0 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20  gno nextPage;.. 
269d0 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65     nextPage = ge
269e0 74 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61 64  t4byte(&aPayload
269f0 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  [pCur->info.nLoc
26a00 61 6c 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  al]);..    /* If
26a10 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 61 4f   the BtCursor.aO
26a20 76 65 72 66 6c 6f 77 5b 5d 20 68 61 73 20 6e 6f  verflow[] has no
26a30 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  t been allocated
26a40 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f  , allocate it no
26a50 77 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  w..    **.    **
26a60 20 54 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d   The aOverflow[]
26a70 20 61 72 72 61 79 20 69 73 20 73 69 7a 65 64 20   array is sized 
26a80 61 74 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72  at one entry for
26a90 20 65 61 63 68 20 6f 76 65 72 66 6c 6f 77 20 70   each overflow p
26aa0 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  age.    ** in th
26ab0 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  e overflow chain
26ac0 2e 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  . The page numbe
26ad0 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f  r of the first o
26ae0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 0a  verflow page is.
26af0 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e      ** stored in
26b00 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 20 65   aOverflow[0], e
26b10 74 63 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30  tc. A value of 0
26b20 20 69 6e 20 74 68 65 20 61 4f 76 65 72 66 6c 6f   in the aOverflo
26b30 77 5b 5d 20 61 72 72 61 79 0a 20 20 20 20 2a 2a  w[] array.    **
26b40 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20   means "not yet 
26b50 6b 6e 6f 77 6e 22 20 28 74 68 65 20 63 61 63 68  known" (the cach
26b60 65 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75  e is lazily popu
26b70 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20  lated)..    */. 
26b80 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75     if( (pCur->cu
26b90 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
26ba0 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 7b 0a 20  lidOvfl)==0 ){. 
26bb0 20 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d       int nOvfl =
26bc0 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61   (pCur->info.nPa
26bd0 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f  yload-pCur->info
26be0 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65  .nLocal+ovflSize
26bf0 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20  -1)/ovflSize;.  
26c00 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 3e 70 43      if( nOvfl>pC
26c10 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20 29  ur->nOvflAlloc )
26c20 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 2a  {.        Pgno *
26c30 61 4e 65 77 20 3d 20 28 50 67 6e 6f 2a 29 73 71  aNew = (Pgno*)sq
26c40 6c 69 74 65 33 52 65 61 6c 6c 6f 63 28 0a 20 20  lite3Realloc(.  
26c50 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
26c60 61 4f 76 65 72 66 6c 6f 77 2c 20 6e 4f 76 66 6c  aOverflow, nOvfl
26c70 2a 32 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29 0a  *2*sizeof(Pgno).
26c80 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
26c90 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29     if( aNew==0 )
26ca0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
26cb0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
26cc0 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 65  BKPT;.        }e
26cd0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
26ce0 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20  Cur->nOvflAlloc 
26cf0 3d 20 6e 4f 76 66 6c 2a 32 3b 0a 20 20 20 20 20  = nOvfl*2;.     
26d00 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72       pCur->aOver
26d10 66 6c 6f 77 20 3d 20 61 4e 65 77 3b 0a 20 20 20  flow = aNew;.   
26d20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
26d30 20 20 20 20 20 6d 65 6d 73 65 74 28 70 43 75 72       memset(pCur
26d40 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 30 2c 20  ->aOverflow, 0, 
26d50 6e 4f 76 66 6c 2a 73 69 7a 65 6f 66 28 50 67 6e  nOvfl*sizeof(Pgn
26d60 6f 29 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  o));.      pCur-
26d70 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
26d80 46 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a 20 20 20  F_ValidOvfl;.   
26d90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
26da0 20 49 66 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   If the overflow
26db0 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
26dc0 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
26dd0 74 65 64 20 61 6e 64 20 74 68 65 0a 20 20 20 20  ted and the.    
26de0 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74    ** entry for t
26df0 68 65 20 66 69 72 73 74 20 72 65 71 75 69 72 65  he first require
26e00 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  d overflow page 
26e10 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20  is valid, skip. 
26e20 20 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79       ** directly
26e30 20 74 6f 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f   to it..      */
26e40 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
26e50 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65  >aOverflow[offse
26e60 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a 20  t/ovflSize] ){. 
26e70 20 20 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f         iIdx = (o
26e80 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b  ffset/ovflSize);
26e90 0a 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67  .        nextPag
26ea0 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  e = pCur->aOverf
26eb0 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20  low[iIdx];.     
26ec0 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66     offset = (off
26ed0 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20  set%ovflSize);. 
26ee0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
26ef0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
26f00 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30  LITE_OK && amt>0
26f10 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6e   );.    while( n
26f20 65 78 74 50 61 67 65 20 29 7b 0a 20 20 20 20 20  extPage ){.     
26f30 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c   /* If required,
26f40 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76   populate the ov
26f50 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
26f60 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20   cache. */.     
26f70 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
26f80 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d  Overflow[iIdx]==
26f90 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0.              
26fa0 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  || pCur->aOverfl
26fb0 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61  ow[iIdx]==nextPa
26fc0 67 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ge.             
26fd0 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
26fe0 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f  ;.      pCur->aO
26ff0 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20  verflow[iIdx] = 
27000 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 20  nextPage;..     
27010 20 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66   if( offset>=ovf
27020 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  lSize ){.       
27030 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65 61   /* The only rea
27040 73 6f 6e 20 74 6f 20 72 65 61 64 20 74 68 69 73  son to read this
27050 20 70 61 67 65 20 69 73 20 74 6f 20 6f 62 74 61   page is to obta
27060 69 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  in the page.    
27070 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f      ** number fo
27080 72 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  r the next page 
27090 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
270a0 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65 0a  chain. The page.
270b0 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20          ** data 
270c0 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e  is not required.
270d0 20 53 6f 20 66 69 72 73 74 20 74 72 79 20 74 6f   So first try to
270e0 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65 72   lookup the over
270f0 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20  flow.        ** 
27100 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2c  page-list cache,
27110 20 69 66 20 61 6e 79 2c 20 74 68 65 6e 20 66 61   if any, then fa
27120 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20 67  ll back to the g
27130 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 29  etOverflowPage()
27140 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  .        ** func
27150 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f  tion..        */
27160 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
27170 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
27180 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  & BTCF_ValidOvfl
27190 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
271a0 72 74 28 20 70 43 75 72 2d 3e 70 42 74 72 65 65  rt( pCur->pBtree
271b0 2d 3e 64 62 3d 3d 70 42 74 2d 3e 64 62 20 29 3b  ->db==pBt->db );
271c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 75  .        if( pCu
271d0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
271e0 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  x+1] ){.        
271f0 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75    nextPage = pCu
27200 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
27210 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65  x+1];.        }e
27220 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
27230 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  c = getOverflowP
27240 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50 61 67  age(pBt, nextPag
27250 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67 65 29  e, 0, &nextPage)
27260 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
27270 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76      offset -= ov
27280 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65  flSize;.      }e
27290 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
272a0 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74 68 69  Need to read thi
272b0 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c 79 2e  s page properly.
272c0 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d   It contains som
272d0 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  e of the.       
272e0 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61 74   ** range of dat
272f0 61 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20  a that is being 
27300 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72  read (eOp==0) or
27310 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21 3d 30   written (eOp!=0
27320 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23 69  )..        */.#i
27330 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45  fdef SQLITE_DIRE
27340 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44  CT_OVERFLOW_READ
27350 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
27360 5f 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 20 20  _file *fd;      
27370 2f 2a 20 46 69 6c 65 20 66 72 6f 6d 20 77 68 69  /* File from whi
27380 63 68 20 74 6f 20 64 6f 20 64 69 72 65 63 74 20  ch to do direct 
27390 6f 76 65 72 66 6c 6f 77 20 72 65 61 64 20 2a 2f  overflow read */
273a0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
273b0 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20  int a = amt;.   
273c0 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66       if( a + off
273d0 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29  set > ovflSize )
273e0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 20 3d 20  {.          a = 
273f0 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65  ovflSize - offse
27400 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 23 69  t;.        }..#i
27410 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45  fdef SQLITE_DIRE
27420 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44  CT_OVERFLOW_READ
27430 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61  .        /* If a
27440 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ll the following
27450 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20 20 20   are true:.     
27460 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
27470 20 20 20 31 29 20 74 68 69 73 20 69 73 20 61 20     1) this is a 
27480 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 2c 20  read operation, 
27490 61 6e 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  and .        ** 
274a0 20 20 32 29 20 64 61 74 61 20 69 73 20 72 65 71    2) data is req
274b0 75 69 72 65 64 20 66 72 6f 6d 20 74 68 65 20 73  uired from the s
274c0 74 61 72 74 20 6f 66 20 74 68 69 73 20 6f 76 65  tart of this ove
274d0 72 66 6c 6f 77 20 70 61 67 65 2c 20 61 6e 64 0a  rflow page, and.
274e0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 33 29 20          **   3) 
274f0 74 68 65 72 65 20 69 73 20 6e 6f 20 6f 70 65 6e  there is no open
27500 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
27510 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20  on, and.        
27520 2a 2a 20 20 20 34 29 20 74 68 65 20 64 61 74 61  **   4) the data
27530 62 61 73 65 20 69 73 20 66 69 6c 65 2d 62 61 63  base is file-bac
27540 6b 65 64 2c 20 61 6e 64 0a 20 20 20 20 20 20 20  ked, and.       
27550 20 2a 2a 20 20 20 35 29 20 74 68 65 20 70 61 67   **   5) the pag
27560 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20  e is not in the 
27570 57 41 4c 20 66 69 6c 65 0a 20 20 20 20 20 20 20  WAL file.       
27580 20 2a 2a 20 20 20 36 29 20 61 74 20 6c 65 61 73   **   6) at leas
27590 74 20 34 20 62 79 74 65 73 20 68 61 76 65 20 61  t 4 bytes have a
275a0 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65 61 64  lready been read
275b0 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74   into the output
275c0 20 62 75 66 66 65 72 20 0a 20 20 20 20 20 20 20   buffer .       
275d0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   **.        ** t
275e0 68 65 6e 20 64 61 74 61 20 63 61 6e 20 62 65 20  hen data can be 
275f0 72 65 61 64 20 64 69 72 65 63 74 6c 79 20 66 72  read directly fr
27600 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
27610 66 69 6c 65 20 69 6e 74 6f 20 74 68 65 0a 20 20  file into the.  
27620 20 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20        ** output 
27630 62 75 66 66 65 72 2c 20 62 79 70 61 73 73 69 6e  buffer, bypassin
27640 67 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  g the page-cache
27650 20 61 6c 74 6f 67 65 74 68 65 72 2e 20 54 68 69   altogether. Thi
27660 73 20 73 70 65 65 64 73 0a 20 20 20 20 20 20 20  s speeds.       
27670 20 2a 2a 20 75 70 20 6c 6f 61 64 69 6e 67 20 6c   ** up loading l
27680 61 72 67 65 20 72 65 63 6f 72 64 73 20 74 68 61  arge records tha
27690 74 20 73 70 61 6e 20 6d 61 6e 79 20 6f 76 65 72  t span many over
276a0 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20 20 20  flow pages..    
276b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
276c0 66 28 20 65 4f 70 3d 3d 30 20 20 20 20 20 20 20  f( eOp==0       
276d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
276e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
276f0 20 20 20 20 20 20 2f 2a 20 28 31 29 20 2a 2f 0a        /* (1) */.
27700 20 20 20 20 20 20 20 20 20 26 26 20 6f 66 66 73           && offs
27710 65 74 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20  et==0           
27720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27740 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (2) */.       
27750 20 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e    && pBt->inTran
27760 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 52  saction==TRANS_R
27770 45 41 44 20 20 20 20 20 20 20 20 20 20 20 20 20  EAD             
27780 20 20 20 20 20 20 20 20 2f 2a 20 28 33 29 20 2a          /* (3) *
27790 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 66  /.         && (f
277a0 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  d = sqlite3Pager
277b0 46 69 6c 65 28 70 42 74 2d 3e 70 50 61 67 65 72  File(pBt->pPager
277c0 29 29 2d 3e 70 4d 65 74 68 6f 64 73 20 20 20 20  ))->pMethods    
277d0 20 2f 2a 20 28 34 29 20 2a 2f 0a 20 20 20 20 20   /* (4) */.     
277e0 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65      && 0==sqlite
277f0 33 50 61 67 65 72 55 73 65 57 61 6c 28 70 42 74  3PagerUseWal(pBt
27800 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61  ->pPager, nextPa
27810 67 65 29 20 20 20 20 20 20 20 2f 2a 20 28 35 29  ge)       /* (5)
27820 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20   */.         && 
27830 26 70 42 75 66 5b 2d 34 5d 3e 3d 70 42 75 66 53  &pBuf[-4]>=pBufS
27840 74 61 72 74 20 20 20 20 20 20 20 20 20 20 20 20  tart            
27850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27860 20 20 20 2f 2a 20 28 36 29 20 2a 2f 0a 20 20 20     /* (6) */.   
27870 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
27880 20 20 75 38 20 61 53 61 76 65 5b 34 5d 3b 0a 20    u8 aSave[4];. 
27890 20 20 20 20 20 20 20 20 20 75 38 20 2a 61 57 72           u8 *aWr
278a0 69 74 65 20 3d 20 26 70 42 75 66 5b 2d 34 5d 3b  ite = &pBuf[-4];
278b0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
278c0 74 28 20 61 57 72 69 74 65 3e 3d 70 42 75 66 53  t( aWrite>=pBufS
278d0 74 61 72 74 20 29 3b 20 20 20 20 20 20 20 20 20  tart );         
278e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
278f0 2f 2a 20 64 75 65 20 74 6f 20 28 36 29 20 2a 2f  /* due to (6) */
27900 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
27910 79 28 61 53 61 76 65 2c 20 61 57 72 69 74 65 2c  y(aSave, aWrite,
27920 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72   4);.          r
27930 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
27940 64 28 66 64 2c 20 61 57 72 69 74 65 2c 20 61 2b  d(fd, aWrite, a+
27950 34 2c 20 28 69 36 34 29 70 42 74 2d 3e 70 61 67  4, (i64)pBt->pag
27960 65 53 69 7a 65 2a 28 6e 65 78 74 50 61 67 65 2d  eSize*(nextPage-
27970 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  1));.          n
27980 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79  extPage = get4by
27990 74 65 28 61 57 72 69 74 65 29 3b 0a 20 20 20 20  te(aWrite);.    
279a0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 57 72        memcpy(aWr
279b0 69 74 65 2c 20 61 53 61 76 65 2c 20 34 29 3b 0a  ite, aSave, 4);.
279c0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65          }else.#e
279d0 6e 64 69 66 0a 0a 20 20 20 20 20 20 20 20 7b 0a  ndif..        {.
279e0 20 20 20 20 20 20 20 20 20 20 44 62 50 61 67 65            DbPage
279f0 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20 20   *pDbPage;.     
27a00 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
27a10 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
27a20 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c  Pager, nextPage,
27a30 20 26 70 44 62 50 61 67 65 2c 0a 20 20 20 20 20   &pDbPage,.     
27a40 20 20 20 20 20 20 20 20 20 28 65 4f 70 3d 3d 30           (eOp==0
27a50 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41   ? PAGER_GET_REA
27a60 44 4f 4e 4c 59 20 3a 20 30 29 0a 20 20 20 20 20  DONLY : 0).     
27a70 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
27a80 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
27a90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
27aa0 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71     aPayload = sq
27ab0 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
27ac0 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  a(pDbPage);.    
27ad0 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
27ae0 20 3d 20 67 65 74 34 62 79 74 65 28 61 50 61 79   = get4byte(aPay
27af0 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20  load);.         
27b00 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c     rc = copyPayl
27b10 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66  oad(&aPayload[of
27b20 66 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61  fset+4], pBuf, a
27b30 2c 20 65 4f 70 2c 20 70 44 62 50 61 67 65 29 3b  , eOp, pDbPage);
27b40 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
27b50 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
27b60 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
27b70 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b       offset = 0;
27b80 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
27b90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
27ba0 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20  mt -= a;.       
27bb0 20 69 66 28 20 61 6d 74 3d 3d 30 20 29 20 72 65   if( amt==0 ) re
27bc0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
27bd0 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20   pBuf += a;.    
27be0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
27bf0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
27c00 69 49 64 78 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  iIdx++;.    }.  
27c10 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
27c20 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20  ITE_OK && amt>0 
27c30 29 7b 0a 20 20 20 20 2f 2a 20 4f 76 65 72 66 6c  ){.    /* Overfl
27c40 6f 77 20 63 68 61 69 6e 20 65 6e 64 73 20 70 72  ow chain ends pr
27c50 65 6d 61 74 75 72 65 6c 79 20 2a 2f 0a 20 20 20  ematurely */.   
27c60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
27c70 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67  ORRUPT_PGNO(pPag
27c80 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  e->pgno);.  }.  
27c90 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
27ca0 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66  .** Read part of
27cb0 20 74 68 65 20 70 61 79 6c 6f 61 64 20 66 6f 72   the payload for
27cc0 20 74 68 65 20 72 6f 77 20 61 74 20 77 68 69 63   the row at whic
27cd0 68 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43  h that cursor pC
27ce0 75 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a  ur is currently.
27cf0 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 22 61  ** pointing.  "a
27d00 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62  mt" bytes will b
27d10 65 20 74 72 61 6e 73 66 65 72 72 65 64 20 69 6e  e transferred in
27d20 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20  to pBuf[].  The 
27d30 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69  transfer.** begi
27d40 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a  ns at "offset"..
27d50 2a 2a 0a 2a 2a 20 70 43 75 72 20 63 61 6e 20 62  **.** pCur can b
27d60 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 69  e pointing to ei
27d70 74 68 65 72 20 61 20 74 61 62 6c 65 20 6f 72 20  ther a table or 
27d80 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e  an index b-tree.
27d90 0a 2a 2a 20 49 66 20 70 6f 69 6e 74 69 6e 67 20  .** If pointing 
27da0 74 6f 20 61 20 74 61 62 6c 65 20 62 74 72 65 65  to a table btree
27db0 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65  , then the conte
27dc0 6e 74 20 73 65 63 74 69 6f 6e 20 69 73 20 72 65  nt section is re
27dd0 61 64 2e 20 20 49 66 0a 2a 2a 20 70 43 75 72 20  ad.  If.** pCur 
27de0 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  is pointing to a
27df0 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 74  n index b-tree t
27e00 68 65 6e 20 74 68 65 20 6b 65 79 20 73 65 63 74  hen the key sect
27e10 69 6f 6e 20 69 73 20 72 65 61 64 2e 0a 2a 2a 0a  ion is read..**.
27e20 2a 2a 20 46 6f 72 20 73 71 6c 69 74 65 33 42 74  ** For sqlite3Bt
27e30 72 65 65 50 61 79 6c 6f 61 64 28 29 2c 20 74 68  reePayload(), th
27e40 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e  e caller must en
27e50 73 75 72 65 20 74 68 61 74 20 70 43 75 72 20 69  sure that pCur i
27e60 73 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f  s pointing.** to
27e70 20 61 20 76 61 6c 69 64 20 72 6f 77 20 69 6e 20   a valid row in 
27e80 74 68 65 20 74 61 62 6c 65 2e 20 20 46 6f 72 20  the table.  For 
27e90 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c  sqlite3BtreePayl
27ea0 6f 61 64 43 68 65 63 6b 65 64 28 29 2c 20 74 68  oadChecked(), th
27eb0 65 0a 2a 2a 20 63 75 72 73 6f 72 20 6d 69 67 68  e.** cursor migh
27ec0 74 20 62 65 20 69 6e 76 61 6c 69 64 20 6f 72 20  t be invalid or 
27ed0 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 62 65  might need to be
27ee0 20 72 65 73 74 6f 72 65 64 20 62 65 66 6f 72 65   restored before
27ef0 20 62 65 69 6e 67 20 72 65 61 64 2e 0a 2a 2a 0a   being read..**.
27f00 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
27f10 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
27f20 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
27f30 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
27f40 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65  .** wrong.  An e
27f50 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
27f60 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22   if "offset+amt"
27f70 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a   is larger than.
27f80 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65  ** the available
27f90 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74   payload..*/.int
27fa0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
27fb0 6c 6f 61 64 28 42 74 43 75 72 73 6f 72 20 2a 70  load(BtCursor *p
27fc0 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c  Cur, u32 offset,
27fd0 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a   u32 amt, void *
27fe0 70 42 75 66 29 7b 0a 20 20 61 73 73 65 72 74 28  pBuf){.  assert(
27ff0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
28000 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
28010 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
28020 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
28030 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
28040 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70  r->iPage>=0 && p
28050 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
28060 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73  ->iPage] );.  as
28070 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3c 70  sert( pCur->ix<p
28080 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
28090 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20  ->iPage]->nCell 
280a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 63 63 65  );.  return acce
280b0 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  ssPayload(pCur, 
280c0 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e  offset, amt, (un
280d0 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75  signed char*)pBu
280e0 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  f, 0);.}../*.** 
280f0 54 68 69 73 20 76 61 72 69 61 6e 74 20 6f 66 20  This variant of 
28100 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c  sqlite3BtreePayl
28110 6f 61 64 28 29 20 77 6f 72 6b 73 20 65 76 65 6e  oad() works even
28120 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 68   if the cursor h
28130 61 73 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65  as not.** in the
28140 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 73 74   CURSOR_VALID st
28150 61 74 65 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79  ate.  It is only
28160 20 75 73 65 64 20 62 79 20 74 68 65 20 73 71 6c   used by the sql
28170 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 29  ite3_blob_read()
28180 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  .** interface..*
28190 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
281a0 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 73  _OMIT_INCRBLOB.s
281b0 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
281c0 4e 4c 49 4e 45 20 69 6e 74 20 61 63 63 65 73 73  NLINE int access
281d0 50 61 79 6c 6f 61 64 43 68 65 63 6b 65 64 28 0a  PayloadChecked(.
281e0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
281f0 2c 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c 0a  ,.  u32 offset,.
28200 20 20 75 33 32 20 61 6d 74 2c 0a 20 20 76 6f 69    u32 amt,.  voi
28210 64 20 2a 70 42 75 66 0a 29 7b 0a 20 20 69 6e 74  d *pBuf.){.  int
28220 20 72 63 3b 0a 20 20 69 66 20 28 20 70 43 75 72   rc;.  if ( pCur
28230 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
28240 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  _INVALID ){.    
28250 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42  return SQLITE_AB
28260 4f 52 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ORT;.  }.  asser
28270 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
28280 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
28290 20 72 63 20 3d 20 62 74 72 65 65 52 65 73 74 6f   rc = btreeResto
282a0 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
282b0 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e  (pCur);.  return
282c0 20 72 63 20 3f 20 72 63 20 3a 20 61 63 63 65 73   rc ? rc : acces
282d0 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f  sPayload(pCur, o
282e0 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66  ffset, amt, pBuf
282f0 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  , 0);.}.int sqli
28300 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 43  te3BtreePayloadC
28310 68 65 63 6b 65 64 28 42 74 43 75 72 73 6f 72 20  hecked(BtCursor 
28320 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65  *pCur, u32 offse
28330 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64  t, u32 amt, void
28340 20 2a 70 42 75 66 29 7b 0a 20 20 69 66 28 20 70   *pBuf){.  if( p
28350 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
28360 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
28370 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
28380 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
28390 29 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) );.    return 
283a0 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
283b0 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c  ur, offset, amt,
283c0 20 70 42 75 66 2c 20 30 29 3b 0a 20 20 7d 65 6c   pBuf, 0);.  }el
283d0 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 61  se{.    return a
283e0 63 63 65 73 73 50 61 79 6c 6f 61 64 43 68 65 63  ccessPayloadChec
283f0 6b 65 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74  ked(pCur, offset
28400 2c 20 61 6d 74 2c 20 70 42 75 66 29 3b 0a 20 20  , amt, pBuf);.  
28410 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  }.}.#endif /* SQ
28420 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
28430 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OB */../*.** Ret
28440 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
28450 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61   payload informa
28460 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e  tion from the en
28470 74 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a  try that the .**
28480 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20   pCur cursor is 
28490 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68  pointing to.  Th
284a0 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20  e pointer is to 
284b0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
284c0 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20 69  .** the key if i
284d0 6e 64 65 78 20 62 74 72 65 65 73 20 28 70 50 61  ndex btrees (pPa
284e0 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30 29 20 61  ge->intKey==0) a
284f0 6e 64 20 69 73 20 74 68 65 20 64 61 74 61 20 66  nd is the data f
28500 6f 72 0a 2a 2a 20 74 61 62 6c 65 20 62 74 72 65  or.** table btre
28510 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65  es (pPage->intKe
28520 79 3d 3d 31 29 2e 20 54 68 65 20 6e 75 6d 62 65  y==1). The numbe
28530 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76  r of bytes of av
28540 61 69 6c 61 62 6c 65 0a 2a 2a 20 6b 65 79 2f 64  ailable.** key/d
28550 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 69  ata is written i
28560 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a  nto *pAmt.  If *
28570 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68  pAmt==0, then th
28580 65 20 76 61 6c 75 65 0a 2a 2a 20 72 65 74 75 72  e value.** retur
28590 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  ned will not be 
285a0 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e  a valid pointer.
285b0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
285c0 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  ine is an optimi
285d0 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63  zation.  It is c
285e0 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e  ommon for the en
285f0 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20  tire key.** and 
28600 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74  data to fit on t
28610 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e  he local page an
28620 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62  d for there to b
28630 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a  e no overflow.**
28640 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68   pages.  When th
28650 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72  at is so, this r
28660 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73  outine can be us
28670 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ed to access the
28680 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61  .** key and data
28690 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20   without making 
286a0 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65 20  a copy.  If the 
286b0 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 20  key and/or data 
286c0 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f  spills.** onto o
286d0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74  verflow pages, t
286e0 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61  hen accessPayloa
286f0 64 28 29 20 6d 75 73 74 20 62 65 20 75 73 65 64  d() must be used
28700 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a   to reassemble.*
28710 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61 20 61  * the key/data a
28720 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74 6f 20  nd copy it into 
28730 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62  a preallocated b
28740 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  uffer..**.** The
28750 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
28760 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  d by this routin
28770 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79  e looks directly
28780 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 64   into the cached
28790 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68 65 20  .** page of the 
287a0 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 64  database.  The d
287b0 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e 67 65  ata might change
287c0 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e 65 78   or move the nex
287d0 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74  t time.** any bt
287e0 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73 20 63  ree routine is c
287f0 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  alled..*/.static
28800 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 66 65 74   const void *fet
28810 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43  chPayload(.  BtC
28820 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
28830 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e    /* Cursor poin
28840 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f  ting to entry to
28850 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
28860 75 33 32 20 2a 70 41 6d 74 20 20 20 20 20 20 20  u32 *pAmt       
28870 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
28880 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69  e number of avai
28890 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65 72 65  lable bytes here
288a0 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 61 6d 74   */.){.  u32 amt
288b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
288c0 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 50 61  !=0 && pCur->iPa
288d0 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61  ge>=0 && pCur->a
288e0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
288f0 65 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e]);.  assert( p
28900 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
28910 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
28920 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
28930 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
28940 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
28950 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
28960 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
28970 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
28980 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3c 70  sert( pCur->ix<p
28990 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
289a0 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20  ->iPage]->nCell 
289b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
289c0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3e 30 20  r->info.nSize>0 
289d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
289e0 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  r->info.pPayload
289f0 3e 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  >pCur->apPage[pC
28a00 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44 61 74  ur->iPage]->aDat
28a10 61 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  a || CORRUPT_DB 
28a20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
28a30 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  r->info.pPayload
28a40 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  <pCur->apPage[pC
28a50 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44 61 74  ur->iPage]->aDat
28a60 61 45 6e 64 20 7c 7c 43 4f 52 52 55 50 54 5f 44  aEnd ||CORRUPT_D
28a70 42 29 3b 0a 20 20 61 6d 74 20 3d 20 28 69 6e 74  B);.  amt = (int
28a80 29 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  )(pCur->apPage[p
28a90 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44 61  Cur->iPage]->aDa
28aa0 74 61 45 6e 64 20 2d 20 70 43 75 72 2d 3e 69 6e  taEnd - pCur->in
28ab0 66 6f 2e 70 50 61 79 6c 6f 61 64 29 3b 0a 20 20  fo.pPayload);.  
28ac0 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
28ad0 4c 6f 63 61 6c 3c 61 6d 74 20 29 20 61 6d 74 20  Local<amt ) amt 
28ae0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
28af0 63 61 6c 3b 0a 20 20 2a 70 41 6d 74 20 3d 20 61  cal;.  *pAmt = a
28b00 6d 74 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f  mt;.  return (vo
28b10 69 64 2a 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  id*)pCur->info.p
28b20 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a  Payload;.}.../*.
28b30 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74 72 79  ** For the entry
28b40 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 75   that cursor pCu
28b50 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72  r is point to, r
28b60 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79  eturn as.** many
28b70 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65   bytes of the ke
28b80 79 20 6f 72 20 64 61 74 61 20 61 73 20 61 72 65  y or data as are
28b90 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68   available on th
28ba0 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65  e local.** b-tre
28bb0 65 20 70 61 67 65 2e 20 20 57 72 69 74 65 20 74  e page.  Write t
28bc0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61  he number of ava
28bd0 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69 6e 74  ilable bytes int
28be0 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54  o *pAmt..**.** T
28bf0 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
28c00 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c  ned is ephemeral
28c10 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20  .  The key/data 
28c20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62  may move.** or b
28c30 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74  e destroyed on t
28c40 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20  he next call to 
28c50 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e  any Btree routin
28c60 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  e,.** including 
28c70 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72  calls from other
28c80 20 74 68 72 65 61 64 73 20 61 67 61 69 6e 73 74   threads against
28c90 20 74 68 65 20 73 61 6d 65 20 63 61 63 68 65 2e   the same cache.
28ca0 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75 74  .** Hence, a mut
28cb0 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72  ex on the BtShar
28cc0 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c  ed should be hel
28cd0 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69  d prior to calli
28ce0 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  ng.** this routi
28cf0 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20  ne..**.** These 
28d00 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73 65 64  routines is used
28d10 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20 61 63   to get quick ac
28d20 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e 64 20  cess to key and 
28d30 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63  data.** in the c
28d40 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
28d50 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   no overflow pag
28d60 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a  es are used..*/.
28d70 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69  const void *sqli
28d80 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 46  te3BtreePayloadF
28d90 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70  etch(BtCursor *p
28da0 43 75 72 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b  Cur, u32 *pAmt){
28db0 0a 20 20 72 65 74 75 72 6e 20 66 65 74 63 68 50  .  return fetchP
28dc0 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d  ayload(pCur, pAm
28dd0 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  t);.}.../*.** Mo
28de0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
28df0 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c  wn to a new chil
28e00 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65 77  d page.  The new
28e10 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69 73  Pgno argument is
28e20 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d   the.** page num
28e30 62 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ber of the child
28e40 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f   page to move to
28e50 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
28e60 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51  ction returns SQ
28e70 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20  LITE_CORRUPT if 
28e80 74 68 65 20 70 61 67 65 2d 68 65 61 64 65 72 20  the page-header 
28e90 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 0a 2a  flags field of.*
28ea0 2a 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20  * the new child 
28eb0 70 61 67 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61  page does not ma
28ec0 74 63 68 20 74 68 65 20 66 6c 61 67 73 20 66 69  tch the flags fi
28ed0 65 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e  eld of the paren
28ee0 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e  t (i.e..** if an
28ef0 20 69 6e 74 6b 65 79 20 70 61 67 65 20 61 70 70   intkey page app
28f00 65 61 72 73 20 74 6f 20 62 65 20 74 68 65 20 70  ears to be the p
28f10 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d 69  arent of a non-i
28f20 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f 72 0a 2a  ntkey page, or.*
28f30 2a 20 76 69 63 65 2d 76 65 72 73 61 29 2e 0a 2a  * vice-versa)..*
28f40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
28f50 65 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f  eToChild(BtCurso
28f60 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77  r *pCur, u32 new
28f70 50 67 6e 6f 29 7b 0a 20 20 42 74 53 68 61 72 65  Pgno){.  BtShare
28f80 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
28f90 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  Bt;..  assert( c
28fa0 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
28fb0 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
28fc0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
28fd0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
28fe0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
28ff0 72 2d 3e 69 50 61 67 65 3c 42 54 43 55 52 53 4f  r->iPage<BTCURSO
29000 52 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a 20  R_MAX_DEPTH );. 
29010 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
29020 50 61 67 65 3e 3d 30 20 29 3b 0a 20 20 69 66 28  Page>=0 );.  if(
29030 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 28 42   pCur->iPage>=(B
29040 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54  TCURSOR_MAX_DEPT
29050 48 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75  H-1) ){.    retu
29060 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
29070 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 43  T_BKPT;.  }.  pC
29080 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
29090 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46   0;.  pCur->curF
290a0 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56  lags &= ~(BTCF_V
290b0 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61  alidNKey|BTCF_Va
290c0 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 70 43 75 72  lidOvfl);.  pCur
290d0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
290e0 61 67 65 2b 2b 5d 20 3d 20 70 43 75 72 2d 3e 69  age++] = pCur->i
290f0 78 3b 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d 20  x;.  pCur->ix = 
29100 30 3b 0a 20 20 72 65 74 75 72 6e 20 67 65 74 41  0;.  return getA
29110 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
29120 6e 65 77 50 67 6e 6f 2c 20 26 70 43 75 72 2d 3e  newPgno, &pCur->
29130 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
29140 67 65 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ge],.           
29150 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 75               pCu
29160 72 2c 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65  r, pCur->curPage
29170 72 46 6c 61 67 73 29 3b 0a 7d 0a 0a 23 69 66 64  rFlags);.}..#ifd
29180 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
29190 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61 72 65  /*.** Page pPare
291a0 6e 74 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61  nt is an interna
291b0 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65  l (non-leaf) tre
291c0 65 20 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e  e page. This fun
291d0 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74  ction .** assert
291e0 73 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62  s that page numb
291f0 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65  er iChild is the
29200 20 6c 65 66 74 2d 63 68 69 6c 64 20 69 66 20 74   left-child if t
29210 68 65 20 69 49 64 78 27 74 68 0a 2a 2a 20 63 65  he iIdx'th.** ce
29220 6c 6c 20 69 6e 20 70 61 67 65 20 70 50 61 72 65  ll in page pPare
29230 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49 64 78 20  nt. Or, if iIdx 
29240 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  is equal to the 
29250 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a  total number of.
29260 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72  ** cells in pPar
29270 65 6e 74 2c 20 74 68 61 74 20 70 61 67 65 20 6e  ent, that page n
29280 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20  umber iChild is 
29290 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
292a0 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a  of.** the page..
292b0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
292c0 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
292d0 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e  (MemPage *pParen
292e0 74 2c 20 69 6e 74 20 69 49 64 78 2c 20 50 67 6e  t, int iIdx, Pgn
292f0 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20 69 66 28  o iChild){.  if(
29300 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65   CORRUPT_DB ) re
29310 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f  turn;  /* The co
29320 6e 64 69 74 69 6f 6e 73 20 74 65 73 74 65 64 20  nditions tested 
29330 62 65 6c 6f 77 20 6d 69 67 68 74 20 6e 6f 74 20  below might not 
29340 62 65 20 74 72 75 65 0a 20 20 20 20 20 20 20 20  be true.        
29350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29360 20 20 20 20 2a 2a 20 69 6e 20 61 20 63 6f 72 72      ** in a corr
29370 75 70 74 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  upt database */.
29380 20 20 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d    assert( iIdx<=
29390 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29  pParent->nCell )
293a0 3b 0a 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50  ;.  if( iIdx==pP
293b0 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  arent->nCell ){.
293c0 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34      assert( get4
293d0 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
293e0 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
293f0 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68  rOffset+8])==iCh
29400 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ild );.  }else{.
29410 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34      assert( get4
29420 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
29430 61 72 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69  arent, iIdx))==i
29440 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23  Child );.  }.}.#
29450 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 61  else.#  define a
29460 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
29470 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a  (x,y,z) .#endif.
29480 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
29490 63 75 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65  cursor up to the
294a0 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a   parent page..**
294b0 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73  .** pCur->idx is
294c0 20 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c   set to the cell
294d0 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74   index that cont
294e0 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72  ains the pointer
294f0 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20  .** to the page 
29500 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72  we are coming fr
29510 6f 6d 2e 20 20 49 66 20 77 65 20 61 72 65 20 63  om.  If we are c
29520 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a  oming from the.*
29530 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69  * right-most chi
29540 6c 64 20 70 61 67 65 20 74 68 65 6e 20 70 43 75  ld page then pCu
29550 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f  r->idx is set to
29560 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a   one more than.*
29570 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20 63 65  * the largest ce
29580 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  ll index..*/.sta
29590 74 69 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50  tic void moveToP
295a0 61 72 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a  arent(BtCursor *
295b0 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
295c0 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
295d0 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
295e0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
295f0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
29600 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
29610 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a  Cur->iPage>0 );.
29620 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
29630 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
29640 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 50  ge] );.  assertP
29650 61 72 65 6e 74 49 6e 64 65 78 28 0a 20 20 20 20  arentIndex(.    
29660 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
29670 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20  r->iPage-1], .  
29680 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
29690 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20  ur->iPage-1], . 
296a0 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b     pCur->apPage[
296b0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67  pCur->iPage]->pg
296c0 6e 6f 0a 20 20 29 3b 0a 20 20 74 65 73 74 63 61  no.  );.  testca
296d0 73 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  se( pCur->aiIdx[
296e0 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 20 3e  pCur->iPage-1] >
296f0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
29700 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2d 3e 6e 43  ur->iPage-1]->nC
29710 65 6c 6c 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69  ell );.  pCur->i
29720 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
29730 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
29740 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e  &= ~(BTCF_ValidN
29750 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
29760 66 6c 29 3b 0a 20 20 70 43 75 72 2d 3e 69 78 20  fl);.  pCur->ix 
29770 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  = pCur->aiIdx[pC
29780 75 72 2d 3e 69 50 61 67 65 2d 31 5d 3b 0a 20 20  ur->iPage-1];.  
29790 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75  releasePageNotNu
297a0 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ll(pCur->apPage[
297b0 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b  pCur->iPage--]);
297c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
297d0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69  he cursor to poi
297e0 6e 74 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70  nt to the root p
297f0 61 67 65 20 6f 66 20 69 74 73 20 62 2d 74 72 65  age of its b-tre
29800 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  e structure..**.
29810 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  ** If the table 
29820 68 61 73 20 61 20 76 69 72 74 75 61 6c 20 72 6f  has a virtual ro
29830 6f 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ot page, then th
29840 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65  e cursor is move
29850 64 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f  d to point.** to
29860 20 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f   the virtual roo
29870 74 20 70 61 67 65 20 69 6e 73 74 65 61 64 20 6f  t page instead o
29880 66 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f  f the actual roo
29890 74 20 70 61 67 65 2e 20 41 20 74 61 62 6c 65 20  t page. A table 
298a0 68 61 73 20 61 0a 2a 2a 20 76 69 72 74 75 61 6c  has a.** virtual
298b0 20 72 6f 6f 74 20 70 61 67 65 20 77 68 65 6e 20   root page when 
298c0 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20  the actual root 
298d0 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  page contains no
298e0 20 63 65 6c 6c 73 20 61 6e 64 20 61 20 0a 2a 2a   cells and a .**
298f0 20 73 69 6e 67 6c 65 20 63 68 69 6c 64 20 70 61   single child pa
29900 67 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c  ge. This can onl
29910 79 20 68 61 70 70 65 6e 20 77 69 74 68 20 74 68  y happen with th
29920 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 61  e table rooted a
29930 74 20 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20  t page 1..**.** 
29940 49 66 20 74 68 65 20 62 2d 74 72 65 65 20 73 74  If the b-tree st
29950 72 75 63 74 75 72 65 20 69 73 20 65 6d 70 74 79  ructure is empty
29960 2c 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61  , the cursor sta
29970 74 65 20 69 73 20 73 65 74 20 74 6f 20 0a 2a 2a  te is set to .**
29980 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 2e   CURSOR_INVALID.
29990 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
299a0 63 75 72 73 6f 72 20 69 73 20 73 65 74 20 74 6f  cursor is set to
299b0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69   point to the fi
299c0 72 73 74 0a 2a 2a 20 63 65 6c 6c 20 6c 6f 63 61  rst.** cell loca
299d0 74 65 64 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20  ted on the root 
299e0 28 6f 72 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  (or virtual root
299f0 29 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 63  ) page and the c
29a00 75 72 73 6f 72 20 73 74 61 74 65 0a 2a 2a 20 69  ursor state.** i
29a10 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f  s set to CURSOR_
29a20 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  VALID..**.** If 
29a30 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
29a40 74 75 72 6e 73 20 73 75 63 63 65 73 73 66 75 6c  turns successful
29a50 6c 79 2c 20 69 74 20 6d 61 79 20 62 65 20 61 73  ly, it may be as
29a60 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 0a 2a  sumed that the.*
29a70 2a 20 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c  * page-header fl
29a80 61 67 73 20 69 6e 64 69 63 61 74 65 20 74 68 61  ags indicate tha
29a90 74 20 74 68 65 20 5b 76 69 72 74 75 61 6c 5d 20  t the [virtual] 
29aa0 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 74 68 65  root-page is the
29ab0 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 6b 69   expected .** ki
29ac0 6e 64 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67  nd of b-tree pag
29ad0 65 20 28 69 2e 65 2e 20 69 66 20 77 68 65 6e 20  e (i.e. if when 
29ae0 6f 70 65 6e 69 6e 67 20 74 68 65 20 63 75 72 73  opening the curs
29af0 6f 72 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69  or the caller di
29b00 64 20 6e 6f 74 0a 2a 2a 20 73 70 65 63 69 66 79  d not.** specify
29b10 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63   a KeyInfo struc
29b20 74 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62  ture the flags b
29b30 79 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78  yte is set to 0x
29b40 30 35 20 6f 72 20 30 78 30 44 2c 0a 2a 2a 20 69  05 or 0x0D,.** i
29b50 6e 64 69 63 61 74 69 6e 67 20 61 20 74 61 62 6c  ndicating a tabl
29b60 65 20 62 2d 74 72 65 65 2c 20 6f 72 20 69 66 20  e b-tree, or if 
29b70 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20 73  the caller did s
29b80 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f  pecify a KeyInfo
29b90 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74   .** structure t
29ba0 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 69 73  he flags byte is
29bb0 20 73 65 74 20 74 6f 20 30 78 30 32 20 6f 72 20   set to 0x02 or 
29bc0 30 78 30 41 2c 20 69 6e 64 69 63 61 74 69 6e 67  0x0A, indicating
29bd0 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 62 2d 74   an index.** b-t
29be0 72 65 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ree)..*/.static 
29bf0 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42  int moveToRoot(B
29c00 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
29c10 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74    MemPage *pRoot
29c20 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
29c30 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
29c40 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
29c50 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
29c60 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
29c70 49 4e 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52  INVALID < CURSOR
29c80 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
29c90 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
29ca0 5f 56 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f  _VALID   < CURSO
29cb0 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
29cc0 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
29cd0 52 5f 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53  R_FAULT   > CURS
29ce0 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
29cf0 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
29d00 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
29d10 55 49 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20  UIRESEEK ){.    
29d20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
29d30 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  ==CURSOR_FAULT )
29d40 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
29d50 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d  pCur->skipNext!=
29d60 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
29d70 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e     return pCur->
29d80 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  skipNext;.    }.
29d90 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
29da0 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75 72  ClearCursor(pCur
29db0 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 43  );.  }..  if( pC
29dc0 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a  ur->iPage>=0 ){.
29dd0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50      if( pCur->iP
29de0 61 67 65 20 29 7b 0a 20 20 20 20 20 20 64 6f 7b  age ){.      do{
29df0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
29e00 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
29e10 75 72 2d 3e 69 50 61 67 65 5d 21 3d 30 20 29 3b  ur->iPage]!=0 );
29e20 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
29e30 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72  PageNotNull(pCur
29e40 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
29e50 50 61 67 65 2d 2d 5d 29 3b 0a 20 20 20 20 20 20  Page--]);.      
29e60 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 50  }while( pCur->iP
29e70 61 67 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  age);.      goto
29e80 20 73 6b 69 70 5f 69 6e 69 74 3b 0a 20 20 20 20   skip_init;.    
29e90 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43  }.  }else if( pC
29ea0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
29eb0 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  ){.    pCur->eSt
29ec0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
29ed0 41 4c 49 44 3b 0a 20 20 20 20 72 65 74 75 72 6e  ALID;.    return
29ee0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
29ef0 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
29f00 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 28 2d   pCur->iPage==(-
29f10 31 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 67  1) );.    rc = g
29f20 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 43  etAndInitPage(pC
29f30 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 2c  ur->pBtree->pBt,
29f40 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
29f50 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30   &pCur->apPage[0
29f60 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ],.             
29f70 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 70 43             0, pC
29f80 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67  ur->curPagerFlag
29f90 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  s);.    if( rc!=
29fa0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29fb0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
29fc0 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
29fd0 3b 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  ;.       return 
29fe0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  rc;.    }.    pC
29ff0 75 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20  ur->iPage = 0;. 
2a000 20 20 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b     pCur->curIntK
2a010 65 79 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ey = pCur->apPag
2a020 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3b 0a 20 20  e[0]->intKey;.  
2a030 7d 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72  }.  pRoot = pCur
2a040 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 61  ->apPage[0];.  a
2a050 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67  ssert( pRoot->pg
2a060 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  no==pCur->pgnoRo
2a070 6f 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  ot );..  /* If p
2a080 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 69 73  Cur->pKeyInfo is
2a090 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
2a0a0 74 68 65 20 63 61 6c 6c 65 72 20 74 68 61 74 20  the caller that 
2a0b0 6f 70 65 6e 65 64 20 74 68 69 73 20 63 75 72 73  opened this curs
2a0c0 6f 72 0a 20 20 2a 2a 20 65 78 70 65 63 74 65 64  or.  ** expected
2a0d0 20 74 6f 20 6f 70 65 6e 20 69 74 20 6f 6e 20 61   to open it on a
2a0e0 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 20  n index b-tree. 
2a0f0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 4b  Otherwise, if pK
2a100 65 79 49 6e 66 6f 20 69 73 0a 20 20 2a 2a 20 4e  eyInfo is.  ** N
2a110 55 4c 4c 2c 20 74 68 65 20 63 61 6c 6c 65 72 20  ULL, the caller 
2a120 65 78 70 65 63 74 73 20 61 20 74 61 62 6c 65 20  expects a table 
2a130 62 2d 74 72 65 65 2e 20 49 66 20 74 68 69 73 20  b-tree. If this 
2a140 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2c  is not the case,
2a150 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20  .  ** return an 
2a160 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65  SQLITE_CORRUPT e
2a170 72 72 6f 72 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  rror. .  **.  **
2a180 20 45 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e   Earlier version
2a190 73 20 6f 66 20 53 51 4c 69 74 65 20 61 73 73 75  s of SQLite assu
2a1a0 6d 65 64 20 74 68 61 74 20 74 68 69 73 20 74 65  med that this te
2a1b0 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20 66 61 69  st could not fai
2a1c0 6c 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 72 6f  l.  ** if the ro
2a1d0 6f 74 20 70 61 67 65 20 77 61 73 20 61 6c 72 65  ot page was alre
2a1e0 61 64 79 20 6c 6f 61 64 65 64 20 77 68 65 6e 20  ady loaded when 
2a1f0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61  this function wa
2a200 73 20 63 61 6c 6c 65 64 20 28 69 2e 65 2e 0a 20  s called (i.e.. 
2a210 20 2a 2a 20 69 66 20 70 43 75 72 2d 3e 69 50 61   ** if pCur->iPa
2a220 67 65 3e 3d 30 29 2e 20 42 75 74 20 74 68 69 73  ge>=0). But this
2a230 20 69 73 20 6e 6f 74 20 73 6f 20 69 66 20 74 68   is not so if th
2a240 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6f  e database is co
2a250 72 72 75 70 74 65 64 20 0a 20 20 2a 2a 20 69 6e  rrupted .  ** in
2a260 20 73 75 63 68 20 61 20 77 61 79 20 74 68 61 74   such a way that
2a270 20 70 61 67 65 20 70 52 6f 6f 74 20 69 73 20 6c   page pRoot is l
2a280 69 6e 6b 65 64 20 69 6e 74 6f 20 61 20 73 65 63  inked into a sec
2a290 6f 6e 64 20 62 2d 74 72 65 65 20 74 61 62 6c 65  ond b-tree table
2a2a0 20 0a 20 20 2a 2a 20 28 6f 72 20 74 68 65 20 66   .  ** (or the f
2a2b0 72 65 65 6c 69 73 74 29 2e 20 20 2a 2f 0a 20 20  reelist).  */.  
2a2c0 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69  assert( pRoot->i
2a2d0 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20 70 52 6f 6f  ntKey==1 || pRoo
2a2e0 74 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a  t->intKey==0 );.
2a2f0 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 69 73 49    if( pRoot->isI
2a300 6e 69 74 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d  nit==0 || (pCur-
2a310 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 21 3d 70  >pKeyInfo==0)!=p
2a320 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Root->intKey ){.
2a330 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2a340 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70  E_CORRUPT_PGNO(p
2a350 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2a360 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e 6f 29 3b  ->iPage]->pgno);
2a370 0a 20 20 7d 0a 0a 73 6b 69 70 5f 69 6e 69 74 3a  .  }..skip_init:
2a380 20 20 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d 20    .  pCur->ix = 
2a390 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  0;.  pCur->info.
2a3a0 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
2a3b0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
2a3c0 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43  (BTCF_AtLast|BTC
2a3d0 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46  F_ValidNKey|BTCF
2a3e0 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 0a 20 20  _ValidOvfl);..  
2a3f0 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 61 70  pRoot = pCur->ap
2a400 50 61 67 65 5b 30 5d 3b 0a 20 20 69 66 28 20 70  Page[0];.  if( p
2a410 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b  Root->nCell>0 ){
2a420 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
2a430 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  e = CURSOR_VALID
2a440 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70  ;.  }else if( !p
2a450 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Root->leaf ){.  
2a460 20 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a    Pgno subpage;.
2a470 20 20 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 70      if( pRoot->p
2a480 67 6e 6f 21 3d 31 20 29 20 72 65 74 75 72 6e 20  gno!=1 ) return 
2a490 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2a4a0 4b 50 54 3b 0a 20 20 20 20 73 75 62 70 61 67 65  KPT;.    subpage
2a4b0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 52 6f   = get4byte(&pRo
2a4c0 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d  ot->aData[pRoot-
2a4d0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
2a4e0 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
2a4f0 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b   = CURSOR_VALID;
2a500 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
2a510 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70  Child(pCur, subp
2a520 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  age);.  }else{. 
2a530 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
2a540 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
2a550 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2a560 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  c;.}../*.** Move
2a570 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
2a580 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73   to the left-mos
2a590 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e  t leaf entry ben
2a5a0 65 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72  eath the.** entr
2a5b0 79 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73  y to which it is
2a5c0 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
2a5d0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c  ing..**.** The l
2a5e0 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73  eft-most leaf is
2a5f0 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68   the one with th
2a600 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d  e smallest key -
2a610 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e   the first.** in
2a620 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
2a630 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2a640 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42  moveToLeftmost(B
2a650 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
2a660 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69    Pgno pgno;.  i
2a670 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2a680 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  K;.  MemPage *pP
2a690 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
2a6a0 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
2a6b0 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
2a6c0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
2a6d0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
2a6e0 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   );.  while( rc=
2a6f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28  =SQLITE_OK && !(
2a700 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
2a710 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2a720 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ])->leaf ){.    
2a730 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78  assert( pCur->ix
2a740 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
2a750 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34  .    pgno = get4
2a760 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
2a770 61 67 65 2c 20 70 43 75 72 2d 3e 69 78 29 29 3b  age, pCur->ix));
2a780 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
2a790 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f  Child(pCur, pgno
2a7a0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2a7b0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  rc;.}../*.** Mov
2a7c0 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77  e the cursor dow
2a7d0 6e 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  n to the right-m
2a7e0 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62  ost leaf entry b
2a7f0 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 70 61  eneath the.** pa
2a800 67 65 20 74 6f 20 77 68 69 63 68 20 69 74 20 69  ge to which it i
2a810 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
2a820 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74 68  ting.  Notice th
2a830 65 20 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20  e difference.** 
2a840 62 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65  between moveToLe
2a850 66 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76  ftmost() and mov
2a860 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e 20  eToRightmost(). 
2a870 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
2a880 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 6c  ).** finds the l
2a890 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62  eft-most entry b
2a8a0 65 6e 65 61 74 68 20 74 68 65 20 2a 65 6e 74 72  eneath the *entr
2a8b0 79 2a 20 77 68 65 72 65 61 73 20 6d 6f 76 65 54  y* whereas moveT
2a8c0 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20  oRightmost().** 
2a8d0 66 69 6e 64 73 20 74 68 65 20 72 69 67 68 74 2d  finds the right-
2a8e0 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61  most entry benea
2a8f0 74 68 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a  th the *page*..*
2a900 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 6d  *.** The right-m
2a910 6f 73 74 20 65 6e 74 72 79 20 69 73 20 74 68 65  ost entry is the
2a920 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6c 61   one with the la
2a930 72 67 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20  rgest key - the 
2a940 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61  last.** key in a
2a950 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a  scending order..
2a960 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
2a970 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42 74  veToRightmost(Bt
2a980 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
2a990 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e   Pgno pgno;.  in
2a9a0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2a9b0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
2a9c0 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ge = 0;..  asser
2a9d0 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
2a9e0 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
2a9f0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
2aa00 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
2aa10 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  LID );.  while( 
2aa20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  !(pPage = pCur->
2aa30 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2aa40 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  ge])->leaf ){.  
2aa50 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
2aa60 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
2aa70 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
2aa80 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  +8]);.    pCur->
2aa90 69 78 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ix = pPage->nCel
2aaa0 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  l;.    rc = move
2aab0 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67  ToChild(pCur, pg
2aac0 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  no);.    if( rc 
2aad0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
2aae0 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 70 50  .  pCur->ix = pP
2aaf0 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20  age->nCell-1;.  
2ab00 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e  assert( pCur->in
2ab10 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20  fo.nSize==0 );. 
2ab20 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e   assert( (pCur->
2ab30 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
2ab40 56 61 6c 69 64 4e 4b 65 79 29 3d 3d 30 20 29 3b  ValidNKey)==0 );
2ab50 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2ab60 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20  _OK;.}../* Move 
2ab70 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
2ab80 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  e first entry in
2ab90 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
2aba0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
2abb0 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65   on success.  Se
2abc0 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20  t *pRes to 0 if 
2abd0 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61  the cursor actua
2abe0 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f  lly points to so
2abf0 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65  mething.** or se
2ac00 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20  t *pRes to 1 if 
2ac10 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
2ac20 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
2ac30 65 33 42 74 72 65 65 46 69 72 73 74 28 42 74 43  e3BtreeFirst(BtC
2ac40 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
2ac50 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
2ac60 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  c;..  assert( cu
2ac70 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2ac80 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2ac90 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2aca0 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
2acb0 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
2acc0 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  );.  rc = moveTo
2acd0 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66  Root(pCur);.  if
2ace0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2acf0 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
2ad00 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2ad10 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  INVALID ){.     
2ad20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
2ad30 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43  gnoRoot==0 || pC
2ad40 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2ad50 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d  >iPage]->nCell==
2ad60 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 );.      *pRes
2ad70 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
2ad80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2ad90 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2ada0 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e  ->iPage]->nCell>
2adb0 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 );.      *pRes
2adc0 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
2add0 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
2ade0 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pCur);.    }.  }
2adf0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2ae00 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  ./* Move the cur
2ae10 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20  sor to the last 
2ae20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
2ae30 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
2ae40 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
2ae50 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20  ess.  Set *pRes 
2ae60 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73  to 0 if the curs
2ae70 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e  or actually poin
2ae80 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  ts to something.
2ae90 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20  ** or set *pRes 
2aea0 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c  to 1 if the tabl
2aeb0 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
2aec0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  nt sqlite3BtreeL
2aed0 61 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ast(BtCursor *pC
2aee0 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
2aef0 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73    int rc;. .  as
2af00 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
2af10 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
2af20 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2af30 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2af40 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
2af50 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a  >mutex) );..  /*
2af60 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 61   If the cursor a
2af70 6c 72 65 61 64 79 20 70 6f 69 6e 74 73 20 74 6f  lready points to
2af80 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2c   the last entry,
2af90 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   this is a no-op
2afa0 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55 52 53 4f  . */.  if( CURSO
2afb0 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  R_VALID==pCur->e
2afc0 53 74 61 74 65 20 26 26 20 28 70 43 75 72 2d 3e  State && (pCur->
2afd0 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
2afe0 41 74 4c 61 73 74 29 21 3d 30 20 29 7b 0a 23 69  AtLast)!=0 ){.#i
2aff0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
2b000 47 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c  G.    /* This bl
2b010 6f 63 6b 20 73 65 72 76 65 73 20 74 6f 20 61 73  ock serves to as
2b020 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65 20  sert() that the 
2b030 63 75 72 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f  cursor really do
2b040 65 73 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a  es point .    **
2b050 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
2b060 72 79 20 69 6e 20 74 68 65 20 62 2d 74 72 65 65  ry in the b-tree
2b070 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b  . */.    int ii;
2b080 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
2b090 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69  i<pCur->iPage; i
2b0a0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i++){.      asse
2b0b0 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
2b0c0 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67  ii]==pCur->apPag
2b0d0 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  e[ii]->nCell );.
2b0e0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
2b0f0 28 20 70 43 75 72 2d 3e 69 78 3d 3d 70 43 75 72  ( pCur->ix==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 6e 43 65 6c 6c 2d 31 20 29  Page]->nCell-1 )
2b120 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
2b130 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2b140 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 20 29 3b  >iPage]->leaf );
2b150 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
2b160 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2b170 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  }..  rc = moveTo
2b180 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66  Root(pCur);.  if
2b190 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2b1a0 29 7b 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f  ){.    if( CURSO
2b1b0 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
2b1c0 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20  >eState ){.     
2b1d0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
2b1e0 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43  gnoRoot==0 || pC
2b1f0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2b200 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d  >iPage]->nCell==
2b210 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 );.      *pRes
2b220 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
2b230 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2b240 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2b250 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
2b260 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
2b270 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52      rc = moveToR
2b280 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  ightmost(pCur);.
2b290 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2b2a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2b2b0 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
2b2c0 73 20 7c 3d 20 42 54 43 46 5f 41 74 4c 61 73 74  s |= BTCF_AtLast
2b2d0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2b2e0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72         pCur->cur
2b2f0 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 41  Flags &= ~BTCF_A
2b300 74 4c 61 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20  tLast;.      }. 
2b310 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72    .    }.  }.  r
2b320 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
2b330 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
2b340 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
2b350 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65  s to an entry ne
2b360 61 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73  ar the key .** s
2b370 70 65 63 69 66 69 65 64 20 62 79 20 70 49 64 78  pecified by pIdx
2b380 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20  Key or intKey.  
2b390 20 52 65 74 75 72 6e 20 61 20 73 75 63 63 65 73   Return a succes
2b3a0 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f  s code..**.** Fo
2b3b0 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c  r INTKEY tables,
2b3c0 20 74 68 65 20 69 6e 74 4b 65 79 20 70 61 72 61   the intKey para
2b3d0 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e 20 20  meter is used.  
2b3e0 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74  pIdxKey .** must
2b3f0 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69   be NULL.  For i
2b400 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 70 49 64  ndex tables, pId
2b410 78 4b 65 79 20 69 73 20 75 73 65 64 20 61 6e 64  xKey is used and
2b420 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67   intKey.** is ig
2b430 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  nored..**.** If 
2b440 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20 69  an exact match i
2b450 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65  s not found, the
2b460 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  n the cursor is 
2b470 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70  always.** left p
2b480 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61  ointing at a lea
2b490 66 20 70 61 67 65 20 77 68 69 63 68 20 77 6f 75  f page which wou
2b4a0 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72  ld hold the entr
2b4b0 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20  y if it.** were 
2b4c0 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75  present.  The cu
2b4d0 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74  rsor might point
2b4e0 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61   to an entry tha
2b4f0 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72  t comes.** befor
2b500 65 20 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b  e or after the k
2b510 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74  ey..**.** An int
2b520 65 67 65 72 20 69 73 20 77 72 69 74 74 65 6e 20  eger is written 
2b530 69 6e 74 6f 20 2a 70 52 65 73 20 77 68 69 63 68  into *pRes which
2b540 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f   is the result o
2b550 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74  f.** comparing t
2b560 68 65 20 6b 65 79 20 77 69 74 68 20 74 68 65 20  he key with the 
2b570 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 74  entry to which t
2b580 68 65 20 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a  he cursor is .**
2b590 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68 65 20   pointing.  The 
2b5a0 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 69  meaning of the i
2b5b0 6e 74 65 67 65 72 20 77 72 69 74 74 65 6e 20 69  nteger written i
2b5c0 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20  nto.** *pRes is 
2b5d0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
2b5e0 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20 20  *     *pRes<0   
2b5f0 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
2b600 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
2b610 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a  t an entry that.
2b620 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
2b630 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74      is smaller t
2b640 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b  han intKey/pIdxK
2b650 65 79 20 6f 72 20 69 66 20 74 68 65 20 74 61 62  ey or if the tab
2b660 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20  le is empty.**  
2b670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b680 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 69  and the cursor i
2b690 73 20 74 68 65 72 65 66 6f 72 65 20 6c 65 66 74  s therefore left
2b6a0 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e   point to nothin
2b6b0 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  g..**.**     *pR
2b6c0 65 73 3d 3d 30 20 20 20 20 20 54 68 65 20 63 75  es==0     The cu
2b6d0 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
2b6e0 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
2b6f0 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
2b700 20 20 20 20 20 20 20 20 20 20 20 65 78 61 63 74             exact
2b710 6c 79 20 6d 61 74 63 68 65 73 20 69 6e 74 4b 65  ly matches intKe
2b720 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a  y/pIdxKey..**.**
2b730 20 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20       *pRes>0    
2b740 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
2b750 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
2b760 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
2b770 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
2b780 20 20 20 69 73 20 6c 61 72 67 65 72 20 74 68 61     is larger tha
2b790 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79  n intKey/pIdxKey
2b7a0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 69 6e 64 65  ..**.** For inde
2b7b0 78 20 74 61 62 6c 65 73 2c 20 74 68 65 20 70 49  x tables, the pI
2b7c0 64 78 4b 65 79 2d 3e 65 71 53 65 65 6e 20 66 69  dxKey->eqSeen fi
2b7d0 65 6c 64 20 69 73 20 73 65 74 20 74 6f 20 31 20  eld is set to 1 
2b7e0 69 66 20 74 68 65 72 65 0a 2a 2a 20 65 78 69 73  if there.** exis
2b7f0 74 73 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74  ts an entry in t
2b800 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 65 78  he table that ex
2b810 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 70 49  actly matches pI
2b820 64 78 4b 65 79 2e 20 20 0a 2a 2f 0a 69 6e 74 20  dxKey.  .*/.int 
2b830 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
2b840 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20 42 74  toUnpacked(.  Bt
2b850 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
2b860 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
2b870 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65 64  rsor to be moved
2b880 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
2b890 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f  cord *pIdxKey, /
2b8a0 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78  * Unpacked index
2b8b0 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e   key */.  i64 in
2b8c0 74 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  tKey,           
2b8d0 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
2b8e0 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61  key */.  int bia
2b8f0 73 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20  sRight,         
2b900 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 62 69    /* If true, bi
2b910 61 73 20 74 68 65 20 73 65 61 72 63 68 20 74 6f  as the search to
2b920 20 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f   the high end */
2b930 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20  .  int *pRes    
2b940 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
2b950 72 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75  rite search resu
2b960 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  lts here */.){. 
2b970 20 69 6e 74 20 72 63 3b 0a 20 20 52 65 63 6f 72   int rc;.  Recor
2b980 64 43 6f 6d 70 61 72 65 20 78 52 65 63 6f 72 64  dCompare xRecord
2b990 43 6f 6d 70 61 72 65 3b 0a 0a 20 20 61 73 73 65  Compare;..  asse
2b9a0 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
2b9b0 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
2b9c0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2b9d0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
2b9e0 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
2b9f0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
2ba00 74 28 20 70 52 65 73 20 29 3b 0a 20 20 61 73 73  t( pRes );.  ass
2ba10 65 72 74 28 20 28 70 49 64 78 4b 65 79 3d 3d 30  ert( (pIdxKey==0
2ba20 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  )==(pCur->pKeyIn
2ba30 66 6f 3d 3d 30 29 20 29 3b 0a 20 20 61 73 73 65  fo==0) );.  asse
2ba40 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
2ba50 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c  !=CURSOR_VALID |
2ba60 7c 20 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d  | (pIdxKey==0)==
2ba70 28 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79  (pCur->curIntKey
2ba80 21 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  !=0) );..  /* If
2ba90 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61   the cursor is a
2baa0 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e 65  lready positione
2bab0 64 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20 77  d at the point w
2bac0 65 20 61 72 65 20 74 72 79 69 6e 67 0a 20 20 2a  e are trying.  *
2bad0 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68  * to move to, th
2bae0 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 77  en just return w
2baf0 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
2bb00 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70   work */.  if( p
2bb10 49 64 78 4b 65 79 3d 3d 30 0a 20 20 20 26 26 20  IdxKey==0.   && 
2bb20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2bb30 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20 28 70  RSOR_VALID && (p
2bb40 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
2bb50 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 21  BTCF_ValidNKey)!
2bb60 3d 30 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20  =0.  ){.    if( 
2bb70 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d  pCur->info.nKey=
2bb80 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  =intKey ){.     
2bb90 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
2bba0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2bbb0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OK;.    }.    if
2bbc0 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  ( pCur->info.nKe
2bbd0 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  y<intKey ){.    
2bbe0 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72    if( (pCur->cur
2bbf0 46 6c 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c  Flags & BTCF_AtL
2bc00 61 73 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ast)!=0 ){.     
2bc10 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20     *pRes = -1;. 
2bc20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2bc30 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
2bc40 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
2bc50 20 72 65 71 75 65 73 74 65 64 20 6b 65 79 20 69   requested key i
2bc60 73 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 20  s one more than 
2bc70 74 68 65 20 70 72 65 76 69 6f 75 73 20 6b 65 79  the previous key
2bc80 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  , then.      ** 
2bc90 74 72 79 20 74 6f 20 67 65 74 20 74 68 65 72 65  try to get there
2bca0 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 42 74   using sqlite3Bt
2bcb0 72 65 65 4e 65 78 74 28 29 20 72 61 74 68 65 72  reeNext() rather
2bcc0 20 74 68 61 6e 20 61 20 66 75 6c 6c 0a 20 20 20   than a full.   
2bcd0 20 20 20 2a 2a 20 62 69 6e 61 72 79 20 73 65 61     ** binary sea
2bce0 72 63 68 2e 20 20 54 68 69 73 20 69 73 20 61 6e  rch.  This is an
2bcf0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e   optimization on
2bd00 6c 79 2e 20 20 54 68 65 20 63 6f 72 72 65 63 74  ly.  The correct
2bd10 20 61 6e 73 77 65 72 0a 20 20 20 20 20 20 2a 2a   answer.      **
2bd20 20 69 73 20 73 74 69 6c 6c 20 6f 62 74 61 69 6e   is still obtain
2bd30 65 64 20 77 69 74 68 6f 75 74 20 74 68 69 73 20  ed without this 
2bd40 63 61 73 65 2c 20 6f 6e 6c 79 20 61 20 6c 69 74  case, only a lit
2bd50 74 6c 65 20 6d 6f 72 65 20 73 6c 6f 77 65 6c 79  tle more slowely
2bd60 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43   */.      if( pC
2bd70 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 2b 31 3d  ur->info.nKey+1=
2bd80 3d 69 6e 74 4b 65 79 20 26 26 20 21 70 43 75 72  =intKey && !pCur
2bd90 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20  ->skipNext ){.  
2bda0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
2bdb0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
2bdc0 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70  lite3BtreeNext(p
2bdd0 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Cur, 0);.       
2bde0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2bdf0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2be00 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
2be10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2be20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
2be30 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ==intKey ){.    
2be40 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2be50 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2be60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
2be70 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
2be80 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
2be90 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2bea0 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  _OK;.        }el
2beb0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65  se{.          re
2bec0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
2bed0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
2bee0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 49 64 78  .  }..  if( pIdx
2bef0 4b 65 79 20 29 7b 0a 20 20 20 20 78 52 65 63 6f  Key ){.    xReco
2bf00 72 64 43 6f 6d 70 61 72 65 20 3d 20 73 71 6c 69  rdCompare = sqli
2bf10 74 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70 61  te3VdbeFindCompa
2bf20 72 65 28 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  re(pIdxKey);.   
2bf30 20 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64   pIdxKey->errCod
2bf40 65 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  e = 0;.    asser
2bf50 74 28 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61  t( pIdxKey->defa
2bf60 75 6c 74 5f 72 63 3d 3d 31 20 0a 20 20 20 20 20  ult_rc==1 .     
2bf70 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e      || pIdxKey->
2bf80 64 65 66 61 75 6c 74 5f 72 63 3d 3d 30 20 0a 20  default_rc==0 . 
2bf90 20 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 4b          || pIdxK
2bfa0 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d  ey->default_rc==
2bfb0 2d 31 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73  -1.    );.  }els
2bfc0 65 7b 0a 20 20 20 20 78 52 65 63 6f 72 64 43 6f  e{.    xRecordCo
2bfd0 6d 70 61 72 65 20 3d 20 30 3b 20 2f 2a 20 41 6c  mpare = 0; /* Al
2bfe0 6c 20 6b 65 79 73 20 61 72 65 20 69 6e 74 65 67  l keys are integ
2bff0 65 72 73 20 2a 2f 0a 20 20 7d 0a 0a 20 20 72 63  ers */.  }..  rc
2c000 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
2c010 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ur);.  if( rc ){
2c020 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
2c030 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
2c040 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
2c050 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
2c060 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a  pCur->iPage] );.
2c070 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2c080 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70  pgnoRoot==0 || p
2c090 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2c0a0 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49 6e 69 74  ->iPage]->isInit
2c0b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2c0c0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2c0d0 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43  OR_INVALID || pC
2c0e0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2c0f0 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30  >iPage]->nCell>0
2c100 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
2c110 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
2c120 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70  NVALID ){.    *p
2c130 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73  Res = -1;.    as
2c140 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
2c150 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
2c160 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2c170 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  age]->nCell==0 )
2c180 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
2c190 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73  ITE_OK;.  }.  as
2c1a0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
2c1b0 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 70  ge[0]->intKey==p
2c1c0 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29  Cur->curIntKey )
2c1d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2c1e0 2d 3e 63 75 72 49 6e 74 4b 65 79 20 7c 7c 20 70  ->curIntKey || p
2c1f0 49 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28  IdxKey );.  for(
2c200 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72  ;;){.    int lwr
2c210 2c 20 75 70 72 2c 20 69 64 78 2c 20 63 3b 0a 20  , upr, idx, c;. 
2c220 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a     Pgno chldPg;.
2c230 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
2c240 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
2c250 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
2c260 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20      u8 *pCell;  
2c270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c280 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
2c290 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20 63 65  er to current ce
2c2a0 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a 0a  ll in pPage */..
2c2b0 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 6e 43      /* pPage->nC
2c2c0 65 6c 6c 20 6d 75 73 74 20 62 65 20 67 72 65 61  ell must be grea
2c2d0 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e 20 49  ter than zero. I
2c2e0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 72 6f  f this is the ro
2c2f0 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20 74  ot-page.    ** t
2c300 68 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20  he cursor would 
2c310 68 61 76 65 20 62 65 65 6e 20 49 4e 56 41 4c 49  have been INVALI
2c320 44 20 61 62 6f 76 65 20 61 6e 64 20 74 68 69 73  D above and this
2c330 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20   for(;;) loop.  
2c340 20 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20 49 66    ** not run. If
2c350 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65   this is not the
2c360 20 72 6f 6f 74 2d 70 61 67 65 2c 20 74 68 65 6e   root-page, then
2c370 20 74 68 65 20 6d 6f 76 65 54 6f 43 68 69 6c 64   the moveToChild
2c380 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a  () routine.    *
2c390 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 61 6c 72  * would have alr
2c3a0 65 61 64 79 20 64 65 74 65 63 74 65 64 20 64 62  eady detected db
2c3b0 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 53 69 6d   corruption. Sim
2c3c0 69 6c 61 72 6c 79 2c 20 70 50 61 67 65 20 6d 75  ilarly, pPage mu
2c3d0 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 65  st.    ** be the
2c3e0 20 72 69 67 68 74 20 6b 69 6e 64 20 28 69 6e 64   right kind (ind
2c3f0 65 78 20 6f 72 20 74 61 62 6c 65 29 20 6f 66 20  ex or table) of 
2c400 62 2d 74 72 65 65 20 70 61 67 65 2e 20 4f 74 68  b-tree page. Oth
2c410 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 20  erwise.    ** a 
2c420 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 6f 72  moveToChild() or
2c430 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20 63 61   moveToRoot() ca
2c440 6c 6c 20 77 6f 75 6c 64 20 68 61 76 65 20 64 65  ll would have de
2c450 74 65 63 74 65 64 20 63 6f 72 72 75 70 74 69 6f  tected corruptio
2c460 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  n.  */.    asser
2c470 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  t( pPage->nCell>
2c480 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2c490 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d   pPage->intKey==
2c4a0 28 70 49 64 78 4b 65 79 3d 3d 30 29 20 29 3b 0a  (pIdxKey==0) );.
2c4b0 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20      lwr = 0;.   
2c4c0 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43   upr = pPage->nC
2c4d0 65 6c 6c 2d 31 3b 0a 20 20 20 20 61 73 73 65 72  ell-1;.    asser
2c4e0 74 28 20 62 69 61 73 52 69 67 68 74 3d 3d 30 20  t( biasRight==0 
2c4f0 7c 7c 20 62 69 61 73 52 69 67 68 74 3d 3d 31 20  || biasRight==1 
2c500 29 3b 0a 20 20 20 20 69 64 78 20 3d 20 75 70 72  );.    idx = upr
2c510 3e 3e 28 31 2d 62 69 61 73 52 69 67 68 74 29 3b  >>(1-biasRight);
2c520 20 2f 2a 20 69 64 78 20 3d 20 62 69 61 73 52 69   /* idx = biasRi
2c530 67 68 74 20 3f 20 75 70 72 20 3a 20 28 6c 77 72  ght ? upr : (lwr
2c540 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20  +upr)/2; */.    
2c550 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29  pCur->ix = (u16)
2c560 69 64 78 3b 0a 20 20 20 20 69 66 28 20 78 52 65  idx;.    if( xRe
2c570 63 6f 72 64 43 6f 6d 70 61 72 65 3d 3d 30 20 29  cordCompare==0 )
2c580 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b  {.      for(;;){
2c590 0a 20 20 20 20 20 20 20 20 69 36 34 20 6e 43 65  .        i64 nCe
2c5a0 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 70  llKey;.        p
2c5b0 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 50  Cell = findCellP
2c5c0 61 73 74 50 74 72 28 70 50 61 67 65 2c 20 69 64  astPtr(pPage, id
2c5d0 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  x);.        if( 
2c5e0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61  pPage->intKeyLea
2c5f0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  f ){.          w
2c600 68 69 6c 65 28 20 30 78 38 30 20 3c 3d 20 2a 28  hile( 0x80 <= *(
2c610 70 43 65 6c 6c 2b 2b 29 20 29 7b 0a 20 20 20 20  pCell++) ){.    
2c620 20 20 20 20 20 20 20 20 69 66 28 20 70 43 65 6c          if( pCel
2c630 6c 3e 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45  l>=pPage->aDataE
2c640 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nd ){.          
2c650 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2c660 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70  E_CORRUPT_PGNO(p
2c670 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  Page->pgno);.   
2c680 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2c690 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2c6a0 0a 20 20 20 20 20 20 20 20 67 65 74 56 61 72 69  .        getVari
2c6b0 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29  nt(pCell, (u64*)
2c6c0 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20  &nCellKey);.    
2c6d0 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79      if( nCellKey
2c6e0 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  <intKey ){.     
2c6f0 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31       lwr = idx+1
2c700 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2c710 6c 77 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2d  lwr>upr ){ c = -
2c720 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20  1; break; }.    
2c730 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43      }else if( nC
2c740 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29 7b  ellKey>intKey ){
2c750 0a 20 20 20 20 20 20 20 20 20 20 75 70 72 20 3d  .          upr =
2c760 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20   idx-1;.        
2c770 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b    if( lwr>upr ){
2c780 20 63 20 3d 20 2b 31 3b 20 62 72 65 61 6b 3b 20   c = +1; break; 
2c790 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
2c7a0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2c7b0 74 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74  t( nCellKey==int
2c7c0 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Key );.         
2c7d0 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36   pCur->ix = (u16
2c7e0 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20  )idx;.          
2c7f0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
2c800 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2c810 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20 20 20 20  lwr = idx;.     
2c820 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
2c830 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3b 0a 20  to_next_layer;. 
2c840 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2c850 20 20 20 20 20 20 20 20 20 20 20 20 70 43 75 72              pCur
2c860 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54  ->curFlags |= BT
2c870 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20  CF_ValidNKey;.  
2c880 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
2c890 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c  info.nKey = nCel
2c8a0 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20  lKey;.          
2c8b0 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
2c8c0 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ze = 0;.        
2c8d0 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
2c8e0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
2c8f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
2c900 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2c910 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
2c920 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b  t( lwr+upr>=0 );
2c930 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d 20 28  .        idx = (
2c940 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a  lwr+upr)>>1;  /*
2c950 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29   idx = (lwr+upr)
2c960 2f 32 3b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  /2; */.      }. 
2c970 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c980 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20  for(;;){.       
2c990 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 2f 2a 20   int nCell;  /* 
2c9a0 53 69 7a 65 20 6f 66 20 74 68 65 20 70 43 65 6c  Size of the pCel
2c9b0 6c 20 63 65 6c 6c 20 69 6e 20 62 79 74 65 73 20  l cell in bytes 
2c9c0 2a 2f 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c  */.        pCell
2c9d0 20 3d 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50   = findCellPastP
2c9e0 74 72 28 70 50 61 67 65 2c 20 69 64 78 29 3b 0a  tr(pPage, idx);.
2c9f0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
2ca00 6d 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65  maximum supporte
2ca10 64 20 70 61 67 65 2d 73 69 7a 65 20 69 73 20 36  d page-size is 6
2ca20 35 35 33 36 20 62 79 74 65 73 2e 20 54 68 69 73  5536 bytes. This
2ca30 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 20 20   means that.    
2ca40 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d      ** the maxim
2ca50 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 63  um number of rec
2ca60 6f 72 64 20 62 79 74 65 73 20 73 74 6f 72 65 64  ord bytes stored
2ca70 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d 54   on an index B-T
2ca80 72 65 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  ree.        ** p
2ca90 61 67 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e  age is less than
2caa0 20 31 36 33 38 34 20 62 79 74 65 73 20 61 6e 64   16384 bytes and
2cab0 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20 61   may be stored a
2cac0 73 20 61 20 32 2d 62 79 74 65 0a 20 20 20 20 20  s a 2-byte.     
2cad0 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68     ** varint. Th
2cae0 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
2caf0 73 20 75 73 65 64 20 74 6f 20 61 74 74 65 6d 70  s used to attemp
2cb00 74 20 74 6f 20 61 76 6f 69 64 20 70 61 72 73 69  t to avoid parsi
2cb10 6e 67 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ng .        ** t
2cb20 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 62  he entire cell b
2cb30 79 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 74  y checking for t
2cb40 68 65 20 63 61 73 65 73 20 77 68 65 72 65 20 74  he cases where t
2cb50 68 65 20 72 65 63 6f 72 64 20 69 73 20 0a 20 20  he record is .  
2cb60 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20        ** stored 
2cb70 65 6e 74 69 72 65 6c 79 20 77 69 74 68 69 6e 20  entirely within 
2cb80 74 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20  the b-tree page 
2cb90 62 79 20 69 6e 73 70 65 63 74 69 6e 67 20 74 68  by inspecting th
2cba0 65 20 66 69 72 73 74 20 0a 20 20 20 20 20 20 20  e first .       
2cbb0 20 2a 2a 20 32 20 62 79 74 65 73 20 6f 66 20 74   ** 2 bytes of t
2cbc0 68 65 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20  he cell..       
2cbd0 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 43 65 6c   */.        nCel
2cbe0 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20  l = pCell[0];.  
2cbf0 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c        if( nCell<
2cc00 3d 70 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65  =pPage->max1byte
2cc10 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 20  Payload ){.     
2cc20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
2cc30 6e 63 68 20 72 75 6e 73 20 69 66 20 74 68 65 20  nch runs if the 
2cc40 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c  record-size fiel
2cc50 64 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 73  d of the cell is
2cc60 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20   a.          ** 
2cc70 73 69 6e 67 6c 65 20 62 79 74 65 20 76 61 72 69  single byte vari
2cc80 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72  nt and the recor
2cc90 64 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20  d fits entirely 
2cca0 6f 6e 20 74 68 65 20 6d 61 69 6e 0a 20 20 20 20  on the main.    
2ccb0 20 20 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20        ** b-tree 
2ccc0 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  page.  */.      
2ccd0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43      testcase( pC
2cce0 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d 70 50 61  ell+nCell+1==pPa
2ccf0 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a  ge->aDataEnd );.
2cd00 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52            c = xR
2cd10 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65  ecordCompare(nCe
2cd20 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c  ll, (void*)&pCel
2cd30 6c 5b 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a  l[1], pIdxKey);.
2cd40 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
2cd50 28 20 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30  ( !(pCell[1] & 0
2cd60 78 38 30 29 20 0a 20 20 20 20 20 20 20 20 20 20  x80) .          
2cd70 26 26 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43  && (nCell = ((nC
2cd80 65 6c 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b 20  ell&0x7f)<<7) + 
2cd90 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65  pCell[1])<=pPage
2cda0 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20  ->maxLocal.     
2cdb0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
2cdc0 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 2d 73 69  /* The record-si
2cdd0 7a 65 20 66 69 65 6c 64 20 69 73 20 61 20 32 20  ze field is a 2 
2cde0 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20  byte varint and 
2cdf0 74 68 65 20 72 65 63 6f 72 64 20 0a 20 20 20 20  the record .    
2ce00 20 20 20 20 20 20 2a 2a 20 66 69 74 73 20 65 6e        ** fits en
2ce10 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61  tirely on the ma
2ce20 69 6e 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  in b-tree page. 
2ce30 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65   */.          te
2ce40 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43  stcase( pCell+nC
2ce50 65 6c 6c 2b 32 3d 3d 70 50 61 67 65 2d 3e 61 44  ell+2==pPage->aD
2ce60 61 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20  ataEnd );.      
2ce70 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43      c = xRecordC
2ce80 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76  ompare(nCell, (v
2ce90 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20  oid*)&pCell[2], 
2cea0 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20  pIdxKey);.      
2ceb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2cec0 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64     /* The record
2ced0 20 66 6c 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f   flows over onto
2cee0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65   one or more ove
2cef0 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a  rflow pages. In.
2cf00 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69            ** thi
2cf10 73 20 63 61 73 65 20 74 68 65 20 77 68 6f 6c 65  s case the whole
2cf20 20 63 65 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62   cell needs to b
2cf30 65 20 70 61 72 73 65 64 2c 20 61 20 62 75 66 66  e parsed, a buff
2cf40 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20  er allocated.   
2cf50 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 61 63         ** and ac
2cf60 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 75 73  cessPayload() us
2cf70 65 64 20 74 6f 20 72 65 74 72 69 65 76 65 20 74  ed to retrieve t
2cf80 68 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74  he record into t
2cf90 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
2cfa0 62 75 66 66 65 72 20 62 65 66 6f 72 65 20 56 64  buffer before Vd
2cfb0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
2cfc0 29 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e  ) can be called.
2cfd0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20   .          **. 
2cfe0 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74           ** If t
2cff0 68 65 20 72 65 63 6f 72 64 20 69 73 20 63 6f 72  he record is cor
2d000 72 75 70 74 2c 20 74 68 65 20 78 52 65 63 6f 72  rupt, the xRecor
2d010 64 43 6f 6d 70 61 72 65 20 72 6f 75 74 69 6e 65  dCompare routine
2d020 20 6d 61 79 20 72 65 61 64 0a 20 20 20 20 20 20   may read.      
2d030 20 20 20 20 2a 2a 20 75 70 20 74 6f 20 74 77 6f      ** up to two
2d040 20 76 61 72 69 6e 74 73 20 70 61 73 74 20 74 68   varints past th
2d050 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62 75 66  e end of the buf
2d060 66 65 72 2e 20 41 6e 20 65 78 74 72 61 20 31 38  fer. An extra 18
2d070 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62   .          ** b
2d080 79 74 65 73 20 6f 66 20 70 61 64 64 69 6e 67 20  ytes of padding 
2d090 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 74 20  is allocated at 
2d0a0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62  the end of the b
2d0b0 75 66 66 65 72 20 69 6e 0a 20 20 20 20 20 20 20  uffer in.       
2d0c0 20 20 20 2a 2a 20 63 61 73 65 20 74 68 69 73 20     ** case this 
2d0d0 68 61 70 70 65 6e 73 2e 20 20 2a 2f 0a 20 20 20  happens.  */.   
2d0e0 20 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65         void *pCe
2d0f0 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20  llKey;.         
2d100 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c   u8 * const pCel
2d110 6c 42 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20  lBody = pCell - 
2d120 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
2d130 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ize;.          p
2d140 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
2d150 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64  (pPage, pCellBod
2d160 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b  y, &pCur->info);
2d170 0a 20 20 20 20 20 20 20 20 20 20 6e 43 65 6c 6c  .          nCell
2d180 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e   = (int)pCur->in
2d190 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20  fo.nKey;.       
2d1a0 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43 65     testcase( nCe
2d1b0 6c 6c 3c 30 20 29 3b 20 20 20 2f 2a 20 54 72 75  ll<0 );   /* Tru
2d1c0 65 20 69 66 20 6b 65 79 20 73 69 7a 65 20 69 73  e if key size is
2d1d0 20 32 5e 33 32 20 6f 72 20 6d 6f 72 65 20 2a 2f   2^32 or more */
2d1e0 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
2d1f0 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 30 20 29 3b  ase( nCell==0 );
2d200 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79    /* Invalid key
2d210 20 73 69 7a 65 3a 20 20 30 78 38 30 20 30 78 38   size:  0x80 0x8
2d220 30 20 30 78 30 30 20 2a 2f 0a 20 20 20 20 20 20  0 0x00 */.      
2d230 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43      testcase( nC
2d240 65 6c 6c 3d 3d 31 20 29 3b 20 20 2f 2a 20 49 6e  ell==1 );  /* In
2d250 76 61 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a 20  valid key size: 
2d260 20 30 78 38 30 20 30 78 38 30 20 30 78 30 31 20   0x80 0x80 0x01 
2d270 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  */.          tes
2d280 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 32 20  tcase( nCell==2 
2d290 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6c  );  /* Minimum l
2d2a0 65 67 61 6c 20 69 6e 64 65 78 20 6b 65 79 20 73  egal index key s
2d2b0 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ize */.         
2d2c0 20 69 66 28 20 6e 43 65 6c 6c 3c 32 20 29 7b 0a   if( nCell<2 ){.
2d2d0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2d2e0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2d2f0 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f  PGNO(pPage->pgno
2d300 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  );.            g
2d310 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
2d320 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  h;.          }. 
2d330 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65           pCellKe
2d340 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  y = sqlite3Mallo
2d350 63 28 20 6e 43 65 6c 6c 2b 31 38 20 29 3b 0a 20  c( nCell+18 );. 
2d360 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 65           if( pCe
2d370 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20  llKey==0 ){.    
2d380 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2d390 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
2d3a0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
2d3b0 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
2d3c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2d3d0 20 20 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d        pCur->ix =
2d3e0 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20   (u16)idx;.     
2d3f0 20 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73       rc = access
2d400 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c  Payload(pCur, 0,
2d410 20 6e 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e 65   nCell, (unsigne
2d420 64 20 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65 79  d char*)pCellKey
2d430 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
2d440 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2d450 3d 20 7e 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  = ~BTCF_ValidOvf
2d460 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  l;.          if(
2d470 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
2d480 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2d490 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20  pCellKey);.     
2d4a0 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
2d4b0 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
2d4c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2d4d0 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70   c = xRecordComp
2d4e0 61 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c  are(nCell, pCell
2d4f0 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20  Key, pIdxKey);. 
2d500 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2d510 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b  _free(pCellKey);
2d520 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2d530 20 20 20 61 73 73 65 72 74 28 20 0a 20 20 20 20     assert( .    
2d540 20 20 20 20 20 20 20 20 28 70 49 64 78 4b 65 79          (pIdxKey
2d550 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
2d560 45 5f 43 4f 52 52 55 50 54 20 7c 7c 20 63 3d 3d  E_CORRUPT || c==
2d570 30 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  0).         && (
2d580 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65  pIdxKey->errCode
2d590 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c  !=SQLITE_NOMEM |
2d5a0 7c 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  | pCur->pBtree->
2d5b0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2d5c0 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
2d5d0 20 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a       if( c<0 ){.
2d5e0 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20            lwr = 
2d5f0 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d  idx+1;.        }
2d600 65 6c 73 65 20 69 66 28 20 63 3e 30 20 29 7b 0a  else if( c>0 ){.
2d610 20 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20            upr = 
2d620 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d  idx-1;.        }
2d630 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2d640 61 73 73 65 72 74 28 20 63 3d 3d 30 20 29 3b 0a  assert( c==0 );.
2d650 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73 20            *pRes 
2d660 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 0;.          r
2d670 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2d680 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69           pCur->i
2d690 78 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20  x = (u16)idx;.  
2d6a0 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
2d6b0 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20 29 20 72  Key->errCode ) r
2d6c0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
2d6d0 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  PT;.          go
2d6e0 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
2d6f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2d700 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20      if( lwr>upr 
2d710 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
2d720 20 61 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72   assert( lwr+upr
2d730 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  >=0 );.        i
2d740 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e  dx = (lwr+upr)>>
2d750 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77  1;  /* idx = (lw
2d760 72 2b 75 70 72 29 2f 32 20 2a 2f 0a 20 20 20 20  r+upr)/2 */.    
2d770 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
2d780 73 65 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31  sert( lwr==upr+1
2d790 20 7c 7c 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b   || (pPage->intK
2d7a0 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65  ey && !pPage->le
2d7b0 61 66 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  af) );.    asser
2d7c0 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
2d7d0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
2d7e0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
2d7f0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2d800 78 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  x<pCur->apPage[p
2d810 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
2d820 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72  ll );.      pCur
2d830 2d 3e 69 78 20 3d 20 28 75 31 36 29 69 64 78 3b  ->ix = (u16)idx;
2d840 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 63  .      *pRes = c
2d850 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
2d860 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f  ITE_OK;.      go
2d870 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
2d880 3b 0a 20 20 20 20 7d 0a 6d 6f 76 65 74 6f 5f 6e  ;.    }.moveto_n
2d890 65 78 74 5f 6c 61 79 65 72 3a 0a 20 20 20 20 69  ext_layer:.    i
2d8a0 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e  f( lwr>=pPage->n
2d8b0 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68  Cell ){.      ch
2d8c0 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28  ldPg = get4byte(
2d8d0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
2d8e0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
2d8f0 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
2d900 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65       chldPg = ge
2d910 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
2d920 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20  pPage, lwr));.  
2d930 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 78    }.    pCur->ix
2d940 20 3d 20 28 75 31 36 29 6c 77 72 3b 0a 20 20 20   = (u16)lwr;.   
2d950 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
2d960 64 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b  d(pCur, chldPg);
2d970 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72  .    if( rc ) br
2d980 65 61 6b 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f  eak;.  }.moveto_
2d990 66 69 6e 69 73 68 3a 0a 20 20 70 43 75 72 2d 3e  finish:.  pCur->
2d9a0 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
2d9b0 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d    assert( (pCur-
2d9c0 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
2d9d0 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29  _ValidOvfl)==0 )
2d9e0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2d9f0 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  .../*.** Return 
2da00 54 52 55 45 20 69 66 20 74 68 65 20 63 75 72 73  TRUE if the curs
2da10 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69  or is not pointi
2da20 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f  ng at an entry o
2da30 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a  f the table..**.
2da40 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20  ** TRUE will be 
2da50 72 65 74 75 72 6e 65 64 20 61 66 74 65 72 20 61  returned after a
2da60 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
2da70 42 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65  BtreeNext() move
2da80 73 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61  s.** past the la
2da90 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
2daa0 74 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33  table or sqlite3
2dab0 42 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65  BtreePrev() move
2dac0 73 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69  s past.** the fi
2dad0 72 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45  rst entry.  TRUE
2dae0 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65   is also returne
2daf0 64 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  d if the table i
2db00 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20  s empty..*/.int 
2db10 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28  sqlite3BtreeEof(
2db20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
2db30 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74  .  /* TODO: What
2db40 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
2db50 73 20 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55  s in CURSOR_REQU
2db60 49 52 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20  IRESEEK but all 
2db70 74 61 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20  table entries.  
2db80 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c  ** have been del
2db90 65 74 65 64 3f 20 54 68 69 73 20 41 50 49 20 77  eted? This API w
2dba0 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e  ill need to chan
2dbb0 67 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20  ge to return an 
2dbc0 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20  error code.  ** 
2dbd0 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62  as well as the b
2dbe0 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61  oolean result va
2dbf0 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75  lue..  */.  retu
2dc00 72 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44  rn (CURSOR_VALID
2dc10 21 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b  !=pCur->eState);
2dc20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2dc30 20 61 6e 20 65 73 74 69 6d 61 74 65 20 66 6f 72   an estimate for
2dc40 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
2dc50 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
2dc60 20 74 68 61 74 20 70 43 75 72 20 69 73 0a 2a 2a   that pCur is.**
2dc70 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 52   pointing to.  R
2dc80 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65  eturn a negative
2dc90 20 6e 75 6d 62 65 72 20 69 66 20 6e 6f 20 65 73   number if no es
2dca0 74 69 6d 61 74 65 20 69 73 20 63 75 72 72 65 6e  timate is curren
2dcb0 74 6c 79 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c  tly .** availabl
2dcc0 65 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65  e..*/.i64 sqlite
2dcd0 33 42 74 72 65 65 52 6f 77 43 6f 75 6e 74 45 73  3BtreeRowCountEs
2dce0 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
2dcf0 29 7b 0a 20 20 69 36 34 20 6e 3b 0a 20 20 75 38  ){.  i64 n;.  u8
2dd00 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63   i;..  assert( c
2dd10 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
2dd20 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
2dd30 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2dd40 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
2dd50 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
2dd60 20 29 3b 0a 0a 20 20 2f 2a 20 43 75 72 72 65 6e   );..  /* Curren
2dd70 74 6c 79 20 74 68 69 73 20 69 6e 74 65 72 66 61  tly this interfa
2dd80 63 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  ce is only calle
2dd90 64 20 62 79 20 74 68 65 20 4f 50 5f 49 66 53 6d  d by the OP_IfSm
2dda0 61 6c 6c 65 72 0a 20 20 2a 2a 20 6f 70 63 6f 64  aller.  ** opcod
2ddb0 65 2c 20 61 6e 64 20 69 74 20 74 68 61 74 20 63  e, and it that c
2ddc0 61 73 65 20 74 68 65 20 63 75 72 73 6f 72 20 77  ase the cursor w
2ddd0 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 76 61  ill always be va
2dde0 6c 69 64 20 61 6e 64 0a 20 20 2a 2a 20 77 69 6c  lid and.  ** wil
2ddf0 6c 20 61 6c 77 61 79 73 20 70 6f 69 6e 74 20 74  l always point t
2de00 6f 20 61 20 6c 65 61 66 20 6e 6f 64 65 2e 20 2a  o a leaf node. *
2de10 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 43  /.  if( NEVER(pC
2de20 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2de30 4f 52 5f 56 41 4c 49 44 29 20 29 20 72 65 74 75  OR_VALID) ) retu
2de40 72 6e 20 2d 31 3b 0a 20 20 69 66 28 20 4e 45 56  rn -1;.  if( NEV
2de50 45 52 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ER(pCur->apPage[
2de60 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65  pCur->iPage]->le
2de70 61 66 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20  af==0) ) return 
2de80 2d 31 3b 0a 0a 20 20 66 6f 72 28 6e 3d 31 2c 20  -1;..  for(n=1, 
2de90 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50  i=0; i<=pCur->iP
2dea0 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e  age; i++){.    n
2deb0 20 2a 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65   *= pCur->apPage
2dec0 5b 69 5d 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 7d 0a  [i]->nCell;.  }.
2ded0 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
2dee0 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65  *.** Advance the
2def0 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e   cursor to the n
2df00 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ext entry in the
2df10 20 64 61 74 61 62 61 73 65 2e 20 0a 2a 2a 20 52   database. .** R
2df20 65 74 75 72 6e 20 76 61 6c 75 65 3a 0a 2a 2a 0a  eturn value:.**.
2df30 2a 2a 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 20  **    SQLITE_OK 
2df40 20 20 20 20 20 20 20 73 75 63 63 65 73 73 0a 2a         success.*
2df50 2a 20 20 20 20 53 51 4c 49 54 45 5f 44 4f 4e 45  *    SQLITE_DONE
2df60 20 20 20 20 20 20 63 75 72 73 6f 72 20 69 73 20        cursor is 
2df70 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67  already pointing
2df80 20 61 74 20 74 68 65 20 6c 61 73 74 20 65 6c 65   at the last ele
2df90 6d 65 6e 74 0a 2a 2a 20 20 20 20 6f 74 68 65 72  ment.**    other
2dfa0 77 69 73 65 20 20 20 20 20 20 20 20 73 6f 6d 65  wise        some
2dfb0 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 6f   kind of error o
2dfc0 63 63 75 72 72 65 64 0a 2a 2a 0a 2a 2a 20 54 68  ccurred.**.** Th
2dfd0 65 20 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f 69  e main entry poi
2dfe0 6e 74 20 69 73 20 73 71 6c 69 74 65 33 42 74 72  nt is sqlite3Btr
2dff0 65 65 4e 65 78 74 28 29 2e 20 20 54 68 61 74 20  eeNext().  That 
2e000 72 6f 75 74 69 6e 65 20 69 73 20 6f 70 74 69 6d  routine is optim
2e010 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20  ized.** for the 
2e020 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d  common case of m
2e030 65 72 65 6c 79 20 69 6e 63 72 65 6d 65 6e 74 69  erely incrementi
2e040 6e 67 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e  ng the cell coun
2e050 74 65 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49  ter BtCursor.aiI
2e060 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 65 78  dx.** to the nex
2e070 74 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75  t cell on the cu
2e080 72 72 65 6e 74 20 70 61 67 65 2e 20 20 54 68 65  rrent page.  The
2e090 20 28 73 6c 6f 77 65 72 29 20 62 74 72 65 65 4e   (slower) btreeN
2e0a0 65 78 74 28 29 20 68 65 6c 70 65 72 0a 2a 2a 20  ext() helper.** 
2e0b0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
2e0c0 64 20 77 68 65 6e 20 69 74 20 69 73 20 6e 65 63  d when it is nec
2e0d0 65 73 73 61 72 79 20 74 6f 20 6d 6f 76 65 20 74  essary to move t
2e0e0 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 61  o a different pa
2e0f0 67 65 20 6f 72 0a 2a 2a 20 74 6f 20 72 65 73 74  ge or.** to rest
2e100 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a  ore the cursor..
2e110 2a 2a 0a 2a 2a 20 49 66 20 62 69 74 20 30 78 30  **.** If bit 0x0
2e120 31 20 6f 66 20 74 68 65 20 46 20 61 72 67 75 6d  1 of the F argum
2e130 65 6e 74 20 69 6e 20 73 71 6c 69 74 65 33 42 74  ent in sqlite3Bt
2e140 72 65 65 4e 65 78 74 28 43 2c 46 29 20 69 73 20  reeNext(C,F) is 
2e150 31 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 63  1, then the.** c
2e160 75 72 73 6f 72 20 63 6f 72 72 65 73 70 6f 6e 64  ursor correspond
2e170 73 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65  s to an SQL inde
2e180 78 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69  x and this routi
2e190 6e 65 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65  ne could have be
2e1a0 65 6e 0a 2a 2a 20 73 6b 69 70 70 65 64 20 69 66  en.** skipped if
2e1b0 20 74 68 65 20 53 51 4c 20 69 6e 64 65 78 20 68   the SQL index h
2e1c0 61 64 20 62 65 65 6e 20 61 20 75 6e 69 71 75 65  ad been a unique
2e1d0 20 69 6e 64 65 78 2e 20 20 54 68 65 20 46 20 61   index.  The F a
2e1e0 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 61 20  rgument.** is a 
2e1f0 68 69 6e 74 20 74 6f 20 74 68 65 20 69 6d 70 6c  hint to the impl
2e200 65 6d 65 6e 74 2e 20 20 53 51 4c 69 74 65 20 62  ement.  SQLite b
2e210 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tree implementat
2e220 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ion does not use
2e230 0a 2a 2a 20 74 68 69 73 20 68 69 6e 74 2c 20 62  .** this hint, b
2e240 75 74 20 43 4f 4d 44 42 32 20 64 6f 65 73 2e 0a  ut COMDB2 does..
2e250 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
2e260 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74  _NOINLINE int bt
2e270 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72  reeNext(BtCursor
2e280 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72   *pCur){.  int r
2e290 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  c;.  int idx;.  
2e2a0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
2e2b0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2e2c0 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
2e2d0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
2e2e0 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d   pCur->skipNext=
2e2f0 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  =0 || pCur->eSta
2e300 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2e310 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
2e320 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2e330 41 4c 49 44 20 29 7b 0a 20 20 20 20 61 73 73 65  ALID ){.    asse
2e340 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  rt( (pCur->curFl
2e350 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
2e360 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20  Ovfl)==0 );.    
2e370 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
2e380 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
2e390 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2e3a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2e3b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2e3c0 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52  }.    if( CURSOR
2e3d0 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
2e3e0 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20  eState ){.      
2e3f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
2e400 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  NE;.    }.    if
2e410 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
2e420 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2e430 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2e440 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
2e450 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2e460 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b  RSOR_SKIPNEXT );
2e470 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74  .      pCur->eSt
2e480 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
2e490 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43  ID;.      if( pC
2e4a0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3e 30 20 29  ur->skipNext>0 )
2e4b0 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
2e4c0 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  skipNext = 0;.  
2e4d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2e4e0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
2e4f0 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70        pCur->skip
2e500 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Next = 0;.    }.
2e510 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70    }..  pPage = p
2e520 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2e530 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64 78 20  ->iPage];.  idx 
2e540 3d 20 2b 2b 70 43 75 72 2d 3e 69 78 3b 0a 20 20  = ++pCur->ix;.  
2e550 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
2e560 73 49 6e 69 74 20 29 3b 0a 0a 20 20 2f 2a 20 49  sInit );..  /* I
2e570 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
2e580 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74 2c 20  ile is corrupt, 
2e590 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66  it is possible f
2e5a0 6f 72 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  or the value of 
2e5b0 69 64 78 20 0a 20 20 2a 2a 20 74 6f 20 62 65 20  idx .  ** to be 
2e5c0 69 6e 76 61 6c 69 64 20 68 65 72 65 2e 20 54 68  invalid here. Th
2e5d0 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75  is can only occu
2e5e0 72 20 69 66 20 61 20 73 65 63 6f 6e 64 20 63 75  r if a second cu
2e5f0 72 73 6f 72 20 6d 6f 64 69 66 69 65 73 0a 20 20  rsor modifies.  
2e600 2a 2a 20 74 68 65 20 70 61 67 65 20 77 68 69 6c  ** the page whil
2e610 65 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73  e cursor pCur is
2e620 20 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72   holding a refer
2e630 65 6e 63 65 20 74 6f 20 69 74 2e 20 57 68 69 63  ence to it. Whic
2e640 68 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20  h can.  ** only 
2e650 68 61 70 70 65 6e 20 69 66 20 74 68 65 20 64 61  happen if the da
2e660 74 61 62 61 73 65 20 69 73 20 63 6f 72 72 75 70  tabase is corrup
2e670 74 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20  t in such a way 
2e680 61 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 0a 20  as to link the. 
2e690 20 2a 2a 20 70 61 67 65 20 69 6e 74 6f 20 6d 6f   ** page into mo
2e6a0 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 2d 74 72  re than one b-tr
2e6b0 65 65 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f  ee structure. */
2e6c0 0a 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78  .  testcase( idx
2e6d0 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  >pPage->nCell );
2e6e0 0a 0a 20 20 69 66 28 20 69 64 78 3e 3d 70 50 61  ..  if( idx>=pPa
2e6f0 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ge->nCell ){.   
2e700 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
2e710 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
2e720 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
2e730 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  , get4byte(&pPag
2e740 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
2e750 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a  hdrOffset+8]));.
2e760 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
2e770 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2e780 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66  return moveToLef
2e790 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
2e7a0 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20   }.    do{.     
2e7b0 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
2e7c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
2e7d0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
2e7e0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
2e7f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2e800 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20  ITE_DONE;.      
2e810 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61  }.      moveToPa
2e820 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20  rent(pCur);.    
2e830 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
2e840 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2e850 67 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  ge];.    }while(
2e860 20 70 43 75 72 2d 3e 69 78 3e 3d 70 50 61 67 65   pCur->ix>=pPage
2e870 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69  ->nCell );.    i
2e880 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
2e890 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2e8a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
2e8b0 74 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 20 20  t(pCur, 0);.    
2e8c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
2e8d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2e8e0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
2e8f0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2e900 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2e910 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
2e920 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65   return moveToLe
2e930 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
2e940 7d 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  }.}.int sqlite3B
2e950 74 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f  treeNext(BtCurso
2e960 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 66 6c 61  r *pCur, int fla
2e970 67 73 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  gs){.  MemPage *
2e980 70 50 61 67 65 3b 0a 20 20 55 4e 55 53 45 44 5f  pPage;.  UNUSED_
2e990 50 41 52 41 4d 45 54 45 52 28 20 66 6c 61 67 73  PARAMETER( flags
2e9a0 20 29 3b 20 20 2f 2a 20 55 73 65 64 20 69 6e 20   );  /* Used in 
2e9b0 43 4f 4d 44 42 32 20 62 75 74 20 6e 6f 74 20 6e  COMDB2 but not n
2e9c0 61 74 69 76 65 20 53 51 4c 69 74 65 20 2a 2f 0a  ative SQLite */.
2e9d0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2e9e0 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
2e9f0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2ea00 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67  flags==0 || flag
2ea10 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  s==1 );.  assert
2ea20 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
2ea30 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  ==0 || pCur->eSt
2ea40 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
2ea50 44 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  D );.  pCur->inf
2ea60 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
2ea70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
2ea80 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   ~(BTCF_ValidNKe
2ea90 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  y|BTCF_ValidOvfl
2eaa0 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
2eab0 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
2eac0 4c 49 44 20 29 20 72 65 74 75 72 6e 20 62 74 72  LID ) return btr
2ead0 65 65 4e 65 78 74 28 70 43 75 72 29 3b 0a 20 20  eeNext(pCur);.  
2eae0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
2eaf0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2eb00 5d 3b 0a 20 20 69 66 28 20 28 2b 2b 70 43 75 72  ];.  if( (++pCur
2eb10 2d 3e 69 78 29 3e 3d 70 50 61 67 65 2d 3e 6e 43  ->ix)>=pPage->nC
2eb20 65 6c 6c 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  ell ){.    pCur-
2eb30 3e 69 78 2d 2d 3b 0a 20 20 20 20 72 65 74 75 72  >ix--;.    retur
2eb40 6e 20 62 74 72 65 65 4e 65 78 74 28 70 43 75 72  n btreeNext(pCur
2eb50 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  );.  }.  if( pPa
2eb60 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2eb70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2eb80 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
2eb90 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74  eturn moveToLeft
2eba0 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a  most(pCur);.  }.
2ebb0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68  }../*.** Step th
2ebc0 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
2ebd0 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76  back to the prev
2ebe0 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68  ious entry in th
2ebf0 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 52  e database..** R
2ec00 65 74 75 72 6e 20 76 61 6c 75 65 73 3a 0a 2a 2a  eturn values:.**
2ec10 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f  .**     SQLITE_O
2ec20 4b 20 20 20 20 20 73 75 63 63 65 73 73 0a 2a 2a  K     success.**
2ec30 20 20 20 20 20 53 51 4c 49 54 45 5f 44 4f 4e 45       SQLITE_DONE
2ec40 20 20 20 74 68 65 20 63 75 72 73 6f 72 20 69 73     the cursor is
2ec50 20 61 6c 72 65 61 64 79 20 6f 6e 20 74 68 65 20   already on the 
2ec60 66 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66  first element of
2ec70 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 20 20   the table.**   
2ec80 20 20 6f 74 68 65 72 77 69 73 65 20 20 20 20 20    otherwise     
2ec90 73 6f 6d 65 20 6b 69 6e 64 20 6f 66 20 65 72 72  some kind of err
2eca0 6f 72 20 6f 63 63 75 72 72 65 64 0a 2a 2a 0a 2a  or occurred.**.*
2ecb0 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e 74 72 79  * The main entry
2ecc0 20 70 6f 69 6e 74 20 69 73 20 73 71 6c 69 74 65   point is sqlite
2ecd0 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 29  3BtreePrevious()
2ece0 2e 20 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20  .  That routine 
2ecf0 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20  is optimized.** 
2ed00 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63  for the common c
2ed10 61 73 65 20 6f 66 20 6d 65 72 65 6c 79 20 64 65  ase of merely de
2ed20 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63  crementing the c
2ed30 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75  ell counter BtCu
2ed40 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f  rsor.aiIdx.** to
2ed50 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 65   the previous ce
2ed60 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ll on the curren
2ed70 74 20 70 61 67 65 2e 20 20 54 68 65 20 28 73 6c  t page.  The (sl
2ed80 6f 77 65 72 29 20 62 74 72 65 65 50 72 65 76 69  ower) btreePrevi
2ed90 6f 75 73 28 29 0a 2a 2a 20 68 65 6c 70 65 72 20  ous().** helper 
2eda0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
2edb0 64 20 77 68 65 6e 20 69 74 20 69 73 20 6e 65 63  d when it is nec
2edc0 65 73 73 61 72 79 20 74 6f 20 6d 6f 76 65 20 74  essary to move t
2edd0 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 61  o a different pa
2ede0 67 65 0a 2a 2a 20 6f 72 20 74 6f 20 72 65 73 74  ge.** or to rest
2edf0 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a  ore the cursor..
2ee00 2a 2a 0a 2a 2a 20 49 66 20 62 69 74 20 30 78 30  **.** If bit 0x0
2ee10 31 20 6f 66 20 74 68 65 20 46 20 61 72 67 75 6d  1 of the F argum
2ee20 65 6e 74 20 74 6f 20 73 71 6c 69 74 65 33 42 74  ent to sqlite3Bt
2ee30 72 65 65 50 72 65 76 69 6f 75 73 28 43 2c 46 29  reePrevious(C,F)
2ee40 20 69 73 20 31 2c 20 74 68 65 6e 0a 2a 2a 20 74   is 1, then.** t
2ee50 68 65 20 63 75 72 73 6f 72 20 63 6f 72 72 65 73  he cursor corres
2ee60 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c 20  ponds to an SQL 
2ee70 69 6e 64 65 78 20 61 6e 64 20 74 68 69 73 20 72  index and this r
2ee80 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76  outine could hav
2ee90 65 20 62 65 65 6e 0a 2a 2a 20 73 6b 69 70 70 65  e been.** skippe
2eea0 64 20 69 66 20 74 68 65 20 53 51 4c 20 69 6e 64  d if the SQL ind
2eeb0 65 78 20 68 61 64 20 62 65 65 6e 20 61 20 75 6e  ex had been a un
2eec0 69 71 75 65 20 69 6e 64 65 78 2e 20 20 54 68 65  ique index.  The
2eed0 20 46 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61   F argument is a
2eee0 0a 2a 2a 20 68 69 6e 74 20 74 6f 20 74 68 65 20  .** hint to the 
2eef0 69 6d 70 6c 65 6d 65 6e 74 2e 20 20 54 68 65 20  implement.  The 
2ef00 6e 61 74 69 76 65 20 53 51 4c 69 74 65 20 62 74  native SQLite bt
2ef10 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ree implementati
2ef20 6f 6e 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 75  on does not.** u
2ef30 73 65 20 74 68 69 73 20 68 69 6e 74 2c 20 62 75  se this hint, bu
2ef40 74 20 43 4f 4d 44 42 32 20 64 6f 65 73 2e 0a 2a  t COMDB2 does..*
2ef50 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
2ef60 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72  NOINLINE int btr
2ef70 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72  eePrevious(BtCur
2ef80 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
2ef90 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20  t rc;.  MemPage 
2efa0 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  *pPage;..  asser
2efb0 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
2efc0 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
2efd0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73   assert( pCur->s
2efe0 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43  kipNext==0 || pC
2eff0 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2f000 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
2f010 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72  sert( (pCur->cur
2f020 46 6c 61 67 73 20 26 20 28 42 54 43 46 5f 41 74  Flags & (BTCF_At
2f030 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f  Last|BTCF_ValidO
2f040 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b  vfl|BTCF_ValidNK
2f050 65 79 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ey))==0 );.  ass
2f060 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
2f070 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 69 66  nSize==0 );.  if
2f080 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  ( pCur->eState!=
2f090 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a  CURSOR_VALID ){.
2f0a0 20 20 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65      rc = restore
2f0b0 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
2f0c0 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Cur);.    if( rc
2f0d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2f0e0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2f0f0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55      }.    if( CU
2f100 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43  RSOR_INVALID==pC
2f110 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
2f120 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2f130 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  E_DONE;.    }.  
2f140 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
2f150 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 61 73  Next ){.      as
2f160 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
2f170 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
2f180 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
2f190 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58  ==CURSOR_SKIPNEX
2f1a0 54 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  T );.      pCur-
2f1b0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
2f1c0 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 69 66  _VALID;.      if
2f1d0 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
2f1e0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  <0 ){.        pC
2f1f0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30  ur->skipNext = 0
2f200 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2f210 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2f220 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e    }.      pCur->
2f230 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  skipNext = 0;.  
2f240 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65    }.  }..  pPage
2f250 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
2f260 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
2f270 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
2f280 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 21  sInit );.  if( !
2f290 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2f2a0 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43 75     int idx = pCu
2f2b0 72 2d 3e 69 78 3b 0a 20 20 20 20 72 63 20 3d 20  r->ix;.    rc = 
2f2c0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
2f2d0 2c 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  , get4byte(findC
2f2e0 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 29  ell(pPage, idx))
2f2f0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
2f300 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72  return rc;.    r
2f310 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  c = moveToRightm
2f320 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c  ost(pCur);.  }el
2f330 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  se{.    while( p
2f340 43 75 72 2d 3e 69 78 3d 3d 30 20 29 7b 0a 20 20  Cur->ix==0 ){.  
2f350 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50      if( pCur->iP
2f360 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
2f370 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2f380 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
2f390 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2f3a0 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
2f3b0 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54     }.      moveT
2f3c0 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20  oParent(pCur);. 
2f3d0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
2f3e0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
2f3f0 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  e==0 );.    asse
2f400 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  rt( (pCur->curFl
2f410 61 67 73 20 26 20 28 42 54 43 46 5f 56 61 6c 69  ags & (BTCF_Vali
2f420 64 4f 76 66 6c 29 29 3d 3d 30 20 29 3b 0a 0a 20  dOvfl))==0 );.. 
2f430 20 20 20 70 43 75 72 2d 3e 69 78 2d 2d 3b 0a 20     pCur->ix--;. 
2f440 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d     pPage = pCur-
2f450 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2f460 61 67 65 5d 3b 0a 20 20 20 20 69 66 28 20 70 50  age];.    if( pP
2f470 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21  age->intKey && !
2f480 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2f490 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2f4a0 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 70  3BtreePrevious(p
2f4b0 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  Cur, 0);.    }el
2f4c0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
2f4d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
2f4e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2f4f0 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
2f500 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75  reePrevious(BtCu
2f510 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
2f520 66 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74  flags){.  assert
2f530 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
2f540 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
2f550 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30  assert( flags==0
2f560 20 7c 7c 20 66 6c 61 67 73 3d 3d 31 20 29 3b 0a   || flags==1 );.
2f570 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2f580 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70  skipNext==0 || p
2f590 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
2f5a0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 55  SOR_VALID );.  U
2f5b0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2f5c0 20 66 6c 61 67 73 20 29 3b 20 20 2f 2a 20 55 73   flags );  /* Us
2f5d0 65 64 20 69 6e 20 43 4f 4d 44 42 32 20 62 75 74  ed in COMDB2 but
2f5e0 20 6e 6f 74 20 6e 61 74 69 76 65 20 53 51 4c 69   not native SQLi
2f5f0 74 65 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 63 75  te */.  pCur->cu
2f600 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
2f610 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c  _AtLast|BTCF_Val
2f620 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69  idOvfl|BTCF_Vali
2f630 64 4e 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e  dNKey);.  pCur->
2f640 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
2f650 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
2f660 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2f670 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 69 78 3d  .   || pCur->ix=
2f680 3d 30 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61  =0.   || pCur->a
2f690 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2f6a0 65 5d 2d 3e 6c 65 61 66 3d 3d 30 0a 20 20 29 7b  e]->leaf==0.  ){
2f6b0 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65  .    return btre
2f6c0 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 29 3b  ePrevious(pCur);
2f6d0 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 78 2d  .  }.  pCur->ix-
2f6e0 2d 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  -;.  return SQLI
2f6f0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
2f700 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70  Allocate a new p
2f710 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74  age from the dat
2f720 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
2f730 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 69  * The new page i
2f740 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74  s marked as dirt
2f750 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f  y.  (In other wo
2f760 72 64 73 2c 20 73 71 6c 69 74 65 33 50 61 67 65  rds, sqlite3Page
2f770 72 57 72 69 74 65 28 29 0a 2a 2a 20 68 61 73 20  rWrite().** has 
2f780 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
2f790 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20 70  led on the new p
2f7a0 61 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20 70  age.)  The new p
2f7b0 61 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20  age has also.** 
2f7c0 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64 20  been referenced 
2f7d0 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  and the calling 
2f7e0 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70 6f  routine is respo
2f7f0 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69  nsible for calli
2f800 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  ng.** sqlite3Pag
2f810 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65  erUnref() on the
2f820 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20 69   new page when i
2f830 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a  t is done..**.**
2f840 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
2f850 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73  turned on succes
2f860 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65  s.  Any other re
2f870 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63  turn value indic
2f880 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  ates.** an error
2f890 2e 20 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  .  *ppPage is se
2f8a0 74 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 74 68 65  t to NULL in the
2f8b0 20 65 76 65 6e 74 20 6f 66 20 61 6e 20 65 72 72   event of an err
2f8c0 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  or..**.** If the
2f8d0 20 22 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65   "nearby" parame
2f8e0 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68  ter is not 0, th
2f8f0 65 6e 20 61 6e 20 65 66 66 6f 72 74 20 69 73 20  en an effort is 
2f900 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61  made to .** loca
2f910 74 65 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20  te a page close 
2f920 74 6f 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  to the page numb
2f930 65 72 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68  er "nearby".  Th
2f940 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 69  is can be used i
2f950 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20  n an.** attempt 
2f960 74 6f 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20  to keep related 
2f970 70 61 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65  pages close to e
2f980 61 63 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65  ach other in the
2f990 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a   database file,.
2f9a0 2a 2a 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e  ** which in turn
2f9b0 20 63 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61   can make databa
2f9c0 73 65 20 61 63 63 65 73 73 20 66 61 73 74 65 72  se access faster
2f9d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
2f9e0 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20 69  Mode parameter i
2f9f0 73 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20  s BTALLOC_EXACT 
2fa00 61 6e 64 20 74 68 65 20 6e 65 61 72 62 79 20 70  and the nearby p
2fa10 61 67 65 20 65 78 69 73 74 73 0a 2a 2a 20 61 6e  age exists.** an
2fa20 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72  ywhere on the fr
2fa30 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69 74  ee-list, then it
2fa40 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
2fa50 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20  o be returned.  
2fa60 49 66 0a 2a 2a 20 65 4d 6f 64 65 20 69 73 20 42  If.** eMode is B
2fa70 54 41 4c 4c 4f 43 5f 4c 54 20 74 68 65 6e 20 74  TALLOC_LT then t
2fa80 68 65 20 70 61 67 65 20 72 65 74 75 72 6e 65 64  he page returned
2fa90 20 77 69 6c 6c 20 62 65 20 6c 65 73 73 20 74 68   will be less th
2faa0 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74  an or equal.** t
2fab0 6f 20 6e 65 61 72 62 79 20 69 66 20 61 6e 79 20  o nearby if any 
2fac0 73 75 63 68 20 70 61 67 65 20 65 78 69 73 74 73  such page exists
2fad0 2e 20 20 49 66 20 65 4d 6f 64 65 20 69 73 20 42  .  If eMode is B
2fae0 54 41 4c 4c 4f 43 5f 41 4e 59 20 74 68 65 6e 20  TALLOC_ANY then 
2faf0 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
2fb00 72 65 73 74 72 69 63 74 69 6f 6e 73 20 6f 6e 20  restrictions on 
2fb10 77 68 69 63 68 20 70 61 67 65 20 69 73 20 72 65  which page is re
2fb20 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
2fb30 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74  c int allocateBt
2fb40 72 65 65 50 61 67 65 28 0a 20 20 42 74 53 68 61  reePage(.  BtSha
2fb50 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
2fb60 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
2fb70 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
2fb80 50 61 67 65 2c 20 20 20 20 20 20 2f 2a 20 53 74  Page,      /* St
2fb90 6f 72 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  ore pointer to t
2fba0 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  he allocated pag
2fbb0 65 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f  e here */.  Pgno
2fbc0 20 2a 70 50 67 6e 6f 2c 20 20 20 20 20 20 20 20   *pPgno,        
2fbd0 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20     /* Store the 
2fbe0 70 61 67 65 20 6e 75 6d 62 65 72 20 68 65 72 65  page number here
2fbf0 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62   */.  Pgno nearb
2fc00 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y,           /* 
2fc10 53 65 61 72 63 68 20 66 6f 72 20 61 20 70 61 67  Search for a pag
2fc20 65 20 6e 65 61 72 20 74 68 69 73 20 6f 6e 65 20  e near this one 
2fc30 2a 2f 0a 20 20 75 38 20 65 4d 6f 64 65 20 20 20  */.  u8 eMode   
2fc40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
2fc50 54 41 4c 4c 4f 43 5f 45 58 41 43 54 2c 20 42 54  TALLOC_EXACT, BT
2fc60 41 4c 4c 4f 43 5f 4c 54 2c 20 6f 72 20 42 54 41  ALLOC_LT, or BTA
2fc70 4c 4c 4f 43 5f 41 4e 59 20 2a 2f 0a 29 7b 0a 20  LLOC_ANY */.){. 
2fc80 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
2fc90 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33  ;.  int rc;.  u3
2fca0 32 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  2 n;     /* Numb
2fcb0 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74  er of pages on t
2fcc0 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20  he freelist */. 
2fcd0 20 75 33 32 20 6b 3b 20 20 20 20 20 2f 2a 20 4e   u32 k;     /* N
2fce0 75 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20  umber of leaves 
2fcf0 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20  on the trunk of 
2fd00 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a  the freelist */.
2fd10 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e    MemPage *pTrun
2fd20 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  k = 0;.  MemPage
2fd30 20 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30   *pPrevTrunk = 0
2fd40 3b 0a 20 20 50 67 6e 6f 20 6d 78 50 61 67 65 3b  ;.  Pgno mxPage;
2fd50 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69       /* Total si
2fd60 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
2fd70 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73  se file */..  as
2fd80 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2fd90 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
2fda0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
2fdb0 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  ( eMode==BTALLOC
2fdc0 5f 41 4e 59 20 7c 7c 20 28 6e 65 61 72 62 79 3e  _ANY || (nearby>
2fdd0 30 20 26 26 20 49 66 4e 6f 74 4f 6d 69 74 41 56  0 && IfNotOmitAV
2fde0 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  (pBt->autoVacuum
2fdf0 29 29 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d  )) );.  pPage1 =
2fe00 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20   pBt->pPage1;.  
2fe10 6d 78 50 61 67 65 20 3d 20 62 74 72 65 65 50 61  mxPage = btreePa
2fe20 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20  gecount(pBt);.  
2fe30 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
2fe40 52 2d 30 35 31 31 39 2d 30 32 36 33 37 20 54 68  R-05119-02637 Th
2fe50 65 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  e 4-byte big-end
2fe60 69 61 6e 20 69 6e 74 65 67 65 72 20 61 74 20 6f  ian integer at o
2fe70 66 66 73 65 74 20 33 36 0a 20 20 2a 2a 20 73 74  ffset 36.  ** st
2fe80 6f 72 65 73 20 73 74 6f 72 65 73 20 74 68 65 20  ores stores the 
2fe90 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
2fea0 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
2feb0 65 6c 69 73 74 2e 20 2a 2f 0a 20 20 6e 20 3d 20  elist. */.  n = 
2fec0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
2fed0 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
2fee0 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 6d 78 50  testcase( n==mxP
2fef0 61 67 65 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e  age-1 );.  if( n
2ff00 3e 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20  >=mxPage ){.    
2ff10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
2ff20 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
2ff30 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20    if( n>0 ){.   
2ff40 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 70 61   /* There are pa
2ff50 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
2ff60 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e 65 20  ist.  Reuse one 
2ff70 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 2e 20  of those pages. 
2ff80 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54 72 75  */.    Pgno iTru
2ff90 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61 72 63  nk;.    u8 searc
2ffa0 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66  hList = 0; /* If
2ffb0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6d   the free-list m
2ffc0 75 73 74 20 62 65 20 73 65 61 72 63 68 65 64 20  ust be searched 
2ffd0 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a  for 'nearby' */.
2ffe0 20 20 20 20 75 33 32 20 6e 53 65 61 72 63 68 20      u32 nSearch 
2fff0 3d 20 30 3b 20 20 20 2f 2a 20 43 6f 75 6e 74 20  = 0;   /* Count 
30000 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
30010 20 73 65 61 72 63 68 20 61 74 74 65 6d 70 74 73   search attempts
30020 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20   */.    .    /* 
30030 49 66 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  If eMode==BTALLO
30040 43 5f 45 58 41 43 54 20 61 6e 64 20 61 20 71 75  C_EXACT and a qu
30050 65 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74  ery of the point
30060 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68  er-map.    ** sh
30070 6f 77 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ows that the pag
30080 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f  e 'nearby' is so
30090 6d 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66  mewhere on the f
300a0 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20  ree-list, then. 
300b0 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65     ** the entire
300c0 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65  -list will be se
300d0 61 72 63 68 65 64 20 66 6f 72 20 74 68 61 74 20  arched for that 
300e0 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  page..    */.#if
300f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
30100 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
30110 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  if( eMode==BTALL
30120 4f 43 5f 45 58 41 43 54 20 29 7b 0a 20 20 20 20  OC_EXACT ){.    
30130 20 20 69 66 28 20 6e 65 61 72 62 79 3c 3d 6d 78    if( nearby<=mx
30140 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
30150 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20  u8 eType;.      
30160 20 20 61 73 73 65 72 74 28 20 6e 65 61 72 62 79    assert( nearby
30170 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  >0 );.        as
30180 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
30190 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 20  acuum );.       
301a0 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
301b0 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54  pBt, nearby, &eT
301c0 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ype, 0);.       
301d0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
301e0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28   rc;.        if(
301f0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46   eType==PTRMAP_F
30200 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20  REEPAGE ){.     
30210 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
30220 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
30230 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
30240 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c   if( eMode==BTAL
30250 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20  LOC_LE ){.      
30260 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a  searchList = 1;.
30270 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
30280 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
30290 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75  he free-list cou
302a0 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69 54 72  nt by 1. Set iTr
302b0 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78  unk to the index
302c0 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66   of the.    ** f
302d0 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74  irst free-list t
302e0 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76  runk page. iPrev
302f0 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c  Trunk is initial
30300 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ly 1..    */.   
30310 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
30320 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e  erWrite(pPage1->
30330 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
30340 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
30350 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26  ;.    put4byte(&
30360 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
30370 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a  ], n-1);..    /*
30380 20 54 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e   The code within
30390 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75   this loop is ru
303a0 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74  n only once if t
303b0 68 65 20 27 73 65 61 72 63 68 4c 69 73 74 27 20  he 'searchList' 
303c0 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20  variable.    ** 
303d0 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68  is not true. Oth
303e0 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20  erwise, it runs 
303f0 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 72  once for each tr
30400 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a  unk-page on the.
30410 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74      ** free-list
30420 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20   until the page 
30430 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61  'nearby' is loca
30440 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c  ted (eMode==BTAL
30450 4c 4f 43 5f 45 58 41 43 54 29 0a 20 20 20 20 2a  LOC_EXACT).    *
30460 2a 20 6f 72 20 75 6e 74 69 6c 20 61 20 70 61 67  * or until a pag
30470 65 20 6c 65 73 73 20 74 68 61 6e 20 27 6e 65 61  e less than 'nea
30480 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20  rby' is located 
30490 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f  (eMode==BTALLOC_
304a0 4c 54 29 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  LT).    */.    d
304b0 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54  o {.      pPrevT
304c0 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  runk = pTrunk;. 
304d0 20 20 20 20 20 69 66 28 20 70 50 72 65 76 54 72       if( pPrevTr
304e0 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  unk ){.        /
304f0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
30500 2d 30 31 35 30 36 2d 31 31 30 35 33 20 54 68 65  -01506-11053 The
30510 20 66 69 72 73 74 20 69 6e 74 65 67 65 72 20 6f   first integer o
30520 6e 20 61 20 66 72 65 65 6c 69 73 74 20 74 72 75  n a freelist tru
30530 6e 6b 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  nk page.        
30540 2a 2a 20 69 73 20 74 68 65 20 70 61 67 65 20 6e  ** is the page n
30550 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78  umber of the nex
30560 74 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b  t freelist trunk
30570 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73   page in the lis
30580 74 20 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  t or.        ** 
30590 7a 65 72 6f 20 69 66 20 74 68 69 73 20 69 73 20  zero if this is 
305a0 74 68 65 20 6c 61 73 74 20 66 72 65 65 6c 69 73  the last freelis
305b0 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 2a 2f  t trunk page. */
305c0 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20  .        iTrunk 
305d0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 72 65  = get4byte(&pPre
305e0 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  vTrunk->aData[0]
305f0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
30600 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45          /* EVIDE
30610 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 38 34 31 2d  NCE-OF: R-59841-
30620 31 33 37 39 38 20 54 68 65 20 34 2d 62 79 74 65  13798 The 4-byte
30630 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
30640 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 33 32  ger at offset 32
30650 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72  .        ** stor
30660 65 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  es the page numb
30670 65 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  er of the first 
30680 70 61 67 65 20 6f 66 20 74 68 65 20 66 72 65 65  page of the free
30690 6c 69 73 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66  list, or zero if
306a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
306b0 66 72 65 65 6c 69 73 74 20 69 73 20 65 6d 70 74  freelist is empt
306c0 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 54  y. */.        iT
306d0 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
306e0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
306f0 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  2]);.      }.   
30700 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54 72     testcase( iTr
30710 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20  unk==mxPage );. 
30720 20 20 20 20 20 69 66 28 20 69 54 72 75 6e 6b 3e       if( iTrunk>
30730 6d 78 50 61 67 65 20 7c 7c 20 6e 53 65 61 72 63  mxPage || nSearc
30740 68 2b 2b 20 3e 20 6e 20 29 7b 0a 20 20 20 20 20  h++ > n ){.     
30750 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
30760 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 72 65  ORRUPT_PGNO(pPre
30770 76 54 72 75 6e 6b 20 3f 20 70 50 72 65 76 54 72  vTrunk ? pPrevTr
30780 75 6e 6b 2d 3e 70 67 6e 6f 20 3a 20 31 29 3b 0a  unk->pgno : 1);.
30790 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
307a0 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
307b0 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74  etUnusedPage(pBt
307c0 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e  , iTrunk, &pTrun
307d0 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  k, 0);.      }. 
307e0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
307f0 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
30800 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  0;.        goto 
30810 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
30820 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
30830 20 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b 21   assert( pTrunk!
30840 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
30850 72 74 28 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74  rt( pTrunk->aDat
30860 61 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 2f 2a  a!=0 );.      /*
30870 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
30880 31 33 35 32 33 2d 30 34 33 39 34 20 54 68 65 20  13523-04394 The 
30890 73 65 63 6f 6e 64 20 69 6e 74 65 67 65 72 20 6f  second integer o
308a0 6e 20 61 20 66 72 65 65 6c 69 73 74 20 74 72 75  n a freelist tru
308b0 6e 6b 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  nk page.      **
308c0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
308d0 66 20 6c 65 61 66 20 70 61 67 65 20 70 6f 69 6e  f leaf page poin
308e0 74 65 72 73 20 74 6f 20 66 6f 6c 6c 6f 77 2e 20  ters to follow. 
308f0 2a 2f 0a 20 20 20 20 20 20 6b 20 3d 20 67 65 74  */.      k = get
30900 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
30910 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20  Data[4]);.      
30920 69 66 28 20 6b 3d 3d 30 20 26 26 20 21 73 65 61  if( k==0 && !sea
30930 72 63 68 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  rchList ){.     
30940 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20     /* The trunk 
30950 68 61 73 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e  has no leaves an
30960 64 20 74 68 65 20 6c 69 73 74 20 69 73 20 6e 6f  d the list is no
30970 74 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64  t being searched
30980 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f  . .        ** So
30990 20 65 78 74 72 61 63 74 20 74 68 65 20 74 72 75   extract the tru
309a0 6e 6b 20 70 61 67 65 20 69 74 73 65 6c 66 20 61  nk page itself a
309b0 6e 64 20 75 73 65 20 69 74 20 61 73 20 74 68 65  nd use it as the
309c0 20 6e 65 77 6c 79 20 0a 20 20 20 20 20 20 20 20   newly .        
309d0 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  ** allocated pag
309e0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  e */.        ass
309f0 65 72 74 28 20 70 50 72 65 76 54 72 75 6e 6b 3d  ert( pPrevTrunk=
30a00 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  =0 );.        rc
30a10 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
30a20 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
30a30 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
30a40 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
30a50 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
30a60 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
30a70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 50     }.        *pP
30a80 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20  gno = iTrunk;.  
30a90 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
30aa0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
30ab0 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
30ac0 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
30ad0 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b  *ppPage = pTrunk
30ae0 3b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  ;.        pTrunk
30af0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52   = 0;.        TR
30b00 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
30b10 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72  %d trunk - %d fr
30b20 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22  ee pages left\n"
30b30 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b  , *pPgno, n-1));
30b40 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
30b50 20 6b 3e 28 75 33 32 29 28 70 42 74 2d 3e 75 73   k>(u32)(pBt->us
30b60 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29 20  ableSize/4 - 2) 
30b70 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61  ){.        /* Va
30b80 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f 75 74 20  lue of k is out 
30b90 6f 66 20 72 61 6e 67 65 2e 20 20 44 61 74 61 62  of range.  Datab
30ba0 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a  ase corruption *
30bb0 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  /.        rc = S
30bc0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47  QLITE_CORRUPT_PG
30bd0 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a 20 20 20 20  NO(iTrunk);.    
30be0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
30bf0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e  ocate_page;.#ifn
30c00 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
30c10 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
30c20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 61 72 63   }else if( searc
30c30 68 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20 20  hList .         
30c40 20 20 20 26 26 20 28 6e 65 61 72 62 79 3d 3d 69     && (nearby==i
30c50 54 72 75 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b  Trunk || (iTrunk
30c60 3c 6e 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65  <nearby && eMode
30c70 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a  ==BTALLOC_LE)) .
30c80 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
30c90 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20   /* The list is 
30ca0 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 20 61  being searched a
30cb0 6e 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61  nd this trunk pa
30cc0 67 65 20 69 73 20 74 68 65 20 70 61 67 65 0a 20  ge is the page. 
30cd0 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c         ** to all
30ce0 6f 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73  ocate, regardles
30cf0 73 20 6f 66 20 77 68 65 74 68 65 72 20 69 74 20  s of whether it 
30d00 68 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20  has leaves..    
30d10 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a      */.        *
30d20 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a  pPgno = iTrunk;.
30d30 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20          *ppPage 
30d40 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = pTrunk;.      
30d50 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30    searchList = 0
30d60 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
30d70 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
30d80 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
30d90 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
30da0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  c ){.          g
30db0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
30dc0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  _page;.        }
30dd0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d  .        if( k==
30de0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
30df0 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29  f( !pPrevTrunk )
30e00 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
30e10 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44  mcpy(&pPage1->aD
30e20 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b  ata[32], &pTrunk
30e30 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
30e40 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
30e50 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
30e60 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
30e70 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e  ite(pPrevTrunk->
30e80 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
30e90 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
30ea0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
30eb0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
30ec0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
30ed0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
30ee0 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
30ef0 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61  y(&pPrevTrunk->a
30f00 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b  Data[0], &pTrunk
30f10 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
30f20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
30f30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
30f40 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e       /* The trun
30f50 6b 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72  k page is requir
30f60 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
30f70 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73   but it contains
30f80 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70   .          ** p
30f90 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d  ointers to free-
30fa0 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65  list leaves. The
30fb0 20 66 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f   first leaf beco
30fc0 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20  mes a trunk.    
30fd0 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e        ** page in
30fe0 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20   this case..    
30ff0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
31000 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
31010 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20  Trunk;.         
31020 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20   Pgno iNewTrunk 
31030 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
31040 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20  nk->aData[8]);. 
31050 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65           if( iNe
31060 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b  wTrunk>mxPage ){
31070 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63   .            rc
31080 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
31090 54 5f 50 47 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a  T_PGNO(iTrunk);.
310a0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
310b0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
310c0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ge;.          }.
310d0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
310e0 73 65 28 20 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d  se( iNewTrunk==m
310f0 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20  xPage );.       
31100 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
31110 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20  UnusedPage(pBt, 
31120 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77  iNewTrunk, &pNew
31130 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20  Trunk, 0);.     
31140 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
31150 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
31160 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
31170 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
31180 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31190 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
311a0 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77 54  PagerWrite(pNewT
311b0 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
311c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
311d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
311e0 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61             relea
311f0 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b  sePage(pNewTrunk
31200 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  );.            g
31210 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
31220 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
31230 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d   }.          mem
31240 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e  cpy(&pNewTrunk->
31250 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e  aData[0], &pTrun
31260 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
31270 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
31280 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e  yte(&pNewTrunk->
31290 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a  aData[4], k-1);.
312a0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
312b0 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61  (&pNewTrunk->aDa
312c0 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  ta[8], &pTrunk->
312d0 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29  aData[12], (k-1)
312e0 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  *4);.          r
312f0 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54  eleasePage(pNewT
31300 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
31310 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b   if( !pPrevTrunk
31320 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
31330 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
31340 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
31350 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
31360 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
31370 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
31380 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65  ->aData[32], iNe
31390 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
313a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
313b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
313c0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 72  e3PagerWrite(pPr
313d0 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  evTrunk->pDbPage
313e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
313f0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
31400 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
31410 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
31420 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
31430 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
31440 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61  e(&pPrevTrunk->a
31450 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75  Data[0], iNewTru
31460 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nk);.          }
31470 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
31480 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20     pTrunk = 0;. 
31490 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41         TRACE(("A
314a0 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e  LLOCATE: %d trun
314b0 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65  k - %d free page
314c0 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e  s left\n", *pPgn
314d0 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66  o, n-1));.#endif
314e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
314f0 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20   k>0 ){.        
31500 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65 61  /* Extract a lea
31510 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b  f from the trunk
31520 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20   */.        u32 
31530 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20 20  closest;.       
31540 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20   Pgno iPage;.   
31550 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
31560 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72 75  ar *aData = pTru
31570 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20  nk->aData;.     
31580 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30 20     if( nearby>0 
31590 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32  ){.          u32
315a0 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c   i;.          cl
315b0 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  osest = 0;.     
315c0 20 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d       if( eMode==
315d0 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20  BTALLOC_LE ){.  
315e0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
315f0 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<k; i++){.  
31600 20 20 20 20 20 20 20 20 20 20 20 20 69 50 61 67              iPag
31610 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44  e = get4byte(&aD
31620 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20 20  ata[8+i*4]);.   
31630 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
31640 50 61 67 65 3c 3d 6e 65 61 72 62 79 20 29 7b 0a  Page<=nearby ){.
31650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31660 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20  closest = i;.   
31670 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
31680 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
31690 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
316a0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  }.          }els
316b0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  e{.            i
316c0 6e 74 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20  nt dist;.       
316d0 20 20 20 20 20 64 69 73 74 20 3d 20 73 71 6c 69       dist = sqli
316e0 74 65 33 41 62 73 49 6e 74 33 32 28 67 65 74 34  te3AbsInt32(get4
316f0 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29 20  byte(&aData[8]) 
31700 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20  - nearby);.     
31710 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20         for(i=1; 
31720 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<k; i++){.     
31730 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 32 20           int d2 
31740 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33  = sqlite3AbsInt3
31750 32 28 67 65 74 34 62 79 74 65 28 26 61 44 61 74  2(get4byte(&aDat
31760 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72  a[8+i*4]) - near
31770 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  by);.           
31780 20 20 20 69 66 28 20 64 32 3c 64 69 73 74 20 29     if( d2<dist )
31790 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
317a0 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20    closest = i;. 
317b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
317c0 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20  ist = d2;.      
317d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
317e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
317f0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
31800 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f  e{.          clo
31810 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  sest = 0;.      
31820 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61    }..        iPa
31830 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
31840 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34  Data[8+closest*4
31850 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  ]);.        test
31860 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50  case( iPage==mxP
31870 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69  age );.        i
31880 66 28 20 69 50 61 67 65 3e 6d 78 50 61 67 65 20  f( iPage>mxPage 
31890 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
318a0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
318b0 5f 50 47 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a 20  _PGNO(iTrunk);. 
318c0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
318d0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
318e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
318f0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61     testcase( iPa
31900 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  ge==mxPage );.  
31910 20 20 20 20 20 20 69 66 28 20 21 73 65 61 72 63        if( !searc
31920 68 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20 20  hList .         
31930 7c 7c 20 28 69 50 61 67 65 3d 3d 6e 65 61 72 62  || (iPage==nearb
31940 79 20 7c 7c 20 28 69 50 61 67 65 3c 6e 65 61 72  y || (iPage<near
31950 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41  by && eMode==BTA
31960 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20 20  LLOC_LE)) .     
31970 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
31980 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20  int noContent;. 
31990 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20           *pPgno 
319a0 3d 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20  = iPage;.       
319b0 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
319c0 41 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66  ATE: %d was leaf
319d0 20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75   %d of %d on tru
319e0 6e 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20 20  nk %d".         
319f0 20 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f          ": %d mo
31a00 72 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22  re free pages\n"
31a10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
31a20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65     *pPgno, close
31a30 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d  st+1, k, pTrunk-
31a40 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20  >pgno, n-1));.  
31a50 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
31a60 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
31a70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
31a80 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
31a90 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c  c ) goto end_all
31aa0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
31ab0 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65 73        if( closes
31ac0 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  t<k-1 ){.       
31ad0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61       memcpy(&aDa
31ae0 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c  ta[8+closest*4],
31af0 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20   &aData[4+k*4], 
31b00 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  4);.          }.
31b10 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
31b20 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d  te(&aData[4], k-
31b30 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f  1);.          no
31b40 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72 65 65  Content = !btree
31b50 47 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42  GetHasContent(pB
31b60 74 2c 20 2a 70 50 67 6e 6f 29 3f 20 50 41 47 45  t, *pPgno)? PAGE
31b70 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20  R_GET_NOCONTENT 
31b80 3a 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  : 0;.          r
31b90 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73  c = btreeGetUnus
31ba0 65 64 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67  edPage(pBt, *pPg
31bb0 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f  no, ppPage, noCo
31bc0 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  ntent);.        
31bd0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
31be0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
31bf0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
31c00 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61  agerWrite((*ppPa
31c10 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge)->pDbPage);. 
31c20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
31c30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
31c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
31c50 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
31c60 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
31c70 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
31c80 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
31c90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31ca0 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
31cb0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
31cc0 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61     }.      relea
31cd0 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e  sePage(pPrevTrun
31ce0 6b 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76 54  k);.      pPrevT
31cf0 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77  runk = 0;.    }w
31d00 68 69 6c 65 28 20 73 65 61 72 63 68 4c 69 73 74  hile( searchList
31d10 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
31d20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f   /* There are no
31d30 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
31d40 65 65 6c 69 73 74 2c 20 73 6f 20 61 70 70 65 6e  eelist, so appen
31d50 64 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20  d a new page to 
31d60 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
31d70 61 73 65 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a  ase image..    *
31d80 2a 0a 20 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c  *.    ** Normall
31d90 79 2c 20 6e 65 77 20 70 61 67 65 73 20 61 6c 6c  y, new pages all
31da0 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20 62  ocated by this b
31db0 6c 6f 63 6b 20 63 61 6e 20 62 65 20 72 65 71 75  lock can be requ
31dc0 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 20  ested from the. 
31dd0 20 20 20 2a 2a 20 70 61 67 65 72 20 6c 61 79 65     ** pager laye
31de0 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63  r with the 'no-c
31df0 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74  ontent' flag set
31e00 2e 20 54 68 69 73 20 70 72 65 76 65 6e 74 73 20  . This prevents 
31e10 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a  the pager.    **
31e20 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20   from trying to 
31e30 72 65 61 64 20 74 68 65 20 70 61 67 65 73 20 63  read the pages c
31e40 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b  ontent from disk
31e50 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68  . However, if th
31e60 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74  e.    ** current
31e70 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
31e80 20 61 6c 72 65 61 64 79 20 72 75 6e 20 6f 6e 65   already run one
31e90 20 6f 72 20 6d 6f 72 65 20 69 6e 63 72 65 6d 65   or more increme
31ea0 6e 74 61 6c 2d 76 61 63 75 75 6d 0a 20 20 20 20  ntal-vacuum.    
31eb0 2a 2a 20 73 74 65 70 73 2c 20 74 68 65 6e 20 74  ** steps, then t
31ec0 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20 61  he page we are a
31ed0 62 6f 75 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65  bout to allocate
31ee0 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 63 6f 6e   may contain con
31ef0 74 65 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74  tent.    ** that
31f00 20 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20   is required in 
31f10 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72  the event of a r
31f20 6f 6c 6c 62 61 63 6b 2e 20 49 6e 20 74 68 69 73  ollback. In this
31f30 20 63 61 73 65 2c 20 64 6f 0a 20 20 20 20 2a 2a   case, do.    **
31f40 20 6e 6f 74 20 73 65 74 20 74 68 65 20 6e 6f 2d   not set the no-
31f50 63 6f 6e 74 65 6e 74 20 66 6c 61 67 2e 20 54 68  content flag. Th
31f60 69 73 20 63 61 75 73 65 73 20 74 68 65 20 70 61  is causes the pa
31f70 67 65 72 20 74 6f 20 6c 6f 61 64 20 61 6e 64 20  ger to load and 
31f80 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 74  journal.    ** t
31f90 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
31fa0 63 6f 6e 74 65 6e 74 20 62 65 66 6f 72 65 20 6f  content before o
31fb0 76 65 72 77 72 69 74 69 6e 67 20 69 74 2e 0a 20  verwriting it.. 
31fc0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74     **.    ** Not
31fd0 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  e that the pager
31fe0 20 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c   will not actual
31ff0 6c 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f  ly attempt to lo
32000 61 64 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a 20  ad or journal . 
32010 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 6f     ** content fo
32020 72 20 61 6e 79 20 70 61 67 65 20 74 68 61 74 20  r any page that 
32030 72 65 61 6c 6c 79 20 64 6f 65 73 20 6c 69 65 20  really does lie 
32040 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
32050 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
32060 20 2a 2a 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b   ** file on disk
32070 2e 20 53 6f 20 74 68 65 20 65 66 66 65 63 74 73  . So the effects
32080 20 6f 66 20 64 69 73 61 62 6c 69 6e 67 20 74 68   of disabling th
32090 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70 74  e no-content opt
320a0 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a  imization.    **
320b0 20 68 65 72 65 20 61 72 65 20 63 6f 6e 66 69 6e   here are confin
320c0 65 64 20 74 6f 20 74 68 6f 73 65 20 70 61 67 65  ed to those page
320d0 73 20 74 68 61 74 20 6c 69 65 20 62 65 74 77 65  s that lie betwe
320e0 65 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  en the end of th
320f0 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
32100 65 20 69 6d 61 67 65 20 61 6e 64 20 74 68 65 20  e image and the 
32110 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 62  end of the datab
32120 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
32130 0a 20 20 20 20 69 6e 74 20 62 4e 6f 43 6f 6e 74  .    int bNoCont
32140 65 6e 74 20 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f  ent = (0==IfNotO
32150 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72  mitAV(pBt->bDoTr
32160 75 6e 63 61 74 65 29 29 3f 20 50 41 47 45 52 5f  uncate))? PAGER_
32170 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 3a 30 3b  GET_NOCONTENT:0;
32180 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ..    rc = sqlit
32190 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74  e3PagerWrite(pBt
321a0 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
321b0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
321c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
321d0 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20  pBt->nPage++;.  
321e0 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65    if( pBt->nPage
321f0 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
32200 41 47 45 28 70 42 74 29 20 29 20 70 42 74 2d 3e  AGE(pBt) ) pBt->
32210 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65  nPage++;..#ifnde
32220 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
32230 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
32240 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
32250 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41 47   && PTRMAP_ISPAG
32260 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67  E(pBt, pBt->nPag
32270 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  e) ){.      /* I
32280 66 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20  f *pPgno refers 
32290 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70  to a pointer-map
322a0 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20   page, allocate 
322b0 74 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20  two new pages.  
322c0 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e      ** at the en
322d0 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e  d of the file in
322e0 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68  stead of one. Th
322f0 65 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65  e first allocate
32300 64 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  d page.      ** 
32310 62 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f  becomes a new po
32320 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20  inter-map page, 
32330 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73  the second is us
32340 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
32350 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
32360 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 20 3d 20   MemPage *pPg = 
32370 30 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28  0;.      TRACE((
32380 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72  "ALLOCATE: %d fr
32390 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28  om end of file (
323a0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
323b0 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65  )\n", pBt->nPage
323c0 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ));.      assert
323d0 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45  ( pBt->nPage!=PE
323e0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
323f0 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20 72 63  pBt) );.      rc
32400 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65   = btreeGetUnuse
32410 64 50 61 67 65 28 70 42 74 2c 20 70 42 74 2d 3e  dPage(pBt, pBt->
32420 6e 50 61 67 65 2c 20 26 70 50 67 2c 20 62 4e 6f  nPage, &pPg, bNo
32430 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20  Content);.      
32440 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
32450 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
32460 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
32470 69 74 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65  ite(pPg->pDbPage
32480 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
32490 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  sePage(pPg);.   
324a0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
324b0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
324c0 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b       pBt->nPage+
324d0 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  +;.      if( pBt
324e0 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47  ->nPage==PENDING
324f0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
32500 29 7b 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b  ){ pBt->nPage++;
32510 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
32520 20 20 20 20 70 75 74 34 62 79 74 65 28 32 38 20      put4byte(28 
32530 2b 20 28 75 38 2a 29 70 42 74 2d 3e 70 50 61 67  + (u8*)pBt->pPag
32540 65 31 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e  e1->aData, pBt->
32550 6e 50 61 67 65 29 3b 0a 20 20 20 20 2a 70 50 67  nPage);.    *pPg
32560 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b  no = pBt->nPage;
32570 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70  ..    assert( *p
32580 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno!=PENDING_BY
32590 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
325a0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
325b0 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c  tUnusedPage(pBt,
325c0 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c   *pPgno, ppPage,
325d0 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20   bNoContent);.  
325e0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
325f0 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73  n rc;.    rc = s
32600 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
32610 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50  ((*ppPage)->pDbP
32620 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
32630 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
32640 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
32650 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  (*ppPage);.     
32660 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
32670 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22    }.    TRACE(("
32680 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f  ALLOCATE: %d fro
32690 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22  m end of file\n"
326a0 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a  , *pPgno));.  }.
326b0 0a 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e  .  assert( *pPgn
326c0 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o!=PENDING_BYTE_
326d0 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e  PAGE(pBt) );..en
326e0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a  d_allocate_page:
326f0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
32700 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73  Trunk);.  releas
32710 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b  ePage(pPrevTrunk
32720 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  );.  assert( rc!
32730 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71  =SQLITE_OK || sq
32740 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
32750 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29  fcount((*ppPage)
32760 2d 3e 70 44 62 50 61 67 65 29 3c 3d 31 20 29 3b  ->pDbPage)<=1 );
32770 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
32780 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 2a 70 70  QLITE_OK || (*pp
32790 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30  Page)->isInit==0
327a0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
327b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
327c0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
327d0 74 6f 20 61 64 64 20 70 61 67 65 20 69 50 61 67  to add page iPag
327e0 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
327f0 65 20 66 69 6c 65 20 66 72 65 65 2d 6c 69 73 74  e file free-list
32800 2e 20 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75  . .** It is assu
32810 6d 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67  med that the pag
32820 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
32830 20 61 20 70 61 72 74 20 6f 66 20 74 68 65 20 66   a part of the f
32840 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ree-list..**.** 
32850 54 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64  The value passed
32860 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
32870 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
32880 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74 69  function is opti
32890 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20  onal..** If the 
328a0 63 61 6c 6c 65 72 20 68 61 70 70 65 6e 73 20 74  caller happens t
328b0 6f 20 68 61 76 65 20 61 20 70 6f 69 6e 74 65 72  o have a pointer
328c0 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20   to the MemPage 
328d0 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65  object .** corre
328e0 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65  sponding to page
328f0 20 69 50 61 67 65 20 68 61 6e 64 79 2c 20 69 74   iPage handy, it
32900 20 6d 61 79 20 70 61 73 73 20 69 74 20 61 73 20   may pass it as 
32910 74 68 65 20 73 65 63 6f 6e 64 20 76 61 6c 75 65  the second value
32920 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  . .** Otherwise,
32930 20 69 74 20 6d 61 79 20 70 61 73 73 20 4e 55 4c   it may pass NUL
32940 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f  L..**.** If a po
32950 69 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 50 61  inter to a MemPa
32960 67 65 20 6f 62 6a 65 63 74 20 69 73 20 70 61 73  ge object is pas
32970 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
32980 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69  d argument,.** i
32990 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  ts reference cou
329a0 6e 74 20 69 73 20 6e 6f 74 20 61 6c 74 65 72 65  nt is not altere
329b0 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
329c0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
329d0 74 20 66 72 65 65 50 61 67 65 32 28 42 74 53 68  t freePage2(BtSh
329e0 61 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61  ared *pBt, MemPa
329f0 67 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67  ge *pMemPage, Pg
32a00 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d  no iPage){.  Mem
32a10 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30  Page *pTrunk = 0
32a20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
32a30 20 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20 74 72   /* Free-list tr
32a40 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50 67  unk page */.  Pg
32a50 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20  no iTrunk = 0;  
32a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32a70 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
32a80 20 6f 66 20 66 72 65 65 2d 6c 69 73 74 20 74 72   of free-list tr
32a90 75 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d  unk page */ .  M
32aa0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d  emPage *pPage1 =
32ab0 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 20 20 20   pBt->pPage1;   
32ac0 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65     /* Local refe
32ad0 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20  rence to page 1 
32ae0 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  */.  MemPage *pP
32af0 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
32b00 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
32b10 20 62 65 69 6e 67 20 66 72 65 65 64 2e 20 4d 61   being freed. Ma
32b20 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20  y be NULL. */.  
32b30 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
32b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32b50 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f      /* Return Co
32b60 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65  de */.  int nFre
32b70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
32b80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
32b90 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66  nitial number of
32ba0 20 70 61 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c   pages on free-l
32bb0 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ist */..  assert
32bc0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
32bd0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
32be0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f   );.  assert( CO
32bf0 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 50 61 67  RRUPT_DB || iPag
32c00 65 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e>1 );.  assert(
32c10 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d   !pMemPage || pM
32c20 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50  emPage->pgno==iP
32c30 61 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 69 50  age );..  if( iP
32c40 61 67 65 3c 32 20 29 20 72 65 74 75 72 6e 20 53  age<2 ) return S
32c50 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
32c60 50 54 3b 0a 20 20 69 66 28 20 70 4d 65 6d 50 61  PT;.  if( pMemPa
32c70 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 20  ge ){.    pPage 
32c80 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20  = pMemPage;.    
32c90 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28  sqlite3PagerRef(
32ca0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
32cb0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
32cc0 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 4c  age = btreePageL
32cd0 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50 61 67 65  ookup(pBt, iPage
32ce0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63  );.  }..  /* Inc
32cf0 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 20  rement the free 
32d00 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50  page count on pP
32d10 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73  age1 */.  rc = s
32d20 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
32d30 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
32d40 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
32d50 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
32d60 0a 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62  .  nFree = get4b
32d70 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
32d80 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34 62  ta[36]);.  put4b
32d90 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
32da0 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29  ta[36], nFree+1)
32db0 3b 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74  ;..  if( pBt->bt
32dc0 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43  sFlags & BTS_SEC
32dd0 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20  URE_DELETE ){.  
32de0 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63 75    /* If the secu
32df0 72 65 5f 64 65 6c 65 74 65 20 6f 70 74 69 6f 6e  re_delete option
32e00 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65   is enabled, the
32e10 6e 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20  n.    ** always 
32e20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65 20  fully overwrite 
32e30 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74  deleted informat
32e40 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a  ion with zeros..
32e50 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
32e60 21 70 50 61 67 65 20 26 26 20 28 28 72 63 20 3d  !pPage && ((rc =
32e70 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
32e80 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67 65  t, iPage, &pPage
32e90 2c 20 30 29 29 21 3d 30 29 20 29 0a 20 20 20 20  , 0))!=0) ).    
32ea0 20 7c 7c 20 20 20 20 20 20 20 20 20 20 20 20 28   ||            (
32eb0 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67  (rc = sqlite3Pag
32ec0 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
32ed0 44 62 50 61 67 65 29 29 21 3d 30 29 0a 20 20 20  DbPage))!=0).   
32ee0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66   ){.      goto f
32ef0 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  reepage_out;.   
32f00 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50   }.    memset(pP
32f10 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70  age->aData, 0, p
32f20 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53  Page->pBt->pageS
32f30 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ize);.  }..  /* 
32f40 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
32f50 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61  supports auto-va
32f60 63 75 75 6d 2c 20 77 72 69 74 65 20 61 6e 20 65  cuum, write an e
32f70 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e  ntry in the poin
32f80 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20  ter-map.  ** to 
32f90 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
32fa0 65 20 70 61 67 65 20 69 73 20 66 72 65 65 2e 0a  e page is free..
32fb0 20 20 2a 2f 0a 20 20 69 66 28 20 49 53 41 55 54    */.  if( ISAUT
32fc0 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 70  OVACUUM ){.    p
32fd0 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 50  trmapPut(pBt, iP
32fe0 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45  age, PTRMAP_FREE
32ff0 50 41 47 45 2c 20 30 2c 20 26 72 63 29 3b 0a 20  PAGE, 0, &rc);. 
33000 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
33010 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
33020 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e   }..  /* Now man
33030 69 70 75 6c 61 74 65 20 74 68 65 20 61 63 74 75  ipulate the actu
33040 61 6c 20 64 61 74 61 62 61 73 65 20 66 72 65 65  al database free
33050 2d 6c 69 73 74 20 73 74 72 75 63 74 75 72 65 2e  -list structure.
33060 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 0a 20   There are two. 
33070 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 69 65   ** possibilitie
33080 73 2e 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c  s. If the free-l
33090 69 73 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ist is currently
330a0 20 65 6d 70 74 79 2c 20 6f 72 20 69 66 20 74 68   empty, or if th
330b0 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 72 75  e first.  ** tru
330c0 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66  nk page in the f
330d0 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c  ree-list is full
330e0 2c 20 74 68 65 6e 20 74 68 69 73 20 70 61 67 65  , then this page
330f0 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20   will become a. 
33100 20 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c 69 73   ** new free-lis
33110 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74  t trunk page. Ot
33120 68 65 72 77 69 73 65 2c 20 69 74 20 77 69 6c 6c  herwise, it will
33130 20 62 65 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f   become a leaf o
33140 66 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74  f the.  ** first
33150 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74   trunk page in t
33160 68 65 20 63 75 72 72 65 6e 74 20 66 72 65 65 2d  he current free-
33170 6c 69 73 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b  list. This block
33180 20 74 65 73 74 73 20 69 66 20 69 74 0a 20 20 2a   tests if it.  *
33190 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  * is possible to
331a0 20 61 64 64 20 74 68 65 20 70 61 67 65 20 61 73   add the page as
331b0 20 61 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74   a new free-list
331c0 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66   leaf..  */.  if
331d0 28 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a 20 20  ( nFree!=0 ){.  
331e0 20 20 75 33 32 20 6e 4c 65 61 66 3b 20 20 20 20    u32 nLeaf;    
331f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
33200 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66  nitial number of
33210 20 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74   leaf cells on t
33220 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20  runk page */..  
33230 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62    iTrunk = get4b
33240 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
33250 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72 63 20  ta[32]);.    rc 
33260 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
33270 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72  Bt, iTrunk, &pTr
33280 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  unk, 0);.    if(
33290 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
332a0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65  {.      goto fre
332b0 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  epage_out;.    }
332c0 0a 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20 67 65  ..    nLeaf = ge
332d0 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
332e0 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 61  aData[4]);.    a
332f0 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62  ssert( pBt->usab
33300 6c 65 53 69 7a 65 3e 33 32 20 29 3b 0a 20 20 20  leSize>32 );.   
33310 20 69 66 28 20 6e 4c 65 61 66 20 3e 20 28 75 33   if( nLeaf > (u3
33320 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  2)pBt->usableSiz
33330 65 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20 20 20  e/4 - 2 ){.     
33340 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
33350 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
33360 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
33370 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ut;.    }.    if
33380 28 20 6e 4c 65 61 66 20 3c 20 28 75 33 32 29 70  ( nLeaf < (u32)p
33390 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34  Bt->usableSize/4
333a0 20 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a   - 8 ){.      /*
333b0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
333c0 65 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74  ere is room on t
333d0 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 74 6f  he trunk page to
333e0 20 69 6e 73 65 72 74 20 74 68 65 20 70 61 67 65   insert the page
333f0 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20  .      ** being 
33400 66 72 65 65 64 20 61 73 20 61 20 6e 65 77 20 6c  freed as a new l
33410 65 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  eaf..      **.  
33420 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74      ** Note that
33430 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20   the trunk page 
33440 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75  is not really fu
33450 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74  ll until it cont
33460 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75 73  ains.      ** us
33470 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 65  ableSize/4 - 2 e
33480 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75 73 61 62  ntries, not usab
33490 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74  leSize/4 - 8 ent
334a0 72 69 65 73 20 61 73 20 77 65 20 68 61 76 65 0a  ries as we have.
334b0 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20        ** coded. 
334c0 20 42 75 74 20 64 75 65 20 74 6f 20 61 20 63 6f   But due to a co
334d0 64 69 6e 67 20 65 72 72 6f 72 20 69 6e 20 76 65  ding error in ve
334e0 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
334f0 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 20 20   prior to.      
33500 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61 62 61  ** 3.6.0, databa
33510 73 65 73 20 77 69 74 68 20 66 72 65 65 6c 69 73  ses with freelis
33520 74 20 74 72 75 6e 6b 20 70 61 67 65 73 20 68 6f  t trunk pages ho
33530 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a  lding more than.
33540 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53        ** usableS
33550 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65  ize/4 - 8 entrie
33560 73 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72 74  s will be report
33570 65 64 20 61 73 20 63 6f 72 72 75 70 74 2e 20 20  ed as corrupt.  
33580 49 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a  In order.      *
33590 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61  * to maintain ba
335a0 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62  ckwards compatib
335b0 69 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65 72  ility with older
335c0 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
335d0 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65  ite,.      ** we
335e0 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74   will continue t
335f0 6f 20 72 65 73 74 72 69 63 74 20 74 68 65 20 6e  o restrict the n
33600 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
33610 20 74 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f 34   to usableSize/4
33620 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f   - 8.      ** fo
33630 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20  r now.  At some 
33640 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74  point in the fut
33650 75 72 65 20 28 6f 6e 63 65 20 65 76 65 72 79 6f  ure (once everyo
33660 6e 65 20 68 61 73 20 75 70 67 72 61 64 65 64 0a  ne has upgraded.
33670 20 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e        ** to 3.6.
33680 30 20 6f 72 20 6c 61 74 65 72 29 20 77 65 20 73  0 or later) we s
33690 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72 20 66  hould consider f
336a0 69 78 69 6e 67 20 74 68 65 20 63 6f 6e 64 69 74  ixing the condit
336b0 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20 20  ional above.    
336c0 20 20 2a 2a 20 74 6f 20 72 65 61 64 20 22 75 73    ** to read "us
336d0 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e  ableSize/4-2" in
336e0 73 74 65 61 64 20 6f 66 20 22 75 73 61 62 6c 65  stead of "usable
336f0 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20  Size/4-8"..     
33700 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56 49   **.      ** EVI
33710 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 39 32  DENCE-OF: R-1992
33720 30 2d 31 31 35 37 36 20 48 6f 77 65 76 65 72 2c  0-11576 However,
33730 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20   newer versions 
33740 6f 66 20 53 51 4c 69 74 65 20 73 74 69 6c 6c 0a  of SQLite still.
33750 20 20 20 20 20 20 2a 2a 20 61 76 6f 69 64 20 75        ** avoid u
33760 73 69 6e 67 20 74 68 65 20 6c 61 73 74 20 73 69  sing the last si
33770 78 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  x entries in the
33780 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
33790 70 61 67 65 20 61 72 72 61 79 20 69 6e 0a 20 20  page array in.  
337a0 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 68 61      ** order tha
337b0 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  t database files
337c0 20 63 72 65 61 74 65 64 20 62 79 20 6e 65 77 65   created by newe
337d0 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
337e0 4c 69 74 65 20 63 61 6e 20 62 65 0a 20 20 20 20  Lite can be.    
337f0 20 20 2a 2a 20 72 65 61 64 20 62 79 20 6f 6c 64    ** read by old
33800 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  er versions of S
33810 51 4c 69 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  QLite..      */.
33820 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
33830 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72  e3PagerWrite(pTr
33840 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
33850 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
33860 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
33870 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75    put4byte(&pTru
33880 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c  nk->aData[4], nL
33890 65 61 66 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  eaf+1);.        
338a0 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  put4byte(&pTrunk
338b0 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a  ->aData[8+nLeaf*
338c0 34 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20  4], iPage);.    
338d0 20 20 20 20 69 66 28 20 70 50 61 67 65 20 26 26      if( pPage &&
338e0 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
338f0 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  & BTS_SECURE_DEL
33900 45 54 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ETE)==0 ){.     
33910 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
33920 72 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65  rDontWrite(pPage
33930 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
33940 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
33950 20 3d 20 62 74 72 65 65 53 65 74 48 61 73 43 6f   = btreeSetHasCo
33960 6e 74 65 6e 74 28 70 42 74 2c 20 69 50 61 67 65  ntent(pBt, iPage
33970 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
33980 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41   TRACE(("FREE-PA
33990 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74  GE: %d leaf on t
339a0 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c  runk page %d\n",
339b0 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75  pPage->pgno,pTru
339c0 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  nk->pgno));.    
339d0 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
339e0 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  out;.    }.  }..
339f0 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20    /* If control 
33a00 66 6c 6f 77 73 20 74 6f 20 74 68 69 73 20 70 6f  flows to this po
33a10 69 6e 74 2c 20 74 68 65 6e 20 69 74 20 77 61 73  int, then it was
33a20 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
33a30 20 61 64 64 20 74 68 65 0a 20 20 2a 2a 20 74 68   add the.  ** th
33a40 65 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65  e page being fre
33a50 65 64 20 61 73 20 61 20 6c 65 61 66 20 70 61 67  ed as a leaf pag
33a60 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74  e of the first t
33a70 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65  runk in the free
33a80 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73  -list..  ** Poss
33a90 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65  ibly because the
33aa0 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 65 6d   free-list is em
33ab0 70 74 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79  pty, or possibly
33ac0 20 62 65 63 61 75 73 65 20 74 68 65 20 0a 20 20   because the .  
33ad0 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69  ** first trunk i
33ae0 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  n the free-list 
33af0 69 73 20 66 75 6c 6c 2e 20 45 69 74 68 65 72 20  is full. Either 
33b00 77 61 79 2c 20 74 68 65 20 70 61 67 65 20 62 65  way, the page be
33b10 69 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a 20 77  ing freed.  ** w
33b20 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e  ill become the n
33b30 65 77 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70  ew first trunk p
33b40 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d  age in the free-
33b50 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  list..  */.  if(
33b60 20 70 50 61 67 65 3d 3d 30 20 26 26 20 53 51 4c   pPage==0 && SQL
33b70 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74  ITE_OK!=(rc = bt
33b80 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
33b90 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30  iPage, &pPage, 0
33ba0 29 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66  )) ){.    goto f
33bb0 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d  reepage_out;.  }
33bc0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
33bd0 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
33be0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  >pDbPage);.  if(
33bf0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
33c00 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70  {.    goto freep
33c10 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70  age_out;.  }.  p
33c20 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  ut4byte(pPage->a
33c30 44 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20  Data, iTrunk);. 
33c40 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
33c50 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a  ->aData[4], 0);.
33c60 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
33c70 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69  e1->aData[32], i
33c80 50 61 67 65 29 3b 0a 20 20 54 52 41 43 45 28 28  Page);.  TRACE((
33c90 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e  "FREE-PAGE: %d n
33ca0 65 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65  ew trunk page re
33cb0 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70  placing %d\n", p
33cc0 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75  Page->pgno, iTru
33cd0 6e 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f  nk));..freepage_
33ce0 6f 75 74 3a 0a 20 20 69 66 28 20 70 50 61 67 65  out:.  if( pPage
33cf0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   ){.    pPage->i
33d00 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  sInit = 0;.  }. 
33d10 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
33d20 67 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61  ge);.  releasePa
33d30 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65  ge(pTrunk);.  re
33d40 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69  turn rc;.}.stati
33d50 63 20 76 6f 69 64 20 66 72 65 65 50 61 67 65 28  c void freePage(
33d60 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
33d70 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28  int *pRC){.  if(
33d80 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f   (*pRC)==SQLITE_
33d90 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d  OK ){.    *pRC =
33da0 20 66 72 65 65 50 61 67 65 32 28 70 50 61 67 65   freePage2(pPage
33db0 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c 20 70 50  ->pBt, pPage, pP
33dc0 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a  age->pgno);.  }.
33dd0 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e  }../*.** Free an
33de0 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  y overflow pages
33df0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
33e00 20 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e   the given Cell.
33e10 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 6c    Write the.** l
33e20 6f 63 61 6c 20 43 65 6c 6c 20 73 69 7a 65 20 28  ocal Cell size (
33e30 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
33e40 74 65 73 20 6f 6e 20 74 68 65 20 6f 72 69 67 69  tes on the origi
33e50 6e 61 6c 20 70 61 67 65 2c 20 6f 6d 69 74 74 69  nal page, omitti
33e60 6e 67 0a 2a 2a 20 6f 76 65 72 66 6c 6f 77 29 20  ng.** overflow) 
33e70 69 6e 74 6f 20 2a 70 6e 53 69 7a 65 2e 0a 2a 2f  into *pnSize..*/
33e80 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61  .static int clea
33e90 72 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65  rCell(.  MemPage
33ea0 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
33eb0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68    /* The page th
33ec0 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
33ed0 43 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  Cell */.  unsign
33ee0 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20  ed char *pCell, 
33ef0 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
33f00 20 6f 66 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a   of the Cell */.
33f10 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66    CellInfo *pInf
33f20 6f 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69  o          /* Si
33f30 7a 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ze information a
33f40 62 6f 75 74 20 74 68 65 20 63 65 6c 6c 20 2a 2f  bout the cell */
33f50 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  .){.  BtShared *
33f60 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
33f70 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e  ;.  Pgno ovflPgn
33f80 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  o;.  int rc;.  i
33f90 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 33 32 20  nt nOvfl;.  u32 
33fa0 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20  ovflPageSize;.. 
33fb0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
33fc0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
33fd0 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
33fe0 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73  ;.  pPage->xPars
33ff0 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65  eCell(pPage, pCe
34000 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 69 66  ll, pInfo);.  if
34010 28 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 3d  ( pInfo->nLocal=
34020 3d 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64  =pInfo->nPayload
34030 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
34040 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f  QLITE_OK;  /* No
34050 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
34060 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   Return without 
34070 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a  doing anything *
34080 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 65 6c  /.  }.  if( pCel
34090 6c 2b 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 2d 31  l+pInfo->nSize-1
340a0 20 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 2b   > pPage->aData+
340b0 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20  pPage->maskPage 
340c0 29 7b 0a 20 20 20 20 2f 2a 20 43 65 6c 6c 20 65  ){.    /* Cell e
340d0 78 74 65 6e 64 73 20 70 61 73 74 20 65 6e 64 20  xtends past end 
340e0 6f 66 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 72  of page */.    r
340f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
34100 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d  RUPT_PGNO(pPage-
34110 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 6f 76  >pgno);.  }.  ov
34120 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  flPgno = get4byt
34130 65 28 70 43 65 6c 6c 20 2b 20 70 49 6e 66 6f 2d  e(pCell + pInfo-
34140 3e 6e 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 61  >nSize - 4);.  a
34150 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62  ssert( pBt->usab
34160 6c 65 53 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20  leSize > 4 );.  
34170 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 3d 20 70  ovflPageSize = p
34180 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
34190 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 70   4;.  nOvfl = (p
341a0 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 2d  Info->nPayload -
341b0 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b   pInfo->nLocal +
341c0 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 2d 20   ovflPageSize - 
341d0 31 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b  1)/ovflPageSize;
341e0 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 76 66 6c  .  assert( nOvfl
341f0 3e 30 20 7c 7c 20 0a 20 20 20 20 28 43 4f 52 52  >0 || .    (CORR
34200 55 50 54 5f 44 42 20 26 26 20 28 70 49 6e 66 6f  UPT_DB && (pInfo
34210 2d 3e 6e 50 61 79 6c 6f 61 64 20 2b 20 6f 76 66  ->nPayload + ovf
34220 6c 50 61 67 65 53 69 7a 65 29 3c 6f 76 66 6c 50  lPageSize)<ovflP
34230 61 67 65 53 69 7a 65 29 0a 20 20 29 3b 0a 20 20  ageSize).  );.  
34240 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29  while( nOvfl-- )
34250 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65 78 74  {.    Pgno iNext
34260 20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d 50 61 67   = 0;.    MemPag
34270 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20  e *pOvfl = 0;.  
34280 20 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3c 32    if( ovflPgno<2
34290 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 62 74 72   || ovflPgno>btr
342a0 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
342b0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 30 20 69   ){.      /* 0 i
342c0 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c 20 70 61  s not a legal pa
342d0 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61  ge number and pa
342e0 67 65 20 31 20 63 61 6e 6e 6f 74 20 62 65 20 61  ge 1 cannot be a
342f0 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72  n .      ** over
34300 66 6c 6f 77 20 70 61 67 65 2e 20 54 68 65 72 65  flow page. There
34310 66 6f 72 65 20 69 66 20 6f 76 66 6c 50 67 6e 6f  fore if ovflPgno
34320 3c 32 20 6f 72 20 70 61 73 74 20 74 68 65 20 65  <2 or past the e
34330 6e 64 20 6f 66 20 74 68 65 20 0a 20 20 20 20 20  nd of the .     
34340 20 2a 2a 20 66 69 6c 65 20 74 68 65 20 64 61 74   ** file the dat
34350 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f  abase must be co
34360 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20 20 20  rrupt. */.      
34370 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
34380 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
34390 7d 0a 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20  }.    if( nOvfl 
343a0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65  ){.      rc = ge
343b0 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42  tOverflowPage(pB
343c0 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f  t, ovflPgno, &pO
343d0 76 66 6c 2c 20 26 69 4e 65 78 74 29 3b 0a 20 20  vfl, &iNext);.  
343e0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
343f0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
34400 20 20 20 69 66 28 20 28 20 70 4f 76 66 6c 20 7c     if( ( pOvfl |
34410 7c 20 28 28 70 4f 76 66 6c 20 3d 20 62 74 72 65  | ((pOvfl = btre
34420 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c  ePageLookup(pBt,
34430 20 6f 76 66 6c 50 67 6e 6f 29 29 21 3d 30 29 20   ovflPgno))!=0) 
34440 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65  ).     && sqlite
34450 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
34460 6e 74 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67  nt(pOvfl->pDbPag
34470 65 29 21 3d 31 0a 20 20 20 20 29 7b 0a 20 20 20  e)!=1.    ){.   
34480 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e     /* There is n
34490 6f 20 72 65 61 73 6f 6e 20 61 6e 79 20 63 75 72  o reason any cur
344a0 73 6f 72 20 73 68 6f 75 6c 64 20 68 61 76 65 20  sor should have 
344b0 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  an outstanding r
344c0 65 66 65 72 65 6e 63 65 20 0a 20 20 20 20 20 20  eference .      
344d0 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  ** to an overflo
344e0 77 20 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67  w page belonging
344f0 20 74 6f 20 61 20 63 65 6c 6c 20 74 68 61 74 20   to a cell that 
34500 69 73 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64  is being deleted
34510 2f 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20  /updated..      
34520 2a 2a 20 53 6f 20 69 66 20 74 68 65 72 65 20 65  ** So if there e
34530 78 69 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20  xists more than 
34540 6f 6e 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f  one reference to
34550 20 74 68 69 73 20 70 61 67 65 2c 20 74 68 65 6e   this page, then
34560 20 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 75   it .      ** mu
34570 73 74 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65  st not really be
34580 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
34590 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  e and the databa
345a0 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  se must be corru
345b0 70 74 2e 20 0a 20 20 20 20 20 20 2a 2a 20 49 74  pt. .      ** It
345c0 20 69 73 20 68 65 6c 70 66 75 6c 20 74 6f 20 64   is helpful to d
345d0 65 74 65 63 74 20 74 68 69 73 20 62 65 66 6f 72  etect this befor
345e0 65 20 63 61 6c 6c 69 6e 67 20 66 72 65 65 50 61  e calling freePa
345f0 67 65 32 28 29 2c 20 61 73 20 0a 20 20 20 20 20  ge2(), as .     
34600 20 2a 2a 20 66 72 65 65 50 61 67 65 32 28 29 20   ** freePage2() 
34610 6d 61 79 20 7a 65 72 6f 20 74 68 65 20 70 61 67  may zero the pag
34620 65 20 63 6f 6e 74 65 6e 74 73 20 69 66 20 73 65  e contents if se
34630 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65  cure-delete mode
34640 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 65 6e 61   is.      ** ena
34650 62 6c 65 64 2e 20 49 66 20 74 68 69 73 20 27 6f  bled. If this 'o
34660 76 65 72 66 6c 6f 77 27 20 70 61 67 65 20 68 61  verflow' page ha
34670 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20 70 61  ppens to be a pa
34680 67 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  ge that the.    
34690 20 20 2a 2a 20 63 61 6c 6c 65 72 20 69 73 20 69    ** caller is i
346a0 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68  terating through
346b0 20 6f 72 20 75 73 69 6e 67 20 69 6e 20 73 6f 6d   or using in som
346c0 65 20 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69  e other way, thi
346d0 73 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e 20 62  s.      ** can b
346e0 65 20 70 72 6f 62 6c 65 6d 61 74 69 63 2e 0a 20  e problematic.. 
346f0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
34700 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
34710 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73  T_BKPT;.    }els
34720 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 72  e{.      rc = fr
34730 65 65 50 61 67 65 32 28 70 42 74 2c 20 70 4f 76  eePage2(pBt, pOv
34740 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20  fl, ovflPgno);. 
34750 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f     }..    if( pO
34760 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  vfl ){.      sql
34770 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
34780 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Ovfl->pDbPage);.
34790 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
347a0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
347b0 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e 65    ovflPgno = iNe
347c0 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  xt;.  }.  return
347d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
347e0 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20  *.** Create the 
347f0 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 75 73  byte sequence us
34800 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20  ed to represent 
34810 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70  a cell on page p
34820 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74  Page.** and writ
34830 65 20 74 68 61 74 20 62 79 74 65 20 73 65 71 75  e that byte sequ
34840 65 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b  ence into pCell[
34850 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67  ].  Overflow pag
34860 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61  es are.** alloca
34870 74 65 64 20 61 6e 64 20 66 69 6c 6c 65 64 20 69  ted and filled i
34880 6e 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 20  n as necessary. 
34890 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f   The calling pro
348a0 63 65 64 75 72 65 0a 2a 2a 20 69 73 20 72 65 73  cedure.** is res
348b0 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b  ponsible for mak
348c0 69 6e 67 20 73 75 72 65 20 73 75 66 66 69 63 69  ing sure suffici
348d0 65 6e 74 20 73 70 61 63 65 20 68 61 73 20 62 65  ent space has be
348e0 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  en allocated.** 
348f0 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a  for pCell[]..**.
34900 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 43 65  ** Note that pCe
34910 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65  ll does not nece
34920 73 73 61 72 79 20 6e 65 65 64 20 74 6f 20 70 6f  ssary need to po
34930 69 6e 74 20 74 6f 20 74 68 65 20 70 50 61 67 65  int to the pPage
34940 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e  ->aData.** area.
34950 20 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f    pCell might po
34960 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70  int to some temp
34970 6f 72 61 72 79 20 73 74 6f 72 61 67 65 2e 20 20  orary storage.  
34980 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a  The cell will.**
34990 20 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20   be constructed 
349a0 69 6e 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72  in this temporar
349b0 79 20 61 72 65 61 20 74 68 65 6e 20 63 6f 70 69  y area then copi
349c0 65 64 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61  ed into pPage->a
349d0 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a  Data.** later..*
349e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
349f0 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  lInCell(.  MemPa
34a00 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
34a10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
34a20 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
34a30 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ins the cell */.
34a40 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
34a50 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
34a60 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65 78   /* Complete tex
34a70 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f  t of the cell */
34a80 0a 20 20 63 6f 6e 73 74 20 42 74 72 65 65 50 61  .  const BtreePa
34a90 79 6c 6f 61 64 20 2a 70 58 2c 20 20 20 20 20 20  yload *pX,      
34aa0 20 20 2f 2a 20 50 61 79 6c 6f 61 64 20 77 69 74    /* Payload wit
34ab0 68 20 77 68 69 63 68 20 74 6f 20 63 6f 6e 73 74  h which to const
34ac0 72 75 63 74 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ruct the cell */
34ad0 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20  .  int *pnSize  
34ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34af0 20 20 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c 20    /* Write cell 
34b00 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  size here */.){.
34b10 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a    int nPayload;.
34b20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 53 72 63    const u8 *pSrc
34b30 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c  ;.  int nSrc, n,
34b40 20 72 63 3b 0a 20 20 69 6e 74 20 73 70 61 63 65   rc;.  int space
34b50 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20  Left;.  MemPage 
34b60 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65  *pOvfl = 0;.  Me
34b70 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c 65 61 73  mPage *pToReleas
34b80 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65  e = 0;.  unsigne
34b90 64 20 63 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a  d char *pPrior;.
34ba0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
34bb0 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53  *pPayload;.  BtS
34bc0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
34bd0 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20  ge->pBt;.  Pgno 
34be0 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20  pgnoOvfl = 0;.  
34bf0 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a 0a 20 20  int nHeader;..  
34c00 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
34c10 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
34c20 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
34c30 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20  ..  /* pPage is 
34c40 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20  not necessarily 
34c50 77 72 69 74 65 61 62 6c 65 20 73 69 6e 63 65 20  writeable since 
34c60 70 43 65 6c 6c 20 6d 69 67 68 74 20 62 65 20 61  pCell might be a
34c70 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75  uxiliary.  ** bu
34c80 66 66 65 72 20 73 70 61 63 65 20 74 68 61 74 20  ffer space that 
34c90 69 73 20 73 65 70 61 72 61 74 65 20 66 72 6f 6d  is separate from
34ca0 20 74 68 65 20 70 50 61 67 65 20 62 75 66 66 65   the pPage buffe
34cb0 72 20 61 72 65 61 20 2a 2f 0a 20 20 61 73 73 65  r area */.  asse
34cc0 72 74 28 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d  rt( pCell<pPage-
34cd0 3e 61 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e  >aData || pCell>
34ce0 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  =&pPage->aData[p
34cf0 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20  Bt->pageSize].  
34d00 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
34d10 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
34d20 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
34d30 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69  age) );..  /* Fi
34d40 6c 6c 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ll in the header
34d50 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d  . */.  nHeader =
34d60 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
34d70 53 69 7a 65 3b 0a 20 20 69 66 28 20 70 50 61 67  Size;.  if( pPag
34d80 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
34d90 20 6e 50 61 79 6c 6f 61 64 20 3d 20 70 58 2d 3e   nPayload = pX->
34da0 6e 44 61 74 61 20 2b 20 70 58 2d 3e 6e 5a 65 72  nData + pX->nZer
34db0 6f 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 58  o;.    pSrc = pX
34dc0 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 6e 53 72  ->pData;.    nSr
34dd0 63 20 3d 20 70 58 2d 3e 6e 44 61 74 61 3b 0a 20  c = pX->nData;. 
34de0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
34df0 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 3b 20  ->intKeyLeaf ); 
34e00 2f 2a 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20  /* fillInCell() 
34e10 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72 20  only called for 
34e20 6c 65 61 76 65 73 20 2a 2f 0a 20 20 20 20 6e 48  leaves */.    nH
34e30 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69  eader += putVari
34e40 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 48 65 61  nt32(&pCell[nHea
34e50 64 65 72 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b  der], nPayload);
34e60 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20  .    nHeader += 
34e70 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  putVarint(&pCell
34e80 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75 36 34  [nHeader], *(u64
34e90 2a 29 26 70 58 2d 3e 6e 4b 65 79 29 3b 0a 20 20  *)&pX->nKey);.  
34ea0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
34eb0 74 28 20 70 58 2d 3e 6e 4b 65 79 3c 3d 30 78 37  t( pX->nKey<=0x7
34ec0 66 66 66 66 66 66 66 20 26 26 20 70 58 2d 3e 70  fffffff && pX->p
34ed0 4b 65 79 21 3d 30 20 29 3b 0a 20 20 20 20 6e 53  Key!=0 );.    nS
34ee0 72 63 20 3d 20 6e 50 61 79 6c 6f 61 64 20 3d 20  rc = nPayload = 
34ef0 28 69 6e 74 29 70 58 2d 3e 6e 4b 65 79 3b 0a 20  (int)pX->nKey;. 
34f00 20 20 20 70 53 72 63 20 3d 20 70 58 2d 3e 70 4b     pSrc = pX->pK
34f10 65 79 3b 0a 20 20 20 20 6e 48 65 61 64 65 72 20  ey;.    nHeader 
34f20 2b 3d 20 70 75 74 56 61 72 69 6e 74 33 32 28 26  += putVarint32(&
34f30 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20  pCell[nHeader], 
34f40 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 7d 0a 20  nPayload);.  }. 
34f50 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74   .  /* Fill in t
34f60 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20  he payload */.  
34f70 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50  if( nPayload<=pP
34f80 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
34f90 0a 20 20 20 20 6e 20 3d 20 6e 48 65 61 64 65 72  .    n = nHeader
34fa0 20 2b 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20   + nPayload;.   
34fb0 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 33 20   testcase( n==3 
34fc0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
34fd0 20 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 69 66 28   n==4 );.    if(
34fe0 20 6e 3c 34 20 29 20 6e 20 3d 20 34 3b 0a 20 20   n<4 ) n = 4;.  
34ff0 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 3b 0a 20    *pnSize = n;. 
35000 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 6e     spaceLeft = n
35010 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 70 50 72  Payload;.    pPr
35020 69 6f 72 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 7d  ior = pCell;.  }
35030 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6d 6e  else{.    int mn
35040 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63   = pPage->minLoc
35050 61 6c 3b 0a 20 20 20 20 6e 20 3d 20 6d 6e 20 2b  al;.    n = mn +
35060 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 6e 29   (nPayload - mn)
35070 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e   % (pPage->pBt->
35080 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b  usableSize - 4);
35090 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
350a0 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
350b0 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  l );.    testcas
350c0 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  e( n==pPage->max
350d0 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69  Local+1 );.    i
350e0 66 28 20 6e 20 3e 20 70 50 61 67 65 2d 3e 6d 61  f( n > pPage->ma
350f0 78 4c 6f 63 61 6c 20 29 20 6e 20 3d 20 6d 6e 3b  xLocal ) n = mn;
35100 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d  .    spaceLeft =
35110 20 6e 3b 0a 20 20 20 20 2a 70 6e 53 69 7a 65 20   n;.    *pnSize 
35120 3d 20 6e 20 2b 20 6e 48 65 61 64 65 72 20 2b 20  = n + nHeader + 
35130 34 3b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20  4;.    pPrior = 
35140 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 2b 6e  &pCell[nHeader+n
35150 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 79 6c 6f 61  ];.  }.  pPayloa
35160 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64  d = &pCell[nHead
35170 65 72 5d 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68  er];..  /* At th
35180 69 73 20 70 6f 69 6e 74 20 76 61 72 69 61 62 6c  is point variabl
35190 65 73 20 73 68 6f 75 6c 64 20 62 65 20 73 65 74  es should be set
351a0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a   as follows:.  *
351b0 2a 0a 20 20 2a 2a 20 20 20 6e 50 61 79 6c 6f 61  *.  **   nPayloa
351c0 64 20 20 20 20 20 20 20 20 20 20 20 54 6f 74 61  d           Tota
351d0 6c 20 70 61 79 6c 6f 61 64 20 73 69 7a 65 20 69  l payload size i
351e0 6e 20 62 79 74 65 73 0a 20 20 2a 2a 20 20 20 70  n bytes.  **   p
351f0 50 61 79 6c 6f 61 64 20 20 20 20 20 20 20 20 20  Payload         
35200 20 20 42 65 67 69 6e 20 77 72 69 74 69 6e 67 20    Begin writing 
35210 70 61 79 6c 6f 61 64 20 68 65 72 65 0a 20 20 2a  payload here.  *
35220 2a 20 20 20 73 70 61 63 65 4c 65 66 74 20 20 20  *   spaceLeft   
35230 20 20 20 20 20 20 20 53 70 61 63 65 20 61 76 61         Space ava
35240 69 6c 61 62 6c 65 20 61 74 20 70 50 61 79 6c 6f  ilable at pPaylo
35250 61 64 2e 20 20 49 66 20 6e 50 61 79 6c 6f 61 64  ad.  If nPayload
35260 3e 73 70 61 63 65 4c 65 66 74 2c 0a 20 20 2a 2a  >spaceLeft,.  **
35270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35280 20 20 20 20 20 20 74 68 61 74 20 6d 65 61 6e 73        that means
35290 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 73 70   content must sp
352a0 69 6c 6c 20 69 6e 74 6f 20 6f 76 65 72 66 6c 6f  ill into overflo
352b0 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 20 20  w pages..  **   
352c0 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20  *pnSize         
352d0 20 20 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6c     Size of the l
352e0 6f 63 61 6c 20 63 65 6c 6c 20 28 6e 6f 74 20 63  ocal cell (not c
352f0 6f 75 6e 74 69 6e 67 20 6f 76 65 72 66 6c 6f 77  ounting overflow
35300 20 70 61 67 65 73 29 0a 20 20 2a 2a 20 20 20 70   pages).  **   p
35310 50 72 69 6f 72 20 20 20 20 20 20 20 20 20 20 20  Prior           
35320 20 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65    Where to write
35330 20 74 68 65 20 70 67 6e 6f 20 6f 66 20 74 68 65   the pgno of the
35340 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20   first overflow 
35350 70 61 67 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 55  page.  **.  ** U
35360 73 65 20 61 20 63 61 6c 6c 20 74 6f 20 62 74 72  se a call to btr
35370 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
35380 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
35390 74 68 65 20 76 61 6c 75 65 73 20 61 62 6f 76 65  the values above
353a0 0a 20 20 2a 2a 20 77 65 72 65 20 63 6f 6d 70 75  .  ** were compu
353b0 74 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20  ted correctly.. 
353c0 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
353d0 45 5f 44 45 42 55 47 0a 20 20 7b 0a 20 20 20 20  E_DEBUG.  {.    
353e0 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
353f0 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65     pPage->xParse
35400 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c  Cell(pPage, pCel
35410 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61  l, &info);.    a
35420 73 73 65 72 74 28 20 6e 48 65 61 64 65 72 3d 3d  ssert( nHeader==
35430 28 69 6e 74 29 28 69 6e 66 6f 2e 70 50 61 79 6c  (int)(info.pPayl
35440 6f 61 64 20 2d 20 70 43 65 6c 6c 29 20 29 3b 0a  oad - pCell) );.
35450 20 20 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f      assert( info
35460 2e 6e 4b 65 79 3d 3d 70 58 2d 3e 6e 4b 65 79 20  .nKey==pX->nKey 
35470 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a  );.    assert( *
35480 70 6e 53 69 7a 65 20 3d 3d 20 69 6e 66 6f 2e 6e  pnSize == info.n
35490 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65  Size );.    asse
354a0 72 74 28 20 73 70 61 63 65 4c 65 66 74 20 3d 3d  rt( spaceLeft ==
354b0 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 3b 0a   info.nLocal );.
354c0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
354d0 20 57 72 69 74 65 20 74 68 65 20 70 61 79 6c 6f   Write the paylo
354e0 61 64 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61  ad into the loca
354f0 6c 20 43 65 6c 6c 20 61 6e 64 20 61 6e 79 20 65  l Cell and any e
35500 78 74 72 61 20 69 6e 74 6f 20 6f 76 65 72 66 6c  xtra into overfl
35510 6f 77 20 70 61 67 65 73 20 2a 2f 0a 20 20 77 68  ow pages */.  wh
35520 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20  ile( nPayload>0 
35530 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61 63 65  ){.    if( space
35540 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64  Left==0 ){.#ifnd
35550 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
35560 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
35570 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20  Pgno pgnoPtrmap 
35580 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f  = pgnoOvfl; /* O
35590 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69  verflow page poi
355a0 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 70  nter-map entry p
355b0 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  age */.      if(
355c0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
355d0 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a   ){.        do{.
355e0 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4f 76            pgnoOv
355f0 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20  fl++;.        } 
35600 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20 20 20  while( .        
35610 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28    PTRMAP_ISPAGE(
35620 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c  pBt, pgnoOvfl) |
35630 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44  | pgnoOvfl==PEND
35640 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
35650 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  t) .        );. 
35660 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
35670 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
35680 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
35690 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66  &pOvfl, &pgnoOvf
356a0 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b  l, pgnoOvfl, 0);
356b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
356c0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
356d0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
356e0 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74  database support
356f0 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61  s auto-vacuum, a
35700 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72  nd the second or
35710 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20 20 20   subsequent.    
35720 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
35730 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f  ge is being allo
35740 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20 65 6e  cated, add an en
35750 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69 6e 74  try to the point
35760 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20  er-map.      ** 
35770 66 6f 72 20 74 68 61 74 20 70 61 67 65 20 6e 6f  for that page no
35780 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  w. .      **.   
35790 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73     ** If this is
357a0 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66   the first overf
357b0 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 77  low page, then w
357c0 72 69 74 65 20 61 20 70 61 72 74 69 61 6c 20 65  rite a partial e
357d0 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a 20 74  ntry .      ** t
357e0 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
357f0 70 2e 20 49 66 20 77 65 20 77 72 69 74 65 20 6e  p. If we write n
35800 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73 20 70  othing to this p
35810 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c  ointer-map slot,
35820 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74  .      ** then t
35830 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20 6f 76  he optimistic ov
35840 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f  erflow chain pro
35850 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65 61 72  cessing in clear
35860 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20  Cell().      ** 
35870 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72 65 74  may misinterpret
35880 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a   the uninitializ
35890 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20 64 65  ed values and de
358a0 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a  lete the.      *
358b0 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20 66 72  * wrong pages fr
358c0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  om the database.
358d0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
358e0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
358f0 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  uum && rc==SQLIT
35900 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
35910 75 38 20 65 54 79 70 65 20 3d 20 28 70 67 6e 6f  u8 eType = (pgno
35920 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56  Ptrmap?PTRMAP_OV
35930 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f  ERFLOW2:PTRMAP_O
35940 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20  VERFLOW1);.     
35950 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
35960 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70  , pgnoOvfl, eTyp
35970 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 2c 20 26  e, pgnoPtrmap, &
35980 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  rc);.        if(
35990 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
359a0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f 76   releasePage(pOv
359b0 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  fl);.        }. 
359c0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
359d0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
359e0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
359f0 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20  e(pToRelease);. 
35a00 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
35a10 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
35a20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73   /* If pToReleas
35a30 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68  e is not zero th
35a40 61 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e 74 73  an pPrior points
35a50 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61   into the data a
35a60 72 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  rea.      ** of 
35a70 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b  pToRelease.  Mak
35a80 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73  e sure pToReleas
35a90 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  e is still write
35aa0 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61  able. */.      a
35ab0 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73  ssert( pToReleas
35ac0 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50  e==0 || sqlite3P
35ad0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
35ae0 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50  pToRelease->pDbP
35af0 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f  age) );..      /
35b00 2a 20 49 66 20 70 50 72 69 6f 72 20 69 73 20 70  * If pPrior is p
35b10 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20  art of the data 
35b20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74  area of pPage, t
35b30 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50  hen make sure pP
35b40 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  age.      ** is 
35b50 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20  still writeable 
35b60 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
35b70 20 70 50 72 69 6f 72 3c 70 50 61 67 65 2d 3e 61   pPrior<pPage->a
35b80 44 61 74 61 20 7c 7c 20 70 50 72 69 6f 72 3e 3d  Data || pPrior>=
35b90 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
35ba0 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20  t->pageSize].   
35bb0 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
35bc0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
35bd0 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
35be0 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 70 75  ge) );..      pu
35bf0 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 70  t4byte(pPrior, p
35c00 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20  gnoOvfl);.      
35c10 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52  releasePage(pToR
35c20 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 70  elease);.      p
35c30 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f 76 66  ToRelease = pOvf
35c40 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20  l;.      pPrior 
35c50 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a  = pOvfl->aData;.
35c60 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
35c70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20  Prior, 0);.     
35c80 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76   pPayload = &pOv
35c90 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20  fl->aData[4];.  
35ca0 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20      spaceLeft = 
35cb0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
35cc0 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  - 4;.    }.    n
35cd0 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20   = nPayload;.   
35ce0 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65 66 74   if( n>spaceLeft
35cf0 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65 66 74   ) n = spaceLeft
35d00 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 54 6f  ;..    /* If pTo
35d10 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a  Release is not z
35d20 65 72 6f 20 74 68 61 6e 20 70 50 61 79 6c 6f 61  ero than pPayloa
35d30 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68  d points into th
35d40 65 20 64 61 74 61 20 61 72 65 61 0a 20 20 20 20  e data area.    
35d50 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65  ** of pToRelease
35d60 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f  .  Make sure pTo
35d70 52 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c  Release is still
35d80 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20   writeable. */. 
35d90 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65     assert( pToRe
35da0 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69  lease==0 || sqli
35db0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
35dc0 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e  ble(pToRelease->
35dd0 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
35de0 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61 64 20   /* If pPayload 
35df0 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  is part of the d
35e00 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67  ata area of pPag
35e10 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72  e, then make sur
35e20 65 20 70 50 61 67 65 0a 20 20 20 20 2a 2a 20 69  e pPage.    ** i
35e30 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
35e40 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  e */.    assert(
35e50 20 70 50 61 79 6c 6f 61 64 3c 70 50 61 67 65 2d   pPayload<pPage-
35e60 3e 61 44 61 74 61 20 7c 7c 20 70 50 61 79 6c 6f  >aData || pPaylo
35e70 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74  ad>=&pPage->aDat
35e80 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  a[pBt->pageSize]
35e90 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
35ea0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
35eb0 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
35ec0 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
35ed0 69 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20  if( nSrc>0 ){.  
35ee0 20 20 20 20 69 66 28 20 6e 3e 6e 53 72 63 20 29      if( n>nSrc )
35ef0 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20   n = nSrc;.     
35f00 20 61 73 73 65 72 74 28 20 70 53 72 63 20 29 3b   assert( pSrc );
35f10 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50  .      memcpy(pP
35f20 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29  ayload, pSrc, n)
35f30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
35f40 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f     memset(pPaylo
35f50 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d  ad, 0, n);.    }
35f60 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d  .    nPayload -=
35f70 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61 64   n;.    pPayload
35f80 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63 20   += n;.    pSrc 
35f90 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d  += n;.    nSrc -
35fa0 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65  = n;.    spaceLe
35fb0 66 74 20 2d 3d 20 6e 3b 0a 20 20 7d 0a 20 20 72  ft -= n;.  }.  r
35fc0 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65  eleasePage(pToRe
35fd0 6c 65 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e  lease);.  return
35fe0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
35ff0 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20  *.** Remove the 
36000 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70  i-th cell from p
36010 50 61 67 65 2e 20 20 54 68 69 73 20 72 6f 75 74  Page.  This rout
36020 69 6e 65 20 65 66 66 65 63 74 73 20 70 50 61 67  ine effects pPag
36030 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63  e only..** The c
36040 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e  ell content is n
36050 6f 74 20 66 72 65 65 64 20 6f 72 20 64 65 61 6c  ot freed or deal
36060 6c 6f 63 61 74 65 64 2e 20 20 49 74 20 69 73 20  located.  It is 
36070 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20  assumed that.** 
36080 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
36090 20 68 61 73 20 62 65 65 6e 20 63 6f 70 69 65 64   has been copied
360a0 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e   someplace else.
360b0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a    This routine j
360c0 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74  ust.** removes t
360d0 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  he reference to 
360e0 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50  the cell from pP
360f0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20  age..**.** "sz" 
36100 6d 75 73 74 20 62 65 20 74 68 65 20 6e 75 6d 62  must be the numb
36110 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
36120 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  he cell..*/.stat
36130 69 63 20 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c  ic void dropCell
36140 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
36150 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 73 7a   int idx, int sz
36160 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 75  , int *pRC){.  u
36170 33 32 20 70 63 3b 20 20 20 20 20 20 20 20 20 2f  32 pc;         /
36180 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 65 6c 6c  * Offset to cell
36190 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c   content of cell
361a0 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a   being deleted *
361b0 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20  /.  u8 *data;   
361c0 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44      /* pPage->aD
361d0 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72  ata */.  u8 *ptr
361e0 3b 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64  ;        /* Used
361f0 20 74 6f 20 6d 6f 76 65 20 62 79 74 65 73 20 61   to move bytes a
36200 72 6f 75 6e 64 20 77 69 74 68 69 6e 20 64 61 74  round within dat
36210 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  a[] */.  int rc;
36220 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
36230 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
36240 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20   int hdr;       
36250 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66   /* Beginning of
36260 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 30 20   the header.  0 
36270 6d 6f 73 74 20 70 61 67 65 73 2e 20 20 31 30 30  most pages.  100
36280 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20 20 69 66   page 1 */..  if
36290 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b  ( *pRC ) return;
362a0 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d  .  assert( idx>=
362b0 30 20 26 26 20 69 64 78 3c 70 50 61 67 65 2d 3e  0 && idx<pPage->
362c0 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
362d0 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
362e0 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50   sz==cellSize(pP
362f0 61 67 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61  age, idx) );.  a
36300 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
36310 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
36320 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
36330 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
36340 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
36350 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
36360 29 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  ) );.  data = pP
36370 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74  age->aData;.  pt
36380 72 20 3d 20 26 70 50 61 67 65 2d 3e 61 43 65 6c  r = &pPage->aCel
36390 6c 49 64 78 5b 32 2a 69 64 78 5d 3b 0a 20 20 70  lIdx[2*idx];.  p
363a0 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 74 72  c = get2byte(ptr
363b0 29 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  );.  hdr = pPage
363c0 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 74  ->hdrOffset;.  t
363d0 65 73 74 63 61 73 65 28 20 70 63 3d 3d 67 65 74  estcase( pc==get
363e0 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
363f0 35 5d 29 20 29 3b 0a 20 20 74 65 73 74 63 61 73  5]) );.  testcas
36400 65 28 20 70 63 2b 73 7a 3d 3d 70 50 61 67 65 2d  e( pc+sz==pPage-
36410 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
36420 20 29 3b 0a 20 20 69 66 28 20 70 63 20 3c 20 28   );.  if( pc < (
36430 75 33 32 29 67 65 74 32 62 79 74 65 28 26 64 61  u32)get2byte(&da
36440 74 61 5b 68 64 72 2b 35 5d 29 20 7c 7c 20 70 63  ta[hdr+5]) || pc
36450 2b 73 7a 20 3e 20 70 50 61 67 65 2d 3e 70 42 74  +sz > pPage->pBt
36460 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  ->usableSize ){.
36470 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54      *pRC = SQLIT
36480 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
36490 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
364a0 20 20 72 63 20 3d 20 66 72 65 65 53 70 61 63 65    rc = freeSpace
364b0 28 70 50 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b  (pPage, pc, sz);
364c0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
364d0 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20   *pRC = rc;.    
364e0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 50  return;.  }.  pP
364f0 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20  age->nCell--;.  
36500 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  if( pPage->nCell
36510 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  ==0 ){.    memse
36520 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20  t(&data[hdr+1], 
36530 30 2c 20 34 29 3b 0a 20 20 20 20 64 61 74 61 5b  0, 4);.    data[
36540 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 20 20  hdr+7] = 0;.    
36550 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
36560 64 72 2b 35 5d 2c 20 70 50 61 67 65 2d 3e 70 42  dr+5], pPage->pB
36570 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a  t->usableSize);.
36580 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65      pPage->nFree
36590 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   = pPage->pBt->u
365a0 73 61 62 6c 65 53 69 7a 65 20 2d 20 70 50 61 67  sableSize - pPag
365b0 65 2d 3e 68 64 72 4f 66 66 73 65 74 0a 20 20 20  e->hdrOffset.   
365c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
365d0 20 20 20 20 2d 20 70 50 61 67 65 2d 3e 63 68 69      - pPage->chi
365e0 6c 64 50 74 72 53 69 7a 65 20 2d 20 38 3b 0a 20  ldPtrSize - 8;. 
365f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 6d   }else{.    memm
36600 6f 76 65 28 70 74 72 2c 20 70 74 72 2b 32 2c 20  ove(ptr, ptr+2, 
36610 32 2a 28 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  2*(pPage->nCell 
36620 2d 20 69 64 78 29 29 3b 0a 20 20 20 20 70 75 74  - idx));.    put
36630 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
36640 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  3], pPage->nCell
36650 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46  );.    pPage->nF
36660 72 65 65 20 2b 3d 20 32 3b 0a 20 20 7d 0a 7d 0a  ree += 2;.  }.}.
36670 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20  ./*.** Insert a 
36680 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67  new cell on pPag
36690 65 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78 20  e at cell index 
366a0 22 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e  "i".  pCell poin
366b0 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e  ts to the.** con
366c0 74 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  tent of the cell
366d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
366e0 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c  ell content will
366f0 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65   fit on the page
36700 2c 20 74 68 65 6e 20 70 75 74 20 69 74 20 74 68  , then put it th
36710 65 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77  ere.  If it.** w
36720 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68 65  ill not fit, the
36730 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  n make a copy of
36740 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
36750 74 20 69 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a  t into pTemp if.
36760 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f 74 20  ** pTemp is not 
36770 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65 73  null.  Regardles
36780 73 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f  s of pTemp, allo
36790 63 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79  cate a new entry
367a0 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61 70  .** in pPage->ap
367b0 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20  Ovfl[] and make 
367c0 69 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  it point to the 
367d0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69  cell content (ei
367e0 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70  ther.** in pTemp
367f0 20 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   or the original
36800 20 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f   pCell) and also
36810 20 72 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65   record its inde
36820 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e  x. .** Allocatin
36830 67 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e  g a new entry in
36840 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20   pPage->aCell[] 
36850 69 6d 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a  implies that .**
36860 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
36870 77 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  w is incremented
36880 2e 0a 2a 2a 0a 2a 2a 20 2a 70 52 43 20 6d 75 73  ..**.** *pRC mus
36890 74 20 62 65 20 53 51 4c 49 54 45 5f 4f 4b 20 77  t be SQLITE_OK w
368a0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
368b0 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73   is called..*/.s
368c0 74 61 74 69 63 20 76 6f 69 64 20 69 6e 73 65 72  tatic void inser
368d0 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65  tCell(.  MemPage
368e0 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61   *pPage,   /* Pa
368f0 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65  ge into which we
36900 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a   are copying */.
36910 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20    int i,        
36920 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20      /* New cell 
36930 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68  becomes the i-th
36940 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67   cell of the pag
36950 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  e */.  u8 *pCell
36960 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74  ,        /* Cont
36970 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63  ent of the new c
36980 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c  ell */.  int sz,
36990 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
369a0 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69  tes of content i
369b0 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  n pCell */.  u8 
369c0 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f  *pTemp,        /
369d0 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73  * Temp storage s
369e0 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20  pace for pCell, 
369f0 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 50  if needed */.  P
36a00 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20  gno iChild,     
36a10 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c   /* If non-zero,
36a20 20 72 65 70 6c 61 63 65 20 66 69 72 73 74 20 34   replace first 4
36a30 20 62 79 74 65 73 20 77 69 74 68 20 74 68 69 73   bytes with this
36a40 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20   value */.  int 
36a50 2a 70 52 43 20 20 20 20 20 20 20 20 20 20 2f 2a  *pRC          /*
36a60 20 52 65 61 64 20 61 6e 64 20 77 72 69 74 65 20   Read and write 
36a70 72 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d  return code from
36a80 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
36a90 74 20 69 64 78 20 3d 20 30 3b 20 20 20 20 20 20  t idx = 0;      
36aa0 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74  /* Where to writ
36ab0 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65  e new cell conte
36ac0 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  nt in data[] */.
36ad0 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20    int j;        
36ae0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
36af0 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  ter */.  u8 *dat
36b00 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  a;         /* Th
36b10 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
36b20 20 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20   whole page */. 
36b30 20 75 38 20 2a 70 49 6e 73 3b 20 20 20 20 20 20   u8 *pIns;      
36b40 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 20     /* The point 
36b50 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49  in pPage->aCellI
36b60 64 78 5b 5d 20 77 68 65 72 65 20 6e 6f 20 63 65  dx[] where no ce
36b70 6c 6c 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 0a  ll inserted */..
36b80 20 20 61 73 73 65 72 74 28 20 2a 70 52 43 3d 3d    assert( *pRC==
36b90 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61  SQLITE_OK );.  a
36ba0 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69  ssert( i>=0 && i
36bb0 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70  <=pPage->nCell+p
36bc0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
36bd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 58 5f  );.  assert( MX_
36be0 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29  CELL(pPage->pBt)
36bf0 3c 3d 31 30 39 32 31 20 29 3b 0a 20 20 61 73 73  <=10921 );.  ass
36c00 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
36c10 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65  l<=MX_CELL(pPage
36c20 2d 3e 70 42 74 29 20 7c 7c 20 43 4f 52 52 55 50  ->pBt) || CORRUP
36c30 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  T_DB );.  assert
36c40 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
36c50 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65 28 70 50  ow<=ArraySize(pP
36c60 61 67 65 2d 3e 61 70 4f 76 66 6c 29 20 29 3b 0a  age->apOvfl) );.
36c70 20 20 61 73 73 65 72 74 28 20 41 72 72 61 79 53    assert( ArrayS
36c80 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f 76 66  ize(pPage->apOvf
36c90 6c 29 3d 3d 41 72 72 61 79 53 69 7a 65 28 70 50  l)==ArraySize(pP
36ca0 61 67 65 2d 3e 61 69 4f 76 66 6c 29 20 29 3b 0a  age->aiOvfl) );.
36cb0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
36cc0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
36cd0 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
36ce0 29 3b 0a 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c  );.  /* The cell
36cf0 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79   should normally
36d00 20 62 65 20 73 69 7a 65 64 20 63 6f 72 72 65 63   be sized correc
36d10 74 6c 79 2e 20 20 48 6f 77 65 76 65 72 2c 20 77  tly.  However, w
36d20 68 65 6e 20 6d 6f 76 69 6e 67 20 61 0a 20 20 2a  hen moving a.  *
36d30 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 63 65 6c 6c  * malformed cell
36d40 20 66 72 6f 6d 20 61 20 6c 65 61 66 20 70 61 67   from a leaf pag
36d50 65 20 74 6f 20 61 6e 20 69 6e 74 65 72 69 6f 72  e to an interior
36d60 20 70 61 67 65 2c 20 69 66 20 74 68 65 20 63 65   page, if the ce
36d70 6c 6c 20 73 69 7a 65 0a 20 20 2a 2a 20 77 61 6e  ll size.  ** wan
36d80 74 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74  ted to be less t
36d90 68 61 6e 20 34 20 62 75 74 20 67 6f 74 20 72 6f  han 4 but got ro
36da0 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20 6f 6e  unded up to 4 on
36db0 20 74 68 65 20 6c 65 61 66 2c 20 74 68 65 6e 20   the leaf, then 
36dc0 73 69 7a 65 0a 20 20 2a 2a 20 6d 69 67 68 74 20  size.  ** might 
36dd0 62 65 20 6c 65 73 73 20 74 68 61 6e 20 38 20 28  be less than 8 (
36de0 6c 65 61 66 2d 73 69 7a 65 20 2b 20 70 6f 69 6e  leaf-size + poin
36df0 74 65 72 29 20 6f 6e 20 74 68 65 20 69 6e 74 65  ter) on the inte
36e00 72 69 6f 72 20 6e 6f 64 65 2e 20 20 48 65 6e 63  rior node.  Henc
36e10 65 0a 20 20 2a 2a 20 74 68 65 20 74 65 72 6d 20  e.  ** the term 
36e20 61 66 74 65 72 20 74 68 65 20 7c 7c 20 69 6e 20  after the || in 
36e30 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  the following as
36e40 73 65 72 74 28 29 2e 20 2a 2f 0a 20 20 61 73 73  sert(). */.  ass
36e50 65 72 74 28 20 73 7a 3d 3d 70 50 61 67 65 2d 3e  ert( sz==pPage->
36e60 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c  xCellSize(pPage,
36e70 20 70 43 65 6c 6c 29 20 7c 7c 20 28 73 7a 3d 3d   pCell) || (sz==
36e80 38 20 26 26 20 69 43 68 69 6c 64 3e 30 29 20 29  8 && iChild>0) )
36e90 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e  ;.  if( pPage->n
36ea0 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32  Overflow || sz+2
36eb0 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b  >pPage->nFree ){
36ec0 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70 20 29  .    if( pTemp )
36ed0 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  {.      memcpy(p
36ee0 54 65 6d 70 2c 20 70 43 65 6c 6c 2c 20 73 7a 29  Temp, pCell, sz)
36ef0 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20  ;.      pCell = 
36f00 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20  pTemp;.    }.   
36f10 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20   if( iChild ){. 
36f20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43       put4byte(pC
36f30 65 6c 6c 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20  ell, iChild);.  
36f40 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50 61 67    }.    j = pPag
36f50 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a  e->nOverflow++;.
36f60 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f      /* Compariso
36f70 6e 20 61 67 61 69 6e 73 74 20 41 72 72 61 79 53  n against ArrayS
36f80 69 7a 65 2d 31 20 73 69 6e 63 65 20 77 65 20 68  ize-1 since we h
36f90 6f 6c 64 20 62 61 63 6b 20 6f 6e 65 20 65 78 74  old back one ext
36fa0 72 61 20 73 6c 6f 74 0a 20 20 20 20 2a 2a 20 61  ra slot.    ** a
36fb0 73 20 61 20 63 6f 6e 74 69 6e 67 65 6e 63 79 2e  s a contingency.
36fc0 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
36fd0 2c 20 6e 65 76 65 72 20 6e 65 65 64 20 6d 6f 72  , never need mor
36fe0 65 20 74 68 61 6e 20 33 20 6f 76 65 72 66 6c 6f  e than 3 overflo
36ff0 77 0a 20 20 20 20 2a 2a 20 73 6c 6f 74 73 20 62  w.    ** slots b
37000 75 74 20 34 20 61 72 65 20 61 6c 6c 6f 63 61 74  ut 4 are allocat
37010 65 64 2c 20 6a 75 73 74 20 74 6f 20 62 65 20 73  ed, just to be s
37020 61 66 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  afe. */.    asse
37030 72 74 28 20 6a 20 3c 20 41 72 72 61 79 53 69 7a  rt( j < ArraySiz
37040 65 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29  e(pPage->apOvfl)
37050 2d 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  -1 );.    pPage-
37060 3e 61 70 4f 76 66 6c 5b 6a 5d 20 3d 20 70 43 65  >apOvfl[j] = pCe
37070 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61  ll;.    pPage->a
37080 69 4f 76 66 6c 5b 6a 5d 20 3d 20 28 75 31 36 29  iOvfl[j] = (u16)
37090 69 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20  i;..    /* When 
370a0 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f  multiple overflo
370b0 77 73 20 6f 63 63 75 72 2c 20 74 68 65 79 20 61  ws occur, they a
370c0 72 65 20 61 6c 77 61 79 73 20 73 65 71 75 65 6e  re always sequen
370d0 74 69 61 6c 20 61 6e 64 20 69 6e 0a 20 20 20 20  tial and in.    
370e0 2a 2a 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2e  ** sorted order.
370f0 20 20 54 68 69 73 20 69 6e 76 61 72 69 61 6e 74    This invariant
37100 73 20 61 72 69 73 65 20 62 65 63 61 75 73 65 20  s arise because 
37110 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f  multiple overflo
37120 77 73 20 63 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e  ws can.    ** on
37130 6c 79 20 6f 63 63 75 72 20 77 68 65 6e 20 69 6e  ly occur when in
37140 73 65 72 74 69 6e 67 20 64 69 76 69 64 65 72 20  serting divider 
37150 63 65 6c 6c 73 20 69 6e 74 6f 20 74 68 65 20 70  cells into the p
37160 61 72 65 6e 74 20 70 61 67 65 20 64 75 72 69 6e  arent page durin
37170 67 0a 20 20 20 20 2a 2a 20 62 61 6c 61 6e 63 69  g.    ** balanci
37180 6e 67 2c 20 61 6e 64 20 74 68 65 20 64 69 76 69  ng, and the divi
37190 64 65 72 73 20 61 72 65 20 61 64 6a 61 63 65 6e  ders are adjacen
371a0 74 20 61 6e 64 20 73 6f 72 74 65 64 2e 0a 20 20  t and sorted..  
371b0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
371c0 20 6a 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e   j==0 || pPage->
371d0 61 69 4f 76 66 6c 5b 6a 2d 31 5d 3c 28 75 31 36  aiOvfl[j-1]<(u16
371e0 29 69 20 29 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f  )i ); /* Overflo
371f0 77 73 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64  ws in sorted ord
37200 65 72 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  er */.    assert
37210 28 20 6a 3d 3d 30 20 7c 7c 20 69 3d 3d 70 50 61  ( j==0 || i==pPa
37220 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 2d 31 5d 2b  ge->aiOvfl[j-1]+
37230 31 20 29 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c  1 );   /* Overfl
37240 6f 77 73 20 61 72 65 20 73 65 71 75 65 6e 74 69  ows are sequenti
37250 61 6c 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20  al */.  }else{. 
37260 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
37270 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
37280 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
37290 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
372a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70  E_OK ){.      *p
372b0 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72  RC = rc;.      r
372c0 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
372d0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
372e0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
372f0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
37300 20 29 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70   );.    data = p
37310 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20  Page->aData;.   
37320 20 61 73 73 65 72 74 28 20 26 64 61 74 61 5b 70   assert( &data[p
37330 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
37340 5d 3d 3d 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49  ]==pPage->aCellI
37350 64 78 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61  dx );.    rc = a
37360 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50 61  llocateSpace(pPa
37370 67 65 2c 20 73 7a 2c 20 26 69 64 78 29 3b 0a 20  ge, sz, &idx);. 
37380 20 20 20 69 66 28 20 72 63 20 29 7b 20 2a 70 52     if( rc ){ *pR
37390 43 20 3d 20 72 63 3b 20 72 65 74 75 72 6e 3b 20  C = rc; return; 
373a0 7d 0a 20 20 20 20 2f 2a 20 54 68 65 20 61 6c 6c  }.    /* The all
373b0 6f 63 61 74 65 53 70 61 63 65 28 29 20 72 6f 75  ocateSpace() rou
373c0 74 69 6e 65 20 67 75 61 72 61 6e 74 65 65 73 20  tine guarantees 
373d0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72  the following pr
373e0 6f 70 65 72 74 69 65 73 0a 20 20 20 20 2a 2a 20  operties.    ** 
373f0 69 66 20 69 74 20 72 65 74 75 72 6e 73 20 73 75  if it returns su
37400 63 63 65 73 73 66 75 6c 6c 79 20 2a 2f 0a 20 20  ccessfully */.  
37410 20 20 61 73 73 65 72 74 28 20 69 64 78 20 3e 3d    assert( idx >=
37420 20 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74   0 );.    assert
37430 28 20 69 64 78 20 3e 3d 20 70 50 61 67 65 2d 3e  ( idx >= pPage->
37440 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 70 50 61  cellOffset+2*pPa
37450 67 65 2d 3e 6e 43 65 6c 6c 2b 32 20 7c 7c 20 43  ge->nCell+2 || C
37460 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20  ORRUPT_DB );.   
37470 20 61 73 73 65 72 74 28 20 69 64 78 2b 73 7a 20   assert( idx+sz 
37480 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70  <= (int)pPage->p
37490 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
374a0 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72  ;.    pPage->nFr
374b0 65 65 20 2d 3d 20 28 75 31 36 29 28 32 20 2b 20  ee -= (u16)(2 + 
374c0 73 7a 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  sz);.    memcpy(
374d0 26 64 61 74 61 5b 69 64 78 5d 2c 20 70 43 65 6c  &data[idx], pCel
374e0 6c 2c 20 73 7a 29 3b 0a 20 20 20 20 69 66 28 20  l, sz);.    if( 
374f0 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20  iChild ){.      
37500 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 69  put4byte(&data[i
37510 64 78 5d 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20  dx], iChild);.  
37520 20 20 7d 0a 20 20 20 20 70 49 6e 73 20 3d 20 70    }.    pIns = p
37530 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 2b  Page->aCellIdx +
37540 20 69 2a 32 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76   i*2;.    memmov
37550 65 28 70 49 6e 73 2b 32 2c 20 70 49 6e 73 2c 20  e(pIns+2, pIns, 
37560 32 2a 28 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  2*(pPage->nCell 
37570 2d 20 69 29 29 3b 0a 20 20 20 20 70 75 74 32 62  - i));.    put2b
37580 79 74 65 28 70 49 6e 73 2c 20 69 64 78 29 3b 0a  yte(pIns, idx);.
37590 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c      pPage->nCell
375a0 2b 2b 3b 0a 20 20 20 20 2f 2a 20 69 6e 63 72 65  ++;.    /* incre
375b0 6d 65 6e 74 20 74 68 65 20 63 65 6c 6c 20 63 6f  ment the cell co
375c0 75 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 28  unt */.    if( (
375d0 2b 2b 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  ++data[pPage->hd
375e0 72 4f 66 66 73 65 74 2b 34 5d 29 3d 3d 30 20 29  rOffset+4])==0 )
375f0 20 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72   data[pPage->hdr
37600 4f 66 66 73 65 74 2b 33 5d 2b 2b 3b 0a 20 20 20  Offset+3]++;.   
37610 20 61 73 73 65 72 74 28 20 67 65 74 32 62 79 74   assert( get2byt
37620 65 28 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 68  e(&data[pPage->h
37630 64 72 4f 66 66 73 65 74 2b 33 5d 29 3d 3d 70 50  drOffset+3])==pP
37640 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 23 69  age->nCell );.#i
37650 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
37660 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
37670 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d   if( pPage->pBt-
37680 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
37690 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c       /* The cell
376a0 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61 20 70   may contain a p
376b0 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76 65  ointer to an ove
376c0 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 73  rflow page. If s
376d0 6f 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a  o, write.      *
376e0 2a 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20  * the entry for 
376f0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
37700 65 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  e into the point
37710 65 72 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f  er map..      */
37720 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
37730 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70  OvflPtr(pPage, p
37740 43 65 6c 6c 2c 20 70 52 43 29 3b 0a 20 20 20 20  Cell, pRC);.    
37750 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a  }.#endif.  }.}..
37760 2f 2a 0a 2a 2a 20 41 20 43 65 6c 6c 41 72 72 61  /*.** A CellArra
37770 79 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e  y object contain
37780 73 20 61 20 63 61 63 68 65 20 6f 66 20 70 6f 69  s a cache of poi
37790 6e 74 65 72 73 20 61 6e 64 20 73 69 7a 65 73 20  nters and sizes 
377a0 66 6f 72 20 61 0a 2a 2a 20 63 6f 6e 73 65 63 75  for a.** consecu
377b0 74 69 76 65 20 73 65 71 75 65 6e 63 65 20 6f 66  tive sequence of
377c0 20 63 65 6c 6c 73 20 74 68 61 74 20 6d 69 67 68   cells that migh
377d0 74 20 62 65 20 68 65 6c 64 20 6f 6e 20 6d 75 6c  t be held on mul
377e0 74 69 70 6c 65 20 70 61 67 65 73 2e 0a 2a 2f 0a  tiple pages..*/.
377f0 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 43  typedef struct C
37800 65 6c 6c 41 72 72 61 79 20 43 65 6c 6c 41 72 72  ellArray CellArr
37810 61 79 3b 0a 73 74 72 75 63 74 20 43 65 6c 6c 41  ay;.struct CellA
37820 72 72 61 79 20 7b 0a 20 20 69 6e 74 20 6e 43 65  rray {.  int nCe
37830 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
37840 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
37850 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  lls in apCell[] 
37860 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52  */.  MemPage *pR
37870 65 66 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ef;          /* 
37880 52 65 66 65 72 65 6e 63 65 20 70 61 67 65 20 2a  Reference page *
37890 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 3b  /.  u8 **apCell;
378a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
378b0 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e 20 62  ll cells begin b
378c0 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36  alanced */.  u16
378d0 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20   *szCell;       
378e0 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69       /* Local si
378f0 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20  ze of all cells 
37900 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 7d  in apCell[] */.}
37910 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  ;../*.** Make su
37920 72 65 20 74 68 65 20 63 65 6c 6c 20 73 69 7a 65  re the cell size
37930 73 20 61 74 20 69 64 78 2c 20 69 64 78 2b 31 2c  s at idx, idx+1,
37940 20 2e 2e 2e 2c 20 69 64 78 2b 4e 2d 31 20 68 61   ..., idx+N-1 ha
37950 76 65 20 62 65 65 6e 0a 2a 2a 20 63 6f 6d 70 75  ve been.** compu
37960 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ted..*/.static v
37970 6f 69 64 20 70 6f 70 75 6c 61 74 65 43 65 6c 6c  oid populateCell
37980 43 61 63 68 65 28 43 65 6c 6c 41 72 72 61 79 20  Cache(CellArray 
37990 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74  *p, int idx, int
379a0 20 4e 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69   N){.  assert( i
379b0 64 78 3e 3d 30 20 26 26 20 69 64 78 2b 4e 3c 3d  dx>=0 && idx+N<=
379c0 70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 77 68  p->nCell );.  wh
379d0 69 6c 65 28 20 4e 3e 30 20 29 7b 0a 20 20 20 20  ile( N>0 ){.    
379e0 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43 65 6c  assert( p->apCel
379f0 6c 5b 69 64 78 5d 21 3d 30 20 29 3b 0a 20 20 20  l[idx]!=0 );.   
37a00 20 69 66 28 20 70 2d 3e 73 7a 43 65 6c 6c 5b 69   if( p->szCell[i
37a10 64 78 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  dx]==0 ){.      
37a20 70 2d 3e 73 7a 43 65 6c 6c 5b 69 64 78 5d 20 3d  p->szCell[idx] =
37a30 20 70 2d 3e 70 52 65 66 2d 3e 78 43 65 6c 6c 53   p->pRef->xCellS
37a40 69 7a 65 28 70 2d 3e 70 52 65 66 2c 20 70 2d 3e  ize(p->pRef, p->
37a50 61 70 43 65 6c 6c 5b 69 64 78 5d 29 3b 0a 20 20  apCell[idx]);.  
37a60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
37a70 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
37a80 42 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  B ||.           
37a90 20 20 20 70 2d 3e 73 7a 43 65 6c 6c 5b 69 64 78     p->szCell[idx
37aa0 5d 3d 3d 70 2d 3e 70 52 65 66 2d 3e 78 43 65 6c  ]==p->pRef->xCel
37ab0 6c 53 69 7a 65 28 70 2d 3e 70 52 65 66 2c 20 70  lSize(p->pRef, p
37ac0 2d 3e 61 70 43 65 6c 6c 5b 69 64 78 5d 29 20 29  ->apCell[idx]) )
37ad0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 64 78 2b  ;.    }.    idx+
37ae0 2b 3b 0a 20 20 20 20 4e 2d 2d 3b 0a 20 20 7d 0a  +;.    N--;.  }.
37af0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
37b00 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
37b10 4e 74 68 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  Nth element of t
37b20 68 65 20 63 65 6c 6c 20 61 72 72 61 79 0a 2a 2f  he cell array.*/
37b30 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
37b40 4f 49 4e 4c 49 4e 45 20 75 31 36 20 63 6f 6d 70  OINLINE u16 comp
37b50 75 74 65 43 65 6c 6c 53 69 7a 65 28 43 65 6c 6c  uteCellSize(Cell
37b60 41 72 72 61 79 20 2a 70 2c 20 69 6e 74 20 4e 29  Array *p, int N)
37b70 7b 0a 20 20 61 73 73 65 72 74 28 20 4e 3e 3d 30  {.  assert( N>=0
37b80 20 26 26 20 4e 3c 70 2d 3e 6e 43 65 6c 6c 20 29   && N<p->nCell )
37b90 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  ;.  assert( p->s
37ba0 7a 43 65 6c 6c 5b 4e 5d 3d 3d 30 20 29 3b 0a 20  zCell[N]==0 );. 
37bb0 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 20 3d 20   p->szCell[N] = 
37bc0 70 2d 3e 70 52 65 66 2d 3e 78 43 65 6c 6c 53 69  p->pRef->xCellSi
37bd0 7a 65 28 70 2d 3e 70 52 65 66 2c 20 70 2d 3e 61  ze(p->pRef, p->a
37be0 70 43 65 6c 6c 5b 4e 5d 29 3b 0a 20 20 72 65 74  pCell[N]);.  ret
37bf0 75 72 6e 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d  urn p->szCell[N]
37c00 3b 0a 7d 0a 73 74 61 74 69 63 20 75 31 36 20 63  ;.}.static u16 c
37c10 61 63 68 65 64 43 65 6c 6c 53 69 7a 65 28 43 65  achedCellSize(Ce
37c20 6c 6c 41 72 72 61 79 20 2a 70 2c 20 69 6e 74 20  llArray *p, int 
37c30 4e 29 7b 0a 20 20 61 73 73 65 72 74 28 20 4e 3e  N){.  assert( N>
37c40 3d 30 20 26 26 20 4e 3c 70 2d 3e 6e 43 65 6c 6c  =0 && N<p->nCell
37c50 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73 7a 43   );.  if( p->szC
37c60 65 6c 6c 5b 4e 5d 20 29 20 72 65 74 75 72 6e 20  ell[N] ) return 
37c70 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 3b 0a 20 20  p->szCell[N];.  
37c80 72 65 74 75 72 6e 20 63 6f 6d 70 75 74 65 43 65  return computeCe
37c90 6c 6c 53 69 7a 65 28 70 2c 20 4e 29 3b 0a 7d 0a  llSize(p, N);.}.
37ca0 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79 20 61 70 43  ./*.** Array apC
37cb0 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 70  ell[] contains p
37cc0 6f 69 6e 74 65 72 73 20 74 6f 20 6e 43 65 6c 6c  ointers to nCell
37cd0 20 62 2d 74 72 65 65 20 70 61 67 65 20 63 65 6c   b-tree page cel
37ce0 6c 73 2e 20 54 68 65 20 0a 2a 2a 20 73 7a 43 65  ls. The .** szCe
37cf0 6c 6c 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61  ll[] array conta
37d00 69 6e 73 20 74 68 65 20 73 69 7a 65 20 69 6e 20  ins the size in 
37d10 62 79 74 65 73 20 6f 66 20 65 61 63 68 20 63 65  bytes of each ce
37d20 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ll. This functio
37d30 6e 0a 2a 2a 20 72 65 70 6c 61 63 65 73 20 74 68  n.** replaces th
37d40 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e  e current conten
37d50 74 73 20 6f 66 20 70 61 67 65 20 70 50 67 20 77  ts of page pPg w
37d60 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
37d70 20 6f 66 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20   of the cell.** 
37d80 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d  array..**.** Som
37d90 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 69  e of the cells i
37da0 6e 20 61 70 43 65 6c 6c 5b 5d 20 6d 61 79 20 63  n apCell[] may c
37db0 75 72 72 65 6e 74 6c 79 20 62 65 20 73 74 6f 72  urrently be stor
37dc0 65 64 20 69 6e 20 70 50 67 2e 20 54 68 69 73 0a  ed in pPg. This.
37dd0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b  ** function work
37de0 73 20 61 72 6f 75 6e 64 20 70 72 6f 62 6c 65 6d  s around problem
37df0 73 20 63 61 75 73 65 64 20 62 79 20 74 68 69 73  s caused by this
37e00 20 62 79 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70   by making a cop
37e10 79 20 6f 66 20 61 6e 79 20 0a 2a 2a 20 73 75 63  y of any .** suc
37e20 68 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 6f  h cells before o
37e30 76 65 72 77 72 69 74 69 6e 67 20 74 68 65 20 70  verwriting the p
37e40 61 67 65 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20  age data..**.** 
37e50 54 68 65 20 4d 65 6d 50 61 67 65 2e 6e 46 72 65  The MemPage.nFre
37e60 65 20 66 69 65 6c 64 20 69 73 20 69 6e 76 61 6c  e field is inval
37e70 69 64 61 74 65 64 20 62 79 20 74 68 69 73 20 66  idated by this f
37e80 75 6e 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 74  unction. It is t
37e90 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62  he .** responsib
37ea0 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
37eb0 6c 65 72 20 74 6f 20 73 65 74 20 69 74 20 63 6f  ler to set it co
37ec0 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74  rrectly..*/.stat
37ed0 69 63 20 69 6e 74 20 72 65 62 75 69 6c 64 50 61  ic int rebuildPa
37ee0 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ge(.  MemPage *p
37ef0 50 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg,             
37f00 20 20 20 20 20 20 2f 2a 20 45 64 69 74 20 74 68        /* Edit th
37f10 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  is page */.  int
37f20 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20   nCell,         
37f30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37f40 46 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Final number of 
37f50 63 65 6c 6c 73 20 6f 6e 20 70 61 67 65 20 2a 2f  cells on page */
37f60 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20  .  u8 **apCell, 
37f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37f80 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63     /* Array of c
37f90 65 6c 6c 73 20 2a 2f 0a 20 20 75 31 36 20 2a 73  ells */.  u16 *s
37fa0 7a 43 65 6c 6c 20 20 20 20 20 20 20 20 20 20 20  zCell           
37fb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
37fc0 61 79 20 6f 66 20 63 65 6c 6c 20 73 69 7a 65 73  ay of cell sizes
37fd0 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 69   */.){.  const i
37fe0 6e 74 20 68 64 72 20 3d 20 70 50 67 2d 3e 68 64  nt hdr = pPg->hd
37ff0 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  rOffset;        
38000 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68    /* Offset of h
38010 65 61 64 65 72 20 6f 6e 20 70 50 67 20 2a 2f 0a  eader on pPg */.
38020 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61    u8 * const aDa
38030 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b  ta = pPg->aData;
38040 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
38050 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 66 6f  inter to data fo
38060 72 20 70 50 67 20 2a 2f 0a 20 20 63 6f 6e 73 74  r pPg */.  const
38070 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 20   int usableSize 
38080 3d 20 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62  = pPg->pBt->usab
38090 6c 65 53 69 7a 65 3b 0a 20 20 75 38 20 2a 20 63  leSize;.  u8 * c
380a0 6f 6e 73 74 20 70 45 6e 64 20 3d 20 26 61 44 61  onst pEnd = &aDa
380b0 74 61 5b 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a  ta[usableSize];.
380c0 20 20 69 6e 74 20 69 3b 0a 20 20 75 38 20 2a 70    int i;.  u8 *p
380d0 43 65 6c 6c 70 74 72 20 3d 20 70 50 67 2d 3e 61  Cellptr = pPg->a
380e0 43 65 6c 6c 49 64 78 3b 0a 20 20 75 38 20 2a 70  CellIdx;.  u8 *p
380f0 54 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67  Tmp = sqlite3Pag
38100 65 72 54 65 6d 70 53 70 61 63 65 28 70 50 67 2d  erTempSpace(pPg-
38110 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  >pBt->pPager);. 
38120 20 75 38 20 2a 70 44 61 74 61 3b 0a 0a 20 20 69   u8 *pData;..  i
38130 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44 61   = get2byte(&aDa
38140 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65  ta[hdr+5]);.  me
38150 6d 63 70 79 28 26 70 54 6d 70 5b 69 5d 2c 20 26  mcpy(&pTmp[i], &
38160 61 44 61 74 61 5b 69 5d 2c 20 75 73 61 62 6c 65  aData[i], usable
38170 53 69 7a 65 20 2d 20 69 29 3b 0a 0a 20 20 70 44  Size - i);..  pD
38180 61 74 61 20 3d 20 70 45 6e 64 3b 0a 20 20 66 6f  ata = pEnd;.  fo
38190 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
381a0 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43  i++){.    u8 *pC
381b0 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 69 5d 3b  ell = apCell[i];
381c0 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
381d0 57 49 54 48 49 4e 28 70 43 65 6c 6c 2c 61 44 61  WITHIN(pCell,aDa
381e0 74 61 2c 70 45 6e 64 29 20 29 7b 0a 20 20 20 20  ta,pEnd) ){.    
381f0 20 20 70 43 65 6c 6c 20 3d 20 26 70 54 6d 70 5b    pCell = &pTmp[
38200 70 43 65 6c 6c 20 2d 20 61 44 61 74 61 5d 3b 0a  pCell - aData];.
38210 20 20 20 20 7d 0a 20 20 20 20 70 44 61 74 61 20      }.    pData 
38220 2d 3d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20  -= szCell[i];.  
38230 20 20 70 75 74 32 62 79 74 65 28 70 43 65 6c 6c    put2byte(pCell
38240 70 74 72 2c 20 28 70 44 61 74 61 20 2d 20 61 44  ptr, (pData - aD
38250 61 74 61 29 29 3b 0a 20 20 20 20 70 43 65 6c 6c  ata));.    pCell
38260 70 74 72 20 2b 3d 20 32 3b 0a 20 20 20 20 69 66  ptr += 2;.    if
38270 28 20 70 44 61 74 61 20 3c 20 70 43 65 6c 6c 70  ( pData < pCellp
38280 74 72 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  tr ) return SQLI
38290 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
382a0 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74  .    memcpy(pDat
382b0 61 2c 20 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c  a, pCell, szCell
382c0 5b 69 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  [i]);.    assert
382d0 28 20 73 7a 43 65 6c 6c 5b 69 5d 3d 3d 70 50 67  ( szCell[i]==pPg
382e0 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 67 2c  ->xCellSize(pPg,
382f0 20 70 43 65 6c 6c 29 20 7c 7c 20 43 4f 52 52 55   pCell) || CORRU
38300 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 74 65 73  PT_DB );.    tes
38310 74 63 61 73 65 28 20 73 7a 43 65 6c 6c 5b 69 5d  tcase( szCell[i]
38320 21 3d 70 50 67 2d 3e 78 43 65 6c 6c 53 69 7a 65  !=pPg->xCellSize
38330 28 70 50 67 2c 70 43 65 6c 6c 29 20 29 3b 0a 20  (pPg,pCell) );. 
38340 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 70 50 67   }..  /* The pPg
38350 2d 3e 6e 46 72 65 65 20 66 69 65 6c 64 20 69 73  ->nFree field is
38360 20 6e 6f 77 20 73 65 74 20 69 6e 63 6f 72 72 65   now set incorre
38370 63 74 6c 79 2e 20 54 68 65 20 63 61 6c 6c 65 72  ctly. The caller
38380 20 77 69 6c 6c 20 66 69 78 20 69 74 2e 20 2a 2f   will fix it. */
38390 0a 20 20 70 50 67 2d 3e 6e 43 65 6c 6c 20 3d 20  .  pPg->nCell = 
383a0 6e 43 65 6c 6c 3b 0a 20 20 70 50 67 2d 3e 6e 4f  nCell;.  pPg->nO
383b0 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20  verflow = 0;..  
383c0 70 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b  put2byte(&aData[
383d0 68 64 72 2b 31 5d 2c 20 30 29 3b 0a 20 20 70 75  hdr+1], 0);.  pu
383e0 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 68 64  t2byte(&aData[hd
383f0 72 2b 33 5d 2c 20 70 50 67 2d 3e 6e 43 65 6c 6c  r+3], pPg->nCell
38400 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 61  );.  put2byte(&a
38410 44 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 44 61  Data[hdr+5], pDa
38420 74 61 20 2d 20 61 44 61 74 61 29 3b 0a 20 20 61  ta - aData);.  a
38430 44 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 78  Data[hdr+7] = 0x
38440 30 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  00;.  return SQL
38450 49 54 45 5f 4f 4b 3b 0a 7d